@affino/datagrid-vue 0.3.30 → 0.3.32

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.
@@ -24,16 +24,18 @@ export interface UseDataGridAppClipboardOptions<TRow, TSnapshot> {
24
24
  } | null;
25
25
  applySelectionRange: (range: DataGridCopyRange) => void;
26
26
  clearCellSelection: () => void;
27
+ setLastAction?: (message: string) => void;
27
28
  captureRowsSnapshot: () => TSnapshot;
28
29
  captureRowsSnapshotForRowIds?: (rowIds: readonly (string | number)[]) => TSnapshot;
29
- recordEditTransaction: (beforeSnapshot: TSnapshot) => void;
30
+ recordEditTransaction: (beforeSnapshot: TSnapshot, afterSnapshotOverride?: TSnapshot, label?: string) => void;
30
31
  readCell: (row: DataGridRowNode<TRow>, columnKey: string) => string;
31
32
  readClipboardCell?: (row: DataGridRowNode<TRow>, columnKey: string) => string;
32
33
  isCellEditable: (row: DataGridRowNode<TRow>, rowIndex: number, columnKey: string, columnIndex: number) => boolean;
33
34
  syncViewport: () => void;
34
35
  applyClipboardEdits?: (range: DataGridCopyRange, matrix: string[][], options?: {
35
36
  recordHistory?: boolean;
36
- }) => number;
37
+ recordHistoryLabel?: string;
38
+ }) => number | Promise<number>;
37
39
  buildFillMatrixFromRange?: (range: DataGridCopyRange) => string[][];
38
40
  buildPasteSpecialMatrixFromRange?: (range: DataGridCopyRange, mode: Exclude<DataGridAppPasteMode, "default">) => string[][];
39
41
  }
@@ -44,7 +46,8 @@ export interface UseDataGridAppClipboardResult {
44
46
  normalizeClipboardRange: (range: DataGridCopyRange) => DataGridCopyRange | null;
45
47
  applyClipboardEdits: (range: DataGridCopyRange, matrix: string[][], options?: {
46
48
  recordHistory?: boolean;
47
- }) => number;
49
+ recordHistoryLabel?: string;
50
+ }) => number | Promise<number>;
48
51
  rangesEqual: (left: DataGridCopyRange | null, right: DataGridCopyRange | null) => boolean;
49
52
  buildFillMatrixFromRange: (range: DataGridCopyRange) => string[][];
50
53
  clearPendingClipboardOperation: (clearSelection: boolean, clearBufferedClipboardPayload?: boolean) => boolean;
@@ -54,5 +57,7 @@ export interface UseDataGridAppClipboardResult {
54
57
  isCellInPendingClipboardRange: (rowOffset: number, columnIndex: number) => boolean;
55
58
  isCellOnPendingClipboardEdge: (rowOffset: number, columnIndex: number, edge: DataGridAppPendingClipboardEdge) => boolean;
56
59
  }
60
+ export declare function isDataGridRowMissingOrPlaceholder<TRow>(row: DataGridRowNode<TRow> | null | undefined): boolean;
61
+ export declare function resolveMissingRowIndexInRange<TRow>(getBodyRowAtIndex: (rowIndex: number) => DataGridRowNode<TRow> | null | undefined, range: DataGridCopyRange): number | null;
57
62
  export declare function useDataGridAppClipboard<TRow, TSnapshot>(options: UseDataGridAppClipboardOptions<TRow, TSnapshot>): UseDataGridAppClipboardResult;
58
63
  //# sourceMappingURL=useDataGridAppClipboard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridAppClipboard.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppClipboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDataGridAppClipboard.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppClipboard.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,19 @@
1
1
  import { ref } from "vue";
2
2
  import { useDataGridClipboardBridge, useDataGridCopyRangeHelpers } from "../advanced";
3
+ export function isDataGridRowMissingOrPlaceholder(row) {
4
+ if (!row) {
5
+ return true;
6
+ }
7
+ return row.__placeholder === true;
8
+ }
9
+ export function resolveMissingRowIndexInRange(getBodyRowAtIndex, range) {
10
+ for (let rowIndex = range.startRow; rowIndex <= range.endRow; rowIndex += 1) {
11
+ if (isDataGridRowMissingOrPlaceholder(getBodyRowAtIndex(rowIndex))) {
12
+ return rowIndex;
13
+ }
14
+ }
15
+ return null;
16
+ }
3
17
  export function useDataGridAppClipboard(options) {
4
18
  const getBodyRowAtIndex = (rowIndex) => {
5
19
  const runtime = options.runtime;
@@ -43,20 +57,19 @@ export function useDataGridAppClipboard(options) {
43
57
  getCellValue: (row, columnKey) => (options.readClipboardCell
44
58
  ? options.readClipboardCell(row, columnKey)
45
59
  : options.readCell(row, columnKey)),
46
- setLastAction: () => undefined,
60
+ setLastAction: message => {
61
+ options.setLastAction?.(message);
62
+ },
47
63
  closeContextMenu: () => undefined,
48
64
  });
49
- const applyClipboardEdits = options.applyClipboardEdits ?? ((range, matrix, applyOptions = {}) => {
65
+ const collectClipboardEdits = (range, matrix) => {
50
66
  const normalized = normalizeClipboardRange(range);
51
67
  if (!normalized) {
52
- return 0;
68
+ return { normalizedRange: null, updates: [] };
53
69
  }
54
70
  const matrixHeight = Math.max(1, matrix.length);
55
71
  const matrixWidth = Math.max(1, matrix[0]?.length ?? 1);
56
72
  const editsByRowId = new Map();
57
- const beforeSnapshot = applyOptions.recordHistory === false
58
- ? null
59
- : options.captureRowsSnapshot();
60
73
  for (let rowIndex = normalized.startRow; rowIndex <= normalized.endRow; rowIndex += 1) {
61
74
  const row = options.ensureEditableRowAtIndex?.(rowIndex) ?? getBodyRowAtIndex(rowIndex);
62
75
  if (!row || row.rowId == null || row.kind === "group") {
@@ -78,19 +91,35 @@ export function useDataGridAppClipboard(options) {
78
91
  editsByRowId.set(row.rowId, current);
79
92
  }
80
93
  }
81
- if (editsByRowId.size === 0) {
94
+ return {
95
+ normalizedRange: normalized,
96
+ updates: Array.from(editsByRowId.entries(), ([rowId, data]) => ({
97
+ rowId,
98
+ data: data,
99
+ })),
100
+ };
101
+ };
102
+ const applyClipboardEdits = options.applyClipboardEdits ?? (async (range, matrix, applyOptions = {}) => {
103
+ const { normalizedRange: normalized, updates } = collectClipboardEdits(range, matrix);
104
+ if (!normalized) {
82
105
  return 0;
83
106
  }
84
- const updates = Array.from(editsByRowId.entries(), ([rowId, data]) => ({
85
- rowId,
86
- data: data,
87
- }));
88
- options.runtime.api.rows.applyEdits(updates);
107
+ if (updates.length === 0) {
108
+ return 0;
109
+ }
110
+ const rowIds = Array.from(new Set(updates.map(update => update.rowId)));
111
+ const beforeSnapshot = applyOptions.recordHistory === false
112
+ ? null
113
+ : (options.captureRowsSnapshotForRowIds?.(rowIds) ?? options.captureRowsSnapshot());
114
+ const afterSnapshot = beforeSnapshot != null
115
+ ? buildAfterEditSnapshot(beforeSnapshot, updates)
116
+ : null;
117
+ await options.runtime.api.rows.applyEdits(updates);
89
118
  options.applySelectionRange(normalized);
90
119
  if (beforeSnapshot != null) {
91
- options.recordEditTransaction(beforeSnapshot);
120
+ options.recordEditTransaction(beforeSnapshot, afterSnapshot ?? undefined, applyOptions.recordHistoryLabel);
92
121
  }
93
- return editsByRowId.size;
122
+ return updates.length;
94
123
  });
95
124
  const rangesEqual = (left, right) => {
96
125
  if (!left || !right) {
@@ -124,6 +153,35 @@ export function useDataGridAppClipboard(options) {
124
153
  }
125
154
  return options.captureRowsSnapshot();
126
155
  };
156
+ const buildAfterEditSnapshot = (beforeSnapshot, updates) => {
157
+ if (!beforeSnapshot || typeof beforeSnapshot !== "object") {
158
+ return beforeSnapshot;
159
+ }
160
+ const snapshot = beforeSnapshot;
161
+ if (!Array.isArray(snapshot.rows)) {
162
+ return beforeSnapshot;
163
+ }
164
+ const updatesByRowId = new Map();
165
+ for (const update of updates) {
166
+ updatesByRowId.set(update.rowId, update.data);
167
+ }
168
+ return {
169
+ ...beforeSnapshot,
170
+ rows: snapshot.rows.map(entry => {
171
+ const patch = updatesByRowId.get(entry.rowId);
172
+ if (!patch) {
173
+ return entry;
174
+ }
175
+ return {
176
+ ...entry,
177
+ row: {
178
+ ...entry.row,
179
+ ...patch,
180
+ },
181
+ };
182
+ }),
183
+ };
184
+ };
127
185
  const buildFillMatrixFromRange = options.buildFillMatrixFromRange ?? ((range) => {
128
186
  const matrix = [];
129
187
  for (let rowIndex = range.startRow; rowIndex <= range.endRow; rowIndex += 1) {
@@ -183,6 +241,14 @@ export function useDataGridAppClipboard(options) {
183
241
  return true;
184
242
  };
185
243
  const copySelectedCells = async (trigger = "keyboard") => {
244
+ const sourceRange = copyRangeHelpers.resolveCopyRange();
245
+ if (sourceRange) {
246
+ const missingRowIndex = resolveMissingRowIndexInRange(getBodyRowAtIndex, sourceRange);
247
+ if (missingRowIndex != null) {
248
+ options.setLastAction?.("Selected range includes unloaded rows. Load rows or use server export.");
249
+ return false;
250
+ }
251
+ }
186
252
  return stageClipboardOperation("copy", trigger);
187
253
  };
188
254
  const pasteSelectedCells = async (trigger = "keyboard", pasteOptions = {}) => {
@@ -229,21 +295,33 @@ export function useDataGridAppClipboard(options) {
229
295
  void trigger;
230
296
  return true;
231
297
  }
232
- const beforeSnapshot = captureBeforeEditSnapshot(pendingOperation === "cut"
233
- ? [pendingSourceRange, normalizedTargetRange]
234
- : [normalizedTargetRange]);
235
298
  if (pendingOperation === "cut" && pendingSourceRange) {
236
- applyClipboardEdits(pendingSourceRange, [[""]], { recordHistory: false });
299
+ const beforeSnapshot = captureBeforeEditSnapshot([pendingSourceRange, normalizedTargetRange]);
300
+ const sourceClearUpdates = collectClipboardEdits(pendingSourceRange, [[""]]).updates;
301
+ const targetUpdates = collectClipboardEdits(targetRange, matrix).updates;
302
+ await applyClipboardEdits(pendingSourceRange, [[""]], { recordHistory: false });
303
+ const appliedRows = await applyClipboardEdits(targetRange, matrix, { recordHistory: false });
304
+ if (appliedRows <= 0) {
305
+ return false;
306
+ }
307
+ const afterSnapshot = buildAfterEditSnapshot(beforeSnapshot, [
308
+ ...sourceClearUpdates,
309
+ ...targetUpdates,
310
+ ]);
311
+ options.recordEditTransaction(beforeSnapshot, afterSnapshot);
312
+ clearPendingClipboardOperation(false);
313
+ options.applySelectionRange(normalizedTargetRange);
314
+ options.syncViewport();
315
+ void trigger;
316
+ return true;
237
317
  }
238
- const appliedRows = applyClipboardEdits(targetRange, matrix, { recordHistory: false });
318
+ const appliedRows = await applyClipboardEdits(targetRange, matrix, { recordHistory: true });
239
319
  if (appliedRows <= 0) {
240
320
  return false;
241
321
  }
242
- options.recordEditTransaction(beforeSnapshot);
243
322
  if (pendingOperation !== "none") {
244
323
  clearPendingClipboardOperation(false);
245
324
  }
246
- options.applySelectionRange(normalizedTargetRange);
247
325
  options.syncViewport();
248
326
  void trigger;
249
327
  return true;
@@ -18,14 +18,39 @@ export interface UseDataGridAppFillOptions {
18
18
  resolveSelectionRange: () => DataGridCopyRange | null;
19
19
  rangesEqual: (left: DataGridCopyRange | null, right: DataGridCopyRange | null) => boolean;
20
20
  buildFillMatrixFromRange: (range: DataGridCopyRange) => string[][];
21
- applyClipboardEdits: (range: DataGridCopyRange, matrix: string[][]) => number;
21
+ shouldUseServerFill?: (baseRange: DataGridCopyRange, previewRange: DataGridCopyRange, behavior: DataGridFillBehavior) => boolean;
22
+ commitServerFill?: (request: {
23
+ baseRange: DataGridCopyRange;
24
+ previewRange: DataGridCopyRange;
25
+ behavior: DataGridFillBehavior;
26
+ }) => Promise<{
27
+ operationId: string;
28
+ revision?: string | number | null;
29
+ affectedRange?: DataGridCopyRange | null;
30
+ invalidation?: {
31
+ kind: "range";
32
+ range: DataGridCopyRange;
33
+ reason?: string;
34
+ } | null;
35
+ } | null>;
36
+ applyClipboardEdits: (range: DataGridCopyRange, matrix: string[][], options?: {
37
+ recordHistory?: boolean;
38
+ recordHistoryLabel?: string;
39
+ }) => number | Promise<number>;
22
40
  isCellEditableAt: (rowIndex: number, columnIndex: number) => boolean;
23
41
  setLastAppliedFillSession: (session: DataGridAppAppliedFillSession | null) => void;
42
+ setLastServerFillSession?: (session: {
43
+ operationId: string;
44
+ revision?: string | number | null;
45
+ affectedRange?: DataGridCopyRange | null;
46
+ behavior: DataGridFillBehavior;
47
+ } | null) => void;
48
+ syncServerFillViewport?: (range?: DataGridCopyRange | null) => void | Promise<void>;
24
49
  syncViewport: () => void;
25
50
  }
26
51
  export interface UseDataGridAppFillResult {
27
- applyFillPreview: (behavior?: DataGridFillBehavior) => boolean;
28
- applyFillRange: (baseRange: DataGridCopyRange, previewRange: DataGridCopyRange, behavior?: DataGridFillBehavior) => boolean;
52
+ applyFillPreview: (behavior?: DataGridFillBehavior) => boolean | Promise<boolean>;
53
+ applyFillRange: (baseRange: DataGridCopyRange, previewRange: DataGridCopyRange, behavior?: DataGridFillBehavior) => boolean | Promise<boolean>;
29
54
  isCellInFillPreview: (rowOffset: number, columnIndex: number) => boolean;
30
55
  isFillHandleCell: (rowOffset: number, columnIndex: number) => boolean;
31
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridAppFill.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppFill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,EACL,KAAK,oBAAoB,EAI1B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EACL,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,iBAAiB,CAAA;IAC5B,YAAY,EAAE,iBAAiB,CAAA;IAC/B,QAAQ,EAAE,oBAAoB,CAAA;IAC9B,mBAAmB,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,CAAA;IAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,aAAa,EAAE,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAC5C,gBAAgB,EAAE,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAC/C,kBAAkB,EAAE,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAA;IACpD,qBAAqB,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAA;IACrD,WAAW,EAAE,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,KAAK,OAAO,CAAA;IACzF,wBAAwB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,MAAM,EAAE,EAAE,CAAA;IAClE,mBAAmB,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,MAAM,CAAA;IAC7E,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAA;IACpE,yBAAyB,EAAE,CAAC,OAAO,EAAE,6BAA6B,GAAG,IAAI,KAAK,IAAI,CAAA;IAClF,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAA;IAC9D,cAAc,EAAE,CACd,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,iBAAiB,EAC/B,QAAQ,CAAC,EAAE,oBAAoB,KAC5B,OAAO,CAAA;IACZ,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAA;IACxE,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAA;CACtE;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GACjC,wBAAwB,CA0G1B"}
1
+ {"version":3,"file":"useDataGridAppFill.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppFill.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { buildDataGridFillMatrix, canToggleDataGridFillBehavior, resolveDataGridDefaultFillBehavior, } from "../composables/dataGridFillBehavior";
2
2
  import {} from "../advanced";
3
3
  export function useDataGridAppFill(options) {
4
- const applyFillRange = (baseRange, previewRange, behaviorOverride) => {
4
+ const applyFillRange = async (baseRange, previewRange, behaviorOverride) => {
5
5
  if (options.rangesEqual(baseRange, previewRange)) {
6
6
  return false;
7
7
  }
@@ -16,13 +16,35 @@ export function useDataGridAppFill(options) {
16
16
  previewRange,
17
17
  sourceMatrix,
18
18
  });
19
+ const useServerFill = options.shouldUseServerFill?.(baseRange, previewRange, behavior) ?? false;
20
+ if (useServerFill && options.commitServerFill) {
21
+ const committed = await options.commitServerFill({ baseRange, previewRange, behavior });
22
+ if (committed) {
23
+ options.setLastServerFillSession?.({
24
+ operationId: committed.operationId,
25
+ revision: committed.revision,
26
+ affectedRange: committed.affectedRange ?? previewRange,
27
+ behavior,
28
+ });
29
+ if (options.syncServerFillViewport) {
30
+ await options.syncServerFillViewport(committed.invalidation?.range ?? committed.affectedRange ?? previewRange);
31
+ }
32
+ else {
33
+ options.syncViewport();
34
+ }
35
+ return true;
36
+ }
37
+ return false;
38
+ }
19
39
  const matrix = buildDataGridFillMatrix({
20
40
  baseRange,
21
41
  previewRange,
22
42
  sourceMatrix,
23
43
  behavior,
24
44
  });
25
- const appliedRows = options.applyClipboardEdits(previewRange, matrix);
45
+ const appliedRows = await options.applyClipboardEdits(previewRange, matrix, {
46
+ recordHistoryLabel: "Fill edit",
47
+ });
26
48
  if (appliedRows > 0) {
27
49
  options.setLastAppliedFillSession({
28
50
  baseRange: { ...baseRange },
@@ -39,7 +61,7 @@ export function useDataGridAppFill(options) {
39
61
  }
40
62
  return false;
41
63
  };
42
- const applyFillPreview = (behavior) => {
64
+ const applyFillPreview = async (behavior) => {
43
65
  const baseRange = options.fillBaseRange.value;
44
66
  const previewRange = options.fillPreviewRange.value;
45
67
  if (!baseRange || !previewRange) {
@@ -31,7 +31,17 @@ export interface UseDataGridAppInlineEditingOptions<TRow, TSnapshot> {
31
31
  isCellEditable: (row: DataGridRowNode<TRow>, rowIndex: number, columnKey: string, columnIndex: number) => boolean;
32
32
  captureRowsSnapshot: () => TSnapshot;
33
33
  captureRowsSnapshotForRowIds?: (rowIds: readonly (string | number)[]) => TSnapshot;
34
- recordEditTransaction: (beforeSnapshot: TSnapshot) => void;
34
+ recordEditTransaction: (beforeSnapshot: TSnapshot, afterSnapshotOverride?: TSnapshot, label?: string) => void;
35
+ onCellEdit?: (payload: {
36
+ rowId: string | number;
37
+ columnKey: string;
38
+ oldValue: unknown;
39
+ newValue: unknown;
40
+ patch: {
41
+ rowId: string | number;
42
+ data: Partial<TRow>;
43
+ };
44
+ }) => void;
35
45
  }
36
46
  export interface UseDataGridAppInlineEditingResult<TRow> {
37
47
  editingCell: Ref<DataGridAppEditingCell | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridAppInlineEditing.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppInlineEditing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDataGridAppInlineEditing.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppInlineEditing.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,27 @@ import { nextTick, ref } from "vue";
2
2
  import { buildDataGridCellRenderModel, parseDataGridCellDraftValue, } from "@affino/datagrid-core";
3
3
  import { restoreDataGridFocus } from "./dataGridFocusRestore";
4
4
  export function useDataGridAppInlineEditing(options) {
5
+ const buildAfterSnapshotFromEdit = (beforeSnapshot, rowId, columnKey, nextValue) => {
6
+ if (beforeSnapshot && typeof beforeSnapshot === "object" && Array.isArray(beforeSnapshot.rows)) {
7
+ const snapshot = beforeSnapshot;
8
+ return {
9
+ ...beforeSnapshot,
10
+ rows: snapshot.rows.map(entry => {
11
+ if (entry.rowId !== rowId) {
12
+ return entry;
13
+ }
14
+ return {
15
+ ...entry,
16
+ row: {
17
+ ...entry.row,
18
+ [columnKey]: nextValue,
19
+ },
20
+ };
21
+ }),
22
+ };
23
+ }
24
+ return beforeSnapshot;
25
+ };
5
26
  const editingCell = ref(null);
6
27
  const editingCellValue = ref("");
7
28
  const editingCellInitialFilter = ref("");
@@ -285,7 +306,7 @@ export function useDataGridAppInlineEditing(options) {
285
306
  focusInlineEditor();
286
307
  return true;
287
308
  };
288
- const commitInlineEdit = (targetOrEvent = "stay") => {
309
+ const commitInlineEdit = async (targetOrEvent = "stay") => {
289
310
  const currentEditingCell = editingCell.value;
290
311
  if (!currentEditingCell) {
291
312
  return;
@@ -309,6 +330,11 @@ export function useDataGridAppInlineEditing(options) {
309
330
  }
310
331
  const resolvedRowId = rowNode?.rowId ?? currentEditingCell.rowId;
311
332
  const columnSnapshot = options.visibleColumns.value.find(column => column.key === currentEditingCell.columnKey);
333
+ const oldValue = rowNode && rowNode.kind !== "group"
334
+ ? (columnSnapshot
335
+ ? readEditorSourceValue(rowNode, columnSnapshot)
336
+ : rowNode.data[currentEditingCell.columnKey])
337
+ : undefined;
312
338
  const parsedValue = columnSnapshot
313
339
  ? parseDataGridCellDraftValue({
314
340
  column: columnSnapshot.column,
@@ -316,7 +342,10 @@ export function useDataGridAppInlineEditing(options) {
316
342
  draft: editingCellValue.value,
317
343
  })
318
344
  : editingCellValue.value;
319
- options.runtime.api.rows.applyEdits([
345
+ const afterSnapshot = typeof beforeSnapshot !== "undefined"
346
+ ? buildAfterSnapshotFromEdit(beforeSnapshot, resolvedRowId, currentEditingCell.columnKey, parsedValue)
347
+ : undefined;
348
+ await options.runtime.api.rows.applyEdits([
320
349
  {
321
350
  rowId: resolvedRowId,
322
351
  data: {
@@ -324,7 +353,19 @@ export function useDataGridAppInlineEditing(options) {
324
353
  },
325
354
  },
326
355
  ]);
327
- options.recordEditTransaction(beforeSnapshot);
356
+ options.onCellEdit?.({
357
+ rowId: resolvedRowId,
358
+ columnKey: currentEditingCell.columnKey,
359
+ oldValue,
360
+ newValue: parsedValue,
361
+ patch: {
362
+ rowId: resolvedRowId,
363
+ data: {
364
+ [currentEditingCell.columnKey]: parsedValue,
365
+ },
366
+ },
367
+ });
368
+ options.recordEditTransaction(beforeSnapshot, afterSnapshot, "Cell edit");
328
369
  clearInlineEdit();
329
370
  suppressNextBlurCommit.value = false;
330
371
  if (target !== "none") {
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridAppIntentHistory.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppIntentHistory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AAEjF,MAAM,WAAW,sBAAsB,CAAC,IAAI;IAC1C,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,kCAAkC,CAAC,IAAI;IACtD,OAAO,EAAE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,mBAAmB,GAAG,yBAAyB,CAAC,CAAA;IACtG,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAA;IACjC,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,iCAAiC,CAAC,IAAI;IACrD,mBAAmB,EAAE,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAA;IACvD,wBAAwB,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK,sBAAsB,CAAC,IAAI,CAAC,CAAA;IAChG,OAAO,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC7F,OAAO,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC7F,gBAAgB,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAA;IAC/G,uBAAuB,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAA;IAC7H,OAAO,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;CAC9F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAC9C,OAAO,EAAE,kCAAkC,CAAC,IAAI,CAAC,GAChD,iCAAiC,CAAC,IAAI,CAAC,CAkGzC"}
1
+ {"version":3,"file":"useDataGridAppIntentHistory.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppIntentHistory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AAEjF,MAAM,WAAW,sBAAsB,CAAC,IAAI;IAC1C,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,IAAI,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,EAAE,IAAI,CAAA;KAAE,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,kCAAkC,CAAC,IAAI;IACtD,OAAO,EAAE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,mBAAmB,GAAG,yBAAyB,CAAC,CAAA;IACtG,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAA;IACjC,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,iCAAiC,CAAC,IAAI;IACrD,mBAAmB,EAAE,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAA;IACvD,wBAAwB,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK,sBAAsB,CAAC,IAAI,CAAC,CAAA;IAChG,OAAO,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC7F,OAAO,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC7F,gBAAgB,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAA;IAC/G,uBAAuB,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAA;IAC7H,OAAO,EAAE,UAAU,CAAC,OAAO,wBAAwB,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;CAC9F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAC9C,OAAO,EAAE,kCAAkC,CAAC,IAAI,CAAC,GAChD,iCAAiC,CAAC,IAAI,CAAC,CAgIzC"}
@@ -1,5 +1,12 @@
1
1
  import { useDataGridIntentHistory } from "../advanced";
2
2
  export function useDataGridAppIntentHistory(options) {
3
+ const cloneSnapshot = (snapshot) => ({
4
+ kind: snapshot.kind,
5
+ rows: snapshot.rows.map(entry => ({
6
+ rowId: entry.rowId,
7
+ row: options.cloneRowData(entry.row),
8
+ })),
9
+ });
3
10
  const resolveRuntimeRowById = (rowId) => {
4
11
  const rowIndex = options.runtime.resolveBodyRowIndexById(rowId);
5
12
  if (rowIndex >= 0) {
@@ -53,7 +60,7 @@ export function useDataGridAppIntentHistory(options) {
53
60
  applySnapshot: snapshot => {
54
61
  if (snapshot.kind === "partial") {
55
62
  if (snapshot.rows.length > 0) {
56
- options.runtime.api.rows.applyEdits(snapshot.rows.map(entry => ({
63
+ return options.runtime.api.rows.applyEdits(snapshot.rows.map(entry => ({
57
64
  rowId: entry.rowId,
58
65
  data: options.cloneRowData(entry.row),
59
66
  })));
@@ -61,7 +68,21 @@ export function useDataGridAppIntentHistory(options) {
61
68
  options.syncViewport();
62
69
  return;
63
70
  }
64
- options.runtime.api.rows.setData(snapshot.rows.map((entry, index) => ({
71
+ const rowsApi = options.runtime.api.rows;
72
+ if (typeof rowsApi.hasDataMutationSupport === "function" && !rowsApi.hasDataMutationSupport()) {
73
+ const rowPatches = snapshot.rows.map(entry => ({
74
+ rowId: entry.rowId,
75
+ data: options.cloneRowData(entry.row),
76
+ }));
77
+ if (rowPatches.length > 0) {
78
+ return Promise.resolve(rowsApi.applyEdits?.(rowPatches)).then(() => {
79
+ options.syncViewport();
80
+ });
81
+ }
82
+ options.syncViewport();
83
+ return;
84
+ }
85
+ rowsApi.setData?.(snapshot.rows.map((entry, index) => ({
65
86
  rowId: entry.rowId,
66
87
  originalIndex: index,
67
88
  row: options.cloneRowData(entry.row),
@@ -75,7 +96,7 @@ export function useDataGridAppIntentHistory(options) {
75
96
  ?? (beforeSnapshot.kind === "partial"
76
97
  ? captureRowsSnapshotByIds(beforeSnapshot.rows.map(entry => entry.rowId))
77
98
  : captureRowsSnapshot());
78
- return intentHistory.recordIntentTransaction(descriptor, beforeSnapshot, afterSnapshot);
99
+ return intentHistory.recordIntentTransaction(descriptor, cloneSnapshot(beforeSnapshot), cloneSnapshot(afterSnapshot));
79
100
  };
80
101
  return {
81
102
  captureRowsSnapshot,