Skip to content

Commit 0c346e3

Browse files
committed
Save expanded keys
1 parent 1af69dc commit 0c346e3

File tree

4 files changed

+59
-14
lines changed

4 files changed

+59
-14
lines changed

src/modules/tasks/TaskStore.ts

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -142,25 +142,51 @@ export default class TaskStore {
142142
}
143143

144144
getCheckedKeys(projectId: string): string[] {
145-
function condition(task: TaskModel): boolean {
146-
return task.checked;
145+
const condition = (task: TaskModel) => task.checked;
146+
147+
return this.getTaskKeysByCondition(projectId, condition);
148+
}
149+
150+
getExpandedKeys(projectId: string): string[] {
151+
const condition = (task: TaskModel) => task.expanded;
152+
153+
return this.getTaskKeysByCondition(projectId, condition);
154+
}
155+
156+
checkTasks(projectId: string, taskIds: string[]) {
157+
function checkTaskFn(task: TaskModel, taskIds: string[]) {
158+
task.checked = taskIds.includes(task.key);
147159
}
148160

149161
if (Array.isArray(this.tasks[projectId])) {
150-
return TreeModelStoreHelper.getFlatItemsRecursive(
151-
this.tasks[projectId],
152-
condition
153-
).map((task) => task.key);
162+
this.checkTasksRecursive(this.tasks[projectId], taskIds, checkTaskFn);
154163
}
155-
return [];
164+
this.tasksService.save(this.tasks);
165+
GaService.event(EEventCategory.Tasks, ETasksEvents.Check);
156166
}
157167

158-
checkTasks(projectId: string, taskIds: string[]) {
168+
tasksMarkExpanded(projectId: string, taskIds: string[]) {
169+
function markExpanded(task: TaskModel, taskIds: string[]) {
170+
task.expanded = taskIds.includes(task.key);
171+
}
172+
159173
if (Array.isArray(this.tasks[projectId])) {
160-
this.checkTasksRecursive(this.tasks[projectId], taskIds);
174+
this.checkTasksRecursive(this.tasks[projectId], taskIds, markExpanded);
161175
}
162176
this.tasksService.save(this.tasks);
163-
GaService.event(EEventCategory.Tasks, ETasksEvents.Check);
177+
}
178+
179+
private getTaskKeysByCondition(
180+
projectId: string,
181+
condition: (task: TaskModel) => boolean
182+
) {
183+
if (Array.isArray(this.tasks[projectId])) {
184+
return TreeModelStoreHelper.getFlatItemsRecursive(
185+
this.tasks[projectId],
186+
condition
187+
).map((task) => task.key);
188+
}
189+
return [];
164190
}
165191

166192
private findAndSetActiveTask() {
@@ -181,11 +207,15 @@ export default class TaskStore {
181207
return TreeModelStoreHelper.getItemRecursive(tasks, condition);
182208
}
183209

184-
private checkTasksRecursive(tasks: TaskModel[], taskIds: string[]) {
210+
private checkTasksRecursive(
211+
tasks: TaskModel[],
212+
taskIds: string[],
213+
fn: (task: TaskModel, taskIds: string[]) => void
214+
) {
185215
tasks.forEach((task) => {
186-
task.checked = taskIds.includes(task.key);
216+
fn(task, taskIds);
187217
if (Array.isArray(task.children)) {
188-
this.checkTasksRecursive(task.children, taskIds);
218+
this.checkTasksRecursive(task.children, taskIds, fn);
189219
}
190220
});
191221
}

src/modules/tasks/models/TaskModel.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ interface IJsonTaskModel extends ITreeItem<IJsonTaskModel> {
2121
projectId: string;
2222
checked: boolean;
2323
active: boolean;
24+
expanded: boolean;
2425
time: string[][] | IJsonTimeRangeModel[];
2526
datesInProgress: string[];
2627
children: IJsonTaskModel[];
@@ -33,6 +34,7 @@ export default class TaskModel extends AbstractModel {
3334
children: TaskModel[] = [];
3435
projectId: string = '';
3536
checked: boolean = false;
37+
expanded: boolean = true;
3638
active: boolean = false;
3739
time: ITimeRangeModel[] = [];
3840
datesInProgress: Date[] = [];
@@ -43,6 +45,7 @@ export default class TaskModel extends AbstractModel {
4345
this.load(props);
4446
this.children = props.children?.map((json) => new TaskModel(json)) || [];
4547
this.time =
48+
// @ts-ignore
4649
props.time?.map<ITimeRangeModel>(
4750
(range: string[] | IJsonTimeRangeModel) => {
4851
if (Array.isArray(range)) {

src/screens/projects/ProjectsScreen.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ const TaskList = TreeList(
2727
},
2828
{
2929
checkable: true,
30+
onExpand(keys: Key[]) {
31+
tasksStore.tasksMarkExpanded(
32+
projectStore.activeProject,
33+
keys as string[]
34+
);
35+
},
36+
getExpandedKeys() {
37+
return tasksStore.getExpandedKeys(projectStore.activeProject);
38+
},
3039
onCheck(keys: any) {
3140
tasksStore.checkTasks(projectStore.activeProject, keys as string[]);
3241
},

src/screens/projects/components/TreeList.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ interface TreeListProps {
1414
interface TreePropsExtended<T>
1515
extends Omit<TreeProps, 'onDrop' | 'onSelect' | 'titleRender'> {
1616
getCheckedKeys?: () => Key[];
17+
getExpandedKeys?: () => Key[];
1718
titleRender?: (item: T) => React.ReactNode;
1819
}
1920

@@ -22,7 +23,7 @@ export default function TreeList<T extends ITreeItem<any>>(
2223
updateData: (items: T[]) => void,
2324
options: TreePropsExtended<T>
2425
) {
25-
const { getCheckedKeys, ...rest } = options;
26+
const { getCheckedKeys, getExpandedKeys, ...rest } = options;
2627

2728
return observer(({ onSelect }: TreeListProps) => {
2829
const data = getData();
@@ -115,9 +116,11 @@ export default function TreeList<T extends ITreeItem<any>>(
115116
<Tree
116117
className="draggable-tree"
117118
checkedKeys={getCheckedKeys?.()}
119+
expandedKeys={getExpandedKeys?.()}
118120
draggable
119121
blockNode
120122
treeData={data}
123+
// @ts-ignore
121124
onDrop={onDrop}
122125
onSelect={onSelect}
123126
{...rest}

0 commit comments

Comments
 (0)