@followupus/common 0.8.4 → 0.8.6
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/README.md +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/shared/delta.d.ts +8 -0
- package/dist/shared/delta.js +8 -0
- package/dist/shared/shared.d.ts +2 -1
- package/dist/shared/shared.js +117 -67
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
1
|
+
export * from "./shared/index.js";
|
|
2
|
+
export * from "./utils/index.js";
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
1
|
+
export * from "./shared/index.js";
|
|
2
|
+
export * from "./utils/index.js";
|
package/dist/shared/delta.d.ts
CHANGED
|
@@ -5,6 +5,14 @@ export declare const DELTA_SCHEMA_NAME: {
|
|
|
5
5
|
GROUPS: string;
|
|
6
6
|
ITEMS: string;
|
|
7
7
|
FOLDERS: string;
|
|
8
|
+
BOARD_HEADERS: string;
|
|
9
|
+
BOARD_VIEWS: string;
|
|
10
|
+
ITEM_NOTES: string;
|
|
11
|
+
FORMS: string;
|
|
12
|
+
WORKSPACES: string;
|
|
13
|
+
LINKED_COLUMNS: string;
|
|
14
|
+
LINKED_ITEMS: string;
|
|
15
|
+
DROPDOWNS: string;
|
|
8
16
|
};
|
|
9
17
|
export declare const DELTA_ACTION: {
|
|
10
18
|
DELETE: string;
|
package/dist/shared/delta.js
CHANGED
|
@@ -5,6 +5,14 @@ export const DELTA_SCHEMA_NAME = {
|
|
|
5
5
|
GROUPS: "GROUPS",
|
|
6
6
|
ITEMS: "ITEMS",
|
|
7
7
|
FOLDERS: "FOLDERS",
|
|
8
|
+
BOARD_HEADERS: "BOARD_HEADERS",
|
|
9
|
+
BOARD_VIEWS: "BOARD_VIEWS",
|
|
10
|
+
ITEM_NOTES: "ITEM_NOTES",
|
|
11
|
+
FORMS: "FORMS",
|
|
12
|
+
WORKSPACES: "WORKSPACES",
|
|
13
|
+
LINKED_COLUMNS: "LINKED_COLUMNS",
|
|
14
|
+
LINKED_ITEMS: "LINKED_ITEMS",
|
|
15
|
+
DROPDOWNS: "DROPDOWNS",
|
|
8
16
|
};
|
|
9
17
|
export const DELTA_ACTION = {
|
|
10
18
|
DELETE: "D",
|
package/dist/shared/shared.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { IBaseCustomColumn, IBaseGroup, IFilter, IFilterCondition, IPureBoard } from
|
|
1
|
+
import { IBaseCustomColumn, IBaseGroup, IFilter, IFilterCondition, IPureBoard } from "./types";
|
|
2
2
|
export declare const COLUMN_TYPES: {
|
|
3
3
|
NUMBER: string;
|
|
4
4
|
TEXT: string;
|
|
@@ -52,6 +52,7 @@ export declare const DATE_GROUPS: {
|
|
|
52
52
|
THIS_MONTH: string;
|
|
53
53
|
FUTURE: string;
|
|
54
54
|
};
|
|
55
|
+
export declare const isLinkedColumns: (columnType?: string) => boolean;
|
|
55
56
|
export declare const getColumnValueType: (columnType: string) => "string" | "number" | "object" | "stringArray" | "objectArray";
|
|
56
57
|
export declare const getDateGroupKey: (dateStr: string) => string | null;
|
|
57
58
|
export declare const getValidConditions: (filter: IFilter, headers?: IBaseCustomColumn[], currentUserId?: string) => IFilterCondition[];
|
package/dist/shared/shared.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import dayjs from "dayjs";
|
|
2
|
-
import _ from
|
|
2
|
+
import _ from "lodash";
|
|
3
3
|
export const COLUMN_TYPES = {
|
|
4
4
|
NUMBER: "number",
|
|
5
5
|
TEXT: "string",
|
|
@@ -75,6 +75,12 @@ export const COLUMN_OP_TYPES = {
|
|
|
75
75
|
OP_TYPES.EMPTY,
|
|
76
76
|
OP_TYPES.NOT_EMPTY,
|
|
77
77
|
],
|
|
78
|
+
[COLUMN_TYPES.TAGS]: [
|
|
79
|
+
OP_TYPES.IS,
|
|
80
|
+
OP_TYPES.IS_NOT,
|
|
81
|
+
OP_TYPES.EMPTY,
|
|
82
|
+
OP_TYPES.NOT_EMPTY,
|
|
83
|
+
],
|
|
78
84
|
[COLUMN_TYPES.PEOPLE]: [
|
|
79
85
|
OP_TYPES.IS,
|
|
80
86
|
OP_TYPES.IS_NOT,
|
|
@@ -110,6 +116,11 @@ export const DATE_GROUPS = {
|
|
|
110
116
|
THIS_MONTH: "thisMonth",
|
|
111
117
|
FUTURE: "future",
|
|
112
118
|
};
|
|
119
|
+
export const isLinkedColumns = (columnType) => {
|
|
120
|
+
if (!columnType)
|
|
121
|
+
return false;
|
|
122
|
+
return [COLUMN_TYPES.LINKED_COLUMN, COLUMN_TYPES.REF_LINED_COLUMN].includes(columnType);
|
|
123
|
+
};
|
|
113
124
|
export const getColumnValueType = (columnType) => {
|
|
114
125
|
switch (columnType) {
|
|
115
126
|
case COLUMN_TYPES.PEOPLE:
|
|
@@ -117,6 +128,7 @@ export const getColumnValueType = (columnType) => {
|
|
|
117
128
|
case COLUMN_TYPES.TAGS:
|
|
118
129
|
return "stringArray";
|
|
119
130
|
case COLUMN_TYPES.TIMELINE:
|
|
131
|
+
case COLUMN_TYPES.TIME_TRACKING:
|
|
120
132
|
return "object";
|
|
121
133
|
case COLUMN_TYPES.NUMBER:
|
|
122
134
|
case COLUMN_TYPES.HOURS:
|
|
@@ -169,7 +181,13 @@ export const getValidConditions = (filter, headers, currentUserId) => {
|
|
|
169
181
|
}
|
|
170
182
|
newFilter.criteria.forEach(c => {
|
|
171
183
|
const validHeader = headers.find(h => h.columnId === c.columnId);
|
|
172
|
-
|
|
184
|
+
let checkHeader = validHeader;
|
|
185
|
+
if (isLinkedColumns(validHeader?.type)) {
|
|
186
|
+
checkHeader = validHeader?.linked;
|
|
187
|
+
}
|
|
188
|
+
if (!checkHeader)
|
|
189
|
+
return;
|
|
190
|
+
if (checkHeader?.type === COLUMN_TYPES.PEOPLE) {
|
|
173
191
|
if (c.value?.find(val => val === THEMSELVES) && currentUserId) {
|
|
174
192
|
const idx = c.value.findIndex(val => val === THEMSELVES);
|
|
175
193
|
if (idx > -1)
|
|
@@ -182,21 +200,28 @@ export const getValidConditions = (filter, headers, currentUserId) => {
|
|
|
182
200
|
const validHeader = headers.find(h => h.columnId === c.columnId);
|
|
183
201
|
if (!validHeader)
|
|
184
202
|
return false;
|
|
185
|
-
|
|
203
|
+
let checkHeader = validHeader;
|
|
204
|
+
if (isLinkedColumns(validHeader.type)) {
|
|
205
|
+
checkHeader = validHeader.linked;
|
|
206
|
+
}
|
|
207
|
+
if (!checkHeader)
|
|
208
|
+
return false;
|
|
209
|
+
const validOperate = COLUMN_OP_TYPES[checkHeader.type]?.includes(c.op);
|
|
186
210
|
if (!validOperate)
|
|
187
211
|
return false;
|
|
188
212
|
const isDropdown = [
|
|
189
213
|
COLUMN_TYPES.DROPDOWN,
|
|
190
214
|
COLUMN_TYPES.STATUS,
|
|
191
215
|
COLUMN_TYPES.PRIORITY,
|
|
192
|
-
|
|
216
|
+
COLUMN_TYPES.TAGS,
|
|
217
|
+
].includes(checkHeader.type);
|
|
193
218
|
switch (c.op) {
|
|
194
219
|
case OP_TYPES.IS:
|
|
195
220
|
case OP_TYPES.IS_NOT:
|
|
196
221
|
return (c.blank ||
|
|
197
222
|
(!!c.value?.filter(v => !!v || v === 0)?.length &&
|
|
198
223
|
(!isDropdown ||
|
|
199
|
-
c.value.some(v =>
|
|
224
|
+
c.value.some(v => checkHeader.dropdowns?.find(d => d.key === v)))));
|
|
200
225
|
case OP_TYPES.EMPTY:
|
|
201
226
|
case OP_TYPES.NOT_EMPTY:
|
|
202
227
|
return true;
|
|
@@ -264,16 +289,19 @@ const isContains = (itemVal, valueType, condition) => {
|
|
|
264
289
|
const checkVal = condition.value?.length
|
|
265
290
|
? condition.value[0]
|
|
266
291
|
: "";
|
|
292
|
+
const ignoreCaseCheck = (val, contains) => {
|
|
293
|
+
return !!val?.toLowerCase()?.includes(contains?.toLowerCase());
|
|
294
|
+
};
|
|
267
295
|
switch (valueType) {
|
|
268
296
|
case "number":
|
|
269
297
|
return itemVal || itemVal === 0
|
|
270
|
-
? itemVal
|
|
298
|
+
? itemVal?.toString()?.includes(checkVal)
|
|
271
299
|
: false;
|
|
272
300
|
case "string":
|
|
273
|
-
return !!itemVal && itemVal
|
|
301
|
+
return !!itemVal && ignoreCaseCheck(itemVal, checkVal);
|
|
274
302
|
case "stringArray":
|
|
275
303
|
return itemVal?.length
|
|
276
|
-
? itemVal.some(val => val
|
|
304
|
+
? itemVal.some(val => ignoreCaseCheck(val, checkVal))
|
|
277
305
|
: false;
|
|
278
306
|
default:
|
|
279
307
|
break;
|
|
@@ -345,70 +373,92 @@ export const filterItemsByConditions = (groups, filter, headers, currentUserId)
|
|
|
345
373
|
}
|
|
346
374
|
groups.forEach(g => {
|
|
347
375
|
g.items = g.items?.filter(item => {
|
|
348
|
-
let
|
|
376
|
+
let isItemMatched = false;
|
|
349
377
|
for (const condition of validConditions) {
|
|
350
378
|
const header = headers?.find(h => h.columnId === condition.columnId);
|
|
351
|
-
const
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
379
|
+
const isLinkedColumn = isLinkedColumns(header?.type);
|
|
380
|
+
let checkHeader = header;
|
|
381
|
+
if (isLinkedColumn) {
|
|
382
|
+
checkHeader = header?.linked;
|
|
383
|
+
}
|
|
384
|
+
const valueType = getColumnValueType(checkHeader?.type ?? "");
|
|
385
|
+
const checkConditionFn = (itemVal) => {
|
|
386
|
+
let match = false;
|
|
387
|
+
const isDate = checkHeader?.type === COLUMN_TYPES.DATE;
|
|
388
|
+
switch (condition.op) {
|
|
389
|
+
case OP_TYPES.IS:
|
|
390
|
+
match = isDate
|
|
391
|
+
? isDateInConditionValues(itemVal, condition)
|
|
392
|
+
: isInConditionValues(itemVal, valueType, condition);
|
|
393
|
+
break;
|
|
394
|
+
case OP_TYPES.IS_NOT:
|
|
395
|
+
match = isDate
|
|
396
|
+
? !isDateInConditionValues(itemVal, condition)
|
|
397
|
+
: !isInConditionValues(itemVal, valueType, condition);
|
|
398
|
+
break;
|
|
399
|
+
case OP_TYPES.EMPTY:
|
|
400
|
+
match = isEmpty(itemVal, valueType);
|
|
401
|
+
break;
|
|
402
|
+
case OP_TYPES.NOT_EMPTY:
|
|
403
|
+
match = !isEmpty(itemVal, valueType);
|
|
404
|
+
break;
|
|
405
|
+
case OP_TYPES.CONTAINS:
|
|
406
|
+
match = isContains(itemVal, valueType, condition);
|
|
407
|
+
break;
|
|
408
|
+
case OP_TYPES.NOT_CONTAINS:
|
|
409
|
+
match = !isContains(itemVal, valueType, condition);
|
|
410
|
+
break;
|
|
411
|
+
case OP_TYPES.EQUAL:
|
|
412
|
+
match = isEquals(itemVal, valueType, condition);
|
|
413
|
+
break;
|
|
414
|
+
case OP_TYPES.NOT_EQUAL:
|
|
415
|
+
match = !isEquals(itemVal, valueType, condition);
|
|
416
|
+
break;
|
|
417
|
+
case OP_TYPES.GREATER:
|
|
418
|
+
match =
|
|
419
|
+
typeof itemVal === "number"
|
|
420
|
+
? isGreater(itemVal, condition)
|
|
421
|
+
: false;
|
|
422
|
+
break;
|
|
423
|
+
case OP_TYPES.GREATER_EQUAL:
|
|
424
|
+
match =
|
|
425
|
+
typeof itemVal === "number"
|
|
426
|
+
? isGreaterEqual(itemVal, condition)
|
|
427
|
+
: false;
|
|
428
|
+
break;
|
|
429
|
+
case OP_TYPES.LESS_EQUAL:
|
|
430
|
+
match =
|
|
431
|
+
typeof itemVal === "number"
|
|
432
|
+
? isLessEqual(itemVal, condition)
|
|
433
|
+
: false;
|
|
434
|
+
break;
|
|
435
|
+
case OP_TYPES.LESS:
|
|
436
|
+
match =
|
|
437
|
+
typeof itemVal === "number"
|
|
438
|
+
? isLess(itemVal, condition)
|
|
439
|
+
: false;
|
|
440
|
+
break;
|
|
441
|
+
default:
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
return match;
|
|
445
|
+
};
|
|
446
|
+
const itemValue = isLinkedColumn
|
|
447
|
+
? item.data?.[condition.columnId]
|
|
448
|
+
: item.data?.[condition.columnId]?.value;
|
|
449
|
+
if (isLinkedColumn) {
|
|
450
|
+
isItemMatched = !!itemValue?.some((item) => {
|
|
451
|
+
const val = item.value;
|
|
452
|
+
return checkConditionFn(val);
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
isItemMatched = checkConditionFn(itemValue);
|
|
407
457
|
}
|
|
408
|
-
if (!
|
|
458
|
+
if (!isItemMatched)
|
|
409
459
|
return false;
|
|
410
460
|
}
|
|
411
|
-
return
|
|
461
|
+
return isItemMatched;
|
|
412
462
|
});
|
|
413
463
|
});
|
|
414
464
|
return groups;
|