@vueye-table/vue 3.0.0-beta.5 → 3.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +26 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +228 -36
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -55,8 +55,15 @@ interface SourceBinding {
|
|
|
55
55
|
}
|
|
56
56
|
//#endregion
|
|
57
57
|
//#region src/use-data-table.d.ts
|
|
58
|
+
/** Layout fields shared by table and grid bindings. Read through a getter when watching. */
|
|
59
|
+
type LayoutState = Pick<TableState, "columnSizing" | "columnPinning" | "grouping" | "expandedGroups" | "rowPinning">;
|
|
60
|
+
type DataTableLayout<TRow> = LayoutState & Pick<TableSnapshot<TRow>, "topRows" | "bottomRows" | "pinnedStartWidth" | "pinnedEndWidth"> & Pick<DataTable<TRow>, "resizeColumn" | "resetColumnSize" | "pinColumn" | "pinRow" | "groupBy" | "toggleGroup" | "expandAllGroups" | "collapseAllGroups"> & {
|
|
61
|
+
/** Vue alias for groupBy. */
|
|
62
|
+
setGrouping: DataTable<TRow>["groupBy"];
|
|
63
|
+
};
|
|
64
|
+
type ReactiveLayoutOptions = { readonly [Key in keyof LayoutState]?: MaybeRefOrGetter<LayoutState[Key] | undefined> | undefined; };
|
|
58
65
|
/** Options accepted by {@link useDataTable}. Data, columns, and state may be refs or getters. */
|
|
59
|
-
interface UseDataTableOptions<TRow, TSignal extends TreeLoadSignal = AbortSignal> extends Omit<TableOptions<TRow, TSignal>, "data" | "columns" | "rowCount" | "treeFilter">, SourceOptions<TRow
|
|
66
|
+
interface UseDataTableOptions<TRow, TSignal extends TreeLoadSignal = AbortSignal> extends Omit<TableOptions<TRow, TSignal>, "data" | "columns" | "rowCount" | "treeFilter">, SourceOptions<TRow>, ReactiveLayoutOptions {
|
|
60
67
|
/** Initial rows for a source, or the caller-owned array for an ordinary table. */
|
|
61
68
|
readonly data?: MaybeRefOrGetter<readonly TRow[]> | undefined;
|
|
62
69
|
readonly columns: MaybeRefOrGetter<readonly ColumnDef<TRow>[]>;
|
|
@@ -75,7 +82,7 @@ type TableOperations<TRow> = Omit<DataTable<TRow>, "getSnapshot" | "getState" |
|
|
|
75
82
|
* `table.rows` and `table.pageCount` directly, and every change goes through a named operation.
|
|
76
83
|
* Watching a field needs a getter: `watch(() => table.page, ...)`.
|
|
77
84
|
*/
|
|
78
|
-
type DataTableBinding<TRow> = TableSnapshot<TRow> & SourceBinding & TableOperations<TRow> & {
|
|
85
|
+
type DataTableBinding<TRow> = TableSnapshot<TRow> & DataTableLayout<TRow> & SourceBinding & TableOperations<TRow> & {
|
|
79
86
|
/** The engine behind the binding. */
|
|
80
87
|
readonly table: DataTable<TRow>;
|
|
81
88
|
/** The current snapshot, replaced on every change. */
|
|
@@ -108,7 +115,7 @@ interface GridEditor {
|
|
|
108
115
|
* Spreadsheet interaction over a table: a selected range, keyboard navigation, in-cell editing,
|
|
109
116
|
* copy, paste, and clearing. Positions refer to the current page and the visible columns.
|
|
110
117
|
*/
|
|
111
|
-
interface DataGridBinding<TRow> {
|
|
118
|
+
interface DataGridBinding<TRow> extends DataTableLayout<TRow> {
|
|
112
119
|
readonly table: DataTableBinding<TRow>;
|
|
113
120
|
readonly selection: GridSelection | undefined;
|
|
114
121
|
readonly range: CellRange | undefined;
|
|
@@ -207,6 +214,13 @@ interface VirtualViewportOptions {
|
|
|
207
214
|
readonly scrollMargin?: MaybeRefOrGetter<number> | undefined;
|
|
208
215
|
}
|
|
209
216
|
interface UseVirtualRowsOptions<TRow> extends VirtualViewportOptions {
|
|
217
|
+
/** A custom presentation sequence, for example headers with aggregate footers. */
|
|
218
|
+
readonly renderItems?: MaybeRefOrGetter<readonly TableRenderItem<TRow>[]> | undefined;
|
|
219
|
+
/** Measured non-scrolling row regions. They reserve space around the virtual centre. */
|
|
220
|
+
readonly pinnedRowHeights?: MaybeRefOrGetter<{
|
|
221
|
+
readonly top: number;
|
|
222
|
+
readonly bottom: number;
|
|
223
|
+
}> | undefined;
|
|
210
224
|
readonly estimateRowHeight?: number | ((index: number) => number) | undefined;
|
|
211
225
|
/** Connect logical grid focus to the rendered data row, skipping details. */
|
|
212
226
|
readonly grid?: DataGridBinding<TRow> | undefined;
|
|
@@ -221,6 +235,11 @@ interface VirtualRowItem<TRow> extends VirtualItem {
|
|
|
221
235
|
interface VirtualColumnItem<TRow> extends VirtualItem {
|
|
222
236
|
readonly column: TableColumn<TRow>;
|
|
223
237
|
}
|
|
238
|
+
interface VirtualColumnBinding<TRow> extends VirtualBinding<VirtualColumnItem<TRow>> {
|
|
239
|
+
readonly centerItems: readonly VirtualColumnItem<TRow>[];
|
|
240
|
+
readonly pinnedStartItems: readonly VirtualColumnItem<TRow>[];
|
|
241
|
+
readonly pinnedEndItems: readonly VirtualColumnItem<TRow>[];
|
|
242
|
+
}
|
|
224
243
|
interface VirtualBinding<TItem extends VirtualItem> extends Omit<VirtualWindow, "items"> {
|
|
225
244
|
readonly items: readonly TItem[];
|
|
226
245
|
getItem(index: number): TItem | undefined;
|
|
@@ -233,10 +252,10 @@ interface VirtualBinding<TItem extends VirtualItem> extends Omit<VirtualWindow,
|
|
|
233
252
|
/** Pass the virtual item key explicitly; null releases its previously observed element. */
|
|
234
253
|
measureElement(element: Element | ComponentPublicInstance | null, key: RowKey): void;
|
|
235
254
|
}
|
|
236
|
-
/** Virtualize data and detail
|
|
255
|
+
/** Virtualize group, data and detail items. scrollToKey accepts the parent data-row key. */
|
|
237
256
|
declare function useVirtualRows<TRow>(table: DataTableBinding<TRow>, options: UseVirtualRowsOptions<TRow>): VirtualBinding<VirtualRowItem<TRow>>;
|
|
238
|
-
/** Virtualize
|
|
239
|
-
declare function useVirtualColumns<TRow>(grid: DataGridBinding<TRow>, options: UseVirtualColumnsOptions):
|
|
257
|
+
/** Virtualize centre columns, retaining both pinned edges and logical display indices. */
|
|
258
|
+
declare function useVirtualColumns<TRow>(grid: DataGridBinding<TRow>, options: UseVirtualColumnsOptions): VirtualColumnBinding<TRow>;
|
|
240
259
|
//#endregion
|
|
241
|
-
export { type AnyDataTableBinding, type DataGridBinding, type DataGridOptions, type DataTableBinding, type FrameScheduler, type GridEditor, type LoadMore, type LoadMoreContext, type LoadMoreResult, type RowDraft, type RowDraftValues, type SourceBinding, type SourceContext, type SourceOptions, type TableLocale, type TableLocaleOptions, type TableSource, type UseDataTableOptions, type UseVirtualColumnsOptions, type UseVirtualRowsOptions, type VirtualBinding, type VirtualColumnItem, type VirtualRowItem, type VirtualViewportOptions, injectDataGrid, injectDataTable, provideDataGrid, provideDataTable, provideTableLocale, tableLocaleKey, useDataGrid, useDataTable, useTableLocale, useVirtualColumns, useVirtualRows };
|
|
260
|
+
export { type AnyDataTableBinding, type DataGridBinding, type DataGridOptions, type DataTableBinding, type DataTableLayout, type FrameScheduler, type GridEditor, type LayoutState, type LoadMore, type LoadMoreContext, type LoadMoreResult, type RowDraft, type RowDraftValues, type SourceBinding, type SourceContext, type SourceOptions, type TableLocale, type TableLocaleOptions, type TableSource, type UseDataTableOptions, type UseVirtualColumnsOptions, type UseVirtualRowsOptions, type VirtualBinding, type VirtualColumnBinding, type VirtualColumnItem, type VirtualRowItem, type VirtualViewportOptions, injectDataGrid, injectDataTable, provideDataGrid, provideDataTable, provideTableLocale, tableLocaleKey, useDataGrid, useDataTable, useTableLocale, useVirtualColumns, useVirtualRows };
|
|
242
261
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/row-draft.ts","../src/source.ts","../src/use-data-table.ts","../src/use-data-grid.ts","../src/injection.ts","../src/use-virtual.ts"],"mappings":";;;;KAYY,eAAe,qBACd,KAAK,SAAS,SAAS,UAAU,MAAM;UAGnC,SAAS;WACf,QAAQ;WACR,QAAQ,eAAe;WACvB,iBAAiB;WACjB;WACA;;EAET,SAAS,gBAAgB;;EAEzB,SAAS,gBAAgB;EACzB,QAAQ,QAAQ,WAAW;;EAE3B;;;;UCVe;WACN,QAAQ;;KAEP,YAAY,QACpB,cAAc,gBAAgB,YAC5B,SAAS,kBAAkB,cAAc,gBAAgB;UAC9C,wBAAwB;;WAE9B;WACA,OAAO;;UAED,eAAe;WACrB,eAAe;WACf;WACA;;KAEC,SAAS,SAAS,SAAS,oBAAoB,QAAQ,eAAe;;KAEtE,kBAAkB;UACb,cAAc;WACpB,SAAS,SAAS,YAAY;WAC9B,WAAW,SAAS,SAAS;WAC7B,gBAAgB,KAAK;;WAErB,gBAAgB;;WAEhB;;UAGM;WACN;WACA;WACA;WACA,WAAW;EACpB,SAAA,aAAsB;EACtB,MAAA;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/row-draft.ts","../src/source.ts","../src/use-data-table.ts","../src/use-data-grid.ts","../src/injection.ts","../src/use-virtual.ts"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { clampPosition, createTable, createVirtualizer, defaultTableMessages, formatCount, formatValue, getRowItemKey, gridCommand, moveSelection, rangeContains, resolveTableMessages, selectCell, selectionRange, typeOf } from "@vueye-table/core";
|
|
1
|
+
import { clampColumnWidth, clampPosition, createTable, createVirtualizer, defaultTableMessages, formatCount, formatValue, getRowItemKey, gridCommand, moveSelection, rangeContains, resolveTableMessages, selectCell, selectionRange, typeOf } from "@vueye-table/core";
|
|
2
2
|
import { computed, getCurrentInstance, getCurrentScope, inject, nextTick, onMounted, onScopeDispose, provide, shallowReactive, shallowRef, toRaw, toValue, unref, watch, watchEffect } from "vue";
|
|
3
3
|
|
|
4
4
|
//#region src/injection.ts
|
|
@@ -276,18 +276,29 @@ function useDataGrid(table, gridOptions = {}) {
|
|
|
276
276
|
return result;
|
|
277
277
|
};
|
|
278
278
|
const bounds = computed(() => ({
|
|
279
|
-
rows: table.
|
|
279
|
+
rows: table.gridRows.length,
|
|
280
280
|
columns: table.columns.length
|
|
281
281
|
}));
|
|
282
282
|
const range = computed(() => selection.value ? selectionRange(selection.value) : void 0);
|
|
283
283
|
const same = (left, right) => left !== void 0 && left.row === right.row && left.column === right.column;
|
|
284
|
-
watch(() => table.snapshot, () => {
|
|
284
|
+
watch(() => table.snapshot, (snapshot, previous) => {
|
|
285
285
|
const next = bounds.value;
|
|
286
286
|
const current = selection.value;
|
|
287
287
|
if (current && (next.rows === 0 || next.columns === 0)) selection.value = void 0;
|
|
288
288
|
else if (current) {
|
|
289
|
-
const
|
|
290
|
-
|
|
289
|
+
const relocate = (position) => {
|
|
290
|
+
if ((snapshot.grouped || previous.grouped || snapshot.state.rowPinning !== previous.state.rowPinning) && snapshot.page === previous.page) {
|
|
291
|
+
const key = previous.gridRows[position.row]?.key;
|
|
292
|
+
const row = key === void 0 ? -1 : snapshot.gridRows.findIndex((candidate) => candidate.key === key);
|
|
293
|
+
if (row >= 0) return clampPosition({
|
|
294
|
+
...position,
|
|
295
|
+
row
|
|
296
|
+
}, next);
|
|
297
|
+
}
|
|
298
|
+
return clampPosition(position, next);
|
|
299
|
+
};
|
|
300
|
+
const anchor = relocate(current.anchor);
|
|
301
|
+
const focus = relocate(current.focus);
|
|
291
302
|
if (!same(current.anchor, anchor) || !same(current.focus, focus)) selection.value = {
|
|
292
303
|
anchor,
|
|
293
304
|
focus
|
|
@@ -295,7 +306,7 @@ function useDataGrid(table, gridOptions = {}) {
|
|
|
295
306
|
}
|
|
296
307
|
const active = editing;
|
|
297
308
|
if (active && editor.value) {
|
|
298
|
-
const row = table.
|
|
309
|
+
const row = table.gridRows.findIndex((candidate) => candidate.key === active.key);
|
|
299
310
|
const column = table.columns.findIndex((candidate) => candidate.id === active.column.id);
|
|
300
311
|
if (row < 0 || column < 0 || !submitting && table.getRow(active.key)?.original !== active.original || table.getColumn(active.column.id)?.definition !== active.column.definition) {
|
|
301
312
|
editor.value = void 0;
|
|
@@ -320,7 +331,7 @@ function useDataGrid(table, gridOptions = {}) {
|
|
|
320
331
|
}
|
|
321
332
|
}, { flush: "sync" });
|
|
322
333
|
const cellAt = (position) => {
|
|
323
|
-
const row = table.
|
|
334
|
+
const row = table.gridRows[position.row];
|
|
324
335
|
const column = table.columns[position.column];
|
|
325
336
|
return row && column ? {
|
|
326
337
|
row,
|
|
@@ -337,6 +348,42 @@ function useDataGrid(table, gridOptions = {}) {
|
|
|
337
348
|
};
|
|
338
349
|
const grid = {
|
|
339
350
|
table,
|
|
351
|
+
get columnSizing() {
|
|
352
|
+
return table.columnSizing;
|
|
353
|
+
},
|
|
354
|
+
get columnPinning() {
|
|
355
|
+
return table.columnPinning;
|
|
356
|
+
},
|
|
357
|
+
get grouping() {
|
|
358
|
+
return table.grouping;
|
|
359
|
+
},
|
|
360
|
+
get expandedGroups() {
|
|
361
|
+
return table.expandedGroups;
|
|
362
|
+
},
|
|
363
|
+
get rowPinning() {
|
|
364
|
+
return table.rowPinning;
|
|
365
|
+
},
|
|
366
|
+
get topRows() {
|
|
367
|
+
return table.topRows;
|
|
368
|
+
},
|
|
369
|
+
get bottomRows() {
|
|
370
|
+
return table.bottomRows;
|
|
371
|
+
},
|
|
372
|
+
get pinnedStartWidth() {
|
|
373
|
+
return table.pinnedStartWidth;
|
|
374
|
+
},
|
|
375
|
+
get pinnedEndWidth() {
|
|
376
|
+
return table.pinnedEndWidth;
|
|
377
|
+
},
|
|
378
|
+
resizeColumn: table.resizeColumn,
|
|
379
|
+
resetColumnSize: table.resetColumnSize,
|
|
380
|
+
pinColumn: table.pinColumn,
|
|
381
|
+
pinRow: table.pinRow,
|
|
382
|
+
groupBy: table.groupBy,
|
|
383
|
+
setGrouping: table.setGrouping,
|
|
384
|
+
toggleGroup: table.toggleGroup,
|
|
385
|
+
expandAllGroups: table.expandAllGroups,
|
|
386
|
+
collapseAllGroups: table.collapseAllGroups,
|
|
340
387
|
get selection() {
|
|
341
388
|
return selection.value;
|
|
342
389
|
},
|
|
@@ -533,7 +580,7 @@ function useDataGrid(table, gridOptions = {}) {
|
|
|
533
580
|
row: 0,
|
|
534
581
|
column: 0
|
|
535
582
|
};
|
|
536
|
-
const row = table.
|
|
583
|
+
const row = table.gridRows[current.row];
|
|
537
584
|
const treeColumn = table.columns.find((column) => column.id === gridOptions.treeColumn?.()) ?? table.columns[0];
|
|
538
585
|
const command = gridCommand(event, table.tree && row && table.columns[current.column] === treeColumn ? {
|
|
539
586
|
canExpand: row.canExpand,
|
|
@@ -544,10 +591,14 @@ function useDataGrid(table, gridOptions = {}) {
|
|
|
544
591
|
if (!row) return false;
|
|
545
592
|
let key = row.key;
|
|
546
593
|
if (command.action === "expand" || command.action === "collapse") table.toggleExpanded(key, command.action === "expand");
|
|
547
|
-
else if (command.action === "siblings") for (const sibling of
|
|
548
|
-
|
|
594
|
+
else if (command.action === "siblings") for (const sibling of [
|
|
595
|
+
...table.topRows,
|
|
596
|
+
...table.processedRows,
|
|
597
|
+
...table.bottomRows
|
|
598
|
+
].filter((candidate) => candidate.parentKey === row.parentKey && candidate.canExpand)) table.toggleExpanded(sibling.key, true);
|
|
599
|
+
else if (command.action === "child") key = table.gridRows.find((candidate) => candidate.parentKey === row.key)?.key ?? key;
|
|
549
600
|
else key = row.parentKey ?? key;
|
|
550
|
-
const index = table.
|
|
601
|
+
const index = table.gridRows.findIndex((candidate) => candidate.key === key);
|
|
551
602
|
if (index >= 0) grid.focusCell({
|
|
552
603
|
row: index,
|
|
553
604
|
column: current.column
|
|
@@ -578,7 +629,7 @@ function useDataGrid(table, gridOptions = {}) {
|
|
|
578
629
|
|
|
579
630
|
//#endregion
|
|
580
631
|
//#region src/use-virtual.ts
|
|
581
|
-
function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, sizeOf) {
|
|
632
|
+
function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, sizeOf, viewportInset = () => 0, stickyMargin = () => false) {
|
|
582
633
|
let items = source();
|
|
583
634
|
const knownSizes = new Map(sizeOf ? items.map((item) => [keyOf(item), sizeOf(item)]) : []);
|
|
584
635
|
const estimateSize = sizeOf ? (index) => sizeOf(items[index]) ?? (typeof estimate === "number" ? estimate : estimate(index)) : estimate;
|
|
@@ -617,6 +668,19 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
617
668
|
view.value = next;
|
|
618
669
|
});
|
|
619
670
|
const marginIssue = shallowRef();
|
|
671
|
+
const insetIssue = shallowRef();
|
|
672
|
+
function inset() {
|
|
673
|
+
const value = viewportInset();
|
|
674
|
+
if (Number.isFinite(value) && value >= 0) {
|
|
675
|
+
insetIssue.value = void 0;
|
|
676
|
+
return value;
|
|
677
|
+
}
|
|
678
|
+
insetIssue.value ??= Object.freeze({
|
|
679
|
+
code: "invalid_virtual_option",
|
|
680
|
+
message: "Reserved row/column space must be non-negative and finite; 0 is used."
|
|
681
|
+
});
|
|
682
|
+
return 0;
|
|
683
|
+
}
|
|
620
684
|
function margin() {
|
|
621
685
|
const value = toValue(options.scrollMargin) ?? 0;
|
|
622
686
|
if (Number.isFinite(value) && value >= 0) {
|
|
@@ -630,12 +694,12 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
630
694
|
return 0;
|
|
631
695
|
}
|
|
632
696
|
function viewportSize() {
|
|
633
|
-
return element ? Math.max(0, (horizontal ? element.clientWidth : element.clientHeight) - margin()) : virtual.getWindow().viewportSize;
|
|
697
|
+
return element ? Math.max(0, (horizontal ? element.clientWidth : element.clientHeight) - margin() - inset()) : virtual.getWindow().viewportSize;
|
|
634
698
|
}
|
|
635
699
|
function move(offset) {
|
|
636
700
|
if (element) {
|
|
637
|
-
if (horizontal) element.scrollLeft = offset === 0 ? 0 : offset + margin();
|
|
638
|
-
else element.scrollTop = offset === 0 ? 0 : offset + margin();
|
|
701
|
+
if (horizontal) element.scrollLeft = scrollSign() * (offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin()));
|
|
702
|
+
else element.scrollTop = offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin());
|
|
639
703
|
}
|
|
640
704
|
virtual.setViewport(offset, viewportSize());
|
|
641
705
|
}
|
|
@@ -652,11 +716,12 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
652
716
|
move(index >= 0 && saved ? virtual.getOffsetForIndex(index, "start") + saved.inset : fallback);
|
|
653
717
|
if (element) {
|
|
654
718
|
const offset = virtual.getWindow().offset;
|
|
655
|
-
if (horizontal) element.scrollLeft = offset === 0 ? 0 : offset + margin();
|
|
656
|
-
else element.scrollTop = offset === 0 ? 0 : offset + margin();
|
|
719
|
+
if (horizontal) element.scrollLeft = scrollSign() * (offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin()));
|
|
720
|
+
else element.scrollTop = offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin());
|
|
657
721
|
}
|
|
658
722
|
}
|
|
659
723
|
function measure(target, key) {
|
|
724
|
+
readViewport();
|
|
660
725
|
const saved = anchor();
|
|
661
726
|
const offset = virtual.getWindow().offset;
|
|
662
727
|
const box = target.getBoundingClientRect();
|
|
@@ -669,9 +734,13 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
669
734
|
}
|
|
670
735
|
}
|
|
671
736
|
function readViewport() {
|
|
672
|
-
if (element) virtual.setViewport(Math.max(0, (horizontal ? element.scrollLeft : element.scrollTop) - margin()), viewportSize());
|
|
737
|
+
if (element) virtual.setViewport(Math.max(0, (horizontal ? element.scrollLeft * scrollSign() : element.scrollTop) - (stickyMargin() ? 0 : margin())), viewportSize());
|
|
738
|
+
}
|
|
739
|
+
function scrollSign() {
|
|
740
|
+
return element?.closest("[dir]")?.getAttribute("dir")?.toLowerCase() === "rtl" ? -1 : 1;
|
|
673
741
|
}
|
|
674
742
|
const stopSource = watch(source, (next) => {
|
|
743
|
+
readViewport();
|
|
675
744
|
const saved = anchor();
|
|
676
745
|
const offset = virtual.getWindow().offset;
|
|
677
746
|
const resetMeasurements = [];
|
|
@@ -686,6 +755,13 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
686
755
|
if (mounted) restore(saved, offset);
|
|
687
756
|
else seed();
|
|
688
757
|
}, { flush: "sync" });
|
|
758
|
+
const stopInsets = watch(() => [
|
|
759
|
+
toValue(options.scrollMargin),
|
|
760
|
+
viewportInset(),
|
|
761
|
+
stickyMargin()
|
|
762
|
+
], () => {
|
|
763
|
+
if (mounted) readViewport();
|
|
764
|
+
}, { flush: "post" });
|
|
689
765
|
let stopElement;
|
|
690
766
|
if (getCurrentInstance()) onMounted(() => {
|
|
691
767
|
mounted = true;
|
|
@@ -727,6 +803,7 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
727
803
|
if (getCurrentScope()) onScopeDispose(() => {
|
|
728
804
|
disposed = true;
|
|
729
805
|
stopSource();
|
|
806
|
+
stopInsets();
|
|
730
807
|
stopElement?.();
|
|
731
808
|
detach?.();
|
|
732
809
|
observer?.disconnect();
|
|
@@ -737,6 +814,7 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
737
814
|
element = void 0;
|
|
738
815
|
});
|
|
739
816
|
margin();
|
|
817
|
+
inset();
|
|
740
818
|
const binding = {
|
|
741
819
|
getItem(index) {
|
|
742
820
|
view.value;
|
|
@@ -772,24 +850,31 @@ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project, s
|
|
|
772
850
|
};
|
|
773
851
|
for (const key of Object.keys(view.value)) Object.defineProperty(binding, key, {
|
|
774
852
|
enumerable: true,
|
|
775
|
-
get: () => key === "items" ? projected.value : key === "issues" && (initialIssue || marginIssue.value) ? Object.freeze([
|
|
853
|
+
get: () => key === "items" ? projected.value : key === "issues" && (initialIssue || marginIssue.value || insetIssue.value) ? Object.freeze([
|
|
776
854
|
...view.value.issues,
|
|
777
855
|
...initialIssue ? [initialIssue] : [],
|
|
778
|
-
...marginIssue.value ? [marginIssue.value] : []
|
|
856
|
+
...marginIssue.value ? [marginIssue.value] : [],
|
|
857
|
+
...insetIssue.value ? [insetIssue.value] : []
|
|
779
858
|
]) : view.value[key]
|
|
780
859
|
});
|
|
781
860
|
return Object.freeze(binding);
|
|
782
861
|
}
|
|
783
|
-
/** Virtualize data and detail
|
|
862
|
+
/** Virtualize group, data and detail items. scrollToKey accepts the parent data-row key. */
|
|
784
863
|
function useVirtualRows(table, options) {
|
|
785
|
-
const
|
|
864
|
+
const renderItems = () => options.renderItems ? toValue(options.renderItems) : table.renderItems;
|
|
865
|
+
const reserved = () => {
|
|
866
|
+
const heights = toValue(options.pinnedRowHeights);
|
|
867
|
+
if (!heights) return 0;
|
|
868
|
+
return heights.top >= 0 && heights.bottom >= 0 && Number.isFinite(heights.top) && Number.isFinite(heights.bottom) ? heights.top + heights.bottom : NaN;
|
|
869
|
+
};
|
|
870
|
+
const virtual = useVirtualAxis(renderItems, (item) => item.key, options.estimateRowHeight ?? 40, options, false, (item, renderItem) => ({
|
|
786
871
|
...item,
|
|
787
872
|
renderItem
|
|
788
|
-
}));
|
|
789
|
-
const stopFocus = watch(() => options.grid?.selection?.focus.row, (row) => {
|
|
790
|
-
if (row === void 0) return;
|
|
791
|
-
const direct =
|
|
792
|
-
const index = direct?.kind === "row" && direct.rowIndex === row ? row :
|
|
873
|
+
}), void 0, reserved, () => reserved() > 0);
|
|
874
|
+
const stopFocus = watch([() => options.grid?.selection?.focus.row, renderItems], ([row, items], [, previousItems]) => {
|
|
875
|
+
if (row === void 0 || items !== previousItems) return;
|
|
876
|
+
const direct = items[row];
|
|
877
|
+
const index = direct?.kind === "row" && direct.rowIndex === row ? row : items.findIndex((item) => item.kind === "row" && item.rowIndex === row);
|
|
793
878
|
if (index >= 0) virtual.scrollToIndex(index);
|
|
794
879
|
}, { flush: "sync" });
|
|
795
880
|
if (getCurrentScope()) onScopeDispose(stopFocus);
|
|
@@ -802,17 +887,103 @@ function useVirtualRows(table, options) {
|
|
|
802
887
|
});
|
|
803
888
|
return Object.freeze(binding);
|
|
804
889
|
}
|
|
805
|
-
/** Virtualize
|
|
890
|
+
/** Virtualize centre columns, retaining both pinned edges and logical display indices. */
|
|
806
891
|
function useVirtualColumns(grid, options) {
|
|
807
|
-
const
|
|
892
|
+
const table = grid.table;
|
|
893
|
+
const visibleColumns = computed(() => table.columns);
|
|
894
|
+
const layout = computed(() => {
|
|
895
|
+
const columns = visibleColumns.value;
|
|
896
|
+
const center = columns.filter((column) => !column.pinned);
|
|
897
|
+
return {
|
|
898
|
+
center,
|
|
899
|
+
indices: new Map(columns.map((column, index) => [column.id, index])),
|
|
900
|
+
centerIndices: new Map(center.map((column, index) => [column.id, index]))
|
|
901
|
+
};
|
|
902
|
+
});
|
|
903
|
+
const estimate = options.estimateColumnWidth ?? 120;
|
|
904
|
+
const virtual = useVirtualAxis(() => layout.value.center, (column) => column.id, (index) => typeof estimate === "number" ? estimate : estimate(layout.value.indices.get(layout.value.center[index].id)), options, true, (item, column) => ({
|
|
808
905
|
...item,
|
|
906
|
+
column,
|
|
907
|
+
index: layout.value.indices.get(column.id),
|
|
908
|
+
start: item.start + table.pinnedStartWidth
|
|
909
|
+
}), (column) => column.width ?? clampColumnWidth(column, typeof estimate === "number" ? estimate : estimate(layout.value.indices.get(column.id))), () => table.pinnedStartWidth + table.pinnedEndWidth, () => table.pinnedStartWidth + table.pinnedEndWidth > 0);
|
|
910
|
+
const pinnedItems = (side) => Object.freeze(visibleColumns.value.filter((column) => column.pinned === side).map((column) => Object.freeze({
|
|
911
|
+
key: column.id,
|
|
912
|
+
index: layout.value.indices.get(column.id),
|
|
913
|
+
size: column.width,
|
|
914
|
+
start: side === "start" ? column.pinOffset : table.pinnedStartWidth + virtual.totalSize + table.pinnedEndWidth - column.pinOffset - column.width,
|
|
809
915
|
column
|
|
810
|
-
})
|
|
811
|
-
const
|
|
812
|
-
|
|
916
|
+
})));
|
|
917
|
+
const start = computed(() => pinnedItems("start"));
|
|
918
|
+
const end = computed(() => pinnedItems("end"));
|
|
919
|
+
const all = computed(() => Object.freeze([
|
|
920
|
+
...start.value,
|
|
921
|
+
...virtual.items,
|
|
922
|
+
...end.value
|
|
923
|
+
]));
|
|
924
|
+
const binding = Object.freeze({
|
|
925
|
+
get items() {
|
|
926
|
+
return all.value;
|
|
927
|
+
},
|
|
928
|
+
get centerItems() {
|
|
929
|
+
return virtual.items;
|
|
930
|
+
},
|
|
931
|
+
get pinnedStartItems() {
|
|
932
|
+
return start.value;
|
|
933
|
+
},
|
|
934
|
+
get pinnedEndItems() {
|
|
935
|
+
return end.value;
|
|
936
|
+
},
|
|
937
|
+
get totalSize() {
|
|
938
|
+
return table.pinnedStartWidth + virtual.totalSize + table.pinnedEndWidth;
|
|
939
|
+
},
|
|
940
|
+
get paddingStart() {
|
|
941
|
+
return virtual.paddingStart;
|
|
942
|
+
},
|
|
943
|
+
get paddingEnd() {
|
|
944
|
+
return virtual.paddingEnd;
|
|
945
|
+
},
|
|
946
|
+
get startIndex() {
|
|
947
|
+
return virtual.items[0]?.index ?? 0;
|
|
948
|
+
},
|
|
949
|
+
get endIndex() {
|
|
950
|
+
return virtual.items.at(-1)?.index ?? -1;
|
|
951
|
+
},
|
|
952
|
+
get offset() {
|
|
953
|
+
return virtual.offset;
|
|
954
|
+
},
|
|
955
|
+
get viewportSize() {
|
|
956
|
+
return virtual.viewportSize;
|
|
957
|
+
},
|
|
958
|
+
get issues() {
|
|
959
|
+
return virtual.issues;
|
|
960
|
+
},
|
|
961
|
+
getItem(index) {
|
|
962
|
+
const column = table.columns[index];
|
|
963
|
+
if (!column) return void 0;
|
|
964
|
+
if (column.pinned) return (column.pinned === "start" ? start.value : end.value).find((item) => item.key === column.id);
|
|
965
|
+
return virtual.getItem(layout.value.centerIndices.get(column.id));
|
|
966
|
+
},
|
|
967
|
+
scrollToIndex(index, align) {
|
|
968
|
+
const column = table.columns[index];
|
|
969
|
+
if (!column || column.pinned) return;
|
|
970
|
+
virtual.scrollToIndex(layout.value.centerIndices.get(column.id), align);
|
|
971
|
+
},
|
|
972
|
+
scrollToKey(key, align) {
|
|
973
|
+
if (typeof key !== "string") return;
|
|
974
|
+
const index = layout.value.indices.get(key);
|
|
975
|
+
if (index !== void 0) binding.scrollToIndex(index, align);
|
|
976
|
+
},
|
|
977
|
+
measureElement(target, key) {
|
|
978
|
+
if (typeof key === "string" && layout.value.centerIndices.has(key)) virtual.measureElement(target, key);
|
|
979
|
+
else virtual.measureElement(null, key);
|
|
980
|
+
}
|
|
981
|
+
});
|
|
982
|
+
const stopFocus = watch([() => grid.selection?.focus.column, () => table.columns], ([column, columns], [, previousColumns]) => {
|
|
983
|
+
if (column !== void 0 && columns === previousColumns) binding.scrollToIndex(column);
|
|
813
984
|
}, { flush: "sync" });
|
|
814
985
|
if (getCurrentScope()) onScopeDispose(stopFocus);
|
|
815
|
-
return
|
|
986
|
+
return binding;
|
|
816
987
|
}
|
|
817
988
|
|
|
818
989
|
//#endregion
|
|
@@ -1007,6 +1178,13 @@ function createSource(table, options, seed, publish) {
|
|
|
1007
1178
|
|
|
1008
1179
|
//#endregion
|
|
1009
1180
|
//#region src/use-data-table.ts
|
|
1181
|
+
const LAYOUT_FIELDS = [
|
|
1182
|
+
"columnSizing",
|
|
1183
|
+
"columnPinning",
|
|
1184
|
+
"grouping",
|
|
1185
|
+
"expandedGroups",
|
|
1186
|
+
"rowPinning"
|
|
1187
|
+
];
|
|
1010
1188
|
const OPERATIONS = [
|
|
1011
1189
|
"appendData",
|
|
1012
1190
|
"upsertData",
|
|
@@ -1041,9 +1219,15 @@ const OPERATIONS = [
|
|
|
1041
1219
|
"toggleExpanded",
|
|
1042
1220
|
"expandAll",
|
|
1043
1221
|
"collapseAll",
|
|
1222
|
+
"groupBy",
|
|
1223
|
+
"toggleGroup",
|
|
1224
|
+
"expandAllGroups",
|
|
1225
|
+
"collapseAllGroups",
|
|
1226
|
+
"toggleGroupSelection",
|
|
1044
1227
|
"toggleColumn",
|
|
1045
1228
|
"moveColumn",
|
|
1046
1229
|
"pinColumn",
|
|
1230
|
+
"pinRow",
|
|
1047
1231
|
"resizeColumn",
|
|
1048
1232
|
"resetColumnSize",
|
|
1049
1233
|
"edit",
|
|
@@ -1062,6 +1246,7 @@ function definedEntries(patch) {
|
|
|
1062
1246
|
function useDataTable(options) {
|
|
1063
1247
|
const empty = Object.freeze([]);
|
|
1064
1248
|
const seed = () => toRaw(toValue(options.data) ?? empty);
|
|
1249
|
+
const layoutState = () => definedEntries(Object.fromEntries(LAYOUT_FIELDS.map((key) => [key, toValue(options[key])])));
|
|
1065
1250
|
const table = createTable({
|
|
1066
1251
|
...options,
|
|
1067
1252
|
manual: options.manual ?? !!unref(options.loadMore),
|
|
@@ -1071,6 +1256,7 @@ function useDataTable(options) {
|
|
|
1071
1256
|
treeFilter: toValue(options.treeFilter),
|
|
1072
1257
|
initialState: {
|
|
1073
1258
|
...options.initialState,
|
|
1259
|
+
...layoutState(),
|
|
1074
1260
|
...definedEntries(toValue(options.state))
|
|
1075
1261
|
},
|
|
1076
1262
|
createChildLoadController: options.createChildLoadController ?? (() => new AbortController())
|
|
@@ -1090,9 +1276,10 @@ function useDataTable(options) {
|
|
|
1090
1276
|
watch(() => toValue(options.rowCount), (rowCount) => {
|
|
1091
1277
|
if (rowCount !== void 0) table.setRowCount(rowCount);
|
|
1092
1278
|
}),
|
|
1093
|
-
watch(() =>
|
|
1094
|
-
|
|
1095
|
-
|
|
1279
|
+
watch(() => ({
|
|
1280
|
+
...layoutState(),
|
|
1281
|
+
...definedEntries(toValue(options.state))
|
|
1282
|
+
}), (state) => table.setState(state), { deep: true })
|
|
1096
1283
|
];
|
|
1097
1284
|
const dispose = () => {
|
|
1098
1285
|
if (disposed) return;
|
|
@@ -1128,6 +1315,11 @@ function useDataTable(options) {
|
|
|
1128
1315
|
enumerable: true,
|
|
1129
1316
|
get: () => snapshot.value.state.expanded
|
|
1130
1317
|
});
|
|
1318
|
+
for (const key of LAYOUT_FIELDS) Object.defineProperty(binding, key, {
|
|
1319
|
+
enumerable: true,
|
|
1320
|
+
get: () => snapshot.value.state[key]
|
|
1321
|
+
});
|
|
1322
|
+
binding["setGrouping"] = (columnIds) => table.groupBy(columnIds);
|
|
1131
1323
|
Object.defineProperty(binding, "pendingChanges", {
|
|
1132
1324
|
enumerable: true,
|
|
1133
1325
|
get: () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/injection.ts","../src/row-draft.ts","../src/use-data-grid.ts","../src/use-virtual.ts","../src/source.ts","../src/use-data-table.ts"],"sourcesContent":["import {\n defaultTableMessages,\n formatCount,\n resolveTableMessages,\n type Count,\n type TableMessages,\n} from \"@vueye-table/core\";\nimport { inject, provide, type InjectionKey } from \"vue\";\n\nimport type { DataGridBinding } from \"./use-data-grid\";\nimport type { DataTableBinding } from \"./use-data-table\";\n\nconst tableKey: InjectionKey<DataTableBinding<unknown>> = Symbol(\"vueye-table\");\nconst gridKey: InjectionKey<DataGridBinding<unknown>> = Symbol(\"vueye-table-grid\");\n\n/** Make a table available to every component below the current one. */\nexport function provideDataTable<TRow>(table: DataTableBinding<TRow>): void {\n provide(tableKey, table as DataTableBinding<unknown>);\n}\n\n/**\n * Read the table provided by an ancestor. Throws when there is none, naming the component that\n * provides one, rather than rendering an empty table.\n */\nexport function injectDataTable<TRow = unknown>(\n consumer = \"This component\",\n): DataTableBinding<TRow> {\n const table = inject(tableKey, undefined);\n if (!table) {\n throw new Error(\n `${consumer} needs a table. Render it inside <DataTableRoot :table=\"table\">, or call provideDataTable(useDataTable(...)) in an ancestor.`,\n );\n }\n return table as DataTableBinding<TRow>;\n}\n\nexport function provideDataGrid<TRow>(grid: DataGridBinding<TRow>): void {\n provide(gridKey, grid as DataGridBinding<unknown>);\n}\n\n/** Read the grid provided by an ancestor, or `undefined` outside a grid. */\nexport function injectDataGrid<TRow = unknown>(): DataGridBinding<TRow> | undefined {\n return inject(gridKey, undefined) as DataGridBinding<TRow> | undefined;\n}\n\n/** What a host says about language: the locale numbers and text follow, and its own words. */\nexport interface TableLocaleOptions {\n readonly locale?: string | undefined;\n readonly messages?: Partial<TableMessages> | undefined;\n}\n\n/** The language every component below a provider speaks. */\nexport interface TableLocale {\n readonly locale: string | undefined;\n readonly messages: TableMessages;\n /** A number written in the locale, with its value kept for plural choices. */\n readonly count: (value: number) => Count;\n}\n\n/**\n * A getter, so a component reads the current language each time it renders: a host that changes\n * its locale or words re-renders the table in them.\n */\nexport const tableLocaleKey: InjectionKey<() => TableLocaleOptions> = Symbol(\"vueye-table-locale\");\n\nconst defaultLocale: TableLocale = {\n locale: undefined,\n messages: defaultTableMessages,\n count: (value) => formatCount(value),\n};\n\n/**\n * Give every component below the current one a locale and words. An ancestor's options are kept\n * for whatever these leave out, so an application-wide language (`VueyeTablePlugin`) and a\n * table's own words combine. Returns the combined language, for the providing component itself.\n */\nexport function provideTableLocale(options: () => TableLocaleOptions): () => TableLocale {\n const parent = inject(tableLocaleKey, undefined);\n const merged = (): TableLocaleOptions => {\n const own = options();\n const inherited = parent?.() ?? {};\n return {\n locale: own.locale ?? inherited.locale,\n messages: { ...inherited.messages, ...definedMessages(own.messages) },\n };\n };\n provide(tableLocaleKey, merged);\n return resolveLocale(merged);\n}\n\nfunction definedMessages(\n messages: Partial<TableMessages> | undefined,\n): Partial<TableMessages> | undefined {\n if (!messages) return undefined;\n const defined: Partial<TableMessages> = Object.fromEntries(\n Object.entries(messages).filter(([, value]) => value !== undefined),\n );\n return defined;\n}\n\n/**\n * The language provided by an ancestor, or English with the runtime's number format. Call it in\n * `setup` and read the result while rendering.\n */\nexport function useTableLocale(): () => TableLocale {\n const source = inject(tableLocaleKey, undefined);\n return source ? resolveLocale(source) : () => defaultLocale;\n}\n\n/** Resolve options to words and a number format, again only when they change. */\nfunction resolveLocale(source: () => TableLocaleOptions): () => TableLocale {\n let cached: { options: TableLocaleOptions; resolved: TableLocale } | undefined;\n return () => {\n const options = source();\n if (\n cached &&\n cached.options.locale === options.locale &&\n shallowEqual(cached.options.messages, options.messages)\n )\n return cached.resolved;\n const format = new Intl.NumberFormat(options.locale);\n const resolved: TableLocale = {\n locale: options.locale,\n messages: resolveTableMessages(options.messages),\n count: (value) => ({ value, text: format.format(value) }),\n };\n cached = { options, resolved };\n return resolved;\n };\n}\n\nfunction shallowEqual(\n left: Partial<TableMessages> | undefined,\n right: Partial<TableMessages> | undefined,\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n const keys = Object.keys(left) as (keyof TableMessages)[];\n return keys.length === Object.keys(right).length && keys.every((key) => left[key] === right[key]);\n}\n","import type {\n CellEdit,\n DataTable,\n DeepKeys,\n EditResult,\n PathValue,\n RowKey,\n TableIssue,\n} from \"@vueye-table/core\";\nimport { shallowReactive, shallowRef, toRaw } from \"vue\";\n\n/** A column-value bag. Only configured columns are present; dotted paths stay dotted keys. */\nexport type RowDraftValues<TRow> = {\n -readonly [P in DeepKeys<TRow>]?: PathValue<TRow, P>;\n};\n\nexport interface RowDraft<TRow> {\n readonly rowKey: RowKey;\n readonly values: RowDraftValues<TRow>;\n readonly issues: readonly TableIssue[];\n readonly status: \"editing\" | \"saving\" | \"saved\" | \"cancelled\" | \"stale\";\n readonly pending: boolean;\n /** Supply raw text for the column parser, including numeric/date input. */\n setInput(column: string, input: string): void;\n /** Set a computed column whose id is not a path in the row type. */\n setValue(column: string, value: unknown): void;\n save(): Promise<EditResult<TRow>>;\n /** Discard an unsubmitted draft. A submitted validation batch is owned by the engine. */\n cancel(): boolean;\n}\n\nexport function rejectedDraft<TRow>(rowKey: RowKey, message: string): EditResult<TRow> {\n return refused([Object.freeze({ code: \"stale_draft\", rowKey, message })]);\n}\n\nfunction refused<TRow>(issues: readonly TableIssue[]): EditResult<TRow> {\n return Object.freeze({\n status: \"rejected\",\n changes: Object.freeze([]),\n rowChanges: Object.freeze([]),\n pendingCells: Object.freeze([]),\n issues: Object.freeze([...issues]),\n });\n}\n\n// Compare owned structured values without making nested values reactive. Cycles are allowed.\nfunction equal(left: unknown, right: unknown, seen = new WeakMap<object, object>()): boolean {\n if (Object.is(left, right)) return true;\n if (!left || !right || typeof left !== \"object\" || typeof right !== \"object\") return false;\n if (left instanceof Date || right instanceof Date)\n return (\n left instanceof Date && right instanceof Date && Object.is(left.getTime(), right.getTime())\n );\n if (Array.isArray(left) && Array.isArray(right) && left.length !== right.length) return false;\n if (Object.getPrototypeOf(left) !== Object.getPrototypeOf(right)) return false;\n if (seen.has(left)) return seen.get(left) === right;\n seen.set(left, right);\n if (left instanceof Map && right instanceof Map) return equal([...left], [...right], seen);\n if (left instanceof Set && right instanceof Set) return equal([...left], [...right], seen);\n if (left instanceof RegExp && right instanceof RegExp)\n return left.source === right.source && left.flags === right.flags;\n if (left instanceof ArrayBuffer && right instanceof ArrayBuffer)\n return equal([...new Uint8Array(left)], [...new Uint8Array(right)], seen);\n if (ArrayBuffer.isView(left) && ArrayBuffer.isView(right))\n return equal(\n [...new Uint8Array(left.buffer, left.byteOffset, left.byteLength)],\n [...new Uint8Array(right.buffer, right.byteOffset, right.byteLength)],\n seen,\n );\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every(\n (key) =>\n Object.hasOwn(right, key) && equal(Reflect.get(left, key), Reflect.get(right, key), seen),\n )\n );\n}\n\n/** Internal factory; disposal is shared with the binding's single engine subscription. */\nexport function createRowDraft<TRow>(\n table: DataTable<TRow>,\n key: RowKey,\n register: (dispose: () => void) => () => void,\n): RowDraft<TRow> {\n const snapshot = table.getSnapshot();\n const original = snapshot.getRow(key)?.original;\n const columns = snapshot.allColumns;\n const values = shallowReactive<Record<string, unknown>>(Object.create(null));\n const initial = new Map<string, unknown>();\n const inputs = new Map<string, string>();\n const copyIssues = new Map<string, TableIssue>();\n const issues = shallowRef<readonly TableIssue[]>([]);\n const status = shallowRef<RowDraft<TRow>[\"status\"]>(\"editing\");\n for (const column of columns) {\n if (original === undefined) break;\n try {\n if (!column.isEditable(original)) continue;\n const value = column.getValue(original);\n initial.set(column.id, value);\n values[column.id] = structuredClone(toRaw(value));\n } catch {\n copyIssues.set(\n column.id,\n Object.freeze({\n code: \"invalid_value\",\n rowKey: key,\n column: column.id,\n message:\n \"This value cannot be copied into a row draft. Replace it explicitly before saving.\",\n }),\n );\n issues.value = [...copyIssues.values()];\n }\n }\n let saving: Promise<EditResult<TRow>> | undefined;\n let disposePending: ((result: EditResult<TRow>) => void) | undefined;\n let disposed = false;\n const stale = (): EditResult<TRow> =>\n rejectedDraft(key, \"This draft is closed, or its row or columns changed. Open a new draft.\");\n const unregister = register(() => {\n disposed = true;\n const result = stale();\n status.value = \"stale\";\n issues.value = result.issues;\n disposePending?.(result);\n });\n const draft: RowDraft<TRow> = {\n rowKey: key,\n values,\n get issues() {\n return issues.value;\n },\n get status() {\n return status.value;\n },\n get pending() {\n return status.value === \"saving\";\n },\n setInput(column, input) {\n if (status.value === \"editing\") inputs.set(column, input);\n },\n setValue(column, value) {\n if (status.value === \"editing\") {\n values[column] = value;\n inputs.delete(column);\n }\n },\n save() {\n if (saving) return saving;\n if (\n status.value !== \"editing\" ||\n disposed ||\n original === undefined ||\n table.getSnapshot().getRow(key)?.original !== original ||\n columns.some(\n (column) => table.getSnapshot().getColumn(column.id)?.definition !== column.definition,\n )\n ) {\n const result = stale();\n issues.value = result.issues;\n status.value = \"stale\";\n unregister();\n return Promise.resolve(result);\n }\n const edits: CellEdit[] = [];\n const uncopied = [...copyIssues.values()].filter(\n (problem) => !Object.hasOwn(values, problem.column!) && !inputs.has(problem.column!),\n );\n if (uncopied.length) {\n issues.value = Object.freeze(uncopied);\n return Promise.resolve(refused(issues.value));\n }\n for (const column of new Set([...Object.keys(values), ...inputs.keys()])) {\n try {\n const value = toRaw(values[column]);\n if (inputs.has(column)) edits.push({ rowKey: key, column, input: inputs.get(column)! });\n else if (!initial.has(column) || !equal(value, initial.get(column))) {\n edits.push(\n typeof value === \"string\"\n ? { rowKey: key, column, input: value }\n : {\n rowKey: key,\n column,\n value:\n value !== null && typeof value === \"object\" ? structuredClone(value) : value,\n },\n );\n }\n } catch {\n issues.value = Object.freeze([\n Object.freeze({\n code: \"invalid_value\",\n rowKey: key,\n column,\n message:\n \"This draft value cannot be copied for submission. Replace it before saving.\",\n }),\n ]);\n return Promise.resolve(refused(issues.value));\n }\n }\n status.value = \"saving\";\n const result = table.edit(edits, { expectedRows: new Map([[key, original]]) });\n if (disposed) return Promise.resolve(stale());\n const cancelled = new Promise<EditResult<TRow>>((resolve) => {\n disposePending = resolve;\n });\n saving = Promise.race([result.completion ?? Promise.resolve(result), cancelled]).then(\n (final) => {\n issues.value = final.issues;\n // Partial results close the draft too: accepted fields have already changed the row.\n status.value =\n disposed || final.issues.some((problem) => problem.code === \"stale_draft\")\n ? \"stale\"\n : final.status === \"rejected\"\n ? \"editing\"\n : \"saved\";\n if (status.value !== \"editing\") unregister();\n saving = undefined;\n disposePending = undefined;\n return final;\n },\n );\n return saving;\n },\n cancel() {\n if (status.value !== \"editing\") return false;\n status.value = \"cancelled\";\n unregister();\n return true;\n },\n };\n return Object.freeze(draft);\n}\n","import {\n clampPosition,\n formatValue,\n gridCommand,\n moveSelection,\n rangeContains,\n selectCell,\n selectionRange,\n typeOf,\n type CellPosition,\n type CellRange,\n type CopyOptions,\n type EditResult,\n type GridBounds,\n type GridDirection,\n type GridKey,\n type GridSelection,\n type MoveOptions,\n type TableColumn,\n type TableRow,\n type EditorSpec,\n type RowKey,\n type CellEdit,\n} from \"@vueye-table/core\";\nimport { computed, shallowRef, watch, type ComputedRef } from \"vue\";\n\nimport { rejectedDraft } from \"./row-draft\";\nimport type { DataTableBinding } from \"./use-data-table\";\n\n/** The cell being edited and the text typed so far. */\nexport interface GridEditor {\n readonly position: CellPosition;\n readonly draft: string;\n}\n\n/**\n * Spreadsheet interaction over a table: a selected range, keyboard navigation, in-cell editing,\n * copy, paste, and clearing. Positions refer to the current page and the visible columns.\n */\nexport interface DataGridBinding<TRow> {\n readonly table: DataTableBinding<TRow>;\n readonly selection: GridSelection | undefined;\n readonly range: CellRange | undefined;\n readonly editor: GridEditor | undefined;\n readonly bounds: ComputedRef<GridBounds>;\n /** The latest edit outcome, to show a rejected value. */\n readonly lastResult: EditResult<TRow> | undefined;\n /** Serializable editor metadata for an editable cell; no component resolution. */\n editorFor(position: CellPosition): EditorSpec | undefined;\n cellAt(position: CellPosition): { row: TableRow<TRow>; column: TableColumn<TRow> } | undefined;\n isFocused(position: CellPosition): boolean;\n isSelected(position: CellPosition): boolean;\n isEditing(position: CellPosition): boolean;\n focusCell(position: CellPosition, options?: { readonly extend?: boolean | undefined }): void;\n move(direction: GridDirection, options?: MoveOptions): void;\n selectAll(): void;\n /** Start editing the focused cell, with its current text or with `initial`. */\n startEdit(initial?: string): boolean;\n updateDraft(draft: string): void;\n /** Write the draft through the table, then move the focus if asked. */\n commitEdit(then?: GridDirection): EditResult<TRow> | undefined;\n /** Submit through core validation; retain a refused/pending editor for correction. */\n submitEdit(\n edit?: { readonly input: string } | { readonly value: unknown },\n then?: GridDirection,\n ): EditResult<TRow> | undefined;\n toggleCheckbox(): boolean;\n cancelEdit(): void;\n /** The selected range as tab-separated text. */\n copy(options?: CopyOptions): string;\n /** Paste tab-separated text at the top-left of the selection. */\n paste(text: string): EditResult<TRow> | undefined;\n clear(): EditResult<TRow> | undefined;\n /** Handle a key press. Returns `true` when the grid used it, so the caller can prevent the default. */\n handleKey(event: GridKey): boolean;\n}\n\nexport interface DataGridOptions {\n /** Falls back to the first visible column if the configured column is hidden. */\n readonly treeColumn?: () => string | undefined;\n}\n\nexport function useDataGrid<TRow>(\n table: DataTableBinding<TRow>,\n gridOptions: DataGridOptions = {},\n): DataGridBinding<TRow> {\n const selection = shallowRef<GridSelection | undefined>();\n const editor = shallowRef<GridEditor | undefined>();\n const lastResult = shallowRef<EditResult<TRow> | undefined>();\n let editing:\n | { readonly key: RowKey; readonly column: TableColumn<TRow>; readonly original: TRow }\n | undefined;\n let resultToken: object | undefined;\n const invalidEditors = new WeakSet<object>();\n const editorSpecs = new WeakMap<object, EditorSpec>();\n let submitting: object | undefined;\n const record = (result: EditResult<TRow>): EditResult<TRow> => {\n const token = {};\n resultToken = token;\n lastResult.value = result;\n void result.completion?.then((final) => {\n if (resultToken === token) lastResult.value = final;\n return undefined;\n });\n return result;\n };\n const bounds = computed<GridBounds>(() => ({\n rows: table.rows.length,\n columns: table.columns.length,\n }));\n const range = computed(() => (selection.value ? selectionRange(selection.value) : undefined));\n\n const same = (left: CellPosition | undefined, right: CellPosition): boolean =>\n left !== undefined && left.row === right.row && left.column === right.column;\n\n // Searching, filtering, paging, or hiding a column can shrink the grid under the selection.\n // Keep the selection on cells that exist, and drop an edit whose cell is gone.\n watch(\n () => table.snapshot,\n () => {\n const next = bounds.value;\n const current = selection.value;\n if (current && (next.rows === 0 || next.columns === 0)) {\n selection.value = undefined;\n } else if (current) {\n const anchor = clampPosition(current.anchor, next);\n const focus = clampPosition(current.focus, next);\n if (!same(current.anchor, anchor) || !same(current.focus, focus)) {\n selection.value = { anchor, focus };\n }\n }\n const active = editing;\n if (active && editor.value) {\n const row = table.rows.findIndex((candidate) => candidate.key === active.key);\n const column = table.columns.findIndex((candidate) => candidate.id === active.column.id);\n if (\n row < 0 ||\n column < 0 ||\n (!submitting && table.getRow(active.key)?.original !== active.original) ||\n table.getColumn(active.column.id)?.definition !== active.column.definition\n ) {\n editor.value = undefined;\n editing = undefined;\n record(\n rejectedDraft(\n active.key,\n \"The edited cell changed or left the visible grid. Start a new edit.\",\n ),\n );\n } else if (!same(editor.value.position, { row, column })) {\n editor.value = { ...editor.value, position: { row, column } };\n selection.value = selectCell({ row, column });\n }\n }\n },\n { flush: \"sync\" },\n );\n\n const cellAt: DataGridBinding<TRow>[\"cellAt\"] = (position) => {\n const row = table.rows[position.row];\n const column = table.columns[position.column];\n return row && column ? { row, column } : undefined;\n };\n\n const ensureSelection = (): GridSelection | undefined => {\n if (bounds.value.rows === 0 || bounds.value.columns === 0) {\n return undefined;\n }\n selection.value ??= selectCell({ row: 0, column: 0 });\n return selection.value;\n };\n\n const grid: DataGridBinding<TRow> = {\n table,\n get selection() {\n return selection.value;\n },\n get range() {\n return range.value;\n },\n get editor() {\n return editor.value;\n },\n get lastResult() {\n return lastResult.value;\n },\n bounds,\n cellAt,\n editorFor(position) {\n const cell = cellAt(position);\n if (!cell || !cell.column.isEditable(cell.row.original)) return undefined;\n const spec = cell.column.definition.editor;\n const cached = editorSpecs.get(cell.column.definition);\n if (cached) return cached;\n if (\n spec &&\n [\"text\", \"number\", \"select\", \"checkbox\", \"date\"].includes(spec.kind) &&\n (spec.options === undefined ||\n (Array.isArray(spec.options) &&\n spec.options.every(\n (value) => value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value),\n )))\n ) {\n const resolved = Object.freeze({\n kind: spec.kind,\n ...(spec.options ? { options: Object.freeze([...spec.options]) } : {}),\n ...(spec.min !== undefined ? { min: spec.min } : {}),\n ...(spec.max !== undefined ? { max: spec.max } : {}),\n ...(spec.maxLength !== undefined ? { maxLength: spec.maxLength } : {}),\n ...(spec.pattern !== undefined ? { pattern: spec.pattern } : {}),\n });\n editorSpecs.set(cell.column.definition, resolved);\n return resolved;\n }\n if (spec) {\n if (!invalidEditors.has(cell.column.definition)) {\n invalidEditors.add(cell.column.definition);\n record(\n Object.freeze({\n status: \"rejected\",\n changes: Object.freeze([]),\n rowChanges: Object.freeze([]),\n pendingCells: Object.freeze([]),\n issues: Object.freeze([\n Object.freeze({\n code: \"invalid_value\",\n rowKey: cell.row.key,\n column: cell.column.id,\n message: \"Invalid editor metadata; text metadata is used.\",\n }),\n ]),\n }),\n );\n }\n return Object.freeze({ kind: \"text\" });\n }\n const type =\n cell.column.definition.type ?? typeOf(cell.row.getValue(cell.column.id)) ?? \"text\";\n return Object.freeze({ kind: type === \"boolean\" ? \"checkbox\" : type });\n },\n isFocused: (position) => same(selection.value?.focus, position),\n isSelected: (position) => (range.value ? rangeContains(range.value, position) : false),\n isEditing: (position) => same(editor.value?.position, position),\n focusCell(position, { extend = false } = {}) {\n if (submitting) return;\n const target = clampPosition(position, bounds.value);\n if (editor.value && !same(editor.value.position, target)) {\n grid.commitEdit();\n }\n selection.value =\n extend && selection.value\n ? { anchor: selection.value.anchor, focus: target }\n : selectCell(target);\n },\n move(direction, options) {\n const current = ensureSelection();\n if (current) {\n selection.value = moveSelection(current, direction, bounds.value, options);\n }\n },\n selectAll() {\n if (bounds.value.rows > 0 && bounds.value.columns > 0) {\n selection.value = {\n anchor: { row: 0, column: 0 },\n focus: { row: bounds.value.rows - 1, column: bounds.value.columns - 1 },\n };\n }\n },\n startEdit(initial) {\n if (submitting) return false;\n const focus = ensureSelection()?.focus;\n const cell = focus ? cellAt(focus) : undefined;\n if (!focus || !cell || !cell.column.isEditable(cell.row.original)) {\n return false;\n }\n const value = cell.row.getValue(cell.column.id);\n const kind = grid.editorFor(focus)?.kind;\n const text =\n kind === \"date\" && value instanceof Date\n ? Number.isFinite(value.getTime())\n ? value.toISOString().slice(0, 10)\n : \"\"\n : kind && kind !== \"text\"\n ? value === null || value === undefined\n ? \"\"\n : formatValue(value)\n : cell.row.getDisplay(cell.column.id);\n editor.value = { position: focus, draft: initial ?? text };\n editing = { key: cell.row.key, column: cell.column, original: cell.row.original };\n return true;\n },\n updateDraft(draft) {\n if (editor.value) {\n editor.value = { position: editor.value.position, draft };\n }\n },\n commitEdit(then) {\n const current = editor.value;\n if (!current) {\n return undefined;\n }\n const active = editing;\n editor.value = undefined;\n editing = undefined;\n if (!active) {\n return undefined;\n }\n const result = record(\n table.edit(\n {\n rowKey: active.key,\n column: active.column.id,\n input: current.draft,\n },\n { expectedRows: new Map([[active.key, active.original]]) },\n ),\n );\n if (then) {\n grid.move(then);\n }\n return result;\n },\n submitEdit(edit, then) {\n const current = editor.value;\n const active = editing;\n if (!current || !active || submitting) return undefined;\n const token = {};\n submitting = token;\n const cell: CellEdit = {\n rowKey: active.key,\n column: active.column.id,\n ...(edit ?? { input: current.draft }),\n };\n const result = record(\n table.edit(cell, { expectedRows: new Map([[active.key, active.original]]) }),\n );\n const settle = (final: EditResult<TRow>): void => {\n if (submitting !== token) return;\n submitting = undefined;\n if (editing !== active) return;\n if (\n final.status !== \"rejected\" ||\n final.issues.some((problem) => problem.code === \"stale_draft\")\n ) {\n editor.value = undefined;\n editing = undefined;\n if (then) grid.move(then);\n } else {\n editing = { ...active, original: table.getRow(active.key)?.original ?? active.original };\n }\n };\n if (result.completion) void result.completion.then(settle);\n else settle(result);\n return result;\n },\n cancelEdit() {\n editor.value = undefined;\n editing = undefined;\n submitting = undefined;\n },\n toggleCheckbox() {\n const focus = ensureSelection()?.focus;\n const cell = focus ? cellAt(focus) : undefined;\n if (!focus || !cell || grid.editorFor(focus)?.kind !== \"checkbox\") return false;\n record(\n table.edit(\n {\n rowKey: cell.row.key,\n column: cell.column.id,\n value: cell.row.getValue(cell.column.id) !== true,\n },\n { expectedRows: new Map([[cell.row.key, cell.row.original]]) },\n ),\n );\n return true;\n },\n copy(options) {\n return range.value ? table.copy(range.value, options) : \"\";\n },\n paste(text) {\n if (!range.value) {\n return undefined;\n }\n const result = record(table.paste({ row: range.value.top, column: range.value.left }, text));\n return result;\n },\n clear() {\n if (!range.value) {\n return undefined;\n }\n const result = record(table.clear(range.value));\n return result;\n },\n handleKey(event) {\n if (editor.value) {\n return false;\n }\n const current = selection.value?.focus ?? { row: 0, column: 0 };\n const row = table.rows[current.row];\n const treeColumn =\n table.columns.find((column) => column.id === gridOptions.treeColumn?.()) ??\n table.columns[0];\n const command = gridCommand(\n event,\n table.tree && row && table.columns[current.column] === treeColumn\n ? { canExpand: row.canExpand, expanded: row.isExpanded }\n : undefined,\n );\n switch (command?.type) {\n case \"tree\": {\n if (!row) return false;\n let key = row.key;\n if (command.action === \"expand\" || command.action === \"collapse\")\n table.toggleExpanded(key, command.action === \"expand\");\n else if (command.action === \"siblings\") {\n for (const sibling of table.processedRows.filter(\n (candidate) => candidate.parentKey === row.parentKey && candidate.canExpand,\n ))\n table.toggleExpanded(sibling.key, true);\n } else if (command.action === \"child\")\n key = table.rows.find((candidate) => candidate.parentKey === row.key)?.key ?? key;\n else key = row.parentKey ?? key;\n const index = table.rows.findIndex((candidate) => candidate.key === key);\n if (index >= 0) grid.focusCell({ row: index, column: current.column });\n return true;\n }\n case \"move\":\n grid.move(command.direction, command.options);\n return true;\n case \"edit\":\n return grid.startEdit(command.initial);\n case \"clear\":\n grid.clear();\n return true;\n case \"selectAll\":\n grid.selectAll();\n return true;\n case \"undo\":\n return table.undo();\n case \"redo\":\n return table.redo();\n case \"cancel\":\n if (selection.value) {\n selection.value = selectCell(selection.value.focus);\n }\n return true;\n default:\n return false;\n }\n },\n };\n return grid;\n}\n","import {\n createVirtualizer,\n getRowItemKey,\n type RowKey,\n type TableColumn,\n type TableRenderItem,\n type VirtualAlign,\n type VirtualItem,\n type VirtualWindow,\n type TableIssue,\n} from \"@vueye-table/core\";\nimport {\n computed,\n getCurrentInstance,\n getCurrentScope,\n nextTick,\n onMounted,\n onScopeDispose,\n shallowRef,\n toValue,\n watch,\n type ComponentPublicInstance,\n type MaybeRefOrGetter,\n} from \"vue\";\n\nimport type { DataGridBinding } from \"./use-data-grid\";\nimport type { DataTableBinding } from \"./use-data-table\";\n\nexport interface VirtualViewportOptions {\n readonly scrollElement: MaybeRefOrGetter<HTMLElement | null | undefined>;\n readonly overscan?: number | undefined;\n /** Number of items rendered before mount, without overscan. Defaults to 10. */\n readonly initialCount?: number | undefined;\n /** Space before the items, such as a sticky header or leading row-number column. */\n readonly scrollMargin?: MaybeRefOrGetter<number> | undefined;\n}\nexport interface UseVirtualRowsOptions<TRow> extends VirtualViewportOptions {\n readonly estimateRowHeight?: number | ((index: number) => number) | undefined;\n /** Connect logical grid focus to the rendered data row, skipping details. */\n readonly grid?: DataGridBinding<TRow> | undefined;\n}\nexport interface UseVirtualColumnsOptions extends VirtualViewportOptions {\n /** Fallback for columns without an effective width. Defaults to 120. */\n readonly estimateColumnWidth?: number | ((index: number) => number) | undefined;\n}\nexport interface VirtualRowItem<TRow> extends VirtualItem {\n readonly renderItem: TableRenderItem<TRow>;\n}\nexport interface VirtualColumnItem<TRow> extends VirtualItem {\n readonly column: TableColumn<TRow>;\n}\nexport interface VirtualBinding<TItem extends VirtualItem> extends Omit<VirtualWindow, \"items\"> {\n readonly items: readonly TItem[];\n getItem(index: number): TItem | undefined;\n scrollToIndex(index: number, options?: { readonly align?: VirtualAlign | undefined }): void;\n scrollToKey(key: RowKey, options?: { readonly align?: VirtualAlign | undefined }): void;\n /** Pass the virtual item key explicitly; null releases its previously observed element. */\n measureElement(element: Element | ComponentPublicInstance | null, key: RowKey): void;\n}\n\nfunction useVirtualAxis<TSource, TItem extends VirtualItem>(\n source: () => readonly TSource[],\n keyOf: (item: TSource) => RowKey,\n estimate: number | ((index: number) => number),\n options: VirtualViewportOptions,\n horizontal: boolean,\n project: (item: VirtualItem, source: TSource) => TItem,\n sizeOf?: (item: TSource) => number | undefined,\n): VirtualBinding<TItem> {\n let items = source();\n const knownSizes = new Map<RowKey, number | undefined>(\n sizeOf ? items.map((item) => [keyOf(item), sizeOf(item)]) : [],\n );\n const estimateSize = sizeOf\n ? (index: number): number =>\n sizeOf(items[index]!) ?? (typeof estimate === \"number\" ? estimate : estimate(index))\n : estimate;\n let mounted = false;\n let disposed = false;\n let element: HTMLElement | null | undefined;\n let observer: ResizeObserver | undefined;\n let detach: (() => void) | undefined;\n const elements = new Map<RowKey, Element>();\n const keysByElement = new Map<Element, RowKey>();\n const requestedCount = options.initialCount ?? 10;\n const initialCount =\n Number.isSafeInteger(requestedCount) && requestedCount >= 0 ? requestedCount : 10;\n const initialIssue: TableIssue | undefined =\n initialCount === requestedCount\n ? undefined\n : Object.freeze({\n code: \"invalid_virtual_option\",\n message: \"Initial count must be a non-negative safe integer; 10 is used.\",\n });\n const layoutOptions = () => ({\n count: items.length,\n estimateSize,\n overscan: mounted ? options.overscan : 0,\n getKey: (index: number): RowKey => keyOf(items[index]!),\n });\n const virtual = createVirtualizer(layoutOptions());\n function seed(): void {\n let size = 0;\n for (let index = 0; index < Math.min(initialCount, items.length); index += 1) {\n const value = typeof estimateSize === \"number\" ? estimateSize : estimateSize(index);\n size += Number.isFinite(value) && value > 0 ? value : 40;\n }\n virtual.setViewport(0, size);\n }\n seed();\n const view = shallowRef(virtual.getWindow());\n const projected = computed(() =>\n Object.freeze(view.value.items.map((item) => Object.freeze(project(item, items[item.index]!)))),\n );\n const unsubscribe = virtual.subscribe((next) => {\n view.value = next;\n });\n const marginIssue = shallowRef<TableIssue>();\n\n function margin(): number {\n const value = toValue(options.scrollMargin) ?? 0;\n if (Number.isFinite(value) && value >= 0) {\n marginIssue.value = undefined;\n return value;\n }\n marginIssue.value ??= Object.freeze({\n code: \"invalid_virtual_option\",\n message: \"Scroll margin must be non-negative and finite; 0 is used.\",\n });\n return 0;\n }\n function viewportSize(): number {\n return element\n ? Math.max(0, (horizontal ? element.clientWidth : element.clientHeight) - margin())\n : virtual.getWindow().viewportSize;\n }\n function move(offset: number): void {\n if (element) {\n if (horizontal) element.scrollLeft = offset === 0 ? 0 : offset + margin();\n else element.scrollTop = offset === 0 ? 0 : offset + margin();\n }\n virtual.setViewport(offset, viewportSize());\n }\n function anchor(): { key: RowKey; inset: number } | undefined {\n const current = virtual.getWindow();\n const first = current.items.find((item) => item.start + item.size > current.offset);\n return first ? { key: first.key, inset: current.offset - first.start } : undefined;\n }\n function restore(saved: ReturnType<typeof anchor>, fallback: number): void {\n const index = saved ? items.findIndex((item) => keyOf(item) === saved.key) : -1;\n move(index >= 0 && saved ? virtual.getOffsetForIndex(index, \"start\") + saved.inset : fallback);\n // Reflect the clamp in the scroll element after shrink or removal.\n if (element) {\n const offset = virtual.getWindow().offset;\n if (horizontal) element.scrollLeft = offset === 0 ? 0 : offset + margin();\n else element.scrollTop = offset === 0 ? 0 : offset + margin();\n }\n }\n function measure(target: Element, key: RowKey): void {\n const saved = anchor();\n const offset = virtual.getWindow().offset;\n const box = target.getBoundingClientRect();\n const size = horizontal ? box.width : box.height;\n // Hidden and detached elements have no useful measurement; retain the estimate.\n if (size > 0 && Number.isFinite(size)) {\n const previous = virtual.getWindow();\n virtual.measure(key, size);\n if (virtual.getWindow() === previous) return;\n restore(saved, offset);\n }\n }\n function readViewport(): void {\n if (element)\n virtual.setViewport(\n Math.max(0, (horizontal ? element.scrollLeft : element.scrollTop) - margin()),\n viewportSize(),\n );\n }\n const stopSource = watch(\n source,\n (next) => {\n const saved = anchor();\n const offset = virtual.getWindow().offset;\n const resetMeasurements: RowKey[] = [];\n if (sizeOf) {\n for (const item of next) {\n const key = keyOf(item);\n const size = sizeOf(item);\n if (knownSizes.has(key) && !Object.is(knownSizes.get(key), size))\n resetMeasurements.push(key);\n // Keep hidden keys so width changes while hidden also discard their old measurement.\n knownSizes.set(key, size);\n }\n }\n items = next;\n virtual.setOptions(layoutOptions(), resetMeasurements);\n if (mounted) restore(saved, offset);\n else seed();\n },\n { flush: \"sync\" },\n );\n let stopElement: (() => void) | undefined;\n if (getCurrentInstance())\n onMounted(() => {\n mounted = true;\n virtual.setOptions(layoutOptions());\n stopElement = watch(\n () => toValue(options.scrollElement),\n (next) => {\n detach?.();\n observer?.disconnect();\n observer = undefined;\n element = next;\n if (!next) {\n seed();\n return;\n }\n const owner = next.ownerDocument.defaultView;\n const Observer = owner?.ResizeObserver;\n if (Observer) {\n observer = new Observer((entries) => {\n for (const entry of entries) {\n if (entry.target === element) readViewport();\n else {\n const key = keysByElement.get(entry.target);\n if (key !== undefined) measure(entry.target, key);\n }\n }\n });\n observer.observe(next);\n for (const target of elements.values()) observer.observe(target);\n } else owner?.addEventListener(\"resize\", readViewport);\n next.addEventListener(\"scroll\", readViewport, { passive: true });\n detach = () => {\n next.removeEventListener(\"scroll\", readViewport);\n owner?.removeEventListener(\"resize\", readViewport);\n };\n readViewport();\n for (const [key, target] of elements) measure(target, key);\n },\n { immediate: true, flush: \"post\" },\n );\n });\n if (getCurrentScope())\n onScopeDispose(() => {\n disposed = true;\n stopSource();\n stopElement?.();\n detach?.();\n observer?.disconnect();\n unsubscribe();\n elements.clear();\n keysByElement.clear();\n knownSizes.clear();\n element = undefined;\n });\n margin();\n const binding = {\n getItem(index: number): TItem | undefined {\n // Reading the revision connects offscreen lookups to reactive measurements and layout.\n void view.value;\n const item = virtual.getItem(index);\n return item ? Object.freeze(project(item, items[index]!)) : undefined;\n },\n scrollToIndex(\n index: number,\n { align = \"auto\" }: { readonly align?: VirtualAlign | undefined } = {},\n ): void {\n move(virtual.getOffsetForIndex(index, align));\n },\n scrollToKey(key: RowKey, align?: { readonly align?: VirtualAlign | undefined }): void {\n const index = items.findIndex((item) => keyOf(item) === key);\n if (index >= 0) binding.scrollToIndex(index, align);\n },\n measureElement(target: Element | ComponentPublicInstance | null, key: RowKey): void {\n if (disposed) return;\n const previous = elements.get(key);\n if (previous === target) return;\n if (previous) {\n observer?.unobserve(previous);\n keysByElement.delete(previous);\n elements.delete(key);\n }\n if (!target || !(\"getBoundingClientRect\" in target)) return;\n elements.set(key, target);\n keysByElement.set(target, key);\n if (mounted) {\n observer?.observe(target);\n // A ref can run midway through a keyed row/spacer patch. Reading layout there can\n // clamp a pending scroll against a temporarily shortened content area.\n void nextTick(() => {\n if (!disposed && elements.get(key) === target) measure(target, key);\n });\n }\n },\n } as Record<string, unknown> &\n Pick<VirtualBinding<TItem>, \"getItem\" | \"scrollToIndex\" | \"scrollToKey\" | \"measureElement\">;\n for (const key of Object.keys(view.value))\n Object.defineProperty(binding, key, {\n enumerable: true,\n get: () =>\n key === \"items\"\n ? projected.value\n : key === \"issues\" && (initialIssue || marginIssue.value)\n ? Object.freeze([\n ...view.value.issues,\n ...(initialIssue ? [initialIssue] : []),\n ...(marginIssue.value ? [marginIssue.value] : []),\n ])\n : view.value[key as keyof VirtualWindow],\n });\n return Object.freeze(binding) as unknown as VirtualBinding<TItem>;\n}\n\n/** Virtualize data and detail render items. scrollToKey accepts the parent data-row key. */\nexport function useVirtualRows<TRow>(\n table: DataTableBinding<TRow>,\n options: UseVirtualRowsOptions<TRow>,\n): VirtualBinding<VirtualRowItem<TRow>> {\n const virtual = useVirtualAxis(\n () => table.renderItems,\n (item) => item.key,\n options.estimateRowHeight ?? 40,\n options,\n false,\n (item, renderItem) => ({ ...item, renderItem }),\n );\n const stopFocus = watch(\n () => options.grid?.selection?.focus.row,\n (row) => {\n if (row === undefined) return;\n const direct = table.renderItems[row];\n const index =\n direct?.kind === \"row\" && direct.rowIndex === row\n ? row\n : table.renderItems.findIndex((item) => item.kind === \"row\" && item.rowIndex === row);\n if (index >= 0) virtual.scrollToIndex(index);\n },\n { flush: \"sync\" },\n );\n if (getCurrentScope()) onScopeDispose(stopFocus);\n const binding = Object.defineProperties(\n {},\n {\n ...Object.getOwnPropertyDescriptors(virtual),\n scrollToKey: {\n enumerable: true,\n value: (key: RowKey, align?: { readonly align?: VirtualAlign | undefined }): void =>\n virtual.scrollToKey(getRowItemKey(key), align),\n },\n },\n );\n return Object.freeze(binding) as VirtualBinding<VirtualRowItem<TRow>>;\n}\n\n/** Virtualize visible columns and bring the active logical column into view. */\nexport function useVirtualColumns<TRow>(\n grid: DataGridBinding<TRow>,\n options: UseVirtualColumnsOptions,\n): VirtualBinding<VirtualColumnItem<TRow>> {\n const virtual = useVirtualAxis(\n () => grid.table.columns,\n (column) => column.id,\n options.estimateColumnWidth ?? 120,\n options,\n true,\n (item, column) => ({ ...item, column }),\n (column) => column.width,\n );\n const stopFocus = watch(\n () => grid.selection?.focus.column,\n (column) => {\n if (column !== undefined) virtual.scrollToIndex(column);\n },\n { flush: \"sync\" },\n );\n if (getCurrentScope()) onScopeDispose(stopFocus);\n return virtual;\n}\n","import type {\n DataTable,\n StreamOptions,\n TableIssue,\n TableSnapshot,\n TableState,\n} from \"@vueye-table/core\";\nimport {\n getCurrentInstance,\n onMounted,\n shallowRef,\n unref,\n watch,\n watchEffect,\n type MaybeRef,\n type WatchStopHandle,\n} from \"vue\";\n\nexport interface SourceContext {\n readonly signal: AbortSignal;\n}\nexport type TableSource<TRow> =\n | AsyncIterable<TRow | readonly TRow[]>\n | ((context: SourceContext) => AsyncIterable<TRow | readonly TRow[]>);\nexport interface LoadMoreContext extends SourceContext {\n /** Undefined on the first page. Validate or narrow the opaque cursor in your loader. */\n readonly cursor: unknown;\n readonly state: TableState;\n}\nexport interface LoadMoreResult<TRow> {\n readonly rows: readonly TRow[];\n readonly cursor?: unknown;\n readonly done: boolean;\n}\nexport type LoadMore<TRow> = (context: LoadMoreContext) => Promise<LoadMoreResult<TRow>>;\n/** Schedule once per rendering frame and return its cancellation function. */\nexport type FrameScheduler = (publish: () => void) => () => void;\nexport interface SourceOptions<TRow> {\n readonly source?: MaybeRef<TableSource<TRow> | undefined> | undefined;\n readonly loadMore?: MaybeRef<LoadMore<TRow> | undefined> | undefined;\n readonly streamOptions?: Omit<StreamOptions, \"signal\"> | undefined;\n /** Non-component scopes use a 16ms timer by default. */\n readonly scheduleFrame?: FrameScheduler | undefined;\n /** Remaining flattened items at which a virtual renderer requests the next cursor page. */\n readonly endThreshold?: number | undefined;\n}\n\nexport interface SourceBinding {\n readonly endThreshold: number;\n readonly loadingMode: \"source\" | \"cursor\" | undefined;\n readonly canLoadMore: boolean;\n readonly loadError: TableIssue | undefined;\n loadNext(this: void): Promise<void>;\n retry(this: void): void;\n}\n\n/** Internal owner of one cancellable source, using the engine's ingestion/conflict boundary. */\nexport function createSource<TRow>(\n table: DataTable<TRow>,\n options: SourceOptions<TRow>,\n seed: () => readonly TRow[],\n publish: (next: TableSnapshot<TRow>) => void,\n): SourceBinding & {\n update(this: void, next: TableSnapshot<TRow>): void;\n dispose(this: void): void;\n initial(this: void): TableSnapshot<TRow>;\n} {\n const instance = getCurrentInstance();\n const requestedThreshold = options.endThreshold ?? 5;\n const endThreshold =\n Number.isSafeInteger(requestedThreshold) && requestedThreshold >= 0 ? requestedThreshold : 5;\n const optionIssues: readonly TableIssue[] =\n requestedThreshold === endThreshold\n ? []\n : [\n Object.freeze({\n code: \"invalid_stream_option\",\n message: \"endThreshold must be a non-negative safe integer; 5 is used.\",\n }),\n ];\n const mode = shallowRef<\"source\" | \"cursor\" | undefined>(undefined);\n const more = shallowRef(false);\n const retryVersion = shallowRef(0);\n const query = shallowRef(table.getState());\n let cursor: unknown;\n let controller: AbortController | undefined;\n let task: Promise<void> | undefined;\n let cancelFrame: (() => void) | undefined;\n let pending: TableSnapshot<TRow> | undefined;\n let active = false;\n let disposed = false;\n let mounted = !instance;\n let first = true;\n let cursorFailed = false;\n let generation = 0;\n let stops: WatchStopHandle[] = [];\n const initialMode = (): \"source\" | \"cursor\" | undefined =>\n unref(options.source) ? \"source\" : unref(options.loadMore) ? \"cursor\" : undefined;\n const schedule: FrameScheduler =\n options.scheduleFrame ??\n ((flush) => {\n // Component sources start after mount, so the owning element supplies its frame scheduler.\n const view = (instance?.proxy?.$el as Element | undefined)?.ownerDocument?.defaultView;\n if (view) {\n const id = view.requestAnimationFrame(flush);\n return () => view.cancelAnimationFrame(id);\n }\n const id = setTimeout(flush, 16);\n return () => clearTimeout(id);\n });\n const project = (next: TableSnapshot<TRow>): TableSnapshot<TRow> => {\n const loadState =\n !mounted && initialMode()\n ? \"loading\"\n : mode.value === \"cursor\" && more.value && next.loadState === \"done\"\n ? \"idle\"\n : next.loadState;\n return loadState === next.loadState && optionIssues.length === 0\n ? next\n : Object.freeze({\n ...next,\n loadState,\n issues: Object.freeze([...next.issues, ...optionIssues]),\n });\n };\n const flush = (): void => {\n cancelFrame = undefined;\n if (pending && !disposed) {\n active = pending.loadState === \"loading\" || pending.loadState === \"streaming\";\n publish(project(pending));\n }\n pending = undefined;\n };\n const update = (next: TableSnapshot<TRow>): void => {\n const state = next.state;\n const previous = query.value;\n if (\n previous.sorting !== state.sorting ||\n previous.search !== state.search ||\n previous.filters !== state.filters\n ) {\n query.value = state;\n // A synchronous cursor reset can replace this notification's data while keeping its query.\n next = table.getSnapshot();\n }\n if (active) {\n pending = next;\n cancelFrame ??= schedule(flush);\n } else publish(project(next));\n };\n const stop = (): void => {\n controller?.abort();\n controller = undefined;\n task = undefined;\n active = false;\n cancelFrame?.();\n cancelFrame = undefined;\n pending = undefined;\n };\n const reset = (): void => {\n stop();\n cursor = undefined;\n cursorFailed = false;\n if (!first) table.setData(seed());\n first = false;\n };\n const loadNext = (): Promise<void> => {\n if (disposed || !mounted || mode.value !== \"cursor\" || !more.value || cursorFailed)\n return Promise.resolve();\n if (task) return task;\n const loader = unref(options.loadMore)!;\n const run = new AbortController();\n controller = run;\n active = true;\n const state = table.getState();\n const previousCursor = cursor;\n const source: AsyncIterable<readonly TRow[]> = {\n async *[Symbol.asyncIterator]() {\n const result = await loader({ cursor: previousCursor, state, signal: run.signal });\n if (run.signal.aborted) return;\n if (!Array.isArray(result.rows) || typeof result.done !== \"boolean\")\n throw new Error(\"loadMore must return rows and a boolean done flag.\");\n // Refuse an endless empty-page loop while keeping its retryable error visible.\n if (!result.done && result.rows.length === 0 && Object.is(result.cursor, previousCursor))\n throw new Error(\n \"loadMore returned no rows or cursor progress. Retry after correcting the response.\",\n );\n cursor = result.cursor;\n more.value = !result.done;\n yield result.rows;\n },\n };\n task = table.stream(source, { ...options.streamOptions, signal: run.signal }).then((result) => {\n if (controller !== run || disposed) return undefined;\n cursorFailed = result.status === \"error\";\n task = undefined;\n // Keep the final metadata coalesced with the last data batch.\n if (!cancelFrame) active = false;\n return undefined;\n });\n return task;\n };\n const start = (): void => {\n if (disposed) return;\n mounted = true;\n stops = [\n watchEffect((cleanup) => {\n void retryVersion.value;\n const source = unref(options.source);\n const loader = unref(options.loadMore);\n const run = new AbortController();\n const ticket = ++generation;\n cleanup(() => run.abort());\n let iterable: AsyncIterable<TRow | readonly TRow[]> | undefined;\n if (source) {\n // Invoke the factory inside this effect to track its reactive dependencies.\n try {\n iterable = typeof source === \"function\" ? source({ signal: run.signal }) : source;\n } catch (error) {\n iterable = {\n [Symbol.asyncIterator]: () => ({ next: () => Promise.reject(error) }),\n };\n }\n if (loader)\n iterable = {\n [Symbol.asyncIterator]: () => ({\n next: () =>\n Promise.reject(\n new Error(\"Choose source or loadMore, rather than combining them.\"),\n ),\n }),\n };\n }\n // Effects track only source construction. Loading and seed reads must not subscribe the\n // source to its own progress, selection, or emitted data round trips.\n queueMicrotask(() => {\n if (disposed || run.signal.aborted || ticket !== generation) return;\n reset();\n mode.value = source ? \"source\" : loader ? \"cursor\" : undefined;\n more.value = !!loader && !source;\n if (iterable) {\n controller = run;\n active = true;\n void table\n .stream(iterable, { ...options.streamOptions, signal: run.signal })\n .then(() => {\n if (controller === run && !cancelFrame) active = false;\n return undefined;\n });\n } else if (loader) void loadNext();\n else update(table.getSnapshot());\n });\n }),\n watch(\n query,\n () => {\n if (mode.value !== \"cursor\") return;\n reset();\n more.value = true;\n void loadNext();\n },\n { flush: \"sync\" },\n ),\n ];\n };\n if (instance) onMounted(start);\n // The first snapshot must exist before a synchronous non-component source starts.\n else queueMicrotask(start);\n return {\n endThreshold,\n get loadingMode() {\n return mode.value ?? (!mounted ? initialMode() : undefined);\n },\n get canLoadMore() {\n return more.value && !cursorFailed && !task;\n },\n get loadError() {\n const next = table.getSnapshot();\n return next.loadState === \"error\"\n ? next.issues.find((item) => item.code === \"stream_error\")\n : undefined;\n },\n loadNext,\n retry() {\n if (disposed) return;\n if (mode.value === \"cursor\" && cursorFailed) {\n cursorFailed = false;\n void loadNext();\n } else retryVersion.value++;\n },\n update,\n initial: () => project(table.getSnapshot()),\n dispose() {\n disposed = true;\n stop();\n for (const disposeWatch of stops) disposeWatch();\n stops = [];\n },\n };\n}\n","import {\n createTable,\n type ColumnDef,\n type DataTable,\n type TableOptions,\n type TableSnapshot,\n type TableStatePatch,\n type TreeLoadSignal,\n type TreeLoadController,\n type ExpandedState,\n type PendingChanges,\n type RowKey,\n type TreeFilter,\n} from \"@vueye-table/core\";\nimport {\n getCurrentScope,\n onScopeDispose,\n shallowRef,\n toRaw,\n toValue,\n unref,\n watch,\n type MaybeRefOrGetter,\n} from \"vue\";\n\nimport { createRowDraft, type RowDraft } from \"./row-draft\";\nimport { createSource, type SourceOptions, type SourceBinding } from \"./source\";\n\n/** Options accepted by {@link useDataTable}. Data, columns, and state may be refs or getters. */\nexport interface UseDataTableOptions<TRow, TSignal extends TreeLoadSignal = AbortSignal>\n extends\n Omit<TableOptions<TRow, TSignal>, \"data\" | \"columns\" | \"rowCount\" | \"treeFilter\">,\n SourceOptions<TRow> {\n /** Initial rows for a source, or the caller-owned array for an ordinary table. */\n readonly data?: MaybeRefOrGetter<readonly TRow[]> | undefined;\n readonly columns: MaybeRefOrGetter<readonly ColumnDef<TRow>[]>;\n readonly rowCount?: MaybeRefOrGetter<number | undefined> | undefined;\n /** Search context can change without discarding lazy branches, edits or selection. */\n readonly treeFilter?: MaybeRefOrGetter<TreeFilter | undefined> | undefined;\n /**\n * State owned by the caller, for example `v-model` props or URL query values. Whenever it\n * changes it is applied with `setState`; the table's own changes still reach `onStateChange`.\n */\n readonly state?: MaybeRefOrGetter<TableStatePatch | undefined> | undefined;\n}\n\ntype TableOperations<TRow> = Omit<DataTable<TRow>, \"getSnapshot\" | \"getState\" | \"subscribe\">;\n\n/**\n * A reactive view of a table: every snapshot field is a plain reactive property, so templates read\n * `table.rows` and `table.pageCount` directly, and every change goes through a named operation.\n * Watching a field needs a getter: `watch(() => table.page, ...)`.\n */\nexport type DataTableBinding<TRow> = TableSnapshot<TRow> &\n SourceBinding &\n TableOperations<TRow> & {\n /** The engine behind the binding. */\n readonly table: DataTable<TRow>;\n /** The current snapshot, replaced on every change. */\n readonly snapshot: TableSnapshot<TRow>;\n readonly expanded: ExpandedState;\n readonly pendingChanges: PendingChanges<TRow>;\n editRow(key: RowKey): RowDraft<TRow>;\n };\n\n/**\n * A binding for any row type, for components that accept every table. Row types make the binding\n * invariant, so `DataTableBinding<unknown>` would refuse `DataTableBinding<Person>`.\n */\nexport type AnyDataTableBinding = DataTableBinding<any>;\n\nconst OPERATIONS = [\n \"appendData\",\n \"upsertData\",\n \"removeData\",\n \"stream\",\n \"insertRows\",\n \"removeRows\",\n \"getPendingChanges\",\n \"markSaved\",\n \"revert\",\n \"setState\",\n \"setData\",\n \"setColumns\",\n \"setTreeFilter\",\n \"setRowCount\",\n \"toggleSort\",\n \"sort\",\n \"clearSorting\",\n \"search\",\n \"filter\",\n \"clearFilters\",\n \"goToPage\",\n \"nextPage\",\n \"previousPage\",\n \"setPageSize\",\n \"select\",\n \"deselect\",\n \"toggleRow\",\n \"toggleAll\",\n \"clearSelection\",\n \"getSelectedRows\",\n \"toggleExpanded\",\n \"expandAll\",\n \"collapseAll\",\n \"toggleColumn\",\n \"moveColumn\",\n \"pinColumn\",\n \"resizeColumn\",\n \"resetColumnSize\",\n \"edit\",\n \"undo\",\n \"redo\",\n \"copy\",\n \"paste\",\n \"clear\",\n \"exportRows\",\n \"reset\",\n \"destroy\",\n] as const satisfies readonly (keyof TableOperations<unknown>)[];\n\nfunction definedEntries(patch: TableStatePatch | undefined): TableStatePatch {\n return Object.fromEntries(Object.entries(patch ?? {}).filter(([, value]) => value !== undefined));\n}\n\n/**\n * Create a table bound to the current effect scope. The table follows its reactive data,\n * columns, row count, and state, and stops listening when the scope ends.\n */\nexport function useDataTable<TRow>(options: UseDataTableOptions<TRow>): DataTableBinding<TRow>;\nexport function useDataTable<TRow, TSignal extends TreeLoadSignal = AbortSignal>(\n options: UseDataTableOptions<TRow, TSignal> &\n (AbortSignal extends TSignal\n ? unknown\n : { readonly createChildLoadController: () => TreeLoadController<TSignal> }),\n): DataTableBinding<TRow>;\nexport function useDataTable<TRow, TSignal extends TreeLoadSignal = AbortSignal>(\n options: UseDataTableOptions<TRow, TSignal>,\n): DataTableBinding<TRow> {\n const empty: readonly TRow[] = Object.freeze([]);\n const seed = (): readonly TRow[] => toRaw(toValue(options.data) ?? empty);\n const table = createTable<TRow, TSignal>({\n ...options,\n manual: options.manual ?? !!unref(options.loadMore),\n data: seed(),\n columns: toValue(options.columns),\n rowCount: toValue(options.rowCount),\n treeFilter: toValue(options.treeFilter),\n initialState: { ...options.initialState, ...definedEntries(toValue(options.state)) },\n // Public overloads require custom signals to provide their matching factory.\n createChildLoadController:\n options.createChildLoadController ??\n ((() => new AbortController()) as unknown as () => TreeLoadController<TSignal>),\n });\n const drafts = new Set<() => void>();\n let disposed = false;\n const snapshot = shallowRef(table.getSnapshot());\n const source = createSource(table, options, seed, (next) => {\n snapshot.value = next;\n });\n snapshot.value = source.initial();\n const unsubscribe = table.subscribe(source.update);\n\n const stops = [\n watch(\n () => toValue(options.treeFilter),\n (mode) => table.setTreeFilter(mode),\n ),\n watch(\n () => toValue(options.data),\n // Reactive arrays arrive as proxies; the engine works on, and compares, the raw array.\n (data) => table.setData(toRaw(data ?? empty)),\n ),\n watch(\n () => toValue(options.columns),\n (columns) => table.setColumns(columns),\n ),\n watch(\n () => toValue(options.rowCount),\n (rowCount) => {\n if (rowCount !== undefined) {\n table.setRowCount(rowCount);\n }\n },\n ),\n watch(\n () => toValue(options.state),\n (state) => {\n if (state) {\n table.setState(state);\n }\n },\n { deep: true },\n ),\n ];\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n source.dispose();\n for (const disposeDraft of drafts) disposeDraft();\n drafts.clear();\n for (const stop of stops) {\n stop();\n }\n unsubscribe();\n table.destroy();\n };\n if (getCurrentScope()) onScopeDispose(dispose);\n\n const binding = { table } as Record<string, unknown>;\n for (const key of [\"endThreshold\", \"loadingMode\", \"canLoadMore\", \"loadError\"] as const) {\n Object.defineProperty(binding, key, {\n enumerable: true,\n get: () => {\n void snapshot.value;\n return source[key];\n },\n });\n }\n binding[\"retry\"] = source.retry;\n binding[\"loadNext\"] = source.loadNext;\n Object.defineProperty(binding, \"snapshot\", { enumerable: true, get: () => snapshot.value });\n Object.defineProperty(binding, \"expanded\", {\n enumerable: true,\n get: () => snapshot.value.state.expanded,\n });\n Object.defineProperty(binding, \"pendingChanges\", {\n enumerable: true,\n get: () => {\n void snapshot.value;\n return table.getPendingChanges();\n },\n });\n binding[\"editRow\"] = (key: RowKey): RowDraft<TRow> =>\n createRowDraft(table, key, (disposeDraft) => {\n if (disposed) disposeDraft();\n else drafts.add(disposeDraft);\n return () => {\n drafts.delete(disposeDraft);\n };\n });\n for (const key of Object.keys(snapshot.value)) {\n Object.defineProperty(binding, key, {\n enumerable: true,\n get: () => snapshot.value[key as keyof TableSnapshot<TRow>],\n });\n }\n for (const name of OPERATIONS) {\n binding[name] = table[name];\n }\n binding[\"destroy\"] = dispose;\n return Object.freeze(binding) as unknown as DataTableBinding<TRow>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/injection.ts","../src/row-draft.ts","../src/use-data-grid.ts","../src/use-virtual.ts","../src/source.ts","../src/use-data-table.ts"],"sourcesContent":["import {\n defaultTableMessages,\n formatCount,\n resolveTableMessages,\n type Count,\n type TableMessages,\n} from \"@vueye-table/core\";\nimport { inject, provide, type InjectionKey } from \"vue\";\n\nimport type { DataGridBinding } from \"./use-data-grid\";\nimport type { DataTableBinding } from \"./use-data-table\";\n\nconst tableKey: InjectionKey<DataTableBinding<unknown>> = Symbol(\"vueye-table\");\nconst gridKey: InjectionKey<DataGridBinding<unknown>> = Symbol(\"vueye-table-grid\");\n\n/** Make a table available to every component below the current one. */\nexport function provideDataTable<TRow>(table: DataTableBinding<TRow>): void {\n provide(tableKey, table as DataTableBinding<unknown>);\n}\n\n/**\n * Read the table provided by an ancestor. Throws when there is none, naming the component that\n * provides one, rather than rendering an empty table.\n */\nexport function injectDataTable<TRow = unknown>(\n consumer = \"This component\",\n): DataTableBinding<TRow> {\n const table = inject(tableKey, undefined);\n if (!table) {\n throw new Error(\n `${consumer} needs a table. Render it inside <DataTableRoot :table=\"table\">, or call provideDataTable(useDataTable(...)) in an ancestor.`,\n );\n }\n return table as DataTableBinding<TRow>;\n}\n\nexport function provideDataGrid<TRow>(grid: DataGridBinding<TRow>): void {\n provide(gridKey, grid as DataGridBinding<unknown>);\n}\n\n/** Read the grid provided by an ancestor, or `undefined` outside a grid. */\nexport function injectDataGrid<TRow = unknown>(): DataGridBinding<TRow> | undefined {\n return inject(gridKey, undefined) as DataGridBinding<TRow> | undefined;\n}\n\n/** What a host says about language: the locale numbers and text follow, and its own words. */\nexport interface TableLocaleOptions {\n readonly locale?: string | undefined;\n readonly messages?: Partial<TableMessages> | undefined;\n}\n\n/** The language every component below a provider speaks. */\nexport interface TableLocale {\n readonly locale: string | undefined;\n readonly messages: TableMessages;\n /** A number written in the locale, with its value kept for plural choices. */\n readonly count: (value: number) => Count;\n}\n\n/**\n * A getter, so a component reads the current language each time it renders: a host that changes\n * its locale or words re-renders the table in them.\n */\nexport const tableLocaleKey: InjectionKey<() => TableLocaleOptions> = Symbol(\"vueye-table-locale\");\n\nconst defaultLocale: TableLocale = {\n locale: undefined,\n messages: defaultTableMessages,\n count: (value) => formatCount(value),\n};\n\n/**\n * Give every component below the current one a locale and words. An ancestor's options are kept\n * for whatever these leave out, so an application-wide language (`VueyeTablePlugin`) and a\n * table's own words combine. Returns the combined language, for the providing component itself.\n */\nexport function provideTableLocale(options: () => TableLocaleOptions): () => TableLocale {\n const parent = inject(tableLocaleKey, undefined);\n const merged = (): TableLocaleOptions => {\n const own = options();\n const inherited = parent?.() ?? {};\n return {\n locale: own.locale ?? inherited.locale,\n messages: { ...inherited.messages, ...definedMessages(own.messages) },\n };\n };\n provide(tableLocaleKey, merged);\n return resolveLocale(merged);\n}\n\nfunction definedMessages(\n messages: Partial<TableMessages> | undefined,\n): Partial<TableMessages> | undefined {\n if (!messages) return undefined;\n const defined: Partial<TableMessages> = Object.fromEntries(\n Object.entries(messages).filter(([, value]) => value !== undefined),\n );\n return defined;\n}\n\n/**\n * The language provided by an ancestor, or English with the runtime's number format. Call it in\n * `setup` and read the result while rendering.\n */\nexport function useTableLocale(): () => TableLocale {\n const source = inject(tableLocaleKey, undefined);\n return source ? resolveLocale(source) : () => defaultLocale;\n}\n\n/** Resolve options to words and a number format, again only when they change. */\nfunction resolveLocale(source: () => TableLocaleOptions): () => TableLocale {\n let cached: { options: TableLocaleOptions; resolved: TableLocale } | undefined;\n return () => {\n const options = source();\n if (\n cached &&\n cached.options.locale === options.locale &&\n shallowEqual(cached.options.messages, options.messages)\n )\n return cached.resolved;\n const format = new Intl.NumberFormat(options.locale);\n const resolved: TableLocale = {\n locale: options.locale,\n messages: resolveTableMessages(options.messages),\n count: (value) => ({ value, text: format.format(value) }),\n };\n cached = { options, resolved };\n return resolved;\n };\n}\n\nfunction shallowEqual(\n left: Partial<TableMessages> | undefined,\n right: Partial<TableMessages> | undefined,\n): boolean {\n if (left === right) return true;\n if (!left || !right) return false;\n const keys = Object.keys(left) as (keyof TableMessages)[];\n return keys.length === Object.keys(right).length && keys.every((key) => left[key] === right[key]);\n}\n","import type {\n CellEdit,\n DataTable,\n DeepKeys,\n EditResult,\n PathValue,\n RowKey,\n TableIssue,\n} from \"@vueye-table/core\";\nimport { shallowReactive, shallowRef, toRaw } from \"vue\";\n\n/** A column-value bag. Only configured columns are present; dotted paths stay dotted keys. */\nexport type RowDraftValues<TRow> = {\n -readonly [P in DeepKeys<TRow>]?: PathValue<TRow, P>;\n};\n\nexport interface RowDraft<TRow> {\n readonly rowKey: RowKey;\n readonly values: RowDraftValues<TRow>;\n readonly issues: readonly TableIssue[];\n readonly status: \"editing\" | \"saving\" | \"saved\" | \"cancelled\" | \"stale\";\n readonly pending: boolean;\n /** Supply raw text for the column parser, including numeric/date input. */\n setInput(column: string, input: string): void;\n /** Set a computed column whose id is not a path in the row type. */\n setValue(column: string, value: unknown): void;\n save(): Promise<EditResult<TRow>>;\n /** Discard an unsubmitted draft. A submitted validation batch is owned by the engine. */\n cancel(): boolean;\n}\n\nexport function rejectedDraft<TRow>(rowKey: RowKey, message: string): EditResult<TRow> {\n return refused([Object.freeze({ code: \"stale_draft\", rowKey, message })]);\n}\n\nfunction refused<TRow>(issues: readonly TableIssue[]): EditResult<TRow> {\n return Object.freeze({\n status: \"rejected\",\n changes: Object.freeze([]),\n rowChanges: Object.freeze([]),\n pendingCells: Object.freeze([]),\n issues: Object.freeze([...issues]),\n });\n}\n\n// Compare owned structured values without making nested values reactive. Cycles are allowed.\nfunction equal(left: unknown, right: unknown, seen = new WeakMap<object, object>()): boolean {\n if (Object.is(left, right)) return true;\n if (!left || !right || typeof left !== \"object\" || typeof right !== \"object\") return false;\n if (left instanceof Date || right instanceof Date)\n return (\n left instanceof Date && right instanceof Date && Object.is(left.getTime(), right.getTime())\n );\n if (Array.isArray(left) && Array.isArray(right) && left.length !== right.length) return false;\n if (Object.getPrototypeOf(left) !== Object.getPrototypeOf(right)) return false;\n if (seen.has(left)) return seen.get(left) === right;\n seen.set(left, right);\n if (left instanceof Map && right instanceof Map) return equal([...left], [...right], seen);\n if (left instanceof Set && right instanceof Set) return equal([...left], [...right], seen);\n if (left instanceof RegExp && right instanceof RegExp)\n return left.source === right.source && left.flags === right.flags;\n if (left instanceof ArrayBuffer && right instanceof ArrayBuffer)\n return equal([...new Uint8Array(left)], [...new Uint8Array(right)], seen);\n if (ArrayBuffer.isView(left) && ArrayBuffer.isView(right))\n return equal(\n [...new Uint8Array(left.buffer, left.byteOffset, left.byteLength)],\n [...new Uint8Array(right.buffer, right.byteOffset, right.byteLength)],\n seen,\n );\n const keys = Object.keys(left);\n return (\n keys.length === Object.keys(right).length &&\n keys.every(\n (key) =>\n Object.hasOwn(right, key) && equal(Reflect.get(left, key), Reflect.get(right, key), seen),\n )\n );\n}\n\n/** Internal factory; disposal is shared with the binding's single engine subscription. */\nexport function createRowDraft<TRow>(\n table: DataTable<TRow>,\n key: RowKey,\n register: (dispose: () => void) => () => void,\n): RowDraft<TRow> {\n const snapshot = table.getSnapshot();\n const original = snapshot.getRow(key)?.original;\n const columns = snapshot.allColumns;\n const values = shallowReactive<Record<string, unknown>>(Object.create(null));\n const initial = new Map<string, unknown>();\n const inputs = new Map<string, string>();\n const copyIssues = new Map<string, TableIssue>();\n const issues = shallowRef<readonly TableIssue[]>([]);\n const status = shallowRef<RowDraft<TRow>[\"status\"]>(\"editing\");\n for (const column of columns) {\n if (original === undefined) break;\n try {\n if (!column.isEditable(original)) continue;\n const value = column.getValue(original);\n initial.set(column.id, value);\n values[column.id] = structuredClone(toRaw(value));\n } catch {\n copyIssues.set(\n column.id,\n Object.freeze({\n code: \"invalid_value\",\n rowKey: key,\n column: column.id,\n message:\n \"This value cannot be copied into a row draft. Replace it explicitly before saving.\",\n }),\n );\n issues.value = [...copyIssues.values()];\n }\n }\n let saving: Promise<EditResult<TRow>> | undefined;\n let disposePending: ((result: EditResult<TRow>) => void) | undefined;\n let disposed = false;\n const stale = (): EditResult<TRow> =>\n rejectedDraft(key, \"This draft is closed, or its row or columns changed. Open a new draft.\");\n const unregister = register(() => {\n disposed = true;\n const result = stale();\n status.value = \"stale\";\n issues.value = result.issues;\n disposePending?.(result);\n });\n const draft: RowDraft<TRow> = {\n rowKey: key,\n values,\n get issues() {\n return issues.value;\n },\n get status() {\n return status.value;\n },\n get pending() {\n return status.value === \"saving\";\n },\n setInput(column, input) {\n if (status.value === \"editing\") inputs.set(column, input);\n },\n setValue(column, value) {\n if (status.value === \"editing\") {\n values[column] = value;\n inputs.delete(column);\n }\n },\n save() {\n if (saving) return saving;\n if (\n status.value !== \"editing\" ||\n disposed ||\n original === undefined ||\n table.getSnapshot().getRow(key)?.original !== original ||\n columns.some(\n (column) => table.getSnapshot().getColumn(column.id)?.definition !== column.definition,\n )\n ) {\n const result = stale();\n issues.value = result.issues;\n status.value = \"stale\";\n unregister();\n return Promise.resolve(result);\n }\n const edits: CellEdit[] = [];\n const uncopied = [...copyIssues.values()].filter(\n (problem) => !Object.hasOwn(values, problem.column!) && !inputs.has(problem.column!),\n );\n if (uncopied.length) {\n issues.value = Object.freeze(uncopied);\n return Promise.resolve(refused(issues.value));\n }\n for (const column of new Set([...Object.keys(values), ...inputs.keys()])) {\n try {\n const value = toRaw(values[column]);\n if (inputs.has(column)) edits.push({ rowKey: key, column, input: inputs.get(column)! });\n else if (!initial.has(column) || !equal(value, initial.get(column))) {\n edits.push(\n typeof value === \"string\"\n ? { rowKey: key, column, input: value }\n : {\n rowKey: key,\n column,\n value:\n value !== null && typeof value === \"object\" ? structuredClone(value) : value,\n },\n );\n }\n } catch {\n issues.value = Object.freeze([\n Object.freeze({\n code: \"invalid_value\",\n rowKey: key,\n column,\n message:\n \"This draft value cannot be copied for submission. Replace it before saving.\",\n }),\n ]);\n return Promise.resolve(refused(issues.value));\n }\n }\n status.value = \"saving\";\n const result = table.edit(edits, { expectedRows: new Map([[key, original]]) });\n if (disposed) return Promise.resolve(stale());\n const cancelled = new Promise<EditResult<TRow>>((resolve) => {\n disposePending = resolve;\n });\n saving = Promise.race([result.completion ?? Promise.resolve(result), cancelled]).then(\n (final) => {\n issues.value = final.issues;\n // Partial results close the draft too: accepted fields have already changed the row.\n status.value =\n disposed || final.issues.some((problem) => problem.code === \"stale_draft\")\n ? \"stale\"\n : final.status === \"rejected\"\n ? \"editing\"\n : \"saved\";\n if (status.value !== \"editing\") unregister();\n saving = undefined;\n disposePending = undefined;\n return final;\n },\n );\n return saving;\n },\n cancel() {\n if (status.value !== \"editing\") return false;\n status.value = \"cancelled\";\n unregister();\n return true;\n },\n };\n return Object.freeze(draft);\n}\n","import {\n clampPosition,\n formatValue,\n gridCommand,\n moveSelection,\n rangeContains,\n selectCell,\n selectionRange,\n typeOf,\n type CellPosition,\n type CellRange,\n type CopyOptions,\n type EditResult,\n type GridBounds,\n type GridDirection,\n type GridKey,\n type GridSelection,\n type MoveOptions,\n type TableColumn,\n type TableRow,\n type EditorSpec,\n type RowKey,\n type CellEdit,\n} from \"@vueye-table/core\";\nimport { computed, shallowRef, watch, type ComputedRef } from \"vue\";\n\nimport { rejectedDraft } from \"./row-draft\";\nimport type { DataTableBinding, DataTableLayout } from \"./use-data-table\";\n\n/** The cell being edited and the text typed so far. */\nexport interface GridEditor {\n readonly position: CellPosition;\n readonly draft: string;\n}\n\n/**\n * Spreadsheet interaction over a table: a selected range, keyboard navigation, in-cell editing,\n * copy, paste, and clearing. Positions refer to the current page and the visible columns.\n */\nexport interface DataGridBinding<TRow> extends DataTableLayout<TRow> {\n readonly table: DataTableBinding<TRow>;\n readonly selection: GridSelection | undefined;\n readonly range: CellRange | undefined;\n readonly editor: GridEditor | undefined;\n readonly bounds: ComputedRef<GridBounds>;\n /** The latest edit outcome, to show a rejected value. */\n readonly lastResult: EditResult<TRow> | undefined;\n /** Serializable editor metadata for an editable cell; no component resolution. */\n editorFor(position: CellPosition): EditorSpec | undefined;\n cellAt(position: CellPosition): { row: TableRow<TRow>; column: TableColumn<TRow> } | undefined;\n isFocused(position: CellPosition): boolean;\n isSelected(position: CellPosition): boolean;\n isEditing(position: CellPosition): boolean;\n focusCell(position: CellPosition, options?: { readonly extend?: boolean | undefined }): void;\n move(direction: GridDirection, options?: MoveOptions): void;\n selectAll(): void;\n /** Start editing the focused cell, with its current text or with `initial`. */\n startEdit(initial?: string): boolean;\n updateDraft(draft: string): void;\n /** Write the draft through the table, then move the focus if asked. */\n commitEdit(then?: GridDirection): EditResult<TRow> | undefined;\n /** Submit through core validation; retain a refused/pending editor for correction. */\n submitEdit(\n edit?: { readonly input: string } | { readonly value: unknown },\n then?: GridDirection,\n ): EditResult<TRow> | undefined;\n toggleCheckbox(): boolean;\n cancelEdit(): void;\n /** The selected range as tab-separated text. */\n copy(options?: CopyOptions): string;\n /** Paste tab-separated text at the top-left of the selection. */\n paste(text: string): EditResult<TRow> | undefined;\n clear(): EditResult<TRow> | undefined;\n /** Handle a key press. Returns `true` when the grid used it, so the caller can prevent the default. */\n handleKey(event: GridKey): boolean;\n}\n\nexport interface DataGridOptions {\n /** Falls back to the first visible column if the configured column is hidden. */\n readonly treeColumn?: () => string | undefined;\n}\n\nexport function useDataGrid<TRow>(\n table: DataTableBinding<TRow>,\n gridOptions: DataGridOptions = {},\n): DataGridBinding<TRow> {\n const selection = shallowRef<GridSelection | undefined>();\n const editor = shallowRef<GridEditor | undefined>();\n const lastResult = shallowRef<EditResult<TRow> | undefined>();\n let editing:\n | { readonly key: RowKey; readonly column: TableColumn<TRow>; readonly original: TRow }\n | undefined;\n let resultToken: object | undefined;\n const invalidEditors = new WeakSet<object>();\n const editorSpecs = new WeakMap<object, EditorSpec>();\n let submitting: object | undefined;\n const record = (result: EditResult<TRow>): EditResult<TRow> => {\n const token = {};\n resultToken = token;\n lastResult.value = result;\n void result.completion?.then((final) => {\n if (resultToken === token) lastResult.value = final;\n return undefined;\n });\n return result;\n };\n const bounds = computed<GridBounds>(() => ({\n rows: table.gridRows.length,\n columns: table.columns.length,\n }));\n const range = computed(() => (selection.value ? selectionRange(selection.value) : undefined));\n\n const same = (left: CellPosition | undefined, right: CellPosition): boolean =>\n left !== undefined && left.row === right.row && left.column === right.column;\n\n // Searching, filtering, paging, or hiding a column can shrink the grid under the selection.\n // Keep the selection on cells that exist, and drop an edit whose cell is gone.\n watch(\n () => table.snapshot,\n (snapshot, previous) => {\n const next = bounds.value;\n const current = selection.value;\n if (current && (next.rows === 0 || next.columns === 0)) {\n selection.value = undefined;\n } else if (current) {\n const relocate = (position: CellPosition): CellPosition => {\n if (\n (snapshot.grouped ||\n previous.grouped ||\n snapshot.state.rowPinning !== previous.state.rowPinning) &&\n snapshot.page === previous.page\n ) {\n const key = previous.gridRows[position.row]?.key;\n const row =\n key === undefined\n ? -1\n : snapshot.gridRows.findIndex((candidate) => candidate.key === key);\n if (row >= 0) return clampPosition({ ...position, row }, next);\n }\n return clampPosition(position, next);\n };\n const anchor = relocate(current.anchor);\n const focus = relocate(current.focus);\n if (!same(current.anchor, anchor) || !same(current.focus, focus)) {\n selection.value = { anchor, focus };\n }\n }\n const active = editing;\n if (active && editor.value) {\n const row = table.gridRows.findIndex((candidate) => candidate.key === active.key);\n const column = table.columns.findIndex((candidate) => candidate.id === active.column.id);\n if (\n row < 0 ||\n column < 0 ||\n (!submitting && table.getRow(active.key)?.original !== active.original) ||\n table.getColumn(active.column.id)?.definition !== active.column.definition\n ) {\n editor.value = undefined;\n editing = undefined;\n record(\n rejectedDraft(\n active.key,\n \"The edited cell changed or left the visible grid. Start a new edit.\",\n ),\n );\n } else if (!same(editor.value.position, { row, column })) {\n editor.value = { ...editor.value, position: { row, column } };\n selection.value = selectCell({ row, column });\n }\n }\n },\n { flush: \"sync\" },\n );\n\n const cellAt: DataGridBinding<TRow>[\"cellAt\"] = (position) => {\n const row = table.gridRows[position.row];\n const column = table.columns[position.column];\n return row && column ? { row, column } : undefined;\n };\n\n const ensureSelection = (): GridSelection | undefined => {\n if (bounds.value.rows === 0 || bounds.value.columns === 0) {\n return undefined;\n }\n selection.value ??= selectCell({ row: 0, column: 0 });\n return selection.value;\n };\n\n const grid: DataGridBinding<TRow> = {\n table,\n get columnSizing() {\n return table.columnSizing;\n },\n get columnPinning() {\n return table.columnPinning;\n },\n get grouping() {\n return table.grouping;\n },\n get expandedGroups() {\n return table.expandedGroups;\n },\n get rowPinning() {\n return table.rowPinning;\n },\n get topRows() {\n return table.topRows;\n },\n get bottomRows() {\n return table.bottomRows;\n },\n get pinnedStartWidth() {\n return table.pinnedStartWidth;\n },\n get pinnedEndWidth() {\n return table.pinnedEndWidth;\n },\n resizeColumn: table.resizeColumn,\n resetColumnSize: table.resetColumnSize,\n pinColumn: table.pinColumn,\n pinRow: table.pinRow,\n groupBy: table.groupBy,\n setGrouping: table.setGrouping,\n toggleGroup: table.toggleGroup,\n expandAllGroups: table.expandAllGroups,\n collapseAllGroups: table.collapseAllGroups,\n get selection() {\n return selection.value;\n },\n get range() {\n return range.value;\n },\n get editor() {\n return editor.value;\n },\n get lastResult() {\n return lastResult.value;\n },\n bounds,\n cellAt,\n editorFor(position) {\n const cell = cellAt(position);\n if (!cell || !cell.column.isEditable(cell.row.original)) return undefined;\n const spec = cell.column.definition.editor;\n const cached = editorSpecs.get(cell.column.definition);\n if (cached) return cached;\n if (\n spec &&\n [\"text\", \"number\", \"select\", \"checkbox\", \"date\"].includes(spec.kind) &&\n (spec.options === undefined ||\n (Array.isArray(spec.options) &&\n spec.options.every(\n (value) => value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value),\n )))\n ) {\n const resolved = Object.freeze({\n kind: spec.kind,\n ...(spec.options ? { options: Object.freeze([...spec.options]) } : {}),\n ...(spec.min !== undefined ? { min: spec.min } : {}),\n ...(spec.max !== undefined ? { max: spec.max } : {}),\n ...(spec.maxLength !== undefined ? { maxLength: spec.maxLength } : {}),\n ...(spec.pattern !== undefined ? { pattern: spec.pattern } : {}),\n });\n editorSpecs.set(cell.column.definition, resolved);\n return resolved;\n }\n if (spec) {\n if (!invalidEditors.has(cell.column.definition)) {\n invalidEditors.add(cell.column.definition);\n record(\n Object.freeze({\n status: \"rejected\",\n changes: Object.freeze([]),\n rowChanges: Object.freeze([]),\n pendingCells: Object.freeze([]),\n issues: Object.freeze([\n Object.freeze({\n code: \"invalid_value\",\n rowKey: cell.row.key,\n column: cell.column.id,\n message: \"Invalid editor metadata; text metadata is used.\",\n }),\n ]),\n }),\n );\n }\n return Object.freeze({ kind: \"text\" });\n }\n const type =\n cell.column.definition.type ?? typeOf(cell.row.getValue(cell.column.id)) ?? \"text\";\n return Object.freeze({ kind: type === \"boolean\" ? \"checkbox\" : type });\n },\n isFocused: (position) => same(selection.value?.focus, position),\n isSelected: (position) => (range.value ? rangeContains(range.value, position) : false),\n isEditing: (position) => same(editor.value?.position, position),\n focusCell(position, { extend = false } = {}) {\n if (submitting) return;\n const target = clampPosition(position, bounds.value);\n if (editor.value && !same(editor.value.position, target)) {\n grid.commitEdit();\n }\n selection.value =\n extend && selection.value\n ? { anchor: selection.value.anchor, focus: target }\n : selectCell(target);\n },\n move(direction, options) {\n const current = ensureSelection();\n if (current) {\n selection.value = moveSelection(current, direction, bounds.value, options);\n }\n },\n selectAll() {\n if (bounds.value.rows > 0 && bounds.value.columns > 0) {\n selection.value = {\n anchor: { row: 0, column: 0 },\n focus: { row: bounds.value.rows - 1, column: bounds.value.columns - 1 },\n };\n }\n },\n startEdit(initial) {\n if (submitting) return false;\n const focus = ensureSelection()?.focus;\n const cell = focus ? cellAt(focus) : undefined;\n if (!focus || !cell || !cell.column.isEditable(cell.row.original)) {\n return false;\n }\n const value = cell.row.getValue(cell.column.id);\n const kind = grid.editorFor(focus)?.kind;\n const text =\n kind === \"date\" && value instanceof Date\n ? Number.isFinite(value.getTime())\n ? value.toISOString().slice(0, 10)\n : \"\"\n : kind && kind !== \"text\"\n ? value === null || value === undefined\n ? \"\"\n : formatValue(value)\n : cell.row.getDisplay(cell.column.id);\n editor.value = { position: focus, draft: initial ?? text };\n editing = { key: cell.row.key, column: cell.column, original: cell.row.original };\n return true;\n },\n updateDraft(draft) {\n if (editor.value) {\n editor.value = { position: editor.value.position, draft };\n }\n },\n commitEdit(then) {\n const current = editor.value;\n if (!current) {\n return undefined;\n }\n const active = editing;\n editor.value = undefined;\n editing = undefined;\n if (!active) {\n return undefined;\n }\n const result = record(\n table.edit(\n {\n rowKey: active.key,\n column: active.column.id,\n input: current.draft,\n },\n { expectedRows: new Map([[active.key, active.original]]) },\n ),\n );\n if (then) {\n grid.move(then);\n }\n return result;\n },\n submitEdit(edit, then) {\n const current = editor.value;\n const active = editing;\n if (!current || !active || submitting) return undefined;\n const token = {};\n submitting = token;\n const cell: CellEdit = {\n rowKey: active.key,\n column: active.column.id,\n ...(edit ?? { input: current.draft }),\n };\n const result = record(\n table.edit(cell, { expectedRows: new Map([[active.key, active.original]]) }),\n );\n const settle = (final: EditResult<TRow>): void => {\n if (submitting !== token) return;\n submitting = undefined;\n if (editing !== active) return;\n if (\n final.status !== \"rejected\" ||\n final.issues.some((problem) => problem.code === \"stale_draft\")\n ) {\n editor.value = undefined;\n editing = undefined;\n if (then) grid.move(then);\n } else {\n editing = { ...active, original: table.getRow(active.key)?.original ?? active.original };\n }\n };\n if (result.completion) void result.completion.then(settle);\n else settle(result);\n return result;\n },\n cancelEdit() {\n editor.value = undefined;\n editing = undefined;\n submitting = undefined;\n },\n toggleCheckbox() {\n const focus = ensureSelection()?.focus;\n const cell = focus ? cellAt(focus) : undefined;\n if (!focus || !cell || grid.editorFor(focus)?.kind !== \"checkbox\") return false;\n record(\n table.edit(\n {\n rowKey: cell.row.key,\n column: cell.column.id,\n value: cell.row.getValue(cell.column.id) !== true,\n },\n { expectedRows: new Map([[cell.row.key, cell.row.original]]) },\n ),\n );\n return true;\n },\n copy(options) {\n return range.value ? table.copy(range.value, options) : \"\";\n },\n paste(text) {\n if (!range.value) {\n return undefined;\n }\n const result = record(table.paste({ row: range.value.top, column: range.value.left }, text));\n return result;\n },\n clear() {\n if (!range.value) {\n return undefined;\n }\n const result = record(table.clear(range.value));\n return result;\n },\n handleKey(event) {\n if (editor.value) {\n return false;\n }\n const current = selection.value?.focus ?? { row: 0, column: 0 };\n const row = table.gridRows[current.row];\n const treeColumn =\n table.columns.find((column) => column.id === gridOptions.treeColumn?.()) ??\n table.columns[0];\n const command = gridCommand(\n event,\n table.tree && row && table.columns[current.column] === treeColumn\n ? { canExpand: row.canExpand, expanded: row.isExpanded }\n : undefined,\n );\n switch (command?.type) {\n case \"tree\": {\n if (!row) return false;\n let key = row.key;\n if (command.action === \"expand\" || command.action === \"collapse\")\n table.toggleExpanded(key, command.action === \"expand\");\n else if (command.action === \"siblings\") {\n for (const sibling of [\n ...table.topRows,\n ...table.processedRows,\n ...table.bottomRows,\n ].filter((candidate) => candidate.parentKey === row.parentKey && candidate.canExpand))\n table.toggleExpanded(sibling.key, true);\n } else if (command.action === \"child\")\n key = table.gridRows.find((candidate) => candidate.parentKey === row.key)?.key ?? key;\n else key = row.parentKey ?? key;\n const index = table.gridRows.findIndex((candidate) => candidate.key === key);\n if (index >= 0) grid.focusCell({ row: index, column: current.column });\n return true;\n }\n case \"move\":\n grid.move(command.direction, command.options);\n return true;\n case \"edit\":\n return grid.startEdit(command.initial);\n case \"clear\":\n grid.clear();\n return true;\n case \"selectAll\":\n grid.selectAll();\n return true;\n case \"undo\":\n return table.undo();\n case \"redo\":\n return table.redo();\n case \"cancel\":\n if (selection.value) {\n selection.value = selectCell(selection.value.focus);\n }\n return true;\n default:\n return false;\n }\n },\n };\n return grid;\n}\n","import {\n createVirtualizer,\n clampColumnWidth,\n getRowItemKey,\n type RowKey,\n type TableColumn,\n type TableRenderItem,\n type VirtualAlign,\n type VirtualItem,\n type VirtualWindow,\n type TableIssue,\n} from \"@vueye-table/core\";\nimport {\n computed,\n getCurrentInstance,\n getCurrentScope,\n nextTick,\n onMounted,\n onScopeDispose,\n shallowRef,\n toValue,\n watch,\n type ComponentPublicInstance,\n type MaybeRefOrGetter,\n} from \"vue\";\n\nimport type { DataGridBinding } from \"./use-data-grid\";\nimport type { DataTableBinding } from \"./use-data-table\";\n\nexport interface VirtualViewportOptions {\n readonly scrollElement: MaybeRefOrGetter<HTMLElement | null | undefined>;\n readonly overscan?: number | undefined;\n /** Number of items rendered before mount, without overscan. Defaults to 10. */\n readonly initialCount?: number | undefined;\n /** Space before the items, such as a sticky header or leading row-number column. */\n readonly scrollMargin?: MaybeRefOrGetter<number> | undefined;\n}\nexport interface UseVirtualRowsOptions<TRow> extends VirtualViewportOptions {\n /** A custom presentation sequence, for example headers with aggregate footers. */\n readonly renderItems?: MaybeRefOrGetter<readonly TableRenderItem<TRow>[]> | undefined;\n /** Measured non-scrolling row regions. They reserve space around the virtual centre. */\n readonly pinnedRowHeights?:\n | MaybeRefOrGetter<{ readonly top: number; readonly bottom: number }>\n | undefined;\n readonly estimateRowHeight?: number | ((index: number) => number) | undefined;\n /** Connect logical grid focus to the rendered data row, skipping details. */\n readonly grid?: DataGridBinding<TRow> | undefined;\n}\nexport interface UseVirtualColumnsOptions extends VirtualViewportOptions {\n /** Fallback for columns without an effective width. Defaults to 120. */\n readonly estimateColumnWidth?: number | ((index: number) => number) | undefined;\n}\nexport interface VirtualRowItem<TRow> extends VirtualItem {\n readonly renderItem: TableRenderItem<TRow>;\n}\nexport interface VirtualColumnItem<TRow> extends VirtualItem {\n readonly column: TableColumn<TRow>;\n}\nexport interface VirtualColumnBinding<TRow> extends VirtualBinding<VirtualColumnItem<TRow>> {\n readonly centerItems: readonly VirtualColumnItem<TRow>[];\n readonly pinnedStartItems: readonly VirtualColumnItem<TRow>[];\n readonly pinnedEndItems: readonly VirtualColumnItem<TRow>[];\n}\nexport interface VirtualBinding<TItem extends VirtualItem> extends Omit<VirtualWindow, \"items\"> {\n readonly items: readonly TItem[];\n getItem(index: number): TItem | undefined;\n scrollToIndex(index: number, options?: { readonly align?: VirtualAlign | undefined }): void;\n scrollToKey(key: RowKey, options?: { readonly align?: VirtualAlign | undefined }): void;\n /** Pass the virtual item key explicitly; null releases its previously observed element. */\n measureElement(element: Element | ComponentPublicInstance | null, key: RowKey): void;\n}\n\nfunction useVirtualAxis<TSource, TItem extends VirtualItem>(\n source: () => readonly TSource[],\n keyOf: (item: TSource) => RowKey,\n estimate: number | ((index: number) => number),\n options: VirtualViewportOptions,\n horizontal: boolean,\n project: (item: VirtualItem, source: TSource) => TItem,\n sizeOf?: (item: TSource) => number | undefined,\n viewportInset: () => number = () => 0,\n stickyMargin: () => boolean = () => false,\n): VirtualBinding<TItem> {\n let items = source();\n const knownSizes = new Map<RowKey, number | undefined>(\n sizeOf ? items.map((item) => [keyOf(item), sizeOf(item)]) : [],\n );\n const estimateSize = sizeOf\n ? (index: number): number =>\n sizeOf(items[index]!) ?? (typeof estimate === \"number\" ? estimate : estimate(index))\n : estimate;\n let mounted = false;\n let disposed = false;\n let element: HTMLElement | null | undefined;\n let observer: ResizeObserver | undefined;\n let detach: (() => void) | undefined;\n const elements = new Map<RowKey, Element>();\n const keysByElement = new Map<Element, RowKey>();\n const requestedCount = options.initialCount ?? 10;\n const initialCount =\n Number.isSafeInteger(requestedCount) && requestedCount >= 0 ? requestedCount : 10;\n const initialIssue: TableIssue | undefined =\n initialCount === requestedCount\n ? undefined\n : Object.freeze({\n code: \"invalid_virtual_option\",\n message: \"Initial count must be a non-negative safe integer; 10 is used.\",\n });\n const layoutOptions = () => ({\n count: items.length,\n estimateSize,\n overscan: mounted ? options.overscan : 0,\n getKey: (index: number): RowKey => keyOf(items[index]!),\n });\n const virtual = createVirtualizer(layoutOptions());\n function seed(): void {\n let size = 0;\n for (let index = 0; index < Math.min(initialCount, items.length); index += 1) {\n const value = typeof estimateSize === \"number\" ? estimateSize : estimateSize(index);\n size += Number.isFinite(value) && value > 0 ? value : 40;\n }\n virtual.setViewport(0, size);\n }\n seed();\n const view = shallowRef(virtual.getWindow());\n const projected = computed(() =>\n Object.freeze(view.value.items.map((item) => Object.freeze(project(item, items[item.index]!)))),\n );\n const unsubscribe = virtual.subscribe((next) => {\n view.value = next;\n });\n const marginIssue = shallowRef<TableIssue>();\n const insetIssue = shallowRef<TableIssue>();\n function inset(): number {\n const value = viewportInset();\n if (Number.isFinite(value) && value >= 0) {\n insetIssue.value = undefined;\n return value;\n }\n insetIssue.value ??= Object.freeze({\n code: \"invalid_virtual_option\",\n message: \"Reserved row/column space must be non-negative and finite; 0 is used.\",\n });\n return 0;\n }\n\n function margin(): number {\n const value = toValue(options.scrollMargin) ?? 0;\n if (Number.isFinite(value) && value >= 0) {\n marginIssue.value = undefined;\n return value;\n }\n marginIssue.value ??= Object.freeze({\n code: \"invalid_virtual_option\",\n message: \"Scroll margin must be non-negative and finite; 0 is used.\",\n });\n return 0;\n }\n function viewportSize(): number {\n return element\n ? Math.max(0, (horizontal ? element.clientWidth : element.clientHeight) - margin() - inset())\n : virtual.getWindow().viewportSize;\n }\n function move(offset: number): void {\n if (element) {\n if (horizontal)\n element.scrollLeft =\n scrollSign() * (offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin()));\n else element.scrollTop = offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin());\n }\n virtual.setViewport(offset, viewportSize());\n }\n function anchor(): { key: RowKey; inset: number } | undefined {\n const current = virtual.getWindow();\n const first = current.items.find((item) => item.start + item.size > current.offset);\n return first ? { key: first.key, inset: current.offset - first.start } : undefined;\n }\n function restore(saved: ReturnType<typeof anchor>, fallback: number): void {\n const index = saved ? items.findIndex((item) => keyOf(item) === saved.key) : -1;\n move(index >= 0 && saved ? virtual.getOffsetForIndex(index, \"start\") + saved.inset : fallback);\n // Reflect the clamp in the scroll element after shrink or removal.\n if (element) {\n const offset = virtual.getWindow().offset;\n if (horizontal)\n element.scrollLeft =\n scrollSign() * (offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin()));\n else element.scrollTop = offset === 0 ? 0 : offset + (stickyMargin() ? 0 : margin());\n }\n }\n function measure(target: Element, key: RowKey): void {\n readViewport();\n const saved = anchor();\n const offset = virtual.getWindow().offset;\n const box = target.getBoundingClientRect();\n const size = horizontal ? box.width : box.height;\n // Hidden and detached elements have no useful measurement; retain the estimate.\n if (size > 0 && Number.isFinite(size)) {\n const previous = virtual.getWindow();\n virtual.measure(key, size);\n if (virtual.getWindow() === previous) return;\n restore(saved, offset);\n }\n }\n function readViewport(): void {\n if (element)\n virtual.setViewport(\n Math.max(\n 0,\n (horizontal ? element.scrollLeft * scrollSign() : element.scrollTop) -\n (stickyMargin() ? 0 : margin()),\n ),\n viewportSize(),\n );\n }\n function scrollSign(): number {\n return element?.closest(\"[dir]\")?.getAttribute(\"dir\")?.toLowerCase() === \"rtl\" ? -1 : 1;\n }\n const stopSource = watch(\n source,\n (next) => {\n // A focus or disclosure can scroll the element before its scroll event is delivered.\n readViewport();\n const saved = anchor();\n const offset = virtual.getWindow().offset;\n const resetMeasurements: RowKey[] = [];\n if (sizeOf) {\n for (const item of next) {\n const key = keyOf(item);\n const size = sizeOf(item);\n if (knownSizes.has(key) && !Object.is(knownSizes.get(key), size))\n resetMeasurements.push(key);\n // Keep hidden keys so width changes while hidden also discard their old measurement.\n knownSizes.set(key, size);\n }\n }\n items = next;\n virtual.setOptions(layoutOptions(), resetMeasurements);\n if (mounted) restore(saved, offset);\n else seed();\n },\n { flush: \"sync\" },\n );\n const stopInsets = watch(\n () => [toValue(options.scrollMargin), viewportInset(), stickyMargin()] as const,\n () => {\n if (mounted) readViewport();\n },\n { flush: \"post\" },\n );\n let stopElement: (() => void) | undefined;\n if (getCurrentInstance())\n onMounted(() => {\n mounted = true;\n virtual.setOptions(layoutOptions());\n stopElement = watch(\n () => toValue(options.scrollElement),\n (next) => {\n detach?.();\n observer?.disconnect();\n observer = undefined;\n element = next;\n if (!next) {\n seed();\n return;\n }\n const owner = next.ownerDocument.defaultView;\n const Observer = owner?.ResizeObserver;\n if (Observer) {\n observer = new Observer((entries) => {\n for (const entry of entries) {\n if (entry.target === element) readViewport();\n else {\n const key = keysByElement.get(entry.target);\n if (key !== undefined) measure(entry.target, key);\n }\n }\n });\n observer.observe(next);\n for (const target of elements.values()) observer.observe(target);\n } else owner?.addEventListener(\"resize\", readViewport);\n next.addEventListener(\"scroll\", readViewport, { passive: true });\n detach = () => {\n next.removeEventListener(\"scroll\", readViewport);\n owner?.removeEventListener(\"resize\", readViewport);\n };\n readViewport();\n for (const [key, target] of elements) measure(target, key);\n },\n { immediate: true, flush: \"post\" },\n );\n });\n if (getCurrentScope())\n onScopeDispose(() => {\n disposed = true;\n stopSource();\n stopInsets();\n stopElement?.();\n detach?.();\n observer?.disconnect();\n unsubscribe();\n elements.clear();\n keysByElement.clear();\n knownSizes.clear();\n element = undefined;\n });\n margin();\n inset();\n const binding = {\n getItem(index: number): TItem | undefined {\n // Reading the revision connects offscreen lookups to reactive measurements and layout.\n void view.value;\n const item = virtual.getItem(index);\n return item ? Object.freeze(project(item, items[index]!)) : undefined;\n },\n scrollToIndex(\n index: number,\n { align = \"auto\" }: { readonly align?: VirtualAlign | undefined } = {},\n ): void {\n move(virtual.getOffsetForIndex(index, align));\n },\n scrollToKey(key: RowKey, align?: { readonly align?: VirtualAlign | undefined }): void {\n const index = items.findIndex((item) => keyOf(item) === key);\n if (index >= 0) binding.scrollToIndex(index, align);\n },\n measureElement(target: Element | ComponentPublicInstance | null, key: RowKey): void {\n if (disposed) return;\n const previous = elements.get(key);\n if (previous === target) return;\n if (previous) {\n observer?.unobserve(previous);\n keysByElement.delete(previous);\n elements.delete(key);\n }\n if (!target || !(\"getBoundingClientRect\" in target)) return;\n elements.set(key, target);\n keysByElement.set(target, key);\n if (mounted) {\n observer?.observe(target);\n // A ref can run midway through a keyed row/spacer patch. Reading layout there can\n // clamp a pending scroll against a temporarily shortened content area.\n void nextTick(() => {\n if (!disposed && elements.get(key) === target) measure(target, key);\n });\n }\n },\n } as Record<string, unknown> &\n Pick<VirtualBinding<TItem>, \"getItem\" | \"scrollToIndex\" | \"scrollToKey\" | \"measureElement\">;\n for (const key of Object.keys(view.value))\n Object.defineProperty(binding, key, {\n enumerable: true,\n get: () =>\n key === \"items\"\n ? projected.value\n : key === \"issues\" && (initialIssue || marginIssue.value || insetIssue.value)\n ? Object.freeze([\n ...view.value.issues,\n ...(initialIssue ? [initialIssue] : []),\n ...(marginIssue.value ? [marginIssue.value] : []),\n ...(insetIssue.value ? [insetIssue.value] : []),\n ])\n : view.value[key as keyof VirtualWindow],\n });\n return Object.freeze(binding) as unknown as VirtualBinding<TItem>;\n}\n\n/** Virtualize group, data and detail items. scrollToKey accepts the parent data-row key. */\nexport function useVirtualRows<TRow>(\n table: DataTableBinding<TRow>,\n options: UseVirtualRowsOptions<TRow>,\n): VirtualBinding<VirtualRowItem<TRow>> {\n const renderItems = (): readonly TableRenderItem<TRow>[] =>\n options.renderItems ? toValue(options.renderItems) : table.renderItems;\n const reserved = (): number => {\n const heights = toValue(options.pinnedRowHeights);\n if (!heights) return 0;\n return heights.top >= 0 &&\n heights.bottom >= 0 &&\n Number.isFinite(heights.top) &&\n Number.isFinite(heights.bottom)\n ? heights.top + heights.bottom\n : Number.NaN;\n };\n const virtual = useVirtualAxis(\n renderItems,\n (item) => item.key,\n options.estimateRowHeight ?? 40,\n options,\n false,\n (item, renderItem) => ({ ...item, renderItem }),\n undefined,\n reserved,\n () => reserved() > 0,\n );\n const stopFocus = watch(\n [() => options.grid?.selection?.focus.row, renderItems],\n ([row, items], [, previousItems]) => {\n // Source changes already restore the visible anchor. A relocated selection must not\n // scroll against the previous layout during the same synchronous publication.\n if (row === undefined || items !== previousItems) return;\n const direct = items[row];\n const index =\n direct?.kind === \"row\" && direct.rowIndex === row\n ? row\n : items.findIndex((item) => item.kind === \"row\" && item.rowIndex === row);\n if (index >= 0) virtual.scrollToIndex(index);\n },\n { flush: \"sync\" },\n );\n if (getCurrentScope()) onScopeDispose(stopFocus);\n const binding = Object.defineProperties(\n {},\n {\n ...Object.getOwnPropertyDescriptors(virtual),\n scrollToKey: {\n enumerable: true,\n value: (key: RowKey, align?: { readonly align?: VirtualAlign | undefined }): void =>\n virtual.scrollToKey(getRowItemKey(key), align),\n },\n },\n );\n return Object.freeze(binding) as VirtualBinding<VirtualRowItem<TRow>>;\n}\n\n/** Virtualize centre columns, retaining both pinned edges and logical display indices. */\nexport function useVirtualColumns<TRow>(\n grid: DataGridBinding<TRow>,\n options: UseVirtualColumnsOptions,\n): VirtualColumnBinding<TRow> {\n const table = grid.table;\n const visibleColumns = computed(() => table.columns);\n const layout = computed(() => {\n const columns = visibleColumns.value;\n const center = columns.filter((column) => !column.pinned);\n return {\n center,\n indices: new Map(columns.map((column, index) => [column.id, index])),\n centerIndices: new Map(center.map((column, index) => [column.id, index])),\n };\n });\n const estimate = options.estimateColumnWidth ?? 120;\n const virtual = useVirtualAxis(\n () => layout.value.center,\n (column) => column.id,\n (index) =>\n typeof estimate === \"number\"\n ? estimate\n : estimate(layout.value.indices.get(layout.value.center[index]!.id)!),\n options,\n true,\n (item, column) => ({\n ...item,\n column,\n index: layout.value.indices.get(column.id)!,\n start: item.start + table.pinnedStartWidth,\n }),\n (column) =>\n column.width ??\n clampColumnWidth(\n column,\n typeof estimate === \"number\" ? estimate : estimate(layout.value.indices.get(column.id)!),\n ),\n () => table.pinnedStartWidth + table.pinnedEndWidth,\n () => table.pinnedStartWidth + table.pinnedEndWidth > 0,\n );\n const pinnedItems = (side: \"start\" | \"end\"): readonly VirtualColumnItem<TRow>[] =>\n Object.freeze(\n visibleColumns.value\n .filter((column) => column.pinned === side)\n .map((column) =>\n Object.freeze({\n key: column.id,\n index: layout.value.indices.get(column.id)!,\n size: column.width!,\n start:\n side === \"start\"\n ? column.pinOffset\n : table.pinnedStartWidth +\n virtual.totalSize +\n table.pinnedEndWidth -\n column.pinOffset -\n column.width!,\n column,\n }),\n ),\n );\n const start = computed(() => pinnedItems(\"start\"));\n const end = computed(() => pinnedItems(\"end\"));\n const all = computed(() => Object.freeze([...start.value, ...virtual.items, ...end.value]));\n const binding: VirtualColumnBinding<TRow> = Object.freeze({\n get items() {\n return all.value;\n },\n get centerItems() {\n return virtual.items;\n },\n get pinnedStartItems() {\n return start.value;\n },\n get pinnedEndItems() {\n return end.value;\n },\n get totalSize() {\n return table.pinnedStartWidth + virtual.totalSize + table.pinnedEndWidth;\n },\n get paddingStart() {\n return virtual.paddingStart;\n },\n get paddingEnd() {\n return virtual.paddingEnd;\n },\n get startIndex() {\n return virtual.items[0]?.index ?? 0;\n },\n get endIndex() {\n return virtual.items.at(-1)?.index ?? -1;\n },\n get offset() {\n return virtual.offset;\n },\n get viewportSize() {\n return virtual.viewportSize;\n },\n get issues() {\n return virtual.issues;\n },\n getItem(index: number): VirtualColumnItem<TRow> | undefined {\n const column = table.columns[index];\n if (!column) return undefined;\n if (column.pinned)\n return (column.pinned === \"start\" ? start.value : end.value).find(\n (item) => item.key === column.id,\n );\n return virtual.getItem(layout.value.centerIndices.get(column.id)!);\n },\n scrollToIndex(index: number, align?: { readonly align?: VirtualAlign | undefined }): void {\n const column = table.columns[index];\n if (!column || column.pinned) return;\n virtual.scrollToIndex(layout.value.centerIndices.get(column.id)!, align);\n },\n scrollToKey(key: RowKey, align?: { readonly align?: VirtualAlign | undefined }): void {\n if (typeof key !== \"string\") return;\n const index = layout.value.indices.get(key);\n if (index !== undefined) binding.scrollToIndex(index, align);\n },\n measureElement(target: Element | ComponentPublicInstance | null, key: RowKey): void {\n // Pinned widths come from the engine so sticky offsets and the virtual surface agree.\n if (typeof key === \"string\" && layout.value.centerIndices.has(key))\n virtual.measureElement(target, key);\n else virtual.measureElement(null, key);\n },\n });\n const stopFocus = watch(\n [() => grid.selection?.focus.column, () => table.columns],\n ([column, columns], [, previousColumns]) => {\n if (column !== undefined && columns === previousColumns) binding.scrollToIndex(column);\n },\n { flush: \"sync\" },\n );\n if (getCurrentScope()) onScopeDispose(stopFocus);\n return binding;\n}\n","import type {\n DataTable,\n StreamOptions,\n TableIssue,\n TableSnapshot,\n TableState,\n} from \"@vueye-table/core\";\nimport {\n getCurrentInstance,\n onMounted,\n shallowRef,\n unref,\n watch,\n watchEffect,\n type MaybeRef,\n type WatchStopHandle,\n} from \"vue\";\n\nexport interface SourceContext {\n readonly signal: AbortSignal;\n}\nexport type TableSource<TRow> =\n | AsyncIterable<TRow | readonly TRow[]>\n | ((context: SourceContext) => AsyncIterable<TRow | readonly TRow[]>);\nexport interface LoadMoreContext extends SourceContext {\n /** Undefined on the first page. Validate or narrow the opaque cursor in your loader. */\n readonly cursor: unknown;\n readonly state: TableState;\n}\nexport interface LoadMoreResult<TRow> {\n readonly rows: readonly TRow[];\n readonly cursor?: unknown;\n readonly done: boolean;\n}\nexport type LoadMore<TRow> = (context: LoadMoreContext) => Promise<LoadMoreResult<TRow>>;\n/** Schedule once per rendering frame and return its cancellation function. */\nexport type FrameScheduler = (publish: () => void) => () => void;\nexport interface SourceOptions<TRow> {\n readonly source?: MaybeRef<TableSource<TRow> | undefined> | undefined;\n readonly loadMore?: MaybeRef<LoadMore<TRow> | undefined> | undefined;\n readonly streamOptions?: Omit<StreamOptions, \"signal\"> | undefined;\n /** Non-component scopes use a 16ms timer by default. */\n readonly scheduleFrame?: FrameScheduler | undefined;\n /** Remaining flattened items at which a virtual renderer requests the next cursor page. */\n readonly endThreshold?: number | undefined;\n}\n\nexport interface SourceBinding {\n readonly endThreshold: number;\n readonly loadingMode: \"source\" | \"cursor\" | undefined;\n readonly canLoadMore: boolean;\n readonly loadError: TableIssue | undefined;\n loadNext(this: void): Promise<void>;\n retry(this: void): void;\n}\n\n/** Internal owner of one cancellable source, using the engine's ingestion/conflict boundary. */\nexport function createSource<TRow>(\n table: DataTable<TRow>,\n options: SourceOptions<TRow>,\n seed: () => readonly TRow[],\n publish: (next: TableSnapshot<TRow>) => void,\n): SourceBinding & {\n update(this: void, next: TableSnapshot<TRow>): void;\n dispose(this: void): void;\n initial(this: void): TableSnapshot<TRow>;\n} {\n const instance = getCurrentInstance();\n const requestedThreshold = options.endThreshold ?? 5;\n const endThreshold =\n Number.isSafeInteger(requestedThreshold) && requestedThreshold >= 0 ? requestedThreshold : 5;\n const optionIssues: readonly TableIssue[] =\n requestedThreshold === endThreshold\n ? []\n : [\n Object.freeze({\n code: \"invalid_stream_option\",\n message: \"endThreshold must be a non-negative safe integer; 5 is used.\",\n }),\n ];\n const mode = shallowRef<\"source\" | \"cursor\" | undefined>(undefined);\n const more = shallowRef(false);\n const retryVersion = shallowRef(0);\n const query = shallowRef(table.getState());\n let cursor: unknown;\n let controller: AbortController | undefined;\n let task: Promise<void> | undefined;\n let cancelFrame: (() => void) | undefined;\n let pending: TableSnapshot<TRow> | undefined;\n let active = false;\n let disposed = false;\n let mounted = !instance;\n let first = true;\n let cursorFailed = false;\n let generation = 0;\n let stops: WatchStopHandle[] = [];\n const initialMode = (): \"source\" | \"cursor\" | undefined =>\n unref(options.source) ? \"source\" : unref(options.loadMore) ? \"cursor\" : undefined;\n const schedule: FrameScheduler =\n options.scheduleFrame ??\n ((flush) => {\n // Component sources start after mount, so the owning element supplies its frame scheduler.\n const view = (instance?.proxy?.$el as Element | undefined)?.ownerDocument?.defaultView;\n if (view) {\n const id = view.requestAnimationFrame(flush);\n return () => view.cancelAnimationFrame(id);\n }\n const id = setTimeout(flush, 16);\n return () => clearTimeout(id);\n });\n const project = (next: TableSnapshot<TRow>): TableSnapshot<TRow> => {\n const loadState =\n !mounted && initialMode()\n ? \"loading\"\n : mode.value === \"cursor\" && more.value && next.loadState === \"done\"\n ? \"idle\"\n : next.loadState;\n return loadState === next.loadState && optionIssues.length === 0\n ? next\n : Object.freeze({\n ...next,\n loadState,\n issues: Object.freeze([...next.issues, ...optionIssues]),\n });\n };\n const flush = (): void => {\n cancelFrame = undefined;\n if (pending && !disposed) {\n active = pending.loadState === \"loading\" || pending.loadState === \"streaming\";\n publish(project(pending));\n }\n pending = undefined;\n };\n const update = (next: TableSnapshot<TRow>): void => {\n const state = next.state;\n const previous = query.value;\n if (\n previous.sorting !== state.sorting ||\n previous.search !== state.search ||\n previous.filters !== state.filters\n ) {\n query.value = state;\n // A synchronous cursor reset can replace this notification's data while keeping its query.\n next = table.getSnapshot();\n }\n if (active) {\n pending = next;\n cancelFrame ??= schedule(flush);\n } else publish(project(next));\n };\n const stop = (): void => {\n controller?.abort();\n controller = undefined;\n task = undefined;\n active = false;\n cancelFrame?.();\n cancelFrame = undefined;\n pending = undefined;\n };\n const reset = (): void => {\n stop();\n cursor = undefined;\n cursorFailed = false;\n if (!first) table.setData(seed());\n first = false;\n };\n const loadNext = (): Promise<void> => {\n if (disposed || !mounted || mode.value !== \"cursor\" || !more.value || cursorFailed)\n return Promise.resolve();\n if (task) return task;\n const loader = unref(options.loadMore)!;\n const run = new AbortController();\n controller = run;\n active = true;\n const state = table.getState();\n const previousCursor = cursor;\n const source: AsyncIterable<readonly TRow[]> = {\n async *[Symbol.asyncIterator]() {\n const result = await loader({ cursor: previousCursor, state, signal: run.signal });\n if (run.signal.aborted) return;\n if (!Array.isArray(result.rows) || typeof result.done !== \"boolean\")\n throw new Error(\"loadMore must return rows and a boolean done flag.\");\n // Refuse an endless empty-page loop while keeping its retryable error visible.\n if (!result.done && result.rows.length === 0 && Object.is(result.cursor, previousCursor))\n throw new Error(\n \"loadMore returned no rows or cursor progress. Retry after correcting the response.\",\n );\n cursor = result.cursor;\n more.value = !result.done;\n yield result.rows;\n },\n };\n task = table.stream(source, { ...options.streamOptions, signal: run.signal }).then((result) => {\n if (controller !== run || disposed) return undefined;\n cursorFailed = result.status === \"error\";\n task = undefined;\n // Keep the final metadata coalesced with the last data batch.\n if (!cancelFrame) active = false;\n return undefined;\n });\n return task;\n };\n const start = (): void => {\n if (disposed) return;\n mounted = true;\n stops = [\n watchEffect((cleanup) => {\n void retryVersion.value;\n const source = unref(options.source);\n const loader = unref(options.loadMore);\n const run = new AbortController();\n const ticket = ++generation;\n cleanup(() => run.abort());\n let iterable: AsyncIterable<TRow | readonly TRow[]> | undefined;\n if (source) {\n // Invoke the factory inside this effect to track its reactive dependencies.\n try {\n iterable = typeof source === \"function\" ? source({ signal: run.signal }) : source;\n } catch (error) {\n iterable = {\n [Symbol.asyncIterator]: () => ({ next: () => Promise.reject(error) }),\n };\n }\n if (loader)\n iterable = {\n [Symbol.asyncIterator]: () => ({\n next: () =>\n Promise.reject(\n new Error(\"Choose source or loadMore, rather than combining them.\"),\n ),\n }),\n };\n }\n // Effects track only source construction. Loading and seed reads must not subscribe the\n // source to its own progress, selection, or emitted data round trips.\n queueMicrotask(() => {\n if (disposed || run.signal.aborted || ticket !== generation) return;\n reset();\n mode.value = source ? \"source\" : loader ? \"cursor\" : undefined;\n more.value = !!loader && !source;\n if (iterable) {\n controller = run;\n active = true;\n void table\n .stream(iterable, { ...options.streamOptions, signal: run.signal })\n .then(() => {\n if (controller === run && !cancelFrame) active = false;\n return undefined;\n });\n } else if (loader) void loadNext();\n else update(table.getSnapshot());\n });\n }),\n watch(\n query,\n () => {\n if (mode.value !== \"cursor\") return;\n reset();\n more.value = true;\n void loadNext();\n },\n { flush: \"sync\" },\n ),\n ];\n };\n if (instance) onMounted(start);\n // The first snapshot must exist before a synchronous non-component source starts.\n else queueMicrotask(start);\n return {\n endThreshold,\n get loadingMode() {\n return mode.value ?? (!mounted ? initialMode() : undefined);\n },\n get canLoadMore() {\n return more.value && !cursorFailed && !task;\n },\n get loadError() {\n const next = table.getSnapshot();\n return next.loadState === \"error\"\n ? next.issues.find((item) => item.code === \"stream_error\")\n : undefined;\n },\n loadNext,\n retry() {\n if (disposed) return;\n if (mode.value === \"cursor\" && cursorFailed) {\n cursorFailed = false;\n void loadNext();\n } else retryVersion.value++;\n },\n update,\n initial: () => project(table.getSnapshot()),\n dispose() {\n disposed = true;\n stop();\n for (const disposeWatch of stops) disposeWatch();\n stops = [];\n },\n };\n}\n","import {\n createTable,\n type ColumnDef,\n type DataTable,\n type TableOptions,\n type TableSnapshot,\n type TableStatePatch,\n type TableState,\n type TreeLoadSignal,\n type TreeLoadController,\n type ExpandedState,\n type PendingChanges,\n type RowKey,\n type TreeFilter,\n} from \"@vueye-table/core\";\nimport {\n getCurrentScope,\n onScopeDispose,\n shallowRef,\n toRaw,\n toValue,\n unref,\n watch,\n type MaybeRefOrGetter,\n} from \"vue\";\n\nimport { createRowDraft, type RowDraft } from \"./row-draft\";\nimport { createSource, type SourceOptions, type SourceBinding } from \"./source\";\n\n/** Layout fields shared by table and grid bindings. Read through a getter when watching. */\nexport type LayoutState = Pick<\n TableState,\n \"columnSizing\" | \"columnPinning\" | \"grouping\" | \"expandedGroups\" | \"rowPinning\"\n>;\nexport type DataTableLayout<TRow> = LayoutState &\n Pick<TableSnapshot<TRow>, \"topRows\" | \"bottomRows\" | \"pinnedStartWidth\" | \"pinnedEndWidth\"> &\n Pick<\n DataTable<TRow>,\n | \"resizeColumn\"\n | \"resetColumnSize\"\n | \"pinColumn\"\n | \"pinRow\"\n | \"groupBy\"\n | \"toggleGroup\"\n | \"expandAllGroups\"\n | \"collapseAllGroups\"\n > & {\n /** Vue alias for groupBy. */\n setGrouping: DataTable<TRow>[\"groupBy\"];\n };\n\ntype ReactiveLayoutOptions = {\n readonly [Key in keyof LayoutState]?: MaybeRefOrGetter<LayoutState[Key] | undefined> | undefined;\n};\nconst LAYOUT_FIELDS = [\n \"columnSizing\",\n \"columnPinning\",\n \"grouping\",\n \"expandedGroups\",\n \"rowPinning\",\n] as const satisfies readonly (keyof LayoutState)[];\n\n/** Options accepted by {@link useDataTable}. Data, columns, and state may be refs or getters. */\nexport interface UseDataTableOptions<TRow, TSignal extends TreeLoadSignal = AbortSignal>\n extends\n Omit<TableOptions<TRow, TSignal>, \"data\" | \"columns\" | \"rowCount\" | \"treeFilter\">,\n SourceOptions<TRow>,\n ReactiveLayoutOptions {\n /** Initial rows for a source, or the caller-owned array for an ordinary table. */\n readonly data?: MaybeRefOrGetter<readonly TRow[]> | undefined;\n readonly columns: MaybeRefOrGetter<readonly ColumnDef<TRow>[]>;\n readonly rowCount?: MaybeRefOrGetter<number | undefined> | undefined;\n /** Search context can change without discarding lazy branches, edits or selection. */\n readonly treeFilter?: MaybeRefOrGetter<TreeFilter | undefined> | undefined;\n /**\n * State owned by the caller, for example `v-model` props or URL query values. Whenever it\n * changes it is applied with `setState`; the table's own changes still reach `onStateChange`.\n */\n readonly state?: MaybeRefOrGetter<TableStatePatch | undefined> | undefined;\n}\n\ntype TableOperations<TRow> = Omit<DataTable<TRow>, \"getSnapshot\" | \"getState\" | \"subscribe\">;\n\n/**\n * A reactive view of a table: every snapshot field is a plain reactive property, so templates read\n * `table.rows` and `table.pageCount` directly, and every change goes through a named operation.\n * Watching a field needs a getter: `watch(() => table.page, ...)`.\n */\nexport type DataTableBinding<TRow> = TableSnapshot<TRow> &\n DataTableLayout<TRow> &\n SourceBinding &\n TableOperations<TRow> & {\n /** The engine behind the binding. */\n readonly table: DataTable<TRow>;\n /** The current snapshot, replaced on every change. */\n readonly snapshot: TableSnapshot<TRow>;\n readonly expanded: ExpandedState;\n readonly pendingChanges: PendingChanges<TRow>;\n editRow(key: RowKey): RowDraft<TRow>;\n };\n\n/**\n * A binding for any row type, for components that accept every table. Row types make the binding\n * invariant, so `DataTableBinding<unknown>` would refuse `DataTableBinding<Person>`.\n */\nexport type AnyDataTableBinding = DataTableBinding<any>;\n\nconst OPERATIONS = [\n \"appendData\",\n \"upsertData\",\n \"removeData\",\n \"stream\",\n \"insertRows\",\n \"removeRows\",\n \"getPendingChanges\",\n \"markSaved\",\n \"revert\",\n \"setState\",\n \"setData\",\n \"setColumns\",\n \"setTreeFilter\",\n \"setRowCount\",\n \"toggleSort\",\n \"sort\",\n \"clearSorting\",\n \"search\",\n \"filter\",\n \"clearFilters\",\n \"goToPage\",\n \"nextPage\",\n \"previousPage\",\n \"setPageSize\",\n \"select\",\n \"deselect\",\n \"toggleRow\",\n \"toggleAll\",\n \"clearSelection\",\n \"getSelectedRows\",\n \"toggleExpanded\",\n \"expandAll\",\n \"collapseAll\",\n \"groupBy\",\n \"toggleGroup\",\n \"expandAllGroups\",\n \"collapseAllGroups\",\n \"toggleGroupSelection\",\n \"toggleColumn\",\n \"moveColumn\",\n \"pinColumn\",\n \"pinRow\",\n \"resizeColumn\",\n \"resetColumnSize\",\n \"edit\",\n \"undo\",\n \"redo\",\n \"copy\",\n \"paste\",\n \"clear\",\n \"exportRows\",\n \"reset\",\n \"destroy\",\n] as const satisfies readonly (keyof TableOperations<unknown>)[];\n\nfunction definedEntries(patch: TableStatePatch | undefined): TableStatePatch {\n return Object.fromEntries(Object.entries(patch ?? {}).filter(([, value]) => value !== undefined));\n}\n\n/**\n * Create a table bound to the current effect scope. The table follows its reactive data,\n * columns, row count, and state, and stops listening when the scope ends.\n */\nexport function useDataTable<TRow>(options: UseDataTableOptions<TRow>): DataTableBinding<TRow>;\nexport function useDataTable<TRow, TSignal extends TreeLoadSignal = AbortSignal>(\n options: UseDataTableOptions<TRow, TSignal> &\n (AbortSignal extends TSignal\n ? unknown\n : { readonly createChildLoadController: () => TreeLoadController<TSignal> }),\n): DataTableBinding<TRow>;\nexport function useDataTable<TRow, TSignal extends TreeLoadSignal = AbortSignal>(\n options: UseDataTableOptions<TRow, TSignal>,\n): DataTableBinding<TRow> {\n const empty: readonly TRow[] = Object.freeze([]);\n const seed = (): readonly TRow[] => toRaw(toValue(options.data) ?? empty);\n const layoutState = (): TableStatePatch =>\n definedEntries(Object.fromEntries(LAYOUT_FIELDS.map((key) => [key, toValue(options[key])])));\n const table = createTable<TRow, TSignal>({\n ...options,\n manual: options.manual ?? !!unref(options.loadMore),\n data: seed(),\n columns: toValue(options.columns),\n rowCount: toValue(options.rowCount),\n treeFilter: toValue(options.treeFilter),\n initialState: {\n ...options.initialState,\n ...layoutState(),\n ...definedEntries(toValue(options.state)),\n },\n // Public overloads require custom signals to provide their matching factory.\n createChildLoadController:\n options.createChildLoadController ??\n ((() => new AbortController()) as unknown as () => TreeLoadController<TSignal>),\n });\n const drafts = new Set<() => void>();\n let disposed = false;\n const snapshot = shallowRef(table.getSnapshot());\n const source = createSource(table, options, seed, (next) => {\n snapshot.value = next;\n });\n snapshot.value = source.initial();\n const unsubscribe = table.subscribe(source.update);\n\n const stops = [\n watch(\n () => toValue(options.treeFilter),\n (mode) => table.setTreeFilter(mode),\n ),\n watch(\n () => toValue(options.data),\n // Reactive arrays arrive as proxies; the engine works on, and compares, the raw array.\n (data) => table.setData(toRaw(data ?? empty)),\n ),\n watch(\n () => toValue(options.columns),\n (columns) => table.setColumns(columns),\n ),\n watch(\n () => toValue(options.rowCount),\n (rowCount) => {\n if (rowCount !== undefined) {\n table.setRowCount(rowCount);\n }\n },\n ),\n watch(\n () => ({ ...layoutState(), ...definedEntries(toValue(options.state)) }),\n (state) => table.setState(state),\n { deep: true },\n ),\n ];\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n source.dispose();\n for (const disposeDraft of drafts) disposeDraft();\n drafts.clear();\n for (const stop of stops) {\n stop();\n }\n unsubscribe();\n table.destroy();\n };\n if (getCurrentScope()) onScopeDispose(dispose);\n\n const binding = { table } as Record<string, unknown>;\n for (const key of [\"endThreshold\", \"loadingMode\", \"canLoadMore\", \"loadError\"] as const) {\n Object.defineProperty(binding, key, {\n enumerable: true,\n get: () => {\n void snapshot.value;\n return source[key];\n },\n });\n }\n binding[\"retry\"] = source.retry;\n binding[\"loadNext\"] = source.loadNext;\n Object.defineProperty(binding, \"snapshot\", { enumerable: true, get: () => snapshot.value });\n Object.defineProperty(binding, \"expanded\", {\n enumerable: true,\n get: () => snapshot.value.state.expanded,\n });\n for (const key of LAYOUT_FIELDS) {\n Object.defineProperty(binding, key, {\n enumerable: true,\n get: () => snapshot.value.state[key],\n });\n }\n binding[\"setGrouping\"] = (columnIds: readonly string[]): void => table.groupBy(columnIds);\n Object.defineProperty(binding, \"pendingChanges\", {\n enumerable: true,\n get: () => {\n void snapshot.value;\n return table.getPendingChanges();\n },\n });\n binding[\"editRow\"] = (key: RowKey): RowDraft<TRow> =>\n createRowDraft(table, key, (disposeDraft) => {\n if (disposed) disposeDraft();\n else drafts.add(disposeDraft);\n return () => {\n drafts.delete(disposeDraft);\n };\n });\n for (const key of Object.keys(snapshot.value)) {\n Object.defineProperty(binding, key, {\n enumerable: true,\n get: () => snapshot.value[key as keyof TableSnapshot<TRow>],\n });\n }\n for (const name of OPERATIONS) {\n binding[name] = table[name];\n }\n binding[\"destroy\"] = dispose;\n return Object.freeze(binding) as unknown as DataTableBinding<TRow>;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vueye-table/vue",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.7",
|
|
4
4
|
"description": "Vue composables that bind the vueye-table engine to reactive state.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"composables",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"provenance": true
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@vueye-table/core": "3.0.0-beta.
|
|
41
|
+
"@vueye-table/core": "3.0.0-beta.7"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"vue": "3.5.43",
|