Skip to content

Commit 460f8f1

Browse files
committed
Added parent, refactoring
1 parent d2b6ae7 commit 460f8f1

File tree

3 files changed

+79
-31
lines changed

3 files changed

+79
-31
lines changed

src/base/TreeModelHelper.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
import { ITreeItem } from '../types/ITreeItem';
22

33
const TreeModelHelper = {
4+
walkRecursive<T extends ITreeItem<any>>(
5+
fn: (t: T, p?: T) => void,
6+
treeItems: T[],
7+
parent?: T
8+
) {
9+
treeItems.forEach((item) => {
10+
fn(item, parent);
11+
if (item.children?.length) {
12+
TreeModelHelper.walkRecursive(fn, item.children, item);
13+
}
14+
});
15+
},
16+
417
modifyItemsWithIdsRecursive<T extends ITreeItem<any>>(
518
treeItems: T[],
619
ids: string[],

src/modules/tasks/TaskService.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,19 @@
1+
import { toJS } from 'mobx';
2+
13
import TaskRepository from './TaskRepository';
24
import TaskFactory from './TaskFactory';
35
import TasksByProject from './models/TasksByProject';
46
import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile';
7+
import TreeModelHelper from '../../base/TreeModelHelper';
8+
import TaskModel from './models/TaskModel';
9+
10+
const setParent = (item: TaskModel, parent?: TaskModel) => {
11+
item.parent = parent || null;
12+
};
13+
14+
const clearParent = (item: TaskModel) => {
15+
item.parent = null;
16+
};
517

618
export default class TaskService extends AbstractServiceWithProfile<
719
TasksByProject
@@ -11,10 +23,25 @@ export default class TaskService extends AbstractServiceWithProfile<
1123

1224
getAll(): TasksByProject {
1325
const data: TasksByProject = this.repository.restore({});
26+
TaskService.fillParent(data);
1427
return this.factory.createTasks(data);
1528
}
1629

1730
save(data: TasksByProject) {
18-
this.repository.save(data);
31+
const copyData = toJS(data);
32+
TaskService.clearParent(copyData);
33+
this.repository.save(copyData);
34+
}
35+
36+
private static fillParent(data: TasksByProject) {
37+
Object.values(data).forEach((projectTasks) => {
38+
TreeModelHelper.walkRecursive(setParent, projectTasks);
39+
});
40+
}
41+
42+
private static clearParent(data: TasksByProject) {
43+
Object.values(data).forEach((projectTasks) => {
44+
TreeModelHelper.walkRecursive(clearParent, projectTasks);
45+
});
1946
}
2047
}

src/modules/tasks/models/TaskModel.ts

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { action, computed, makeObservable, observable } from 'mobx';
2-
import isSameDay from 'date-fns/isSameDay';
2+
import { isSameDay, startOfDay } from 'date-fns';
33

44
import AbstractModel from '../../../base/AbstractModel';
55
import { ITreeItem } from '../../../types/ITreeItem';
6-
import { startOfDay } from 'date-fns';
76

87
export interface IJsonTimeRangeModel {
98
start: string;
@@ -24,47 +23,55 @@ interface IJsonTaskModel extends ITreeItem<IJsonTaskModel> {
2423
expanded: boolean;
2524
time: string[][] | IJsonTimeRangeModel[];
2625
datesInProgress: string[];
27-
children: IJsonTaskModel[];
2826
details: string[];
2927
}
3028

29+
const parseTimeRageItems = (
30+
timeItems: (string[] | IJsonTimeRangeModel | ITimeRangeModel)[]
31+
) => {
32+
return timeItems.map(
33+
(range: string[] | IJsonTimeRangeModel | ITimeRangeModel) => {
34+
if (Array.isArray(range)) {
35+
return {
36+
start: new Date(range[0]),
37+
end: range[1] ? new Date(range[1]) : undefined,
38+
description: undefined,
39+
};
40+
} else {
41+
return {
42+
start: new Date(range.start),
43+
end: range.end ? new Date(range.end) : undefined,
44+
description: range.description,
45+
};
46+
}
47+
}
48+
);
49+
};
50+
3151
export default class TaskModel extends AbstractModel {
3252
key: string = '';
3353
title: string = '';
3454
children: TaskModel[] = [];
55+
parent: TaskModel | null = null;
3556
projectId: string = '';
3657
checked: boolean = false;
37-
expanded: boolean = true;
3858
active: boolean = false;
59+
expanded: boolean = true;
3960
time: ITimeRangeModel[] = [];
4061
datesInProgress: Date[] = [];
4162
details: string = '';
4263

43-
constructor(props: IJsonTaskModel) {
64+
constructor(props: IJsonTaskModel | TaskModel) {
4465
super();
45-
this.load(props);
46-
this.children = props.children?.map((json) => new TaskModel(json)) || [];
47-
this.time =
48-
// @ts-ignore
49-
props.time?.map<ITimeRangeModel>(
50-
(range: string[] | IJsonTimeRangeModel) => {
51-
if (Array.isArray(range)) {
52-
return {
53-
start: new Date(range[0]),
54-
end: range[1] ? new Date(range[1]) : undefined,
55-
description: undefined,
56-
};
57-
} else {
58-
return {
59-
start: new Date(range.start),
60-
end: range.end ? new Date(range.end) : undefined,
61-
description: range.description,
62-
};
63-
}
64-
}
65-
) || [];
66-
this.datesInProgress =
67-
props.datesInProgress?.map((date) => new Date(date)) || [];
66+
const newProps = {
67+
...props,
68+
children: props.children?.map((json) => new TaskModel(json)) || [],
69+
time: props.time ? parseTimeRageItems(props.time) : [],
70+
datesInProgress:
71+
props.datesInProgress?.map((date) => new Date(date)) || [],
72+
};
73+
74+
this.load(newProps);
6875

6976
makeObservable(this, {
7077
key: observable,
@@ -117,9 +124,10 @@ export default class TaskModel extends AbstractModel {
117124

118125
start() {
119126
this.active = true;
120-
this.addDateWhenWasInProgress(new Date());
127+
const dateNow = new Date();
128+
this.addDateWhenWasInProgress(dateNow);
121129
this.time.push({
122-
start: new Date(),
130+
start: dateNow,
123131
end: undefined,
124132
description: undefined,
125133
});

0 commit comments

Comments
 (0)