@ai-table/state 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. package/action/general.d.ts.map +1 -1
  2. package/action/index.d.ts +2 -2
  3. package/action/position.d.ts +5 -7
  4. package/action/position.d.ts.map +1 -1
  5. package/action/record.d.ts +3 -1
  6. package/action/record.d.ts.map +1 -1
  7. package/constants/field-menu-item.d.ts +1 -7
  8. package/constants/field-menu-item.d.ts.map +1 -1
  9. package/esm2022/action/general.mjs +26 -13
  10. package/esm2022/action/index.mjs +3 -3
  11. package/esm2022/action/position.mjs +7 -15
  12. package/esm2022/action/record.mjs +11 -2
  13. package/esm2022/constants/field-menu-item.mjs +1 -9
  14. package/esm2022/shared/to-table/array-event.mjs +49 -27
  15. package/esm2022/shared/to-yjs/add-node.mjs +30 -15
  16. package/esm2022/shared/to-yjs/index.mjs +15 -14
  17. package/esm2022/shared/to-yjs/remove-node.mjs +2 -14
  18. package/esm2022/shared/to-yjs/set-node.mjs +2 -2
  19. package/esm2022/shared/to-yjs/update-field-value.mjs +2 -2
  20. package/esm2022/shared/utils/index.mjs +2 -3
  21. package/esm2022/shared/utils/initialize.mjs +50 -0
  22. package/esm2022/shared/utils/translate.mjs +75 -18
  23. package/esm2022/types/action.mjs +3 -3
  24. package/esm2022/types/shared.mjs +1 -1
  25. package/esm2022/types/view.mjs +3 -1
  26. package/esm2022/utils/field/add-fields.mjs +6 -4
  27. package/esm2022/utils/field/remove-field.mjs +14 -0
  28. package/esm2022/utils/index.mjs +3 -1
  29. package/esm2022/utils/record/add-records.mjs +3 -3
  30. package/esm2022/utils/record/update-field-value.mjs +3 -2
  31. package/esm2022/utils/record/update-system-field-value.mjs +8 -0
  32. package/esm2022/utils/view.mjs +4 -4
  33. package/fesm2022/ai-table-state.mjs +265 -165
  34. package/fesm2022/ai-table-state.mjs.map +1 -1
  35. package/package.json +1 -1
  36. package/shared/to-table/array-event.d.ts +5 -2
  37. package/shared/to-table/array-event.d.ts.map +1 -1
  38. package/shared/to-yjs/add-node.d.ts +3 -2
  39. package/shared/to-yjs/add-node.d.ts.map +1 -1
  40. package/shared/to-yjs/index.d.ts +2 -2
  41. package/shared/to-yjs/index.d.ts.map +1 -1
  42. package/shared/to-yjs/remove-node.d.ts +3 -2
  43. package/shared/to-yjs/remove-node.d.ts.map +1 -1
  44. package/shared/to-yjs/set-node.d.ts +2 -1
  45. package/shared/to-yjs/set-node.d.ts.map +1 -1
  46. package/shared/to-yjs/update-field-value.d.ts +2 -1
  47. package/shared/to-yjs/update-field-value.d.ts.map +1 -1
  48. package/shared/utils/index.d.ts +1 -2
  49. package/shared/utils/index.d.ts.map +1 -1
  50. package/shared/utils/initialize.d.ts +20 -0
  51. package/shared/utils/initialize.d.ts.map +1 -0
  52. package/shared/utils/translate.d.ts +18 -7
  53. package/shared/utils/translate.d.ts.map +1 -1
  54. package/types/action.d.ts +14 -13
  55. package/types/action.d.ts.map +1 -1
  56. package/types/shared.d.ts +9 -1
  57. package/types/shared.d.ts.map +1 -1
  58. package/types/view.d.ts +3 -0
  59. package/types/view.d.ts.map +1 -1
  60. package/utils/field/add-fields.d.ts +2 -2
  61. package/utils/field/add-fields.d.ts.map +1 -1
  62. package/utils/field/remove-field.d.ts +9 -0
  63. package/utils/field/remove-field.d.ts.map +1 -0
  64. package/utils/index.d.ts +2 -0
  65. package/utils/index.d.ts.map +1 -1
  66. package/utils/record/add-records.d.ts +2 -2
  67. package/utils/record/add-records.d.ts.map +1 -1
  68. package/utils/record/update-field-value.d.ts +2 -2
  69. package/utils/record/update-field-value.d.ts.map +1 -1
  70. package/utils/record/update-system-field-value.d.ts +4 -0
  71. package/utils/record/update-system-field-value.d.ts.map +1 -0
  72. package/esm2022/shared/utils/init-shared.mjs +0 -48
  73. package/esm2022/shared/utils/init-table.mjs +0 -13
  74. package/shared/utils/init-shared.d.ts +0 -16
  75. package/shared/utils/init-shared.d.ts.map +0 -1
  76. package/shared/utils/init-table.d.ts +0 -7
  77. package/shared/utils/init-table.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import * as Y from 'yjs';
2
2
  import { isArray, isEmpty as isEmpty$1, isObject, isUndefinedOrNull, TinyDate } from 'ngx-tethys/util';
3
- import { AITableQueries, getDefaultFieldValue, idCreator, AITableFieldType, Direction as Direction$1, AI_TABLE_GRID_FIELD_SERVICE_MAP } from '@ai-table/grid';
3
+ import { AITableQueries, idCreator, AITableFieldType, getDefaultFieldValue, Direction as Direction$1, AI_TABLE_GRID_FIELD_SERVICE_MAP } from '@ai-table/grid';
4
4
  import _, { isEqual } from 'lodash';
5
5
  import { fromUnixTime, subDays } from 'date-fns';
6
6
  import { createDraft, finishDraft } from 'immer';
@@ -46,6 +46,8 @@ const YjsAITable = {
46
46
 
47
47
  class Positions {
48
48
  }
49
+ class RemovePositions {
50
+ }
49
51
  var Direction;
50
52
  (function (Direction) {
51
53
  Direction[Direction["default"] = 0] = "default";
@@ -88,8 +90,8 @@ var ActionName;
88
90
  ActionName["SetView"] = "set_view";
89
91
  ActionName["AddView"] = "add_view";
90
92
  ActionName["RemoveView"] = "remove_view";
91
- ActionName["AddRecordPosition"] = "add_record_position";
92
- ActionName["RemoveRecordPosition"] = "remove_record_position";
93
+ ActionName["SetRecordPositions"] = "set_record_positions";
94
+ ActionName["UpdateSystemFieldValue"] = "update_system_field_value";
93
95
  })(ActionName || (ActionName = {}));
94
96
  var ExecuteType;
95
97
  (function (ExecuteType) {
@@ -98,29 +100,9 @@ var ExecuteType;
98
100
  ExecuteType[ExecuteType["Redo"] = 2] = "Redo";
99
101
  })(ExecuteType || (ExecuteType = {}));
100
102
 
101
- const createSharedType = () => {
102
- const doc = new Y.Doc();
103
- const sharedType = doc.getMap('ai-table');
104
- return sharedType;
105
- };
106
- const initSharedType = (doc, initializeValue) => {
107
- const sharedType = doc.getMap('ai-table');
108
- toSharedType(sharedType, initializeValue);
109
- return sharedType;
110
- };
111
- function toSharedType(sharedType, data) {
112
- sharedType.doc.transact(() => {
113
- const fieldSharedType = new Y.Array();
114
- fieldSharedType.insert(0, data.fields.map(toSyncElement));
115
- sharedType.set('fields', fieldSharedType);
116
- const recordSharedType = new Y.Array();
117
- sharedType.set('records', recordSharedType);
118
- recordSharedType.insert(0, data.records.map(toRecordSyncElement));
119
- const viewsSharedType = new Y.Array();
120
- sharedType.set('views', viewsSharedType);
121
- viewsSharedType.insert(0, data.views.map(toSyncElement));
122
- });
123
- }
103
+ const POSITIONS_INDEX = 3;
104
+ const UPDATED_AT_INDEX = 4;
105
+ const UPDATED_BY_INDEX = 5;
124
106
  function toSyncElement(node) {
125
107
  const element = new Y.Map();
126
108
  for (const key in node) {
@@ -128,41 +110,21 @@ function toSyncElement(node) {
128
110
  }
129
111
  return element;
130
112
  }
131
- function toRecordSyncElement(record) {
132
- const nonEditableArray = new Y.Array();
113
+ function toRecordSyncElement(record, fields) {
114
+ const systemFieldValues = new Y.Array();
133
115
  // 临时方案:为了解决删除时协同操作无法精准获取删除的 id 的问题,将原来的[idValue] 改为[{'_id': idValue}]
134
- // 后续可能改为 YMap 或者通过在 views 中存储 positions 解决
135
- nonEditableArray.insert(0, [{ _id: record['_id'] }]);
136
- const editableArray = new Y.Array();
137
- const editableFields = [];
138
- for (const fieldId in record['values']) {
139
- editableFields.push(record['values'][fieldId]);
140
- }
141
- editableArray.insert(0, [...editableFields, record['positions']]);
116
+ systemFieldValues.insert(0, getSystemFieldValues(record));
117
+ const customFieldValues = new Y.Array();
118
+ const valuesArray = [];
119
+ fields.forEach((field) => {
120
+ valuesArray.push(record['values'][field._id]);
121
+ });
122
+ customFieldValues.insert(0, valuesArray);
142
123
  // To save memory, convert map to array.
143
124
  const element = new Y.Array();
144
- element.insert(0, [nonEditableArray, editableArray]);
125
+ element.insert(0, [systemFieldValues, customFieldValues]);
145
126
  return element;
146
127
  }
147
-
148
- const translateToRecordValues = (arrayRecord, fields) => {
149
- const fieldIds = fields.map((item) => item._id);
150
- const recordValue = {};
151
- fieldIds.forEach((item, index) => {
152
- recordValue[item] = arrayRecord[index] || '';
153
- });
154
- return recordValue;
155
- };
156
- const translateToRecords = (arrayRecords, fields) => {
157
- return arrayRecords.map((record) => {
158
- const [nonEditableArray, editableArray] = record;
159
- return {
160
- _id: nonEditableArray[0]['_id'],
161
- positions: editableArray[editableArray.length - 1],
162
- values: translateToRecordValues(editableArray.slice(0, editableArray.length - 1), fields)
163
- };
164
- });
165
- };
166
128
  function translatePositionToPath(data, position, activeViewId) {
167
129
  let index = data.findIndex((value, index) => {
168
130
  if (index === 0) {
@@ -181,6 +143,9 @@ function getShareTypeNumberPath(path) {
181
143
  function getSharedRecordId(records, recordIndex) {
182
144
  return records && records.get(recordIndex).get(0).get(0)['_id'];
183
145
  }
146
+ function getSharedRecord(records, recordIndex) {
147
+ return records && records.get(recordIndex);
148
+ }
184
149
  function getSharedMapValueId(values, index) {
185
150
  return values && values.get(index).get('_id');
186
151
  }
@@ -206,11 +171,62 @@ function getSharedMapValueIndex(sharedNodes, id) {
206
171
  }
207
172
  return nodeIndex;
208
173
  }
174
+ const getSystemFieldValues = (record) => {
175
+ return [{ _id: record['_id'] }, record.created_at, record.created_by, record['positions'], record.updated_at, record.updated_by];
176
+ };
177
+ const getCustomFieldValues = (record) => {
178
+ throw new Error('No implement');
179
+ };
180
+ const getValuesByCustomFieldValues = (customFieldValues, fields) => {
181
+ const fieldIds = fields.map((item) => item._id);
182
+ const recordValue = {};
183
+ fieldIds.forEach((item, index) => {
184
+ recordValue[item] = customFieldValues[index] || '';
185
+ });
186
+ return recordValue;
187
+ };
188
+ const getTrackableEntityBySystemFieldValues = (systemFieldValues) => {
189
+ return {
190
+ created_at: systemFieldValues[1],
191
+ created_by: systemFieldValues[2],
192
+ updated_at: systemFieldValues[4],
193
+ updated_by: systemFieldValues[5]
194
+ };
195
+ };
196
+ const getIdBySystemFieldValues = (systemFieldValues) => {
197
+ return systemFieldValues[0]['_id'];
198
+ };
199
+ const getIdBySystemFieldValuesType = (systemFieldValuesType) => {
200
+ return systemFieldValuesType.get(0)['_id'];
201
+ };
202
+ const getPositionsBySystemFieldValues = (systemFieldValues) => {
203
+ return systemFieldValues[POSITIONS_INDEX];
204
+ };
205
+ const getPositionsByRecordSyncElement = (recordSyncElement) => {
206
+ const systemFieldType = recordSyncElement.get(0);
207
+ const positions = systemFieldType.get(POSITIONS_INDEX);
208
+ return positions;
209
+ };
210
+ const setRecordPositions$1 = (recordSyncElement, newPositions) => {
211
+ const systemFieldType = recordSyncElement.get(0);
212
+ systemFieldType.delete(POSITIONS_INDEX);
213
+ systemFieldType.insert(POSITIONS_INDEX, [newPositions]);
214
+ };
215
+ const setRecordUpdatedInfo = (recordSyncElement, info) => {
216
+ const systemFieldType = recordSyncElement.get(0);
217
+ systemFieldType.delete(UPDATED_AT_INDEX, 2);
218
+ systemFieldType.insert(UPDATED_AT_INDEX, [info.updated_at, info.updated_by]);
219
+ };
209
220
 
210
- const initTable = (sharedType) => {
221
+ const createSharedType = () => {
222
+ const doc = new Y.Doc();
223
+ const sharedType = doc.getMap('ai-table');
224
+ return sharedType;
225
+ };
226
+ const getDataBySharedType = (sharedType) => {
211
227
  const data = sharedType.toJSON();
212
228
  const fields = data['fields'];
213
- const records = translateToRecords(data['records'], fields);
229
+ const records = getRecordsBySharedJson(data['records'], fields);
214
230
  const views = data['views'];
215
231
  return {
216
232
  records,
@@ -218,6 +234,37 @@ const initTable = (sharedType) => {
218
234
  views
219
235
  };
220
236
  };
237
+ const getSharedTypeByData = (doc, initializeValue) => {
238
+ const sharedType = doc.getMap('ai-table');
239
+ toSharedType(sharedType, initializeValue);
240
+ return sharedType;
241
+ };
242
+ function toSharedType(sharedType, data) {
243
+ sharedType.doc.transact(() => {
244
+ const fieldSharedType = new Y.Array();
245
+ fieldSharedType.insert(0, data.fields.map(toSyncElement));
246
+ sharedType.set('fields', fieldSharedType);
247
+ const recordSharedType = new Y.Array();
248
+ sharedType.set('records', recordSharedType);
249
+ recordSharedType.insert(0, data.records.map((record) => {
250
+ return toRecordSyncElement(record, data.fields);
251
+ }));
252
+ const viewsSharedType = new Y.Array();
253
+ sharedType.set('views', viewsSharedType);
254
+ viewsSharedType.insert(0, data.views.map(toSyncElement));
255
+ });
256
+ }
257
+ const getRecordsBySharedJson = (recordJsonArray, fields) => {
258
+ return recordJsonArray.map((record) => {
259
+ const [systemFieldValues, customFieldValues] = record;
260
+ return {
261
+ _id: getIdBySystemFieldValues(systemFieldValues),
262
+ ...getTrackableEntityBySystemFieldValues(systemFieldValues),
263
+ positions: getPositionsBySystemFieldValues(systemFieldValues),
264
+ values: getValuesByCustomFieldValues(customFieldValues, fields)
265
+ };
266
+ });
267
+ };
221
268
 
222
269
  function translateArrayEvent(aiTable, sharedType, event) {
223
270
  let offset = 0;
@@ -262,15 +309,18 @@ function translateArrayEvent(aiTable, sharedType, event) {
262
309
  if (isAddOrRemove(targetPath)) {
263
310
  delta.insert?.map((item) => {
264
311
  const data = item.toJSON();
265
- const [fixedField, customField] = data;
266
- const position = customField[customField.length - 1][activeViewId];
312
+ const [systemFieldValues, customFieldValues] = data;
313
+ const positions = getPositionsBySystemFieldValues(customFieldValues);
314
+ const position = positions[activeViewId];
267
315
  const path = translatePositionToPath(aiTable.records(), position, activeViewId);
268
316
  actions.push({
269
317
  type: ActionName.AddRecord,
270
318
  path: path,
271
319
  record: {
272
- _id: fixedField[0]['_id'],
273
- values: translateToRecordValues(customField, aiTable.fields())
320
+ _id: getIdBySystemFieldValues(systemFieldValues),
321
+ ...getTrackableEntityBySystemFieldValues(systemFieldValues),
322
+ positions: getPositionsBySystemFieldValues(customFieldValues),
323
+ values: getValuesByCustomFieldValues(customFieldValues, aiTable.fields())
274
324
  }
275
325
  });
276
326
  });
@@ -279,30 +329,34 @@ function translateArrayEvent(aiTable, sharedType, event) {
279
329
  try {
280
330
  const sharedRecords = sharedType.get('records');
281
331
  const sharedFields = sharedType.get('fields');
332
+ let systemFieldOffset = 0;
282
333
  delta.insert?.map((item) => {
283
334
  const recordIndex = targetPath[0];
284
335
  const fieldIndex = offset;
285
336
  const record = aiTable.records()[recordIndex];
286
- if (isPositionOperation(fieldIndex, sharedFields)) {
287
- for (const key in item) {
288
- if (!record.positions[key] && record.positions[key] !== 0) {
289
- actions.push({
290
- type: ActionName.AddRecordPosition,
291
- path: [record._id],
292
- position: {
293
- [key]: item[key]
294
- }
295
- });
337
+ if (isSystemFieldOperation(targetPath)) {
338
+ if (isPositionsOperation(fieldIndex)) {
339
+ const newPositions = {};
340
+ for (const key in item) {
341
+ newPositions[key] = item[key];
296
342
  }
343
+ actions.push({
344
+ type: ActionName.SetRecordPositions,
345
+ path: [record._id],
346
+ positions: newPositions
347
+ });
348
+ // 此处的循环会包含 updated_at 和 updated_by 各一次,这里只处理 updated_by 同时包含两个字段的修改
297
349
  }
298
- for (const key in record.positions) {
299
- if (!item[key] && item[key] !== 0) {
300
- actions.push({
301
- type: ActionName.RemoveRecordPosition,
302
- path: [key, record._id]
303
- });
304
- }
350
+ else if (isUpdatedByOperation(fieldIndex + systemFieldOffset)) {
351
+ const systemFieldValues = getSharedRecord(sharedRecords, recordIndex).get(0).toJSON();
352
+ const { updated_at, updated_by } = getTrackableEntityBySystemFieldValues(systemFieldValues);
353
+ actions.push({
354
+ type: ActionName.UpdateSystemFieldValue,
355
+ path: [record._id],
356
+ updatedInfo: { updated_at, updated_by }
357
+ });
305
358
  }
359
+ systemFieldOffset++;
306
360
  }
307
361
  else {
308
362
  const recordId = getSharedRecordId(sharedRecords, recordIndex);
@@ -353,8 +407,23 @@ function translateArrayEvent(aiTable, sharedType, event) {
353
407
  function isAddOrRemove(targetPath) {
354
408
  return targetPath.length === 0;
355
409
  }
356
- function isPositionOperation(fieldIndex, sharedFields) {
357
- return fieldIndex === sharedFields.length;
410
+ function isSystemFieldOperation(targetPath) {
411
+ if (targetPath.length === 2 && targetPath[1] === 0) {
412
+ return true;
413
+ }
414
+ return false;
415
+ }
416
+ function isCustomFieldOperation(targetPath) {
417
+ if (targetPath.length === 2 && targetPath[1] === 1) {
418
+ return true;
419
+ }
420
+ return false;
421
+ }
422
+ function isPositionsOperation(fieldIndex) {
423
+ return fieldIndex === POSITIONS_INDEX;
424
+ }
425
+ function isUpdatedByOperation(fieldIndex) {
426
+ return fieldIndex === UPDATED_BY_INDEX;
358
427
  }
359
428
  function getRemoveIds(event, type) {
360
429
  const ids = [];
@@ -450,7 +519,7 @@ function applyYjsEvents(aiTable, sharedType, events) {
450
519
  }
451
520
  }
452
521
 
453
- function updateFieldValue$2(sharedType, action) {
522
+ function updateFieldValue$2(aiTable, sharedType, action) {
454
523
  const sharedRecords = sharedType.get('records');
455
524
  const sharedFields = sharedType.get('fields');
456
525
  if (sharedRecords && sharedFields) {
@@ -466,7 +535,7 @@ function updateFieldValue$2(sharedType, action) {
466
535
  return sharedType;
467
536
  }
468
537
 
469
- function setNode(sharedType, action) {
538
+ function setNode(aiTable, sharedType, action) {
470
539
  let sharedNodes;
471
540
  if (action.type === ActionName.SetField) {
472
541
  sharedNodes = sharedType.get('fields');
@@ -496,27 +565,41 @@ function setNode(sharedType, action) {
496
565
  return sharedType;
497
566
  }
498
567
 
499
- function addNode(sharedType, action) {
568
+ function addNode(aiTable, sharedType, action) {
500
569
  const records = sharedType.get('records');
501
570
  const views = sharedType.get('views');
502
571
  const fields = sharedType.get('fields');
503
572
  switch (action.type) {
504
573
  case ActionName.AddRecord:
505
- records && records.push([toRecordSyncElement(action.record)]);
574
+ records && records.push([toRecordSyncElement(action.record, aiTable.fields())]);
506
575
  break;
507
576
  case ActionName.AddView:
508
577
  views && views.push([toSyncElement(action.view)]);
509
578
  break;
510
- case ActionName.AddRecordPosition:
579
+ case ActionName.SetRecordPositions:
580
+ if (records) {
581
+ const recordIndex = getSharedRecordIndex(records, action.path[0]);
582
+ const record = records.get(recordIndex);
583
+ const positions = getPositionsByRecordSyncElement(record);
584
+ const newPositions = { ...positions };
585
+ for (const key in action.positions) {
586
+ if (action.positions[key] === null || action.positions[key] === undefined) {
587
+ delete newPositions[key];
588
+ }
589
+ else {
590
+ newPositions[key] = action.positions[key];
591
+ }
592
+ }
593
+ setRecordPositions$1(record, newPositions);
594
+ }
595
+ break;
596
+ case ActionName.UpdateSystemFieldValue:
511
597
  if (records) {
512
598
  const recordIndex = getSharedRecordIndex(records, action.path[0]);
513
599
  const record = records.get(recordIndex);
514
- const customField = record.get(1);
515
- const positionsIndex = customField.length - 1;
516
- const positions = customField.get(positionsIndex);
517
- const newPositions = { ...positions, ...action.position };
518
- customField.delete(positionsIndex);
519
- customField.insert(positionsIndex, [newPositions]);
600
+ if (action.updatedInfo.updated_at && action.updatedInfo.updated_at) {
601
+ setRecordUpdatedInfo(record, action.updatedInfo);
602
+ }
520
603
  }
521
604
  break;
522
605
  case ActionName.AddField:
@@ -524,9 +607,11 @@ function addNode(sharedType, action) {
524
607
  fields.push([toSyncElement(action.field)]);
525
608
  const path = action.path[0];
526
609
  for (let value of records) {
527
- const newRecord = getDefaultFieldValue(action.field);
528
- const customField = value.get(1);
529
- customField.insert(path, [newRecord]);
610
+ const customFieldValues = value.get(1);
611
+ const systemFieldValues = value.get(0);
612
+ const recordEntity = aiTable.recordsMap()[getIdBySystemFieldValuesType(systemFieldValues)];
613
+ const newFieldValue = recordEntity.values[action.field._id];
614
+ customFieldValues.insert(path, [newFieldValue]);
530
615
  }
531
616
  }
532
617
  break;
@@ -534,7 +619,7 @@ function addNode(sharedType, action) {
534
619
  return sharedType;
535
620
  }
536
621
 
537
- function removeNode(sharedType, action) {
622
+ function removeNode(aiTable, sharedType, action) {
538
623
  const fields = sharedType.get('fields');
539
624
  const records = sharedType.get('records');
540
625
  const views = sharedType.get('views');
@@ -555,18 +640,6 @@ function removeNode(sharedType, action) {
555
640
  }
556
641
  }
557
642
  break;
558
- case ActionName.RemoveRecordPosition:
559
- if (records) {
560
- const recordIndex = getSharedRecordIndex(records, action.path[1]);
561
- const record = records.get(recordIndex);
562
- const customField = record.get(1);
563
- const positionsIndex = customField.length - 1;
564
- const positions = customField.get(positionsIndex);
565
- delete positions[action.path[0]];
566
- customField.delete(positionsIndex);
567
- customField.insert(positionsIndex, [positions]);
568
- }
569
- break;
570
643
  case ActionName.RemoveField:
571
644
  if (fields && records) {
572
645
  const fieldIndex = getSharedMapValueIndex(fields, action.path[0]);
@@ -583,25 +656,25 @@ function removeNode(sharedType, action) {
583
656
  }
584
657
 
585
658
  const actionMappers = {
586
- add_record: addNode,
587
- update_field_value: updateFieldValue$2,
588
- remove_record: removeNode,
589
- add_field: addNode,
590
- set_field: setNode,
591
- remove_field: removeNode,
592
- set_view: setNode,
593
- add_view: addNode,
594
- remove_view: removeNode,
595
- add_record_position: addNode,
596
- remove_record_position: removeNode
659
+ [ActionName.AddRecord]: addNode,
660
+ [ActionName.UpdateFieldValue]: updateFieldValue$2,
661
+ [ActionName.RemoveRecord]: removeNode,
662
+ [ActionName.AddField]: addNode,
663
+ [ActionName.SetField]: setNode,
664
+ [ActionName.RemoveField]: removeNode,
665
+ [ActionName.SetView]: setNode,
666
+ [ActionName.AddView]: addNode,
667
+ [ActionName.RemoveView]: removeNode,
668
+ [ActionName.SetRecordPositions]: addNode,
669
+ [ActionName.UpdateSystemFieldValue]: addNode
597
670
  };
598
- function applyActionOps(sharedType, actions, aiTable) {
671
+ function applyActionOps(aiTable, sharedType, actions) {
599
672
  if (actions.length > 0) {
600
673
  sharedType.doc.transact(() => {
601
674
  actions.forEach((action) => {
602
675
  const apply = actionMappers[action.type];
603
676
  if (apply) {
604
- return apply(sharedType, action);
677
+ return apply(aiTable, sharedType, action);
605
678
  }
606
679
  return null;
607
680
  });
@@ -1108,6 +1181,19 @@ const apply = (aiTable, records, fields, views, action) => {
1108
1181
  }
1109
1182
  break;
1110
1183
  }
1184
+ case ActionName.UpdateSystemFieldValue: {
1185
+ const [recordId] = action.path;
1186
+ if (recordId && action.updatedInfo) {
1187
+ const recordIndex = aiTable.records().findIndex((item) => item._id === recordId);
1188
+ if (action.updatedInfo.updated_at) {
1189
+ records[recordIndex].updated_at = action.updatedInfo.updated_at;
1190
+ }
1191
+ if (action.updatedInfo.updated_by) {
1192
+ records[recordIndex].updated_by = action.updatedInfo.updated_by;
1193
+ }
1194
+ }
1195
+ break;
1196
+ }
1111
1197
  case ActionName.AddRecord: {
1112
1198
  const [recordIndex] = action.path;
1113
1199
  if (recordIndex > -1) {
@@ -1237,23 +1323,23 @@ const apply = (aiTable, records, fields, views, action) => {
1237
1323
  }
1238
1324
  break;
1239
1325
  }
1240
- case ActionName.AddRecordPosition: {
1241
- const { position, path } = action;
1326
+ case ActionName.SetRecordPositions: {
1327
+ const { positions, path } = action;
1242
1328
  const record = records.find((item) => item._id === path[0]);
1243
1329
  if (record) {
1244
- record.positions = {
1245
- ...record.positions,
1246
- ...position
1247
- };
1330
+ const newPositions = { ...record.positions };
1331
+ for (const key in positions) {
1332
+ if (positions[key] === null || positions[key] === undefined) {
1333
+ delete newPositions[key];
1334
+ }
1335
+ else {
1336
+ newPositions[key] = positions[key];
1337
+ }
1338
+ }
1339
+ record.positions = newPositions;
1248
1340
  }
1249
1341
  break;
1250
1342
  }
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
1343
  }
1258
1344
  return {
1259
1345
  records,
@@ -1273,24 +1359,16 @@ const GeneralActions = {
1273
1359
  }
1274
1360
  };
1275
1361
 
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) {
1362
+ function setRecordPositions(aiTable, positions, path) {
1285
1363
  const operation = {
1286
- type: ActionName.RemoveRecordPosition,
1364
+ type: ActionName.SetRecordPositions,
1365
+ positions,
1287
1366
  path
1288
1367
  };
1289
1368
  aiTable.apply(operation);
1290
1369
  }
1291
- const PositionActions = {
1292
- setRecordPosition,
1293
- removeRecordPosition
1370
+ const PositionsActions = {
1371
+ setRecordPositions
1294
1372
  };
1295
1373
 
1296
1374
  function updateFieldValue$1(aiTable, value, path) {
@@ -1305,6 +1383,14 @@ function updateFieldValue$1(aiTable, value, path) {
1305
1383
  aiTable.apply(operation);
1306
1384
  }
1307
1385
  }
1386
+ function updateSystemFieldValue(aiTable, path, updatedInfo) {
1387
+ const operation = {
1388
+ type: ActionName.UpdateSystemFieldValue,
1389
+ updatedInfo,
1390
+ path
1391
+ };
1392
+ aiTable.apply(operation);
1393
+ }
1308
1394
  function addRecord(aiTable, record, path) {
1309
1395
  const operation = {
1310
1396
  type: ActionName.AddRecord,
@@ -1332,7 +1418,8 @@ const RecordActions = {
1332
1418
  addRecord,
1333
1419
  updateFieldValue: updateFieldValue$1,
1334
1420
  moveRecord,
1335
- removeRecord
1421
+ removeRecord,
1422
+ updateSystemFieldValue
1336
1423
  };
1337
1424
 
1338
1425
  function setView(aiTable, value, path) {
@@ -1386,10 +1473,17 @@ const Actions = {
1386
1473
  ...RecordActions,
1387
1474
  ...FieldActions,
1388
1475
  ...ViewActions,
1389
- ...PositionActions
1476
+ ...PositionsActions
1390
1477
  };
1391
1478
 
1392
- function addFields(aiTable, options) {
1479
+ function updateRecordsUpdatedInfo(aiTable, updatedInfo) {
1480
+ const records = aiTable.records();
1481
+ records.forEach((item) => {
1482
+ Actions.updateSystemFieldValue(aiTable, [item._id], updatedInfo);
1483
+ });
1484
+ }
1485
+
1486
+ function addFields(aiTable, options, updatedInfo) {
1393
1487
  const { originId, direction = Direction$1.after, defaultValue, isDuplicate, count = 1 } = options;
1394
1488
  const activeView = aiTable.viewsMap()[aiTable.activeViewId()];
1395
1489
  const fields = getSortFields(aiTable, aiTable.fields(), activeView);
@@ -1397,13 +1491,26 @@ function addFields(aiTable, options) {
1397
1491
  if (direction === Direction$1.after) {
1398
1492
  addIndex++;
1399
1493
  }
1400
- const newRecordIds = getNewIdsByCount(count);
1401
- newRecordIds.forEach((id, index) => {
1494
+ const newFieldIds = getNewIdsByCount(count);
1495
+ newFieldIds.forEach((id, index) => {
1402
1496
  const newField = { _id: id, ...defaultValue };
1403
1497
  Actions.addField(aiTable, newField, [addIndex + index]);
1404
1498
  });
1499
+ updateRecordsUpdatedInfo(aiTable, updatedInfo);
1405
1500
  }
1406
1501
 
1502
+ const buildRemoveFieldItem = (getUpdatedInfo) => {
1503
+ return {
1504
+ type: 'removeField',
1505
+ name: '删除列',
1506
+ icon: 'trash',
1507
+ exec: (aiTable, field) => {
1508
+ Actions.removeField(aiTable, [field()._id]);
1509
+ updateRecordsUpdatedInfo(aiTable, getUpdatedInfo());
1510
+ }
1511
+ };
1512
+ };
1513
+
1407
1514
  function createDefaultPositions(views, activeId, data, index) {
1408
1515
  const positions = {};
1409
1516
  const position = getPosition(data, activeId, index);
@@ -1445,7 +1552,7 @@ function addView(aiTable, type) {
1445
1552
  }
1446
1553
  ViewActions.addView(aiTable, newView, [index]);
1447
1554
  aiTable.records().forEach((record) => {
1448
- PositionActions.setRecordPosition(aiTable, { [newId]: record.positions[originViewId] }, [record._id]);
1555
+ PositionsActions.setRecordPositions(aiTable, { [newId]: record.positions[originViewId] }, [record._id]);
1449
1556
  });
1450
1557
  aiTable.fields().forEach((field) => {
1451
1558
  Actions.setField(aiTable, {
@@ -1459,7 +1566,7 @@ function addView(aiTable, type) {
1459
1566
  }
1460
1567
  function removeView(aiTable, records, fields, activeViewId) {
1461
1568
  records.forEach((record) => {
1462
- PositionActions.removeRecordPosition(aiTable, [activeViewId, record._id]);
1569
+ PositionsActions.setRecordPositions(aiTable, { [activeViewId]: undefined }, [record._id]);
1463
1570
  });
1464
1571
  fields.forEach((field) => {
1465
1572
  const positions = { ...field.positions };
@@ -1471,7 +1578,7 @@ function removeView(aiTable, records, fields, activeViewId) {
1471
1578
  ViewActions.removeView(aiTable, [activeViewId]);
1472
1579
  }
1473
1580
 
1474
- function addRecords(aiTable, options) {
1581
+ function addRecords(aiTable, options, trackableEntity) {
1475
1582
  const { originId, direction = Direction$1.after, isDuplicate, count = 1 } = options;
1476
1583
  const activeView = aiTable.viewsMap()[aiTable.activeViewId()];
1477
1584
  const records = getSortRecords(aiTable, aiTable.records(), activeView);
@@ -1490,7 +1597,7 @@ function addRecords(aiTable, options) {
1490
1597
  });
1491
1598
  }
1492
1599
  newRecordIds.forEach((id, index) => {
1493
- const newRecord = { _id: id, values: newRecordValues };
1600
+ const newRecord = { _id: id, values: newRecordValues, ...trackableEntity };
1494
1601
  Actions.addRecord(aiTable, newRecord, [addIndex + index]);
1495
1602
  });
1496
1603
  }
@@ -1513,8 +1620,9 @@ function getDefaultRecordValues(aiTable, isDuplicate = false, recordId) {
1513
1620
  return newRecordValues;
1514
1621
  }
1515
1622
 
1516
- function updateFieldValue(aiTable, options) {
1623
+ function updateFieldValue(aiTable, options, updatedInfo) {
1517
1624
  Actions.updateFieldValue(aiTable, options.value, options.path);
1625
+ Actions.updateSystemFieldValue(aiTable, [options.path[0]], updatedInfo);
1518
1626
  }
1519
1627
 
1520
1628
  const FLUSHING = new WeakMap();
@@ -1564,14 +1672,6 @@ const EditFieldPropertyItem = {
1564
1672
  return undefined;
1565
1673
  }
1566
1674
  };
1567
- const RemoveFieldItem = {
1568
- type: 'removeField',
1569
- name: '删除列',
1570
- icon: 'trash',
1571
- exec: (aiTable, field) => {
1572
- Actions.removeField(aiTable, [field()._id]);
1573
- }
1574
- };
1575
1675
 
1576
1676
  const VIEW_ACTIONS = [ActionName.SetView, ActionName.AddView, ActionName.RemoveView];
1577
1677
 
@@ -1579,5 +1679,5 @@ const VIEW_ACTIONS = [ActionName.SetView, ActionName.AddView, ActionName.RemoveV
1579
1679
  * Generated bundle index. Do not edit.
1580
1680
  */
1581
1681
 
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 };
1682
+ export { AITableFilterLogical, AITableFilterOperation, ActionName, Actions, Direction, DividerMenuItem, EditFieldPropertyItem, ExecuteType, FLUSHING, POSITIONS_INDEX, Positions, RemovePositions, UPDATED_AT_INDEX, UPDATED_BY_INDEX, VIEW_ACTIONS, ViewOperationMap, YjsAITable, actionMappers, addFields, addRecords, addView, applyActionOps, applyEvents, applyYjsEvents, buildFieldsByView, buildRecordsByView, buildRemoveFieldItem, createDefaultPositions, createSharedType, doFilter, getCustomFieldValues, getDataBySharedType, getDefaultRecordDataByFilter, getDefaultRecordValues, getFilteredRecords, getIdBySystemFieldValues, getIdBySystemFieldValuesType, getNewIdsByCount, getPosition, getPositionsByRecordSyncElement, getPositionsBySystemFieldValues, getRecordsBySharedJson, getShareTypeNumberPath, getSharedMapValueId, getSharedMapValueIndex, getSharedRecord, getSharedRecordId, getSharedRecordIndex, getSharedTypeByData, getSortFields, getSortRecords, getSystemFieldValues, getTrackableEntityBySystemFieldValues, getValuesByCustomFieldValues, isEmpty, isPathEqual, removeView, setRecordPositions$1 as setRecordPositions, setRecordUpdatedInfo, sortByViewPosition, sortRecordsBySortInfo, toRecordSyncElement, toSharedType, toSyncElement, translatePositionToPath, translateYjsEvent, updateFieldValue, updateRecordsUpdatedInfo, withState };
1583
1683
  //# sourceMappingURL=ai-table-state.mjs.map