Skip to content

Commit e8dcce8

Browse files
author
Dmitry Yadrikhinsky
committed
AbstractTreeModelStore.ts
1 parent b74e909 commit e8dcce8

File tree

7 files changed

+86
-69
lines changed

7 files changed

+86
-69
lines changed

src/base/AbstractTreeModelStore.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { ITreeItem } from '../types/ITreeItem';
2+
3+
export default abstract class AbstractTreeModelStore<T extends ITreeItem<any>> {
4+
protected getItemRecursive(
5+
tasks: T[],
6+
condition: (task: T) => boolean
7+
): T | undefined {
8+
for (const task of tasks) {
9+
if (condition(task)) {
10+
return task;
11+
}
12+
if (Array.isArray(task.children)) {
13+
const found = this.getItemRecursive(task.children, condition);
14+
if (found) {
15+
return found;
16+
}
17+
}
18+
}
19+
return undefined;
20+
}
21+
22+
protected getItemsRecursive(
23+
tasks: T[],
24+
condition: (task: T) => boolean,
25+
result: T[]
26+
): T[] {
27+
for (const task of tasks) {
28+
if (condition(task)) {
29+
result.push(task);
30+
}
31+
if (Array.isArray(task.children)) {
32+
this.getItemsRecursive(task.children, condition, result);
33+
}
34+
}
35+
return result;
36+
}
37+
}

src/models/ProjectModel.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import AbstractModel from '../base/AbstractModel';
22
import { ITreeItem } from '../types/ITreeItem';
33

4-
interface IProjectItem extends ITreeItem<IProjectItem> {}
4+
interface IProjectItem extends ITreeItem<IProjectItem> {
5+
children?: IProjectItem[];
6+
}
57

68
export default class ProjectModel extends AbstractModel
79
implements IProjectItem {
810
key: string = '';
911
title: string = '';
10-
children: ProjectModel[] = [];
12+
children?: ProjectModel[] = [];
1113

1214
constructor(props: IProjectItem) {
1315
super();

src/models/TaskModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ interface IJsonTaskModel extends ITreeItem<IJsonTaskModel> {
1010
active: boolean;
1111
time: string[][];
1212
datesInProgress: string[];
13+
children: IJsonTaskModel[];
1314
}
1415

1516
export default class TaskModel extends AbstractModel {

src/screens/projects/components/TreeList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface TreeListProps {
1010
onSelect?: (selectedKeys: Key[]) => void;
1111
}
1212

13-
export default function TreeList<T extends ITreeItem>(
13+
export default function TreeList<T extends ITreeItem<any>>(
1414
getData: () => T[],
1515
updateData: (items: T[]) => void,
1616
options?: {
Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,38 @@
1+
import { action, makeObservable, observable } from 'mobx';
2+
13
import ProjectModel from '../../models/ProjectModel';
24
import ProjectService from './ProjectService';
3-
import { makeAutoObservable } from 'mobx';
5+
import AbstractTreeModelStore from '../../base/AbstractTreeModelStore';
46

5-
export default class ProjectStore {
7+
export default class ProjectStore extends AbstractTreeModelStore<ProjectModel> {
68
projects: ProjectModel[] = [];
79
activeProject: string = '';
810

911
private projectService = new ProjectService();
1012

1113
constructor() {
12-
makeAutoObservable(this);
14+
super();
15+
makeObservable(this, {
16+
projects: observable,
17+
activeProject: observable,
18+
set: action,
19+
get: action,
20+
add: action,
21+
setActiveProject: action,
22+
restore: action,
23+
});
1324
}
1425

1526
set(projects: ProjectModel[]) {
1627
this.projects = projects;
1728
this.projectService.save(this.projects);
1829
}
1930

20-
get(projectId: string): ProjectModel | undefined {
21-
return this.getRecursive(this.projects, projectId);
31+
get(projectKey: string): ProjectModel | undefined {
32+
function compare(project: ProjectModel) {
33+
return project.key === projectKey;
34+
}
35+
return this.getItemRecursive(this.projects, compare);
2236
}
2337

2438
add(project: ProjectModel) {
@@ -35,23 +49,4 @@ export default class ProjectStore {
3549
this.projects = this.projectService.getAll();
3650
this.activeProject = Object.keys(this.projects)[0];
3751
}
38-
39-
private getRecursive(
40-
projects: ProjectModel[],
41-
projectId: string
42-
): ProjectModel | undefined {
43-
for (const projectKey in projects) {
44-
const project = projects[projectKey];
45-
if (project.key === projectId) {
46-
return project;
47-
}
48-
if (Array.isArray(project.children)) {
49-
const found = this.getRecursive(project.children, projectId);
50-
if (found) {
51-
return found;
52-
}
53-
}
54-
}
55-
return undefined;
56-
}
5752
}

src/services/tasks/TaskStore.ts

Lines changed: 23 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,31 @@
1-
import { makeAutoObservable } from 'mobx';
1+
import { action, makeObservable, observable } from 'mobx';
2+
23
import TaskService from './TaskService';
34
import TaskModel from '../../models/TaskModel';
45
import TasksByProject from '../../models/TasksByProject';
6+
import AbstractTreeModelStore from '../../base/AbstractTreeModelStore';
57

6-
export default class TaskStore {
8+
export default class TaskStore extends AbstractTreeModelStore<TaskModel> {
79
tasks: TasksByProject = {};
810
activeTask: TaskModel | undefined;
911
private tasksService = new TaskService();
1012

1113
constructor() {
12-
makeAutoObservable(this);
14+
super();
15+
makeObservable(this, {
16+
tasks: observable,
17+
activeTask: observable,
18+
set: action,
19+
getTasks: action,
20+
getTaskByKey: action,
21+
getTaskByDate: action,
22+
add: action,
23+
startTimer: action,
24+
endTimer: action,
25+
restore: action,
26+
getCheckedKeys: action,
27+
checkTasks: action,
28+
});
1329
}
1430

1531
set(projectId: string, tasks: TaskModel[]) {
@@ -27,7 +43,7 @@ export default class TaskStore {
2743
}
2844

2945
for (const tasks of Object.values(this.tasks)) {
30-
const found = this.findTaskRecursive(tasks, condition);
46+
const found = this.getItemRecursive(tasks, condition);
3147
if (found) {
3248
return found;
3349
}
@@ -43,7 +59,7 @@ export default class TaskStore {
4359
}
4460

4561
for (const tasks of Object.values(this.tasks)) {
46-
this.findTasksRecursive(tasks, condition, result);
62+
this.getItemsRecursive(tasks, condition, result);
4763
}
4864
return result;
4965
}
@@ -84,7 +100,7 @@ export default class TaskStore {
84100
}
85101
if (Array.isArray(this.tasks[projectId])) {
86102
const found: TaskModel[] = [];
87-
this.findTasksRecursive(this.tasks[projectId], condition, found);
103+
this.getItemsRecursive(this.tasks[projectId], condition, found);
88104
return found.map((f) => f.key);
89105
}
90106
return [];
@@ -113,7 +129,7 @@ export default class TaskStore {
113129
return task.active;
114130
}
115131

116-
return this.findTaskRecursive(tasks, condition);
132+
return this.getItemRecursive(tasks, condition);
117133
}
118134

119135
private checkTasksRecursive(tasks: TaskModel[], taskIds: string[]) {
@@ -124,38 +140,4 @@ export default class TaskStore {
124140
}
125141
});
126142
}
127-
128-
private findTaskRecursive(
129-
tasks: TaskModel[],
130-
condition: (task: TaskModel) => boolean
131-
): TaskModel | undefined {
132-
for (const task of tasks) {
133-
if (condition(task)) {
134-
return task;
135-
}
136-
if (Array.isArray(task.children)) {
137-
const found = this.findTaskRecursive(task.children, condition);
138-
if (found) {
139-
return found;
140-
}
141-
}
142-
}
143-
return undefined;
144-
}
145-
146-
private findTasksRecursive(
147-
tasks: TaskModel[],
148-
condition: (task: TaskModel) => boolean,
149-
result: TaskModel[]
150-
): TaskModel[] {
151-
for (const task of tasks) {
152-
if (condition(task)) {
153-
result.push(task);
154-
}
155-
if (Array.isArray(task.children)) {
156-
this.findTasksRecursive(task.children, condition, result);
157-
}
158-
}
159-
return result;
160-
}
161143
}

src/types/ITreeItem.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export interface ITreeItem<T extends ITreeItem = ITreeItem<any>> {
1+
export interface ITreeItem<T extends ITreeItem<any> = ITreeItem<any>> {
22
title: string;
33
key: string;
44
children?: T[];

0 commit comments

Comments
 (0)