Skip to content

Commit 0e45354

Browse files
committed
Fix ts errors
1 parent d932f05 commit 0e45354

File tree

12 files changed

+72
-83
lines changed

12 files changed

+72
-83
lines changed

src/helpers/TreeModelHelper.test.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import TreeModelHelper from './TreeModelHelper';
22
import TaskFactory from '../modules/tasks/TaskFactory';
33
import { IJsonTaskModel } from '../modules/tasks/models/TaskModel';
44
import { TasksByProject } from '../modules/tasks/models/TasksByProject';
5-
import { ITreeItemWithParent } from '../types/ITreeItem';
65

76
describe('TreeModelHelper', () => {
87
let testTasks: TasksByProject | undefined;
@@ -19,19 +18,19 @@ describe('TreeModelHelper', () => {
1918
const task111: Partial<IJsonTaskModel> = {
2019
key: '111',
2120
title: 'task1-1-1',
22-
parent: null,
21+
parent: undefined,
2322
children: [],
2423
};
2524
const task11: Partial<IJsonTaskModel> = {
2625
key: '11',
2726
title: 'task1-1',
28-
parent: null,
27+
parent: undefined,
2928
children: [task111 as IJsonTaskModel],
3029
};
3130
const task1: Partial<IJsonTaskModel> = {
3231
key: '1',
3332
title: 'task1',
34-
parent: null,
33+
parent: undefined,
3534
children: [task11 as IJsonTaskModel],
3635
};
3736

@@ -41,19 +40,19 @@ describe('TreeModelHelper', () => {
4140
const task21: Partial<IJsonTaskModel> = {
4241
key: '21',
4342
title: 'task21',
44-
parent: null,
43+
parent: undefined,
4544
children: [],
4645
};
4746
const task22: Partial<IJsonTaskModel> = {
4847
key: '22',
4948
title: 'task22',
50-
parent: null,
49+
parent: undefined,
5150
children: [],
5251
};
5352
const task2: Partial<IJsonTaskModel> = {
5453
key: '2',
5554
title: 'task2',
56-
parent: null,
55+
parent: undefined,
5756
children: [task21, task22] as IJsonTaskModel[],
5857
};
5958
task21.parent = task2 as IJsonTaskModel;
@@ -68,19 +67,17 @@ describe('TreeModelHelper', () => {
6867
if (!testTasks) {
6968
throw new Error();
7069
}
71-
const task111 = testTasks.proj[0].children[0].children[0];
72-
expect(TreeModelHelper.getPathToNode(task111)).toStrictEqual([
73-
'1',
74-
'11',
75-
'111',
76-
]);
70+
const task111 = testTasks?.proj?.[0]?.children?.[0]?.children?.[0];
71+
const result = task111 ? TreeModelHelper.getPathToNode(task111) : undefined;
72+
expect(result).toStrictEqual(['1', '11', '111']);
7773
});
7874

7975
test('getPathToNode #2', () => {
8076
if (!testTasks) {
8177
throw new Error();
8278
}
83-
const task22 = testTasks.proj[1].children[0];
84-
expect(TreeModelHelper.getPathToNode(task22)).toStrictEqual(['2', '21']);
79+
const task22 = testTasks?.proj?.[1]?.children?.[0];
80+
const result = task22 ? TreeModelHelper.getPathToNode(task22) : undefined;
81+
expect(result).toStrictEqual(['2', '21']);
8582
});
8683
});

src/helpers/TreeModelHelper.ts

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const TreeModelHelper = {
5252

5353
return TreeModelHelper.copyItemsToTree(
5454
sourceTree,
55-
destProject.children,
55+
destProject.children || [],
5656
keysToNode
5757
);
5858
},
@@ -92,8 +92,8 @@ const TreeModelHelper = {
9292
if (nextDestNode) {
9393
// We already have a copy of node, go on
9494
keyIdx++;
95-
sourceChildren = nextSourceNode.children;
96-
destChildren = nextDestNode.children;
95+
sourceChildren = nextSourceNode.children || [];
96+
destChildren = nextDestNode.children || [];
9797
} else {
9898
// Make a copy from this node
9999
const restKeysToNode = keysToNode.slice(keyIdx);
@@ -134,8 +134,8 @@ const TreeModelHelper = {
134134
return true;
135135
}
136136

137-
destChildren = copyNode.children;
138-
sourceNode = sourceNode.children.find(
137+
destChildren = copyNode.children || [];
138+
sourceNode = sourceNode.children?.find(
139139
(node) => node.key === keysToNode[keyIdx]
140140
);
141141
if (!sourceNode) {
@@ -144,52 +144,52 @@ const TreeModelHelper = {
144144
}
145145
},
146146

147-
walkRecursive<T extends ITreeItem<any>>(
147+
walkRecursive<T extends ITreeItem>(
148148
fn: (item: T, parent?: T) => void,
149149
treeItems: T[],
150150
parent?: T
151151
) {
152152
treeItems.forEach((item) => {
153153
fn(item, parent);
154154
if (item.children?.length) {
155-
TreeModelHelper.walkRecursive(fn, item.children, item);
155+
this.walkRecursive(fn, item.children as T[], item);
156156
}
157157
});
158158
},
159159

160-
walkToParent<T extends ITreeItemWithParent<any>>(
160+
walkToParent<T extends ITreeItemWithParent>(
161161
fn: (nParent: T) => void,
162162
treeItem: T
163163
) {
164164
if (treeItem.parent) {
165-
fn(treeItem.parent);
166-
TreeModelHelper.walkToParent(fn, treeItem.parent);
165+
fn(treeItem.parent as T);
166+
this.walkToParent(fn, treeItem.parent as T);
167167
}
168168
},
169169

170-
modifyItemsWithIdsRecursive<T extends ITreeItem<any>>(
170+
modifyItemsWithIdsRecursive<T extends ITreeItem>(
171171
treeItems: T[],
172172
ids: string[],
173173
fn: (treeItem: T, ids: string[]) => void
174174
) {
175175
treeItems.forEach((item) => {
176176
fn(item, ids);
177177
if (Array.isArray(item.children) && item.children.length) {
178-
TreeModelHelper.modifyItemsWithIdsRecursive(item.children, ids, fn);
178+
this.modifyItemsWithIdsRecursive(item.children as T[], ids, fn);
179179
}
180180
});
181181
},
182182

183-
getItemRecursive<T extends ITreeItem<any>>(
184-
tasks: T[],
183+
getItemRecursive<T extends ITreeItem>(
184+
items: T[],
185185
condition: (task: T) => boolean
186186
): T | undefined {
187-
for (const task of tasks) {
188-
if (condition(task)) {
189-
return task;
187+
for (const item of items) {
188+
if (condition(item)) {
189+
return item;
190190
}
191-
if (Array.isArray(task.children)) {
192-
const found = this.getItemRecursive(task.children, condition);
191+
if (item.children?.length) {
192+
const found = this.getItemRecursive(item.children as T[], condition);
193193
if (found) {
194194
return found;
195195
}
@@ -198,7 +198,7 @@ const TreeModelHelper = {
198198
return undefined;
199199
},
200200

201-
getFlatItemsRecursive<T extends ITreeItem<any>>(
201+
getFlatItemsRecursive<T extends ITreeItem>(
202202
tree: T[],
203203
condition: (task: T) => boolean
204204
): T[] {
@@ -209,33 +209,32 @@ const TreeModelHelper = {
209209
return result;
210210
},
211211

212-
getFlatItemsRecursiveBase<T extends ITreeItem<any>>(
212+
getFlatItemsRecursiveBase<T extends ITreeItem>(
213213
treeItems: T[],
214214
condition: (item: T) => boolean,
215215
result: T[]
216216
): T[] {
217-
for (const item of treeItems) {
217+
treeItems.forEach((item) => {
218218
if (condition(item)) {
219219
result.push(item);
220220
}
221-
if (Array.isArray(item.children)) {
222-
this.getFlatItemsRecursiveBase(item.children, condition, result);
221+
if (item.children?.length) {
222+
this.getFlatItemsRecursiveBase(item.children as T[], condition, result);
223223
}
224-
}
224+
});
225225
return result;
226226
},
227227

228-
deleteItems<T extends ITreeItem<any>>(
228+
deleteItems<T extends ITreeItem>(
229229
treeItems: T[],
230-
condition: (task: T) => boolean
230+
condition: (item: T) => boolean
231231
): T[] {
232232
const result = treeItems.filter((t) => !condition(t));
233-
for (let i = 0; i < result.length; i++) {
234-
const task = treeItems[i];
235-
if (Array.isArray(task.children)) {
236-
treeItems[i].children = this.deleteItems(task.children, condition);
233+
result.forEach((item) => {
234+
if (item.children?.length) {
235+
item.children = this.deleteItems(item.children as T[], condition);
237236
}
238-
}
237+
});
239238
return result;
240239
},
241240
};

src/modules/projects/models/ProjectModel.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as colors from '@ant-design/colors';
22

33
import AbstractModel from '../../../base/AbstractModel';
4-
import { ITreeItem } from '../../../types/ITreeItem';
4+
import { ITreeItem, ITreeItemWithParent } from '../../../types/ITreeItem';
55

66
export enum DEFAULT_PROJECT_ID {
77
MyDay = '0',
@@ -25,16 +25,18 @@ export const DEFAULT_PROJECTS: IJsonProjectItem[] = [
2525
},
2626
];
2727

28-
export interface IJsonProjectItem extends ITreeItem<IJsonProjectItem> {
28+
export interface IJsonProjectItem extends ITreeItem {
2929
color: string;
3030
expanded: boolean;
3131
deletable: boolean;
32+
children?: IJsonProjectItem[];
3233
}
3334

34-
interface IProjectModel extends ITreeItem<IProjectModel> {
35+
interface IProjectModel extends ITreeItemWithParent {
3536
color: string;
3637
expanded: boolean;
3738
deletable: boolean;
39+
children?: IProjectModel[];
3840
}
3941

4042
export default class ProjectModel extends AbstractModel
@@ -45,6 +47,7 @@ export default class ProjectModel extends AbstractModel
4547
expanded: boolean = false;
4648
deletable: boolean = true;
4749
children?: ProjectModel[] = [];
50+
parent: ProjectModel | undefined;
4851

4952
constructor(props: IJsonProjectItem) {
5053
super();

src/modules/tasks/TaskService.ts

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import AbstractServiceWithProfile from '../../base/AbstractServiceWithProfile';
77
import TreeModelHelper from '../../helpers/TreeModelHelper';
88
import { ITreeItemWithParent } from '../../types/ITreeItem';
99

10-
const setParent = <T extends ITreeItemWithParent<any>>(item: T, parent?: T) => {
11-
item.parent = parent || null;
10+
const setParent = <T extends ITreeItemWithParent>(item: T, parent?: T) => {
11+
item.parent = parent;
1212
};
1313

14-
const clearParent = (item: ITreeItemWithParent<any>) => {
15-
item.parent = null;
14+
const clearParent = <T extends ITreeItemWithParent>(item: T) => {
15+
item.parent = undefined;
1616
};
1717

1818
export default class TaskService extends AbstractServiceWithProfile<
@@ -33,21 +33,16 @@ export default class TaskService extends AbstractServiceWithProfile<
3333
this.repository.save(copyData);
3434
}
3535

36+
// TODO ProjectService fill and remove parent
3637
private static fillParent(data: TasksByProject) {
3738
Object.values(data).forEach((projectTasks) => {
38-
TreeModelHelper.walkRecursive<ITreeItemWithParent<any>>(
39-
setParent,
40-
projectTasks
41-
);
39+
TreeModelHelper.walkRecursive(setParent, projectTasks);
4240
});
4341
}
4442

4543
private static clearParent(data: TasksByProject) {
4644
Object.values(data).forEach((projectTasks) => {
47-
TreeModelHelper.walkRecursive<ITreeItemWithParent<any>>(
48-
clearParent,
49-
projectTasks
50-
);
45+
TreeModelHelper.walkRecursive(clearParent, projectTasks);
5146
});
5247
}
5348
}

src/modules/tasks/TaskStore.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@ import {
1616
ETimeRangeEvents,
1717
} from '../../services/gaService/EEvents';
1818
import { DEFAULT_PROJECT_ID } from '../projects/models/ProjectModel';
19-
import { ITreeItemWithParent } from '../../types/ITreeItem';
20-
21-
// FIXME ts errors
2219

2320
export default class TaskStore {
2421
tasks: TasksByProject = {};
@@ -223,7 +220,7 @@ export default class TaskStore {
223220
condition: (task: TaskModel) => boolean
224221
) {
225222
if (Array.isArray(this.tasks[projectId])) {
226-
return TreeModelHelper.getFlatItemsRecursive<ITreeItemWithParent>(
223+
return TreeModelHelper.getFlatItemsRecursive(
227224
this.tasks[projectId],
228225
condition
229226
).map((task) => task.key);

src/modules/tasks/models/TaskInMyDay.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import TaskModel from './TaskModel';
22

33
export class TaskInMyDay extends TaskModel {
44
origin: TaskModel | null = null;
5-
children: TaskInMyDay[] = [];
5+
children?: TaskInMyDay[] = [];
66

77
constructor(originTaskModel: TaskModel, children: TaskInMyDay[]) {
88
super(originTaskModel);

src/modules/tasks/models/TaskModel.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface ITimeRangeModel {
1717
}
1818

1919
export interface IJsonTaskModel extends ITreeItemWithParent {
20+
children?: IJsonTaskModel[];
2021
projectId?: string;
2122
checked?: boolean;
2223
active?: boolean;
@@ -50,10 +51,10 @@ const parseTimeRageItems = (
5051
};
5152

5253
export default class TaskModel extends AbstractModel
53-
implements ITreeItemWithParent<TaskModel> {
54+
implements ITreeItemWithParent {
5455
key: string = '';
5556
title: string = '';
56-
children: TaskModel[] = [];
57+
children?: TaskModel[] = [];
5758
parent: TaskModel | undefined = undefined;
5859
projectId: string = '';
5960
checked: boolean = false;

src/modules/tasks/models/TaskWithProjectNameModel.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ interface ITaskWithProjectName {
1010
}
1111

1212
export class TaskWithProjectNameModel extends AbstractModel
13-
implements ITreeItemWithParent<TaskModel> {
13+
implements ITreeItemWithParent {
1414
key: string = '';
1515
title: string = '';
1616
parent: TaskModel | undefined = undefined;
17-
children: TaskModel[] = [];
17+
children?: TaskModel[] = [];
1818

1919
constructor(props: ITaskWithProjectName) {
2020
super();
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import TaskModel from './TaskModel';
2-
import { TaskInMyDay } from './TaskInMyDay';
3-
import { TaskWithProjectNameModel } from './TaskWithProjectNameModel';
42

5-
export type Task = TaskModel | TaskInMyDay | TaskWithProjectNameModel;
3+
// export type Task = TaskModel | TaskInMyDay | TaskWithProjectNameModel;
4+
export type Task = TaskModel;
65
export type TasksByProject = Record<string, Task[]>;

src/screens/projects/ProjectsScreen.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ const TaskList = TreeList(
5050
}
5151
);
5252

53-
const ProjectList = TreeList(
53+
const ProjectList = TreeList<ProjectModel>(
5454
() => projectStore.projects,
5555
(list: ProjectModel[]) => {
5656
projectStore.set(list);

0 commit comments

Comments
 (0)