@aneuhold/core-ts-db-lib 1.0.120 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +48 -5
- package/lib/documents/BaseDocument.d.ts +1 -1
- package/lib/documents/BaseDocument.d.ts.map +1 -1
- package/lib/documents/BaseDocument.js +4 -6
- package/lib/documents/BaseDocument.js.map +1 -0
- package/lib/documents/BaseDocument.ts +9 -0
- package/lib/documents/BaseDocumentWithType.d.ts +1 -1
- package/lib/documents/BaseDocumentWithType.d.ts.map +1 -1
- package/lib/documents/BaseDocumentWithType.js +3 -8
- package/lib/documents/BaseDocumentWithType.js.map +1 -0
- package/lib/documents/BaseDocumentWithType.ts +5 -0
- package/lib/documents/common/ApiKey.d.ts +5 -4
- package/lib/documents/common/ApiKey.d.ts.map +1 -1
- package/lib/documents/common/ApiKey.js +10 -17
- package/lib/documents/common/ApiKey.js.map +1 -0
- package/lib/documents/common/ApiKey.ts +40 -0
- package/lib/documents/common/User.d.ts +2 -2
- package/lib/documents/common/User.d.ts.map +1 -1
- package/lib/documents/common/User.js +8 -15
- package/lib/documents/common/User.js.map +1 -0
- package/lib/documents/common/User.ts +63 -0
- package/lib/documents/dashboard/NonogramKatanaItem.d.ts +4 -4
- package/lib/documents/dashboard/NonogramKatanaItem.d.ts.map +1 -1
- package/lib/documents/dashboard/NonogramKatanaItem.js +4 -11
- package/lib/documents/dashboard/NonogramKatanaItem.js.map +1 -0
- package/lib/documents/dashboard/NonogramKatanaItem.ts +53 -0
- package/lib/documents/dashboard/NonogramKatanaUpgrade.d.ts +5 -5
- package/lib/documents/dashboard/NonogramKatanaUpgrade.d.ts.map +1 -1
- package/lib/documents/dashboard/NonogramKatanaUpgrade.js +4 -11
- package/lib/documents/dashboard/NonogramKatanaUpgrade.js.map +1 -0
- package/lib/documents/dashboard/NonogramKatanaUpgrade.ts +50 -0
- package/lib/documents/dashboard/Task.d.ts +7 -7
- package/lib/documents/dashboard/Task.d.ts.map +1 -1
- package/lib/documents/dashboard/Task.js +10 -17
- package/lib/documents/dashboard/Task.js.map +1 -0
- package/lib/documents/dashboard/Task.ts +173 -0
- package/lib/documents/dashboard/UserConfig.d.ts +6 -6
- package/lib/documents/dashboard/UserConfig.d.ts.map +1 -1
- package/lib/documents/dashboard/UserConfig.js +12 -19
- package/lib/documents/dashboard/UserConfig.js.map +1 -0
- package/lib/documents/dashboard/UserConfig.ts +110 -0
- package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.d.ts.map +1 -1
- package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.js +2 -3
- package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.js.map +1 -0
- package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.ts +97 -0
- package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.d.ts.map +1 -1
- package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.js +2 -3
- package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.js.map +1 -0
- package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.ts +263 -0
- package/lib/embedded-types/dashboard/task/FilterSettings.d.ts +2 -2
- package/lib/embedded-types/dashboard/task/FilterSettings.d.ts.map +1 -1
- package/lib/embedded-types/dashboard/task/FilterSettings.js +3 -6
- package/lib/embedded-types/dashboard/task/FilterSettings.js.map +1 -0
- package/lib/embedded-types/dashboard/task/FilterSettings.ts +100 -0
- package/lib/embedded-types/dashboard/task/RecurrenceInfo.d.ts +1 -1
- package/lib/embedded-types/dashboard/task/RecurrenceInfo.d.ts.map +1 -1
- package/lib/embedded-types/dashboard/task/RecurrenceInfo.js +8 -11
- package/lib/embedded-types/dashboard/task/RecurrenceInfo.js.map +1 -0
- package/lib/embedded-types/dashboard/task/RecurrenceInfo.ts +100 -0
- package/lib/embedded-types/dashboard/task/SortSettings.d.ts +2 -2
- package/lib/embedded-types/dashboard/task/SortSettings.d.ts.map +1 -1
- package/lib/embedded-types/dashboard/task/SortSettings.js +7 -11
- package/lib/embedded-types/dashboard/task/SortSettings.js.map +1 -0
- package/lib/embedded-types/dashboard/task/SortSettings.ts +89 -0
- package/lib/embedded-types/dashboard/userConfig/Tags.d.ts.map +1 -1
- package/lib/embedded-types/dashboard/userConfig/Tags.js +2 -2
- package/lib/embedded-types/dashboard/userConfig/Tags.js.map +1 -0
- package/lib/embedded-types/dashboard/userConfig/Tags.ts +9 -0
- package/lib/index.d.ts +20 -20
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19 -71
- package/lib/index.js.map +1 -0
- package/lib/index.ts +103 -0
- package/lib/schemas/required-refs/RequiredUserId.d.ts +1 -1
- package/lib/schemas/required-refs/RequiredUserId.d.ts.map +1 -1
- package/lib/schemas/required-refs/RequiredUserId.js +3 -8
- package/lib/schemas/required-refs/RequiredUserId.js.map +1 -0
- package/lib/schemas/required-refs/RequiredUserId.ts +9 -0
- package/lib/schemas/type-guards/commonTypeGuards.d.ts.map +1 -1
- package/lib/schemas/type-guards/commonTypeGuards.js +6 -12
- package/lib/schemas/type-guards/commonTypeGuards.js.map +1 -0
- package/lib/schemas/type-guards/commonTypeGuards.ts +29 -0
- package/lib/schemas/validators/DocumentValidator.d.ts +1 -1
- package/lib/schemas/validators/DocumentValidator.d.ts.map +1 -1
- package/lib/schemas/validators/DocumentValidator.js +2 -2
- package/lib/schemas/validators/DocumentValidator.js.map +1 -0
- package/lib/schemas/validators/DocumentValidator.ts +5 -0
- package/lib/schemas/validators/ValidateUtil.d.ts.map +1 -1
- package/lib/schemas/validators/ValidateUtil.js +8 -10
- package/lib/schemas/validators/ValidateUtil.js.map +1 -0
- package/lib/schemas/validators/ValidateUtil.spec.ts +75 -0
- package/lib/schemas/validators/ValidateUtil.ts +193 -0
- package/lib/services/DocumentService.d.ts +1 -1
- package/lib/services/DocumentService.d.ts.map +1 -1
- package/lib/services/DocumentService.js +4 -6
- package/lib/services/DocumentService.js.map +1 -0
- package/lib/services/DocumentService.spec.ts +28 -0
- package/lib/services/DocumentService.ts +18 -0
- package/lib/services/dashboard/Task/TaskFilterService.d.ts +2 -2
- package/lib/services/dashboard/Task/TaskFilterService.d.ts.map +1 -1
- package/lib/services/dashboard/Task/TaskFilterService.js +2 -4
- package/lib/services/dashboard/Task/TaskFilterService.js.map +1 -0
- package/lib/services/dashboard/Task/TaskFilterService.ts +105 -0
- package/lib/services/dashboard/Task/TaskRecurrenceService.d.ts +2 -2
- package/lib/services/dashboard/Task/TaskRecurrenceService.d.ts.map +1 -1
- package/lib/services/dashboard/Task/TaskRecurrenceService.js +21 -23
- package/lib/services/dashboard/Task/TaskRecurrenceService.js.map +1 -0
- package/lib/services/dashboard/Task/TaskRecurrenceService.ts +172 -0
- package/lib/services/dashboard/Task/TaskService.d.ts +5 -5
- package/lib/services/dashboard/Task/TaskService.d.ts.map +1 -1
- package/lib/services/dashboard/Task/TaskService.js +13 -18
- package/lib/services/dashboard/Task/TaskService.js.map +1 -0
- package/lib/services/dashboard/Task/TaskService.spec.ts +653 -0
- package/lib/services/dashboard/Task/TaskService.ts +189 -0
- package/lib/services/dashboard/Task/TaskSortService.d.ts +3 -3
- package/lib/services/dashboard/Task/TaskSortService.d.ts.map +1 -1
- package/lib/services/dashboard/Task/TaskSortService.js +6 -8
- package/lib/services/dashboard/Task/TaskSortService.js.map +1 -0
- package/lib/services/dashboard/Task/TaskSortService.ts +229 -0
- package/package.json +36 -29
- package/lib/schemas/validators/ValidateUtil.spec.d.ts +0 -2
- package/lib/schemas/validators/ValidateUtil.spec.d.ts.map +0 -1
- package/lib/schemas/validators/ValidateUtil.spec.js +0 -64
- package/lib/services/DocumentService.spec.d.ts +0 -2
- package/lib/services/DocumentService.spec.d.ts.map +0 -1
- package/lib/services/DocumentService.spec.js +0 -30
- package/lib/services/dashboard/Task/TaskService.spec.d.ts +0 -2
- package/lib/services/dashboard/Task/TaskService.spec.d.ts.map +0 -1
- package/lib/services/dashboard/Task/TaskService.spec.js +0 -508
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const bson_1 = require("bson");
|
|
7
|
-
const DocumentService_1 = __importDefault(require("./DocumentService"));
|
|
8
|
-
describe('DocumentService', () => {
|
|
9
|
-
describe('deepCopy', () => {
|
|
10
|
-
it('should return a deep copy of the object', () => {
|
|
11
|
-
const obj = {
|
|
12
|
-
id: new bson_1.ObjectId(),
|
|
13
|
-
a: 1,
|
|
14
|
-
b: {
|
|
15
|
-
c: 2
|
|
16
|
-
}
|
|
17
|
-
};
|
|
18
|
-
const result = DocumentService_1.default.deepCopy(obj);
|
|
19
|
-
expect(result).toEqual(obj);
|
|
20
|
-
expect(typeof result.id === 'object').toBeTruthy();
|
|
21
|
-
expect(result.id.toString()).toEqual(obj.id.toString());
|
|
22
|
-
expect(result).not.toBe(obj);
|
|
23
|
-
expect(result.b).toEqual(obj.b);
|
|
24
|
-
expect(result.b).not.toBe(obj.b);
|
|
25
|
-
// Change the original object and make sure the copy is not affected
|
|
26
|
-
obj.b.c = 3;
|
|
27
|
-
expect(result.b.c).toEqual(2);
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TaskService.spec.d.ts","sourceRoot":"","sources":["../../../../src/services/dashboard/Task/TaskService.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,508 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const bson_1 = require("bson");
|
|
7
|
-
const Task_1 = __importDefault(require("../../../documents/dashboard/Task"));
|
|
8
|
-
const RecurrenceInfo_1 = require("../../../embedded-types/dashboard/task/RecurrenceInfo");
|
|
9
|
-
const TaskService_1 = __importDefault(require("./TaskService"));
|
|
10
|
-
const SortSettings_1 = require("../../../embedded-types/dashboard/task/SortSettings");
|
|
11
|
-
describe('DashboardTaskService', () => {
|
|
12
|
-
describe('getNextFrequencyDate', () => {
|
|
13
|
-
it('should return a valid date for lastDayOfMonth', () => {
|
|
14
|
-
const basisDate = new Date(2024, 0, 1);
|
|
15
|
-
const frequency = {
|
|
16
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.lastDayOfMonth
|
|
17
|
-
};
|
|
18
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
19
|
-
expect(result).toEqual(new Date(2024, 0, 31));
|
|
20
|
-
});
|
|
21
|
-
describe('every X time unit', () => {
|
|
22
|
-
it('should return a valid date for every X Day', () => {
|
|
23
|
-
const basisDate = new Date(2024, 0, 1);
|
|
24
|
-
const frequency = {
|
|
25
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXTimeUnit,
|
|
26
|
-
everyXTimeUnit: {
|
|
27
|
-
timeUnit: 'day',
|
|
28
|
-
x: 2
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
32
|
-
expect(result).toEqual(new Date(2024, 0, 3));
|
|
33
|
-
});
|
|
34
|
-
it('should return a valid date for every X Week', () => {
|
|
35
|
-
const basisDate = new Date(2024, 0, 1);
|
|
36
|
-
const frequency = {
|
|
37
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXTimeUnit,
|
|
38
|
-
everyXTimeUnit: {
|
|
39
|
-
timeUnit: 'week',
|
|
40
|
-
x: 2
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
44
|
-
expect(result).toEqual(new Date(2024, 0, 15));
|
|
45
|
-
});
|
|
46
|
-
it('should return a valid date for every X Month', () => {
|
|
47
|
-
const basisDate = new Date(2024, 0, 1);
|
|
48
|
-
const frequency = {
|
|
49
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXTimeUnit,
|
|
50
|
-
everyXTimeUnit: {
|
|
51
|
-
timeUnit: 'month',
|
|
52
|
-
x: 2
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
56
|
-
expect(result).toEqual(new Date(2024, 2, 1));
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
it('should return a valid date for weekDaySet', () => {
|
|
60
|
-
const basisDate = new Date(2024, 0, 1);
|
|
61
|
-
const frequency = {
|
|
62
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.weekDaySet,
|
|
63
|
-
weekDaySet: [0, 6]
|
|
64
|
-
};
|
|
65
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
66
|
-
expect(result).toEqual(new Date(2024, 0, 6));
|
|
67
|
-
});
|
|
68
|
-
describe('Every X Weekday of Month', () => {
|
|
69
|
-
it('should return a valid date for every 2nd Sunday of Month', () => {
|
|
70
|
-
const basisDate = new Date(2024, 0, 1);
|
|
71
|
-
// Every second sunday
|
|
72
|
-
const frequency = {
|
|
73
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXWeekdayOfMonth,
|
|
74
|
-
everyXWeekdayOfMonth: {
|
|
75
|
-
weekDay: 0,
|
|
76
|
-
weekOfMonth: 2
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
80
|
-
expect(result).toEqual(new Date(2024, 0, 14));
|
|
81
|
-
});
|
|
82
|
-
it('should return a valid date across year change', () => {
|
|
83
|
-
const basisDate = new Date(2023, 11, 30);
|
|
84
|
-
// Every 1st Saturday
|
|
85
|
-
const frequency = {
|
|
86
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXWeekdayOfMonth,
|
|
87
|
-
everyXWeekdayOfMonth: {
|
|
88
|
-
weekDay: 6,
|
|
89
|
-
weekOfMonth: 1
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
93
|
-
expect(result).toEqual(new Date(2024, 0, 6));
|
|
94
|
-
});
|
|
95
|
-
it('should return a valid next date when the basis is the same as the recurrence', () => {
|
|
96
|
-
const basisDate = new Date(2024, 0, 14);
|
|
97
|
-
// Every second sunday
|
|
98
|
-
const frequency = {
|
|
99
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXWeekdayOfMonth,
|
|
100
|
-
everyXWeekdayOfMonth: {
|
|
101
|
-
weekDay: 0,
|
|
102
|
-
weekOfMonth: 2
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
const result = TaskService_1.default.getNextFrequencyDate(basisDate, frequency);
|
|
106
|
-
expect(result).toEqual(new Date(2024, 1, 11));
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
describe('updateDatesForRecurrence', () => {
|
|
111
|
-
describe('Start date basis', () => {
|
|
112
|
-
it('should update the start date correctly for a daily recurrence', () => {
|
|
113
|
-
const task = new Task_1.default(new bson_1.ObjectId());
|
|
114
|
-
task.startDate = new Date(2024, 0, 1);
|
|
115
|
-
task.recurrenceInfo = {
|
|
116
|
-
frequency: {
|
|
117
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXTimeUnit,
|
|
118
|
-
everyXTimeUnit: {
|
|
119
|
-
timeUnit: 'day',
|
|
120
|
-
x: 1
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
recurrenceBasis: RecurrenceInfo_1.RecurrenceBasis.startDate,
|
|
124
|
-
recurrenceEffect: RecurrenceInfo_1.RecurrenceEffect.rollOnBasis
|
|
125
|
-
};
|
|
126
|
-
TaskService_1.default.updateDatesForRecurrence(task);
|
|
127
|
-
expect(task.startDate).toEqual(new Date(2024, 0, 2));
|
|
128
|
-
});
|
|
129
|
-
it('should update the start date correctly for daily recurrence on subtask', () => {
|
|
130
|
-
const task = new Task_1.default(new bson_1.ObjectId());
|
|
131
|
-
task.startDate = new Date(2024, 0, 8);
|
|
132
|
-
task.dueDate = new Date(2024, 0, 13);
|
|
133
|
-
task.recurrenceInfo = {
|
|
134
|
-
frequency: {
|
|
135
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXTimeUnit,
|
|
136
|
-
everyXTimeUnit: {
|
|
137
|
-
timeUnit: 'day',
|
|
138
|
-
x: 1
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
recurrenceBasis: RecurrenceInfo_1.RecurrenceBasis.startDate,
|
|
142
|
-
recurrenceEffect: RecurrenceInfo_1.RecurrenceEffect.rollOnBasis
|
|
143
|
-
};
|
|
144
|
-
task.parentRecurringTaskInfo = {
|
|
145
|
-
taskId: new bson_1.ObjectId(),
|
|
146
|
-
startDate: new Date(2024, 0, 1)
|
|
147
|
-
};
|
|
148
|
-
TaskService_1.default.updateDatesForRecurrence(task);
|
|
149
|
-
expect(task.startDate).toEqual(new Date(2024, 0, 9));
|
|
150
|
-
expect(task.dueDate).toEqual(new Date(2024, 0, 14));
|
|
151
|
-
});
|
|
152
|
-
it('should update the start date correctly for a weekly recurrence', () => {
|
|
153
|
-
const task = new Task_1.default(new bson_1.ObjectId());
|
|
154
|
-
task.startDate = new Date(2024, 0, 1);
|
|
155
|
-
task.recurrenceInfo = {
|
|
156
|
-
frequency: {
|
|
157
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXTimeUnit,
|
|
158
|
-
everyXTimeUnit: {
|
|
159
|
-
timeUnit: 'week',
|
|
160
|
-
x: 1
|
|
161
|
-
}
|
|
162
|
-
},
|
|
163
|
-
recurrenceBasis: RecurrenceInfo_1.RecurrenceBasis.startDate,
|
|
164
|
-
recurrenceEffect: RecurrenceInfo_1.RecurrenceEffect.rollOnBasis
|
|
165
|
-
};
|
|
166
|
-
TaskService_1.default.updateDatesForRecurrence(task);
|
|
167
|
-
expect(task.startDate).toEqual(new Date(2024, 0, 8));
|
|
168
|
-
});
|
|
169
|
-
it('should update the start and due date correctly for a weekDaySet reccurence', () => {
|
|
170
|
-
const task = new Task_1.default(new bson_1.ObjectId());
|
|
171
|
-
task.startDate = new Date(2024, 0, 1, 11);
|
|
172
|
-
task.dueDate = new Date(2024, 0, 4, 23, 59);
|
|
173
|
-
task.recurrenceInfo = {
|
|
174
|
-
frequency: {
|
|
175
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.weekDaySet,
|
|
176
|
-
weekDaySet: [0, 5]
|
|
177
|
-
},
|
|
178
|
-
recurrenceBasis: RecurrenceInfo_1.RecurrenceBasis.startDate,
|
|
179
|
-
recurrenceEffect: RecurrenceInfo_1.RecurrenceEffect.rollOnBasis
|
|
180
|
-
};
|
|
181
|
-
TaskService_1.default.updateDatesForRecurrence(task);
|
|
182
|
-
expect(task.startDate).toEqual(new Date(2024, 0, 5, 11));
|
|
183
|
-
expect(task.dueDate).toEqual(new Date(2024, 0, 8, 23, 59));
|
|
184
|
-
});
|
|
185
|
-
it('should update the start and due date correctly for a everyXWeekdayOfMonth reccurence', () => {
|
|
186
|
-
const task = new Task_1.default(new bson_1.ObjectId());
|
|
187
|
-
task.startDate = new Date(2024, 0, 1, 11);
|
|
188
|
-
task.dueDate = new Date(2024, 0, 4, 23, 59);
|
|
189
|
-
task.recurrenceInfo = {
|
|
190
|
-
frequency: {
|
|
191
|
-
type: RecurrenceInfo_1.RecurrenceFrequencyType.everyXWeekdayOfMonth,
|
|
192
|
-
everyXWeekdayOfMonth: {
|
|
193
|
-
weekDay: 0,
|
|
194
|
-
weekOfMonth: 1
|
|
195
|
-
}
|
|
196
|
-
},
|
|
197
|
-
recurrenceBasis: RecurrenceInfo_1.RecurrenceBasis.startDate,
|
|
198
|
-
recurrenceEffect: RecurrenceInfo_1.RecurrenceEffect.rollOnBasis
|
|
199
|
-
};
|
|
200
|
-
TaskService_1.default.updateDatesForRecurrence(task);
|
|
201
|
-
expect(task.startDate).toEqual(new Date(2024, 0, 7, 11));
|
|
202
|
-
expect(task.dueDate).toEqual(new Date(2024, 0, 10, 23, 59));
|
|
203
|
-
});
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
describe('getFilteredAndSortedTaskIds', () => {
|
|
207
|
-
it('should return a list of tasks for a category', () => {
|
|
208
|
-
// Setup
|
|
209
|
-
const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } = setupSortAndFilterTest();
|
|
210
|
-
tasksList[0].category = 'somethingelse';
|
|
211
|
-
// Call
|
|
212
|
-
const { filteredAndSortedIds: result } = TaskService_1.default.getFilteredAndSortedTaskIds(taskMap, 'default', filterSettings, sortSettings, tagSettings);
|
|
213
|
-
// Assert
|
|
214
|
-
expect(result.length).toBe(4);
|
|
215
|
-
result.forEach((taskId) => {
|
|
216
|
-
expect(taskMap[taskId].category).toBe('default');
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
it('should return a sorted list of tasks by start date', () => {
|
|
220
|
-
const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } = setupSortAndFilterTest();
|
|
221
|
-
sortSettings.sortList.push({
|
|
222
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.startDate,
|
|
223
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.descending
|
|
224
|
-
});
|
|
225
|
-
const startDate1 = new Date(2024, 0, 3);
|
|
226
|
-
const startDate2 = new Date(2024, 0, 2);
|
|
227
|
-
const startDate3 = new Date(2024, 0, 1);
|
|
228
|
-
tasksList[4].startDate = startDate1;
|
|
229
|
-
tasksList[1].startDate = startDate2;
|
|
230
|
-
tasksList[2].startDate = startDate3;
|
|
231
|
-
const { filteredAndSortedIds: result } = TaskService_1.default.getFilteredAndSortedTaskIds(taskMap, 'default', filterSettings, sortSettings, tagSettings);
|
|
232
|
-
expect(result.length).toBe(5);
|
|
233
|
-
expect(taskMap[result[0]].startDate?.getTime()).toBe(startDate1.getTime());
|
|
234
|
-
expect(taskMap[result[1]].startDate?.getTime()).toBe(startDate2.getTime());
|
|
235
|
-
expect(taskMap[result[2]].startDate?.getTime()).toBe(startDate3.getTime());
|
|
236
|
-
});
|
|
237
|
-
it('should return a sorted list of tasks by tags, when settings are provided', () => {
|
|
238
|
-
const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } = setupSortAndFilterTest();
|
|
239
|
-
sortSettings.sortList.push({
|
|
240
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.tags,
|
|
241
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.descending
|
|
242
|
-
});
|
|
243
|
-
tagSettings.tag1 = {
|
|
244
|
-
priority: 1
|
|
245
|
-
};
|
|
246
|
-
tagSettings.tag2 = {
|
|
247
|
-
priority: 2
|
|
248
|
-
};
|
|
249
|
-
tagSettings.tag3 = {
|
|
250
|
-
priority: 3
|
|
251
|
-
};
|
|
252
|
-
tasksList[4].tags = {
|
|
253
|
-
[sortSettings.userId]: ['tag1', 'tag2']
|
|
254
|
-
};
|
|
255
|
-
tasksList[1].tags = {
|
|
256
|
-
[sortSettings.userId]: ['tagWithoutPriority']
|
|
257
|
-
};
|
|
258
|
-
tasksList[2].tags = {
|
|
259
|
-
[sortSettings.userId]: ['tag1', 'tag3']
|
|
260
|
-
};
|
|
261
|
-
tasksList[3].tags = {
|
|
262
|
-
[sortSettings.userId]: ['tag1']
|
|
263
|
-
};
|
|
264
|
-
const { filteredAndSortedIds: result } = TaskService_1.default.getFilteredAndSortedTaskIds(taskMap, 'default', filterSettings, sortSettings, tagSettings);
|
|
265
|
-
expect(result.length).toBe(5);
|
|
266
|
-
expect(taskMap[result[0]].tags[sortSettings.userId]).toEqual([
|
|
267
|
-
'tag1',
|
|
268
|
-
'tag3'
|
|
269
|
-
]);
|
|
270
|
-
expect(taskMap[result[1]].tags[sortSettings.userId]).toEqual([
|
|
271
|
-
'tag1',
|
|
272
|
-
'tag2'
|
|
273
|
-
]);
|
|
274
|
-
expect(taskMap[result[2]].tags[sortSettings.userId]).toEqual(['tag1']);
|
|
275
|
-
});
|
|
276
|
-
it('should return a correct tag header map when sorting tags descending', () => {
|
|
277
|
-
const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } = setupSortAndFilterTest(10);
|
|
278
|
-
sortSettings.sortList.push({
|
|
279
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.tags,
|
|
280
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.descending
|
|
281
|
-
});
|
|
282
|
-
sortSettings.sortList.push({
|
|
283
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.title,
|
|
284
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.ascending
|
|
285
|
-
});
|
|
286
|
-
tagSettings.tag1 = {
|
|
287
|
-
priority: 1
|
|
288
|
-
};
|
|
289
|
-
tagSettings.tag2 = {
|
|
290
|
-
priority: 2
|
|
291
|
-
};
|
|
292
|
-
tagSettings.tag3 = {
|
|
293
|
-
priority: 3
|
|
294
|
-
};
|
|
295
|
-
const task1 = tasksList[4];
|
|
296
|
-
const task2 = tasksList[0];
|
|
297
|
-
const task3 = tasksList[1];
|
|
298
|
-
const task4 = tasksList[2];
|
|
299
|
-
const task5 = tasksList[3];
|
|
300
|
-
const task6 = tasksList[5];
|
|
301
|
-
task1.tags = {
|
|
302
|
-
[sortSettings.userId]: ['tag1', 'tag3']
|
|
303
|
-
};
|
|
304
|
-
task1.title = 'a';
|
|
305
|
-
task2.tags = {
|
|
306
|
-
[sortSettings.userId]: ['tag3']
|
|
307
|
-
};
|
|
308
|
-
task2.title = 'b';
|
|
309
|
-
task3.tags = {
|
|
310
|
-
[sortSettings.userId]: ['tag2', 'tag1']
|
|
311
|
-
};
|
|
312
|
-
task4.tags = {
|
|
313
|
-
[sortSettings.userId]: ['tag1']
|
|
314
|
-
};
|
|
315
|
-
task5.tags = {
|
|
316
|
-
[sortSettings.userId]: ['tagWithoutPriority']
|
|
317
|
-
};
|
|
318
|
-
task6.tags = {
|
|
319
|
-
[sortSettings.userId]: ['tagWithoutPriority']
|
|
320
|
-
};
|
|
321
|
-
const { filteredAndSortedIds: sortedTaskIds } = TaskService_1.default.getFilteredAndSortedTaskIds(taskMap, 'default', filterSettings, sortSettings, tagSettings);
|
|
322
|
-
expect(sortedTaskIds.length).toBe(10);
|
|
323
|
-
expect(sortedTaskIds[0]).toBe(task1._id.toString());
|
|
324
|
-
expect(sortedTaskIds[1]).toBe(task2._id.toString());
|
|
325
|
-
expect(sortedTaskIds[2]).toBe(task3._id.toString());
|
|
326
|
-
expect(sortedTaskIds[3]).toBe(task4._id.toString());
|
|
327
|
-
expect(sortedTaskIds[4]).toBe(task5._id.toString());
|
|
328
|
-
const result = TaskService_1.default.getTagHeaderMap(taskMap, sortedTaskIds, sortSettings.userId, tagSettings, 'No Priority', SortSettings_1.DashboardTaskSortDirection.descending);
|
|
329
|
-
expect(Object.keys(result).length).toBe(4);
|
|
330
|
-
expect(result[task1._id.toString()]).toBe('tag3');
|
|
331
|
-
expect(result[task3._id.toString()]).toBe('tag2');
|
|
332
|
-
expect(result[task4._id.toString()]).toBe('tag1');
|
|
333
|
-
expect(result[task5._id.toString()]).toBe('No Priority');
|
|
334
|
-
});
|
|
335
|
-
it('should return a correct tag header map when sorting tags ascending', () => {
|
|
336
|
-
const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } = setupSortAndFilterTest();
|
|
337
|
-
sortSettings.sortList.push({
|
|
338
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.tags,
|
|
339
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.ascending
|
|
340
|
-
});
|
|
341
|
-
tagSettings.tag1 = {
|
|
342
|
-
priority: 1
|
|
343
|
-
};
|
|
344
|
-
tagSettings.tag2 = {
|
|
345
|
-
priority: 2
|
|
346
|
-
};
|
|
347
|
-
tagSettings.tag3 = {
|
|
348
|
-
priority: 3
|
|
349
|
-
};
|
|
350
|
-
tagSettings.tag4 = {
|
|
351
|
-
priority: 4
|
|
352
|
-
};
|
|
353
|
-
const task1 = tasksList[4];
|
|
354
|
-
const task2 = tasksList[0];
|
|
355
|
-
const task3 = tasksList[1];
|
|
356
|
-
const task4 = tasksList[2];
|
|
357
|
-
const task5 = tasksList[3];
|
|
358
|
-
task1.tags = {
|
|
359
|
-
[sortSettings.userId]: ['tagWithoutPriority', 'tag3']
|
|
360
|
-
};
|
|
361
|
-
task2.tags = {
|
|
362
|
-
[sortSettings.userId]: ['tag3', 'tag4', 'tag1']
|
|
363
|
-
};
|
|
364
|
-
task3.tags = {
|
|
365
|
-
[sortSettings.userId]: ['tag2']
|
|
366
|
-
};
|
|
367
|
-
task4.tags = {
|
|
368
|
-
[sortSettings.userId]: ['tag3', 'tag4']
|
|
369
|
-
};
|
|
370
|
-
task5.tags = {
|
|
371
|
-
[sortSettings.userId]: ['tag4']
|
|
372
|
-
};
|
|
373
|
-
const { filteredAndSortedIds: sortedTaskIds } = TaskService_1.default.getFilteredAndSortedTaskIds(taskMap, 'default', filterSettings, sortSettings, tagSettings);
|
|
374
|
-
expect(sortedTaskIds.length).toBe(5);
|
|
375
|
-
expect(sortedTaskIds[0]).toBe(task1._id.toString());
|
|
376
|
-
expect(sortedTaskIds[1]).toBe(task2._id.toString());
|
|
377
|
-
expect(sortedTaskIds[2]).toBe(task3._id.toString());
|
|
378
|
-
expect(sortedTaskIds[3]).toBe(task4._id.toString());
|
|
379
|
-
expect(sortedTaskIds[4]).toBe(task5._id.toString());
|
|
380
|
-
const result = TaskService_1.default.getTagHeaderMap(taskMap, sortedTaskIds, sortSettings.userId, tagSettings, 'No Priority', SortSettings_1.DashboardTaskSortDirection.ascending);
|
|
381
|
-
expect(Object.keys(result).length).toBe(5);
|
|
382
|
-
expect(result[task1._id.toString()]).toBe('No Priority');
|
|
383
|
-
expect(result[task2._id.toString()]).toBe('tag1');
|
|
384
|
-
expect(result[task3._id.toString()]).toBe('tag2');
|
|
385
|
-
expect(result[task4._id.toString()]).toBe('tag3');
|
|
386
|
-
expect(result[task5._id.toString()]).toBe('tag4');
|
|
387
|
-
});
|
|
388
|
-
it('should return a sorted list of tasks by tags, start date, and title', () => {
|
|
389
|
-
const { tasksList, taskMap, filterSettings, sortSettings, tagSettings } = setupSortAndFilterTest(10);
|
|
390
|
-
sortSettings.sortList.push({
|
|
391
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.tags,
|
|
392
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.descending
|
|
393
|
-
}, {
|
|
394
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.startDate,
|
|
395
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.ascending
|
|
396
|
-
}, {
|
|
397
|
-
sortBy: SortSettings_1.DashboardTaskSortBy.title,
|
|
398
|
-
sortDirection: SortSettings_1.DashboardTaskSortDirection.ascending
|
|
399
|
-
});
|
|
400
|
-
tagSettings.tag1 = {
|
|
401
|
-
priority: 1
|
|
402
|
-
};
|
|
403
|
-
tagSettings.tag2 = {
|
|
404
|
-
priority: 2
|
|
405
|
-
};
|
|
406
|
-
// Each task below should end up being sorted in that order.
|
|
407
|
-
const task1 = tasksList[4];
|
|
408
|
-
const task2 = tasksList[7];
|
|
409
|
-
const task3 = tasksList[1];
|
|
410
|
-
const task4 = tasksList[2];
|
|
411
|
-
const task5 = tasksList[3];
|
|
412
|
-
const task6 = tasksList[5];
|
|
413
|
-
task1.tags = {
|
|
414
|
-
[sortSettings.userId]: ['tag1', 'tag2']
|
|
415
|
-
};
|
|
416
|
-
task2.tags = {
|
|
417
|
-
[sortSettings.userId]: ['tag1', 'tag2']
|
|
418
|
-
};
|
|
419
|
-
task3.tags = {
|
|
420
|
-
[sortSettings.userId]: ['tag1']
|
|
421
|
-
};
|
|
422
|
-
task4.tags = {
|
|
423
|
-
[sortSettings.userId]: ['tag1']
|
|
424
|
-
};
|
|
425
|
-
task5.tags = {
|
|
426
|
-
[sortSettings.userId]: ['tag1']
|
|
427
|
-
};
|
|
428
|
-
task6.tags = {
|
|
429
|
-
[sortSettings.userId]: ['tag1']
|
|
430
|
-
};
|
|
431
|
-
task1.startDate = new Date(2024, 0, 1);
|
|
432
|
-
task2.startDate = new Date(2024, 0, 2);
|
|
433
|
-
task3.startDate = new Date(2023, 0, 1);
|
|
434
|
-
task4.startDate = new Date(2023, 0, 2);
|
|
435
|
-
task5.startDate = new Date(2023, 0, 2);
|
|
436
|
-
task6.startDate = new Date(2023, 0, 2);
|
|
437
|
-
// The title shouldn't matter for the first two tasks, because the start
|
|
438
|
-
// date should take precedence.
|
|
439
|
-
task1.title = 'b';
|
|
440
|
-
task2.title = 'a';
|
|
441
|
-
task3.title = 'c';
|
|
442
|
-
// Title only matters for the last 3 tasks
|
|
443
|
-
task4.title = 'a';
|
|
444
|
-
task5.title = 'b';
|
|
445
|
-
task6.title = 'c';
|
|
446
|
-
const { filteredAndSortedIds: result } = TaskService_1.default.getFilteredAndSortedTaskIds(taskMap, 'default', filterSettings, sortSettings, tagSettings);
|
|
447
|
-
expect(result.length).toBe(10);
|
|
448
|
-
expect(result[0]).toBe(task1._id.toString());
|
|
449
|
-
expect(result[1]).toBe(task2._id.toString());
|
|
450
|
-
expect(result[2]).toBe(task3._id.toString());
|
|
451
|
-
expect(result[3]).toBe(task4._id.toString());
|
|
452
|
-
expect(result[4]).toBe(task5._id.toString());
|
|
453
|
-
expect(result[5]).toBe(task6._id.toString());
|
|
454
|
-
});
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
function setupSortAndFilterTest(numTasks = 5) {
|
|
458
|
-
const userId = new bson_1.ObjectId();
|
|
459
|
-
const tasksList = createTasksList(numTasks, userId);
|
|
460
|
-
const taskMap = createTaskMapFromList(tasksList);
|
|
461
|
-
const filterSettings = getFilterSettings(userId);
|
|
462
|
-
const sortSettings = getSortSettings(userId);
|
|
463
|
-
const tagSettings = {};
|
|
464
|
-
const taskIds = Object.keys(taskMap);
|
|
465
|
-
return {
|
|
466
|
-
tasksList,
|
|
467
|
-
taskMap,
|
|
468
|
-
taskIds,
|
|
469
|
-
filterSettings,
|
|
470
|
-
sortSettings,
|
|
471
|
-
tagSettings
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
function createTasksList(numTasks, userId) {
|
|
475
|
-
const tasks = [];
|
|
476
|
-
for (let i = 0; i < numTasks; i += 1) {
|
|
477
|
-
const task = new Task_1.default(userId);
|
|
478
|
-
tasks.push(task);
|
|
479
|
-
}
|
|
480
|
-
return tasks;
|
|
481
|
-
}
|
|
482
|
-
function createTaskMapFromList(tasks) {
|
|
483
|
-
return tasks.reduce((acc, task) => {
|
|
484
|
-
acc[task._id.toString()] = task;
|
|
485
|
-
return acc;
|
|
486
|
-
}, {});
|
|
487
|
-
}
|
|
488
|
-
function getFilterSettings(userId) {
|
|
489
|
-
return {
|
|
490
|
-
userId: userId.toString(),
|
|
491
|
-
completed: {
|
|
492
|
-
show: true
|
|
493
|
-
},
|
|
494
|
-
grandChildrenTasks: {
|
|
495
|
-
show: false
|
|
496
|
-
},
|
|
497
|
-
startDate: {
|
|
498
|
-
showFutureTasks: true
|
|
499
|
-
},
|
|
500
|
-
tags: {}
|
|
501
|
-
};
|
|
502
|
-
}
|
|
503
|
-
function getSortSettings(userId) {
|
|
504
|
-
return {
|
|
505
|
-
userId: userId.toString(),
|
|
506
|
-
sortList: []
|
|
507
|
-
};
|
|
508
|
-
}
|