@ai-table/state 0.0.11 → 0.0.13
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/action/field.d.ts +14 -0
- package/action/field.d.ts.map +1 -0
- package/action/general.d.ts +5 -0
- package/action/general.d.ts.map +1 -0
- package/action/index.d.ts +17 -0
- package/action/index.d.ts.map +1 -0
- package/action/position.d.ts +9 -0
- package/action/position.d.ts.map +1 -0
- package/action/record.d.ts +13 -0
- package/action/record.d.ts.map +1 -0
- package/{view/action → action}/view.d.ts +1 -1
- package/action/view.d.ts.map +1 -0
- package/constants/field-menu-item.d.ts +22 -0
- package/constants/field-menu-item.d.ts.map +1 -0
- package/constants/index.d.ts +3 -0
- package/constants/index.d.ts.map +1 -0
- package/constants/view.d.ts +3 -0
- package/constants/view.d.ts.map +1 -0
- package/esm2022/action/field.mjs +57 -0
- package/esm2022/action/general.mjs +179 -0
- package/esm2022/action/index.mjs +13 -0
- package/esm2022/action/position.mjs +21 -0
- package/esm2022/action/record.mjs +44 -0
- package/esm2022/action/view.mjs +47 -0
- package/esm2022/constants/field-menu-item.mjs +39 -0
- package/esm2022/constants/index.mjs +3 -0
- package/esm2022/constants/view.mjs +3 -0
- package/esm2022/plugins/state.plugin.mjs +20 -0
- package/esm2022/public-api.mjs +4 -4
- package/esm2022/shared/to-table/array-event.mjs +9 -9
- package/esm2022/shared/to-table/index.mjs +2 -2
- package/esm2022/shared/to-table/map-event.mjs +3 -4
- package/esm2022/shared/to-yjs/add-node.mjs +5 -5
- package/esm2022/shared/to-yjs/index.mjs +1 -1
- package/esm2022/shared/to-yjs/remove-node.mjs +4 -5
- package/esm2022/shared/to-yjs/set-node.mjs +3 -4
- package/esm2022/shared/to-yjs/update-field-value.mjs +1 -1
- package/esm2022/shared/utils/init-shared.mjs +1 -1
- package/esm2022/types/action.mjs +23 -0
- package/esm2022/types/ai-table.mjs +2 -0
- package/esm2022/types/index.mjs +4 -1
- package/esm2022/types/view.mjs +1 -12
- package/esm2022/utils/build.mjs +9 -14
- package/esm2022/utils/common.mjs +21 -1
- package/esm2022/utils/field/add-fields.mjs +19 -0
- package/esm2022/utils/field/model/date.mjs +74 -0
- package/esm2022/utils/field/model/field.mjs +63 -0
- package/esm2022/utils/field/model/index.mjs +22 -0
- package/esm2022/utils/field/model/number.mjs +46 -0
- package/esm2022/utils/field/model/rate.mjs +38 -0
- package/esm2022/utils/field/model/select.mjs +55 -0
- package/esm2022/utils/field/model/text.mjs +27 -0
- package/esm2022/utils/field/sort-fields.mjs +5 -0
- package/esm2022/utils/index.mjs +9 -3
- package/esm2022/utils/record/add-records.mjs +48 -0
- package/esm2022/utils/record/filter.mjs +65 -0
- package/esm2022/utils/record/sort.mjs +34 -0
- package/esm2022/utils/record/update-field-value.mjs +5 -0
- package/esm2022/utils/view.mjs +6 -4
- package/esm2022/utils/weak-map.mjs +2 -0
- package/fesm2022/ai-table-state.mjs +813 -396
- package/fesm2022/ai-table-state.mjs.map +1 -1
- package/package.json +1 -1
- package/plugins/state.plugin.d.ts +3 -0
- package/plugins/state.plugin.d.ts.map +1 -0
- package/public-api.d.ts +3 -3
- package/public-api.d.ts.map +1 -1
- package/shared/to-table/array-event.d.ts +2 -3
- package/shared/to-table/array-event.d.ts.map +1 -1
- package/shared/to-table/index.d.ts +2 -2
- package/shared/to-table/index.d.ts.map +1 -1
- package/shared/to-table/map-event.d.ts +2 -2
- package/shared/to-table/map-event.d.ts.map +1 -1
- package/shared/to-yjs/add-node.d.ts +1 -2
- package/shared/to-yjs/add-node.d.ts.map +1 -1
- package/shared/to-yjs/index.d.ts +2 -2
- package/shared/to-yjs/index.d.ts.map +1 -1
- package/shared/to-yjs/remove-node.d.ts +1 -2
- package/shared/to-yjs/remove-node.d.ts.map +1 -1
- package/shared/to-yjs/set-node.d.ts +1 -2
- package/shared/to-yjs/set-node.d.ts.map +1 -1
- package/shared/to-yjs/update-field-value.d.ts +1 -2
- package/shared/to-yjs/update-field-value.d.ts.map +1 -1
- package/shared/utils/init-shared.d.ts.map +1 -1
- package/types/action.d.ts +90 -0
- package/types/action.d.ts.map +1 -0
- package/types/ai-table.d.ts +15 -0
- package/types/ai-table.d.ts.map +1 -0
- package/types/index.d.ts +3 -0
- package/types/index.d.ts.map +1 -1
- package/types/view.d.ts +4 -46
- package/types/view.d.ts.map +1 -1
- package/utils/build.d.ts +3 -4
- package/utils/build.d.ts.map +1 -1
- package/utils/common.d.ts +5 -0
- package/utils/common.d.ts.map +1 -1
- package/utils/field/add-fields.d.ts +4 -0
- package/utils/field/add-fields.d.ts.map +1 -0
- package/utils/field/model/date.d.ts +11 -0
- package/utils/field/model/date.d.ts.map +1 -0
- package/utils/field/model/field.d.ts +12 -0
- package/utils/field/model/field.d.ts.map +1 -0
- package/utils/field/model/index.d.ts.map +1 -0
- package/utils/field/model/number.d.ts +10 -0
- package/utils/field/model/number.d.ts.map +1 -0
- package/utils/field/model/rate.d.ts +10 -0
- package/utils/field/model/rate.d.ts.map +1 -0
- package/utils/field/model/select.d.ts +12 -0
- package/utils/field/model/select.d.ts.map +1 -0
- package/utils/field/{text.d.ts → model/text.d.ts} +3 -1
- package/utils/field/model/text.d.ts.map +1 -0
- package/utils/field/sort-fields.d.ts +4 -0
- package/utils/field/sort-fields.d.ts.map +1 -0
- package/utils/index.d.ts +8 -2
- package/utils/index.d.ts.map +1 -1
- package/utils/record/add-records.d.ts +5 -0
- package/utils/record/add-records.d.ts.map +1 -0
- package/utils/record/filter.d.ts +6 -0
- package/utils/record/filter.d.ts.map +1 -0
- package/utils/record/sort.d.ts +5 -0
- package/utils/record/sort.d.ts.map +1 -0
- package/utils/record/update-field-value.d.ts +4 -0
- package/utils/record/update-field-value.d.ts.map +1 -0
- package/utils/view.d.ts.map +1 -1
- package/utils/weak-map.d.ts +3 -0
- package/utils/weak-map.d.ts.map +1 -0
- package/esm2022/utils/field/date.mjs +0 -56
- package/esm2022/utils/field/field.mjs +0 -32
- package/esm2022/utils/field/index.mjs +0 -22
- package/esm2022/utils/field/number.mjs +0 -28
- package/esm2022/utils/field/rate.mjs +0 -20
- package/esm2022/utils/field/select.mjs +0 -33
- package/esm2022/utils/field/text.mjs +0 -21
- package/esm2022/utils/filter-records.mjs +0 -52
- package/esm2022/view/action/general.mjs +0 -137
- package/esm2022/view/action/index.mjs +0 -4
- package/esm2022/view/action/position.mjs +0 -21
- package/esm2022/view/action/view.mjs +0 -47
- package/esm2022/view/constants/view.mjs +0 -4
- package/esm2022/view/plugins/view.plugin.mjs +0 -34
- package/utils/field/date.d.ts +0 -8
- package/utils/field/date.d.ts.map +0 -1
- package/utils/field/field.d.ts +0 -8
- package/utils/field/field.d.ts.map +0 -1
- package/utils/field/index.d.ts.map +0 -1
- package/utils/field/number.d.ts +0 -7
- package/utils/field/number.d.ts.map +0 -1
- package/utils/field/rate.d.ts +0 -7
- package/utils/field/rate.d.ts.map +0 -1
- package/utils/field/select.d.ts +0 -7
- package/utils/field/select.d.ts.map +0 -1
- package/utils/field/text.d.ts.map +0 -1
- package/utils/filter-records.d.ts +0 -5
- package/utils/filter-records.d.ts.map +0 -1
- package/view/action/general.d.ts +0 -14
- package/view/action/general.d.ts.map +0 -1
- package/view/action/index.d.ts +0 -4
- package/view/action/index.d.ts.map +0 -1
- package/view/action/position.d.ts +0 -8
- package/view/action/position.d.ts.map +0 -1
- package/view/action/view.d.ts.map +0 -1
- package/view/constants/view.d.ts +0 -4
- package/view/constants/view.d.ts.map +0 -1
- package/view/plugins/view.plugin.d.ts +0 -3
- package/view/plugins/view.plugin.d.ts.map +0 -1
- /package/utils/field/{index.d.ts → model/index.d.ts} +0 -0
|
@@ -1,8 +1,48 @@
|
|
|
1
1
|
import * as Y from 'yjs';
|
|
2
|
-
import { ActionName, AITableQueries, getDefaultFieldValue, idCreator, Actions, FLUSHING, AITableFieldType } from '@ai-table/grid';
|
|
3
2
|
import { isArray, isEmpty as isEmpty$1, isObject, isUndefinedOrNull, TinyDate } from 'ngx-tethys/util';
|
|
4
|
-
import {
|
|
3
|
+
import { AITableQueries, getDefaultFieldValue, idCreator, AITableFieldType, Direction as Direction$1, AI_TABLE_GRID_FIELD_SERVICE_MAP } from '@ai-table/grid';
|
|
4
|
+
import _, { isEqual } from 'lodash';
|
|
5
5
|
import { fromUnixTime, subDays } from 'date-fns';
|
|
6
|
+
import { createDraft, finishDraft } from 'immer';
|
|
7
|
+
|
|
8
|
+
const IS_LOCAL = new WeakSet();
|
|
9
|
+
const IS_REMOTE = new WeakSet();
|
|
10
|
+
const IS_UNDO = new WeakSet();
|
|
11
|
+
const YjsAITable = {
|
|
12
|
+
isLocal: (aiTable) => {
|
|
13
|
+
return IS_LOCAL.has(aiTable);
|
|
14
|
+
},
|
|
15
|
+
asLocal: (aiTable, fn) => {
|
|
16
|
+
const wasLocal = YjsAITable.isLocal(aiTable);
|
|
17
|
+
IS_LOCAL.add(aiTable);
|
|
18
|
+
fn();
|
|
19
|
+
if (!wasLocal) {
|
|
20
|
+
IS_LOCAL.delete(aiTable);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
isRemote: (aiTable) => {
|
|
24
|
+
return IS_REMOTE.has(aiTable);
|
|
25
|
+
},
|
|
26
|
+
asRemote: (aiTable, fn) => {
|
|
27
|
+
const wasRemote = YjsAITable.isRemote(aiTable);
|
|
28
|
+
IS_REMOTE.add(aiTable);
|
|
29
|
+
fn();
|
|
30
|
+
if (!wasRemote) {
|
|
31
|
+
Promise.resolve().then(() => IS_REMOTE.delete(aiTable));
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
isUndo: (aiTable) => {
|
|
35
|
+
return IS_UNDO.has(aiTable);
|
|
36
|
+
},
|
|
37
|
+
asUndo: (aiTable, fn) => {
|
|
38
|
+
const wasUndo = YjsAITable.isUndo(aiTable);
|
|
39
|
+
IS_UNDO.add(aiTable);
|
|
40
|
+
fn();
|
|
41
|
+
if (!wasUndo) {
|
|
42
|
+
Promise.resolve().then(() => IS_UNDO.delete(aiTable));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
6
46
|
|
|
7
47
|
class Positions {
|
|
8
48
|
}
|
|
@@ -34,17 +74,29 @@ var AITableFilterOperation;
|
|
|
34
74
|
AITableFilterOperation["exists"] = "exists";
|
|
35
75
|
AITableFilterOperation["notContain"] = "not_contain";
|
|
36
76
|
})(AITableFilterOperation || (AITableFilterOperation = {}));
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
77
|
+
|
|
78
|
+
var ActionName;
|
|
79
|
+
(function (ActionName) {
|
|
80
|
+
ActionName["UpdateFieldValue"] = "update_field_value";
|
|
81
|
+
ActionName["AddRecord"] = "add_record";
|
|
82
|
+
ActionName["AddField"] = "add_field";
|
|
83
|
+
ActionName["MoveField"] = "move_field";
|
|
84
|
+
ActionName["MoveRecord"] = "move_record";
|
|
85
|
+
ActionName["RemoveField"] = "remove_field";
|
|
86
|
+
ActionName["RemoveRecord"] = "remove_record";
|
|
87
|
+
ActionName["SetField"] = "set_field";
|
|
88
|
+
ActionName["SetView"] = "set_view";
|
|
89
|
+
ActionName["AddView"] = "add_view";
|
|
90
|
+
ActionName["RemoveView"] = "remove_view";
|
|
91
|
+
ActionName["AddRecordPosition"] = "add_record_position";
|
|
92
|
+
ActionName["RemoveRecordPosition"] = "remove_record_position";
|
|
93
|
+
})(ActionName || (ActionName = {}));
|
|
94
|
+
var ExecuteType;
|
|
95
|
+
(function (ExecuteType) {
|
|
96
|
+
ExecuteType[ExecuteType["Execute"] = 0] = "Execute";
|
|
97
|
+
ExecuteType[ExecuteType["Undo"] = 1] = "Undo";
|
|
98
|
+
ExecuteType[ExecuteType["Redo"] = 2] = "Redo";
|
|
99
|
+
})(ExecuteType || (ExecuteType = {}));
|
|
48
100
|
|
|
49
101
|
const createSharedType = () => {
|
|
50
102
|
const doc = new Y.Doc();
|
|
@@ -185,7 +237,7 @@ function translateArrayEvent(aiTable, sharedType, event) {
|
|
|
185
237
|
const removeView = aiTable.views()[offset];
|
|
186
238
|
if (removeView) {
|
|
187
239
|
actions.push({
|
|
188
|
-
type:
|
|
240
|
+
type: ActionName.RemoveView,
|
|
189
241
|
path: [removeView._id]
|
|
190
242
|
});
|
|
191
243
|
}
|
|
@@ -235,7 +287,7 @@ function translateArrayEvent(aiTable, sharedType, event) {
|
|
|
235
287
|
for (const key in item) {
|
|
236
288
|
if (!record.positions[key] && record.positions[key] !== 0) {
|
|
237
289
|
actions.push({
|
|
238
|
-
type:
|
|
290
|
+
type: ActionName.AddRecordPosition,
|
|
239
291
|
path: [record._id],
|
|
240
292
|
position: {
|
|
241
293
|
[key]: item[key]
|
|
@@ -246,7 +298,7 @@ function translateArrayEvent(aiTable, sharedType, event) {
|
|
|
246
298
|
for (const key in record.positions) {
|
|
247
299
|
if (!item[key] && item[key] !== 0) {
|
|
248
300
|
actions.push({
|
|
249
|
-
type:
|
|
301
|
+
type: ActionName.RemoveRecordPosition,
|
|
250
302
|
path: [key, record._id]
|
|
251
303
|
});
|
|
252
304
|
}
|
|
@@ -287,7 +339,7 @@ function translateArrayEvent(aiTable, sharedType, event) {
|
|
|
287
339
|
delta.insert?.map((item, index) => {
|
|
288
340
|
const data = item.toJSON();
|
|
289
341
|
actions.push({
|
|
290
|
-
type:
|
|
342
|
+
type: ActionName.AddView,
|
|
291
343
|
path: [offset + index],
|
|
292
344
|
view: data
|
|
293
345
|
});
|
|
@@ -359,7 +411,7 @@ function translateMapEvent(aiTable, sharedType, event) {
|
|
|
359
411
|
const k = key;
|
|
360
412
|
properties[k] = value;
|
|
361
413
|
}
|
|
362
|
-
const type = isFieldsTranslate ? ActionName.SetField :
|
|
414
|
+
const type = isFieldsTranslate ? ActionName.SetField : ActionName.SetView;
|
|
363
415
|
return [
|
|
364
416
|
{
|
|
365
417
|
type,
|
|
@@ -373,45 +425,6 @@ function translateMapEvent(aiTable, sharedType, event) {
|
|
|
373
425
|
return [];
|
|
374
426
|
}
|
|
375
427
|
|
|
376
|
-
const IS_LOCAL = new WeakSet();
|
|
377
|
-
const IS_REMOTE = new WeakSet();
|
|
378
|
-
const IS_UNDO = new WeakSet();
|
|
379
|
-
const YjsAITable = {
|
|
380
|
-
isLocal: (aiTable) => {
|
|
381
|
-
return IS_LOCAL.has(aiTable);
|
|
382
|
-
},
|
|
383
|
-
asLocal: (aiTable, fn) => {
|
|
384
|
-
const wasLocal = YjsAITable.isLocal(aiTable);
|
|
385
|
-
IS_LOCAL.add(aiTable);
|
|
386
|
-
fn();
|
|
387
|
-
if (!wasLocal) {
|
|
388
|
-
IS_LOCAL.delete(aiTable);
|
|
389
|
-
}
|
|
390
|
-
},
|
|
391
|
-
isRemote: (aiTable) => {
|
|
392
|
-
return IS_REMOTE.has(aiTable);
|
|
393
|
-
},
|
|
394
|
-
asRemote: (aiTable, fn) => {
|
|
395
|
-
const wasRemote = YjsAITable.isRemote(aiTable);
|
|
396
|
-
IS_REMOTE.add(aiTable);
|
|
397
|
-
fn();
|
|
398
|
-
if (!wasRemote) {
|
|
399
|
-
Promise.resolve().then(() => IS_REMOTE.delete(aiTable));
|
|
400
|
-
}
|
|
401
|
-
},
|
|
402
|
-
isUndo: (aiTable) => {
|
|
403
|
-
return IS_UNDO.has(aiTable);
|
|
404
|
-
},
|
|
405
|
-
asUndo: (aiTable, fn) => {
|
|
406
|
-
const wasUndo = YjsAITable.isUndo(aiTable);
|
|
407
|
-
IS_UNDO.add(aiTable);
|
|
408
|
-
fn();
|
|
409
|
-
if (!wasUndo) {
|
|
410
|
-
Promise.resolve().then(() => IS_UNDO.delete(aiTable));
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
};
|
|
414
|
-
|
|
415
428
|
function translateYjsEvent(aiTable, sharedType, event) {
|
|
416
429
|
if (event instanceof Y.YArrayEvent) {
|
|
417
430
|
return translateArrayEvent(aiTable, sharedType, event);
|
|
@@ -437,7 +450,7 @@ function applyYjsEvents(aiTable, sharedType, events) {
|
|
|
437
450
|
}
|
|
438
451
|
}
|
|
439
452
|
|
|
440
|
-
function updateFieldValue(sharedType, action) {
|
|
453
|
+
function updateFieldValue$2(sharedType, action) {
|
|
441
454
|
const sharedRecords = sharedType.get('records');
|
|
442
455
|
const sharedFields = sharedType.get('fields');
|
|
443
456
|
if (sharedRecords && sharedFields) {
|
|
@@ -458,7 +471,7 @@ function setNode(sharedType, action) {
|
|
|
458
471
|
if (action.type === ActionName.SetField) {
|
|
459
472
|
sharedNodes = sharedType.get('fields');
|
|
460
473
|
}
|
|
461
|
-
if (action.type ===
|
|
474
|
+
if (action.type === ActionName.SetView) {
|
|
462
475
|
sharedNodes = sharedType.get('views');
|
|
463
476
|
}
|
|
464
477
|
if (sharedNodes) {
|
|
@@ -491,10 +504,10 @@ function addNode(sharedType, action) {
|
|
|
491
504
|
case ActionName.AddRecord:
|
|
492
505
|
records && records.push([toRecordSyncElement(action.record)]);
|
|
493
506
|
break;
|
|
494
|
-
case
|
|
507
|
+
case ActionName.AddView:
|
|
495
508
|
views && views.push([toSyncElement(action.view)]);
|
|
496
509
|
break;
|
|
497
|
-
case
|
|
510
|
+
case ActionName.AddRecordPosition:
|
|
498
511
|
if (records) {
|
|
499
512
|
const recordIndex = getSharedRecordIndex(records, action.path[0]);
|
|
500
513
|
const record = records.get(recordIndex);
|
|
@@ -534,7 +547,7 @@ function removeNode(sharedType, action) {
|
|
|
534
547
|
}
|
|
535
548
|
}
|
|
536
549
|
break;
|
|
537
|
-
case
|
|
550
|
+
case ActionName.RemoveView:
|
|
538
551
|
if (views) {
|
|
539
552
|
const viewIndex = getSharedMapValueIndex(views, action.path[0]);
|
|
540
553
|
if (viewIndex > -1) {
|
|
@@ -542,7 +555,7 @@ function removeNode(sharedType, action) {
|
|
|
542
555
|
}
|
|
543
556
|
}
|
|
544
557
|
break;
|
|
545
|
-
case
|
|
558
|
+
case ActionName.RemoveRecordPosition:
|
|
546
559
|
if (records) {
|
|
547
560
|
const recordIndex = getSharedRecordIndex(records, action.path[1]);
|
|
548
561
|
const record = records.get(recordIndex);
|
|
@@ -571,7 +584,7 @@ function removeNode(sharedType, action) {
|
|
|
571
584
|
|
|
572
585
|
const actionMappers = {
|
|
573
586
|
add_record: addNode,
|
|
574
|
-
update_field_value: updateFieldValue,
|
|
587
|
+
update_field_value: updateFieldValue$2,
|
|
575
588
|
remove_record: removeNode,
|
|
576
589
|
add_field: addNode,
|
|
577
590
|
set_field: setNode,
|
|
@@ -597,343 +610,92 @@ function applyActionOps(sharedType, actions, aiTable) {
|
|
|
597
610
|
return sharedType;
|
|
598
611
|
}
|
|
599
612
|
|
|
600
|
-
function
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
const maxPosition = data[data.length - 1].positions[activeId];
|
|
604
|
-
views.forEach((element) => {
|
|
605
|
-
positions[element._id] = element._id === activeId ? position : maxPosition + 1;
|
|
606
|
-
});
|
|
607
|
-
return positions;
|
|
608
|
-
}
|
|
609
|
-
function getPosition(data, activeViewId, index) {
|
|
610
|
-
let position = data.length - 1;
|
|
611
|
-
if (index !== 0 && index !== data.length) {
|
|
612
|
-
const previousViewPosition = data[index - 1].positions[activeViewId];
|
|
613
|
-
const nextViewPosition = data[index].positions[activeViewId];
|
|
614
|
-
position = (previousViewPosition + nextViewPosition) / 2;
|
|
613
|
+
function isEmpty(value) {
|
|
614
|
+
if (isArray(value)) {
|
|
615
|
+
return isEmpty$1(value);
|
|
615
616
|
}
|
|
616
|
-
|
|
617
|
-
|
|
617
|
+
if (isObject(value)) {
|
|
618
|
+
return Reflect.ownKeys(value).length === 0;
|
|
618
619
|
}
|
|
619
|
-
return
|
|
620
|
+
return isUndefinedOrNull(value) || value == '';
|
|
620
621
|
}
|
|
621
|
-
function
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
};
|
|
628
|
-
let originViewId = aiTable.views()[aiTable.views().length - 1]._id;
|
|
629
|
-
if (type === 'copy') {
|
|
630
|
-
originViewId = aiTable.activeViewId();
|
|
631
|
-
const copyView = aiTable.views().find((item) => item._id === aiTable.activeViewId());
|
|
632
|
-
newView = {
|
|
633
|
-
...copyView,
|
|
634
|
-
_id: newId,
|
|
635
|
-
name: copyView.name + '-副本'
|
|
636
|
-
};
|
|
637
|
-
index = aiTable.views().indexOf(copyView) + 1;
|
|
622
|
+
function getNewIdsByCount(count) {
|
|
623
|
+
if (count <= 0)
|
|
624
|
+
return [];
|
|
625
|
+
const newIds = [];
|
|
626
|
+
for (let i = 0; i < count; i++) {
|
|
627
|
+
newIds.push(idCreator());
|
|
638
628
|
}
|
|
639
|
-
|
|
640
|
-
aiTable.records().forEach((record) => {
|
|
641
|
-
PositionActions.addRecordPosition(aiTable, { [newId]: record.positions[originViewId] }, [record._id]);
|
|
642
|
-
});
|
|
643
|
-
aiTable.fields().forEach((field) => {
|
|
644
|
-
Actions.setField(aiTable, {
|
|
645
|
-
positions: {
|
|
646
|
-
...field.positions,
|
|
647
|
-
[newId]: field.positions[originViewId]
|
|
648
|
-
}
|
|
649
|
-
}, [field._id]);
|
|
650
|
-
});
|
|
651
|
-
return newView;
|
|
629
|
+
return newIds;
|
|
652
630
|
}
|
|
653
|
-
function
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
}, [field._id]);
|
|
663
|
-
});
|
|
664
|
-
ViewActions.removeView(aiTable, [activeViewId]);
|
|
631
|
+
function isPathEqual(path, another) {
|
|
632
|
+
return path.length === another.length && path.every((n, i) => n === another[i]);
|
|
633
|
+
}
|
|
634
|
+
function sortByViewPosition(data, activeView) {
|
|
635
|
+
const hasPositions = data.every((item) => item.positions && item.positions);
|
|
636
|
+
if (hasPositions) {
|
|
637
|
+
return [...data].sort((a, b) => a.positions[activeView._id] - b.positions[activeView._id]);
|
|
638
|
+
}
|
|
639
|
+
return data;
|
|
665
640
|
}
|
|
666
641
|
|
|
667
|
-
const
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
aiTable.views.set(finishDraft(views));
|
|
642
|
+
const zhIntlCollator = typeof Intl !== 'undefined' ? new Intl.Collator('zh-CN') : undefined;
|
|
643
|
+
class Field {
|
|
644
|
+
stringInclude(str, searchStr) {
|
|
645
|
+
return str.toLowerCase().includes(searchStr.trim().toLowerCase());
|
|
672
646
|
}
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
if (view) {
|
|
679
|
-
for (const key in action.newProperties) {
|
|
680
|
-
const k = key;
|
|
681
|
-
const value = action.newProperties[k];
|
|
682
|
-
if (value == null) {
|
|
683
|
-
delete view[k];
|
|
684
|
-
}
|
|
685
|
-
else {
|
|
686
|
-
view[k] = value;
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
// properties that were previously defined, but are now missing, must be deleted
|
|
690
|
-
for (const key in action.properties) {
|
|
691
|
-
if (!action.newProperties.hasOwnProperty(key)) {
|
|
692
|
-
delete view[key];
|
|
693
|
-
}
|
|
694
|
-
}
|
|
647
|
+
isMeetFilter(condition, cellValue) {
|
|
648
|
+
switch (condition.operation) {
|
|
649
|
+
case AITableFilterOperation.empty:
|
|
650
|
+
case AITableFilterOperation.exists: {
|
|
651
|
+
return this.isEmptyOrNot(condition.operation, cellValue);
|
|
695
652
|
}
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
case ViewActionName.AddView: {
|
|
699
|
-
const [viewIndex] = action.path;
|
|
700
|
-
if (viewIndex > -1) {
|
|
701
|
-
views.splice(viewIndex, 0, action.view);
|
|
653
|
+
default: {
|
|
654
|
+
return true;
|
|
702
655
|
}
|
|
703
|
-
break;
|
|
704
656
|
}
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
657
|
+
}
|
|
658
|
+
isEmptyOrNot(operation, cellValue) {
|
|
659
|
+
switch (operation) {
|
|
660
|
+
case AITableFilterOperation.empty: {
|
|
661
|
+
return isEmpty(cellValue);
|
|
662
|
+
}
|
|
663
|
+
case AITableFilterOperation.exists: {
|
|
664
|
+
return !isEmpty(cellValue);
|
|
665
|
+
}
|
|
666
|
+
default: {
|
|
667
|
+
throw new Error('compare operator type error');
|
|
710
668
|
}
|
|
711
|
-
break;
|
|
712
669
|
}
|
|
713
670
|
}
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
if (action.type === ActionName.AddRecord) {
|
|
721
|
-
aiTable.records.set(finishDraft(records));
|
|
671
|
+
eq(cv1, cv2) {
|
|
672
|
+
return isEqual(cv1, cv2);
|
|
673
|
+
}
|
|
674
|
+
compare(cellValue1, cellValue2, field) {
|
|
675
|
+
if (this.eq(cellValue1, cellValue2)) {
|
|
676
|
+
return 0;
|
|
722
677
|
}
|
|
723
|
-
if (
|
|
724
|
-
|
|
678
|
+
if (cellValue1 == null) {
|
|
679
|
+
return -1;
|
|
725
680
|
}
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
const apply = (aiTable, records, fields, action) => {
|
|
729
|
-
switch (action.type) {
|
|
730
|
-
case ActionName.AddRecord: {
|
|
731
|
-
const [recordIndex] = action.path;
|
|
732
|
-
if (recordIndex > -1) {
|
|
733
|
-
if (!action.record.positions) {
|
|
734
|
-
const activeView = aiTable.views().find((item) => item._id === aiTable.activeViewId());
|
|
735
|
-
let index = recordIndex;
|
|
736
|
-
if (activeView?.settings?.conditions) {
|
|
737
|
-
index = records.length;
|
|
738
|
-
}
|
|
739
|
-
action.record.positions = createDefaultPositions(aiTable.views(), aiTable.activeViewId(), aiTable.records(), index);
|
|
740
|
-
}
|
|
741
|
-
records.splice(recordIndex, 0, action.record);
|
|
742
|
-
}
|
|
743
|
-
break;
|
|
681
|
+
if (cellValue2 == null) {
|
|
682
|
+
return 1;
|
|
744
683
|
}
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
newField.positions = createDefaultPositions(aiTable.views(), aiTable.activeViewId(), aiTable.fields(), action.path[0]);
|
|
750
|
-
fields.splice(fieldIndex, 0, newField);
|
|
751
|
-
const newRecord = {
|
|
752
|
-
[newField._id]: getDefaultFieldValue(action.field)
|
|
753
|
-
};
|
|
754
|
-
records.forEach((item) => {
|
|
755
|
-
item.values = {
|
|
756
|
-
...item.values,
|
|
757
|
-
...newRecord
|
|
758
|
-
};
|
|
759
|
-
});
|
|
760
|
-
}
|
|
761
|
-
break;
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
};
|
|
765
|
-
const GeneralPositionActions = {
|
|
766
|
-
transform(aiTable, action) {
|
|
767
|
-
const records = createDraft(aiTable.records());
|
|
768
|
-
const fields = createDraft(aiTable.fields());
|
|
769
|
-
applyPosition(aiTable, records, action);
|
|
770
|
-
aiTable.records.update(() => {
|
|
771
|
-
return finishDraft(records);
|
|
772
|
-
});
|
|
773
|
-
aiTable.fields.update(() => {
|
|
774
|
-
return finishDraft(fields);
|
|
775
|
-
});
|
|
776
|
-
}
|
|
777
|
-
};
|
|
778
|
-
const applyPosition = (aiTable, records, action) => {
|
|
779
|
-
switch (action.type) {
|
|
780
|
-
case PositionActionName.AddRecordPosition: {
|
|
781
|
-
const { position, path } = action;
|
|
782
|
-
const record = records.find((item) => item._id === path[0]);
|
|
783
|
-
if (record) {
|
|
784
|
-
record.positions = {
|
|
785
|
-
...record.positions,
|
|
786
|
-
...position
|
|
787
|
-
};
|
|
788
|
-
}
|
|
789
|
-
break;
|
|
790
|
-
}
|
|
791
|
-
case PositionActionName.RemoveRecordPosition: {
|
|
792
|
-
const { path } = action;
|
|
793
|
-
const record = records.find((item) => item._id === path[1]);
|
|
794
|
-
delete record?.positions[path[0]];
|
|
795
|
-
break;
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
};
|
|
799
|
-
|
|
800
|
-
function setView(aiTable, value, path) {
|
|
801
|
-
const view = aiTable.views().find((item) => item._id === path[0]);
|
|
802
|
-
if (view) {
|
|
803
|
-
const properties = {};
|
|
804
|
-
const newProperties = {};
|
|
805
|
-
for (const key in value) {
|
|
806
|
-
const k = key;
|
|
807
|
-
if (JSON.stringify(view[k]) !== JSON.stringify(value[k])) {
|
|
808
|
-
if (view.hasOwnProperty(k)) {
|
|
809
|
-
properties[k] = view[k];
|
|
810
|
-
}
|
|
811
|
-
if (newProperties[k] !== null) {
|
|
812
|
-
newProperties[k] = value[k];
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
}
|
|
816
|
-
const operation = {
|
|
817
|
-
type: ViewActionName.SetView,
|
|
818
|
-
properties,
|
|
819
|
-
newProperties,
|
|
820
|
-
path
|
|
821
|
-
};
|
|
822
|
-
aiTable.apply(operation);
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
function addView(aiTable, view, path) {
|
|
826
|
-
const operation = {
|
|
827
|
-
type: ViewActionName.AddView,
|
|
828
|
-
view,
|
|
829
|
-
path
|
|
830
|
-
};
|
|
831
|
-
aiTable.apply(operation);
|
|
832
|
-
}
|
|
833
|
-
function removeView(aiTable, path) {
|
|
834
|
-
const operation = {
|
|
835
|
-
type: ViewActionName.RemoveView,
|
|
836
|
-
path
|
|
837
|
-
};
|
|
838
|
-
aiTable.apply(operation);
|
|
839
|
-
}
|
|
840
|
-
const ViewActions = {
|
|
841
|
-
setView,
|
|
842
|
-
addView,
|
|
843
|
-
removeView
|
|
844
|
-
};
|
|
845
|
-
|
|
846
|
-
function addRecordPosition(aiTable, position, path) {
|
|
847
|
-
const operation = {
|
|
848
|
-
type: PositionActionName.AddRecordPosition,
|
|
849
|
-
position,
|
|
850
|
-
path
|
|
851
|
-
};
|
|
852
|
-
aiTable.apply(operation);
|
|
853
|
-
}
|
|
854
|
-
function removeRecordPosition(aiTable, path) {
|
|
855
|
-
const operation = {
|
|
856
|
-
type: PositionActionName.RemoveRecordPosition,
|
|
857
|
-
path
|
|
858
|
-
};
|
|
859
|
-
aiTable.apply(operation);
|
|
860
|
-
}
|
|
861
|
-
const PositionActions = {
|
|
862
|
-
addRecordPosition,
|
|
863
|
-
removeRecordPosition
|
|
864
|
-
};
|
|
865
|
-
|
|
866
|
-
const VIEW_ACTIONS = [ViewActionName.SetView, ViewActionName.AddView, ViewActionName.RemoveView];
|
|
867
|
-
const POSITION_ACTIONS = [PositionActionName.AddRecordPosition, PositionActionName.RemoveRecordPosition];
|
|
868
|
-
|
|
869
|
-
const withView = (aiTable) => {
|
|
870
|
-
const viewTable = aiTable;
|
|
871
|
-
viewTable.apply = (action) => {
|
|
872
|
-
const sharedActions = viewTable.actions;
|
|
873
|
-
sharedActions.push(action);
|
|
874
|
-
if (VIEW_ACTIONS.includes(action.type)) {
|
|
875
|
-
GeneralViewActions.transform(viewTable, action);
|
|
876
|
-
}
|
|
877
|
-
else if (POSITION_ACTIONS.includes(action.type)) {
|
|
878
|
-
GeneralPositionActions.transform(viewTable, action);
|
|
879
|
-
}
|
|
880
|
-
else {
|
|
881
|
-
if (action.type === ActionName.AddField || action.type === ActionName.AddRecord) {
|
|
882
|
-
GeneralActions.transform(viewTable, action);
|
|
883
|
-
}
|
|
884
|
-
else {
|
|
885
|
-
Actions.transform(aiTable, action);
|
|
886
|
-
}
|
|
887
|
-
}
|
|
888
|
-
if (!FLUSHING.get(aiTable)) {
|
|
889
|
-
FLUSHING.set(aiTable, true);
|
|
890
|
-
Promise.resolve().then(() => {
|
|
891
|
-
FLUSHING.set(aiTable, false);
|
|
892
|
-
aiTable.onChange();
|
|
893
|
-
aiTable.actions = [];
|
|
894
|
-
});
|
|
895
|
-
}
|
|
896
|
-
};
|
|
897
|
-
return aiTable;
|
|
898
|
-
};
|
|
899
|
-
|
|
900
|
-
function isEmpty(value) {
|
|
901
|
-
if (isArray(value)) {
|
|
902
|
-
return isEmpty$1(value);
|
|
903
|
-
}
|
|
904
|
-
if (isObject(value)) {
|
|
905
|
-
return Reflect.ownKeys(value).length === 0;
|
|
906
|
-
}
|
|
907
|
-
return isUndefinedOrNull(value) || value == '';
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
class Field {
|
|
911
|
-
stringInclude(str, searchStr) {
|
|
912
|
-
return str.toLowerCase().includes(searchStr.trim().toLowerCase());
|
|
913
|
-
}
|
|
914
|
-
isMeetFilter(condition, cellValue) {
|
|
915
|
-
switch (condition.operation) {
|
|
916
|
-
case AITableFilterOperation.empty:
|
|
917
|
-
case AITableFilterOperation.exists: {
|
|
918
|
-
return this.isEmptyOrNot(condition.operation, cellValue);
|
|
919
|
-
}
|
|
920
|
-
default: {
|
|
921
|
-
return true;
|
|
922
|
-
}
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
isEmptyOrNot(operation, cellValue) {
|
|
926
|
-
switch (operation) {
|
|
927
|
-
case AITableFilterOperation.empty: {
|
|
928
|
-
return isEmpty(cellValue);
|
|
929
|
-
}
|
|
930
|
-
case AITableFilterOperation.exists: {
|
|
931
|
-
return !isEmpty(cellValue);
|
|
932
|
-
}
|
|
933
|
-
default: {
|
|
934
|
-
throw new Error('compare operator type error');
|
|
935
|
-
}
|
|
684
|
+
let str1 = this.cellValueToString(cellValue1, field);
|
|
685
|
+
let str2 = this.cellValueToString(cellValue2, field);
|
|
686
|
+
if (str1 === str2) {
|
|
687
|
+
return 0;
|
|
936
688
|
}
|
|
689
|
+
if (str1 == null) {
|
|
690
|
+
return -1;
|
|
691
|
+
}
|
|
692
|
+
if (str2 == null) {
|
|
693
|
+
return 1;
|
|
694
|
+
}
|
|
695
|
+
str1 = str1.trim();
|
|
696
|
+
str2 = str2.trim();
|
|
697
|
+
// test pinyin sort
|
|
698
|
+
return str1 === str2 ? 0 : zhIntlCollator ? zhIntlCollator.compare(str1, str2) : str1.localeCompare(str2, 'zh-CN') > 0 ? 1 : -1;
|
|
937
699
|
}
|
|
938
700
|
}
|
|
939
701
|
|
|
@@ -953,6 +715,12 @@ class TextField extends Field {
|
|
|
953
715
|
static stringInclude(str, searchStr) {
|
|
954
716
|
return str.toLowerCase().includes(searchStr.trim().toLowerCase());
|
|
955
717
|
}
|
|
718
|
+
eq(cv1, cv2) {
|
|
719
|
+
return this.cellValueToString(cv1) === this.cellValueToString(cv2);
|
|
720
|
+
}
|
|
721
|
+
cellValueToString(cellValue) {
|
|
722
|
+
return cellValue;
|
|
723
|
+
}
|
|
956
724
|
}
|
|
957
725
|
|
|
958
726
|
class SelectField extends Field {
|
|
@@ -970,6 +738,28 @@ class SelectField extends Field {
|
|
|
970
738
|
return super.isMeetFilter(condition, cellValue);
|
|
971
739
|
}
|
|
972
740
|
}
|
|
741
|
+
cellValueToString(cellValue, field) {
|
|
742
|
+
return this.arrayValueToString(this.cellValueToArray(cellValue, field));
|
|
743
|
+
}
|
|
744
|
+
cellValueToArray(cellValue, field) {
|
|
745
|
+
if (!cellValue) {
|
|
746
|
+
return null;
|
|
747
|
+
}
|
|
748
|
+
const result = [];
|
|
749
|
+
for (let i = 0, l = cellValue.length; i < l; i++) {
|
|
750
|
+
const option = this.findOptionById(field, cellValue[i]);
|
|
751
|
+
if (option) {
|
|
752
|
+
result.push(option.text);
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
return result;
|
|
756
|
+
}
|
|
757
|
+
findOptionById(field, id) {
|
|
758
|
+
return field.settings.options.find(option => option._id === id) || null;
|
|
759
|
+
}
|
|
760
|
+
arrayValueToString(cellValues) {
|
|
761
|
+
return cellValues && cellValues.length ? cellValues.join(', ') : null;
|
|
762
|
+
}
|
|
973
763
|
}
|
|
974
764
|
function hasIntersect(array1, array2) {
|
|
975
765
|
if (!Array.isArray(array1) || !Array.isArray(array2)) {
|
|
@@ -1034,6 +824,24 @@ class DateField extends Field {
|
|
|
1034
824
|
];
|
|
1035
825
|
}
|
|
1036
826
|
}
|
|
827
|
+
cellValueToString(_cellValue) {
|
|
828
|
+
return null;
|
|
829
|
+
}
|
|
830
|
+
static _compare(cellValue1, cellValue2) {
|
|
831
|
+
if (isEmpty(cellValue1?.timestamp) && isEmpty(cellValue2?.timestamp)) {
|
|
832
|
+
return 0;
|
|
833
|
+
}
|
|
834
|
+
if (isEmpty(cellValue1?.timestamp)) {
|
|
835
|
+
return -1;
|
|
836
|
+
}
|
|
837
|
+
if (isEmpty(cellValue2?.timestamp)) {
|
|
838
|
+
return 1;
|
|
839
|
+
}
|
|
840
|
+
return cellValue1.timestamp === cellValue2.timestamp ? 0 : cellValue1.timestamp > cellValue2.timestamp ? 1 : -1;
|
|
841
|
+
}
|
|
842
|
+
compare(cellValue1, cellValue2) {
|
|
843
|
+
return DateField._compare(cellValue1, cellValue2);
|
|
844
|
+
}
|
|
1037
845
|
}
|
|
1038
846
|
|
|
1039
847
|
class NumberField extends Field {
|
|
@@ -1059,6 +867,24 @@ class NumberField extends Field {
|
|
|
1059
867
|
return super.isMeetFilter(condition, cellValue);
|
|
1060
868
|
}
|
|
1061
869
|
}
|
|
870
|
+
cellValueToString(_cellValue) {
|
|
871
|
+
return null;
|
|
872
|
+
}
|
|
873
|
+
static _compare(cellValue1, cellValue2) {
|
|
874
|
+
if (isEmpty(cellValue1) && isEmpty(cellValue2)) {
|
|
875
|
+
return 0;
|
|
876
|
+
}
|
|
877
|
+
if (isEmpty(cellValue1)) {
|
|
878
|
+
return -1;
|
|
879
|
+
}
|
|
880
|
+
if (isEmpty(cellValue2)) {
|
|
881
|
+
return 1;
|
|
882
|
+
}
|
|
883
|
+
return cellValue1 === cellValue2 ? 0 : cellValue1 > cellValue2 ? 1 : -1;
|
|
884
|
+
}
|
|
885
|
+
compare(cellValue1, cellValue2) {
|
|
886
|
+
return NumberField._compare(cellValue1, cellValue2);
|
|
887
|
+
}
|
|
1062
888
|
}
|
|
1063
889
|
|
|
1064
890
|
class RateField extends Field {
|
|
@@ -1076,6 +902,24 @@ class RateField extends Field {
|
|
|
1076
902
|
return super.isMeetFilter(condition, cellValue);
|
|
1077
903
|
}
|
|
1078
904
|
}
|
|
905
|
+
cellValueToString(_cellValue) {
|
|
906
|
+
return null;
|
|
907
|
+
}
|
|
908
|
+
static _compare(cellValue1, cellValue2) {
|
|
909
|
+
if (isEmpty(cellValue1) && isEmpty(cellValue2)) {
|
|
910
|
+
return 0;
|
|
911
|
+
}
|
|
912
|
+
if (isEmpty(cellValue1)) {
|
|
913
|
+
return -1;
|
|
914
|
+
}
|
|
915
|
+
if (isEmpty(cellValue2)) {
|
|
916
|
+
return 1;
|
|
917
|
+
}
|
|
918
|
+
return cellValue1 === cellValue2 ? 0 : cellValue1 > cellValue2 ? 1 : -1;
|
|
919
|
+
}
|
|
920
|
+
compare(cellValue1, cellValue2) {
|
|
921
|
+
return RateField._compare(cellValue1, cellValue2);
|
|
922
|
+
}
|
|
1079
923
|
}
|
|
1080
924
|
|
|
1081
925
|
const ViewOperationMap = {
|
|
@@ -1094,7 +938,38 @@ const ViewOperationMap = {
|
|
|
1094
938
|
[AITableFieldType.updatedBy]: new SelectField()
|
|
1095
939
|
};
|
|
1096
940
|
|
|
1097
|
-
function
|
|
941
|
+
function getSortRecords(aiTable, records, activeView) {
|
|
942
|
+
if (!activeView?.settings || !activeView.settings.sorts?.length) {
|
|
943
|
+
return records;
|
|
944
|
+
}
|
|
945
|
+
const { is_keep_sort, sorts } = activeView.settings;
|
|
946
|
+
if (is_keep_sort && sorts?.length) {
|
|
947
|
+
return sortRecordsBySortInfo(aiTable, records, activeView);
|
|
948
|
+
}
|
|
949
|
+
return sortByViewPosition(records, activeView);
|
|
950
|
+
}
|
|
951
|
+
function sortRecordsBySortInfo(aiTable, records, activeView) {
|
|
952
|
+
const shallowRows = [...records];
|
|
953
|
+
if (activeView.settings?.sorts?.length) {
|
|
954
|
+
shallowRows.sort((prev, current) => {
|
|
955
|
+
return activeView.settings.sorts.reduce((acc, rule) => {
|
|
956
|
+
const field = aiTable.fieldsMap()[rule.sort_by];
|
|
957
|
+
if (!field || acc !== 0) {
|
|
958
|
+
return acc;
|
|
959
|
+
}
|
|
960
|
+
const fieldMethod = ViewOperationMap[field.type];
|
|
961
|
+
const cellValue1 = AITableQueries.getFieldValue(aiTable, [prev._id, field._id]);
|
|
962
|
+
const cellValue2 = AITableQueries.getFieldValue(aiTable, [current._id, field._id]);
|
|
963
|
+
const res = fieldMethod.compare(cellValue1, cellValue2, field);
|
|
964
|
+
return res * rule.direction;
|
|
965
|
+
}, 0);
|
|
966
|
+
});
|
|
967
|
+
return shallowRows;
|
|
968
|
+
}
|
|
969
|
+
return shallowRows;
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
function getFilteredRecords(aiTable, records, fields, activeView) {
|
|
1098
973
|
const { conditions, condition_logical } = activeView.settings || {};
|
|
1099
974
|
if (!conditions) {
|
|
1100
975
|
return records;
|
|
@@ -1103,7 +978,11 @@ function getFilteredRecords(records, fields, activeView) {
|
|
|
1103
978
|
if (!illegalConditions.length) {
|
|
1104
979
|
return records;
|
|
1105
980
|
}
|
|
981
|
+
const recordsWillHidden = aiTable.recordsWillHidden();
|
|
1106
982
|
return records.filter((record) => {
|
|
983
|
+
if (recordsWillHidden && recordsWillHidden.length && recordsWillHidden.includes(record._id)) {
|
|
984
|
+
return true;
|
|
985
|
+
}
|
|
1107
986
|
return checkConditions(fields, record, { conditions: illegalConditions, condition_logical });
|
|
1108
987
|
});
|
|
1109
988
|
}
|
|
@@ -1142,25 +1021,563 @@ function doFilter(condition, field, cellValue) {
|
|
|
1142
1021
|
}
|
|
1143
1022
|
return ViewOperationMap[field.type].isMeetFilter(condition, cellValue);
|
|
1144
1023
|
}
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
if (hasPositions) {
|
|
1149
|
-
return [...data].sort((a, b) => a.positions[activeViewId] - b.positions[activeViewId]);
|
|
1024
|
+
function getDefaultRecordDataByFilter(recordValues, conditions, conditionLogical) {
|
|
1025
|
+
if (conditions.length === 1) {
|
|
1026
|
+
// recordValues[conditions[0].field_id] = conditions[0].value;
|
|
1150
1027
|
}
|
|
1151
|
-
|
|
1028
|
+
else {
|
|
1029
|
+
//...
|
|
1030
|
+
}
|
|
1031
|
+
return recordValues;
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
function getSortFields(aiTable, fields, activeView) {
|
|
1035
|
+
return sortByViewPosition(fields, activeView);
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
function buildRecordsByView(aiTable, records, fields, activeView) {
|
|
1039
|
+
const filteredRecords = getFilteredRecords(aiTable, records, fields, activeView);
|
|
1040
|
+
return getSortRecords(aiTable, filteredRecords, activeView);
|
|
1041
|
+
}
|
|
1042
|
+
function buildFieldsByView(aiTable, fields, activeView) {
|
|
1043
|
+
return getSortFields(aiTable, fields, activeView);
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
function addField(aiTable, field, path) {
|
|
1047
|
+
const operation = {
|
|
1048
|
+
type: ActionName.AddField,
|
|
1049
|
+
field,
|
|
1050
|
+
path
|
|
1051
|
+
};
|
|
1052
|
+
aiTable.apply(operation);
|
|
1053
|
+
}
|
|
1054
|
+
function moveField(aiTable, path, newPath) {
|
|
1055
|
+
const operation = {
|
|
1056
|
+
type: ActionName.MoveField,
|
|
1057
|
+
path,
|
|
1058
|
+
newPath
|
|
1059
|
+
};
|
|
1060
|
+
aiTable.apply(operation);
|
|
1152
1061
|
}
|
|
1153
|
-
function
|
|
1154
|
-
const
|
|
1155
|
-
|
|
1062
|
+
function removeField(aiTable, path) {
|
|
1063
|
+
const operation = {
|
|
1064
|
+
type: ActionName.RemoveField,
|
|
1065
|
+
path
|
|
1066
|
+
};
|
|
1067
|
+
aiTable.apply(operation);
|
|
1156
1068
|
}
|
|
1157
|
-
function
|
|
1158
|
-
|
|
1069
|
+
function setField(aiTable, value, path) {
|
|
1070
|
+
const field = AITableQueries.getField(aiTable, path);
|
|
1071
|
+
if (field) {
|
|
1072
|
+
const properties = {};
|
|
1073
|
+
const newProperties = {};
|
|
1074
|
+
for (const key in value) {
|
|
1075
|
+
const k = key;
|
|
1076
|
+
if (JSON.stringify(field[k]) !== JSON.stringify(value[k])) {
|
|
1077
|
+
if (field.hasOwnProperty(k)) {
|
|
1078
|
+
properties[k] = field[k];
|
|
1079
|
+
}
|
|
1080
|
+
if (newProperties[k] !== null) {
|
|
1081
|
+
newProperties[k] = value[k];
|
|
1082
|
+
}
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
const operation = {
|
|
1086
|
+
type: ActionName.SetField,
|
|
1087
|
+
properties,
|
|
1088
|
+
newProperties,
|
|
1089
|
+
path
|
|
1090
|
+
};
|
|
1091
|
+
aiTable.apply(operation);
|
|
1092
|
+
}
|
|
1159
1093
|
}
|
|
1094
|
+
const FieldActions = {
|
|
1095
|
+
addField,
|
|
1096
|
+
moveField,
|
|
1097
|
+
removeField,
|
|
1098
|
+
setField
|
|
1099
|
+
};
|
|
1100
|
+
|
|
1101
|
+
const apply = (aiTable, records, fields, views, action) => {
|
|
1102
|
+
switch (action.type) {
|
|
1103
|
+
case ActionName.UpdateFieldValue: {
|
|
1104
|
+
const [recordId, fieldId] = action.path;
|
|
1105
|
+
if (recordId && fieldId) {
|
|
1106
|
+
const recordIndex = aiTable.records().findIndex((item) => item._id === recordId);
|
|
1107
|
+
records[recordIndex].values[fieldId] = action.newFieldValue;
|
|
1108
|
+
}
|
|
1109
|
+
break;
|
|
1110
|
+
}
|
|
1111
|
+
case ActionName.AddRecord: {
|
|
1112
|
+
const [recordIndex] = action.path;
|
|
1113
|
+
if (recordIndex > -1) {
|
|
1114
|
+
if (!action.record.positions) {
|
|
1115
|
+
const activeView = aiTable.views().find((item) => item._id === aiTable.activeViewId());
|
|
1116
|
+
let index = recordIndex;
|
|
1117
|
+
if (activeView?.settings?.conditions) {
|
|
1118
|
+
index = records.length;
|
|
1119
|
+
}
|
|
1120
|
+
action.record.positions = createDefaultPositions(aiTable.views(), aiTable.activeViewId(), aiTable.records(), index);
|
|
1121
|
+
}
|
|
1122
|
+
records.splice(recordIndex, 0, action.record);
|
|
1123
|
+
}
|
|
1124
|
+
break;
|
|
1125
|
+
}
|
|
1126
|
+
case ActionName.AddField: {
|
|
1127
|
+
const [fieldIndex] = action.path;
|
|
1128
|
+
if (fieldIndex > -1) {
|
|
1129
|
+
const newField = action.field;
|
|
1130
|
+
newField.positions = createDefaultPositions(aiTable.views(), aiTable.activeViewId(), aiTable.fields(), action.path[0]);
|
|
1131
|
+
fields.splice(fieldIndex, 0, newField);
|
|
1132
|
+
const newRecord = {
|
|
1133
|
+
[newField._id]: getDefaultFieldValue(action.field)
|
|
1134
|
+
};
|
|
1135
|
+
records.forEach((item) => {
|
|
1136
|
+
item.values = {
|
|
1137
|
+
...item.values,
|
|
1138
|
+
...newRecord
|
|
1139
|
+
};
|
|
1140
|
+
});
|
|
1141
|
+
}
|
|
1142
|
+
break;
|
|
1143
|
+
}
|
|
1144
|
+
case ActionName.MoveRecord: {
|
|
1145
|
+
if (isPathEqual(action.path, action.newPath)) {
|
|
1146
|
+
return;
|
|
1147
|
+
}
|
|
1148
|
+
const record = records[action.path[0]];
|
|
1149
|
+
records.splice(action.path[0], 1);
|
|
1150
|
+
records.splice(action.newPath[0], 0, record);
|
|
1151
|
+
break;
|
|
1152
|
+
}
|
|
1153
|
+
case ActionName.MoveField: {
|
|
1154
|
+
if (isPathEqual(action.path, action.newPath)) {
|
|
1155
|
+
return;
|
|
1156
|
+
}
|
|
1157
|
+
const field = fields[action.path[0]];
|
|
1158
|
+
fields.splice(action.path[0], 1);
|
|
1159
|
+
fields.splice(action.newPath[0], 0, field);
|
|
1160
|
+
break;
|
|
1161
|
+
}
|
|
1162
|
+
case ActionName.RemoveField: {
|
|
1163
|
+
const [fieldId] = action.path;
|
|
1164
|
+
const fieldIndex = aiTable.fields().findIndex((item) => item._id === fieldId);
|
|
1165
|
+
if (fieldIndex > -1) {
|
|
1166
|
+
fields.splice(fieldIndex, 1);
|
|
1167
|
+
records.forEach((item) => {
|
|
1168
|
+
delete item.values[fieldId];
|
|
1169
|
+
});
|
|
1170
|
+
}
|
|
1171
|
+
break;
|
|
1172
|
+
}
|
|
1173
|
+
case ActionName.RemoveRecord: {
|
|
1174
|
+
const [recordId] = action.path;
|
|
1175
|
+
const recordIndex = aiTable.records().findIndex((item) => item._id === recordId);
|
|
1176
|
+
if (recordIndex > -1) {
|
|
1177
|
+
records.splice(recordIndex, 1);
|
|
1178
|
+
}
|
|
1179
|
+
break;
|
|
1180
|
+
}
|
|
1181
|
+
case ActionName.SetField: {
|
|
1182
|
+
const field = fields.find((item) => item._id === action.path[0]);
|
|
1183
|
+
if (field) {
|
|
1184
|
+
for (const key in action.newProperties) {
|
|
1185
|
+
const k = key;
|
|
1186
|
+
const value = action.newProperties[k];
|
|
1187
|
+
if (value == null) {
|
|
1188
|
+
delete field[k];
|
|
1189
|
+
}
|
|
1190
|
+
else {
|
|
1191
|
+
field[k] = value;
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
// properties that were previously defined, but are now missing, must be deleted
|
|
1195
|
+
for (const key in action.properties) {
|
|
1196
|
+
if (!action.newProperties.hasOwnProperty(key)) {
|
|
1197
|
+
delete field[key];
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
break;
|
|
1202
|
+
}
|
|
1203
|
+
case ActionName.SetView: {
|
|
1204
|
+
const view = views.find((item) => item._id === action.path[0]);
|
|
1205
|
+
if (view) {
|
|
1206
|
+
for (const key in action.newProperties) {
|
|
1207
|
+
const k = key;
|
|
1208
|
+
const value = action.newProperties[k];
|
|
1209
|
+
if (value == null) {
|
|
1210
|
+
delete view[k];
|
|
1211
|
+
}
|
|
1212
|
+
else {
|
|
1213
|
+
view[k] = value;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
// properties that were previously defined, but are now missing, must be deleted
|
|
1217
|
+
for (const key in action.properties) {
|
|
1218
|
+
if (!action.newProperties.hasOwnProperty(key)) {
|
|
1219
|
+
delete view[key];
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
break;
|
|
1224
|
+
}
|
|
1225
|
+
case ActionName.AddView: {
|
|
1226
|
+
const [viewIndex] = action.path;
|
|
1227
|
+
if (viewIndex > -1) {
|
|
1228
|
+
views.splice(viewIndex, 0, action.view);
|
|
1229
|
+
}
|
|
1230
|
+
break;
|
|
1231
|
+
}
|
|
1232
|
+
case ActionName.RemoveView: {
|
|
1233
|
+
const [viewId] = action.path;
|
|
1234
|
+
const viewIndex = views.findIndex((item) => item._id === viewId);
|
|
1235
|
+
if (viewIndex > -1) {
|
|
1236
|
+
views.splice(viewIndex, 1);
|
|
1237
|
+
}
|
|
1238
|
+
break;
|
|
1239
|
+
}
|
|
1240
|
+
case ActionName.AddRecordPosition: {
|
|
1241
|
+
const { position, path } = action;
|
|
1242
|
+
const record = records.find((item) => item._id === path[0]);
|
|
1243
|
+
if (record) {
|
|
1244
|
+
record.positions = {
|
|
1245
|
+
...record.positions,
|
|
1246
|
+
...position
|
|
1247
|
+
};
|
|
1248
|
+
}
|
|
1249
|
+
break;
|
|
1250
|
+
}
|
|
1251
|
+
case ActionName.RemoveRecordPosition: {
|
|
1252
|
+
const { path } = action;
|
|
1253
|
+
const record = records.find((item) => item._id === path[1]);
|
|
1254
|
+
delete record?.positions[path[0]];
|
|
1255
|
+
break;
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
return {
|
|
1259
|
+
records,
|
|
1260
|
+
fields,
|
|
1261
|
+
views
|
|
1262
|
+
};
|
|
1263
|
+
};
|
|
1264
|
+
const GeneralActions = {
|
|
1265
|
+
transform(aiTable, action) {
|
|
1266
|
+
const records = createDraft(aiTable.records());
|
|
1267
|
+
const fields = createDraft(aiTable.fields());
|
|
1268
|
+
const views = createDraft(aiTable.views());
|
|
1269
|
+
apply(aiTable, records, fields, views, action);
|
|
1270
|
+
aiTable.fields.set(finishDraft(fields));
|
|
1271
|
+
aiTable.records.set(finishDraft(records));
|
|
1272
|
+
aiTable.views.set(finishDraft(views));
|
|
1273
|
+
}
|
|
1274
|
+
};
|
|
1275
|
+
|
|
1276
|
+
function setRecordPosition(aiTable, position, path) {
|
|
1277
|
+
const operation = {
|
|
1278
|
+
type: ActionName.AddRecordPosition,
|
|
1279
|
+
position,
|
|
1280
|
+
path
|
|
1281
|
+
};
|
|
1282
|
+
aiTable.apply(operation);
|
|
1283
|
+
}
|
|
1284
|
+
function removeRecordPosition(aiTable, path) {
|
|
1285
|
+
const operation = {
|
|
1286
|
+
type: ActionName.RemoveRecordPosition,
|
|
1287
|
+
path
|
|
1288
|
+
};
|
|
1289
|
+
aiTable.apply(operation);
|
|
1290
|
+
}
|
|
1291
|
+
const PositionActions = {
|
|
1292
|
+
setRecordPosition,
|
|
1293
|
+
removeRecordPosition
|
|
1294
|
+
};
|
|
1295
|
+
|
|
1296
|
+
function updateFieldValue$1(aiTable, value, path) {
|
|
1297
|
+
const field = AITableQueries.getFieldValue(aiTable, path);
|
|
1298
|
+
if (field !== value) {
|
|
1299
|
+
const operation = {
|
|
1300
|
+
type: ActionName.UpdateFieldValue,
|
|
1301
|
+
fieldValue: field,
|
|
1302
|
+
newFieldValue: value,
|
|
1303
|
+
path
|
|
1304
|
+
};
|
|
1305
|
+
aiTable.apply(operation);
|
|
1306
|
+
}
|
|
1307
|
+
}
|
|
1308
|
+
function addRecord(aiTable, record, path) {
|
|
1309
|
+
const operation = {
|
|
1310
|
+
type: ActionName.AddRecord,
|
|
1311
|
+
record,
|
|
1312
|
+
path
|
|
1313
|
+
};
|
|
1314
|
+
aiTable.apply(operation);
|
|
1315
|
+
}
|
|
1316
|
+
function moveRecord(aiTable, path, newPath) {
|
|
1317
|
+
const operation = {
|
|
1318
|
+
type: ActionName.MoveRecord,
|
|
1319
|
+
path,
|
|
1320
|
+
newPath
|
|
1321
|
+
};
|
|
1322
|
+
aiTable.apply(operation);
|
|
1323
|
+
}
|
|
1324
|
+
function removeRecord(aiTable, path) {
|
|
1325
|
+
const operation = {
|
|
1326
|
+
type: ActionName.RemoveRecord,
|
|
1327
|
+
path
|
|
1328
|
+
};
|
|
1329
|
+
aiTable.apply(operation);
|
|
1330
|
+
}
|
|
1331
|
+
const RecordActions = {
|
|
1332
|
+
addRecord,
|
|
1333
|
+
updateFieldValue: updateFieldValue$1,
|
|
1334
|
+
moveRecord,
|
|
1335
|
+
removeRecord
|
|
1336
|
+
};
|
|
1337
|
+
|
|
1338
|
+
function setView(aiTable, value, path) {
|
|
1339
|
+
const view = aiTable.views().find((item) => item._id === path[0]);
|
|
1340
|
+
if (view) {
|
|
1341
|
+
const properties = {};
|
|
1342
|
+
const newProperties = {};
|
|
1343
|
+
for (const key in value) {
|
|
1344
|
+
const k = key;
|
|
1345
|
+
if (JSON.stringify(view[k]) !== JSON.stringify(value[k])) {
|
|
1346
|
+
if (view.hasOwnProperty(k)) {
|
|
1347
|
+
properties[k] = view[k];
|
|
1348
|
+
}
|
|
1349
|
+
if (newProperties[k] !== null) {
|
|
1350
|
+
newProperties[k] = value[k];
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
const operation = {
|
|
1355
|
+
type: ActionName.SetView,
|
|
1356
|
+
properties,
|
|
1357
|
+
newProperties,
|
|
1358
|
+
path
|
|
1359
|
+
};
|
|
1360
|
+
aiTable.apply(operation);
|
|
1361
|
+
}
|
|
1362
|
+
}
|
|
1363
|
+
function addView$1(aiTable, view, path) {
|
|
1364
|
+
const operation = {
|
|
1365
|
+
type: ActionName.AddView,
|
|
1366
|
+
view,
|
|
1367
|
+
path
|
|
1368
|
+
};
|
|
1369
|
+
aiTable.apply(operation);
|
|
1370
|
+
}
|
|
1371
|
+
function removeView$1(aiTable, path) {
|
|
1372
|
+
const operation = {
|
|
1373
|
+
type: ActionName.RemoveView,
|
|
1374
|
+
path
|
|
1375
|
+
};
|
|
1376
|
+
aiTable.apply(operation);
|
|
1377
|
+
}
|
|
1378
|
+
const ViewActions = {
|
|
1379
|
+
setView,
|
|
1380
|
+
addView: addView$1,
|
|
1381
|
+
removeView: removeView$1
|
|
1382
|
+
};
|
|
1383
|
+
|
|
1384
|
+
const Actions = {
|
|
1385
|
+
...GeneralActions,
|
|
1386
|
+
...RecordActions,
|
|
1387
|
+
...FieldActions,
|
|
1388
|
+
...ViewActions,
|
|
1389
|
+
...PositionActions
|
|
1390
|
+
};
|
|
1391
|
+
|
|
1392
|
+
function addFields(aiTable, options) {
|
|
1393
|
+
const { originId, direction = Direction$1.after, defaultValue, isDuplicate, count = 1 } = options;
|
|
1394
|
+
const activeView = aiTable.viewsMap()[aiTable.activeViewId()];
|
|
1395
|
+
const fields = getSortFields(aiTable, aiTable.fields(), activeView);
|
|
1396
|
+
let addIndex = fields.findIndex((item) => item._id === originId);
|
|
1397
|
+
if (direction === Direction$1.after) {
|
|
1398
|
+
addIndex++;
|
|
1399
|
+
}
|
|
1400
|
+
const newRecordIds = getNewIdsByCount(count);
|
|
1401
|
+
newRecordIds.forEach((id, index) => {
|
|
1402
|
+
const newField = { _id: id, ...defaultValue };
|
|
1403
|
+
Actions.addField(aiTable, newField, [addIndex + index]);
|
|
1404
|
+
});
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
function createDefaultPositions(views, activeId, data, index) {
|
|
1408
|
+
const positions = {};
|
|
1409
|
+
const position = getPosition(data, activeId, index);
|
|
1410
|
+
const maxPosition = data[data.length - 1].positions[activeId];
|
|
1411
|
+
views.forEach((element) => {
|
|
1412
|
+
positions[element._id] = element._id === activeId ? position : maxPosition + 1;
|
|
1413
|
+
});
|
|
1414
|
+
return positions;
|
|
1415
|
+
}
|
|
1416
|
+
function getPosition(data, activeViewId, index) {
|
|
1417
|
+
let position = data.length - 1;
|
|
1418
|
+
if (index !== 0 && index !== data.length) {
|
|
1419
|
+
const previousViewPosition = data[index - 1].positions[activeViewId];
|
|
1420
|
+
const nextViewPosition = data[index].positions[activeViewId];
|
|
1421
|
+
position = (previousViewPosition + nextViewPosition) / 2;
|
|
1422
|
+
}
|
|
1423
|
+
else {
|
|
1424
|
+
position = index;
|
|
1425
|
+
}
|
|
1426
|
+
return position;
|
|
1427
|
+
}
|
|
1428
|
+
function addView(aiTable, type) {
|
|
1429
|
+
let index = aiTable.views().length;
|
|
1430
|
+
const newId = idCreator();
|
|
1431
|
+
let newView = {
|
|
1432
|
+
_id: newId,
|
|
1433
|
+
name: '表格视图 ' + index
|
|
1434
|
+
};
|
|
1435
|
+
let originViewId = aiTable.views()[aiTable.views().length - 1]._id;
|
|
1436
|
+
if (type === 'copy') {
|
|
1437
|
+
originViewId = aiTable.activeViewId();
|
|
1438
|
+
const copyView = aiTable.views().find((item) => item._id === aiTable.activeViewId());
|
|
1439
|
+
newView = {
|
|
1440
|
+
...copyView,
|
|
1441
|
+
_id: newId,
|
|
1442
|
+
name: copyView.name + '-副本'
|
|
1443
|
+
};
|
|
1444
|
+
index = aiTable.views().indexOf(copyView) + 1;
|
|
1445
|
+
}
|
|
1446
|
+
ViewActions.addView(aiTable, newView, [index]);
|
|
1447
|
+
aiTable.records().forEach((record) => {
|
|
1448
|
+
PositionActions.setRecordPosition(aiTable, { [newId]: record.positions[originViewId] }, [record._id]);
|
|
1449
|
+
});
|
|
1450
|
+
aiTable.fields().forEach((field) => {
|
|
1451
|
+
Actions.setField(aiTable, {
|
|
1452
|
+
positions: {
|
|
1453
|
+
...field.positions,
|
|
1454
|
+
[newId]: field.positions[originViewId]
|
|
1455
|
+
}
|
|
1456
|
+
}, [field._id]);
|
|
1457
|
+
});
|
|
1458
|
+
return newView;
|
|
1459
|
+
}
|
|
1460
|
+
function removeView(aiTable, records, fields, activeViewId) {
|
|
1461
|
+
records.forEach((record) => {
|
|
1462
|
+
PositionActions.removeRecordPosition(aiTable, [activeViewId, record._id]);
|
|
1463
|
+
});
|
|
1464
|
+
fields.forEach((field) => {
|
|
1465
|
+
const positions = { ...field.positions };
|
|
1466
|
+
delete positions[activeViewId];
|
|
1467
|
+
Actions.setField(aiTable, {
|
|
1468
|
+
positions
|
|
1469
|
+
}, [field._id]);
|
|
1470
|
+
});
|
|
1471
|
+
ViewActions.removeView(aiTable, [activeViewId]);
|
|
1472
|
+
}
|
|
1473
|
+
|
|
1474
|
+
function addRecords(aiTable, options) {
|
|
1475
|
+
const { originId, direction = Direction$1.after, isDuplicate, count = 1 } = options;
|
|
1476
|
+
const activeView = aiTable.viewsMap()[aiTable.activeViewId()];
|
|
1477
|
+
const records = getSortRecords(aiTable, aiTable.records(), activeView);
|
|
1478
|
+
let addIndex = records.findIndex((item) => item._id === originId);
|
|
1479
|
+
if (direction === Direction$1.after) {
|
|
1480
|
+
addIndex++;
|
|
1481
|
+
}
|
|
1482
|
+
const newRecordIds = getNewIdsByCount(count);
|
|
1483
|
+
const newRecordValues = getDefaultRecordValues(aiTable, isDuplicate, originId);
|
|
1484
|
+
// TODO: 判断如果存在筛选条件,且 newRecordValues 中没有一项满足筛选条件
|
|
1485
|
+
// 把 id 添加到 RECORDS_WILL_HIDDEN 中
|
|
1486
|
+
if (activeView.settings?.conditions?.length) {
|
|
1487
|
+
aiTable.recordsWillHidden?.update((value) => {
|
|
1488
|
+
value.push(...newRecordIds);
|
|
1489
|
+
return [...value];
|
|
1490
|
+
});
|
|
1491
|
+
}
|
|
1492
|
+
newRecordIds.forEach((id, index) => {
|
|
1493
|
+
const newRecord = { _id: id, values: newRecordValues };
|
|
1494
|
+
Actions.addRecord(aiTable, newRecord, [addIndex + index]);
|
|
1495
|
+
});
|
|
1496
|
+
}
|
|
1497
|
+
function getDefaultRecordValues(aiTable, isDuplicate = false, recordId) {
|
|
1498
|
+
let newRecordValues = {};
|
|
1499
|
+
if (isDuplicate && recordId) {
|
|
1500
|
+
newRecordValues = aiTable.recordsMap()[recordId].values;
|
|
1501
|
+
}
|
|
1502
|
+
else {
|
|
1503
|
+
const activeView = aiTable.viewsMap()[aiTable.activeViewId()];
|
|
1504
|
+
const fields = getSortFields(aiTable, aiTable.fields(), activeView);
|
|
1505
|
+
fields.map((item) => {
|
|
1506
|
+
newRecordValues[item._id] = getDefaultFieldValue(item);
|
|
1507
|
+
});
|
|
1508
|
+
const { conditions, condition_logical } = activeView.settings || {};
|
|
1509
|
+
if (conditions && conditions.length) {
|
|
1510
|
+
newRecordValues = getDefaultRecordDataByFilter(newRecordValues, conditions, condition_logical);
|
|
1511
|
+
}
|
|
1512
|
+
}
|
|
1513
|
+
return newRecordValues;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
function updateFieldValue(aiTable, options) {
|
|
1517
|
+
Actions.updateFieldValue(aiTable, options.value, options.path);
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
const FLUSHING = new WeakMap();
|
|
1521
|
+
|
|
1522
|
+
const withState = (aiTable) => {
|
|
1523
|
+
const viewTable = aiTable;
|
|
1524
|
+
viewTable.actions = [];
|
|
1525
|
+
viewTable.apply = (action) => {
|
|
1526
|
+
viewTable.actions.push(action);
|
|
1527
|
+
Actions.transform(viewTable, action);
|
|
1528
|
+
if (!FLUSHING.get(viewTable)) {
|
|
1529
|
+
FLUSHING.set(viewTable, true);
|
|
1530
|
+
Promise.resolve().then(() => {
|
|
1531
|
+
FLUSHING.set(viewTable, false);
|
|
1532
|
+
viewTable.onChange();
|
|
1533
|
+
viewTable.actions = [];
|
|
1534
|
+
});
|
|
1535
|
+
}
|
|
1536
|
+
};
|
|
1537
|
+
return aiTable;
|
|
1538
|
+
};
|
|
1539
|
+
|
|
1540
|
+
const DividerMenuItem = {
|
|
1541
|
+
type: 'divider'
|
|
1542
|
+
};
|
|
1543
|
+
const EditFieldPropertyItem = {
|
|
1544
|
+
type: 'editFieldProperty',
|
|
1545
|
+
name: '编辑列',
|
|
1546
|
+
icon: 'edit',
|
|
1547
|
+
exec: (aiTable, field, origin, position) => {
|
|
1548
|
+
const fieldService = AI_TABLE_GRID_FIELD_SERVICE_MAP.get(aiTable);
|
|
1549
|
+
const copyField = _.cloneDeep(field());
|
|
1550
|
+
if (origin && position) {
|
|
1551
|
+
const popoverRef = fieldService?.editFieldProperty(aiTable, {
|
|
1552
|
+
field: copyField,
|
|
1553
|
+
isUpdate: true,
|
|
1554
|
+
origin: origin,
|
|
1555
|
+
position
|
|
1556
|
+
});
|
|
1557
|
+
if (popoverRef && fieldService && !fieldService.aiFieldConfig?.fieldPropertyEditor) {
|
|
1558
|
+
popoverRef.componentInstance.setField.subscribe((value) => {
|
|
1559
|
+
Actions.setField(aiTable, value.field, value.path);
|
|
1560
|
+
});
|
|
1561
|
+
}
|
|
1562
|
+
return popoverRef;
|
|
1563
|
+
}
|
|
1564
|
+
return undefined;
|
|
1565
|
+
}
|
|
1566
|
+
};
|
|
1567
|
+
const RemoveFieldItem = {
|
|
1568
|
+
type: 'removeField',
|
|
1569
|
+
name: '删除列',
|
|
1570
|
+
icon: 'trash',
|
|
1571
|
+
exec: (aiTable, field) => {
|
|
1572
|
+
Actions.removeField(aiTable, [field()._id]);
|
|
1573
|
+
}
|
|
1574
|
+
};
|
|
1575
|
+
|
|
1576
|
+
const VIEW_ACTIONS = [ActionName.SetView, ActionName.AddView, ActionName.RemoveView];
|
|
1160
1577
|
|
|
1161
1578
|
/**
|
|
1162
1579
|
* Generated bundle index. Do not edit.
|
|
1163
1580
|
*/
|
|
1164
1581
|
|
|
1165
|
-
export { AITableFilterLogical, AITableFilterOperation,
|
|
1582
|
+
export { AITableFilterLogical, AITableFilterOperation, ActionName, Actions, Direction, DividerMenuItem, EditFieldPropertyItem, ExecuteType, FLUSHING, Positions, RemoveFieldItem, VIEW_ACTIONS, ViewOperationMap, YjsAITable, actionMappers, addFields, addRecords, addView, applyActionOps, applyEvents, applyYjsEvents, buildFieldsByView, buildRecordsByView, createDefaultPositions, createSharedType, doFilter, getDefaultRecordDataByFilter, getDefaultRecordValues, getFilteredRecords, getNewIdsByCount, getPosition, getShareTypeNumberPath, getSharedMapValueId, getSharedMapValueIndex, getSharedRecordId, getSharedRecordIndex, getSortFields, getSortRecords, initSharedType, initTable, isEmpty, isPathEqual, removeView, sortByViewPosition, sortRecordsBySortInfo, toRecordSyncElement, toSharedType, toSyncElement, translatePositionToPath, translateToRecordValues, translateToRecords, translateYjsEvent, updateFieldValue, withState };
|
|
1166
1583
|
//# sourceMappingURL=ai-table-state.mjs.map
|