@vuu-ui/vuu-data-editing 3.0.0 → 3.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/package.json +15 -12
  2. package/src/DataEditingProvider.js +13 -0
  3. package/src/EditButtons.js +58 -0
  4. package/src/EditModeProvider.js +18 -0
  5. package/src/EditSession.js +482 -0
  6. package/src/UndoCellRenderer.js +38 -0
  7. package/src/edit-utils.js +47 -0
  8. package/src/editActionRowClassNameGenerator.js +15 -0
  9. package/src/index.js +10 -0
  10. package/src/useCellEdited.js +22 -0
  11. package/src/useEditableTable.js +141 -0
  12. package/cjs/DataEditingProvider.js +0 -28
  13. package/cjs/DataEditingProvider.js.map +0 -1
  14. package/cjs/EditButtons.js +0 -59
  15. package/cjs/EditButtons.js.map +0 -1
  16. package/cjs/EditModeProvider.js +0 -18
  17. package/cjs/EditModeProvider.js.map +0 -1
  18. package/cjs/EditSession.js +0 -564
  19. package/cjs/EditSession.js.map +0 -1
  20. package/cjs/UndoCellRenderer.js +0 -48
  21. package/cjs/UndoCellRenderer.js.map +0 -1
  22. package/cjs/edit-utils.js +0 -52
  23. package/cjs/edit-utils.js.map +0 -1
  24. package/cjs/editActionRowClassNameGenerator.js +0 -25
  25. package/cjs/editActionRowClassNameGenerator.js.map +0 -1
  26. package/cjs/index.js +0 -43
  27. package/cjs/index.js.map +0 -1
  28. package/cjs/useCellEdited.js +0 -29
  29. package/cjs/useCellEdited.js.map +0 -1
  30. package/cjs/useEditableTable.js +0 -145
  31. package/cjs/useEditableTable.js.map +0 -1
  32. package/esm/DataEditingProvider.js +0 -25
  33. package/esm/DataEditingProvider.js.map +0 -1
  34. package/esm/EditButtons.js +0 -57
  35. package/esm/EditButtons.js.map +0 -1
  36. package/esm/EditModeProvider.js +0 -15
  37. package/esm/EditModeProvider.js.map +0 -1
  38. package/esm/EditSession.js +0 -560
  39. package/esm/EditSession.js.map +0 -1
  40. package/esm/UndoCellRenderer.js +0 -43
  41. package/esm/UndoCellRenderer.js.map +0 -1
  42. package/esm/edit-utils.js +0 -45
  43. package/esm/edit-utils.js.map +0 -1
  44. package/esm/editActionRowClassNameGenerator.js +0 -22
  45. package/esm/editActionRowClassNameGenerator.js.map +0 -1
  46. package/esm/index.js +0 -11
  47. package/esm/index.js.map +0 -1
  48. package/esm/useCellEdited.js +0 -27
  49. package/esm/useCellEdited.js.map +0 -1
  50. package/esm/useEditableTable.js +0 -143
  51. package/esm/useEditableTable.js.map +0 -1
@@ -1,560 +0,0 @@
1
- import { EventEmitter, isRpcError, StaleUpdateError } from '@vuu-ui/vuu-utils';
2
-
3
- var __defProp = Object.defineProperty;
4
- var __typeError = (msg) => {
5
- throw TypeError(msg);
6
- };
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
9
- var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
10
- var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
- var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
- var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
- var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
14
- var __privateWrapper = (obj, member, setter, getter) => ({
15
- set _(value) {
16
- __privateSet(obj, member, value);
17
- },
18
- get _() {
19
- return __privateGet(obj, member, getter);
20
- }
21
- });
22
- var _rowEdits, _deletedRows, _deleteRevision, _rowDeleteRevisions, _editCount, _deleteCount, _addCount, _invalidCount, _isStale, _commitRevision, _cellCommitRevisions, _deleteMode, _editSessionApi, _sourceTableDataSource, _sessionDataSource, _newRowState, _lifecycle, _transitionQueue, _EditSession_instances, emitEditStateChange_fn, setEditCounts_fn, setStale_fn, refreshEditCounts_fn, setNewRowState_fn, clearEdits_fn, setLifecycle_fn, enqueue_fn, getOrCreateRowEdits_fn, storeCellEdit_fn, setCellCommitRevision_fn, isLatestCellCommit_fn;
23
- const toEditSessionMode = (copyOption) => {
24
- switch (copyOption) {
25
- case "All":
26
- return "all-rows";
27
- case "Selected":
28
- return "selected-rows";
29
- case "Empty":
30
- return "empty-session-table";
31
- }
32
- };
33
- class EditError extends Error {
34
- }
35
- class SupersededEditError extends Error {
36
- }
37
- const _EditSession = class _EditSession extends EventEmitter {
38
- constructor(dataSource, deleteMode = "soft", editSessionApi = "createSessionDataSource") {
39
- super();
40
- __privateAdd(this, _EditSession_instances);
41
- /**
42
- * Row key => row edits
43
- */
44
- __privateAdd(this, _rowEdits, /* @__PURE__ */ new Map());
45
- __privateAdd(this, _deletedRows, /* @__PURE__ */ new Set());
46
- __privateAdd(this, _deleteRevision, 0);
47
- __privateAdd(this, _rowDeleteRevisions, /* @__PURE__ */ new Map());
48
- __privateAdd(this, _editCount, 0);
49
- __privateAdd(this, _deleteCount, 0);
50
- __privateAdd(this, _addCount, 0);
51
- __privateAdd(this, _invalidCount, 0);
52
- __privateAdd(this, _isStale, false);
53
- __privateAdd(this, _commitRevision, 0);
54
- __privateAdd(this, _cellCommitRevisions, /* @__PURE__ */ new Map());
55
- __privateAdd(this, _deleteMode);
56
- __privateAdd(this, _editSessionApi);
57
- __privateAdd(this, _sourceTableDataSource);
58
- __privateAdd(this, _sessionDataSource);
59
- __privateAdd(this, _newRowState, {
60
- columns: [],
61
- draftRevision: 0,
62
- errors: {},
63
- submitting: false,
64
- values: {}
65
- });
66
- __privateAdd(this, _lifecycle, { status: "idle" });
67
- /** Prevent begin/end RPCs from overlapping and observing stale lifecycle state. */
68
- __privateAdd(this, _transitionQueue, Promise.resolve());
69
- __privateSet(this, _sourceTableDataSource, dataSource);
70
- __privateSet(this, _deleteMode, deleteMode);
71
- __privateSet(this, _editSessionApi, editSessionApi);
72
- }
73
- get editCount() {
74
- return __privateGet(this, _editCount);
75
- }
76
- set editCount(val) {
77
- __privateMethod(this, _EditSession_instances, setEditCounts_fn).call(this, val, __privateGet(this, _invalidCount));
78
- }
79
- get invalidCount() {
80
- return __privateGet(this, _invalidCount);
81
- }
82
- set invalidCount(val) {
83
- __privateMethod(this, _EditSession_instances, setEditCounts_fn).call(this, __privateGet(this, _editCount), val);
84
- }
85
- get deleteCount() {
86
- return __privateGet(this, _deleteCount);
87
- }
88
- set deleteCount(val) {
89
- if (val !== __privateGet(this, _deleteCount)) {
90
- const oldState = this.editState;
91
- const oldCount = __privateGet(this, _deleteCount);
92
- __privateSet(this, _deleteCount, val);
93
- __privateMethod(this, _EditSession_instances, emitEditStateChange_fn).call(this, oldState, oldCount === 0 || val === 0);
94
- }
95
- }
96
- get addCount() {
97
- return __privateGet(this, _addCount);
98
- }
99
- set addCount(val) {
100
- if (val !== __privateGet(this, _addCount)) {
101
- const oldState = this.editState;
102
- const oldCount = __privateGet(this, _addCount);
103
- __privateSet(this, _addCount, val);
104
- __privateMethod(this, _EditSession_instances, emitEditStateChange_fn).call(this, oldState, oldCount === 0 || val === 0);
105
- }
106
- }
107
- get editState() {
108
- if (__privateGet(this, _invalidCount) > 0) {
109
- return "invalid";
110
- }
111
- if (__privateGet(this, _isStale)) {
112
- return "stale";
113
- }
114
- return __privateGet(this, _editCount) === 0 && __privateGet(this, _deleteCount) === 0 && __privateGet(this, _addCount) === 0 ? "clean" : "dirty";
115
- }
116
- get newRowState() {
117
- return __privateGet(this, _newRowState);
118
- }
119
- isNewRow(key) {
120
- return key === _EditSession.newRowKey;
121
- }
122
- isNewRowFinalColumn(columnName) {
123
- return __privateGet(this, _newRowState).columns.at(-1) === columnName;
124
- }
125
- isNewRowComplete() {
126
- return __privateGet(this, _newRowState).columns.every((column) => {
127
- const value = __privateGet(this, _newRowState).values[column];
128
- return value !== void 0 && (typeof value !== "string" || value.trim() !== "");
129
- });
130
- }
131
- configureNewRow(columns) {
132
- if (columns.length === __privateGet(this, _newRowState).columns.length && columns.every(
133
- (column, index) => column === __privateGet(this, _newRowState).columns[index]
134
- )) {
135
- return;
136
- }
137
- const columnSet = new Set(columns);
138
- const errors = Object.fromEntries(
139
- Object.entries(__privateGet(this, _newRowState).errors).filter(
140
- ([column]) => columnSet.has(column)
141
- )
142
- );
143
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, {
144
- ...__privateGet(this, _newRowState),
145
- columns: [...columns],
146
- errors
147
- });
148
- }
149
- setNewRowValue(column, value) {
150
- const errors = { ...__privateGet(this, _newRowState).errors };
151
- delete errors[column];
152
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, {
153
- ...__privateGet(this, _newRowState),
154
- errors,
155
- values: { ...__privateGet(this, _newRowState).values, [column]: value }
156
- });
157
- }
158
- async addNewRow() {
159
- const missingErrors = Object.fromEntries(
160
- __privateGet(this, _newRowState).columns.filter((column) => {
161
- const value = __privateGet(this, _newRowState).values[column];
162
- return value === void 0 || typeof value === "string" && value.trim() === "";
163
- }).map((column) => [column, "Value required"])
164
- );
165
- const errors = { ...__privateGet(this, _newRowState).errors, ...missingErrors };
166
- if (Object.keys(errors).length > 0) {
167
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, { ...__privateGet(this, _newRowState), errors });
168
- return { data: void 0, type: "SUCCESS_RESULT" };
169
- }
170
- if (__privateGet(this, _newRowState).submitting) {
171
- return { data: void 0, type: "SUCCESS_RESULT" };
172
- }
173
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, { ...__privateGet(this, _newRowState), submitting: true });
174
- try {
175
- const response = await this.addRow({ ...__privateGet(this, _newRowState).values });
176
- if (isRpcError(response)) {
177
- const finalColumn = __privateGet(this, _newRowState).columns.at(-1);
178
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, {
179
- ...__privateGet(this, _newRowState),
180
- errors: finalColumn ? { [finalColumn]: response.errorMessage } : __privateGet(this, _newRowState).errors,
181
- submitting: false
182
- });
183
- return response;
184
- }
185
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, {
186
- columns: __privateGet(this, _newRowState).columns,
187
- draftRevision: __privateGet(this, _newRowState).draftRevision + 1,
188
- errors: {},
189
- submitting: false,
190
- values: {}
191
- });
192
- return response;
193
- } catch (error) {
194
- const errorMessage = error instanceof Error ? error.message : "Unable to add row";
195
- const finalColumn = __privateGet(this, _newRowState).columns.at(-1);
196
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, {
197
- ...__privateGet(this, _newRowState),
198
- errors: finalColumn ? { [finalColumn]: errorMessage } : __privateGet(this, _newRowState).errors,
199
- submitting: false
200
- });
201
- return { errorMessage, type: "ERROR_RESULT" };
202
- }
203
- }
204
- async deleteSelectedRows() {
205
- const response = await this.dataSource?.deleteSelectedRows?.(
206
- __privateGet(this, _deleteMode)
207
- );
208
- if (isRpcError(response)) return;
209
- const deletedKeys = response?.data?.deletedKeys;
210
- if (deletedKeys && deletedKeys.length > 0) {
211
- let newCount = 0;
212
- for (const key of deletedKeys) {
213
- __privateGet(this, _rowDeleteRevisions).set(key, ++__privateWrapper(this, _deleteRevision)._);
214
- if (!__privateGet(this, _deletedRows).has(key)) {
215
- __privateGet(this, _deletedRows).add(key);
216
- newCount++;
217
- }
218
- }
219
- if (newCount > 0) {
220
- this.deleteCount = __privateGet(this, _deleteCount) + newCount;
221
- }
222
- }
223
- }
224
- async addRow(rowData = {}) {
225
- const addRow = this.dataSource?.addRow;
226
- if (addRow === void 0) {
227
- throw Error("[EditSession] datasource does not support adding rows");
228
- }
229
- const response = await addRow.call(this.dataSource, rowData);
230
- if (response === void 0) {
231
- throw Error(
232
- "[EditSession] datasource returned no response when adding row"
233
- );
234
- }
235
- if (!isRpcError(response)) {
236
- this.addCount = __privateGet(this, _addCount) + 1;
237
- }
238
- return response;
239
- }
240
- restoreRows(keys) {
241
- for (const key of keys) {
242
- if (__privateGet(this, _deletedRows).has(key)) {
243
- __privateGet(this, _deletedRows).delete(key);
244
- __privateGet(this, _rowDeleteRevisions).delete(key);
245
- this.deleteCount = __privateGet(this, _deleteCount) - 1;
246
- }
247
- }
248
- }
249
- hasRowChanges(key) {
250
- return __privateGet(this, _rowEdits).has(key) || __privateGet(this, _deletedRows).has(key);
251
- }
252
- isCellEdited(key, columnName) {
253
- const cellEdit = __privateGet(this, _rowEdits).get(key)?.cellEdits.get(columnName);
254
- return cellEdit?.isValid === true && cellEdit.originalValue !== cellEdit.editedValue;
255
- }
256
- async undoRowChange(key) {
257
- if (!this.inEditMode) return;
258
- const undoRevision = __privateGet(this, _commitRevision);
259
- const deleteRevisionAtRequest = __privateGet(this, _rowDeleteRevisions).get(key);
260
- const rowEditsAtRequest = __privateGet(this, _rowEdits).get(key);
261
- const columnsAtRequest = new Set(rowEditsAtRequest?.cellEdits.keys());
262
- const wasDeleted = __privateGet(this, _deletedRows).has(key);
263
- const response = await this.dataSource?.undoRowChange?.(key);
264
- if (isRpcError(response)) {
265
- return;
266
- }
267
- const rowEdits = __privateGet(this, _rowEdits).get(key);
268
- if (rowEdits) {
269
- const changedColumns = [];
270
- for (const columnName of columnsAtRequest) {
271
- const latestRevision = __privateGet(this, _cellCommitRevisions).get(key)?.get(columnName) ?? 0;
272
- if (latestRevision > undoRevision) {
273
- continue;
274
- }
275
- if (this.isCellEdited(key, columnName)) {
276
- changedColumns.push(columnName);
277
- }
278
- rowEdits.cellEdits.delete(columnName);
279
- __privateMethod(this, _EditSession_instances, setCellCommitRevision_fn).call(this, key, columnName);
280
- }
281
- if (rowEdits.cellEdits.size === 0) {
282
- __privateGet(this, _rowEdits).delete(key);
283
- }
284
- __privateMethod(this, _EditSession_instances, refreshEditCounts_fn).call(this);
285
- for (const columnName of changedColumns) {
286
- this.emit("cellEditChanged", key, columnName);
287
- }
288
- }
289
- if (wasDeleted && __privateGet(this, _deletedRows).has(key) && __privateGet(this, _rowDeleteRevisions).get(key) === deleteRevisionAtRequest) {
290
- __privateGet(this, _deletedRows).delete(key);
291
- __privateGet(this, _rowDeleteRevisions).delete(key);
292
- this.deleteCount = __privateGet(this, _deleteCount) - 1;
293
- }
294
- const wasInsertedRow = response?.data?.wasInsertedRow === true;
295
- if (wasInsertedRow) {
296
- this.addCount = __privateGet(this, _addCount) - 1;
297
- }
298
- }
299
- begin(copyOption = "All") {
300
- return __privateMethod(this, _EditSession_instances, enqueue_fn).call(this, async () => {
301
- if (__privateGet(this, _lifecycle).status === "active" || __privateGet(this, _lifecycle).status === "error" && __privateGet(this, _lifecycle).operation === "end") {
302
- const sessionDataSource = __privateGet(this, _sessionDataSource);
303
- if (!sessionDataSource) {
304
- throw new Error("[EditSession] active lifecycle has no datasource");
305
- }
306
- if (__privateGet(this, _lifecycle).status === "error") {
307
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, {
308
- status: "active",
309
- sessionDataSource
310
- });
311
- }
312
- return sessionDataSource;
313
- }
314
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, { status: "starting" });
315
- try {
316
- const sourceDataSource = __privateGet(this, _sourceTableDataSource);
317
- const sessionDataSource = __privateGet(this, _editSessionApi) === "beginEditSession" ? await sourceDataSource?.beginEditSession?.(
318
- toEditSessionMode(copyOption)
319
- ) : await sourceDataSource?.createSessionDataSource?.(copyOption);
320
- if (!sessionDataSource) {
321
- throw new Error(
322
- `[EditSession] datasource does not support ${__privateGet(this, _editSessionApi)}`
323
- );
324
- }
325
- __privateSet(this, _sessionDataSource, sessionDataSource);
326
- __privateMethod(this, _EditSession_instances, setStale_fn).call(this, false);
327
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, { status: "active", sessionDataSource });
328
- return sessionDataSource;
329
- } catch (cause) {
330
- const error = cause instanceof Error ? cause : new Error(String(cause));
331
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, { status: "error", operation: "begin", error });
332
- throw error;
333
- }
334
- });
335
- }
336
- get dataSource() {
337
- return __privateGet(this, _sessionDataSource) ?? __privateGet(this, _sourceTableDataSource);
338
- }
339
- get sessionDataSource() {
340
- return __privateGet(this, _sessionDataSource);
341
- }
342
- end(saveChanges = false, force = false) {
343
- return __privateMethod(this, _EditSession_instances, enqueue_fn).call(this, async () => {
344
- if (__privateGet(this, _lifecycle).status === "idle" || __privateGet(this, _lifecycle).status === "error" && __privateGet(this, _lifecycle).operation === "begin") {
345
- if (__privateGet(this, _lifecycle).status !== "idle") {
346
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, { status: "idle" });
347
- }
348
- return;
349
- }
350
- const sessionDataSource = __privateGet(this, _sessionDataSource);
351
- if (!sessionDataSource) {
352
- throw new Error("[EditSession] ending lifecycle has no datasource");
353
- }
354
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, { status: "ending", sessionDataSource });
355
- try {
356
- await this.dataSource?.endEditSession?.(saveChanges, force);
357
- __privateMethod(this, _EditSession_instances, clearEdits_fn).call(this);
358
- __privateSet(this, _sessionDataSource, void 0);
359
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, { status: "idle" });
360
- } catch (cause) {
361
- const error = cause instanceof Error ? cause : new Error(String(cause));
362
- if (error instanceof StaleUpdateError) {
363
- __privateMethod(this, _EditSession_instances, setStale_fn).call(this, true);
364
- }
365
- __privateMethod(this, _EditSession_instances, setLifecycle_fn).call(this, {
366
- status: "error",
367
- operation: "end",
368
- error,
369
- sessionDataSource
370
- });
371
- throw error;
372
- }
373
- });
374
- }
375
- get lifecycle() {
376
- return __privateGet(this, _lifecycle);
377
- }
378
- get inEditMode() {
379
- return __privateGet(this, _lifecycle).status === "active" || __privateGet(this, _lifecycle).status === "ending" || __privateGet(this, _lifecycle).status === "error" && __privateGet(this, _lifecycle).operation === "end";
380
- }
381
- async commit(key, columnName, originalValue, typedValue, isValid) {
382
- if (__privateGet(this, _lifecycle).status !== "active" && !(__privateGet(this, _lifecycle).status === "error" && __privateGet(this, _lifecycle).operation === "end")) {
383
- throw new Error("No edit session in progress");
384
- }
385
- const revision = __privateMethod(this, _EditSession_instances, setCellCommitRevision_fn).call(this, key, columnName);
386
- const rowEditDetails = __privateMethod(this, _EditSession_instances, getOrCreateRowEdits_fn).call(this, key);
387
- const { cellEdits } = rowEditDetails;
388
- if (isValid) {
389
- const cellEdit = __privateMethod(this, _EditSession_instances, storeCellEdit_fn).call(this, key, cellEdits, columnName, originalValue, typedValue, isValid);
390
- if (this.dataSource?.editCell) {
391
- const response = await this.dataSource.editCell(
392
- key,
393
- columnName,
394
- typedValue
395
- );
396
- if (!__privateMethod(this, _EditSession_instances, isLatestCellCommit_fn).call(this, key, columnName, revision)) {
397
- throw new SupersededEditError(
398
- `Edit response superseded for ${key}:${columnName}`
399
- );
400
- }
401
- const currentCellEdits = __privateMethod(this, _EditSession_instances, getOrCreateRowEdits_fn).call(this, key).cellEdits;
402
- if (isRpcError(response)) {
403
- __privateMethod(this, _EditSession_instances, storeCellEdit_fn).call(this, key, currentCellEdits, columnName, cellEdit.originalValue, typedValue, false);
404
- } else if (currentCellEdits.size === 0) {
405
- __privateGet(this, _rowEdits).delete(key);
406
- }
407
- return response;
408
- }
409
- if (cellEdits.size === 0) {
410
- __privateGet(this, _rowEdits).delete(key);
411
- }
412
- return { data: void 0, type: "SUCCESS_RESULT" };
413
- } else {
414
- __privateMethod(this, _EditSession_instances, storeCellEdit_fn).call(this, key, cellEdits, columnName, originalValue, typedValue, isValid);
415
- return { data: void 0, type: "SUCCESS_RESULT" };
416
- }
417
- }
418
- };
419
- _rowEdits = new WeakMap();
420
- _deletedRows = new WeakMap();
421
- _deleteRevision = new WeakMap();
422
- _rowDeleteRevisions = new WeakMap();
423
- _editCount = new WeakMap();
424
- _deleteCount = new WeakMap();
425
- _addCount = new WeakMap();
426
- _invalidCount = new WeakMap();
427
- _isStale = new WeakMap();
428
- _commitRevision = new WeakMap();
429
- _cellCommitRevisions = new WeakMap();
430
- _deleteMode = new WeakMap();
431
- _editSessionApi = new WeakMap();
432
- _sourceTableDataSource = new WeakMap();
433
- _sessionDataSource = new WeakMap();
434
- _newRowState = new WeakMap();
435
- _lifecycle = new WeakMap();
436
- _transitionQueue = new WeakMap();
437
- _EditSession_instances = new WeakSet();
438
- emitEditStateChange_fn = function(oldState, force = false) {
439
- const newState = this.editState;
440
- if (force || newState !== oldState) {
441
- this.emit("editState", newState);
442
- }
443
- };
444
- setEditCounts_fn = function(editCount, invalidCount) {
445
- if (editCount !== __privateGet(this, _editCount) || invalidCount !== __privateGet(this, _invalidCount)) {
446
- const oldState = this.editState;
447
- __privateSet(this, _editCount, editCount);
448
- __privateSet(this, _invalidCount, invalidCount);
449
- __privateMethod(this, _EditSession_instances, emitEditStateChange_fn).call(this, oldState);
450
- }
451
- };
452
- setStale_fn = function(isStale) {
453
- if (isStale !== __privateGet(this, _isStale)) {
454
- const oldState = this.editState;
455
- __privateSet(this, _isStale, isStale);
456
- __privateMethod(this, _EditSession_instances, emitEditStateChange_fn).call(this, oldState);
457
- }
458
- };
459
- refreshEditCounts_fn = function() {
460
- let editCount = 0;
461
- let invalidCount = 0;
462
- for (const { cellEdits } of __privateGet(this, _rowEdits).values()) {
463
- for (const cellEdit of cellEdits.values()) {
464
- if (cellEdit.isValid) {
465
- editCount++;
466
- } else {
467
- invalidCount++;
468
- }
469
- }
470
- }
471
- __privateMethod(this, _EditSession_instances, setEditCounts_fn).call(this, editCount, invalidCount);
472
- };
473
- setNewRowState_fn = function(newRowState) {
474
- __privateSet(this, _newRowState, newRowState);
475
- this.emit("newRow", newRowState);
476
- };
477
- clearEdits_fn = function() {
478
- const oldState = this.editState;
479
- const editedCells = [...__privateGet(this, _rowEdits)].flatMap(
480
- ([key, { cellEdits }]) => [...cellEdits.keys()].filter((columnName) => this.isCellEdited(key, columnName)).map((columnName) => [key, columnName])
481
- );
482
- __privateGet(this, _rowEdits).clear();
483
- __privateGet(this, _deletedRows).clear();
484
- __privateGet(this, _rowDeleteRevisions).clear();
485
- __privateGet(this, _cellCommitRevisions).clear();
486
- __privateSet(this, _editCount, 0);
487
- __privateSet(this, _deleteCount, 0);
488
- __privateSet(this, _addCount, 0);
489
- __privateSet(this, _invalidCount, 0);
490
- __privateSet(this, _isStale, false);
491
- __privateMethod(this, _EditSession_instances, setNewRowState_fn).call(this, {
492
- columns: __privateGet(this, _newRowState).columns,
493
- draftRevision: __privateGet(this, _newRowState).draftRevision + 1,
494
- errors: {},
495
- submitting: false,
496
- values: {}
497
- });
498
- for (const [key, columnName] of editedCells) {
499
- this.emit("cellEditChanged", key, columnName);
500
- }
501
- __privateMethod(this, _EditSession_instances, emitEditStateChange_fn).call(this, oldState);
502
- };
503
- setLifecycle_fn = function(lifecycle) {
504
- __privateSet(this, _lifecycle, lifecycle);
505
- this.emit("lifecycle", lifecycle);
506
- };
507
- enqueue_fn = function(operation) {
508
- const result = __privateGet(this, _transitionQueue).then(operation);
509
- __privateSet(this, _transitionQueue, result.then(
510
- () => void 0,
511
- () => void 0
512
- ));
513
- return result;
514
- };
515
- getOrCreateRowEdits_fn = function(key) {
516
- const rowEditDetails = __privateGet(this, _rowEdits).get(key);
517
- if (rowEditDetails) {
518
- return rowEditDetails;
519
- } else {
520
- const rowEditDetails2 = {
521
- cellEdits: /* @__PURE__ */ new Map()
522
- };
523
- __privateGet(this, _rowEdits).set(key, rowEditDetails2);
524
- return rowEditDetails2;
525
- }
526
- };
527
- storeCellEdit_fn = function(key, cellEdits, column, originalValue, editedValue, isValid) {
528
- const wasEdited = this.isCellEdited(key, column);
529
- const existingCellEdit = cellEdits.get(column);
530
- const cellEdit = {
531
- originalValue: existingCellEdit?.originalValue ?? originalValue,
532
- editedValue,
533
- isValid
534
- };
535
- if (isValid && cellEdit.originalValue === editedValue) {
536
- cellEdits.delete(column);
537
- } else {
538
- cellEdits.set(column, cellEdit);
539
- }
540
- __privateMethod(this, _EditSession_instances, refreshEditCounts_fn).call(this);
541
- if (wasEdited !== this.isCellEdited(key, column)) {
542
- this.emit("cellEditChanged", key, column);
543
- }
544
- return cellEdit;
545
- };
546
- setCellCommitRevision_fn = function(key, columnName) {
547
- const revision = ++__privateWrapper(this, _commitRevision)._;
548
- const rowRevisions = __privateGet(this, _cellCommitRevisions).get(key) ?? /* @__PURE__ */ new Map();
549
- rowRevisions.set(columnName, revision);
550
- __privateGet(this, _cellCommitRevisions).set(key, rowRevisions);
551
- return revision;
552
- };
553
- isLatestCellCommit_fn = function(key, columnName, revision) {
554
- return __privateGet(this, _cellCommitRevisions).get(key)?.get(columnName) === revision;
555
- };
556
- __publicField(_EditSession, "newRowKey", "__vuu_new_row__");
557
- let EditSession = _EditSession;
558
-
559
- export { EditError, EditSession, SupersededEditError };
560
- //# sourceMappingURL=EditSession.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EditSession.js","sources":["../../../packages/vuu-data-editing/src/EditSession.tsx"],"sourcesContent":["import type {\n CopyOption,\n DataSource,\n DeleteRowMode,\n DeleteSelectedRowsResult,\n EditApi,\n EditSessionMode,\n UndoRowChangeResult,\n} from \"@vuu-ui/vuu-data-types\";\nimport type { RpcResult, VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter, isRpcError, StaleUpdateError } from \"@vuu-ui/vuu-utils\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\nexport type EditSessionApi =\n | \"createSessionDataSource\"\n | \"beginEditSession\";\nconst toEditSessionMode = (copyOption: CopyOption): EditSessionMode => {\n switch (copyOption) {\n case \"All\":\n return \"all-rows\";\n case \"Selected\":\n return \"selected-rows\";\n case \"Empty\":\n return \"empty-session-table\";\n }\n};\nexport type NewRowState = {\n columns: readonly string[];\n draftRevision: number;\n errors: Readonly<Record<string, string>>;\n submitting: boolean;\n values: Readonly<Record<string, VuuRowDataItemType>>;\n};\n\nexport type EditLifecycle =\n | { status: \"idle\" }\n | { status: \"starting\" }\n | { status: \"active\"; sessionDataSource: DataSource }\n | { status: \"ending\"; sessionDataSource: DataSource }\n | {\n status: \"error\";\n operation: \"begin\" | \"end\";\n error: Error;\n sessionDataSource?: DataSource;\n };\n\nexport class EditError extends Error {}\nexport class SupersededEditError extends Error {}\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid: boolean;\n};\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditSessionEvents = {\n cellEditChanged: (key: string, columnName: string) => void;\n editState: (editState: EditState) => void;\n lifecycle: (lifecycle: EditLifecycle) => void;\n newRow: (newRowState: NewRowState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n static readonly newRowKey = \"__vuu_new_row__\";\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #deletedRows = new Set<string>();\n #deleteRevision = 0;\n #rowDeleteRevisions = new Map<string, number>();\n #editCount = 0;\n #deleteCount = 0;\n #addCount = 0;\n #invalidCount = 0;\n #isStale = false;\n #commitRevision = 0;\n #cellCommitRevisions = new Map<string, Map<string, number>>();\n #deleteMode: DeleteRowMode;\n #editSessionApi: EditSessionApi;\n #sourceTableDataSource?: EditApi;\n #sessionDataSource?: DataSource;\n #newRowState: NewRowState = {\n columns: [],\n draftRevision: 0,\n errors: {},\n submitting: false,\n values: {},\n };\n #lifecycle: EditLifecycle = { status: \"idle\" };\n /** Prevent begin/end RPCs from overlapping and observing stale lifecycle state. */\n #transitionQueue: Promise<void> = Promise.resolve();\n\n constructor(\n dataSource: EditApi,\n deleteMode: DeleteRowMode = \"soft\",\n editSessionApi: EditSessionApi = \"createSessionDataSource\",\n ) {\n super();\n this.#sourceTableDataSource = dataSource;\n this.#deleteMode = deleteMode;\n this.#editSessionApi = editSessionApi;\n }\n\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n this.#setEditCounts(val, this.#invalidCount);\n }\n\n get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n this.#setEditCounts(this.#editCount, val);\n }\n\n get deleteCount() {\n return this.#deleteCount;\n }\n\n set deleteCount(val: number) {\n if (val !== this.#deleteCount) {\n const oldState = this.editState;\n const oldCount = this.#deleteCount;\n this.#deleteCount = val;\n this.#emitEditStateChange(oldState, oldCount === 0 || val === 0);\n }\n }\n\n get addCount() {\n return this.#addCount;\n }\n\n set addCount(val: number) {\n if (val !== this.#addCount) {\n const oldState = this.editState;\n const oldCount = this.#addCount;\n this.#addCount = val;\n this.#emitEditStateChange(oldState, oldCount === 0 || val === 0);\n }\n }\n\n get editState(): EditState {\n if (this.#invalidCount > 0) {\n return \"invalid\";\n }\n if (this.#isStale) {\n return \"stale\";\n }\n return this.#editCount === 0 &&\n this.#deleteCount === 0 &&\n this.#addCount === 0\n ? \"clean\"\n : \"dirty\";\n }\n\n #emitEditStateChange(oldState: EditState, force = false) {\n const newState = this.editState;\n if (force || newState !== oldState) {\n this.emit(\"editState\", newState);\n }\n }\n\n #setEditCounts(editCount: number, invalidCount: number) {\n if (editCount !== this.#editCount || invalidCount !== this.#invalidCount) {\n const oldState = this.editState;\n this.#editCount = editCount;\n this.#invalidCount = invalidCount;\n this.#emitEditStateChange(oldState);\n }\n }\n\n #setStale(isStale: boolean) {\n if (isStale !== this.#isStale) {\n const oldState = this.editState;\n this.#isStale = isStale;\n this.#emitEditStateChange(oldState);\n }\n }\n\n #refreshEditCounts() {\n let editCount = 0;\n let invalidCount = 0;\n for (const { cellEdits } of this.#rowEdits.values()) {\n for (const cellEdit of cellEdits.values()) {\n if (cellEdit.isValid) {\n editCount++;\n } else {\n invalidCount++;\n }\n }\n }\n this.#setEditCounts(editCount, invalidCount);\n }\n\n get newRowState(): NewRowState {\n return this.#newRowState;\n }\n\n isNewRow(key: string) {\n return key === EditSession.newRowKey;\n }\n\n isNewRowFinalColumn(columnName: string) {\n return this.#newRowState.columns.at(-1) === columnName;\n }\n\n isNewRowComplete() {\n return this.#newRowState.columns.every((column) => {\n const value = this.#newRowState.values[column];\n return (\n value !== undefined &&\n (typeof value !== \"string\" || value.trim() !== \"\")\n );\n });\n }\n\n configureNewRow(columns: readonly string[]) {\n if (\n columns.length === this.#newRowState.columns.length &&\n columns.every(\n (column, index) => column === this.#newRowState.columns[index],\n )\n ) {\n return;\n }\n\n const columnSet = new Set(columns);\n const errors = Object.fromEntries(\n Object.entries(this.#newRowState.errors).filter(([column]) =>\n columnSet.has(column),\n ),\n );\n this.#setNewRowState({\n ...this.#newRowState,\n columns: [...columns],\n errors,\n });\n }\n\n setNewRowValue(column: string, value: VuuRowDataItemType) {\n const errors = { ...this.#newRowState.errors };\n delete errors[column];\n this.#setNewRowState({\n ...this.#newRowState,\n errors,\n values: { ...this.#newRowState.values, [column]: value },\n });\n }\n\n async addNewRow(): Promise<RpcResult> {\n const missingErrors = Object.fromEntries(\n this.#newRowState.columns\n .filter((column) => {\n const value = this.#newRowState.values[column];\n return (\n value === undefined ||\n (typeof value === \"string\" && value.trim() === \"\")\n );\n })\n .map((column) => [column, \"Value required\"]),\n );\n const errors = { ...this.#newRowState.errors, ...missingErrors };\n\n if (Object.keys(errors).length > 0) {\n this.#setNewRowState({ ...this.#newRowState, errors });\n return { data: undefined, type: \"SUCCESS_RESULT\" };\n }\n\n if (this.#newRowState.submitting) {\n return { data: undefined, type: \"SUCCESS_RESULT\" };\n }\n\n this.#setNewRowState({ ...this.#newRowState, submitting: true });\n try {\n const response = await this.addRow({ ...this.#newRowState.values });\n if (isRpcError(response)) {\n const finalColumn = this.#newRowState.columns.at(-1);\n this.#setNewRowState({\n ...this.#newRowState,\n errors: finalColumn\n ? { [finalColumn]: response.errorMessage }\n : this.#newRowState.errors,\n submitting: false,\n });\n return response;\n }\n\n this.#setNewRowState({\n columns: this.#newRowState.columns,\n draftRevision: this.#newRowState.draftRevision + 1,\n errors: {},\n submitting: false,\n values: {},\n });\n return response;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unable to add row\";\n const finalColumn = this.#newRowState.columns.at(-1);\n this.#setNewRowState({\n ...this.#newRowState,\n errors: finalColumn\n ? { [finalColumn]: errorMessage }\n : this.#newRowState.errors,\n submitting: false,\n });\n return { errorMessage, type: \"ERROR_RESULT\" };\n }\n }\n\n #setNewRowState(newRowState: NewRowState) {\n this.#newRowState = newRowState;\n this.emit(\"newRow\", newRowState);\n }\n\n async deleteSelectedRows(): Promise<void> {\n const response = await this.dataSource?.deleteSelectedRows?.(\n this.#deleteMode,\n );\n if (isRpcError(response)) return;\n const deletedKeys = (response?.data as DeleteSelectedRowsResult | undefined)\n ?.deletedKeys;\n if (deletedKeys && deletedKeys.length > 0) {\n let newCount = 0;\n for (const key of deletedKeys) {\n this.#rowDeleteRevisions.set(key, ++this.#deleteRevision);\n if (!this.#deletedRows.has(key)) {\n this.#deletedRows.add(key);\n newCount++;\n }\n }\n if (newCount > 0) {\n this.deleteCount = this.#deleteCount + newCount;\n }\n }\n }\n\n async addRow(\n rowData: Record<string, VuuRowDataItemType> = {},\n ): Promise<RpcResult> {\n const addRow = this.dataSource?.addRow;\n if (addRow === undefined) {\n throw Error(\"[EditSession] datasource does not support adding rows\");\n }\n\n const response = await addRow.call(this.dataSource, rowData);\n if (response === undefined) {\n throw Error(\n \"[EditSession] datasource returned no response when adding row\",\n );\n }\n if (!isRpcError(response)) {\n this.addCount = this.#addCount + 1;\n }\n return response;\n }\n\n restoreRows(keys: string[]) {\n for (const key of keys) {\n if (this.#deletedRows.has(key)) {\n this.#deletedRows.delete(key);\n this.#rowDeleteRevisions.delete(key);\n this.deleteCount = this.#deleteCount - 1;\n }\n }\n }\n\n hasRowChanges(key: string): boolean {\n return this.#rowEdits.has(key) || this.#deletedRows.has(key);\n }\n\n isCellEdited(key: string, columnName: string): boolean {\n const cellEdit = this.#rowEdits.get(key)?.cellEdits.get(columnName);\n return (\n cellEdit?.isValid === true &&\n cellEdit.originalValue !== cellEdit.editedValue\n );\n }\n\n async undoRowChange(key: string): Promise<void> {\n if (!this.inEditMode) return;\n\n const undoRevision = this.#commitRevision;\n const deleteRevisionAtRequest = this.#rowDeleteRevisions.get(key);\n const rowEditsAtRequest = this.#rowEdits.get(key);\n const columnsAtRequest = new Set(rowEditsAtRequest?.cellEdits.keys());\n const wasDeleted = this.#deletedRows.has(key);\n const response = await this.dataSource?.undoRowChange?.(key);\n\n if (isRpcError(response)) {\n return;\n }\n\n const rowEdits = this.#rowEdits.get(key);\n if (rowEdits) {\n const changedColumns: string[] = [];\n for (const columnName of columnsAtRequest) {\n const latestRevision =\n this.#cellCommitRevisions.get(key)?.get(columnName) ?? 0;\n if (latestRevision > undoRevision) {\n continue;\n }\n if (this.isCellEdited(key, columnName)) {\n changedColumns.push(columnName);\n }\n rowEdits.cellEdits.delete(columnName);\n this.#setCellCommitRevision(key, columnName);\n }\n if (rowEdits.cellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n this.#refreshEditCounts();\n for (const columnName of changedColumns) {\n this.emit(\"cellEditChanged\", key, columnName);\n }\n }\n if (\n wasDeleted &&\n this.#deletedRows.has(key) &&\n this.#rowDeleteRevisions.get(key) === deleteRevisionAtRequest\n ) {\n this.#deletedRows.delete(key);\n this.#rowDeleteRevisions.delete(key);\n this.deleteCount = this.#deleteCount - 1;\n }\n\n // If the server deleted a newly inserted row, decrement addCount\n const wasInsertedRow =\n (response?.data as UndoRowChangeResult | undefined)?.wasInsertedRow ===\n true;\n if (wasInsertedRow) {\n this.addCount = this.#addCount - 1;\n }\n }\n\n #clearEdits() {\n const oldState = this.editState;\n const editedCells = [...this.#rowEdits].flatMap(([key, { cellEdits }]) =>\n [...cellEdits.keys()]\n .filter((columnName) => this.isCellEdited(key, columnName))\n .map((columnName) => [key, columnName] as const),\n );\n this.#rowEdits.clear();\n this.#deletedRows.clear();\n this.#rowDeleteRevisions.clear();\n this.#cellCommitRevisions.clear();\n this.#editCount = 0;\n this.#deleteCount = 0;\n this.#addCount = 0;\n this.#invalidCount = 0;\n this.#isStale = false;\n this.#setNewRowState({\n columns: this.#newRowState.columns,\n draftRevision: this.#newRowState.draftRevision + 1,\n errors: {},\n submitting: false,\n values: {},\n });\n for (const [key, columnName] of editedCells) {\n this.emit(\"cellEditChanged\", key, columnName);\n }\n this.#emitEditStateChange(oldState);\n }\n\n #setLifecycle(lifecycle: EditLifecycle) {\n this.#lifecycle = lifecycle;\n this.emit(\"lifecycle\", lifecycle);\n }\n\n #enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.#transitionQueue.then(operation);\n // Reassign to a settled continuation: callers keep the real result, while a\n // rejected transition cannot poison the queue for later begin/end requests.\n this.#transitionQueue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n begin(copyOption: CopyOption = \"All\"): Promise<DataSource> {\n return this.#enqueue(async () => {\n if (\n this.#lifecycle.status === \"active\" ||\n (this.#lifecycle.status === \"error\" &&\n this.#lifecycle.operation === \"end\")\n ) {\n const sessionDataSource = this.#sessionDataSource;\n if (!sessionDataSource) {\n throw new Error(\"[EditSession] active lifecycle has no datasource\");\n }\n if (this.#lifecycle.status === \"error\") {\n this.#setLifecycle({\n status: \"active\",\n sessionDataSource,\n });\n }\n return sessionDataSource;\n }\n\n this.#setLifecycle({ status: \"starting\" });\n\n try {\n const sourceDataSource = this.#sourceTableDataSource;\n const sessionDataSource =\n this.#editSessionApi === \"beginEditSession\"\n ? await sourceDataSource?.beginEditSession?.(\n toEditSessionMode(copyOption),\n )\n : await sourceDataSource?.createSessionDataSource?.(copyOption);\n if (!sessionDataSource) {\n throw new Error(\n `[EditSession] datasource does not support ${this.#editSessionApi}`,\n );\n }\n\n this.#sessionDataSource = sessionDataSource;\n this.#setStale(false);\n this.#setLifecycle({ status: \"active\", sessionDataSource });\n return sessionDataSource;\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.#setLifecycle({ status: \"error\", operation: \"begin\", error });\n throw error;\n }\n\n });\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n get sessionDataSource() {\n return this.#sessionDataSource;\n }\n\n end(saveChanges = false, force = false): Promise<void> {\n return this.#enqueue(async () => {\n if (\n this.#lifecycle.status === \"idle\" ||\n (this.#lifecycle.status === \"error\" &&\n this.#lifecycle.operation === \"begin\")\n ) {\n if (this.#lifecycle.status !== \"idle\") {\n this.#setLifecycle({ status: \"idle\" });\n }\n return;\n }\n\n const sessionDataSource = this.#sessionDataSource;\n if (!sessionDataSource) {\n throw new Error(\"[EditSession] ending lifecycle has no datasource\");\n }\n this.#setLifecycle({ status: \"ending\", sessionDataSource });\n\n try {\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.#clearEdits();\n this.#sessionDataSource = undefined;\n this.#setLifecycle({ status: \"idle\" });\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n if (error instanceof StaleUpdateError) {\n this.#setStale(true);\n }\n this.#setLifecycle({\n status: \"error\",\n operation: \"end\",\n error,\n sessionDataSource,\n });\n throw error;\n }\n });\n }\n\n get lifecycle() {\n return this.#lifecycle;\n }\n\n get inEditMode() {\n return (\n this.#lifecycle.status === \"active\" ||\n this.#lifecycle.status === \"ending\" ||\n (this.#lifecycle.status === \"error\" &&\n this.#lifecycle.operation === \"end\")\n );\n }\n\n #getOrCreateRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map<string, CellEdit>(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n #storeCellEdit(\n key: string,\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const wasEdited = this.isCellEdited(key, column);\n const existingCellEdit = cellEdits.get(column);\n const cellEdit: CellEdit = {\n originalValue: existingCellEdit?.originalValue ?? originalValue,\n editedValue,\n isValid,\n };\n\n if (isValid && cellEdit.originalValue === editedValue) {\n cellEdits.delete(column);\n } else {\n cellEdits.set(column, cellEdit);\n }\n this.#refreshEditCounts();\n if (wasEdited !== this.isCellEdited(key, column)) {\n this.emit(\"cellEditChanged\", key, column);\n }\n return cellEdit;\n }\n\n #setCellCommitRevision(key: string, columnName: string) {\n const revision = ++this.#commitRevision;\n const rowRevisions =\n this.#cellCommitRevisions.get(key) ?? new Map<string, number>();\n rowRevisions.set(columnName, revision);\n this.#cellCommitRevisions.set(key, rowRevisions);\n return revision;\n }\n\n #isLatestCellCommit(key: string, columnName: string, revision: number) {\n return this.#cellCommitRevisions.get(key)?.get(columnName) === revision;\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ): Promise<RpcResult> {\n if (\n this.#lifecycle.status !== \"active\" &&\n !(\n this.#lifecycle.status === \"error\" &&\n this.#lifecycle.operation === \"end\"\n )\n ) {\n throw new Error(\"No edit session in progress\");\n }\n const revision = this.#setCellCommitRevision(key, columnName);\n const rowEditDetails = this.#getOrCreateRowEdits(key);\n const { cellEdits } = rowEditDetails;\n\n if (isValid) {\n const cellEdit = this.#storeCellEdit(\n key,\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n if (this.dataSource?.editCell) {\n const response = await this.dataSource.editCell(\n key,\n columnName,\n typedValue,\n );\n if (!this.#isLatestCellCommit(key, columnName, revision)) {\n throw new SupersededEditError(\n `Edit response superseded for ${key}:${columnName}`,\n );\n }\n const currentCellEdits = this.#getOrCreateRowEdits(key).cellEdits;\n if (isRpcError(response)) {\n this.#storeCellEdit(\n key,\n currentCellEdits,\n columnName,\n cellEdit.originalValue,\n typedValue,\n false,\n );\n } else if (currentCellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n\n return response;\n }\n if (cellEdits.size === 0) {\n this.#rowEdits.delete(key);\n }\n return { data: undefined, type: \"SUCCESS_RESULT\" };\n } else {\n this.#storeCellEdit(\n key,\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n return { data: undefined, type: \"SUCCESS_RESULT\" };\n }\n }\n}\n"],"names":["rowEditDetails"],"mappings":"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"}