116 lines
2.9 KiB
TypeScript
Raw Normal View History

import React, { useMemo } from "react";
import styles from "./task-list-table.module.css";
import { Task } from "../../types/public-types";
const localeDateStringCache = {};
2021-08-15 15:07:23 +03:00
const toLocaleDateStringFactory = (locale: string) => (
date: Date,
dateTimeOptions: Intl.DateTimeFormatOptions
) => {
const key = date.toString();
let lds = localeDateStringCache[key];
if (!lds) {
lds = date.toLocaleDateString(locale, dateTimeOptions);
localeDateStringCache[key] = lds;
}
return lds;
};
2021-08-15 15:07:23 +03:00
const dateTimeOptions: Intl.DateTimeFormatOptions = {
weekday: "short",
year: "numeric",
month: "long",
day: "numeric",
};
2020-08-23 22:44:51 +03:00
export const TaskListTableDefault: React.FC<{
rowHeight: number;
rowWidth: string;
fontFamily: string;
fontSize: string;
locale: string;
tasks: Task[];
2020-09-15 23:23:09 +03:00
selectedTaskId: string;
setSelectedTask: (taskId: string) => void;
2021-08-09 22:21:18 +03:00
onExpanderClick: (task: Task) => void;
}> = ({
rowHeight,
rowWidth,
tasks,
fontFamily,
fontSize,
locale,
onExpanderClick,
}) => {
2021-08-15 15:07:23 +03:00
const toLocaleDateString = useMemo(() => toLocaleDateStringFactory(locale), [
locale,
]);
return (
<div
className={styles.taskListWrapper}
style={{
fontFamily: fontFamily,
fontSize: fontSize,
}}
>
{tasks.map(t => {
2021-08-09 22:21:18 +03:00
let expanderSymbol = "";
if (t.hideChildren === false) {
expanderSymbol = "▼";
} else if (t.hideChildren === true) {
expanderSymbol = "▶";
}
return (
<div
className={styles.taskListTableRow}
style={{ height: rowHeight }}
key={`${t.id}row`}
>
<div
className={styles.taskListCell}
style={{
minWidth: rowWidth,
maxWidth: rowWidth,
}}
2020-08-25 22:07:04 +03:00
title={t.name}
>
2021-08-09 22:21:18 +03:00
<div className={styles.taskListNameWrapper}>
<div
className={
expanderSymbol
? styles.taskListExpander
: styles.taskListEmptyExpander
}
onClick={() => onExpanderClick(t)}
>
{expanderSymbol}
</div>
<div>{t.name}</div>
</div>
</div>
<div
className={styles.taskListCell}
style={{
minWidth: rowWidth,
2020-09-01 23:08:15 +03:00
maxWidth: rowWidth,
}}
>
&nbsp;{toLocaleDateString(t.start, dateTimeOptions)}
</div>
<div
className={styles.taskListCell}
style={{
minWidth: rowWidth,
2020-09-01 23:08:15 +03:00
maxWidth: rowWidth,
}}
>
&nbsp;{toLocaleDateString(t.end, dateTimeOptions)}
</div>
</div>
);
})}
</div>
);
};