@vueye-table/vue 3.0.0-alpha.1 → 3.0.0-alpha.2

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 CHANGED
@@ -1,5 +1,5 @@
1
- import { ComputedRef, MaybeRefOrGetter } from "vue";
2
- import { CellPosition, CellRange, ColumnDef, DataTable, EditResult, GridBounds, GridDirection, GridKey, GridSelection, MoveOptions, TableColumn, TableOptions, TableRow, TableSnapshot, TableStatePatch } from "@vueye-table/core";
1
+ import { ComponentPublicInstance, ComputedRef, MaybeRefOrGetter } from "vue";
2
+ import { CellPosition, CellRange, ColumnDef, CopyOptions, DataTable, EditResult, GridBounds, GridDirection, GridKey, GridSelection, MoveOptions, RowKey, TableColumn, TableOptions, TableRenderItem, TableRow, TableSnapshot, TableStatePatch, VirtualAlign, VirtualItem, VirtualWindow } from "@vueye-table/core";
3
3
  //#region src/use-data-table.d.ts
4
4
  /** Options accepted by {@link useDataTable}. Data, columns, and state may be refs or getters. */
5
5
  interface UseDataTableOptions<TRow> extends Omit<TableOptions<TRow>, "data" | "columns" | "rowCount"> {
@@ -46,6 +46,7 @@ interface GridEditor {
46
46
  * copy, paste, and clearing. Positions refer to the current page and the visible columns.
47
47
  */
48
48
  interface DataGridBinding<TRow> {
49
+ readonly table: DataTableBinding<TRow>;
49
50
  readonly selection: GridSelection | undefined;
50
51
  readonly range: CellRange | undefined;
51
52
  readonly editor: GridEditor | undefined;
@@ -71,7 +72,7 @@ interface DataGridBinding<TRow> {
71
72
  commitEdit(then?: GridDirection): EditResult<TRow> | undefined;
72
73
  cancelEdit(): void;
73
74
  /** The selected range as tab-separated text. */
74
- copy(): string;
75
+ copy(options?: CopyOptions): string;
75
76
  /** Paste tab-separated text at the top-left of the selection. */
76
77
  paste(text: string): EditResult<TRow> | undefined;
77
78
  clear(): EditResult<TRow> | undefined;
@@ -92,5 +93,42 @@ declare function provideDataGrid<TRow>(grid: DataGridBinding<TRow>): void;
92
93
  /** Read the grid provided by an ancestor, or `undefined` outside a grid. */
93
94
  declare function injectDataGrid<TRow = unknown>(): DataGridBinding<TRow> | undefined;
94
95
  //#endregion
95
- export { type AnyDataTableBinding, type DataGridBinding, type DataTableBinding, type GridEditor, type UseDataTableOptions, injectDataGrid, injectDataTable, provideDataGrid, provideDataTable, useDataGrid, useDataTable };
96
+ //#region src/use-virtual.d.ts
97
+ interface VirtualViewportOptions {
98
+ readonly scrollElement: MaybeRefOrGetter<HTMLElement | null | undefined>;
99
+ readonly overscan?: number | undefined;
100
+ /** Number of items rendered before mount, without overscan. Defaults to 10. */
101
+ readonly initialCount?: number | undefined;
102
+ }
103
+ interface UseVirtualRowsOptions<TRow> extends VirtualViewportOptions {
104
+ readonly estimateRowHeight?: number | ((index: number) => number) | undefined;
105
+ /** Connect logical grid focus to the rendered data row, skipping details. */
106
+ readonly grid?: DataGridBinding<TRow> | undefined;
107
+ }
108
+ interface UseVirtualColumnsOptions extends VirtualViewportOptions {
109
+ readonly estimateColumnWidth?: number | ((index: number) => number) | undefined;
110
+ }
111
+ interface VirtualRowItem<TRow> extends VirtualItem {
112
+ readonly renderItem: TableRenderItem<TRow>;
113
+ }
114
+ interface VirtualColumnItem<TRow> extends VirtualItem {
115
+ readonly column: TableColumn<TRow>;
116
+ }
117
+ interface VirtualBinding<TItem extends VirtualItem> extends Omit<VirtualWindow, "items"> {
118
+ readonly items: readonly TItem[];
119
+ scrollToIndex(index: number, options?: {
120
+ readonly align?: VirtualAlign | undefined;
121
+ }): void;
122
+ scrollToKey(key: RowKey, options?: {
123
+ readonly align?: VirtualAlign | undefined;
124
+ }): void;
125
+ /** Pass the virtual item key explicitly; null releases its previously observed element. */
126
+ measureElement(element: Element | ComponentPublicInstance | null, key: RowKey): void;
127
+ }
128
+ /** Virtualize data and detail render items. scrollToKey accepts the parent data-row key. */
129
+ declare function useVirtualRows<TRow>(table: DataTableBinding<TRow>, options: UseVirtualRowsOptions<TRow>): VirtualBinding<VirtualRowItem<TRow>>;
130
+ /** Virtualize visible columns and bring the active logical column into view. */
131
+ declare function useVirtualColumns<TRow>(grid: DataGridBinding<TRow>, options: UseVirtualColumnsOptions): VirtualBinding<VirtualColumnItem<TRow>>;
132
+ //#endregion
133
+ export { type AnyDataTableBinding, type DataGridBinding, type DataTableBinding, type GridEditor, type UseDataTableOptions, type UseVirtualColumnsOptions, type UseVirtualRowsOptions, type VirtualBinding, type VirtualColumnItem, type VirtualRowItem, type VirtualViewportOptions, injectDataGrid, injectDataTable, provideDataGrid, provideDataTable, useDataGrid, useDataTable, useVirtualColumns, useVirtualRows };
96
134
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/use-data-table.ts","../src/use-data-grid.ts","../src/injection.ts"],"mappings":";;;;UAmBiB,oBAAoB,cAAc,KACjD,aAAa;WAGJ,MAAM,0BAA0B;WAChC,SAAS,0BAA0B,UAAU;WAC7C,WAAW;;;;;WAKX,QAAQ,iBAAiB;;KAG/B,gBAAgB,QAAQ,KAAK,UAAU;;;;;;KAOhC,iBAAiB,QAAQ,cAAc,QACjD,gBAAgB;;WAEL,OAAO,UAAU;;WAEjB,UAAU,cAAc;;;;;;KAOzB,sBAAsB;;;;;iBA4ClB,aAAa,MAAM,SAAS,oBAAoB,QAAQ,iBAAiB;;;;UCzExE;WACN,UAAU;WACV;;;;;;UAOM,gBAAgB;WACtB,WAAW;WACX,OAAO;WACP,QAAQ;WACR,QAAQ,YAAY;;WAEpB,YAAY,WAAW;EAChC,OAAO,UAAU;IAAiB,KAAK,SAAS;IAAO,QAAQ,YAAY;;EAC3E,UAAU,UAAU;EACpB,WAAW,UAAU;EACrB,UAAU,UAAU;EACpB,UAAU,UAAU,cAAc;aAAqB;;EACvD,KAAK,WAAW,eAAe,UAAU;EACzC;;EAEA,UAAU;EACV,YAAY;;EAEZ,WAAW,OAAO,gBAAgB,WAAW;EAC7C;;EAEA;;EAEA,MAAM,eAAe,WAAW;EAChC,SAAS,WAAW;;EAEpB,UAAU,OAAO;;iBAGH,YAAY,MAAM,OAAO,iBAAiB,QAAQ,gBAAgB;;;;iBCpDlE,iBAAiB,MAAM,OAAO,iBAAiB;;;;;iBAQ/C,gBAAgB,gBAC9B,oBACC,iBAAiB;iBAUJ,gBAAgB,MAAM,MAAM,gBAAgB;;iBAK5C,eAAe,mBAAmB,gBAAgB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/use-data-table.ts","../src/use-data-grid.ts","../src/injection.ts","../src/use-virtual.ts"],"mappings":";;;;UAmBiB,oBAAoB,cAAc,KACjD,aAAa;WAGJ,MAAM,0BAA0B;WAChC,SAAS,0BAA0B,UAAU;WAC7C,WAAW;;;;;WAKX,QAAQ,iBAAiB;;KAG/B,gBAAgB,QAAQ,KAAK,UAAU;;;;;;KAOhC,iBAAiB,QAAQ,cAAc,QACjD,gBAAgB;;WAEL,OAAO,UAAU;;WAEjB,UAAU,cAAc;;;;;;KAOzB,sBAAsB;;;;;iBA+ClB,aAAa,MAAM,SAAS,oBAAoB,QAAQ,iBAAiB;;;;UC3ExE;WACN,UAAU;WACV;;;;;;UAOM,gBAAgB;WACtB,OAAO,iBAAiB;WACxB,WAAW;WACX,OAAO;WACP,QAAQ;WACR,QAAQ,YAAY;;WAEpB,YAAY,WAAW;EAChC,OAAO,UAAU;IAAiB,KAAK,SAAS;IAAO,QAAQ,YAAY;;EAC3E,UAAU,UAAU;EACpB,WAAW,UAAU;EACrB,UAAU,UAAU;EACpB,UAAU,UAAU,cAAc;aAAqB;;EACvD,KAAK,WAAW,eAAe,UAAU;EACzC;;EAEA,UAAU;EACV,YAAY;;EAEZ,WAAW,OAAO,gBAAgB,WAAW;EAC7C;;EAEA,KAAK,UAAU;;EAEf,MAAM,eAAe,WAAW;EAChC,SAAS,WAAW;;EAEpB,UAAU,OAAO;;iBAGH,YAAY,MAAM,OAAO,iBAAiB,QAAQ,gBAAgB;;;;iBCtDlE,iBAAiB,MAAM,OAAO,iBAAiB;;;;;iBAQ/C,gBAAgB,gBAC9B,oBACC,iBAAiB;iBAUJ,gBAAgB,MAAM,MAAM,gBAAgB;;iBAK5C,eAAe,mBAAmB,gBAAgB;;;UCPjD;WACN,eAAe,iBAAiB;WAChC;;WAEA;;UAEM,sBAAsB,cAAc;WAC1C,+BAA+B;;WAE/B,OAAO,gBAAgB;;UAEjB,iCAAiC;WACvC,iCAAiC;;UAE3B,eAAe,cAAc;WACnC,YAAY,gBAAgB;;UAEtB,kBAAkB,cAAc;WACtC,QAAQ,YAAY;;UAEd,eAAe,cAAc,qBAAqB,KAAK;WAC7D,gBAAgB;EACzB,cAAc,eAAe;aAAqB,QAAQ;;EAC1D,YAAY,KAAK,QAAQ;aAAqB,QAAQ;;;EAEtD,eAAe,SAAS,UAAU,gCAAgC,KAAK;;;iBAmNzD,eAAe,MAC7B,OAAO,iBAAiB,OACxB,SAAS,sBAAsB,QAC9B,eAAe,eAAe;;iBAoCjB,kBAAkB,MAChC,MAAM,gBAAgB,OACtB,SAAS,2BACR,eAAe,kBAAkB"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { computed, getCurrentScope, inject, onScopeDispose, provide, shallowRef, toRaw, toValue, watch } from "vue";
2
- import { clampPosition, createTable, gridCommand, moveSelection, rangeContains, selectCell, selectionRange } from "@vueye-table/core";
1
+ import { computed, getCurrentInstance, getCurrentScope, inject, onMounted, onScopeDispose, provide, shallowRef, toRaw, toValue, watch } from "vue";
2
+ import { clampPosition, createTable, createVirtualizer, getRowItemKey, gridCommand, moveSelection, rangeContains, selectCell, selectionRange } from "@vueye-table/core";
3
3
 
4
4
  //#region src/injection.ts
5
5
  const tableKey = Symbol("vueye-table");
@@ -68,6 +68,7 @@ function useDataGrid(table) {
68
68
  return selection.value;
69
69
  };
70
70
  const grid = {
71
+ table,
71
72
  get selection() {
72
73
  return selection.value;
73
74
  },
@@ -143,8 +144,8 @@ function useDataGrid(table) {
143
144
  cancelEdit() {
144
145
  editor.value = void 0;
145
146
  },
146
- copy() {
147
- return range.value ? table.copy(range.value) : "";
147
+ copy(options) {
148
+ return range.value ? table.copy(range.value, options) : "";
148
149
  },
149
150
  paste(text) {
150
151
  if (!range.value) return;
@@ -187,6 +188,205 @@ function useDataGrid(table) {
187
188
  return grid;
188
189
  }
189
190
 
191
+ //#endregion
192
+ //#region src/use-virtual.ts
193
+ function useVirtualAxis(source, keyOf, estimate, options, horizontal, project) {
194
+ let items = source();
195
+ let mounted = false;
196
+ let disposed = false;
197
+ let element;
198
+ let observer;
199
+ let detach;
200
+ const elements = /* @__PURE__ */ new Map();
201
+ const keysByElement = /* @__PURE__ */ new Map();
202
+ const requestedCount = options.initialCount ?? 10;
203
+ const initialCount = Number.isSafeInteger(requestedCount) && requestedCount >= 0 ? requestedCount : 10;
204
+ const initialIssue = initialCount === requestedCount ? void 0 : Object.freeze({
205
+ code: "invalid_virtual_option",
206
+ message: "Initial count must be a non-negative safe integer; 10 is used."
207
+ });
208
+ const layoutOptions = () => ({
209
+ count: items.length,
210
+ estimateSize: estimate,
211
+ overscan: mounted ? options.overscan : 0,
212
+ getKey: (index) => keyOf(items[index])
213
+ });
214
+ const virtual = createVirtualizer(layoutOptions());
215
+ function seed() {
216
+ let size = 0;
217
+ for (let index = 0; index < Math.min(initialCount, items.length); index += 1) {
218
+ const value = typeof estimate === "number" ? estimate : estimate(index);
219
+ size += Number.isFinite(value) && value > 0 ? value : 40;
220
+ }
221
+ virtual.setViewport(0, size);
222
+ }
223
+ seed();
224
+ const view = shallowRef(virtual.getWindow());
225
+ const projected = computed(() => Object.freeze(view.value.items.map((item) => Object.freeze(project(item, items[item.index])))));
226
+ const unsubscribe = virtual.subscribe((next) => {
227
+ view.value = next;
228
+ });
229
+ function move(offset) {
230
+ if (element) {
231
+ if (horizontal) element.scrollLeft = offset;
232
+ else element.scrollTop = offset;
233
+ }
234
+ virtual.setViewport(offset, element ? horizontal ? element.clientWidth : element.clientHeight : virtual.getWindow().viewportSize);
235
+ }
236
+ function anchor() {
237
+ const current = virtual.getWindow();
238
+ const first = current.items.find((item) => item.start + item.size > current.offset);
239
+ return first ? {
240
+ key: first.key,
241
+ inset: current.offset - first.start
242
+ } : void 0;
243
+ }
244
+ function restore(saved, fallback) {
245
+ const index = saved ? items.findIndex((item) => keyOf(item) === saved.key) : -1;
246
+ move(index >= 0 && saved ? virtual.getOffsetForIndex(index, "start") + saved.inset : fallback);
247
+ if (element) {
248
+ if (horizontal) element.scrollLeft = virtual.getWindow().offset;
249
+ else element.scrollTop = virtual.getWindow().offset;
250
+ }
251
+ }
252
+ function measure(target, key) {
253
+ const saved = anchor();
254
+ const offset = virtual.getWindow().offset;
255
+ const box = target.getBoundingClientRect();
256
+ const size = horizontal ? box.width : box.height;
257
+ if (size > 0 && Number.isFinite(size)) {
258
+ const previous = virtual.getWindow();
259
+ virtual.measure(key, size);
260
+ if (virtual.getWindow() === previous) return;
261
+ restore(saved, offset);
262
+ }
263
+ }
264
+ function readViewport() {
265
+ if (element) virtual.setViewport(horizontal ? element.scrollLeft : element.scrollTop, horizontal ? element.clientWidth : element.clientHeight);
266
+ }
267
+ const stopSource = watch(source, (next) => {
268
+ const saved = anchor();
269
+ const offset = virtual.getWindow().offset;
270
+ items = next;
271
+ virtual.setOptions(layoutOptions());
272
+ if (mounted) restore(saved, offset);
273
+ else seed();
274
+ }, { flush: "sync" });
275
+ let stopElement;
276
+ if (getCurrentInstance()) onMounted(() => {
277
+ mounted = true;
278
+ virtual.setOptions(layoutOptions());
279
+ stopElement = watch(() => toValue(options.scrollElement), (next) => {
280
+ detach?.();
281
+ observer?.disconnect();
282
+ observer = void 0;
283
+ element = next;
284
+ if (!next) {
285
+ seed();
286
+ return;
287
+ }
288
+ const owner = next.ownerDocument.defaultView;
289
+ const Observer = owner?.ResizeObserver;
290
+ if (Observer) {
291
+ observer = new Observer((entries) => {
292
+ for (const entry of entries) if (entry.target === element) readViewport();
293
+ else {
294
+ const key = keysByElement.get(entry.target);
295
+ if (key !== void 0) measure(entry.target, key);
296
+ }
297
+ });
298
+ observer.observe(next);
299
+ for (const target of elements.values()) observer.observe(target);
300
+ } else owner?.addEventListener("resize", readViewport);
301
+ next.addEventListener("scroll", readViewport, { passive: true });
302
+ detach = () => {
303
+ next.removeEventListener("scroll", readViewport);
304
+ owner?.removeEventListener("resize", readViewport);
305
+ };
306
+ readViewport();
307
+ for (const [key, target] of elements) measure(target, key);
308
+ }, {
309
+ immediate: true,
310
+ flush: "post"
311
+ });
312
+ });
313
+ if (getCurrentScope()) onScopeDispose(() => {
314
+ disposed = true;
315
+ stopSource();
316
+ stopElement?.();
317
+ detach?.();
318
+ observer?.disconnect();
319
+ unsubscribe();
320
+ elements.clear();
321
+ keysByElement.clear();
322
+ element = void 0;
323
+ });
324
+ const binding = {
325
+ scrollToIndex(index, { align = "auto" } = {}) {
326
+ move(virtual.getOffsetForIndex(index, align));
327
+ },
328
+ scrollToKey(key, align) {
329
+ const index = items.findIndex((item) => keyOf(item) === key);
330
+ if (index >= 0) binding.scrollToIndex(index, align);
331
+ },
332
+ measureElement(target, key) {
333
+ if (disposed) return;
334
+ const previous = elements.get(key);
335
+ if (previous === target) return;
336
+ if (previous) {
337
+ observer?.unobserve(previous);
338
+ keysByElement.delete(previous);
339
+ elements.delete(key);
340
+ }
341
+ if (!target || !("getBoundingClientRect" in target)) return;
342
+ elements.set(key, target);
343
+ keysByElement.set(target, key);
344
+ if (mounted) {
345
+ observer?.observe(target);
346
+ measure(target, key);
347
+ }
348
+ }
349
+ };
350
+ for (const key of Object.keys(view.value)) Object.defineProperty(binding, key, {
351
+ enumerable: true,
352
+ get: () => key === "items" ? projected.value : key === "issues" && initialIssue ? Object.freeze([...view.value.issues, initialIssue]) : view.value[key]
353
+ });
354
+ return Object.freeze(binding);
355
+ }
356
+ /** Virtualize data and detail render items. scrollToKey accepts the parent data-row key. */
357
+ function useVirtualRows(table, options) {
358
+ const virtual = useVirtualAxis(() => table.renderItems, (item) => item.key, options.estimateRowHeight ?? 40, options, false, (item, renderItem) => ({
359
+ ...item,
360
+ renderItem
361
+ }));
362
+ const stopFocus = watch(() => options.grid?.selection?.focus.row, (row) => {
363
+ if (row === void 0) return;
364
+ const index = table.renderItems.findIndex((item) => item.kind === "row" && item.rowIndex === row);
365
+ if (index >= 0) virtual.scrollToIndex(index);
366
+ }, { flush: "sync" });
367
+ if (getCurrentScope()) onScopeDispose(stopFocus);
368
+ const binding = Object.defineProperties({}, {
369
+ ...Object.getOwnPropertyDescriptors(virtual),
370
+ scrollToKey: {
371
+ enumerable: true,
372
+ value: (key, align) => virtual.scrollToKey(getRowItemKey(key), align)
373
+ }
374
+ });
375
+ return Object.freeze(binding);
376
+ }
377
+ /** Virtualize visible columns and bring the active logical column into view. */
378
+ function useVirtualColumns(grid, options) {
379
+ const virtual = useVirtualAxis(() => grid.table.columns, (column) => column.id, options.estimateColumnWidth ?? 120, options, true, (item, column) => ({
380
+ ...item,
381
+ column
382
+ }));
383
+ const stopFocus = watch(() => grid.selection?.focus.column, (column) => {
384
+ if (column !== void 0) virtual.scrollToIndex(column);
385
+ }, { flush: "sync" });
386
+ if (getCurrentScope()) onScopeDispose(stopFocus);
387
+ return virtual;
388
+ }
389
+
190
390
  //#endregion
191
391
  //#region src/use-data-table.ts
192
392
  const OPERATIONS = [
@@ -210,6 +410,9 @@ const OPERATIONS = [
210
410
  "toggleAll",
211
411
  "clearSelection",
212
412
  "getSelectedRows",
413
+ "toggleExpanded",
414
+ "expandAll",
415
+ "collapseAll",
213
416
  "toggleColumn",
214
417
  "moveColumn",
215
418
  "edit",
@@ -273,5 +476,5 @@ function useDataTable(options) {
273
476
  }
274
477
 
275
478
  //#endregion
276
- export { injectDataGrid, injectDataTable, provideDataGrid, provideDataTable, useDataGrid, useDataTable };
479
+ export { injectDataGrid, injectDataTable, provideDataGrid, provideDataTable, useDataGrid, useDataTable, useVirtualColumns, useVirtualRows };
277
480
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/injection.ts","../src/use-data-grid.ts","../src/use-data-table.ts"],"sourcesContent":["import { 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","import {\n clampPosition,\n gridCommand,\n moveSelection,\n rangeContains,\n selectCell,\n selectionRange,\n type CellPosition,\n type CellRange,\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} from \"@vueye-table/core\";\nimport { computed, shallowRef, watch, type ComputedRef } from \"vue\";\n\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 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 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 cancelEdit(): void;\n /** The selected range as tab-separated text. */\n copy(): 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 function useDataGrid<TRow>(table: DataTableBinding<TRow>): DataGridBinding<TRow> {\n const selection = shallowRef<GridSelection | undefined>();\n const editor = shallowRef<GridEditor | undefined>();\n const lastResult = shallowRef<EditResult<TRow> | undefined>();\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(bounds, (next) => {\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 position = editor.value?.position;\n if (position && (position.row >= next.rows || position.column >= next.columns)) {\n editor.value = undefined;\n }\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 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 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 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 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 editor.value = { position: focus, draft: initial ?? cell.row.getDisplay(cell.column.id) };\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 cell = cellAt(current.position);\n editor.value = undefined;\n if (!cell) {\n return undefined;\n }\n const result = table.edit({\n rowKey: cell.row.key,\n column: cell.column.id,\n input: current.draft,\n });\n lastResult.value = result;\n if (then) {\n grid.move(then);\n }\n return result;\n },\n cancelEdit() {\n editor.value = undefined;\n },\n copy() {\n return range.value ? table.copy(range.value) : \"\";\n },\n paste(text) {\n if (!range.value) {\n return undefined;\n }\n const result = table.paste({ row: range.value.top, column: range.value.left }, text);\n lastResult.value = result;\n return result;\n },\n clear() {\n if (!range.value) {\n return undefined;\n }\n const result = table.clear(range.value);\n lastResult.value = result;\n return result;\n },\n handleKey(event) {\n if (editor.value) {\n return false;\n }\n const command = gridCommand(event);\n switch (command?.type) {\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 createTable,\n type ColumnDef,\n type DataTable,\n type TableOptions,\n type TableSnapshot,\n type TableStatePatch,\n} from \"@vueye-table/core\";\nimport {\n getCurrentScope,\n onScopeDispose,\n shallowRef,\n toRaw,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from \"vue\";\n\n/** Options accepted by {@link useDataTable}. Data, columns, and state may be refs or getters. */\nexport interface UseDataTableOptions<TRow> extends Omit<\n TableOptions<TRow>,\n \"data\" | \"columns\" | \"rowCount\"\n> {\n readonly data: MaybeRefOrGetter<readonly TRow[]>;\n readonly columns: MaybeRefOrGetter<readonly ColumnDef<TRow>[]>;\n readonly rowCount?: MaybeRefOrGetter<number | 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 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 };\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 \"setState\",\n \"setData\",\n \"setColumns\",\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 \"toggleColumn\",\n \"moveColumn\",\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> {\n const table = createTable<TRow>({\n ...options,\n data: toRaw(toValue(options.data)),\n columns: toValue(options.columns),\n rowCount: toValue(options.rowCount),\n initialState: { ...options.initialState, ...definedEntries(toValue(options.state)) },\n });\n const snapshot = shallowRef(table.getSnapshot());\n const unsubscribe = table.subscribe((next) => {\n snapshot.value = next;\n });\n\n const stops = [\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)),\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 if (getCurrentScope()) {\n onScopeDispose(() => {\n for (const stop of stops) {\n stop();\n }\n unsubscribe();\n table.destroy();\n });\n }\n\n const binding = { table } as Record<string, unknown>;\n Object.defineProperty(binding, \"snapshot\", { enumerable: true, get: () => snapshot.value });\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 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/use-data-grid.ts","../src/use-virtual.ts","../src/use-data-table.ts"],"sourcesContent":["import { 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","import {\n clampPosition,\n gridCommand,\n moveSelection,\n rangeContains,\n selectCell,\n selectionRange,\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} from \"@vueye-table/core\";\nimport { computed, shallowRef, watch, type ComputedRef } from \"vue\";\n\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 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 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 function useDataGrid<TRow>(table: DataTableBinding<TRow>): DataGridBinding<TRow> {\n const selection = shallowRef<GridSelection | undefined>();\n const editor = shallowRef<GridEditor | undefined>();\n const lastResult = shallowRef<EditResult<TRow> | undefined>();\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(bounds, (next) => {\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 position = editor.value?.position;\n if (position && (position.row >= next.rows || position.column >= next.columns)) {\n editor.value = undefined;\n }\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 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 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 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 editor.value = { position: focus, draft: initial ?? cell.row.getDisplay(cell.column.id) };\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 cell = cellAt(current.position);\n editor.value = undefined;\n if (!cell) {\n return undefined;\n }\n const result = table.edit({\n rowKey: cell.row.key,\n column: cell.column.id,\n input: current.draft,\n });\n lastResult.value = result;\n if (then) {\n grid.move(then);\n }\n return result;\n },\n cancelEdit() {\n editor.value = undefined;\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 = table.paste({ row: range.value.top, column: range.value.left }, text);\n lastResult.value = result;\n return result;\n },\n clear() {\n if (!range.value) {\n return undefined;\n }\n const result = table.clear(range.value);\n lastResult.value = result;\n return result;\n },\n handleKey(event) {\n if (editor.value) {\n return false;\n }\n const command = gridCommand(event);\n switch (command?.type) {\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 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}\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 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 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): VirtualBinding<TItem> {\n let items = source();\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: estimate,\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 estimate === \"number\" ? estimate : estimate(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\n function move(offset: number): void {\n if (element) {\n if (horizontal) element.scrollLeft = offset;\n else element.scrollTop = offset;\n }\n virtual.setViewport(\n offset,\n element\n ? horizontal\n ? element.clientWidth\n : element.clientHeight\n : virtual.getWindow().viewportSize,\n );\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 if (horizontal) element.scrollLeft = virtual.getWindow().offset;\n else element.scrollTop = virtual.getWindow().offset;\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 horizontal ? element.scrollLeft : element.scrollTop,\n horizontal ? element.clientWidth : element.clientHeight,\n );\n }\n const stopSource = watch(\n source,\n (next) => {\n const saved = anchor();\n const offset = virtual.getWindow().offset;\n items = next;\n virtual.setOptions(layoutOptions());\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 element = undefined;\n });\n const binding = {\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 measure(target, key);\n }\n },\n } as Record<string, unknown> &\n Pick<VirtualBinding<TItem>, \"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\n ? Object.freeze([...view.value.issues, initialIssue])\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 index = table.renderItems.findIndex(\n (item) => item.kind === \"row\" && item.rowIndex === row,\n );\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 );\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 {\n createTable,\n type ColumnDef,\n type DataTable,\n type TableOptions,\n type TableSnapshot,\n type TableStatePatch,\n} from \"@vueye-table/core\";\nimport {\n getCurrentScope,\n onScopeDispose,\n shallowRef,\n toRaw,\n toValue,\n watch,\n type MaybeRefOrGetter,\n} from \"vue\";\n\n/** Options accepted by {@link useDataTable}. Data, columns, and state may be refs or getters. */\nexport interface UseDataTableOptions<TRow> extends Omit<\n TableOptions<TRow>,\n \"data\" | \"columns\" | \"rowCount\"\n> {\n readonly data: MaybeRefOrGetter<readonly TRow[]>;\n readonly columns: MaybeRefOrGetter<readonly ColumnDef<TRow>[]>;\n readonly rowCount?: MaybeRefOrGetter<number | 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 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 };\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 \"setState\",\n \"setData\",\n \"setColumns\",\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 \"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> {\n const table = createTable<TRow>({\n ...options,\n data: toRaw(toValue(options.data)),\n columns: toValue(options.columns),\n rowCount: toValue(options.rowCount),\n initialState: { ...options.initialState, ...definedEntries(toValue(options.state)) },\n });\n const snapshot = shallowRef(table.getSnapshot());\n const unsubscribe = table.subscribe((next) => {\n snapshot.value = next;\n });\n\n const stops = [\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)),\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 if (getCurrentScope()) {\n onScopeDispose(() => {\n for (const stop of stops) {\n stop();\n }\n unsubscribe();\n table.destroy();\n });\n }\n\n const binding = { table } as Record<string, unknown>;\n Object.defineProperty(binding, \"snapshot\", { enumerable: true, get: () => snapshot.value });\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 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-alpha.1",
3
+ "version": "3.0.0-alpha.2",
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-alpha.1"
41
+ "@vueye-table/core": "3.0.0-alpha.2"
42
42
  },
43
43
  "devDependencies": {
44
44
  "vue": "3.5.43",