@atscript/vue-table 0.1.140 → 0.1.142

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/as-action-form-dialog.cjs +1 -1
  2. package/dist/as-action-form-dialog.mjs +1 -1
  3. package/dist/{as-action-menu-content-B5RFt7Hc.cjs → as-action-menu-content-BaNFBYn3.cjs} +1 -1
  4. package/dist/{as-action-menu-content-KNJr1EkO.mjs → as-action-menu-content-miQYVP7x.mjs} +1 -1
  5. package/dist/as-column-menu.d.cts +1 -1
  6. package/dist/as-column-menu.d.mts +1 -1
  7. package/dist/{as-column-menu.vue-DKQNY5gh.d.cts → as-column-menu.vue-Ca3wSDxw.d.mts} +2 -2
  8. package/dist/{as-column-menu.vue-hOmuVcKf.d.mts → as-column-menu.vue-Co7FtiEM.d.cts} +2 -2
  9. package/dist/{as-config-dialog-B1KJJSHE.cjs → as-config-dialog-CVSOrS9O.cjs} +2 -2
  10. package/dist/{as-config-dialog-JXNkCCrh.mjs → as-config-dialog-Di02V3bs.mjs} +2 -2
  11. package/dist/as-config-dialog.cjs +1 -1
  12. package/dist/as-config-dialog.mjs +1 -1
  13. package/dist/{as-confirm-dialog-CC6U8nLZ.mjs → as-confirm-dialog-C9Qat2rG.mjs} +1 -1
  14. package/dist/{as-confirm-dialog-a736BLOm.cjs → as-confirm-dialog-fCwo1ty9.cjs} +1 -1
  15. package/dist/as-confirm-dialog.cjs +1 -1
  16. package/dist/as-confirm-dialog.mjs +1 -1
  17. package/dist/{as-filter-dialog-IflKkOd8.cjs → as-filter-dialog-DYpbsNDx.cjs} +7 -7
  18. package/dist/{as-filter-dialog-C3wltqrN.mjs → as-filter-dialog-DdtrTT5w.mjs} +7 -7
  19. package/dist/as-filter-dialog.cjs +1 -1
  20. package/dist/as-filter-dialog.mjs +1 -1
  21. package/dist/{as-filter-field-pygBjA-K.cjs → as-filter-field-4-qFRsJx.cjs} +8 -10
  22. package/dist/{as-filter-field-D_6DlFcp.mjs → as-filter-field-DEQVodKG.mjs} +8 -10
  23. package/dist/as-filter-field.cjs +1 -1
  24. package/dist/as-filter-field.mjs +1 -1
  25. package/dist/{as-filters-BIoEsPD0.cjs → as-filters-C6ZkLrf4.cjs} +68 -25
  26. package/dist/{as-filters-BDzQ2SM_.mjs → as-filters-Dd_j6_6G.mjs} +69 -26
  27. package/dist/as-filters.cjs +1 -1
  28. package/dist/as-filters.d.cts +1 -1
  29. package/dist/as-filters.d.mts +1 -1
  30. package/dist/as-filters.mjs +1 -1
  31. package/dist/{as-filters.vue-BSgUEh4D.d.mts → as-filters.vue-dHbGmcbr.d.mts} +56 -4
  32. package/dist/{as-filters.vue-DMXZhQW3.d.cts → as-filters.vue-vH1FHn9L.d.cts} +56 -4
  33. package/dist/{as-preset-dialog-D_w4cxKS.mjs → as-preset-dialog-Bap48oUv.mjs} +1 -1
  34. package/dist/{as-preset-dialog-BgZB8xyk.cjs → as-preset-dialog-SYA-6lGR.cjs} +1 -1
  35. package/dist/as-preset-dialog.cjs +1 -1
  36. package/dist/as-preset-dialog.mjs +1 -1
  37. package/dist/{as-preset-picker-XnGrqHyF.cjs → as-preset-picker-BdKTZa95.cjs} +27 -21
  38. package/dist/{as-preset-picker-B8d6l3U1.mjs → as-preset-picker-NBrvsE6s.mjs} +27 -21
  39. package/dist/as-preset-picker.cjs +1 -1
  40. package/dist/as-preset-picker.mjs +1 -1
  41. package/dist/{as-residual-filter-C65QsWxr.mjs → as-residual-filter-BFnbI3h3.mjs} +1 -1
  42. package/dist/{as-residual-filter-ihvXCtpH.cjs → as-residual-filter-CZ-Bytdj.cjs} +1 -1
  43. package/dist/as-residual-filter.cjs +1 -1
  44. package/dist/as-residual-filter.mjs +1 -1
  45. package/dist/{as-row-actions-C6N0lcZb.cjs → as-row-actions-C3xHkX53.cjs} +2 -2
  46. package/dist/{as-row-actions-xQ9M1PrO.mjs → as-row-actions-KeoHo9Ex.mjs} +2 -2
  47. package/dist/as-row-actions.cjs +1 -1
  48. package/dist/as-row-actions.d.cts +1 -1
  49. package/dist/as-row-actions.d.mts +1 -1
  50. package/dist/as-row-actions.mjs +1 -1
  51. package/dist/{as-row-actions.vue-C8vslg0n.d.mts → as-row-actions.vue-D3_z3ytk.d.cts} +1 -1
  52. package/dist/{as-row-actions.vue-B3XAxDAL.d.cts → as-row-actions.vue-nmaDuxBT.d.mts} +1 -1
  53. package/dist/{as-table-status-2rA91OFT.mjs → as-select-cell-KD_ns8DS.mjs} +149 -36
  54. package/dist/{as-table-status-UWTPJJUL.cjs → as-select-cell-XnzNuW2v.cjs} +154 -35
  55. package/dist/{as-table-B49x0hDM.mjs → as-table-NHqyekNd.mjs} +10 -11
  56. package/dist/{as-table-actions-B2Hy3h7v.mjs → as-table-actions-BpEFcsgh.mjs} +2 -2
  57. package/dist/{as-table-actions-B-jY3s6f.cjs → as-table-actions-UQmFtRdJ.cjs} +2 -2
  58. package/dist/as-table-actions.cjs +1 -1
  59. package/dist/as-table-actions.d.cts +1 -1
  60. package/dist/as-table-actions.d.mts +1 -1
  61. package/dist/as-table-actions.mjs +1 -1
  62. package/dist/{as-table-actions.vue-BgTJuXEH.d.cts → as-table-actions.vue-BG3JVaBQ.d.mts} +1 -1
  63. package/dist/{as-table-actions.vue-BnLH2NqO.d.mts → as-table-actions.vue-DcuzNZoC.d.cts} +1 -1
  64. package/dist/{as-table-ouPxssqv.cjs → as-table-ay1yel3u.cjs} +10 -11
  65. package/dist/{as-table-base-DErJfFYz.mjs → as-table-base-89DkDZ-1.mjs} +46 -60
  66. package/dist/{as-table-base-ceywcVRq.cjs → as-table-base-umzg4PBR.cjs} +51 -65
  67. package/dist/{as-table-header-cell-Ccf06b2_.mjs → as-table-header-cell-DU3ws2x9.mjs} +1 -1
  68. package/dist/{as-table-header-cell-ZCk3XD_d.cjs → as-table-header-cell-f3YpgJX1.cjs} +1 -1
  69. package/dist/as-table-header-cell.cjs +1 -1
  70. package/dist/as-table-header-cell.d.cts +1 -1
  71. package/dist/as-table-header-cell.d.mts +1 -1
  72. package/dist/as-table-header-cell.mjs +1 -1
  73. package/dist/{as-table-header-cell.vue-C7jNmdDh.d.mts → as-table-header-cell.vue-5VGRc23o.d.mts} +1 -1
  74. package/dist/{as-table-header-cell.vue-DkClJBAT.d.cts → as-table-header-cell.vue-XR90UlHO.d.cts} +1 -1
  75. package/dist/{as-table-root-CG7bLzcQ.mjs → as-table-root-47hiBEnq.mjs} +8 -5
  76. package/dist/{as-table-root-_58hdHAi.cjs → as-table-root-DDeGktcl.cjs} +8 -5
  77. package/dist/as-table-root.cjs +1 -1
  78. package/dist/as-table-root.d.cts +1 -1
  79. package/dist/as-table-root.d.mts +1 -1
  80. package/dist/as-table-root.mjs +1 -1
  81. package/dist/{as-table-root.vue-DpPRMy3v.d.mts → as-table-root.vue-BGx453_Q.d.mts} +30 -4
  82. package/dist/{as-table-root.vue-D8hH1xGK.d.cts → as-table-root.vue-yZ7ZcwdT.d.cts} +32 -6
  83. package/dist/as-table.cjs +1 -1
  84. package/dist/as-table.d.cts +1 -1
  85. package/dist/as-table.d.mts +1 -1
  86. package/dist/as-table.mjs +1 -1
  87. package/dist/{as-table.vue-CudFoZTF.d.mts → as-table.vue-CwI5Z0y5.d.cts} +13 -11
  88. package/dist/{as-table.vue-Bv6sKnL5.d.cts → as-table.vue-wdFf4hMW.d.mts} +13 -11
  89. package/dist/{as-window-table-KyS6YUpa.mjs → as-window-table-C312T_bc.mjs} +83 -62
  90. package/dist/{as-window-table-C9YtzepV.cjs → as-window-table-hOYLNhX3.cjs} +89 -68
  91. package/dist/as-window-table.cjs +1 -1
  92. package/dist/as-window-table.d.cts +1 -1
  93. package/dist/as-window-table.d.mts +1 -1
  94. package/dist/as-window-table.mjs +1 -1
  95. package/dist/{as-window-table.vue-COVl3die.d.mts → as-window-table.vue-D6UDA6td.d.cts} +9 -7
  96. package/dist/{as-window-table.vue-CRWdhOgC.d.cts → as-window-table.vue-Deg1mj3t.d.mts} +9 -7
  97. package/dist/index.cjs +18 -18
  98. package/dist/index.d.cts +10 -10
  99. package/dist/index.d.mts +10 -10
  100. package/dist/index.mjs +18 -18
  101. package/dist/{types-BCixOa8x.d.cts → types-BU7J-a1r.d.mts} +79 -10
  102. package/dist/{types-D7qVxU_y.d.mts → types-D4dK49sA.d.cts} +79 -10
  103. package/dist/{use-table-2xPxoNRX.mjs → use-table-DlqGHjPh.mjs} +3 -2
  104. package/dist/{use-table-column-handlers-p_xK-l0e.mjs → use-table-column-handlers-0myVzrZR.mjs} +1 -1
  105. package/dist/{use-table-column-handlers-rqFo9HLz.cjs → use-table-column-handlers-BHMCo_HR.cjs} +1 -1
  106. package/dist/{use-table-component-XQ-Qt_sp.cjs → use-table-component-IziAm0vk.cjs} +1 -1
  107. package/dist/{use-table-component-BYO0zMQj.mjs → use-table-component-TLwFq4rx.mjs} +1 -1
  108. package/dist/{use-table-nav-bridge-BDBnRc4C.mjs → use-table-nav-bridge-CkQqimdS.mjs} +1 -1
  109. package/dist/{use-table-nav-bridge-DvrsPanF.cjs → use-table-nav-bridge-QU4jKhqx.cjs} +1 -1
  110. package/dist/{use-table-state-pF_9gnTG.cjs → use-table-state-BiklfjP0.cjs} +243 -45
  111. package/dist/{use-table-state-BzjbnpBA.mjs → use-table-state-Cq-3tbVr.mjs} +227 -47
  112. package/dist/{use-table-B45WZLwg.cjs → use-table-yZNJTfRq.cjs} +3 -2
  113. package/package.json +9 -9
@@ -1,11 +1,11 @@
1
- import { a as useTableContext, i as useRegisterMainActionListener, m as onSelectControlKeydown } from "./use-table-state-BzjbnpBA.mjs";
1
+ import { _ as toSelectAllState, a as useTableContext, i as useRegisterMainActionListener } from "./use-table-state-Cq-3tbVr.mjs";
2
2
  import { t as getCellValue } from "./get-cell-value-Cb3X8nUn.mjs";
3
3
  import { t as useSelectModeReset } from "./use-table-selection-ULbKT2xW.mjs";
4
4
  import { t as useHasEmitListener } from "./use-has-emit-listener-DrBbsLHQ.mjs";
5
- import { n as useRowActionsColumn, t as useTableColumnHandlers } from "./use-table-column-handlers-p_xK-l0e.mjs";
6
- import { a as useCellComponents, i as useRafBatch, n as as_table_header_default, o as useCellResolver, r as as_table_colgroup_default, t as as_table_status_default } from "./as-table-status-2rA91OFT.mjs";
5
+ import { n as useRowActionsColumn, t as useTableColumnHandlers } from "./use-table-column-handlers-0myVzrZR.mjs";
6
+ import { a as useRafBatch, i as as_table_colgroup_default, n as as_table_status_default, o as useCellComponents, r as as_table_header_default, s as useCellResolver, t as as_select_cell_default } from "./as-select-cell-KD_ns8DS.mjs";
7
7
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createVNode, defineComponent, guardReactiveProps, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, unref, useSlots, watch, withCtx, withModifiers } from "vue";
8
- import { DEFAULT_ROW_HEIGHT_PX, clampTopIndex, filledFilterCount } from "@atscript/ui-table";
8
+ import { DEFAULT_ROW_HEIGHT_PX, clampTopIndex, filledFilterCount, rowsToPks } from "@atscript/ui-table";
9
9
  import { useElementSize, useResizeObserver } from "@vueuse/core";
10
10
  //#region src/components/internal/as-window-skeleton-row.vue?vue&type=script&setup=true&lang.ts
11
11
  const _hoisted_1$3 = {
@@ -182,24 +182,6 @@ const _hoisted_4 = [
182
182
  "onDblclick"
183
183
  ];
184
184
  const _hoisted_5 = {
185
- key: 0,
186
- class: "as-td-select",
187
- role: "gridcell"
188
- };
189
- const _hoisted_6 = [
190
- "tabindex",
191
- "aria-label",
192
- "title",
193
- "aria-checked",
194
- "aria-disabled",
195
- "onKeydown"
196
- ];
197
- const _hoisted_7 = {
198
- key: 0,
199
- class: "as-table-checkbox-tick",
200
- "aria-hidden": "true"
201
- };
202
- const _hoisted_8 = {
203
185
  key: 0,
204
186
  role: "gridcell"
205
187
  };
@@ -245,6 +227,11 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
245
227
  required: false,
246
228
  default: "none"
247
229
  },
230
+ selectOn: {
231
+ type: String,
232
+ required: false,
233
+ default: "row"
234
+ },
248
235
  enterAction: {
249
236
  type: String,
250
237
  required: false
@@ -282,9 +269,35 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
282
269
  } : c));
283
270
  const hasValue = computed(() => props.select !== "none");
284
271
  const hasActiveFilters = computed(() => filledFilterCount(state.filters.value) > 0);
272
+ /**
273
+ * Every row of the dataset, in order — or `null` while any is not loaded.
274
+ * The header checkbox exists only when this is known: acting on whatever
275
+ * blocks happen to be cached would pick rows the user never saw, so a
276
+ * partially loaded dataset gets no select-all control at all.
277
+ */
278
+ const allLoadedRows = computed(() => {
279
+ if (props.select !== "multi") return null;
280
+ const total = state.totalCount.value;
281
+ const cache = state.windowCache.value;
282
+ if (total <= 0 || cache.size < total) return null;
283
+ const rows = [];
284
+ for (let i = 0; i < total; i++) {
285
+ const row = cache.get(i);
286
+ if (row === void 0) return null;
287
+ rows.push(row);
288
+ }
289
+ return rows;
290
+ });
291
+ const eligibleLoadedPks = computed(() => {
292
+ const rows = allLoadedRows.value;
293
+ return rows ? new Set(rowsToPks(state.selectableRows(rows), state.rowValueFn)) : null;
294
+ });
285
295
  const selectAllState = computed(() => {
286
- if (props.select !== "multi") return void 0;
287
- return state.selectedRows.value.length === 0 ? "none" : "some";
296
+ const eligible = eligibleLoadedPks.value;
297
+ if (!eligible) return void 0;
298
+ let selected = 0;
299
+ for (const pk of state.selectedRows.value) if (eligible.has(pk)) selected++;
300
+ return toSelectAllState(selected, eligible.size);
288
301
  });
289
302
  const cellSlotFlags = computed(() => {
290
303
  const out = {};
@@ -294,11 +307,6 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
294
307
  const rowStyle = computed(() => ({ height: `${props.rowHeight}px` }));
295
308
  /** Shared "selectable" verdict — frozen, so a hookless pool allocates nothing. */
296
309
  const SELECTABLE = Object.freeze({ ok: true });
297
- /** Accessible name for a row's selection control, carrying the disabled reason. */
298
- function selectLabel(verdict) {
299
- if (verdict.ok) return "Select row";
300
- return verdict.reason ? `Select row, ${verdict.reason}` : "Select row, not selectable";
301
- }
302
310
  const visibleSlots = computed(() => {
303
311
  const viewport = state.viewportRowCount.value;
304
312
  if (viewport <= 0) return [];
@@ -332,6 +340,7 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
332
340
  }
333
341
  out.push({
334
342
  s,
343
+ abs,
335
344
  row,
336
345
  pk,
337
346
  errored: row === void 0 && state.errorAt(abs) !== null,
@@ -375,9 +384,6 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
375
384
  mode: props.select
376
385
  });
377
386
  }
378
- function onSelectCellKeydown(event, absIdx) {
379
- onSelectControlKeydown(event, absIdx, props.select, state);
380
- }
381
387
  watch([() => state.activeIndex.value, () => state.viewportRowCount.value], ([idx, viewport]) => {
382
388
  if (idx < 0) return;
383
389
  if (viewport <= 0) return;
@@ -407,7 +413,7 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
407
413
  function onRowClick(row, event, absIdx) {
408
414
  emit("row-click", row, event);
409
415
  state.setActive(absIdx);
410
- if (props.select === "none") return;
416
+ if (props.select === "none" || props.selectOn === "control") return;
411
417
  state.toggleActiveSelection(props.select);
412
418
  }
413
419
  function onRowDblClick(row, event, absIdx) {
@@ -415,13 +421,9 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
415
421
  state.setActive(absIdx);
416
422
  state.requestMainAction(event);
417
423
  }
418
- function onSelectAllToggle(headerState) {
419
- if (headerState !== "none") {
420
- state.selectedRows.value = [];
421
- return;
422
- }
423
- const entries = [...state.windowCache.value.entries()].toSorted((a, b) => a[0] - b[0]);
424
- state.selectAll(entries.map((e) => e[1]), (i) => entries[i][0]);
424
+ function onToggleAll() {
425
+ const rows = allLoadedRows.value;
426
+ if (rows) state.toggleAll(rows);
425
427
  }
426
428
  const { onSort, onHide, onFilter, onFiltersOff, onResetWidth, onReorder, onClearFilters } = useTableColumnHandlers(state);
427
429
  const wrapperRef = ref(null);
@@ -496,6 +498,7 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
496
498
  "column-min-width": __props.columnMinWidth,
497
499
  "has-select-column": hasValue.value,
498
500
  "select-all-state": selectAllState.value,
501
+ "selected-count": unref(state).selectedCount.value,
499
502
  "with-filler": true,
500
503
  "enable-auto-fit": true,
501
504
  "aria-rowindex": 1,
@@ -506,8 +509,11 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
506
509
  onResetWidth: unref(onResetWidth),
507
510
  onReorder: unref(onReorder),
508
511
  onResize: unref(state).setColumnWidth,
509
- onSelectAllToggle
510
- }, createSlots({ _: 2 }, [renderList(columns.value, (col) => {
512
+ onToggleAll
513
+ }, createSlots({
514
+ "header-__select": withCtx((scope) => [renderSlot(_ctx.$slots, "header-__select", normalizeProps(guardReactiveProps(scope)))]),
515
+ _: 2
516
+ }, [renderList(columns.value, (col) => {
511
517
  return {
512
518
  name: `header-${col.path}`,
513
519
  fn: withCtx((scope) => [renderSlot(_ctx.$slots, `header-${col.path}`, normalizeProps(guardReactiveProps(scope)))])
@@ -523,6 +529,7 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
523
529
  "column-min-width",
524
530
  "has-select-column",
525
531
  "select-all-state",
532
+ "selected-count",
526
533
  "onSort",
527
534
  "onHide",
528
535
  "onFilter",
@@ -547,35 +554,42 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
547
554
  key: 0,
548
555
  ref_for: true
549
556
  }, slot.attrs, {
550
- id: unref(state).rowId(unref(state).topIndex.value + slot.s),
557
+ id: unref(state).rowId(slot.abs),
551
558
  class: [
552
559
  "as-window-data-row",
553
- { "as-table-row-active": unref(state).activeIndex.value === unref(state).topIndex.value + slot.s },
560
+ { "as-table-row-active": unref(state).activeIndex.value === slot.abs },
554
561
  slot.cls
555
562
  ],
556
563
  "data-selectable": slot.selectable.ok ? void 0 : "false",
557
564
  role: "row",
558
- "aria-rowindex": unref(state).topIndex.value + slot.s + 2,
565
+ "aria-rowindex": slot.abs + 2,
559
566
  "aria-selected": slot.ariaSelected,
560
567
  style: rowStyle.value,
561
- onClick: ($event) => onRowClick(slot.row, $event, unref(state).topIndex.value + slot.s),
562
- onDblclick: ($event) => onRowDblClick(slot.row, $event, unref(state).topIndex.value + slot.s)
568
+ onClick: ($event) => onRowClick(slot.row, $event, slot.abs),
569
+ onDblclick: ($event) => onRowDblClick(slot.row, $event, slot.abs)
563
570
  }), [
564
- hasValue.value ? (openBlock(), createElementBlock("td", _hoisted_5, [createElementVNode("span", {
565
- class: normalizeClass(["as-table-checkbox", {
566
- "as-table-checkbox-checked": slot.selected,
567
- "as-table-checkbox-disabled": !slot.selectable.ok
568
- }]),
569
- role: "checkbox",
570
- tabindex: slot.selectable.ok ? 0 : void 0,
571
- "aria-label": selectLabel(slot.selectable),
572
- title: slot.selectable.reason,
573
- "aria-checked": slot.selected ? "true" : "false",
574
- "aria-disabled": slot.selectable.ok ? void 0 : "true",
575
- onKeydown: ($event) => onSelectCellKeydown($event, unref(state).topIndex.value + slot.s)
576
- }, [slot.selected ? (openBlock(), createElementBlock("span", _hoisted_7)) : createCommentVNode("v-if", true)], 42, _hoisted_6)])) : createCommentVNode("v-if", true),
571
+ hasValue.value ? (openBlock(), createBlock(as_select_cell_default, {
572
+ key: 0,
573
+ row: slot.row,
574
+ index: slot.abs,
575
+ selected: slot.selected,
576
+ verdict: slot.selectable,
577
+ select: __props.select,
578
+ "select-on": __props.selectOn
579
+ }, createSlots({ _: 2 }, [unref(slots)["cell-__select"] ? {
580
+ name: "default",
581
+ fn: withCtx((scope) => [renderSlot(_ctx.$slots, "cell-__select", mergeProps({ ref_for: true }, scope))]),
582
+ key: "0"
583
+ } : void 0]), 1032, [
584
+ "row",
585
+ "index",
586
+ "selected",
587
+ "verdict",
588
+ "select",
589
+ "select-on"
590
+ ])) : createCommentVNode("v-if", true),
577
591
  unref(hasAnyCellBindings) ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(columns.value, (col) => {
578
- return openBlock(), createElementBlock(Fragment, { key: col.path }, [(openBlock(true), createElementBlock(Fragment, null, renderList([unref(cellResolver)(col, slot.row, unref(state).topIndex.value + slot.s)], (bindings) => {
592
+ return openBlock(), createElementBlock(Fragment, { key: col.path }, [(openBlock(true), createElementBlock(Fragment, null, renderList([unref(cellResolver)(col, slot.row, slot.abs)], (bindings) => {
579
593
  return openBlock(), createElementBlock(Fragment, { key: 0 }, [cellSlotFlags.value[col.path] ? (openBlock(), createElementBlock("td", mergeProps({
580
594
  key: 0,
581
595
  role: "gridcell"
@@ -591,7 +605,7 @@ var as_window_table_base_default = /* @__PURE__ */ defineComponent({
591
605
  }, { ref_for: true }, bindings), null, 16, ["row", "column"]))], 64);
592
606
  }), 128))], 64);
593
607
  }), 128)) : (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(columns.value, (col) => {
594
- return openBlock(), createElementBlock(Fragment, { key: col.path }, [cellSlotFlags.value[col.path] ? (openBlock(), createElementBlock("td", _hoisted_8, [renderSlot(_ctx.$slots, `cell-${col.path}`, {
608
+ return openBlock(), createElementBlock(Fragment, { key: col.path }, [cellSlotFlags.value[col.path] ? (openBlock(), createElementBlock("td", _hoisted_5, [renderSlot(_ctx.$slots, `cell-${col.path}`, {
595
609
  row: slot.row,
596
610
  value: unref(getCellValue)(slot.row, col.path),
597
611
  column: col
@@ -683,6 +697,11 @@ var as_window_table_default = /* @__PURE__ */ defineComponent({
683
697
  required: false,
684
698
  default: "none"
685
699
  },
700
+ selectOn: {
701
+ type: String,
702
+ required: false,
703
+ default: "row"
704
+ },
686
705
  rows: {
687
706
  type: Number,
688
707
  required: false
@@ -802,6 +821,7 @@ var as_window_table_default = /* @__PURE__ */ defineComponent({
802
821
  resizable: __props.resizable,
803
822
  "column-min-width": __props.columnMinWidth,
804
823
  select: __props.select,
824
+ "select-on": __props.selectOn,
805
825
  headless: __props.headless,
806
826
  "enter-action": __props.enterAction,
807
827
  "row-class": __props.rowClass,
@@ -823,6 +843,7 @@ var as_window_table_default = /* @__PURE__ */ defineComponent({
823
843
  "resizable",
824
844
  "column-min-width",
825
845
  "select",
846
+ "select-on",
826
847
  "headless",
827
848
  "enter-action",
828
849
  "row-class",
@@ -1,9 +1,9 @@
1
- const require_use_table_state = require("./use-table-state-pF_9gnTG.cjs");
1
+ const require_use_table_state = require("./use-table-state-BiklfjP0.cjs");
2
2
  const require_get_cell_value = require("./get-cell-value-CJT4fk4y.cjs");
3
3
  const require_use_table_selection = require("./use-table-selection-DtCV3rhu.cjs");
4
4
  const require_use_has_emit_listener = require("./use-has-emit-listener-BaGFZDyM.cjs");
5
- const require_use_table_column_handlers = require("./use-table-column-handlers-rqFo9HLz.cjs");
6
- const require_as_table_status = require("./as-table-status-UWTPJJUL.cjs");
5
+ const require_use_table_column_handlers = require("./use-table-column-handlers-BHMCo_HR.cjs");
6
+ const require_as_select_cell = require("./as-select-cell-XnzNuW2v.cjs");
7
7
  let vue = require("vue");
8
8
  let _atscript_ui_table = require("@atscript/ui-table");
9
9
  let _vueuse_core = require("@vueuse/core");
@@ -113,7 +113,7 @@ var as_window_scrollbar_default = /* @__PURE__ */ (0, vue.defineComponent)({
113
113
  function clamp(n) {
114
114
  return (0, _atscript_ui_table.clampTopIndex)(n, props.totalCount, props.viewportRowCount);
115
115
  }
116
- const topIndexBatch = require_as_table_status.useRafBatch((next) => {
116
+ const topIndexBatch = require_as_select_cell.useRafBatch((next) => {
117
117
  if (next !== props.topIndex) emit("top-index-change", next);
118
118
  });
119
119
  function onThumbPointerDown(event) {
@@ -182,24 +182,6 @@ const _hoisted_4 = [
182
182
  "onDblclick"
183
183
  ];
184
184
  const _hoisted_5 = {
185
- key: 0,
186
- class: "as-td-select",
187
- role: "gridcell"
188
- };
189
- const _hoisted_6 = [
190
- "tabindex",
191
- "aria-label",
192
- "title",
193
- "aria-checked",
194
- "aria-disabled",
195
- "onKeydown"
196
- ];
197
- const _hoisted_7 = {
198
- key: 0,
199
- class: "as-table-checkbox-tick",
200
- "aria-hidden": "true"
201
- };
202
- const _hoisted_8 = {
203
185
  key: 0,
204
186
  role: "gridcell"
205
187
  };
@@ -245,6 +227,11 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
245
227
  required: false,
246
228
  default: "none"
247
229
  },
230
+ selectOn: {
231
+ type: String,
232
+ required: false,
233
+ default: "row"
234
+ },
248
235
  enterAction: {
249
236
  type: String,
250
237
  required: false
@@ -273,18 +260,44 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
273
260
  const emit = __emit;
274
261
  const slots = (0, vue.useSlots)();
275
262
  const { state } = require_use_table_state.useTableContext();
276
- const { resolve: cellResolver, hasAnyCellBindings } = require_as_table_status.useCellResolver(() => state.tableDef.value);
263
+ const { resolve: cellResolver, hasAnyCellBindings } = require_as_select_cell.useCellResolver(() => state.tableDef.value);
277
264
  const columns = (0, vue.computed)(() => props.columns ?? state.columns.value);
278
- const cellComponents = require_as_table_status.useCellComponents(() => columns.value);
265
+ const cellComponents = require_as_select_cell.useCellComponents(() => columns.value);
279
266
  const headerColumns = (0, vue.computed)(() => state.localSortAvailable.value ? columns.value : columns.value.map((c) => c.local && c.sortable ? {
280
267
  ...c,
281
268
  sortable: false
282
269
  } : c));
283
270
  const hasValue = (0, vue.computed)(() => props.select !== "none");
284
271
  const hasActiveFilters = (0, vue.computed)(() => (0, _atscript_ui_table.filledFilterCount)(state.filters.value) > 0);
272
+ /**
273
+ * Every row of the dataset, in order — or `null` while any is not loaded.
274
+ * The header checkbox exists only when this is known: acting on whatever
275
+ * blocks happen to be cached would pick rows the user never saw, so a
276
+ * partially loaded dataset gets no select-all control at all.
277
+ */
278
+ const allLoadedRows = (0, vue.computed)(() => {
279
+ if (props.select !== "multi") return null;
280
+ const total = state.totalCount.value;
281
+ const cache = state.windowCache.value;
282
+ if (total <= 0 || cache.size < total) return null;
283
+ const rows = [];
284
+ for (let i = 0; i < total; i++) {
285
+ const row = cache.get(i);
286
+ if (row === void 0) return null;
287
+ rows.push(row);
288
+ }
289
+ return rows;
290
+ });
291
+ const eligibleLoadedPks = (0, vue.computed)(() => {
292
+ const rows = allLoadedRows.value;
293
+ return rows ? new Set((0, _atscript_ui_table.rowsToPks)(state.selectableRows(rows), state.rowValueFn)) : null;
294
+ });
285
295
  const selectAllState = (0, vue.computed)(() => {
286
- if (props.select !== "multi") return void 0;
287
- return state.selectedRows.value.length === 0 ? "none" : "some";
296
+ const eligible = eligibleLoadedPks.value;
297
+ if (!eligible) return void 0;
298
+ let selected = 0;
299
+ for (const pk of state.selectedRows.value) if (eligible.has(pk)) selected++;
300
+ return require_use_table_state.toSelectAllState(selected, eligible.size);
288
301
  });
289
302
  const cellSlotFlags = (0, vue.computed)(() => {
290
303
  const out = {};
@@ -294,11 +307,6 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
294
307
  const rowStyle = (0, vue.computed)(() => ({ height: `${props.rowHeight}px` }));
295
308
  /** Shared "selectable" verdict — frozen, so a hookless pool allocates nothing. */
296
309
  const SELECTABLE = Object.freeze({ ok: true });
297
- /** Accessible name for a row's selection control, carrying the disabled reason. */
298
- function selectLabel(verdict) {
299
- if (verdict.ok) return "Select row";
300
- return verdict.reason ? `Select row, ${verdict.reason}` : "Select row, not selectable";
301
- }
302
310
  const visibleSlots = (0, vue.computed)(() => {
303
311
  const viewport = state.viewportRowCount.value;
304
312
  if (viewport <= 0) return [];
@@ -332,6 +340,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
332
340
  }
333
341
  out.push({
334
342
  s,
343
+ abs,
335
344
  row,
336
345
  pk,
337
346
  errored: row === void 0 && state.errorAt(abs) !== null,
@@ -348,7 +357,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
348
357
  return (0, _atscript_ui_table.clampTopIndex)(n, state.totalCount.value, state.viewportRowCount.value);
349
358
  }
350
359
  let pendingTopIndex = null;
351
- const topIndexBatch = require_as_table_status.useRafBatch((next) => {
360
+ const topIndexBatch = require_as_select_cell.useRafBatch((next) => {
352
361
  pendingTopIndex = null;
353
362
  if (next !== state.topIndex.value) state.topIndex.value = next;
354
363
  });
@@ -375,9 +384,6 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
375
384
  mode: props.select
376
385
  });
377
386
  }
378
- function onSelectCellKeydown(event, absIdx) {
379
- require_use_table_state.onSelectControlKeydown(event, absIdx, props.select, state);
380
- }
381
387
  (0, vue.watch)([() => state.activeIndex.value, () => state.viewportRowCount.value], ([idx, viewport]) => {
382
388
  if (idx < 0) return;
383
389
  if (viewport <= 0) return;
@@ -407,7 +413,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
407
413
  function onRowClick(row, event, absIdx) {
408
414
  emit("row-click", row, event);
409
415
  state.setActive(absIdx);
410
- if (props.select === "none") return;
416
+ if (props.select === "none" || props.selectOn === "control") return;
411
417
  state.toggleActiveSelection(props.select);
412
418
  }
413
419
  function onRowDblClick(row, event, absIdx) {
@@ -415,13 +421,9 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
415
421
  state.setActive(absIdx);
416
422
  state.requestMainAction(event);
417
423
  }
418
- function onSelectAllToggle(headerState) {
419
- if (headerState !== "none") {
420
- state.selectedRows.value = [];
421
- return;
422
- }
423
- const entries = [...state.windowCache.value.entries()].toSorted((a, b) => a[0] - b[0]);
424
- state.selectAll(entries.map((e) => e[1]), (i) => entries[i][0]);
424
+ function onToggleAll() {
425
+ const rows = allLoadedRows.value;
426
+ if (rows) state.toggleAll(rows);
425
427
  }
426
428
  const { onSort, onHide, onFilter, onFiltersOff, onResetWidth, onReorder, onClearFilters } = require_use_table_column_handlers.useTableColumnHandlers(state);
427
429
  const wrapperRef = (0, vue.ref)(null);
@@ -474,7 +476,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
474
476
  "aria-rowcount": (0, vue.unref)(state).totalCount.value + 1,
475
477
  "aria-multiselectable": __props.select === "multi" ? "true" : void 0
476
478
  }, [
477
- (0, vue.createVNode)(require_as_table_status.as_table_colgroup_default, {
479
+ (0, vue.createVNode)(require_as_select_cell.as_table_colgroup_default, {
478
480
  columns: columns.value,
479
481
  "column-widths": (0, vue.unref)(state).columnWidths.value,
480
482
  "has-select": hasValue.value,
@@ -484,7 +486,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
484
486
  "column-widths",
485
487
  "has-select"
486
488
  ]),
487
- !__props.headless ? ((0, vue.openBlock)(), (0, vue.createBlock)(require_as_table_status.as_table_header_default, {
489
+ !__props.headless ? ((0, vue.openBlock)(), (0, vue.createBlock)(require_as_select_cell.as_table_header_default, {
488
490
  key: 0,
489
491
  columns: headerColumns.value,
490
492
  sorters: (0, vue.unref)(state).sorters.value,
@@ -496,6 +498,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
496
498
  "column-min-width": __props.columnMinWidth,
497
499
  "has-select-column": hasValue.value,
498
500
  "select-all-state": selectAllState.value,
501
+ "selected-count": (0, vue.unref)(state).selectedCount.value,
499
502
  "with-filler": true,
500
503
  "enable-auto-fit": true,
501
504
  "aria-rowindex": 1,
@@ -506,8 +509,11 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
506
509
  onResetWidth: (0, vue.unref)(onResetWidth),
507
510
  onReorder: (0, vue.unref)(onReorder),
508
511
  onResize: (0, vue.unref)(state).setColumnWidth,
509
- onSelectAllToggle
510
- }, (0, vue.createSlots)({ _: 2 }, [(0, vue.renderList)(columns.value, (col) => {
512
+ onToggleAll
513
+ }, (0, vue.createSlots)({
514
+ "header-__select": (0, vue.withCtx)((scope) => [(0, vue.renderSlot)(_ctx.$slots, "header-__select", (0, vue.normalizeProps)((0, vue.guardReactiveProps)(scope)))]),
515
+ _: 2
516
+ }, [(0, vue.renderList)(columns.value, (col) => {
511
517
  return {
512
518
  name: `header-${col.path}`,
513
519
  fn: (0, vue.withCtx)((scope) => [(0, vue.renderSlot)(_ctx.$slots, `header-${col.path}`, (0, vue.normalizeProps)((0, vue.guardReactiveProps)(scope)))])
@@ -523,6 +529,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
523
529
  "column-min-width",
524
530
  "has-select-column",
525
531
  "select-all-state",
532
+ "selected-count",
526
533
  "onSort",
527
534
  "onHide",
528
535
  "onFilter",
@@ -547,35 +554,42 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
547
554
  key: 0,
548
555
  ref_for: true
549
556
  }, slot.attrs, {
550
- id: (0, vue.unref)(state).rowId((0, vue.unref)(state).topIndex.value + slot.s),
557
+ id: (0, vue.unref)(state).rowId(slot.abs),
551
558
  class: [
552
559
  "as-window-data-row",
553
- { "as-table-row-active": (0, vue.unref)(state).activeIndex.value === (0, vue.unref)(state).topIndex.value + slot.s },
560
+ { "as-table-row-active": (0, vue.unref)(state).activeIndex.value === slot.abs },
554
561
  slot.cls
555
562
  ],
556
563
  "data-selectable": slot.selectable.ok ? void 0 : "false",
557
564
  role: "row",
558
- "aria-rowindex": (0, vue.unref)(state).topIndex.value + slot.s + 2,
565
+ "aria-rowindex": slot.abs + 2,
559
566
  "aria-selected": slot.ariaSelected,
560
567
  style: rowStyle.value,
561
- onClick: ($event) => onRowClick(slot.row, $event, (0, vue.unref)(state).topIndex.value + slot.s),
562
- onDblclick: ($event) => onRowDblClick(slot.row, $event, (0, vue.unref)(state).topIndex.value + slot.s)
568
+ onClick: ($event) => onRowClick(slot.row, $event, slot.abs),
569
+ onDblclick: ($event) => onRowDblClick(slot.row, $event, slot.abs)
563
570
  }), [
564
- hasValue.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("td", _hoisted_5, [(0, vue.createElementVNode)("span", {
565
- class: (0, vue.normalizeClass)(["as-table-checkbox", {
566
- "as-table-checkbox-checked": slot.selected,
567
- "as-table-checkbox-disabled": !slot.selectable.ok
568
- }]),
569
- role: "checkbox",
570
- tabindex: slot.selectable.ok ? 0 : void 0,
571
- "aria-label": selectLabel(slot.selectable),
572
- title: slot.selectable.reason,
573
- "aria-checked": slot.selected ? "true" : "false",
574
- "aria-disabled": slot.selectable.ok ? void 0 : "true",
575
- onKeydown: ($event) => onSelectCellKeydown($event, (0, vue.unref)(state).topIndex.value + slot.s)
576
- }, [slot.selected ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("span", _hoisted_7)) : (0, vue.createCommentVNode)("v-if", true)], 42, _hoisted_6)])) : (0, vue.createCommentVNode)("v-if", true),
571
+ hasValue.value ? ((0, vue.openBlock)(), (0, vue.createBlock)(require_as_select_cell.as_select_cell_default, {
572
+ key: 0,
573
+ row: slot.row,
574
+ index: slot.abs,
575
+ selected: slot.selected,
576
+ verdict: slot.selectable,
577
+ select: __props.select,
578
+ "select-on": __props.selectOn
579
+ }, (0, vue.createSlots)({ _: 2 }, [(0, vue.unref)(slots)["cell-__select"] ? {
580
+ name: "default",
581
+ fn: (0, vue.withCtx)((scope) => [(0, vue.renderSlot)(_ctx.$slots, "cell-__select", (0, vue.mergeProps)({ ref_for: true }, scope))]),
582
+ key: "0"
583
+ } : void 0]), 1032, [
584
+ "row",
585
+ "index",
586
+ "selected",
587
+ "verdict",
588
+ "select",
589
+ "select-on"
590
+ ])) : (0, vue.createCommentVNode)("v-if", true),
577
591
  (0, vue.unref)(hasAnyCellBindings) ? ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, (0, vue.renderList)(columns.value, (col) => {
578
- return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: col.path }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)([(0, vue.unref)(cellResolver)(col, slot.row, (0, vue.unref)(state).topIndex.value + slot.s)], (bindings) => {
592
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: col.path }, [((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, null, (0, vue.renderList)([(0, vue.unref)(cellResolver)(col, slot.row, slot.abs)], (bindings) => {
579
593
  return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [cellSlotFlags.value[col.path] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("td", (0, vue.mergeProps)({
580
594
  key: 0,
581
595
  role: "gridcell"
@@ -591,7 +605,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
591
605
  }, { ref_for: true }, bindings), null, 16, ["row", "column"]))], 64);
592
606
  }), 128))], 64);
593
607
  }), 128)) : ((0, vue.openBlock)(true), (0, vue.createElementBlock)(vue.Fragment, { key: 2 }, (0, vue.renderList)(columns.value, (col) => {
594
- return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: col.path }, [cellSlotFlags.value[col.path] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("td", _hoisted_8, [(0, vue.renderSlot)(_ctx.$slots, `cell-${col.path}`, {
608
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: col.path }, [cellSlotFlags.value[col.path] ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("td", _hoisted_5, [(0, vue.renderSlot)(_ctx.$slots, `cell-${col.path}`, {
595
609
  row: slot.row,
596
610
  value: (0, vue.unref)(require_get_cell_value.getCellValue)(slot.row, col.path),
597
611
  column: col
@@ -621,7 +635,7 @@ var as_window_table_base_default = /* @__PURE__ */ (0, vue.defineComponent)({
621
635
  }), 128))], 40, _hoisted_3)
622
636
  ], 8, _hoisted_2),
623
637
  (0, vue.createCommentVNode)(" Error / empty placeholders render INSIDE the wrapper so they cover\n the empty pool body when there's nothing to show; suppressed during\n a `querying` refresh because the full-table overlay covers that case. "),
624
- (0, vue.createVNode)(require_as_table_status.as_table_status_default, {
638
+ (0, vue.createVNode)(require_as_select_cell.as_table_status_default, {
625
639
  "query-error": (0, vue.unref)(state).queryError.value,
626
640
  "is-empty": (0, vue.unref)(state).totalCount.value === 0,
627
641
  querying: (0, vue.unref)(state).querying.value,
@@ -683,6 +697,11 @@ var as_window_table_default = /* @__PURE__ */ (0, vue.defineComponent)({
683
697
  required: false,
684
698
  default: "none"
685
699
  },
700
+ selectOn: {
701
+ type: String,
702
+ required: false,
703
+ default: "row"
704
+ },
686
705
  rows: {
687
706
  type: Number,
688
707
  required: false
@@ -802,6 +821,7 @@ var as_window_table_default = /* @__PURE__ */ (0, vue.defineComponent)({
802
821
  resizable: __props.resizable,
803
822
  "column-min-width": __props.columnMinWidth,
804
823
  select: __props.select,
824
+ "select-on": __props.selectOn,
805
825
  headless: __props.headless,
806
826
  "enter-action": __props.enterAction,
807
827
  "row-class": __props.rowClass,
@@ -823,6 +843,7 @@ var as_window_table_default = /* @__PURE__ */ (0, vue.defineComponent)({
823
843
  "resizable",
824
844
  "column-min-width",
825
845
  "select",
846
+ "select-on",
826
847
  "headless",
827
848
  "enter-action",
828
849
  "row-class",
@@ -1,2 +1,2 @@
1
- const require_as_window_table = require("./as-window-table-C9YtzepV.cjs");
1
+ const require_as_window_table = require("./as-window-table-hOYLNhX3.cjs");
2
2
  module.exports = require_as_window_table.as_window_table_default;
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./as-window-table.vue-CRWdhOgC.cjs";
1
+ import { t as _default } from "./as-window-table.vue-D6UDA6td.cjs";
2
2
  export = _default;
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./as-window-table.vue-COVl3die.mjs";
1
+ import { t as _default } from "./as-window-table.vue-Deg1mj3t.mjs";
2
2
  export { _default as default };
@@ -1,2 +1,2 @@
1
- import { t as as_window_table_default } from "./as-window-table-KyS6YUpa.mjs";
1
+ import { t as as_window_table_default } from "./as-window-table-C312T_bc.mjs";
2
2
  export { as_window_table_default as default };