Task list: support infinitely deep task hierarchies.

Another step towards fixing #124.
master
Tom Hacohen 4 years ago
parent 484825b1db
commit ad6ac59c4f

@ -125,6 +125,8 @@ export default function TaskList(props: PropsType) {
const classes = useStyles(); const classes = useStyles();
const dispatch = useDispatch(); const dispatch = useDispatch();
const { onItemClick } = props;
const handleToggleComplete = (task: TaskType, completed: boolean) => { const handleToggleComplete = (task: TaskType, completed: boolean) => {
const clonedTask = task.clone(); const clonedTask = task.clone();
clonedTask.status = completed ? TaskStatusType.Completed : TaskStatusType.NeedsAction; clonedTask.status = completed ? TaskStatusType.Completed : TaskStatusType.NeedsAction;
@ -222,21 +224,23 @@ export default function TaskList(props: PropsType) {
return true; return true;
}); });
const sortedEntries = entries.sort(getSortFunction(sortBy)); function taskListItemFromTask(entry: TaskType) {
const itemList = sortedEntries.map((entry) => {
const uid = entry.uid; const uid = entry.uid;
return ( return (
<TaskListItem <TaskListItem
key={uid} key={uid}
entry={entry} entry={entry}
subEntries={subEntriesMap.get(uid)} nestedItems={subEntriesMap.get(uid)?.map(taskListItemFromTask)}
onClick={props.onItemClick} onClick={onItemClick}
onToggleComplete={(entry: TaskType, completed: boolean) => handleToggleComplete(entry, completed)} onToggleComplete={handleToggleComplete}
/> />
); );
}); }
const sortedEntries = entries.sort(getSortFunction(sortBy));
const itemList = sortedEntries.map(taskListItemFromTask);
return ( return (
<Grid container spacing={4}> <Grid container spacing={4}>

@ -34,7 +34,7 @@ const TagsList = React.memo((props: { tags: string[] }) => (
interface PropsType { interface PropsType {
entry: TaskType; entry: TaskType;
subEntries?: TaskType[]; nestedItems?: React.ReactNode[];
onClick: (task: TaskType) => void; onClick: (task: TaskType) => void;
onToggleComplete: (task: TaskType, completed: boolean) => void; onToggleComplete: (task: TaskType, completed: boolean) => void;
} }
@ -42,7 +42,7 @@ interface PropsType {
export default React.memo(function TaskListItem(props: PropsType) { export default React.memo(function TaskListItem(props: PropsType) {
const { const {
entry: task, entry: task,
subEntries, nestedItems,
onClick, onClick,
onToggleComplete, onToggleComplete,
} = props; } = props;
@ -57,9 +57,7 @@ export default React.memo(function TaskListItem(props: PropsType) {
primaryText={title} primaryText={title}
secondaryText={secondaryText} secondaryText={secondaryText}
secondaryTextColor={task.overdue ? 'error' : 'textSecondary'} secondaryTextColor={task.overdue ? 'error' : 'textSecondary'}
nestedItems={subEntries?.map((x) => ( nestedItems={nestedItems}
<TaskListItem key={x.uid} entry={x} onClick={onClick} onToggleComplete={onToggleComplete} />
))}
onClick={() => onClick(task)} onClick={() => onClick(task)}
leftIcon={ leftIcon={
<Checkbox <Checkbox

Loading…
Cancel
Save