@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.
Files changed (130) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -5
  3. package/lib/documents/BaseDocument.d.ts +1 -1
  4. package/lib/documents/BaseDocument.d.ts.map +1 -1
  5. package/lib/documents/BaseDocument.js +4 -6
  6. package/lib/documents/BaseDocument.js.map +1 -0
  7. package/lib/documents/BaseDocument.ts +9 -0
  8. package/lib/documents/BaseDocumentWithType.d.ts +1 -1
  9. package/lib/documents/BaseDocumentWithType.d.ts.map +1 -1
  10. package/lib/documents/BaseDocumentWithType.js +3 -8
  11. package/lib/documents/BaseDocumentWithType.js.map +1 -0
  12. package/lib/documents/BaseDocumentWithType.ts +5 -0
  13. package/lib/documents/common/ApiKey.d.ts +5 -4
  14. package/lib/documents/common/ApiKey.d.ts.map +1 -1
  15. package/lib/documents/common/ApiKey.js +10 -17
  16. package/lib/documents/common/ApiKey.js.map +1 -0
  17. package/lib/documents/common/ApiKey.ts +40 -0
  18. package/lib/documents/common/User.d.ts +2 -2
  19. package/lib/documents/common/User.d.ts.map +1 -1
  20. package/lib/documents/common/User.js +8 -15
  21. package/lib/documents/common/User.js.map +1 -0
  22. package/lib/documents/common/User.ts +63 -0
  23. package/lib/documents/dashboard/NonogramKatanaItem.d.ts +4 -4
  24. package/lib/documents/dashboard/NonogramKatanaItem.d.ts.map +1 -1
  25. package/lib/documents/dashboard/NonogramKatanaItem.js +4 -11
  26. package/lib/documents/dashboard/NonogramKatanaItem.js.map +1 -0
  27. package/lib/documents/dashboard/NonogramKatanaItem.ts +53 -0
  28. package/lib/documents/dashboard/NonogramKatanaUpgrade.d.ts +5 -5
  29. package/lib/documents/dashboard/NonogramKatanaUpgrade.d.ts.map +1 -1
  30. package/lib/documents/dashboard/NonogramKatanaUpgrade.js +4 -11
  31. package/lib/documents/dashboard/NonogramKatanaUpgrade.js.map +1 -0
  32. package/lib/documents/dashboard/NonogramKatanaUpgrade.ts +50 -0
  33. package/lib/documents/dashboard/Task.d.ts +7 -7
  34. package/lib/documents/dashboard/Task.d.ts.map +1 -1
  35. package/lib/documents/dashboard/Task.js +10 -17
  36. package/lib/documents/dashboard/Task.js.map +1 -0
  37. package/lib/documents/dashboard/Task.ts +173 -0
  38. package/lib/documents/dashboard/UserConfig.d.ts +6 -6
  39. package/lib/documents/dashboard/UserConfig.d.ts.map +1 -1
  40. package/lib/documents/dashboard/UserConfig.js +12 -19
  41. package/lib/documents/dashboard/UserConfig.js.map +1 -0
  42. package/lib/documents/dashboard/UserConfig.ts +110 -0
  43. package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.d.ts.map +1 -1
  44. package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.js +2 -3
  45. package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.js.map +1 -0
  46. package/lib/embedded-types/dashboard/nonogramKatanaItem/ItemName.ts +97 -0
  47. package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.d.ts.map +1 -1
  48. package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.js +2 -3
  49. package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.js.map +1 -0
  50. package/lib/embedded-types/dashboard/nonogramKatanaUpgrade/UpgradeName.ts +263 -0
  51. package/lib/embedded-types/dashboard/task/FilterSettings.d.ts +2 -2
  52. package/lib/embedded-types/dashboard/task/FilterSettings.d.ts.map +1 -1
  53. package/lib/embedded-types/dashboard/task/FilterSettings.js +3 -6
  54. package/lib/embedded-types/dashboard/task/FilterSettings.js.map +1 -0
  55. package/lib/embedded-types/dashboard/task/FilterSettings.ts +100 -0
  56. package/lib/embedded-types/dashboard/task/RecurrenceInfo.d.ts +1 -1
  57. package/lib/embedded-types/dashboard/task/RecurrenceInfo.d.ts.map +1 -1
  58. package/lib/embedded-types/dashboard/task/RecurrenceInfo.js +8 -11
  59. package/lib/embedded-types/dashboard/task/RecurrenceInfo.js.map +1 -0
  60. package/lib/embedded-types/dashboard/task/RecurrenceInfo.ts +100 -0
  61. package/lib/embedded-types/dashboard/task/SortSettings.d.ts +2 -2
  62. package/lib/embedded-types/dashboard/task/SortSettings.d.ts.map +1 -1
  63. package/lib/embedded-types/dashboard/task/SortSettings.js +7 -11
  64. package/lib/embedded-types/dashboard/task/SortSettings.js.map +1 -0
  65. package/lib/embedded-types/dashboard/task/SortSettings.ts +89 -0
  66. package/lib/embedded-types/dashboard/userConfig/Tags.d.ts.map +1 -1
  67. package/lib/embedded-types/dashboard/userConfig/Tags.js +2 -2
  68. package/lib/embedded-types/dashboard/userConfig/Tags.js.map +1 -0
  69. package/lib/embedded-types/dashboard/userConfig/Tags.ts +9 -0
  70. package/lib/index.d.ts +20 -20
  71. package/lib/index.d.ts.map +1 -1
  72. package/lib/index.js +19 -71
  73. package/lib/index.js.map +1 -0
  74. package/lib/index.ts +103 -0
  75. package/lib/schemas/required-refs/RequiredUserId.d.ts +1 -1
  76. package/lib/schemas/required-refs/RequiredUserId.d.ts.map +1 -1
  77. package/lib/schemas/required-refs/RequiredUserId.js +3 -8
  78. package/lib/schemas/required-refs/RequiredUserId.js.map +1 -0
  79. package/lib/schemas/required-refs/RequiredUserId.ts +9 -0
  80. package/lib/schemas/type-guards/commonTypeGuards.d.ts.map +1 -1
  81. package/lib/schemas/type-guards/commonTypeGuards.js +6 -12
  82. package/lib/schemas/type-guards/commonTypeGuards.js.map +1 -0
  83. package/lib/schemas/type-guards/commonTypeGuards.ts +29 -0
  84. package/lib/schemas/validators/DocumentValidator.d.ts +1 -1
  85. package/lib/schemas/validators/DocumentValidator.d.ts.map +1 -1
  86. package/lib/schemas/validators/DocumentValidator.js +2 -2
  87. package/lib/schemas/validators/DocumentValidator.js.map +1 -0
  88. package/lib/schemas/validators/DocumentValidator.ts +5 -0
  89. package/lib/schemas/validators/ValidateUtil.d.ts.map +1 -1
  90. package/lib/schemas/validators/ValidateUtil.js +8 -10
  91. package/lib/schemas/validators/ValidateUtil.js.map +1 -0
  92. package/lib/schemas/validators/ValidateUtil.spec.ts +75 -0
  93. package/lib/schemas/validators/ValidateUtil.ts +193 -0
  94. package/lib/services/DocumentService.d.ts +1 -1
  95. package/lib/services/DocumentService.d.ts.map +1 -1
  96. package/lib/services/DocumentService.js +4 -6
  97. package/lib/services/DocumentService.js.map +1 -0
  98. package/lib/services/DocumentService.spec.ts +28 -0
  99. package/lib/services/DocumentService.ts +18 -0
  100. package/lib/services/dashboard/Task/TaskFilterService.d.ts +2 -2
  101. package/lib/services/dashboard/Task/TaskFilterService.d.ts.map +1 -1
  102. package/lib/services/dashboard/Task/TaskFilterService.js +2 -4
  103. package/lib/services/dashboard/Task/TaskFilterService.js.map +1 -0
  104. package/lib/services/dashboard/Task/TaskFilterService.ts +105 -0
  105. package/lib/services/dashboard/Task/TaskRecurrenceService.d.ts +2 -2
  106. package/lib/services/dashboard/Task/TaskRecurrenceService.d.ts.map +1 -1
  107. package/lib/services/dashboard/Task/TaskRecurrenceService.js +21 -23
  108. package/lib/services/dashboard/Task/TaskRecurrenceService.js.map +1 -0
  109. package/lib/services/dashboard/Task/TaskRecurrenceService.ts +172 -0
  110. package/lib/services/dashboard/Task/TaskService.d.ts +5 -5
  111. package/lib/services/dashboard/Task/TaskService.d.ts.map +1 -1
  112. package/lib/services/dashboard/Task/TaskService.js +13 -18
  113. package/lib/services/dashboard/Task/TaskService.js.map +1 -0
  114. package/lib/services/dashboard/Task/TaskService.spec.ts +653 -0
  115. package/lib/services/dashboard/Task/TaskService.ts +189 -0
  116. package/lib/services/dashboard/Task/TaskSortService.d.ts +3 -3
  117. package/lib/services/dashboard/Task/TaskSortService.d.ts.map +1 -1
  118. package/lib/services/dashboard/Task/TaskSortService.js +6 -8
  119. package/lib/services/dashboard/Task/TaskSortService.js.map +1 -0
  120. package/lib/services/dashboard/Task/TaskSortService.ts +229 -0
  121. package/package.json +36 -29
  122. package/lib/schemas/validators/ValidateUtil.spec.d.ts +0 -2
  123. package/lib/schemas/validators/ValidateUtil.spec.d.ts.map +0 -1
  124. package/lib/schemas/validators/ValidateUtil.spec.js +0 -64
  125. package/lib/services/DocumentService.spec.d.ts +0 -2
  126. package/lib/services/DocumentService.spec.d.ts.map +0 -1
  127. package/lib/services/DocumentService.spec.js +0 -30
  128. package/lib/services/dashboard/Task/TaskService.spec.d.ts +0 -2
  129. package/lib/services/dashboard/Task/TaskService.spec.d.ts.map +0 -1
  130. 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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=TaskService.spec.d.ts.map
@@ -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
- }