@affino/datagrid-vue 0.3.31 → 0.3.33

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,6 +24,7 @@ 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
30
  recordEditTransaction: (beforeSnapshot: TSnapshot, afterSnapshotOverride?: TSnapshot, label?: string) => void;
@@ -56,5 +57,7 @@ export interface UseDataGridAppClipboardResult {
56
57
  isCellInPendingClipboardRange: (rowOffset: number, columnIndex: number) => boolean;
57
58
  isCellOnPendingClipboardEdge: (rowOffset: number, columnIndex: number, edge: DataGridAppPendingClipboardEdge) => boolean;
58
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;
59
62
  export declare function useDataGridAppClipboard<TRow, TSnapshot>(options: UseDataGridAppClipboardOptions<TRow, TSnapshot>): UseDataGridAppClipboardResult;
60
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,13 +57,15 @@ 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 ?? (async (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);
@@ -75,26 +91,35 @@ export function useDataGridAppClipboard(options) {
75
91
  editsByRowId.set(row.rowId, current);
76
92
  }
77
93
  }
78
- 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) {
105
+ return 0;
106
+ }
107
+ if (updates.length === 0) {
79
108
  return 0;
80
109
  }
81
- const rowIds = Array.from(editsByRowId.keys());
110
+ const rowIds = Array.from(new Set(updates.map(update => update.rowId)));
82
111
  const beforeSnapshot = applyOptions.recordHistory === false
83
112
  ? null
84
113
  : (options.captureRowsSnapshotForRowIds?.(rowIds) ?? options.captureRowsSnapshot());
85
- const updates = Array.from(editsByRowId.entries(), ([rowId, data]) => ({
86
- rowId,
87
- data: data,
88
- }));
114
+ const afterSnapshot = beforeSnapshot != null
115
+ ? buildAfterEditSnapshot(beforeSnapshot, updates)
116
+ : null;
89
117
  await options.runtime.api.rows.applyEdits(updates);
90
118
  options.applySelectionRange(normalized);
91
119
  if (beforeSnapshot != null) {
92
- const afterSnapshot = options.captureRowsSnapshotForRowIds
93
- ? options.captureRowsSnapshotForRowIds(rowIds)
94
- : options.captureRowsSnapshot();
95
- options.recordEditTransaction(beforeSnapshot, afterSnapshot, applyOptions.recordHistoryLabel);
120
+ options.recordEditTransaction(beforeSnapshot, afterSnapshot ?? undefined, applyOptions.recordHistoryLabel);
96
121
  }
97
- return editsByRowId.size;
122
+ return updates.length;
98
123
  });
99
124
  const rangesEqual = (left, right) => {
100
125
  if (!left || !right) {
@@ -128,6 +153,35 @@ export function useDataGridAppClipboard(options) {
128
153
  }
129
154
  return options.captureRowsSnapshot();
130
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
+ };
131
185
  const buildFillMatrixFromRange = options.buildFillMatrixFromRange ?? ((range) => {
132
186
  const matrix = [];
133
187
  for (let rowIndex = range.startRow; rowIndex <= range.endRow; rowIndex += 1) {
@@ -187,6 +241,14 @@ export function useDataGridAppClipboard(options) {
187
241
  return true;
188
242
  };
189
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
+ }
190
252
  return stageClipboardOperation("copy", trigger);
191
253
  };
192
254
  const pasteSelectedCells = async (trigger = "keyboard", pasteOptions = {}) => {
@@ -233,21 +295,33 @@ export function useDataGridAppClipboard(options) {
233
295
  void trigger;
234
296
  return true;
235
297
  }
236
- const beforeSnapshot = captureBeforeEditSnapshot(pendingOperation === "cut"
237
- ? [pendingSourceRange, normalizedTargetRange]
238
- : [normalizedTargetRange]);
239
298
  if (pendingOperation === "cut" && pendingSourceRange) {
240
- void 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;
241
317
  }
242
- const appliedRows = await applyClipboardEdits(targetRange, matrix, { recordHistory: false });
318
+ const appliedRows = await applyClipboardEdits(targetRange, matrix, { recordHistory: true });
243
319
  if (appliedRows <= 0) {
244
320
  return false;
245
321
  }
246
- options.recordEditTransaction(beforeSnapshot);
247
322
  if (pendingOperation !== "none") {
248
323
  clearPendingClipboardOperation(false);
249
324
  }
250
- options.applySelectionRange(normalizedTargetRange);
251
325
  options.syncViewport();
252
326
  void trigger;
253
327
  return true;
@@ -45,6 +45,7 @@ export interface UseDataGridAppFillOptions {
45
45
  affectedRange?: DataGridCopyRange | null;
46
46
  behavior: DataGridFillBehavior;
47
47
  } | null) => void;
48
+ syncServerFillViewport?: (range?: DataGridCopyRange | null) => void | Promise<void>;
48
49
  syncViewport: () => void;
49
50
  }
50
51
  export interface UseDataGridAppFillResult {
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridAppFill.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppFill.ts"],"names":[],"mappings":"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"}
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,CAAC,EAAE,CACpB,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,iBAAiB,EAC/B,QAAQ,EAAE,oBAAoB,KAC3B,OAAO,CAAA;IACV,gBAAgB,CAAC,EAAE,CACjB,OAAO,EAAE;QACP,SAAS,EAAE,iBAAiB,CAAA;QAC5B,YAAY,EAAE,iBAAiB,CAAA;QAC/B,QAAQ,EAAE,oBAAoB,CAAA;KAC/B,KACE,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IAC/M,mBAAmB,EAAE,CACnB,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EAAE,EAAE,EAClB,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,KAC/D,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,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,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;QAAC,QAAQ,EAAE,oBAAoB,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAA;IACzL,sBAAsB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACnF,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,EAAE,oBAAoB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACjF,cAAc,EAAE,CACd,SAAS,EAAE,iBAAiB,EAC5B,YAAY,EAAE,iBAAiB,EAC/B,QAAQ,CAAC,EAAE,oBAAoB,KAC5B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/B,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,CAgI1B"}
@@ -26,9 +26,15 @@ export function useDataGridAppFill(options) {
26
26
  affectedRange: committed.affectedRange ?? previewRange,
27
27
  behavior,
28
28
  });
29
- options.syncViewport();
29
+ if (options.syncServerFillViewport) {
30
+ await options.syncServerFillViewport(committed.invalidation?.range ?? committed.affectedRange ?? previewRange);
31
+ }
32
+ else {
33
+ options.syncViewport();
34
+ }
30
35
  return true;
31
36
  }
37
+ return false;
32
38
  }
33
39
  const matrix = buildDataGridFillMatrix({
34
40
  baseRange,
@@ -345,6 +345,7 @@ export function useDataGridAppInlineEditing(options) {
345
345
  const afterSnapshot = typeof beforeSnapshot !== "undefined"
346
346
  ? buildAfterSnapshotFromEdit(beforeSnapshot, resolvedRowId, currentEditingCell.columnKey, parsedValue)
347
347
  : undefined;
348
+ clearInlineEdit();
348
349
  await options.runtime.api.rows.applyEdits([
349
350
  {
350
351
  rowId: resolvedRowId,
@@ -366,7 +367,6 @@ export function useDataGridAppInlineEditing(options) {
366
367
  },
367
368
  });
368
369
  options.recordEditTransaction(beforeSnapshot, afterSnapshot, "Cell edit");
369
- clearInlineEdit();
370
370
  suppressNextBlurCommit.value = false;
371
371
  if (target !== "none") {
372
372
  focusAfterInlineEdit(resolvedRowId, currentEditingCell.columnKey, target, {
@@ -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) {
@@ -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,
@@ -152,6 +152,7 @@ export interface UseDataGridAppInteractionControllerOptions<TRow extends Record<
152
152
  rangesEqual: (left: DataGridCopyRange | null, right: DataGridCopyRange | null) => boolean;
153
153
  buildFillMatrixFromRange: (range: DataGridCopyRange) => string[][];
154
154
  applyRangeMove?: (baseRange: DataGridCopyRange, targetRange: DataGridCopyRange) => boolean | Promise<boolean>;
155
+ refreshServerFillViewport?: (range?: DataGridCopyRange | null) => void | Promise<void>;
155
156
  syncViewport: () => void;
156
157
  editingCell: Ref<{
157
158
  rowId: string | number;
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridAppInteractionController.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppInteractionController.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,WAAW,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAA;AACzE,OAAO,KAAK,EACV,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EAC1B,MAAM,uBAAuB,CAAA;AAM9B,OAAO,EACL,KAAK,oBAAoB,EAI1B,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAeL,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAA;AACjF,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,8BAA8B,EAC9B,0BAA0B,EAC1B,iBAAiB,EAClB,MAAM,uBAAuB,CAAA;AAE9B,UAAU,gCAAgC;IACxC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAA;IACvC,WAAW,EAAE,sBAAsB,GAAG,IAAI,CAAA;IAC1C,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAA;IACnC,cAAc,EAAE,8BAA8B,CAAA;IAC9C,QAAQ,EAAE,IAAI,CAAA;IACd,KAAK,EAAE,IAAI,CAAA;IACX,UAAU,EAAE,0BAA0B,CAAA;CACvC;AAED,UAAU,qCAAqC;IAC7C,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IAC3C,SAAS,EAAE,iBAAiB,CAAA;IAC5B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IAC9B,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,UAAU,EAAE,gCAAgC,CAAA;IAC5C,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,UAAU,oCAAoC;IAC5C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACjC,YAAY,EAAE,UAAU,GAAG,KAAK,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,YAAY,CAAA;IACrF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,UAAU,yBAAyB;IACjC,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,qCAAqC,KAC3C,OAAO,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAA;IACzF,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;QACjC,UAAU,EAAE,gCAAgC,CAAA;QAC5C,WAAW,EAAE,iBAAiB,CAAA;QAC9B,WAAW,EAAE,iBAAiB,CAAA;QAC9B,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;QAC9B,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;QACnC,IAAI,EAAE,oBAAoB,CAAA;QAC1B,QAAQ,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,WAAW,GAAG,mBAAmB,GAAG,cAAc,CAAC;YAAC,cAAc,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;SAAE,GAAG,IAAI,CAAA;KAC3H,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IACxP,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;QACjC,UAAU,EAAE,gCAAgC,CAAA;KAC7C,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IAClM,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;QACjC,UAAU,EAAE,gCAAgC,CAAA;KAC7C,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,YAAY,CAAC,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;CACnM;AA8BD,OAAO,EAEL,KAAK,6BAA6B,EACnC,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EACV,oBAAoB,EACpB,8BAA8B,EAC/B,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAS/D,KAAK,8BAA8B,GAAG,kBAAkB,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,sBAAsB,GAAG,eAAe,CAAA;AAI1I,MAAM,WAAW,0CAA0C,CACzD,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS;IAET,IAAI,EAAE,GAAG,CAAC,eAAe,CAAC,CAAA;IAC1B,gBAAgB,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAC/B,eAAe,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAE,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,mBAAmB,GAAG,yBAAyB,GAAG,UAAU,CAAC,CAAA;IACnH,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACtB,cAAc,EAAE,GAAG,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAAA;IACtD,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7B,iBAAiB,EAAE,GAAG,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAA;IACxD,eAAe,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,kBAAkB,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,MAAM,CAAA;IAC9D,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9C,uBAAuB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAA;IACnD,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IAC1D,kBAAkB,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,oBAAoB,GAAG,IAAI,CAAA;IAChF,qBAAqB,EAAE,MAAM,iBAAiB,GAAG,IAAI,CAAA;IACrD,mBAAmB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACvD,2BAA2B,CAAC,EAAE,CAAC,UAAU,EAAE;QACzC,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;QACxC,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;QACjC,IAAI,EAAE,oBAAoB,CAAA;KAC3B,KAAK,IAAI,CAAA;IACV,yBAAyB,EAAE,CACzB,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,OAAO,EACf,cAAc,CAAC,EAAE,8BAA8B,EAC/C,QAAQ,CAAC,EAAE,OAAO,KACf,IAAI,CAAA;IACT,gBAAgB,EAAE,CAChB,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,OAAO,KACf,IAAI,CAAA;IACT,kBAAkB,EAAE,MAAM,IAAI,CAAA;IAC9B,QAAQ,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IACnE,wBAAwB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC7E,cAAc,EAAE,CACd,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAA;IACZ,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,IAAI,CAAA;IACjC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAA;IACxD,wBAAwB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAA;IACxD,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,qCAAqC,KAC3C,OAAO,CAAC,oCAAoC,CAAC,GAAG,oCAAoC,CAAA;IACzF,eAAe,CAAC,EAAE;QAChB,UAAU,CAAC,EAAE,yBAAyB,CAAA;KACvC,GAAG,IAAI,CAAA;IACR,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACnE,mBAAmB,EAAE,MAAM,SAAS,CAAA;IACpC,4BAA4B,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,KAAK,SAAS,CAAA;IAClF,uBAAuB,EAAE,CACvB,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;KAAE,EACvF,cAAc,EAAE,SAAS,EACzB,qBAAqB,CAAC,EAAE,SAAS,KAC9B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,8BAA8B,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,6BAA6B,CAAC,EAAE,OAAO,KAAK,OAAO,CAAA;IAC7G,sCAAsC,CAAC,EAAE,MAAM,OAAO,CAAA;IACtD,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9E,kBAAkB,EAAE,CAClB,OAAO,CAAC,EAAE,UAAU,GAAG,cAAc,EACrC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAA;KAAE,KACtC,OAAO,CAAC,OAAO,CAAC,CAAA;IACrB,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7E,uBAAuB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,iBAAiB,GAAG,IAAI,CAAA;IAC/E,mBAAmB,EAAE,CACnB,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EAAE,EAAE,EAClB,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,KAClC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7B,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,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,WAAW,EAAE,iBAAiB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7G,YAAY,EAAE,MAAM,IAAI,CAAA;IACxB,WAAW,EAAE,GAAG,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IACtE,eAAe,EAAE,CACf,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAC1B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,KACrD,IAAI,CAAA;IACT,yBAAyB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;IACtD,gBAAgB,EAAE,MAAM,IAAI,CAAA;IAC5B,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,KAAK,IAAI,CAAA;IAC1E,OAAO,EAAE,MAAM,OAAO,CAAA;IACtB,OAAO,EAAE,MAAM,OAAO,CAAA;IACtB,gBAAgB,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAC5E,+BAA+B,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IAChF,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAA;IACpC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B,8BAA8B,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3C,yBAAyB,CAAC,EAAE,CAC1B,MAAM,EAAE,8BAA8B,EACtC,KAAK,EAAE,MAAM,GAAG,MAAM,KACnB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IAC/B,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAClE;AAED,MAAM,WAAW,yCAAyC,CAAC,IAAI;IAC7D,uBAAuB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrC,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,gBAAgB,EAAE,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IAC/C,eAAe,EAAE,GAAG,CAAC,6BAA6B,GAAG,IAAI,CAAC,CAAA;IAC1D,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IAC3B,cAAc,EAAE,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IACrD,qBAAqB,EAAE,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;IACpD,oBAAoB,EAAE,MAAM,IAAI,CAAA;IAChC,iBAAiB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5C,mBAAmB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IAChD,0BAA0B,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACvD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrF,mBAAmB,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACpH,iBAAiB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACrH,qBAAqB,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACpG,qBAAqB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IAClD,mBAAmB,EAAE,MAAM,IAAI,CAAA;IAC/B,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;IACrE,kBAAkB,EAAE,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/E,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,wBAAgB,mCAAmC,CACjD,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,SAAS,EAET,OAAO,EAAE,0CAA0C,CAAC,IAAI,EAAE,SAAS,CAAC,GACnE,yCAAyC,CAAC,IAAI,CAAC,CAmlEjD"}
1
+ {"version":3,"file":"useDataGridAppInteractionController.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppInteractionController.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { computed, nextTick, ref } from "vue";
2
2
  import { invokeDataGridCellInteraction, resolveDataGridCellKeyboardAction, toggleDataGridCellValue, } from "@affino/datagrid-core";
3
3
  import { buildDataGridFillMatrix, canToggleDataGridFillBehavior, resolveDataGridDefaultFillBehavior, } from "../composables/dataGridFillBehavior";
4
4
  import { useDataGridAxisAutoScrollDelta, useDataGridCellNavigation, useDataGridCellPointerDownRouter, useDataGridDragPointerSelection, useDataGridFillHandleStart, useDataGridFillSelectionLifecycle, useDataGridHistoryActionRunner, useDataGridKeyboardCommandRouter, useDataGridPointerCellCoordResolver, useDataGridPointerAutoScroll, useDataGridPointerPreviewRouter, useDataGridRangeMoveLifecycle, useDataGridRangeMoveStart, useDataGridRangeMutationEngine, } from "../advanced";
5
+ import { resolveMissingRowIndexInRange } from "./useDataGridAppClipboard";
5
6
  function getFillRangeStart(range) {
6
7
  const candidate = range;
7
8
  return Number.isFinite(candidate.startRow)
@@ -25,6 +26,28 @@ function formatServerFillAffectedRange(range, fallbackColumns) {
25
26
  : fallbackColumns.endColumn;
26
27
  return `${start}..${end} x ${startColumn}..${endColumn}`;
27
28
  }
29
+ function normalizeServerFillInvalidationRange(range) {
30
+ if (!range) {
31
+ return null;
32
+ }
33
+ const candidate = range;
34
+ const rawStart = Number.isFinite(candidate.startRow)
35
+ ? candidate.startRow
36
+ : candidate.start;
37
+ const rawEnd = Number.isFinite(candidate.endRow)
38
+ ? candidate.endRow
39
+ : candidate.end;
40
+ const start = Number(rawStart);
41
+ const end = Number(rawEnd ?? rawStart);
42
+ if (!Number.isFinite(start) || !Number.isFinite(end)) {
43
+ return null;
44
+ }
45
+ return {
46
+ start: Math.max(0, Math.trunc(start)),
47
+ end: Math.max(Math.max(0, Math.trunc(start)), Math.trunc(end)),
48
+ };
49
+ }
50
+ const ROW_SELECTION_COLUMN_KEY = "__datagrid_row_selection__";
28
51
  import { useDataGridAppFill, } from "./useDataGridAppFill";
29
52
  import { restoreDataGridFocus } from "./dataGridFocusRestore";
30
53
  const DRAG_SELECTION_POINTER_THRESHOLD_PX = 4;
@@ -53,10 +76,53 @@ export function useDataGridAppInteractionController(options) {
53
76
  }
54
77
  return options.readCell(row, columnKey).trim().length > 0;
55
78
  };
79
+ const isServerBackedRowModel = () => {
80
+ const controllerRowModel = options.runtimeRowModel;
81
+ const runtimeRowModel = options.runtime.rowModel;
82
+ return controllerRowModel?.dataSource != null || runtimeRowModel?.dataSource != null;
83
+ };
84
+ const resolveSelectableColumnIndexes = () => {
85
+ return options.visibleColumns.value
86
+ .map((column, columnIndex) => ({ column, columnIndex }))
87
+ .filter(({ column }) => column.key !== ROW_SELECTION_COLUMN_KEY)
88
+ .map(({ columnIndex }) => columnIndex);
89
+ };
56
90
  const resolveDirectionalSemanticJumpTarget = (current, direction, event) => {
57
91
  if (!(event.ctrlKey || event.metaKey) || event.altKey) {
58
92
  return undefined;
59
93
  }
94
+ if (event.shiftKey && isServerBackedRowModel()) {
95
+ const lastRowIndex = Math.max(0, options.totalRows.value - 1);
96
+ const selectableColumnIndexes = resolveSelectableColumnIndexes();
97
+ const firstSelectableColumnIndex = selectableColumnIndexes[0] ?? 0;
98
+ const lastSelectableColumnIndex = selectableColumnIndexes[selectableColumnIndexes.length - 1] ?? Math.max(0, options.visibleColumns.value.length - 1);
99
+ switch (direction) {
100
+ case "down":
101
+ return options.normalizeCellCoord({
102
+ ...current,
103
+ rowIndex: lastRowIndex,
104
+ rowId: getBodyRowAtIndex(lastRowIndex)?.rowId ?? null,
105
+ }) ?? current;
106
+ case "up":
107
+ return options.normalizeCellCoord({
108
+ ...current,
109
+ rowIndex: 0,
110
+ rowId: getBodyRowAtIndex(0)?.rowId ?? null,
111
+ }) ?? current;
112
+ case "right":
113
+ return options.normalizeCellCoord({
114
+ ...current,
115
+ columnIndex: lastSelectableColumnIndex,
116
+ rowId: getBodyRowAtIndex(current.rowIndex)?.rowId ?? null,
117
+ }) ?? current;
118
+ case "left":
119
+ return options.normalizeCellCoord({
120
+ ...current,
121
+ columnIndex: firstSelectableColumnIndex,
122
+ rowId: getBodyRowAtIndex(current.rowIndex)?.rowId ?? null,
123
+ }) ?? current;
124
+ }
125
+ }
60
126
  const currentCellIsNonEmpty = isSemanticNavigationCellNonEmpty(current.rowIndex, current.columnIndex);
61
127
  if (currentCellIsNonEmpty == null) {
62
128
  return undefined;
@@ -458,15 +524,7 @@ export function useDataGridAppInteractionController(options) {
458
524
  return false;
459
525
  }
460
526
  const rowCount = Math.max(0, previewRange.endRow - previewRange.startRow + 1);
461
- if (rowCount < 256) {
462
- return false;
463
- }
464
- for (let rowIndex = previewRange.startRow; rowIndex <= previewRange.endRow; rowIndex += 1) {
465
- if (!options.runtime?.getBodyRowAtIndex?.(rowIndex)) {
466
- return true;
467
- }
468
- }
469
- return false;
527
+ return rowCount >= 256;
470
528
  },
471
529
  commitServerFill: async ({ baseRange, previewRange, behavior }) => {
472
530
  const runtimeRowModelDataSource = options.runtimeRowModel?.dataSource;
@@ -478,60 +536,146 @@ export function useDataGridAppInteractionController(options) {
478
536
  }
479
537
  const snapshot = options.runtime.api.rows.getSnapshot();
480
538
  const operationId = `fill-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
481
- const result = await dataSource.commitFillOperation({
482
- operationId,
483
- projection: {
484
- sortModel: snapshot.sortModel ?? [],
485
- filterModel: snapshot.filterModel ?? null,
486
- groupBy: snapshot.groupBy ?? null,
487
- groupExpansion: snapshot.groupExpansion ?? { expandedByDefault: false, toggledGroupKeys: [] },
488
- treeData: null,
489
- pivot: null,
490
- pagination: snapshot.pagination ?? {
491
- enabled: false,
492
- pageSize: 0,
493
- currentPage: 0,
494
- pageCount: 0,
495
- totalRowCount: 0,
496
- startIndex: 0,
497
- endIndex: 0,
498
- },
499
- },
500
- sourceRange: baseRange,
501
- targetRange: previewRange,
502
- fillColumns: options.visibleColumns.value
503
- .slice(previewRange.startColumn, previewRange.endColumn + 1)
504
- .map(column => String(column.key)),
505
- referenceColumns: options.visibleColumns.value
506
- .slice(baseRange.startColumn, baseRange.endColumn + 1)
507
- .map(column => String(column.key)),
508
- mode: behavior,
509
- metadata: { origin: "double-click-fill", behaviorSource: "default" },
539
+ const sourceMatrix = options.buildFillMatrixFromRange(baseRange);
540
+ const fillMatrix = buildDataGridFillMatrix({
541
+ baseRange,
542
+ previewRange,
543
+ sourceMatrix,
544
+ behavior,
510
545
  });
511
- options.reportFillPlumbingState?.("commitFillOperation_called", true);
512
- options.reportFillPlumbingState?.("server_fill_operationId", true);
513
- if (!result) {
546
+ const materializedTargetRowIds = [];
547
+ const optimisticUpdatesByRowId = new Map();
548
+ let optimisticFillCandidate = options.captureRowsSnapshotForRowIds != null;
549
+ if (optimisticFillCandidate) {
550
+ for (let rowIndex = previewRange.startRow; rowIndex <= previewRange.endRow; rowIndex += 1) {
551
+ const targetRow = getBodyRowAtIndex(rowIndex);
552
+ const isMaterialized = options.isRowMaterializedAtIndex
553
+ ? options.isRowMaterializedAtIndex(rowIndex)
554
+ : !!targetRow && targetRow.__placeholder !== true;
555
+ if (!isMaterialized || !targetRow || targetRow.kind === "group" || targetRow.rowId == null || targetRow.__placeholder === true) {
556
+ optimisticFillCandidate = false;
557
+ break;
558
+ }
559
+ materializedTargetRowIds.push(targetRow.rowId);
560
+ for (let columnIndex = previewRange.startColumn; columnIndex <= previewRange.endColumn; columnIndex += 1) {
561
+ const columnKey = options.visibleColumns.value[columnIndex]?.key;
562
+ if (!columnKey || columnKey === ROW_SELECTION_COLUMN_KEY) {
563
+ continue;
564
+ }
565
+ const rowOffset = rowIndex - previewRange.startRow;
566
+ const columnOffset = columnIndex - previewRange.startColumn;
567
+ const nextValue = fillMatrix[rowOffset]?.[columnOffset] ?? "";
568
+ const current = optimisticUpdatesByRowId.get(targetRow.rowId) ?? {};
569
+ current[columnKey] = nextValue;
570
+ optimisticUpdatesByRowId.set(targetRow.rowId, current);
571
+ }
572
+ }
573
+ }
574
+ let optimisticRollbackUpdates = null;
575
+ if (optimisticFillCandidate && materializedTargetRowIds.length > 0 && optimisticUpdatesByRowId.size > 0) {
576
+ const baselineSnapshot = options.captureRowsSnapshotForRowIds?.(materializedTargetRowIds);
577
+ const baselineRows = baselineSnapshot?.rows ?? [];
578
+ if (baselineRows.length === materializedTargetRowIds.length) {
579
+ const baselineByRowId = new Map();
580
+ for (const entry of baselineRows) {
581
+ baselineByRowId.set(entry.rowId, entry.row);
582
+ }
583
+ optimisticRollbackUpdates = materializedTargetRowIds.flatMap(rowId => {
584
+ const row = baselineByRowId.get(rowId);
585
+ return row ? [{ rowId, data: row }] : [];
586
+ });
587
+ if (optimisticRollbackUpdates.length > 0) {
588
+ options.reportFillPlumbingState?.("server_fill_optimistic_applied", true);
589
+ await Promise.resolve(options.runtime.api.rows.applyEdits(Array.from(optimisticUpdatesByRowId.entries()).map(([rowId, data]) => ({
590
+ rowId,
591
+ data: data,
592
+ }))));
593
+ }
594
+ else {
595
+ optimisticRollbackUpdates = null;
596
+ }
597
+ }
598
+ else {
599
+ optimisticFillCandidate = false;
600
+ }
601
+ }
602
+ let result = null;
603
+ try {
604
+ result = await dataSource.commitFillOperation({
605
+ operationId,
606
+ projection: {
607
+ sortModel: snapshot.sortModel ?? [],
608
+ filterModel: snapshot.filterModel ?? null,
609
+ groupBy: snapshot.groupBy ?? null,
610
+ groupExpansion: snapshot.groupExpansion ?? { expandedByDefault: false, toggledGroupKeys: [] },
611
+ treeData: null,
612
+ pivot: null,
613
+ pagination: snapshot.pagination ?? {
614
+ enabled: false,
615
+ pageSize: 0,
616
+ currentPage: 0,
617
+ pageCount: 0,
618
+ totalRowCount: 0,
619
+ startIndex: 0,
620
+ endIndex: 0,
621
+ },
622
+ },
623
+ sourceRange: baseRange,
624
+ targetRange: previewRange,
625
+ fillColumns: options.visibleColumns.value
626
+ .slice(previewRange.startColumn, previewRange.endColumn + 1)
627
+ .map(column => String(column.key)),
628
+ referenceColumns: options.visibleColumns.value
629
+ .slice(baseRange.startColumn, baseRange.endColumn + 1)
630
+ .map(column => String(column.key)),
631
+ mode: behavior,
632
+ metadata: { origin: "double-click-fill", behaviorSource: "default" },
633
+ });
634
+ options.reportFillPlumbingState?.("commitFillOperation_called", true);
635
+ options.reportFillPlumbingState?.("server_fill_operationId", true);
636
+ }
637
+ catch {
638
+ if (optimisticRollbackUpdates && optimisticRollbackUpdates.length > 0) {
639
+ await Promise.resolve(options.runtime.api.rows.applyEdits(optimisticRollbackUpdates));
640
+ }
514
641
  options.reportFillWarning?.("server fill commit failed");
515
642
  return null;
516
643
  }
517
- if ((result.affectedRowCount ?? 0) <= 0 || (result.warnings?.length ?? 0) > 0) {
518
- options.reportFillWarning?.(result.warnings?.[0] ?? "server fill invalid range");
644
+ if (!result) {
645
+ if (optimisticRollbackUpdates && optimisticRollbackUpdates.length > 0) {
646
+ await Promise.resolve(options.runtime.api.rows.applyEdits(optimisticRollbackUpdates));
647
+ }
648
+ options.reportFillWarning?.("server fill commit failed");
519
649
  return null;
520
650
  }
521
651
  const invalidationRange = result.invalidation?.kind === "range" ? result.invalidation.range : previewRange;
522
- options.reportFillPlumbingDetail?.("server_fill_affected_range", formatServerFillAffectedRange(invalidationRange, previewRange));
523
- options.reportFillWarning?.("server fill committed");
652
+ const normalizedInvalidationRange = normalizeServerFillInvalidationRange(invalidationRange);
653
+ options.reportFillPlumbingDetail?.("server_fill_raw_invalidation", JSON.stringify(invalidationRange ?? null));
654
+ options.reportFillPlumbingDetail?.("server_fill_normalized_invalidation", normalizedInvalidationRange ? `${normalizedInvalidationRange.start}..${normalizedInvalidationRange.end}` : "none");
655
+ options.reportFillPlumbingDetail?.("server_fill_affected_range", formatServerFillAffectedRange(normalizedInvalidationRange ?? invalidationRange, previewRange));
656
+ const affectedRowCount = result.affectedRowCount ?? 0;
657
+ const warnings = result.warnings ?? [];
658
+ options.reportFillWarning?.(warnings[0] ?? (affectedRowCount > 0 ? "server fill committed" : "server fill no-op"));
524
659
  options.reportFillPlumbingState?.("server_fill_affectedRowCount", true);
525
- const rowsApi = options.runtime.api.rows;
526
- if (typeof rowsApi.invalidateRange === "function") {
527
- rowsApi.invalidateRange(invalidationRange);
660
+ if (!options.refreshServerFillViewport) {
661
+ const runtimeRowModel = options.runtimeRowModel;
662
+ const runtimeRowModelFallback = options.runtime.rowModel;
663
+ const rowsApi = options.runtime.api.rows;
664
+ const invalidateTarget = runtimeRowModel?.invalidateRange ?? runtimeRowModelFallback?.invalidateRange;
665
+ if (normalizedInvalidationRange && typeof invalidateTarget === "function") {
666
+ invalidateTarget(normalizedInvalidationRange);
667
+ options.reportFillPlumbingState?.("server_fill_invalidation_applied", true);
668
+ }
669
+ await Promise.resolve(rowsApi.refresh?.());
528
670
  }
529
- await Promise.resolve(rowsApi.refresh?.());
530
671
  return {
531
672
  operationId: result.operationId,
532
673
  revision: result.revision,
533
674
  affectedRange: invalidationRange,
534
675
  invalidation: result.invalidation ?? null,
676
+ affectedRowCount,
677
+ affectedCellCount: result.affectedCellCount ?? affectedRowCount,
678
+ warnings,
535
679
  };
536
680
  },
537
681
  applyClipboardEdits: options.applyClipboardEdits,
@@ -560,6 +704,7 @@ export function useDataGridAppInteractionController(options) {
560
704
  mode: session.behavior,
561
705
  });
562
706
  },
707
+ syncServerFillViewport: options.refreshServerFillViewport,
563
708
  syncViewport: options.syncViewport,
564
709
  });
565
710
  const applyCommittedFillRange = async (baseRange, previewRange, behavior) => {
@@ -1197,6 +1342,11 @@ export function useDataGridAppInteractionController(options) {
1197
1342
  if (!range) {
1198
1343
  return false;
1199
1344
  }
1345
+ const missingRowIndex = resolveMissingRowIndexInRange(getBodyRowAtIndex, range);
1346
+ if (missingRowIndex != null) {
1347
+ options.reportFillWarning?.("Selected range includes unloaded rows. Load rows or use server operation.");
1348
+ return false;
1349
+ }
1200
1350
  const beforeSnapshot = captureRowsSnapshotForRanges([range]);
1201
1351
  options.clearPendingClipboardOperation(false);
1202
1352
  const applied = await options.applyClipboardEdits(range, [[""]], { recordHistory: false });
@@ -1,5 +1,5 @@
1
1
  import { type Ref } from "vue";
2
- import type { DataGridColumnSnapshot, DataGridRowNode } from "@affino/datagrid-core";
2
+ import type { DataGridColumnSnapshot, DataGridRowNode, DataGridViewportRange } from "@affino/datagrid-core";
3
3
  import type { UseDataGridRuntimeResult } from "../composables/useDataGridRuntime";
4
4
  import type { DataGridAppMode, DataGridAppRowRenderMode } from "./useDataGridAppControls";
5
5
  type MaybeRef<T> = T | Ref<T>;
@@ -38,8 +38,10 @@ export interface UseDataGridAppViewportResult<TRow> {
38
38
  bodyViewportRef: Ref<HTMLElement | null>;
39
39
  viewportScrollTop: Ref<number>;
40
40
  displayRows: Ref<readonly DataGridRowNode<TRow>[]>;
41
+ displayRowsRevision: Ref<number>;
41
42
  pinnedBottomRows: Ref<readonly DataGridRowNode<TRow>[]>;
42
43
  renderedColumns: Ref<readonly DataGridColumnSnapshot[]>;
44
+ renderedViewportRange: Ref<DataGridViewportRange | null>;
43
45
  viewportRowStart: Ref<number>;
44
46
  viewportRowEnd: Ref<number>;
45
47
  viewportColumnStart: Ref<number>;
@@ -53,6 +55,7 @@ export interface UseDataGridAppViewportResult<TRow> {
53
55
  mainTrackStyle: Ref<Record<string, string>>;
54
56
  indexColumnStyle: Ref<Record<string, string>>;
55
57
  columnStyle: (key: string) => Record<string, string>;
58
+ syncRenderedRowsInRange: (range: DataGridViewportRange) => void;
56
59
  handleViewportScroll: (event: Event) => void;
57
60
  syncViewportFromDom: () => void;
58
61
  scheduleViewportSync: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridAppViewport.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppViewport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDataGridAppViewport.d.ts","sourceRoot":"","sources":["../../src/app/useDataGridAppViewport.ts"],"names":[],"mappings":"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"}
@@ -206,6 +206,8 @@ export function useDataGridAppViewport(options) {
206
206
  const bodyViewportRef = ref(null);
207
207
  const viewportScrollTop = ref(0);
208
208
  const displayRows = shallowRef([]);
209
+ const displayRowsRevision = ref(0);
210
+ const renderedViewportRange = ref(null);
209
211
  const viewportScrollLeft = ref(0);
210
212
  const viewportClientWidth = ref(0);
211
213
  const viewportShellClientWidth = ref(0);
@@ -548,7 +550,7 @@ export function useDataGridAppViewport(options) {
548
550
  return visibleRange.start >= lastSyncedRange.start + hysteresis
549
551
  && visibleRange.end <= lastSyncedRange.end - hysteresis;
550
552
  };
551
- const resolveIncrementalVisibleRows = (range) => {
553
+ const resolveIndexedVisibleRows = (range) => {
552
554
  const getBodyRowAtIndex = options.runtime.getBodyRowAtIndex;
553
555
  if (typeof getBodyRowAtIndex !== "function" || !lastSyncedRange) {
554
556
  return null;
@@ -558,36 +560,72 @@ export function useDataGridAppViewport(options) {
558
560
  const previousLength = previousRange.end >= previousRange.start
559
561
  ? previousRange.end - previousRange.start + 1
560
562
  : 0;
561
- if (previousRows.length !== previousLength) {
562
- return null;
563
- }
564
563
  const overlapStart = Math.max(previousRange.start, range.start);
565
564
  const overlapEnd = Math.min(previousRange.end, range.end);
566
- if (overlapEnd < overlapStart) {
567
- return null;
565
+ const canReuseOverlap = previousRows.length === previousLength && overlapEnd >= overlapStart;
566
+ if (!canReuseOverlap) {
567
+ const rows = [];
568
+ for (let rowIndex = range.start; rowIndex <= range.end; rowIndex += 1) {
569
+ const row = getBodyRowAtIndex(rowIndex);
570
+ if (!row) {
571
+ return null;
572
+ }
573
+ rows.push(row);
574
+ }
575
+ return { rows, mode: "indexed" };
568
576
  }
569
577
  const nextRows = [];
570
578
  for (let rowIndex = range.start; rowIndex < overlapStart; rowIndex += 1) {
571
579
  const row = getBodyRowAtIndex(rowIndex);
572
- if (row) {
573
- nextRows.push(row);
580
+ if (!row) {
581
+ return null;
574
582
  }
583
+ nextRows.push(row);
575
584
  }
576
585
  const overlapOffset = overlapStart - previousRange.start;
577
586
  const overlapLength = overlapEnd - overlapStart + 1;
578
587
  for (let index = 0; index < overlapLength; index += 1) {
579
588
  const row = previousRows[overlapOffset + index];
580
- if (row) {
581
- nextRows.push(row);
589
+ if (!row) {
590
+ return null;
582
591
  }
592
+ nextRows.push(row);
583
593
  }
584
594
  for (let rowIndex = overlapEnd + 1; rowIndex <= range.end; rowIndex += 1) {
585
595
  const row = getBodyRowAtIndex(rowIndex);
586
- if (row) {
587
- nextRows.push(row);
596
+ if (!row) {
597
+ return null;
588
598
  }
599
+ nextRows.push(row);
600
+ }
601
+ return { rows: nextRows, mode: "incremental" };
602
+ };
603
+ const updateRenderedViewportRange = (rows) => {
604
+ if (rows.length === 0) {
605
+ renderedViewportRange.value = null;
606
+ return;
589
607
  }
590
- return nextRows;
608
+ const first = rows[0];
609
+ const last = rows[rows.length - 1];
610
+ const start = first && Number.isFinite(first.displayIndex)
611
+ ? Math.max(0, Math.trunc(first.displayIndex))
612
+ : null;
613
+ const end = last && Number.isFinite(last.displayIndex)
614
+ ? Math.max(0, Math.trunc(last.displayIndex))
615
+ : null;
616
+ if (start == null || end == null) {
617
+ renderedViewportRange.value = null;
618
+ return;
619
+ }
620
+ renderedViewportRange.value = {
621
+ start,
622
+ end: Math.max(start, end),
623
+ };
624
+ };
625
+ const commitDisplayRows = (rows) => {
626
+ displayRows.value = rows;
627
+ displayRowsRevision.value += 1;
628
+ updateRenderedViewportRange(rows);
591
629
  };
592
630
  const syncVisibleRows = (range, force = false) => {
593
631
  if (!force
@@ -617,18 +655,18 @@ export function useDataGridAppViewport(options) {
617
655
  let setViewportRangeMs = 0;
618
656
  let displayRowsAssignMs = 0;
619
657
  let viewportCommitMs = 0;
620
- const incrementalRows = force
658
+ const indexedRows = force
621
659
  ? null
622
660
  : (() => {
623
661
  if (!perfTraceEnabled) {
624
- return resolveIncrementalVisibleRows(range);
662
+ return resolveIndexedVisibleRows(range);
625
663
  }
626
664
  const incrementalStart = resolveDataGridPerfNow();
627
- const rows = resolveIncrementalVisibleRows(range);
665
+ const rows = resolveIndexedVisibleRows(range);
628
666
  incrementalResolveMs = resolveDataGridPerfNow() - incrementalStart;
629
667
  return rows;
630
668
  })();
631
- if (incrementalRows) {
669
+ if (indexedRows) {
632
670
  const setWindowRange = options.runtime.setVirtualWindowRange ?? options.runtime.setViewportRange;
633
671
  if (typeof setWindowRange === "function") {
634
672
  const commitStart = perfTraceEnabled ? resolveDataGridPerfNow() : 0;
@@ -637,12 +675,12 @@ export function useDataGridAppViewport(options) {
637
675
  setWindowRange(range);
638
676
  setViewportRangeMs = resolveDataGridPerfNow() - setViewportRangeStart;
639
677
  const displayRowsAssignStart = resolveDataGridPerfNow();
640
- displayRows.value = incrementalRows;
678
+ commitDisplayRows(indexedRows.rows);
641
679
  displayRowsAssignMs = resolveDataGridPerfNow() - displayRowsAssignStart;
642
680
  }
643
681
  else {
644
682
  setWindowRange(range);
645
- displayRows.value = incrementalRows;
683
+ commitDisplayRows(indexedRows.rows);
646
684
  }
647
685
  if (perfTraceEnabled) {
648
686
  viewportCommitMs = resolveDataGridPerfNow() - commitStart;
@@ -650,7 +688,7 @@ export function useDataGridAppViewport(options) {
650
688
  }
651
689
  else {
652
690
  const syncStart = perfTraceEnabled ? resolveDataGridPerfNow() : 0;
653
- displayRows.value = options.runtime.syncBodyRowsInRange(range);
691
+ commitDisplayRows(options.runtime.syncBodyRowsInRange(range));
654
692
  if (perfTraceEnabled) {
655
693
  runtimeSyncMs = resolveDataGridPerfNow() - syncStart;
656
694
  }
@@ -658,7 +696,7 @@ export function useDataGridAppViewport(options) {
658
696
  }
659
697
  else {
660
698
  const syncStart = perfTraceEnabled ? resolveDataGridPerfNow() : 0;
661
- displayRows.value = options.runtime.syncBodyRowsInRange(range);
699
+ commitDisplayRows(options.runtime.syncBodyRowsInRange(range));
662
700
  if (perfTraceEnabled) {
663
701
  runtimeSyncMs = resolveDataGridPerfNow() - syncStart;
664
702
  }
@@ -669,9 +707,9 @@ export function useDataGridAppViewport(options) {
669
707
  };
670
708
  if (perfTraceEnabled) {
671
709
  lastVisibleRowSyncPerf = {
672
- mode: incrementalRows
710
+ mode: indexedRows
673
711
  ? ((typeof options.runtime.setVirtualWindowRange === "function" || typeof options.runtime.setViewportRange === "function")
674
- ? "incremental"
712
+ ? indexedRows.mode
675
713
  : "incremental-runtime-fallback")
676
714
  : "runtime",
677
715
  totalMs: resolveDataGridPerfNow() - visibleRowsPerfStart,
@@ -688,6 +726,9 @@ export function useDataGridAppViewport(options) {
688
726
  };
689
727
  }
690
728
  };
729
+ const syncRenderedRowsInRange = (range) => {
730
+ syncVisibleRows(range, true);
731
+ };
691
732
  const syncHeaderScrollLeftFromBody = (bodyScrollLeft) => {
692
733
  const headerViewport = headerViewportRef.value;
693
734
  if (!headerViewport) {
@@ -869,8 +910,10 @@ export function useDataGridAppViewport(options) {
869
910
  bodyViewportRef,
870
911
  viewportScrollTop,
871
912
  displayRows,
913
+ displayRowsRevision,
872
914
  pinnedBottomRows: computed(() => options.runtime.rowPartition.value.pinnedBottomRows),
873
915
  renderedColumns: computed(() => viewportColumnMetrics.value.renderedColumns),
916
+ renderedViewportRange,
874
917
  viewportRowStart,
875
918
  viewportRowEnd,
876
919
  viewportColumnStart: computed(() => viewportColumnMetrics.value.start),
@@ -884,6 +927,7 @@ export function useDataGridAppViewport(options) {
884
927
  mainTrackStyle,
885
928
  indexColumnStyle,
886
929
  columnStyle,
930
+ syncRenderedRowsInRange,
887
931
  handleViewportScroll,
888
932
  syncViewportFromDom,
889
933
  scheduleViewportSync,
@@ -1 +1 @@
1
- {"version":3,"file":"useDataGridRuntime.d.ts","sourceRoot":"","sources":["../../src/composables/useDataGridRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDataGridRuntime.d.ts","sourceRoot":"","sources":["../../src/composables/useDataGridRuntime.ts"],"names":[],"mappings":"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"}
@@ -279,17 +279,38 @@ export function useDataGridRuntime(options) {
279
279
  const normalizedRange = normalizeBodyViewportRange(range, rowPartition.value.bodyRowCount);
280
280
  const syncedRows = runtime.syncRowsInRange(normalizedRange);
281
281
  if (sparseRowModel) {
282
+ for (let bodyIndex = normalizedRange.start; bodyIndex <= normalizedRange.end; bodyIndex += 1) {
283
+ const previousRow = bodyRows[bodyIndex];
284
+ if (previousRow
285
+ && (typeof previousRow.rowId === "string" || typeof previousRow.rowId === "number")
286
+ && bodyRowIndexById.get(previousRow.rowId) === bodyIndex) {
287
+ bodyRowIndexById.delete(previousRow.rowId);
288
+ }
289
+ delete bodyRows[bodyIndex];
290
+ }
291
+ const rowsByBodyIndex = new Map();
282
292
  for (const row of syncedRows) {
283
293
  if (isPinnedBodyExcludedRow(row)) {
284
294
  continue;
285
295
  }
286
296
  const bodyIndex = Math.max(0, Math.trunc(row.displayIndex));
297
+ if (bodyIndex < normalizedRange.start || bodyIndex > normalizedRange.end) {
298
+ continue;
299
+ }
287
300
  bodyRows[bodyIndex] = row;
301
+ rowsByBodyIndex.set(bodyIndex, row);
288
302
  if (typeof row.rowId === "string" || typeof row.rowId === "number") {
289
303
  bodyRowIndexById.set(row.rowId, bodyIndex);
290
304
  }
291
305
  }
292
- return syncedRows.filter(row => !isPinnedBodyExcludedRow(row));
306
+ const rows = [];
307
+ for (let bodyIndex = normalizedRange.start; bodyIndex <= normalizedRange.end; bodyIndex += 1) {
308
+ const row = rowsByBodyIndex.get(bodyIndex);
309
+ if (row) {
310
+ rows.push(row);
311
+ }
312
+ }
313
+ return rows;
293
314
  }
294
315
  if (rowPartition.value.bodyRowCount === 0 || bodyRows.length === 0) {
295
316
  return [];
@@ -298,6 +319,25 @@ export function useDataGridRuntime(options) {
298
319
  if (normalizedRange.start >= endExclusive) {
299
320
  return [];
300
321
  }
322
+ for (const row of syncedRows) {
323
+ if (isPinnedBodyExcludedRow(row)) {
324
+ continue;
325
+ }
326
+ let bodyIndex = -1;
327
+ if (typeof row.rowId === "string" || typeof row.rowId === "number") {
328
+ bodyIndex = resolveBodyRowIndexById(row.rowId);
329
+ }
330
+ if (bodyIndex < 0) {
331
+ bodyIndex = Math.max(0, Math.trunc(row.displayIndex));
332
+ }
333
+ if (bodyIndex < normalizedRange.start || bodyIndex >= endExclusive) {
334
+ continue;
335
+ }
336
+ bodyRows[bodyIndex] = row;
337
+ if (typeof row.rowId === "string" || typeof row.rowId === "number") {
338
+ bodyRowIndexById.set(row.rowId, bodyIndex);
339
+ }
340
+ }
301
341
  return bodyRows.slice(normalizedRange.start, endExclusive);
302
342
  }
303
343
  function getBodyRowAtIndex(rowIndex) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@affino/datagrid-vue",
3
- "version": "0.3.31",
3
+ "version": "0.3.33",
4
4
  "author": "Anton Pavlov <a.pavlov@affino.dev>",
5
5
  "type": "module",
6
6
  "description": "Vue adapter and headless foundation for Affino DataGrid",
@@ -75,9 +75,9 @@
75
75
  }
76
76
  },
77
77
  "dependencies": {
78
- "@affino/datagrid-core": "0.3.20",
78
+ "@affino/datagrid-core": "0.3.22",
79
79
  "@affino/datagrid-pivot": "0.1.2",
80
- "@affino/datagrid-orchestration": "0.3.12",
80
+ "@affino/datagrid-orchestration": "0.3.14",
81
81
  "@affino/datagrid-worker": "0.1.1"
82
82
  },
83
83
  "devDependencies": {