@ai-table/state 0.0.66 → 0.0.68
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 +3 -4
- package/action/field.d.ts.map +1 -1
- package/action/general.d.ts +2 -1
- package/action/general.d.ts.map +1 -1
- package/action/index.d.ts +3 -4
- package/action/index.d.ts.map +1 -1
- package/action/position.d.ts +2 -2
- package/action/position.d.ts.map +1 -1
- package/action/record.d.ts +3 -5
- package/action/record.d.ts.map +1 -1
- package/action/view.d.ts +3 -2
- package/action/view.d.ts.map +1 -1
- package/constants/field-menu-item.d.ts +2 -1
- package/constants/field-menu-item.d.ts.map +1 -1
- package/constants/index.d.ts +0 -1
- package/constants/index.d.ts.map +1 -1
- package/constants/view.d.ts +1 -1
- package/constants/view.d.ts.map +1 -1
- package/esm2022/action/field.mjs +3 -4
- package/esm2022/action/general.mjs +13 -39
- package/esm2022/action/position.mjs +2 -2
- package/esm2022/action/record.mjs +4 -16
- package/esm2022/action/view.mjs +15 -5
- package/esm2022/constants/field-menu-item.mjs +2 -2
- package/esm2022/constants/index.mjs +1 -2
- package/esm2022/constants/view.mjs +2 -2
- package/esm2022/plugins/state.plugin.mjs +1 -1
- package/esm2022/shared/index.mjs +2 -1
- package/esm2022/shared/to-table/index.mjs +3 -3
- package/esm2022/shared/to-table/map-event.mjs +2 -3
- package/esm2022/shared/to-yjs/add-node.mjs +14 -8
- package/esm2022/shared/to-yjs/index.mjs +2 -2
- package/esm2022/shared/to-yjs/remove-node.mjs +3 -3
- package/esm2022/shared/to-yjs/set-node.mjs +3 -3
- package/esm2022/shared/to-yjs/update-field-value.mjs +10 -4
- package/esm2022/shared/undo-manager.service.mjs +60 -0
- package/esm2022/shared/utils/index.mjs +1 -2
- package/esm2022/shared/utils/initialize.mjs +5 -5
- package/esm2022/types/ai-table.mjs +1 -1
- package/esm2022/types/index.mjs +1 -5
- package/esm2022/utils/build.mjs +1 -1
- package/esm2022/utils/common.mjs +1 -1
- package/esm2022/utils/field/add-fields.mjs +21 -14
- package/esm2022/utils/field/move-fields.mjs +1 -1
- package/esm2022/utils/field/position-field.mjs +1 -1
- package/esm2022/utils/field/remove-field.mjs +1 -1
- package/esm2022/utils/field/sort-fields.mjs +2 -2
- package/esm2022/utils/record/add-records.mjs +4 -3
- package/esm2022/utils/record/filter.mjs +4 -3
- package/esm2022/utils/record/move-records.mjs +1 -1
- package/esm2022/utils/record/sort.mjs +2 -1
- package/esm2022/utils/record/update-field-value.mjs +1 -1
- package/esm2022/utils/record/update-system-field-value.mjs +1 -1
- package/esm2022/utils/view.mjs +11 -9
- package/fesm2022/ai-table-state.mjs +208 -522
- package/fesm2022/ai-table-state.mjs.map +1 -1
- package/package.json +2 -4
- package/plugins/state.plugin.d.ts.map +1 -1
- package/shared/index.d.ts +1 -0
- package/shared/index.d.ts.map +1 -1
- package/shared/to-table/index.d.ts +2 -1
- package/shared/to-table/index.d.ts.map +1 -1
- package/shared/to-table/map-event.d.ts +2 -1
- package/shared/to-table/map-event.d.ts.map +1 -1
- package/shared/to-yjs/add-node.d.ts +2 -1
- package/shared/to-yjs/add-node.d.ts.map +1 -1
- package/shared/to-yjs/index.d.ts +1 -1
- package/shared/to-yjs/index.d.ts.map +1 -1
- package/shared/to-yjs/remove-node.d.ts +2 -1
- package/shared/to-yjs/remove-node.d.ts.map +1 -1
- package/shared/to-yjs/set-node.d.ts +2 -1
- package/shared/to-yjs/set-node.d.ts.map +1 -1
- package/shared/to-yjs/update-field-value.d.ts +2 -1
- package/shared/to-yjs/update-field-value.d.ts.map +1 -1
- package/shared/undo-manager.service.d.ts +21 -0
- package/shared/undo-manager.service.d.ts.map +1 -0
- package/shared/utils/index.d.ts +0 -1
- package/shared/utils/index.d.ts.map +1 -1
- package/shared/utils/initialize.d.ts +1 -1
- package/shared/utils/initialize.d.ts.map +1 -1
- package/types/ai-table.d.ts +3 -4
- package/types/ai-table.d.ts.map +1 -1
- package/types/index.d.ts +0 -4
- package/types/index.d.ts.map +1 -1
- package/utils/build.d.ts +3 -3
- package/utils/build.d.ts.map +1 -1
- package/utils/common.d.ts +2 -3
- package/utils/common.d.ts.map +1 -1
- package/utils/field/add-fields.d.ts +1 -1
- package/utils/field/add-fields.d.ts.map +1 -1
- package/utils/field/move-fields.d.ts +1 -1
- package/utils/field/move-fields.d.ts.map +1 -1
- package/utils/field/position-field.d.ts +1 -2
- package/utils/field/position-field.d.ts.map +1 -1
- package/utils/field/remove-field.d.ts +2 -1
- package/utils/field/remove-field.d.ts.map +1 -1
- package/utils/field/sort-fields.d.ts +2 -2
- package/utils/field/sort-fields.d.ts.map +1 -1
- package/utils/record/add-records.d.ts +1 -1
- package/utils/record/add-records.d.ts.map +1 -1
- package/utils/record/filter.d.ts +3 -2
- package/utils/record/filter.d.ts.map +1 -1
- package/utils/record/move-records.d.ts +1 -1
- package/utils/record/move-records.d.ts.map +1 -1
- package/utils/record/sort.d.ts +4 -4
- package/utils/record/sort.d.ts.map +1 -1
- package/utils/record/update-field-value.d.ts +1 -1
- package/utils/record/update-field-value.d.ts.map +1 -1
- package/utils/record/update-system-field-value.d.ts +1 -1
- package/utils/record/update-system-field-value.d.ts.map +1 -1
- package/utils/view.d.ts +4 -2
- package/utils/view.d.ts.map +1 -1
- package/constants/default.d.ts +0 -2
- package/constants/default.d.ts.map +0 -1
- package/esm2022/constants/default.mjs +0 -2
- package/esm2022/shared/to-table/array-event.mjs +0 -189
- package/esm2022/shared/utils/translate.mjs +0 -142
- package/esm2022/types/action.mjs +0 -23
- package/esm2022/types/shared.mjs +0 -2
- package/esm2022/types/view.mjs +0 -16
- package/shared/to-table/array-event.d.ts +0 -10
- package/shared/to-table/array-event.d.ts.map +0 -1
- package/shared/utils/translate.d.ts +0 -33
- package/shared/utils/translate.d.ts.map +0 -1
- package/types/action.d.ts +0 -88
- package/types/action.d.ts.map +0 -1
- package/types/shared.d.ts +0 -13
- package/types/shared.d.ts.map +0 -1
- package/types/view.d.ts +0 -50
- package/types/view.d.ts.map +0 -1
@@ -1,9 +1,12 @@
|
|
1
1
|
import * as Y from 'yjs';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import
|
2
|
+
import { UndoManager } from 'yjs';
|
3
|
+
import { getShareTypeNumberPath, ActionName, translateArrayEvent, getSharedRecordIndex, getSharedMapValueIndex, toMapSyncElement, getIdBySystemFieldValuesType, setRecordUpdatedInfo, getPositionsByRecordSyncElement, setRecordPositions as setRecordPositions$1, toRecordSyncElement, AI_TABLE_CONTENT_FIELD_NAME, getIdBySystemFieldValues, getShortIdBySystemFieldValues, getTrackableEntityBySystemFieldValues, getPositionsBySystemFieldValues, getValuesByCustomFieldValues, AITableFilterLogical, AITableFilterOperation, AITableFieldType, Direction } from '@ai-table/utils';
|
4
|
+
import * as i0 from '@angular/core';
|
5
|
+
import { signal, Injectable } from '@angular/core';
|
6
|
+
import { FieldModelMap, AITableQueries, isSystemField, getDefaultFieldValue, idCreator, shortIdCreator, generateNewName, idsCreator, shortIdsCreator, AI_TABLE_GRID_FIELD_SERVICE_MAP, AITable, isMac, buildClipboardData, writeToClipboard, getI18nTextByKey, AITableGridI18nKey, writeToAITable } from '@ai-table/grid';
|
5
7
|
import * as _ from 'lodash';
|
6
|
-
import ___default from 'lodash';
|
8
|
+
import ___default, { isEmpty } from 'lodash';
|
9
|
+
import { createDraft, finishDraft } from 'immer';
|
7
10
|
|
8
11
|
const IS_LOCAL = new WeakSet();
|
9
12
|
const IS_REMOTE = new WeakSet();
|
@@ -44,420 +47,6 @@ const YjsAITable = {
|
|
44
47
|
}
|
45
48
|
};
|
46
49
|
|
47
|
-
class Positions {
|
48
|
-
}
|
49
|
-
class RemovePositions {
|
50
|
-
}
|
51
|
-
var Direction;
|
52
|
-
(function (Direction) {
|
53
|
-
Direction[Direction["default"] = 0] = "default";
|
54
|
-
Direction[Direction["ascending"] = 1] = "ascending";
|
55
|
-
Direction[Direction["descending"] = -1] = "descending";
|
56
|
-
})(Direction || (Direction = {}));
|
57
|
-
var AITableFilterLogical;
|
58
|
-
(function (AITableFilterLogical) {
|
59
|
-
AITableFilterLogical["and"] = "and";
|
60
|
-
AITableFilterLogical["or"] = "or";
|
61
|
-
})(AITableFilterLogical || (AITableFilterLogical = {}));
|
62
|
-
|
63
|
-
var ActionName;
|
64
|
-
(function (ActionName) {
|
65
|
-
ActionName["UpdateFieldValue"] = "update_field_value";
|
66
|
-
ActionName["AddRecord"] = "add_record";
|
67
|
-
ActionName["AddField"] = "add_field";
|
68
|
-
ActionName["MoveField"] = "move_field";
|
69
|
-
ActionName["MoveRecord"] = "move_record";
|
70
|
-
ActionName["RemoveField"] = "remove_field";
|
71
|
-
ActionName["RemoveRecord"] = "remove_record";
|
72
|
-
ActionName["SetField"] = "set_field";
|
73
|
-
ActionName["SetView"] = "set_view";
|
74
|
-
ActionName["AddView"] = "add_view";
|
75
|
-
ActionName["RemoveView"] = "remove_view";
|
76
|
-
ActionName["SetRecordPositions"] = "set_record_positions";
|
77
|
-
ActionName["UpdateSystemFieldValue"] = "update_system_field_value";
|
78
|
-
})(ActionName || (ActionName = {}));
|
79
|
-
var ExecuteType;
|
80
|
-
(function (ExecuteType) {
|
81
|
-
ExecuteType[ExecuteType["Execute"] = 0] = "Execute";
|
82
|
-
ExecuteType[ExecuteType["Undo"] = 1] = "Undo";
|
83
|
-
ExecuteType[ExecuteType["Redo"] = 2] = "Redo";
|
84
|
-
})(ExecuteType || (ExecuteType = {}));
|
85
|
-
|
86
|
-
var SystemFieldIndex;
|
87
|
-
(function (SystemFieldIndex) {
|
88
|
-
SystemFieldIndex[SystemFieldIndex["Id"] = 0] = "Id";
|
89
|
-
SystemFieldIndex[SystemFieldIndex["ShortId"] = 1] = "ShortId";
|
90
|
-
SystemFieldIndex[SystemFieldIndex["CreatedAt"] = 2] = "CreatedAt";
|
91
|
-
SystemFieldIndex[SystemFieldIndex["CreatedBy"] = 3] = "CreatedBy";
|
92
|
-
SystemFieldIndex[SystemFieldIndex["Positions"] = 4] = "Positions";
|
93
|
-
SystemFieldIndex[SystemFieldIndex["UpdatedAt"] = 5] = "UpdatedAt";
|
94
|
-
SystemFieldIndex[SystemFieldIndex["UpdatedBy"] = 6] = "UpdatedBy";
|
95
|
-
})(SystemFieldIndex || (SystemFieldIndex = {}));
|
96
|
-
function toSyncElement(node) {
|
97
|
-
const element = new Y.Map();
|
98
|
-
for (const key in node) {
|
99
|
-
element.set(key, node[key]);
|
100
|
-
}
|
101
|
-
return element;
|
102
|
-
}
|
103
|
-
function toRecordSyncElement(record, fields) {
|
104
|
-
const systemFieldValues = new Y.Array();
|
105
|
-
// 临时方案:为了解决删除时协同操作无法精准获取删除的 id 的问题,将原来的[idValue] 改为[{'_id': idValue}]
|
106
|
-
systemFieldValues.insert(0, getSystemFieldValues(record));
|
107
|
-
const customFieldValues = new Y.Array();
|
108
|
-
const valuesArray = [];
|
109
|
-
fields.forEach((field) => {
|
110
|
-
let value = record['values'][field._id];
|
111
|
-
// yjs will throw an error if the value is undefined.
|
112
|
-
if (value === undefined) {
|
113
|
-
value = null;
|
114
|
-
}
|
115
|
-
valuesArray.push(value);
|
116
|
-
});
|
117
|
-
customFieldValues.insert(0, valuesArray);
|
118
|
-
// To save memory, convert map to array.
|
119
|
-
const element = new Y.Array();
|
120
|
-
element.insert(0, [systemFieldValues, customFieldValues]);
|
121
|
-
return element;
|
122
|
-
}
|
123
|
-
function translatePositionToPath(data, position, activeViewId, indexOffset = 0) {
|
124
|
-
let index = data.findIndex((value, index) => {
|
125
|
-
if (index === 0) {
|
126
|
-
return position < value.positions[activeViewId];
|
127
|
-
}
|
128
|
-
return position > data[index - 1].positions[activeViewId] && position < value.positions[activeViewId];
|
129
|
-
});
|
130
|
-
if (index === -1) {
|
131
|
-
index = data.length;
|
132
|
-
}
|
133
|
-
return [index + indexOffset];
|
134
|
-
}
|
135
|
-
function getShareTypeNumberPath(path) {
|
136
|
-
return path.filter((node) => typeof node === 'number');
|
137
|
-
}
|
138
|
-
function getSharedRecordId(records, recordIndex) {
|
139
|
-
return records && records.get(recordIndex).get(0).get(0)['_id'];
|
140
|
-
}
|
141
|
-
function getSharedRecord(records, recordIndex) {
|
142
|
-
return records && records.get(recordIndex);
|
143
|
-
}
|
144
|
-
function getSharedMapValueId(values, index) {
|
145
|
-
return values && values.get(index).get('_id');
|
146
|
-
}
|
147
|
-
function getSharedRecordIndex(sharedRecords, recordId) {
|
148
|
-
let recordIndex = -1;
|
149
|
-
for (let index = 0; index < sharedRecords.length; index++) {
|
150
|
-
const sharedRecordId = getSharedRecordId(sharedRecords, index);
|
151
|
-
if (sharedRecordId === recordId) {
|
152
|
-
recordIndex = index;
|
153
|
-
break;
|
154
|
-
}
|
155
|
-
}
|
156
|
-
return recordIndex;
|
157
|
-
}
|
158
|
-
function getSharedMapValueIndex(sharedNodes, id) {
|
159
|
-
let nodeIndex = -1;
|
160
|
-
for (let index = 0; index < sharedNodes.length; index++) {
|
161
|
-
const sharedId = getSharedMapValueId(sharedNodes, index);
|
162
|
-
if (sharedId === id) {
|
163
|
-
nodeIndex = index;
|
164
|
-
break;
|
165
|
-
}
|
166
|
-
}
|
167
|
-
return nodeIndex;
|
168
|
-
}
|
169
|
-
const getSystemFieldValues = (record) => {
|
170
|
-
return [
|
171
|
-
{ _id: record['_id'] },
|
172
|
-
record.short_id,
|
173
|
-
record.created_at,
|
174
|
-
record.created_by,
|
175
|
-
record['positions'],
|
176
|
-
record.updated_at,
|
177
|
-
record.updated_by
|
178
|
-
];
|
179
|
-
};
|
180
|
-
const getCustomFieldValues = (record) => {
|
181
|
-
throw new Error('No implement');
|
182
|
-
};
|
183
|
-
const getValuesByCustomFieldValues = (customFieldValues, fields) => {
|
184
|
-
const fieldIds = fields.map((item) => item._id);
|
185
|
-
const recordValue = {};
|
186
|
-
fieldIds.forEach((item, index) => {
|
187
|
-
recordValue[item] = customFieldValues[index];
|
188
|
-
});
|
189
|
-
return recordValue;
|
190
|
-
};
|
191
|
-
const getTrackableEntityBySystemFieldValues = (systemFieldValues) => {
|
192
|
-
return {
|
193
|
-
created_at: systemFieldValues[SystemFieldIndex.CreatedAt],
|
194
|
-
created_by: systemFieldValues[SystemFieldIndex.CreatedBy],
|
195
|
-
updated_at: systemFieldValues[SystemFieldIndex.UpdatedAt],
|
196
|
-
updated_by: systemFieldValues[SystemFieldIndex.UpdatedBy]
|
197
|
-
};
|
198
|
-
};
|
199
|
-
const getIdBySystemFieldValues = (systemFieldValues) => {
|
200
|
-
return systemFieldValues[SystemFieldIndex.Id]['_id'];
|
201
|
-
};
|
202
|
-
const getShortIdBySystemFieldValues = (systemFieldValues) => {
|
203
|
-
return systemFieldValues[SystemFieldIndex.ShortId];
|
204
|
-
};
|
205
|
-
const getIdBySystemFieldValuesType = (systemFieldValuesType) => {
|
206
|
-
return systemFieldValuesType.get(SystemFieldIndex.Id)['_id'];
|
207
|
-
};
|
208
|
-
const getPositionsBySystemFieldValues = (systemFieldValues) => {
|
209
|
-
return systemFieldValues[SystemFieldIndex.Positions];
|
210
|
-
};
|
211
|
-
const getPositionsByRecordSyncElement = (recordSyncElement) => {
|
212
|
-
const systemFieldType = recordSyncElement.get(0);
|
213
|
-
const positions = systemFieldType.get(SystemFieldIndex.Positions);
|
214
|
-
return positions;
|
215
|
-
};
|
216
|
-
const setRecordPositions$1 = (recordSyncElement, newPositions) => {
|
217
|
-
const systemFieldType = recordSyncElement.get(0);
|
218
|
-
systemFieldType.delete(SystemFieldIndex.Positions);
|
219
|
-
systemFieldType.insert(SystemFieldIndex.Positions, [newPositions]);
|
220
|
-
};
|
221
|
-
const setRecordUpdatedInfo = (recordSyncElement, info) => {
|
222
|
-
const systemFieldType = recordSyncElement.get(0);
|
223
|
-
systemFieldType.delete(SystemFieldIndex.UpdatedAt, 2);
|
224
|
-
systemFieldType.insert(SystemFieldIndex.UpdatedAt, [info.updated_at, info.updated_by]);
|
225
|
-
};
|
226
|
-
|
227
|
-
const AI_TABLE_CONTENT_FIELD_NAME = 'content';
|
228
|
-
|
229
|
-
const createSharedType = (fieldName = AI_TABLE_CONTENT_FIELD_NAME) => {
|
230
|
-
const doc = new Y.Doc();
|
231
|
-
const sharedType = doc.getMap(fieldName);
|
232
|
-
return sharedType;
|
233
|
-
};
|
234
|
-
const getDataBySharedType = (sharedType) => {
|
235
|
-
const data = sharedType.toJSON();
|
236
|
-
const fields = data['fields'];
|
237
|
-
const records = getRecordsBySharedJson(data['records'], fields);
|
238
|
-
const views = data['views'];
|
239
|
-
return {
|
240
|
-
records,
|
241
|
-
fields,
|
242
|
-
views
|
243
|
-
};
|
244
|
-
};
|
245
|
-
const getSharedTypeByData = (doc, initializeValue) => {
|
246
|
-
const sharedType = doc.getMap(AI_TABLE_CONTENT_FIELD_NAME);
|
247
|
-
toSharedType(sharedType, initializeValue);
|
248
|
-
return sharedType;
|
249
|
-
};
|
250
|
-
function toSharedType(sharedType, data) {
|
251
|
-
sharedType.doc.transact(() => {
|
252
|
-
const fieldSharedType = new Y.Array();
|
253
|
-
fieldSharedType.insert(0, data.fields.map(toSyncElement));
|
254
|
-
sharedType.set('fields', fieldSharedType);
|
255
|
-
const recordSharedType = new Y.Array();
|
256
|
-
sharedType.set('records', recordSharedType);
|
257
|
-
recordSharedType.insert(0, data.records.map((record) => {
|
258
|
-
return toRecordSyncElement(record, data.fields);
|
259
|
-
}));
|
260
|
-
const viewsSharedType = new Y.Array();
|
261
|
-
sharedType.set('views', viewsSharedType);
|
262
|
-
viewsSharedType.insert(0, data.views.map(toSyncElement));
|
263
|
-
});
|
264
|
-
}
|
265
|
-
const getRecordsBySharedJson = (recordJsonArray, fields) => {
|
266
|
-
return recordJsonArray.map((record) => {
|
267
|
-
const [systemFieldValues, customFieldValues] = record;
|
268
|
-
return {
|
269
|
-
_id: getIdBySystemFieldValues(systemFieldValues),
|
270
|
-
short_id: getShortIdBySystemFieldValues(systemFieldValues),
|
271
|
-
...getTrackableEntityBySystemFieldValues(systemFieldValues),
|
272
|
-
positions: getPositionsBySystemFieldValues(systemFieldValues),
|
273
|
-
values: getValuesByCustomFieldValues(customFieldValues, fields)
|
274
|
-
};
|
275
|
-
});
|
276
|
-
};
|
277
|
-
|
278
|
-
function translateArrayEvent(aiTable, sharedType, event) {
|
279
|
-
let offset = 0;
|
280
|
-
let targetPath = getShareTypeNumberPath(event.path);
|
281
|
-
const isRecordsTranslate = event.path.includes('records');
|
282
|
-
const isFieldsTranslate = event.path.includes('fields');
|
283
|
-
const isViewsTranslate = event.path.includes('views');
|
284
|
-
const actions = [];
|
285
|
-
const activeViewId = aiTable.activeViewId();
|
286
|
-
event.changes.delta.forEach((delta) => {
|
287
|
-
if ('retain' in delta) {
|
288
|
-
offset += delta.retain ?? 0;
|
289
|
-
}
|
290
|
-
if ('delete' in delta) {
|
291
|
-
if (isAddOrRemove(targetPath)) {
|
292
|
-
if (isViewsTranslate) {
|
293
|
-
const removeView = aiTable.views()[offset];
|
294
|
-
if (removeView) {
|
295
|
-
actions.push({
|
296
|
-
type: ActionName.RemoveView,
|
297
|
-
path: [removeView._id]
|
298
|
-
});
|
299
|
-
}
|
300
|
-
}
|
301
|
-
else {
|
302
|
-
const type = isRecordsTranslate ? ActionName.RemoveRecord : ActionName.RemoveField;
|
303
|
-
const removeIds = getRemoveIds(event, type);
|
304
|
-
if (removeIds.length) {
|
305
|
-
removeIds.forEach((path) => {
|
306
|
-
actions.push({
|
307
|
-
type,
|
308
|
-
path
|
309
|
-
});
|
310
|
-
});
|
311
|
-
}
|
312
|
-
}
|
313
|
-
}
|
314
|
-
}
|
315
|
-
if ('insert' in delta) {
|
316
|
-
if (isArray(delta.insert)) {
|
317
|
-
if (isRecordsTranslate) {
|
318
|
-
if (isAddOrRemove(targetPath)) {
|
319
|
-
delta.insert?.map((item) => {
|
320
|
-
const data = item.toJSON();
|
321
|
-
const [systemFieldValues, customFieldValues] = data;
|
322
|
-
const positions = getPositionsBySystemFieldValues(systemFieldValues);
|
323
|
-
const position = positions[activeViewId];
|
324
|
-
const path = translatePositionToPath(aiTable.records(), position, activeViewId);
|
325
|
-
actions.push({
|
326
|
-
type: ActionName.AddRecord,
|
327
|
-
path: path,
|
328
|
-
record: {
|
329
|
-
_id: getIdBySystemFieldValues(systemFieldValues),
|
330
|
-
short_id: getShortIdBySystemFieldValues(systemFieldValues),
|
331
|
-
...getTrackableEntityBySystemFieldValues(systemFieldValues),
|
332
|
-
positions: getPositionsBySystemFieldValues(systemFieldValues),
|
333
|
-
values: getValuesByCustomFieldValues(customFieldValues, aiTable.gridData().fields)
|
334
|
-
}
|
335
|
-
});
|
336
|
-
});
|
337
|
-
}
|
338
|
-
else {
|
339
|
-
try {
|
340
|
-
const sharedRecords = sharedType.get('records');
|
341
|
-
const sharedFields = sharedType.get('fields');
|
342
|
-
let systemFieldOffset = 0;
|
343
|
-
delta.insert?.map((item, index) => {
|
344
|
-
const recordIndex = targetPath[0];
|
345
|
-
const fieldIndex = offset + index;
|
346
|
-
const record = aiTable.records()[recordIndex];
|
347
|
-
if (isSystemFieldOperation(targetPath)) {
|
348
|
-
if (isPositionsOperation(fieldIndex)) {
|
349
|
-
const newPositions = {};
|
350
|
-
for (const key in item) {
|
351
|
-
newPositions[key] = item[key];
|
352
|
-
}
|
353
|
-
actions.push({
|
354
|
-
type: ActionName.SetRecordPositions,
|
355
|
-
path: [record._id],
|
356
|
-
positions: newPositions
|
357
|
-
});
|
358
|
-
// 此处的循环会包含 updated_at 和 updated_by 各一次,这里只处理 updated_by 同时包含两个字段的修改
|
359
|
-
}
|
360
|
-
else if (isUpdatedByOperation(fieldIndex + systemFieldOffset)) {
|
361
|
-
const systemFieldValues = getSharedRecord(sharedRecords, recordIndex).get(0).toJSON();
|
362
|
-
const { updated_at, updated_by } = getTrackableEntityBySystemFieldValues(systemFieldValues);
|
363
|
-
actions.push({
|
364
|
-
type: ActionName.UpdateSystemFieldValue,
|
365
|
-
path: [record._id],
|
366
|
-
updatedInfo: { updated_at, updated_by }
|
367
|
-
});
|
368
|
-
}
|
369
|
-
systemFieldOffset++;
|
370
|
-
}
|
371
|
-
else {
|
372
|
-
const recordId = getSharedRecordId(sharedRecords, recordIndex);
|
373
|
-
const fieldId = getSharedMapValueId(sharedFields, fieldIndex);
|
374
|
-
const path = [recordId, fieldId];
|
375
|
-
const fieldValue = AITableQueries.getFieldValue(aiTable, path);
|
376
|
-
// To exclude insert triggered by field inserts.
|
377
|
-
if (fieldValue !== item) {
|
378
|
-
actions.push({
|
379
|
-
type: ActionName.UpdateFieldValue,
|
380
|
-
path,
|
381
|
-
fieldValue,
|
382
|
-
newFieldValue: item
|
383
|
-
});
|
384
|
-
}
|
385
|
-
}
|
386
|
-
});
|
387
|
-
}
|
388
|
-
catch (error) { }
|
389
|
-
}
|
390
|
-
}
|
391
|
-
if (isFieldsTranslate) {
|
392
|
-
delta.insert?.map((item, index) => {
|
393
|
-
const data = item.toJSON();
|
394
|
-
const path = translatePositionToPath(aiTable.gridData().fields, data['positions'][activeViewId], activeViewId, index);
|
395
|
-
actions.push({
|
396
|
-
type: ActionName.AddField,
|
397
|
-
path,
|
398
|
-
field: data
|
399
|
-
});
|
400
|
-
});
|
401
|
-
}
|
402
|
-
if (isViewsTranslate) {
|
403
|
-
delta.insert?.map((item, index) => {
|
404
|
-
const data = item.toJSON();
|
405
|
-
actions.push({
|
406
|
-
type: ActionName.AddView,
|
407
|
-
path: [offset + index],
|
408
|
-
view: data
|
409
|
-
});
|
410
|
-
});
|
411
|
-
}
|
412
|
-
}
|
413
|
-
}
|
414
|
-
});
|
415
|
-
return actions;
|
416
|
-
}
|
417
|
-
function isAddOrRemove(targetPath) {
|
418
|
-
return targetPath.length === 0;
|
419
|
-
}
|
420
|
-
function isSystemFieldOperation(targetPath) {
|
421
|
-
if (targetPath.length === 2 && targetPath[1] === 0) {
|
422
|
-
return true;
|
423
|
-
}
|
424
|
-
return false;
|
425
|
-
}
|
426
|
-
function isCustomFieldOperation(targetPath) {
|
427
|
-
if (targetPath.length === 2 && targetPath[1] === 1) {
|
428
|
-
return true;
|
429
|
-
}
|
430
|
-
return false;
|
431
|
-
}
|
432
|
-
function isPositionsOperation(fieldIndex) {
|
433
|
-
return fieldIndex === SystemFieldIndex.Positions;
|
434
|
-
}
|
435
|
-
function isUpdatedByOperation(fieldIndex) {
|
436
|
-
return fieldIndex === SystemFieldIndex.UpdatedBy;
|
437
|
-
}
|
438
|
-
function getRemoveIds(event, type) {
|
439
|
-
const ids = [];
|
440
|
-
if (!type) {
|
441
|
-
return ids;
|
442
|
-
}
|
443
|
-
Y.iterateDeletedStructs(event.transaction, event.transaction.deleteSet,
|
444
|
-
// @param {Item|GC} item
|
445
|
-
(item) => {
|
446
|
-
if (item instanceof Y.Item && item.deleted) {
|
447
|
-
if (type === ActionName.RemoveField && item.parentSub === '_id') {
|
448
|
-
ids.push(item.content.getContent());
|
449
|
-
}
|
450
|
-
if (type === ActionName.RemoveRecord) {
|
451
|
-
const content = item.content.getContent();
|
452
|
-
if (content[0] && content[0]['_id']) {
|
453
|
-
ids.push([content[0]['_id']]);
|
454
|
-
}
|
455
|
-
}
|
456
|
-
}
|
457
|
-
});
|
458
|
-
return ids;
|
459
|
-
}
|
460
|
-
|
461
50
|
function translateMapEvent(aiTable, sharedType, event) {
|
462
51
|
const isFieldsTranslate = event.path.includes('fields');
|
463
52
|
const isViewTranslate = event.path.includes('views');
|
@@ -506,7 +95,7 @@ function translateMapEvent(aiTable, sharedType, event) {
|
|
506
95
|
|
507
96
|
function translateYjsEvent(aiTable, sharedType, event) {
|
508
97
|
if (event instanceof Y.YArrayEvent) {
|
509
|
-
return translateArrayEvent(
|
98
|
+
return translateArrayEvent(sharedType, event);
|
510
99
|
}
|
511
100
|
if (event instanceof Y.YMapEvent) {
|
512
101
|
return translateMapEvent(aiTable, sharedType, event);
|
@@ -538,8 +127,14 @@ function updateFieldValue$2(aiTable, sharedType, action) {
|
|
538
127
|
if (recordIndex > -1 && fieldIndex > -1) {
|
539
128
|
const record = sharedRecords?.get(recordIndex);
|
540
129
|
const customField = record.get(1);
|
541
|
-
customField.
|
542
|
-
|
130
|
+
if (fieldIndex < customField.length) {
|
131
|
+
customField.delete(fieldIndex);
|
132
|
+
customField.insert(fieldIndex, [action.newFieldValue]);
|
133
|
+
}
|
134
|
+
else {
|
135
|
+
// 幽灵单元格,协同的后端会对这样的数据进行纠正,但是在纠正同步到位之前,前端可能会出现幽灵单元格
|
136
|
+
console.error('Field index out of bounds, cannot update field value');
|
137
|
+
}
|
543
138
|
}
|
544
139
|
}
|
545
140
|
return sharedType;
|
@@ -584,7 +179,7 @@ function addNode(aiTable, sharedType, action) {
|
|
584
179
|
records && records.push([toRecordSyncElement(action.record, aiTable.fields())]);
|
585
180
|
break;
|
586
181
|
case ActionName.AddView:
|
587
|
-
views && views.push([
|
182
|
+
views && views.push([toMapSyncElement(action.view)]);
|
588
183
|
break;
|
589
184
|
case ActionName.SetRecordPositions:
|
590
185
|
if (records) {
|
@@ -614,16 +209,22 @@ function addNode(aiTable, sharedType, action) {
|
|
614
209
|
break;
|
615
210
|
case ActionName.AddField:
|
616
211
|
if (fields && records) {
|
617
|
-
const { field
|
618
|
-
const
|
619
|
-
const fieldSyncElement =
|
212
|
+
const { field } = action;
|
213
|
+
const insertIndex = fields.length;
|
214
|
+
const fieldSyncElement = toMapSyncElement(field);
|
620
215
|
fields.insert(insertIndex, [fieldSyncElement]);
|
621
216
|
for (let value of records) {
|
622
217
|
const customFieldValues = value.get(1);
|
623
218
|
const systemFieldValues = value.get(0);
|
624
219
|
const recordEntity = aiTable.recordsMap()[getIdBySystemFieldValuesType(systemFieldValues)];
|
625
220
|
const newFieldValue = recordEntity.values[action.field._id];
|
626
|
-
|
221
|
+
// 幽灵单元格,暂不处理交给后端统一处理
|
222
|
+
if (insertIndex <= customFieldValues.length) {
|
223
|
+
customFieldValues.insert(insertIndex, [newFieldValue]);
|
224
|
+
}
|
225
|
+
else {
|
226
|
+
console.error('Field index out of bounds, cannot initialize record value for new field');
|
227
|
+
}
|
627
228
|
}
|
628
229
|
}
|
629
230
|
break;
|
@@ -695,6 +296,111 @@ function applyActionOps(aiTable, sharedType, actions) {
|
|
695
296
|
return sharedType;
|
696
297
|
}
|
697
298
|
|
299
|
+
const createSharedType = (fieldName = AI_TABLE_CONTENT_FIELD_NAME) => {
|
300
|
+
const doc = new Y.Doc();
|
301
|
+
const sharedType = doc.getMap(fieldName);
|
302
|
+
return sharedType;
|
303
|
+
};
|
304
|
+
const getDataBySharedType = (sharedType) => {
|
305
|
+
const data = sharedType.toJSON();
|
306
|
+
const fields = data['fields'];
|
307
|
+
const records = getRecordsBySharedJson(data['records'], fields);
|
308
|
+
const views = data['views'];
|
309
|
+
return {
|
310
|
+
records,
|
311
|
+
fields,
|
312
|
+
views
|
313
|
+
};
|
314
|
+
};
|
315
|
+
const getSharedTypeByData = (doc, initializeValue) => {
|
316
|
+
const sharedType = doc.getMap(AI_TABLE_CONTENT_FIELD_NAME);
|
317
|
+
toSharedType(sharedType, initializeValue);
|
318
|
+
return sharedType;
|
319
|
+
};
|
320
|
+
function toSharedType(sharedType, data) {
|
321
|
+
sharedType.doc.transact(() => {
|
322
|
+
const fieldSharedType = new Y.Array();
|
323
|
+
fieldSharedType.insert(0, data.fields.map(toMapSyncElement));
|
324
|
+
sharedType.set('fields', fieldSharedType);
|
325
|
+
const recordSharedType = new Y.Array();
|
326
|
+
sharedType.set('records', recordSharedType);
|
327
|
+
recordSharedType.insert(0, data.records.map((record) => {
|
328
|
+
return toRecordSyncElement(record, data.fields);
|
329
|
+
}));
|
330
|
+
const viewsSharedType = new Y.Array();
|
331
|
+
sharedType.set('views', viewsSharedType);
|
332
|
+
viewsSharedType.insert(0, data.views.map(toMapSyncElement));
|
333
|
+
});
|
334
|
+
}
|
335
|
+
const getRecordsBySharedJson = (recordJsonArray, fields) => {
|
336
|
+
return recordJsonArray.map((record) => {
|
337
|
+
const [systemFieldValues, customFieldValues] = record;
|
338
|
+
return {
|
339
|
+
_id: getIdBySystemFieldValues(systemFieldValues),
|
340
|
+
short_id: getShortIdBySystemFieldValues(systemFieldValues),
|
341
|
+
...getTrackableEntityBySystemFieldValues(systemFieldValues),
|
342
|
+
positions: getPositionsBySystemFieldValues(systemFieldValues),
|
343
|
+
values: getValuesByCustomFieldValues(customFieldValues, fields)
|
344
|
+
};
|
345
|
+
});
|
346
|
+
};
|
347
|
+
|
348
|
+
class UndoManagerService {
|
349
|
+
constructor() {
|
350
|
+
this._undoManager = null;
|
351
|
+
this._canUndoCount = signal(0);
|
352
|
+
this._canRedoCount = signal(0);
|
353
|
+
this._aiTable = null;
|
354
|
+
}
|
355
|
+
get undoManager() {
|
356
|
+
return this._undoManager;
|
357
|
+
}
|
358
|
+
get canUndoCount() {
|
359
|
+
return this._canUndoCount;
|
360
|
+
}
|
361
|
+
get canRedoCount() {
|
362
|
+
return this._canRedoCount;
|
363
|
+
}
|
364
|
+
initialize(sharedType, aiTable) {
|
365
|
+
if (!sharedType || !aiTable) {
|
366
|
+
return;
|
367
|
+
}
|
368
|
+
this._aiTable = aiTable;
|
369
|
+
this._undoManager = new UndoManager(sharedType, {
|
370
|
+
trackedOrigins: new Set([aiTable]),
|
371
|
+
captureTimeout: 300
|
372
|
+
});
|
373
|
+
this._undoManager.on('stack-item-added', () => {
|
374
|
+
this._canUndoCount.set(this._undoManager.undoStack.length);
|
375
|
+
this._canRedoCount.set(this._undoManager.redoStack.length);
|
376
|
+
});
|
377
|
+
this._undoManager.on('stack-item-popped', () => {
|
378
|
+
this._canUndoCount.set(this._undoManager.undoStack.length);
|
379
|
+
this._canRedoCount.set(this._undoManager.redoStack.length);
|
380
|
+
});
|
381
|
+
}
|
382
|
+
undo() {
|
383
|
+
if (this._undoManager?.canUndo()) {
|
384
|
+
YjsAITable.asUndo(this._aiTable, () => this._undoManager.undo());
|
385
|
+
}
|
386
|
+
}
|
387
|
+
redo() {
|
388
|
+
if (this._undoManager?.canRedo()) {
|
389
|
+
YjsAITable.asUndo(this._aiTable, () => this._undoManager.redo());
|
390
|
+
}
|
391
|
+
}
|
392
|
+
destroy() {
|
393
|
+
this._undoManager = null;
|
394
|
+
this._canUndoCount.set(0);
|
395
|
+
this._canRedoCount.set(0);
|
396
|
+
}
|
397
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UndoManagerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
398
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UndoManagerService }); }
|
399
|
+
}
|
400
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UndoManagerService, decorators: [{
|
401
|
+
type: Injectable
|
402
|
+
}] });
|
403
|
+
|
698
404
|
var AITableStateI18nKey;
|
699
405
|
(function (AITableStateI18nKey) {
|
700
406
|
AITableStateI18nKey["copyField"] = "copyField";
|
@@ -753,6 +459,7 @@ function generateCopyName(aiTable, existNames, name) {
|
|
753
459
|
return newName;
|
754
460
|
}
|
755
461
|
|
462
|
+
// import { FieldModelMap } from '../../../../grid/src/utils/field/field';
|
756
463
|
function getSortRecords(aiTable, records, activeView, sortKeysMap) {
|
757
464
|
if (!activeView?.settings || !activeView.settings.sorts?.length) {
|
758
465
|
return sortByViewPosition(records, activeView);
|
@@ -958,11 +665,10 @@ function getFieldsSizeMap(fields, activeView) {
|
|
958
665
|
return fieldsSizeMap;
|
959
666
|
}
|
960
667
|
|
961
|
-
function addField(aiTable, field,
|
668
|
+
function addField(aiTable, field, originId, isCopy) {
|
962
669
|
const operation = {
|
963
670
|
type: ActionName.AddField,
|
964
671
|
field,
|
965
|
-
path,
|
966
672
|
originId,
|
967
673
|
isCopy
|
968
674
|
};
|
@@ -1054,42 +760,19 @@ const apply = (aiTable, records, fields, views, action) => {
|
|
1054
760
|
break;
|
1055
761
|
}
|
1056
762
|
case ActionName.AddRecord: {
|
1057
|
-
|
1058
|
-
|
1059
|
-
if (!action.record.positions) {
|
1060
|
-
const activeView = aiTable.views().find((item) => item._id === aiTable.activeViewId());
|
1061
|
-
let index = recordIndex;
|
1062
|
-
if (activeView?.settings?.conditions) {
|
1063
|
-
index = records.length;
|
1064
|
-
}
|
1065
|
-
action.record.positions = createDefaultPositions(aiTable.views(), aiTable.activeViewId(), aiTable.records(), index);
|
1066
|
-
}
|
1067
|
-
records.splice(recordIndex, 0, action.record);
|
763
|
+
if (!action.record.positions) {
|
764
|
+
action.record.positions = createDefaultPositions(aiTable.views(), aiTable.activeViewId(), aiTable.records(), records.length);
|
1068
765
|
}
|
766
|
+
records.push(action.record);
|
1069
767
|
break;
|
1070
768
|
}
|
1071
769
|
case ActionName.AddField: {
|
1072
|
-
const
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
fields.splice(fieldIndex, 0, newField);
|
1079
|
-
records.forEach((item) => {
|
1080
|
-
item.values[newField._id] =
|
1081
|
-
action.isCopy && action.originId ? item.values[action.originId] : getDefaultFieldValue(action.field);
|
1082
|
-
});
|
1083
|
-
}
|
1084
|
-
break;
|
1085
|
-
}
|
1086
|
-
case ActionName.MoveRecord: {
|
1087
|
-
if (isPathEqual(action.path, action.newPath)) {
|
1088
|
-
return;
|
1089
|
-
}
|
1090
|
-
const record = records[action.path[0]];
|
1091
|
-
records.splice(action.path[0], 1);
|
1092
|
-
records.splice(action.newPath[0], 0, record);
|
770
|
+
const newField = action.field;
|
771
|
+
fields.push(newField);
|
772
|
+
records.forEach((item) => {
|
773
|
+
item.values[newField._id] =
|
774
|
+
action.isCopy && action.originId ? item.values[action.originId] : getDefaultFieldValue(action.field);
|
775
|
+
});
|
1093
776
|
break;
|
1094
777
|
}
|
1095
778
|
case ActionName.RemoveField: {
|
@@ -1156,10 +839,7 @@ const apply = (aiTable, records, fields, views, action) => {
|
|
1156
839
|
break;
|
1157
840
|
}
|
1158
841
|
case ActionName.AddView: {
|
1159
|
-
|
1160
|
-
if (viewIndex > -1) {
|
1161
|
-
views.splice(viewIndex, 0, action.view);
|
1162
|
-
}
|
842
|
+
views.push(action.view);
|
1163
843
|
break;
|
1164
844
|
}
|
1165
845
|
case ActionName.RemoveView: {
|
@@ -1228,13 +908,11 @@ const PositionsActions = {
|
|
1228
908
|
};
|
1229
909
|
|
1230
910
|
function updateFieldValue$1(aiTable, value, path) {
|
1231
|
-
const oldValue = AITableQueries.getFieldValue(aiTable, path);
|
1232
911
|
const field = AITableQueries.getField(aiTable, [path[1]]);
|
1233
912
|
const fieldModel = field && FieldModelMap[field.type];
|
1234
913
|
if (fieldModel && fieldModel.isValid(value)) {
|
1235
914
|
const operation = {
|
1236
915
|
type: ActionName.UpdateFieldValue,
|
1237
|
-
fieldValue: oldValue,
|
1238
916
|
newFieldValue: value,
|
1239
917
|
path
|
1240
918
|
};
|
@@ -1252,7 +930,7 @@ function updateSystemFieldValue(aiTable, path, updatedInfo) {
|
|
1252
930
|
};
|
1253
931
|
aiTable.apply(operation);
|
1254
932
|
}
|
1255
|
-
function addRecord(aiTable, record
|
933
|
+
function addRecord(aiTable, record) {
|
1256
934
|
const invalidFieldValues = [];
|
1257
935
|
const isValid = Object.entries(record.values).every(([fieldId, value]) => {
|
1258
936
|
const field = AITableQueries.getField(aiTable, [fieldId]);
|
@@ -1266,8 +944,7 @@ function addRecord(aiTable, record, path) {
|
|
1266
944
|
if (isValid) {
|
1267
945
|
const operation = {
|
1268
946
|
type: ActionName.AddRecord,
|
1269
|
-
record
|
1270
|
-
path
|
947
|
+
record
|
1271
948
|
};
|
1272
949
|
aiTable.apply(operation);
|
1273
950
|
}
|
@@ -1275,14 +952,6 @@ function addRecord(aiTable, record, path) {
|
|
1275
952
|
console.error(`Invalid field values at add record. invalidFieldValues: ${invalidFieldValues}`);
|
1276
953
|
}
|
1277
954
|
}
|
1278
|
-
function moveRecord(aiTable, path, newPath) {
|
1279
|
-
const operation = {
|
1280
|
-
type: ActionName.MoveRecord,
|
1281
|
-
path,
|
1282
|
-
newPath
|
1283
|
-
};
|
1284
|
-
aiTable.apply(operation);
|
1285
|
-
}
|
1286
955
|
function removeRecord(aiTable, path) {
|
1287
956
|
const operation = {
|
1288
957
|
type: ActionName.RemoveRecord,
|
@@ -1293,7 +962,6 @@ function removeRecord(aiTable, path) {
|
|
1293
962
|
const RecordActions = {
|
1294
963
|
addRecord,
|
1295
964
|
updateFieldValue: updateFieldValue$1,
|
1296
|
-
moveRecord,
|
1297
965
|
removeRecord,
|
1298
966
|
updateSystemFieldValue
|
1299
967
|
};
|
@@ -1323,11 +991,20 @@ function setView(aiTable, value, path) {
|
|
1323
991
|
aiTable.apply(operation);
|
1324
992
|
}
|
1325
993
|
}
|
1326
|
-
function addView$1(aiTable,
|
994
|
+
function addView$1(aiTable, originId, newView, isDuplicate) {
|
995
|
+
const views = sortViews(aiTable.views());
|
996
|
+
const currentIndex = views.findIndex((item) => item._id === originId);
|
997
|
+
if (isDuplicate) {
|
998
|
+
const nextIndex = currentIndex + 1;
|
999
|
+
newView.position = ((views[currentIndex]?.position ?? currentIndex) + (views[nextIndex]?.position ?? nextIndex)) / 2;
|
1000
|
+
}
|
1001
|
+
else {
|
1002
|
+
newView.position = currentIndex + 1;
|
1003
|
+
}
|
1327
1004
|
const operation = {
|
1328
1005
|
type: ActionName.AddView,
|
1329
|
-
view,
|
1330
|
-
|
1006
|
+
view: newView,
|
1007
|
+
isDuplicate
|
1331
1008
|
};
|
1332
1009
|
aiTable.apply(operation);
|
1333
1010
|
}
|
@@ -1359,34 +1036,6 @@ function updateRecordsUpdatedInfo(aiTable, updatedInfo) {
|
|
1359
1036
|
});
|
1360
1037
|
}
|
1361
1038
|
|
1362
|
-
function addFields(aiTable, options, updatedInfo) {
|
1363
|
-
const { originId, direction = Direction$1.after, defaultValue, isDuplicate, count = 1 } = options;
|
1364
|
-
const activeView = aiTable.viewsMap()[aiTable.activeViewId()];
|
1365
|
-
const fields = getSortFields(aiTable, aiTable.gridData().fields, activeView);
|
1366
|
-
let addIndex = fields.findIndex((item) => item._id === originId);
|
1367
|
-
if (direction === Direction$1.after) {
|
1368
|
-
addIndex++;
|
1369
|
-
}
|
1370
|
-
const newFieldIds = idsCreator(count);
|
1371
|
-
newFieldIds.forEach((id, index) => {
|
1372
|
-
const newField = { _id: id, ...defaultValue, positions: null };
|
1373
|
-
Actions.addField(aiTable, newField, [addIndex + index], options.originId, options.isCopy);
|
1374
|
-
});
|
1375
|
-
updateRecordsUpdatedInfo(aiTable, updatedInfo);
|
1376
|
-
}
|
1377
|
-
|
1378
|
-
const buildRemoveFieldItem = (aiTable, getUpdatedInfo) => {
|
1379
|
-
return {
|
1380
|
-
type: 'removeField',
|
1381
|
-
name: getStateI18nTextByKey(aiTable, AITableStateI18nKey.removeField),
|
1382
|
-
icon: 'trash',
|
1383
|
-
exec: (aiTable, field) => {
|
1384
|
-
Actions.removeField(aiTable, [field()._id]);
|
1385
|
-
updateRecordsUpdatedInfo(aiTable, getUpdatedInfo());
|
1386
|
-
}
|
1387
|
-
};
|
1388
|
-
};
|
1389
|
-
|
1390
1039
|
function createDefaultPositions(views, activeId, data, index) {
|
1391
1040
|
const positions = {};
|
1392
1041
|
const position = getPosition(data, activeId, index);
|
@@ -1422,21 +1071,21 @@ function getMaxPosition(data, activeViewId) {
|
|
1422
1071
|
}, 0);
|
1423
1072
|
}
|
1424
1073
|
function addView(aiTable, type, viewId) {
|
1425
|
-
let index = aiTable.views().length;
|
1426
1074
|
const newId = idCreator();
|
1427
1075
|
const shortId = shortIdCreator();
|
1428
|
-
const
|
1429
|
-
const
|
1076
|
+
const views = aiTable.views();
|
1077
|
+
const allViewNames = views.map((item) => item.name);
|
1078
|
+
const count = views.length || 0;
|
1430
1079
|
const newViewName = generateNewName(allViewNames, count, getStateI18nTextByKey(aiTable, AITableStateI18nKey.tableView));
|
1431
1080
|
let newView = {
|
1432
1081
|
_id: newId,
|
1433
1082
|
short_id: shortId,
|
1434
1083
|
name: newViewName
|
1435
1084
|
};
|
1436
|
-
let originViewId =
|
1437
|
-
if (type === '
|
1085
|
+
let originViewId = views[views.length - 1]._id;
|
1086
|
+
if (type === 'duplicate') {
|
1438
1087
|
originViewId = viewId ?? aiTable.activeViewId();
|
1439
|
-
const copyView =
|
1088
|
+
const copyView = views.find((item) => item._id === originViewId);
|
1440
1089
|
const copyName = copyView.name;
|
1441
1090
|
const copyViewName = generateCopyName(aiTable, allViewNames, copyName);
|
1442
1091
|
newView = {
|
@@ -1444,9 +1093,8 @@ function addView(aiTable, type, viewId) {
|
|
1444
1093
|
_id: newId,
|
1445
1094
|
name: copyViewName
|
1446
1095
|
};
|
1447
|
-
index = aiTable.views().indexOf(copyView) + 1;
|
1448
1096
|
}
|
1449
|
-
ViewActions.addView(aiTable, newView,
|
1097
|
+
ViewActions.addView(aiTable, originViewId, newView, type === 'duplicate');
|
1450
1098
|
aiTable.records().forEach((record) => {
|
1451
1099
|
PositionsActions.setRecordPositions(aiTable, { [newId]: record.positions[originViewId] }, [record._id]);
|
1452
1100
|
});
|
@@ -1473,13 +1121,51 @@ function removeView(aiTable, records, fields, activeViewId) {
|
|
1473
1121
|
});
|
1474
1122
|
ViewActions.removeView(aiTable, [activeViewId]);
|
1475
1123
|
}
|
1124
|
+
function sortViews(data) {
|
1125
|
+
return [...data].sort((a, b) => (a.position ?? data.indexOf(a)) - (b.position ?? data.indexOf(b)));
|
1126
|
+
}
|
1127
|
+
|
1128
|
+
function addFields(aiTable, options, updatedInfo) {
|
1129
|
+
const { defaultValue, isDuplicate, isCopy } = options;
|
1130
|
+
const fields = aiTable.gridData().fields;
|
1131
|
+
const fieldsMap = aiTable.fieldsMap();
|
1132
|
+
const activeViewId = aiTable.activeViewId();
|
1133
|
+
const newField = { ...defaultValue };
|
1134
|
+
if (fieldsMap[newField._id]) {
|
1135
|
+
newField._id = idCreator();
|
1136
|
+
}
|
1137
|
+
if (isDuplicate) {
|
1138
|
+
const currentFieldIndex = fields.findIndex((item) => item._id === options.originId);
|
1139
|
+
newField.positions = {
|
1140
|
+
...newField.positions,
|
1141
|
+
[activeViewId]: getPosition(fields, activeViewId, currentFieldIndex + 1)
|
1142
|
+
};
|
1143
|
+
}
|
1144
|
+
else {
|
1145
|
+
newField.positions = createDefaultPositions(aiTable.views(), aiTable.activeViewId(), aiTable.gridData().fields, fields.length);
|
1146
|
+
}
|
1147
|
+
Actions.addField(aiTable, newField, options.originId, isCopy || isDuplicate);
|
1148
|
+
updateRecordsUpdatedInfo(aiTable, updatedInfo);
|
1149
|
+
}
|
1150
|
+
|
1151
|
+
const buildRemoveFieldItem = (aiTable, getUpdatedInfo) => {
|
1152
|
+
return {
|
1153
|
+
type: 'removeField',
|
1154
|
+
name: getStateI18nTextByKey(aiTable, AITableStateI18nKey.removeField),
|
1155
|
+
icon: 'trash',
|
1156
|
+
exec: (aiTable, field) => {
|
1157
|
+
Actions.removeField(aiTable, [field()._id]);
|
1158
|
+
updateRecordsUpdatedInfo(aiTable, getUpdatedInfo());
|
1159
|
+
}
|
1160
|
+
};
|
1161
|
+
};
|
1476
1162
|
|
1477
1163
|
function addRecords(aiTable, options, trackableEntity) {
|
1478
|
-
const { originId, direction = Direction
|
1164
|
+
const { originId, direction = Direction.after, isDuplicate, count = 1 } = options;
|
1479
1165
|
const activeView = aiTable.viewsMap()[aiTable.activeViewId()];
|
1480
1166
|
const records = getSortRecords(aiTable, aiTable.gridData().records, activeView);
|
1481
1167
|
let addIndex = records.findIndex((item) => item._id === originId);
|
1482
|
-
if (direction === Direction
|
1168
|
+
if (direction === Direction.after) {
|
1483
1169
|
addIndex++;
|
1484
1170
|
}
|
1485
1171
|
const newRecordIds = idsCreator(count);
|
@@ -1495,7 +1181,7 @@ function addRecords(aiTable, options, trackableEntity) {
|
|
1495
1181
|
}
|
1496
1182
|
newRecordIds.forEach((id, index) => {
|
1497
1183
|
const newRecord = { _id: id, short_id: newRecordShortIds[index], values: newRecordValues, ...trackableEntity };
|
1498
|
-
Actions.addRecord(aiTable, newRecord
|
1184
|
+
Actions.addRecord(aiTable, newRecord);
|
1499
1185
|
});
|
1500
1186
|
}
|
1501
1187
|
function getDefaultRecordValues(aiTable, isDuplicate = false, recordId) {
|
@@ -1619,7 +1305,7 @@ const CopyFieldPropertyItem = (aiTable, addFieldFn) => {
|
|
1619
1305
|
let newFieldName = generateCopyName(aiTable, allFieldNames, copyName);
|
1620
1306
|
const fieldOptions = {
|
1621
1307
|
originId: field()._id,
|
1622
|
-
|
1308
|
+
isDuplicate: true,
|
1623
1309
|
defaultValue: {
|
1624
1310
|
...field(),
|
1625
1311
|
_id: idCreator(),
|
@@ -1689,5 +1375,5 @@ const VIEW_ACTIONS = [ActionName.SetView, ActionName.AddView, ActionName.RemoveV
|
|
1689
1375
|
* Generated bundle index. Do not edit.
|
1690
1376
|
*/
|
1691
1377
|
|
1692
|
-
export {
|
1378
|
+
export { AITableStateI18nKey, Actions, CopyCellsItem, CopyFieldPropertyItem, DividerMenuItem, EditFieldPropertyItem, FLUSHING, PasteCellsItem, RemoveRecordsItem, UndoManagerService, VIEW_ACTIONS, YjsAITable, actionMappers, addFields, addRecords, addView, applyActionOps, applyEvents, applyYjsEvents, buildFieldsByView, buildRecordsByView, buildRemoveFieldItem, createDefaultPositions, createSharedType, doFilter, generateCopyName, getDataBySharedType, getDefaultI18nTextByKey, getDefaultRecordDataByFilter, getDefaultRecordValues, getFieldPositionInView, getFieldsSizeMap, getFilteredRecords, getMaxPosition, getPosition, getRecordsBySharedJson, getSharedTypeByData, getSortFields, getSortRecords, getStateI18nTextByKey, isPathEqual, moveFields, moveRecords, removeView, sortByViewPosition, sortRecordsBySortInfo, sortViews, toSharedType, translateYjsEvent, updateFieldValue, updateRecordsUpdatedInfo, withState };
|
1693
1379
|
//# sourceMappingURL=ai-table-state.mjs.map
|