Skip to content

Commit

Permalink
Task list: implement 1-level task hierarchy.
Browse files Browse the repository at this point in the history
This is the first step towards fixing #124
  • Loading branch information
tasn committed Jul 16, 2020
1 parent 2547fb9 commit 6ea7bd7
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 3 deletions.
16 changes: 15 additions & 1 deletion src/components/Tasks/TaskList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,19 @@ export default function TaskList(props: PropsType) {
entries = potentialEntries;
}

const subEntriesMap = new Map<string, TaskType[]>();

entries = entries.filter((x) => {
const relatedTo = x.relatedTo;
if (relatedTo) {
const cur = subEntriesMap.get(relatedTo) ?? [];
cur.push(x);
subEntriesMap.set(relatedTo, cur);
return false;
}
return true;
});

const sortedEntries = entries.sort(getSortFunction(sortBy));

const itemList = sortedEntries.map((entry) => {
Expand All @@ -217,8 +230,9 @@ export default function TaskList(props: PropsType) {
<TaskListItem
key={uid}
entry={entry}
subEntries={subEntriesMap.get(uid)}
onClick={props.onItemClick}
onToggleComplete={(completed: boolean) => handleToggleComplete(entry, completed)}
onToggleComplete={(entry: TaskType, completed: boolean) => handleToggleComplete(entry, completed)}
/>
);
});
Expand Down
9 changes: 7 additions & 2 deletions src/components/Tasks/TaskListItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@ const TagsList = React.memo((props: { tags: string[] }) => (

interface PropsType {
entry: TaskType;
subEntries?: TaskType[];
onClick: (task: TaskType) => void;
onToggleComplete: (completed: boolean) => void;
onToggleComplete: (task: TaskType, completed: boolean) => void;
}

export default React.memo(function TaskListItem(props: PropsType) {
const {
entry: task,
subEntries,
onClick,
onToggleComplete,
} = props;
Expand All @@ -55,11 +57,14 @@ export default React.memo(function TaskListItem(props: PropsType) {
primaryText={title}
secondaryText={secondaryText}
secondaryTextColor={task.overdue ? 'error' : 'textSecondary'}
nestedItems={subEntries?.map((x) => (
<TaskListItem key={x.uid} entry={x} onClick={onClick} onToggleComplete={onToggleComplete} />
))}
onClick={() => onClick(task)}
leftIcon={
<Checkbox
onClick={(e) => e.stopPropagation()}
onChange={(_e, checked) => onToggleComplete(checked)}
onChange={(_e, checked) => onToggleComplete(task, checked)}
checked={task.finished}
icon={<CheckBoxOutlineBlankIcon style={{ color: checkboxColor[mapPriority(task.priority)] }} />}
/>
Expand Down
12 changes: 12 additions & 0 deletions src/pim-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,18 @@ export class TaskType extends EventType {
return this.component.getFirstPropertyValue('completed');
}

set relatedTo(parentUid: string | undefined) {
if (parentUid !== undefined) {
this.component.updatePropertyWithValue('related-to', parentUid);
} else {
this.component.removeAllProperties('related-to');
}
}

get relatedTo(): string | undefined {
return this.component.getFirstPropertyValue('related-to');
}

get endDate() {
// XXX: A hack to override this as it shouldn't be used
return undefined as any;
Expand Down

0 comments on commit 6ea7bd7

Please sign in to comment.