Skip to content
This repository was archived by the owner on Dec 26, 2022. It is now read-only.

Commit 3faade6

Browse files
committed
Expand project, refactoring
1 parent 988aa46 commit 3faade6

File tree

7 files changed

+136
-100
lines changed

7 files changed

+136
-100
lines changed

src/base/TreeModelHelper.ts

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import { ITreeItem } from '../types/ITreeItem';
2+
3+
const TreeModelHelper = {
4+
modifyItemsWithIdsRecursive<T extends ITreeItem<any>>(
5+
treeItems: T[],
6+
ids: string[],
7+
fn: (treeItem: T, ids: string[]) => void
8+
) {
9+
treeItems.forEach((item) => {
10+
fn(item, ids);
11+
if (Array.isArray(item.children) && item.children.length) {
12+
TreeModelHelper.modifyItemsWithIdsRecursive(item.children, ids, fn);
13+
}
14+
});
15+
},
16+
17+
getItemRecursive<T extends ITreeItem<any>>(
18+
tasks: T[],
19+
condition: (task: T) => boolean
20+
): T | undefined {
21+
for (const task of tasks) {
22+
if (condition(task)) {
23+
return task;
24+
}
25+
if (Array.isArray(task.children)) {
26+
const found = this.getItemRecursive(task.children, condition);
27+
if (found) {
28+
return found;
29+
}
30+
}
31+
}
32+
return undefined;
33+
},
34+
35+
getFlatItemsRecursive<T extends ITreeItem<any>>(
36+
tree: T[],
37+
condition: (task: T) => boolean
38+
): T[] {
39+
const result: T[] = [];
40+
41+
this.getFlatItemsRecursiveBase(tree, condition, result);
42+
43+
return result;
44+
},
45+
46+
getFlatItemsRecursiveBase<T extends ITreeItem<any>>(
47+
treeItems: T[],
48+
condition: (item: T) => boolean,
49+
result: T[]
50+
): T[] {
51+
for (const item of treeItems) {
52+
if (condition(item)) {
53+
result.push(item);
54+
}
55+
if (Array.isArray(item.children)) {
56+
this.getFlatItemsRecursiveBase(item.children, condition, result);
57+
}
58+
}
59+
return result;
60+
},
61+
62+
deleteItems<T extends ITreeItem<any>>(
63+
treeItems: T[],
64+
condition: (task: T) => boolean
65+
): T[] {
66+
const result = treeItems.filter((t) => !condition(t));
67+
for (let i = 0; i < result.length; i++) {
68+
const task = treeItems[i];
69+
if (Array.isArray(task.children)) {
70+
treeItems[i].children = this.deleteItems(task.children, condition);
71+
}
72+
}
73+
return result;
74+
},
75+
};
76+
77+
export default TreeModelHelper;

src/base/TreeModelStoreHelper.ts

Lines changed: 0 additions & 62 deletions
This file was deleted.

src/base/repositories/AbstractFileRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const path = require('path');
44
import FsHelper from '../../helpers/FsHelper';
55
import PromiseQueue from '../../helpers/PromiseQueueHellper';
66

7-
const APP_DIR = 'YadroTimeTracker';
7+
const APP_DIR = 'YadroTimeTracker_test';
88

99
export default abstract class AbstractFileRepository<T = any> {
1010
dirWithProfileData: string = 'profile1';

src/modules/projects/ProjectStore.ts

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { autorun, makeAutoObservable } from 'mobx';
22

33
import ProjectModel from './models/ProjectModel';
44
import ProjectService from './ProjectService';
5-
import TreeModelStoreHelper from '../../base/TreeModelStoreHelper';
5+
import TreeModelHelper from '../../base/TreeModelHelper';
66
import { Undefined } from '../../types/CommonTypes';
77
import { RootStore } from '../RootStore';
88
import GaService from '../../services/gaService/GaService';
@@ -45,7 +45,7 @@ export default class ProjectStore {
4545
setProjectProps(
4646
project: ProjectModel,
4747
title: string,
48-
color: string | undefined,
48+
color: string | undefined
4949
) {
5050
project.title = title;
5151
project.color = color || '';
@@ -58,7 +58,29 @@ export default class ProjectStore {
5858
function compare(project: ProjectModel) {
5959
return project.key === projectKey;
6060
}
61-
return TreeModelStoreHelper.getItemRecursive(this.projects, compare);
61+
return TreeModelHelper.getItemRecursive(this.projects, compare);
62+
}
63+
64+
getExpandedKeys(): string[] {
65+
const condition = (project: ProjectModel) => project.expanded;
66+
67+
return TreeModelHelper.getFlatItemsRecursive(this.projects, condition).map(
68+
(task) => task.key
69+
);
70+
}
71+
72+
markExpanded(ids: string[]) {
73+
const markExpanded = (project: ProjectModel, ids: string[]) => {
74+
project.expanded = ids.includes(project.key);
75+
};
76+
77+
TreeModelHelper.modifyItemsWithIdsRecursive<ProjectModel>(
78+
this.projects,
79+
ids,
80+
markExpanded
81+
);
82+
83+
this.set(this.projects.slice());
6284
}
6385

6486
add(project: ProjectModel) {
@@ -74,7 +96,7 @@ export default class ProjectStore {
7496
return _project.key === project.key;
7597
}
7698

77-
this.projects = TreeModelStoreHelper.deleteItems(this.projects, condition);
99+
this.projects = TreeModelHelper.deleteItems(this.projects, condition);
78100
this.projectService.save(this.projects);
79101
GaService.event(EEventCategory.Projects, EProjectEvents.Delete);
80102
}

src/modules/projects/models/ProjectModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export default class ProjectModel extends AbstractModel
2424
key: string = '';
2525
title: string = '';
2626
color: string = '';
27+
expanded: boolean = false;
2728
children?: ProjectModel[] = [];
2829

2930
constructor(props: IJsonProjectItem) {

src/modules/tasks/TaskStore.ts

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { autorun, makeAutoObservable } from 'mobx';
33
import TaskService from './TaskService';
44
import TaskModel, { ITimeRangeModel } from './models/TaskModel';
55
import TasksByProject from '../../modules/tasks/models/TasksByProject';
6-
import TreeModelStoreHelper from '../../base/TreeModelStoreHelper';
6+
import TreeModelHelper from '../../base/TreeModelHelper';
77
import BadgeService from '../BadgeService';
88
import { RootStore } from '../RootStore';
99
import GaService from '../../services/gaService/GaService';
@@ -29,8 +29,8 @@ export default class TaskStore {
2929
});
3030
}
3131

32-
set(projectId: string, tasks: TaskModel[]) {
33-
this.tasks[projectId] = tasks;
32+
set(projectId: string, tasksInProject: TaskModel[]) {
33+
this.tasks[projectId] = tasksInProject;
3434
this.tasksService.save(this.tasks);
3535
}
3636

@@ -59,7 +59,7 @@ export default class TaskStore {
5959
}
6060

6161
for (const tasks of Object.values(this.tasks)) {
62-
const found = TreeModelStoreHelper.getItemRecursive(tasks, condition);
62+
const found = TreeModelHelper.getItemRecursive(tasks, condition);
6363
if (found) {
6464
return found;
6565
}
@@ -75,7 +75,7 @@ export default class TaskStore {
7575
}
7676

7777
for (const tasks of Object.values(this.tasks)) {
78-
TreeModelStoreHelper.getFlatItemsRecursiveBase(tasks, condition, result);
78+
TreeModelHelper.getFlatItemsRecursiveBase(tasks, condition, result);
7979
}
8080
return result;
8181
}
@@ -100,7 +100,7 @@ export default class TaskStore {
100100

101101
for (const projectKey in this.tasks) {
102102
if (this.tasks.hasOwnProperty(projectKey)) {
103-
this.tasks[projectKey] = TreeModelStoreHelper.deleteItems(
103+
this.tasks[projectKey] = TreeModelHelper.deleteItems(
104104
this.tasks[projectKey],
105105
condition
106106
);
@@ -159,22 +159,30 @@ export default class TaskStore {
159159
}
160160

161161
if (Array.isArray(this.tasks[projectId])) {
162-
this.checkTasksRecursive(this.tasks[projectId], taskIds, checkTaskFn);
162+
TreeModelHelper.modifyItemsWithIdsRecursive<TaskModel>(
163+
this.tasks[projectId],
164+
taskIds,
165+
checkTaskFn
166+
);
167+
168+
this.set(projectId, this.tasks[projectId].slice());
163169
}
164-
this.tasksService.save(this.tasks);
165170
GaService.event(EEventCategory.Tasks, ETasksEvents.Check);
166171
}
167172

168-
tasksMarkExpanded(projectId: string, taskIds: string[]) {
169-
function markExpanded(task: TaskModel, taskIds: string[]) {
173+
markExpanded(projectId: string, taskIds: string[]) {
174+
const markExpanded = (task: TaskModel, taskIds: string[]) => {
170175
task.expanded = taskIds.includes(task.key);
171-
}
176+
};
172177

173178
if (Array.isArray(this.tasks[projectId])) {
174-
this.checkTasksRecursive(this.tasks[projectId], taskIds, markExpanded);
179+
TreeModelHelper.modifyItemsWithIdsRecursive<TaskModel>(
180+
this.tasks[projectId],
181+
taskIds,
182+
markExpanded
183+
);
175184

176-
this.tasks[projectId] = this.tasks[projectId].slice();
177-
this.tasksService.save(this.tasks);
185+
this.set(projectId, this.tasks[projectId].slice());
178186
}
179187
}
180188

@@ -183,7 +191,7 @@ export default class TaskStore {
183191
condition: (task: TaskModel) => boolean
184192
) {
185193
if (Array.isArray(this.tasks[projectId])) {
186-
return TreeModelStoreHelper.getFlatItemsRecursive(
194+
return TreeModelHelper.getFlatItemsRecursive(
187195
this.tasks[projectId],
188196
condition
189197
).map((task) => task.key);
@@ -206,20 +214,7 @@ export default class TaskStore {
206214
return task.active;
207215
}
208216

209-
return TreeModelStoreHelper.getItemRecursive(tasks, condition);
210-
}
211-
212-
private checkTasksRecursive(
213-
tasks: TaskModel[],
214-
taskIds: string[],
215-
fn: (task: TaskModel, taskIds: string[]) => void
216-
) {
217-
tasks.forEach((task) => {
218-
fn(task, taskIds);
219-
if (Array.isArray(task.children)) {
220-
this.checkTasksRecursive(task.children, taskIds, fn);
221-
}
222-
});
217+
return TreeModelHelper.getItemRecursive(tasks, condition);
223218
}
224219

225220
private setupReminder(task?: TaskModel) {

src/screens/projects/ProjectsScreen.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ const TaskList = TreeList(
2828
{
2929
checkable: true,
3030
onExpand(keys: Key[]) {
31-
tasksStore.tasksMarkExpanded(
32-
projectStore.activeProject,
33-
keys as string[]
34-
);
31+
tasksStore.markExpanded(projectStore.activeProject, keys as string[]);
3532
},
3633
getExpandedKeys() {
3734
return tasksStore.getExpandedKeys(projectStore.activeProject);
@@ -63,6 +60,12 @@ const ProjectList = TreeList(
6360
/>
6461
);
6562
},
63+
onExpand(keys: Key[]) {
64+
projectStore.markExpanded(keys as string[]);
65+
},
66+
getExpandedKeys() {
67+
return projectStore.getExpandedKeys();
68+
},
6669
}
6770
);
6871

0 commit comments

Comments
 (0)