@atscript/vue-table 0.1.145 → 0.1.147

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 (167) hide show
  1. package/dist/as-action-form-dialog.cjs +3 -2
  2. package/dist/as-action-form-dialog.mjs +3 -2
  3. package/dist/{as-action-menu-content-DoZnQP0I.mjs → as-action-menu-content-35yQWbLF.mjs} +1 -1
  4. package/dist/{as-action-menu-content-FQ2miGid.cjs → as-action-menu-content-BJ0tn6jq.cjs} +1 -1
  5. package/dist/as-cell-array.d.cts +1 -1
  6. package/dist/as-cell-array.d.mts +1 -1
  7. package/dist/as-cell-date.d.cts +1 -1
  8. package/dist/as-cell-date.d.mts +1 -1
  9. package/dist/as-cell-json.d.cts +1 -1
  10. package/dist/as-cell-json.d.mts +1 -1
  11. package/dist/as-cell-number.d.cts +1 -1
  12. package/dist/as-cell-number.d.mts +1 -1
  13. package/dist/as-cell-union.d.cts +1 -1
  14. package/dist/as-cell-union.d.mts +1 -1
  15. package/dist/as-column-menu.d.cts +1 -1
  16. package/dist/as-column-menu.d.mts +1 -1
  17. package/dist/{as-column-menu.vue-ByTECTbX.d.cts → as-column-menu.vue-B6iuKmIj.d.cts} +1 -1
  18. package/dist/{as-column-menu.vue-TChT482i.d.mts → as-column-menu.vue-wxb2f92k.d.mts} +1 -1
  19. package/dist/{as-config-dialog-CpW1Qemf.cjs → as-config-dialog-BJkBzaku.cjs} +2 -2
  20. package/dist/{as-config-dialog-ObHtungs.mjs → as-config-dialog-D503Ek_m.mjs} +2 -2
  21. package/dist/as-config-dialog.cjs +1 -1
  22. package/dist/as-config-dialog.d.cts +1 -1
  23. package/dist/as-config-dialog.d.mts +1 -1
  24. package/dist/as-config-dialog.mjs +1 -1
  25. package/dist/{as-confirm-dialog-D3Vu1Rb_.cjs → as-confirm-dialog-C5xPbkox.cjs} +1 -1
  26. package/dist/{as-confirm-dialog-zg7jmS3u.mjs → as-confirm-dialog-CJfDnaiU.mjs} +1 -1
  27. package/dist/as-confirm-dialog.cjs +1 -1
  28. package/dist/as-confirm-dialog.d.cts +1 -1
  29. package/dist/as-confirm-dialog.d.mts +1 -1
  30. package/dist/as-confirm-dialog.mjs +1 -1
  31. package/dist/{as-filter-dialog-C4EyRr2_.cjs → as-filter-dialog-Co0WfWOe.cjs} +7 -7
  32. package/dist/{as-filter-dialog-CWy0mjZl.mjs → as-filter-dialog-CxjO-Ge5.mjs} +7 -7
  33. package/dist/as-filter-dialog.cjs +1 -1
  34. package/dist/as-filter-dialog.d.cts +1 -1
  35. package/dist/as-filter-dialog.d.mts +1 -1
  36. package/dist/as-filter-dialog.mjs +1 -1
  37. package/dist/{as-filter-field-CW1_GHZT.mjs → as-filter-field-ByPlGyWz.mjs} +3 -3
  38. package/dist/{as-filter-field-BQ9UlV0y.cjs → as-filter-field-FTrxFkTw.cjs} +3 -3
  39. package/dist/as-filter-field.cjs +1 -1
  40. package/dist/as-filter-field.d.cts +1 -1
  41. package/dist/as-filter-field.d.mts +1 -1
  42. package/dist/as-filter-field.mjs +1 -1
  43. package/dist/as-filter-input.d.cts +1 -1
  44. package/dist/as-filter-input.d.mts +1 -1
  45. package/dist/{as-filters-BLFSS_VP.mjs → as-filters-CJZJiOXb.mjs} +4 -4
  46. package/dist/{as-filters-DUfFkXAo.cjs → as-filters-W3iMELuL.cjs} +4 -4
  47. package/dist/as-filters.cjs +1 -1
  48. package/dist/as-filters.mjs +1 -1
  49. package/dist/{as-preset-dialog-CI2Hw8vi.mjs → as-preset-dialog-CLOVEpWZ.mjs} +1 -1
  50. package/dist/{as-preset-dialog-BlXqTZiT.cjs → as-preset-dialog-Dvvx0jmU.cjs} +1 -1
  51. package/dist/as-preset-dialog.cjs +1 -1
  52. package/dist/as-preset-dialog.d.cts +1 -1
  53. package/dist/as-preset-dialog.d.mts +1 -1
  54. package/dist/as-preset-dialog.mjs +1 -1
  55. package/dist/{as-preset-picker-CbZDGPaf.mjs → as-preset-picker-CwFObhME.mjs} +1 -1
  56. package/dist/{as-preset-picker-CVgyZBG7.cjs → as-preset-picker-DFLhbm59.cjs} +1 -1
  57. package/dist/as-preset-picker.cjs +1 -1
  58. package/dist/as-preset-picker.mjs +1 -1
  59. package/dist/{as-residual-filter-CUTouIn5.mjs → as-residual-filter-BRsEs8oe.mjs} +1 -1
  60. package/dist/{as-residual-filter-C8n7kdGW.cjs → as-residual-filter-sZlsFPDS.cjs} +1 -1
  61. package/dist/as-residual-filter.cjs +1 -1
  62. package/dist/as-residual-filter.d.cts +1 -1
  63. package/dist/as-residual-filter.d.mts +1 -1
  64. package/dist/as-residual-filter.mjs +1 -1
  65. package/dist/{as-row-actions-DfUL9sYB.cjs → as-row-actions-DFv2cSrP.cjs} +7 -5
  66. package/dist/{as-row-actions-ed1P6GEJ.mjs → as-row-actions-DyjIXePd.mjs} +7 -5
  67. package/dist/as-row-actions.cjs +1 -1
  68. package/dist/as-row-actions.d.cts +1 -1
  69. package/dist/as-row-actions.d.mts +1 -1
  70. package/dist/as-row-actions.mjs +1 -1
  71. package/dist/{as-row-actions.vue-Ba3VO9W-.d.cts → as-row-actions.vue-BHrZBXVU.d.cts} +1 -1
  72. package/dist/{as-row-actions.vue-CKOnE0eb.d.mts → as-row-actions.vue-D4MylwCW.d.mts} +1 -1
  73. package/dist/{as-select-cell-DwMfqBMV.cjs → as-select-cell-CoQJjhnq.cjs} +10 -5
  74. package/dist/{as-select-cell-BMptU5sQ.mjs → as-select-cell-Dl8fohIj.mjs} +10 -5
  75. package/dist/as-selection-banner-BI5gKHqW.cjs +206 -0
  76. package/dist/as-selection-banner-DBtLjulh.mjs +189 -0
  77. package/dist/as-table-B1FowaPF.cjs +215 -0
  78. package/dist/as-table-Cpvfv9zA.mjs +210 -0
  79. package/dist/{as-table-actions-DplblFlK.cjs → as-table-actions-B0xaicfv.cjs} +32 -6
  80. package/dist/{as-table-actions-DQco4pGu.mjs → as-table-actions-BlbAps1h.mjs} +32 -6
  81. package/dist/as-table-actions.cjs +1 -1
  82. package/dist/as-table-actions.d.cts +1 -1
  83. package/dist/as-table-actions.d.mts +1 -1
  84. package/dist/as-table-actions.mjs +1 -1
  85. package/dist/{as-table-actions.vue-BL4xy2-d.d.mts → as-table-actions.vue-7ml3JiOO.d.mts} +9 -2
  86. package/dist/{as-table-actions.vue-DgMw3xJn.d.cts → as-table-actions.vue-BKRqHprR.d.cts} +9 -2
  87. package/dist/{as-table-base-lfyjPgsO.mjs → as-table-base-EzKaChOp.mjs} +3 -3
  88. package/dist/{as-table-base-CNAn-vpa.cjs → as-table-base-LZ26YlWp.cjs} +3 -3
  89. package/dist/as-table-cell-value.d.cts +1 -1
  90. package/dist/as-table-cell-value.d.mts +1 -1
  91. package/dist/{as-table-header-cell-Csv1KQDa.mjs → as-table-header-cell-DrVzYaof.mjs} +1 -1
  92. package/dist/{as-table-header-cell-BwaOPYwI.cjs → as-table-header-cell-gHhCdxJX.cjs} +1 -1
  93. package/dist/as-table-header-cell.cjs +1 -1
  94. package/dist/as-table-header-cell.d.cts +1 -1
  95. package/dist/as-table-header-cell.d.mts +1 -1
  96. package/dist/as-table-header-cell.mjs +1 -1
  97. package/dist/{as-table-header-cell.vue-DU5h-2C_.d.cts → as-table-header-cell.vue-BCk4NPYT.d.cts} +1 -1
  98. package/dist/{as-table-header-cell.vue-KkANwimG.d.mts → as-table-header-cell.vue-BZU8s9CT.d.mts} +1 -1
  99. package/dist/{as-table-root-BreMYhnv.mjs → as-table-root-BYHXuNPI.mjs} +33 -6
  100. package/dist/{as-table-root-DXewWV9h.cjs → as-table-root-K6fWKHtF.cjs} +33 -6
  101. package/dist/as-table-root.cjs +1 -1
  102. package/dist/as-table-root.d.cts +1 -1
  103. package/dist/as-table-root.d.mts +1 -1
  104. package/dist/as-table-root.mjs +1 -1
  105. package/dist/{as-table-root.vue-DTos5nn3.d.mts → as-table-root.vue-Bm2DxAqU.d.mts} +317 -7
  106. package/dist/{as-table-root.vue-CXaFNCMi.d.cts → as-table-root.vue-CF03c4vu.d.cts} +318 -8
  107. package/dist/as-table.cjs +1 -1
  108. package/dist/as-table.d.cts +1 -1
  109. package/dist/as-table.d.mts +1 -1
  110. package/dist/as-table.mjs +1 -1
  111. package/dist/{as-window-table-JOTOi_Nm.mjs → as-window-table-CygDqZMU.mjs} +99 -53
  112. package/dist/{as-window-table-Bj1dXOS6.cjs → as-window-table-_flc8o64.cjs} +101 -55
  113. package/dist/as-window-table.cjs +1 -1
  114. package/dist/as-window-table.d.cts +1 -1
  115. package/dist/as-window-table.d.mts +1 -1
  116. package/dist/as-window-table.mjs +1 -1
  117. package/dist/index.cjs +23 -19
  118. package/dist/index.d.cts +19 -21
  119. package/dist/index.d.mts +19 -21
  120. package/dist/index.mjs +20 -20
  121. package/dist/{types-D1NxhrpW.d.cts → intent-scope-BXPEN5kJ.d.cts} +202 -35
  122. package/dist/{types-BEZ4_erB.d.mts → intent-scope-Ck7RZ0dK.d.mts} +202 -35
  123. package/dist/{use-table-W0KmaJ6L.cjs → use-table-CydIJZbx.cjs} +5 -3
  124. package/dist/{use-table-BTsNGBVx.mjs → use-table-DP6Y0kbl.mjs} +5 -3
  125. package/dist/{use-table-component-DRMXTk9M.mjs → use-table-component-DNGUvhf7.mjs} +1 -1
  126. package/dist/{use-table-component-BvAC82_c.cjs → use-table-component-aqfGzECx.cjs} +1 -1
  127. package/dist/{use-table-nav-bridge-CPI1tql6.cjs → use-table-nav-bridge-B7A30yja.cjs} +1 -1
  128. package/dist/{use-table-nav-bridge-Bw0NFDSf.mjs → use-table-nav-bridge-BhOPIT2R.mjs} +1 -1
  129. package/dist/{use-table-selection-ULbKT2xW.mjs → use-table-selection-CdaOPo1d.mjs} +8 -3
  130. package/dist/{use-table-selection-DtCV3rhu.cjs → use-table-selection-Cs7-gjHg.cjs} +8 -3
  131. package/dist/{use-table-state-DuY-Mf8e.mjs → use-table-state-1OZfdhQi.mjs} +414 -41
  132. package/dist/{use-table-state-Ddr2UZzB.cjs → use-table-state-sDnqOi3b.cjs} +447 -38
  133. package/package.json +11 -10
  134. package/dist/as-table-BjKzKB0a.cjs +0 -207
  135. package/dist/as-table-DGWfzV4w.mjs +0 -202
  136. package/dist/as-table.vue-Cn1CXJ1Y.d.mts +0 -115
  137. package/dist/as-table.vue-EfLWpNy3.d.cts +0 -115
  138. package/dist/as-window-table.vue-DCd8FtpC.d.cts +0 -132
  139. package/dist/as-window-table.vue-DN5hed6Y.d.mts +0 -132
  140. package/dist/use-table-column-handlers-BitvioH4.mjs +0 -85
  141. package/dist/use-table-column-handlers-DksXpbON.cjs +0 -96
  142. /package/dist/{as-cell-array.vue-pFs5GcCR.d.cts → as-cell-array.vue-C4BTM8YW.d.cts} +0 -0
  143. /package/dist/{as-cell-array.vue-ow34clSF.d.mts → as-cell-array.vue-Dj3nZop3.d.mts} +0 -0
  144. /package/dist/{as-cell-date.vue-B4JCr1qP.d.mts → as-cell-date.vue-BPuyH7q3.d.mts} +0 -0
  145. /package/dist/{as-cell-date.vue-BBSps2B2.d.cts → as-cell-date.vue-BcMgxBfm.d.cts} +0 -0
  146. /package/dist/{as-cell-json.vue-B-T3TuFj.d.mts → as-cell-json.vue-D8J7YwVV.d.mts} +0 -0
  147. /package/dist/{as-cell-json.vue-C6wg4ARZ.d.cts → as-cell-json.vue-pwE9uJdv.d.cts} +0 -0
  148. /package/dist/{as-cell-number.vue-CJ2K5zeM.d.cts → as-cell-number.vue-pbgVCIWT.d.cts} +0 -0
  149. /package/dist/{as-cell-number.vue-CNH2fbCB.d.mts → as-cell-number.vue-sUoZvuat.d.mts} +0 -0
  150. /package/dist/{as-cell-union.vue-CslPM_c2.d.cts → as-cell-union.vue-BK_M7opL.d.cts} +0 -0
  151. /package/dist/{as-cell-union.vue-CZwN81H4.d.mts → as-cell-union.vue-DZBejMxR.d.mts} +0 -0
  152. /package/dist/{as-config-dialog.vue-BKo2GpzN.d.mts → as-config-dialog.vue-C-Jw_rb7.d.cts} +0 -0
  153. /package/dist/{as-config-dialog.vue-DvvJi3xx.d.cts → as-config-dialog.vue-D2AVR1a5.d.mts} +0 -0
  154. /package/dist/{as-confirm-dialog.vue-BN_yzu3h.d.mts → as-confirm-dialog.vue-BxAaCuYf.d.mts} +0 -0
  155. /package/dist/{as-confirm-dialog.vue-CXxLpzbu.d.cts → as-confirm-dialog.vue-D8hJ5qPY.d.cts} +0 -0
  156. /package/dist/{as-filter-dialog.vue-BV2J8PgZ.d.cts → as-filter-dialog.vue-CyD6qtuX.d.cts} +0 -0
  157. /package/dist/{as-filter-dialog.vue-Bl8OIKOf.d.mts → as-filter-dialog.vue-WYXGtymZ.d.mts} +0 -0
  158. /package/dist/{as-filter-field.vue-DD0IZXS1.d.mts → as-filter-field.vue-DTpuDkHh.d.mts} +0 -0
  159. /package/dist/{as-filter-field.vue-ByQ8xIGq.d.cts → as-filter-field.vue-ajAFhraz.d.cts} +0 -0
  160. /package/dist/{as-filter-input.vue-CS4nOk_Q.d.cts → as-filter-input.vue-CksJOtqw.d.cts} +0 -0
  161. /package/dist/{as-filter-input.vue-CFZ33B--.d.mts → as-filter-input.vue-DMwr0ArL.d.mts} +0 -0
  162. /package/dist/{as-preset-dialog.vue-ChM7H7B4.d.mts → as-preset-dialog.vue-BEM-L4BY.d.cts} +0 -0
  163. /package/dist/{as-preset-dialog.vue-DP9fy00Y.d.cts → as-preset-dialog.vue-BrnvBWxJ.d.mts} +0 -0
  164. /package/dist/{as-residual-filter.vue-Dfw1l2wS.d.cts → as-residual-filter.vue-CGXCipEn.d.cts} +0 -0
  165. /package/dist/{as-residual-filter.vue-N89YqlCz.d.mts → as-residual-filter.vue-Cev_8Wy7.d.mts} +0 -0
  166. /package/dist/{as-table-cell-value.vue-C0VR9GRK.d.cts → as-table-cell-value.vue-UkAuJanv.d.cts} +0 -0
  167. /package/dist/{as-table-cell-value.vue-DphckGq-.d.mts → as-table-cell-value.vue-kfNgVhzn.d.mts} +0 -0
@@ -1,7 +1,7 @@
1
- import { g as toggleRowAt, h as onSelectControlKeydown, o as useTableContextOptional } from "./use-table-state-DuY-Mf8e.mjs";
2
- import { t as useTableComponent } from "./use-table-component-DRMXTk9M.mjs";
3
- import { t as as_table_header_cell_default } from "./as-table-header-cell-Csv1KQDa.mjs";
4
- import { t as as_row_actions_default } from "./as-row-actions-ed1P6GEJ.mjs";
1
+ import { g as toggleRowAt, h as onSelectControlKeydown, o as useTableContextOptional } from "./use-table-state-1OZfdhQi.mjs";
2
+ import { t as useTableComponent } from "./use-table-component-DNGUvhf7.mjs";
3
+ import { t as as_table_header_cell_default } from "./as-table-header-cell-DrVzYaof.mjs";
4
+ import { t as as_row_actions_default } from "./as-row-actions-DyjIXePd.mjs";
5
5
  import { t as as_table_cell_value_default } from "./as-table-cell-value-DoH8Mieo.mjs";
6
6
  import { UI_TABLE_ATTR, UI_TABLE_CLASSES, UI_TABLE_FN_ATTR, UI_TABLE_FN_CLASSES, UI_TABLE_FN_STYLES, UI_TABLE_STYLES, getFieldMeta, parseStaticAttrs, resolveAttrs, resolveFieldProp } from "@atscript/ui";
7
7
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, normalizeClass, normalizeStyle, onBeforeUnmount, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, withModifiers } from "vue";
@@ -486,6 +486,8 @@ var as_table_header_default = /* @__PURE__ */ defineComponent({
486
486
  const HeaderCell = useTableComponent("headerCell", as_table_header_cell_default);
487
487
  const props = __props;
488
488
  const emit = __emit;
489
+ const tableState = useTableContextOptional()?.state;
490
+ const NO_OP = () => {};
489
491
  const sortMap = computed(() => {
490
492
  const map = {};
491
493
  for (const s of props.sorters) map[s.field] = s.direction;
@@ -557,7 +559,10 @@ var as_table_header_default = /* @__PURE__ */ defineComponent({
557
559
  __props.hasSelectColumn ? (openBlock(), createElementBlock("th", _hoisted_1$2, [renderSlot(_ctx.$slots, "header-__select", {
558
560
  state: __props.selectAllState,
559
561
  toggle: toggleSelectAll,
560
- selectedCount: __props.selectedCount ?? 0
562
+ selectedCount: __props.selectedCount ?? 0,
563
+ mode: unref(tableState)?.querySelection.value ? "query" : "ids",
564
+ canSelectAllMatching: unref(tableState)?.canSelectAllMatching.value ?? false,
565
+ selectAllMatching: unref(tableState)?.selectAllMatching ?? NO_OP
561
566
  }, () => [__props.selectAllState ? (openBlock(), createElementBlock("span", {
562
567
  key: 0,
563
568
  class: normalizeClass(["as-table-checkbox", {
@@ -0,0 +1,206 @@
1
+ const require_use_table_state = require("./use-table-state-sDnqOi3b.cjs");
2
+ let vue = require("vue");
3
+ let _atscript_ui_table = require("@atscript/ui-table");
4
+ //#region src/composables/use-row-actions-column.ts
5
+ /**
6
+ * The synthesised row-actions pseudo-column, shared by `<AsTable>` and
7
+ * `<AsWindowTable>`. Returns the renderer's effective column list — the base
8
+ * columns with a fixed `__actions` column prepended / appended per
9
+ * `placement` — and opts the table into per-row `$actions` while the column
10
+ * is shown.
11
+ */
12
+ function useRowActionsColumn(state, opts) {
13
+ const cellActions = (0, vue.computed)(() => {
14
+ const r = require_use_table_state.resolveRowActions(state, void 0);
15
+ return [
16
+ ...r.default ? [r.default] : [],
17
+ ...r.others,
18
+ ...r.rows,
19
+ ...r.extra
20
+ ];
21
+ });
22
+ (0, vue.watch)(() => {
23
+ const placement = opts.placement();
24
+ if (!placement) return false;
25
+ if (placement === "merge-select" && opts.select() !== "none") return false;
26
+ return cellActions.value.length > 0;
27
+ }, (on) => {
28
+ state.includeActions.value = on;
29
+ }, { immediate: true });
30
+ const actionsCol = (0, vue.computed)(() => {
31
+ const acts = cellActions.value;
32
+ return {
33
+ path: require_use_table_state.ROW_ACTIONS_PATH,
34
+ label: "",
35
+ type: require_use_table_state.ROW_ACTIONS_TYPE,
36
+ sortable: false,
37
+ filterable: false,
38
+ nullable: false,
39
+ order: 0,
40
+ fixed: true,
41
+ width: acts.length === 1 && !acts[0].icon ? "8em" : "4em"
42
+ };
43
+ });
44
+ return (0, vue.computed)(() => {
45
+ const base = opts.columns();
46
+ const placement = opts.placement();
47
+ if (placement === false || placement === void 0) return base;
48
+ if (cellActions.value.length === 0) return base;
49
+ if (placement === "first") return [actionsCol.value, ...base];
50
+ if (placement === "last") return [...base, actionsCol.value];
51
+ if (opts.select() === "none") return [actionsCol.value, ...base];
52
+ return base;
53
+ });
54
+ }
55
+ //#endregion
56
+ //#region src/composables/use-table-column-handlers.ts
57
+ /**
58
+ * Pure pass-through handlers shared between the pagination renderer
59
+ * (`<AsTable>`) and the window renderer (`<AsWindowTableBase>`). Selection
60
+ * and row-mouse handlers stay in their owning components because their
61
+ * semantics diverge meaningfully (window has no "all" state; standalone
62
+ * vs Reka renderModes need different gating).
63
+ */
64
+ function useTableColumnHandlers(state) {
65
+ return {
66
+ onSort(column, direction) {
67
+ state.sorters.value = direction === null ? [] : [{
68
+ field: column.path,
69
+ direction
70
+ }];
71
+ },
72
+ onHide(column) {
73
+ state.columnNames.value = state.columnNames.value.filter((n) => n !== column.path);
74
+ },
75
+ onFilter(column) {
76
+ state.openFilterDialog(column);
77
+ },
78
+ onFiltersOff(column) {
79
+ state.removeFieldFilter(column.path);
80
+ },
81
+ onResetWidth(column) {
82
+ state.resetColumnWidth(column.path);
83
+ },
84
+ onReorder(fromPath, toPath, position) {
85
+ state.columnNames.value = (0, _atscript_ui_table.reorderColumnNames)(state.columnNames.value, fromPath, toPath, position);
86
+ },
87
+ onClearFilters() {
88
+ state.resetFilters();
89
+ if (state.searchTerm.value) state.searchTerm.value = "";
90
+ }
91
+ };
92
+ }
93
+ //#endregion
94
+ //#region src/components/internal/as-selection-banner.vue?vue&type=script&setup=true&lang.ts
95
+ const _hoisted_1 = ["data-kind"];
96
+ const _hoisted_2 = { class: "as-selection-banner-text" };
97
+ const _hoisted_3 = { class: "as-selection-banner-text" };
98
+ //#endregion
99
+ //#region src/components/internal/as-selection-banner.vue
100
+ var as_selection_banner_default = /* @__PURE__ */ (0, vue.defineComponent)({
101
+ __name: "as-selection-banner",
102
+ props: { scope: {
103
+ type: String,
104
+ required: true
105
+ } },
106
+ setup(__props) {
107
+ const props = __props;
108
+ const { state } = require_use_table_state.useTableContext();
109
+ const kind = (0, vue.computed)(() => {
110
+ if (state.selectMode.value !== "multi") return null;
111
+ if (state.querySelection.value) return "query";
112
+ if (!state.canSelectAllMatching.value) return null;
113
+ const loaded = state.loadedEligiblePks.value.length;
114
+ return loaded > 0 && state.loadedSelectedCount.value === loaded ? "offer" : null;
115
+ });
116
+ const loadedCount = (0, vue.computed)(() => state.loadedEligiblePks.value.length);
117
+ const offerText = (0, vue.computed)(() => {
118
+ const n = loadedCount.value;
119
+ const where = props.scope === "page" ? "on this page" : "loaded";
120
+ return n === 1 ? `The 1 row ${where} is selected.` : `All ${n} rows ${where} are selected.`;
121
+ });
122
+ const queryText = (0, vue.computed)(() => {
123
+ const n = state.selectedCount.value;
124
+ return n === 1 ? "1 matching row is selected." : `All ${n} matching rows are selected.`;
125
+ });
126
+ const rootRef = (0, vue.ref)(null);
127
+ const btnRef = (0, vue.ref)(null);
128
+ /**
129
+ * Keep keyboard focus when the banner's button is swapped — on the new
130
+ * button, or, once the banner is gone, on the table's select-all checkbox.
131
+ */
132
+ async function refocus(hadFocus) {
133
+ if (!hadFocus) return;
134
+ await (0, vue.nextTick)();
135
+ if (btnRef.value) {
136
+ btnRef.value.focus();
137
+ return;
138
+ }
139
+ rootRef.value?.parentElement?.querySelector(".as-th-select [role=checkbox][tabindex]")?.focus();
140
+ }
141
+ function hasFocus() {
142
+ return !!btnRef.value && btnRef.value === document.activeElement;
143
+ }
144
+ /** Run a banner action, keeping focus on the banner's button (see `refocus`). */
145
+ function keepingFocus(fn) {
146
+ return () => {
147
+ const focused = hasFocus();
148
+ fn();
149
+ refocus(focused);
150
+ };
151
+ }
152
+ const selectAllMatching = keepingFocus(() => state.selectAllMatching());
153
+ const clearSelection = keepingFocus(() => state.clearSelection());
154
+ return (_ctx, _cache) => {
155
+ return (0, vue.unref)(state).selectMode.value === "multi" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
156
+ key: 0,
157
+ ref_key: "rootRef",
158
+ ref: rootRef,
159
+ role: "status",
160
+ "aria-live": "polite",
161
+ class: (0, vue.normalizeClass)(kind.value ? "as-selection-banner" : "sr-only"),
162
+ "data-kind": kind.value ?? void 0
163
+ }, [kind.value ? (0, vue.renderSlot)(_ctx.$slots, "default", {
164
+ key: 0,
165
+ selection: (0, vue.unref)(state).selection.value,
166
+ canSelectAllMatching: (0, vue.unref)(state).canSelectAllMatching.value,
167
+ selectAllMatching: (0, vue.unref)(selectAllMatching),
168
+ clearSelection: (0, vue.unref)(clearSelection),
169
+ loadedCount: loadedCount.value
170
+ }, () => [kind.value === "offer" ? ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 0 }, [(0, vue.createElementVNode)("span", _hoisted_2, (0, vue.toDisplayString)(offerText.value), 1), (0, vue.createElementVNode)("button", {
171
+ ref_key: "btnRef",
172
+ ref: btnRef,
173
+ type: "button",
174
+ class: "as-selection-banner-btn",
175
+ "data-select-all-matching": "",
176
+ onClick: _cache[0] || (_cache[0] = (...args) => (0, vue.unref)(selectAllMatching) && (0, vue.unref)(selectAllMatching)(...args))
177
+ }, " Select all " + (0, vue.toDisplayString)((0, vue.unref)(state).totalCount.value) + " matching ", 513)], 64)) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [(0, vue.createElementVNode)("span", _hoisted_3, (0, vue.toDisplayString)(queryText.value), 1), (0, vue.createElementVNode)("button", {
178
+ ref_key: "btnRef",
179
+ ref: btnRef,
180
+ type: "button",
181
+ class: "as-selection-banner-btn",
182
+ "data-clear-selection": "",
183
+ onClick: _cache[1] || (_cache[1] = (...args) => (0, vue.unref)(clearSelection) && (0, vue.unref)(clearSelection)(...args))
184
+ }, " Clear selection ", 512)], 64))]) : (0, vue.createCommentVNode)("v-if", true)], 10, _hoisted_1)) : (0, vue.createCommentVNode)("v-if", true);
185
+ };
186
+ }
187
+ });
188
+ //#endregion
189
+ Object.defineProperty(exports, "as_selection_banner_default", {
190
+ enumerable: true,
191
+ get: function() {
192
+ return as_selection_banner_default;
193
+ }
194
+ });
195
+ Object.defineProperty(exports, "useRowActionsColumn", {
196
+ enumerable: true,
197
+ get: function() {
198
+ return useRowActionsColumn;
199
+ }
200
+ });
201
+ Object.defineProperty(exports, "useTableColumnHandlers", {
202
+ enumerable: true,
203
+ get: function() {
204
+ return useTableColumnHandlers;
205
+ }
206
+ });
@@ -0,0 +1,189 @@
1
+ import { B as ROW_ACTIONS_PATH, V as ROW_ACTIONS_TYPE, a as useTableContext, v as resolveRowActions } from "./use-table-state-1OZfdhQi.mjs";
2
+ import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, renderSlot, toDisplayString, unref, watch } from "vue";
3
+ import { reorderColumnNames } from "@atscript/ui-table";
4
+ //#region src/composables/use-row-actions-column.ts
5
+ /**
6
+ * The synthesised row-actions pseudo-column, shared by `<AsTable>` and
7
+ * `<AsWindowTable>`. Returns the renderer's effective column list — the base
8
+ * columns with a fixed `__actions` column prepended / appended per
9
+ * `placement` — and opts the table into per-row `$actions` while the column
10
+ * is shown.
11
+ */
12
+ function useRowActionsColumn(state, opts) {
13
+ const cellActions = computed(() => {
14
+ const r = resolveRowActions(state, void 0);
15
+ return [
16
+ ...r.default ? [r.default] : [],
17
+ ...r.others,
18
+ ...r.rows,
19
+ ...r.extra
20
+ ];
21
+ });
22
+ watch(() => {
23
+ const placement = opts.placement();
24
+ if (!placement) return false;
25
+ if (placement === "merge-select" && opts.select() !== "none") return false;
26
+ return cellActions.value.length > 0;
27
+ }, (on) => {
28
+ state.includeActions.value = on;
29
+ }, { immediate: true });
30
+ const actionsCol = computed(() => {
31
+ const acts = cellActions.value;
32
+ return {
33
+ path: ROW_ACTIONS_PATH,
34
+ label: "",
35
+ type: ROW_ACTIONS_TYPE,
36
+ sortable: false,
37
+ filterable: false,
38
+ nullable: false,
39
+ order: 0,
40
+ fixed: true,
41
+ width: acts.length === 1 && !acts[0].icon ? "8em" : "4em"
42
+ };
43
+ });
44
+ return computed(() => {
45
+ const base = opts.columns();
46
+ const placement = opts.placement();
47
+ if (placement === false || placement === void 0) return base;
48
+ if (cellActions.value.length === 0) return base;
49
+ if (placement === "first") return [actionsCol.value, ...base];
50
+ if (placement === "last") return [...base, actionsCol.value];
51
+ if (opts.select() === "none") return [actionsCol.value, ...base];
52
+ return base;
53
+ });
54
+ }
55
+ //#endregion
56
+ //#region src/composables/use-table-column-handlers.ts
57
+ /**
58
+ * Pure pass-through handlers shared between the pagination renderer
59
+ * (`<AsTable>`) and the window renderer (`<AsWindowTableBase>`). Selection
60
+ * and row-mouse handlers stay in their owning components because their
61
+ * semantics diverge meaningfully (window has no "all" state; standalone
62
+ * vs Reka renderModes need different gating).
63
+ */
64
+ function useTableColumnHandlers(state) {
65
+ return {
66
+ onSort(column, direction) {
67
+ state.sorters.value = direction === null ? [] : [{
68
+ field: column.path,
69
+ direction
70
+ }];
71
+ },
72
+ onHide(column) {
73
+ state.columnNames.value = state.columnNames.value.filter((n) => n !== column.path);
74
+ },
75
+ onFilter(column) {
76
+ state.openFilterDialog(column);
77
+ },
78
+ onFiltersOff(column) {
79
+ state.removeFieldFilter(column.path);
80
+ },
81
+ onResetWidth(column) {
82
+ state.resetColumnWidth(column.path);
83
+ },
84
+ onReorder(fromPath, toPath, position) {
85
+ state.columnNames.value = reorderColumnNames(state.columnNames.value, fromPath, toPath, position);
86
+ },
87
+ onClearFilters() {
88
+ state.resetFilters();
89
+ if (state.searchTerm.value) state.searchTerm.value = "";
90
+ }
91
+ };
92
+ }
93
+ //#endregion
94
+ //#region src/components/internal/as-selection-banner.vue?vue&type=script&setup=true&lang.ts
95
+ const _hoisted_1 = ["data-kind"];
96
+ const _hoisted_2 = { class: "as-selection-banner-text" };
97
+ const _hoisted_3 = { class: "as-selection-banner-text" };
98
+ //#endregion
99
+ //#region src/components/internal/as-selection-banner.vue
100
+ var as_selection_banner_default = /* @__PURE__ */ defineComponent({
101
+ __name: "as-selection-banner",
102
+ props: { scope: {
103
+ type: String,
104
+ required: true
105
+ } },
106
+ setup(__props) {
107
+ const props = __props;
108
+ const { state } = useTableContext();
109
+ const kind = computed(() => {
110
+ if (state.selectMode.value !== "multi") return null;
111
+ if (state.querySelection.value) return "query";
112
+ if (!state.canSelectAllMatching.value) return null;
113
+ const loaded = state.loadedEligiblePks.value.length;
114
+ return loaded > 0 && state.loadedSelectedCount.value === loaded ? "offer" : null;
115
+ });
116
+ const loadedCount = computed(() => state.loadedEligiblePks.value.length);
117
+ const offerText = computed(() => {
118
+ const n = loadedCount.value;
119
+ const where = props.scope === "page" ? "on this page" : "loaded";
120
+ return n === 1 ? `The 1 row ${where} is selected.` : `All ${n} rows ${where} are selected.`;
121
+ });
122
+ const queryText = computed(() => {
123
+ const n = state.selectedCount.value;
124
+ return n === 1 ? "1 matching row is selected." : `All ${n} matching rows are selected.`;
125
+ });
126
+ const rootRef = ref(null);
127
+ const btnRef = ref(null);
128
+ /**
129
+ * Keep keyboard focus when the banner's button is swapped — on the new
130
+ * button, or, once the banner is gone, on the table's select-all checkbox.
131
+ */
132
+ async function refocus(hadFocus) {
133
+ if (!hadFocus) return;
134
+ await nextTick();
135
+ if (btnRef.value) {
136
+ btnRef.value.focus();
137
+ return;
138
+ }
139
+ rootRef.value?.parentElement?.querySelector(".as-th-select [role=checkbox][tabindex]")?.focus();
140
+ }
141
+ function hasFocus() {
142
+ return !!btnRef.value && btnRef.value === document.activeElement;
143
+ }
144
+ /** Run a banner action, keeping focus on the banner's button (see `refocus`). */
145
+ function keepingFocus(fn) {
146
+ return () => {
147
+ const focused = hasFocus();
148
+ fn();
149
+ refocus(focused);
150
+ };
151
+ }
152
+ const selectAllMatching = keepingFocus(() => state.selectAllMatching());
153
+ const clearSelection = keepingFocus(() => state.clearSelection());
154
+ return (_ctx, _cache) => {
155
+ return unref(state).selectMode.value === "multi" ? (openBlock(), createElementBlock("div", {
156
+ key: 0,
157
+ ref_key: "rootRef",
158
+ ref: rootRef,
159
+ role: "status",
160
+ "aria-live": "polite",
161
+ class: normalizeClass(kind.value ? "as-selection-banner" : "sr-only"),
162
+ "data-kind": kind.value ?? void 0
163
+ }, [kind.value ? renderSlot(_ctx.$slots, "default", {
164
+ key: 0,
165
+ selection: unref(state).selection.value,
166
+ canSelectAllMatching: unref(state).canSelectAllMatching.value,
167
+ selectAllMatching: unref(selectAllMatching),
168
+ clearSelection: unref(clearSelection),
169
+ loadedCount: loadedCount.value
170
+ }, () => [kind.value === "offer" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("span", _hoisted_2, toDisplayString(offerText.value), 1), createElementVNode("button", {
171
+ ref_key: "btnRef",
172
+ ref: btnRef,
173
+ type: "button",
174
+ class: "as-selection-banner-btn",
175
+ "data-select-all-matching": "",
176
+ onClick: _cache[0] || (_cache[0] = (...args) => unref(selectAllMatching) && unref(selectAllMatching)(...args))
177
+ }, " Select all " + toDisplayString(unref(state).totalCount.value) + " matching ", 513)], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createElementVNode("span", _hoisted_3, toDisplayString(queryText.value), 1), createElementVNode("button", {
178
+ ref_key: "btnRef",
179
+ ref: btnRef,
180
+ type: "button",
181
+ class: "as-selection-banner-btn",
182
+ "data-clear-selection": "",
183
+ onClick: _cache[1] || (_cache[1] = (...args) => unref(clearSelection) && unref(clearSelection)(...args))
184
+ }, " Clear selection ", 512)], 64))]) : createCommentVNode("v-if", true)], 10, _hoisted_1)) : createCommentVNode("v-if", true);
185
+ };
186
+ }
187
+ });
188
+ //#endregion
189
+ export { useTableColumnHandlers as n, useRowActionsColumn as r, as_selection_banner_default as t };
@@ -0,0 +1,215 @@
1
+ const require_use_table_state = require("./use-table-state-sDnqOi3b.cjs");
2
+ const require_use_table_selection = require("./use-table-selection-Cs7-gjHg.cjs");
3
+ const require_use_has_emit_listener = require("./use-has-emit-listener-BaGFZDyM.cjs");
4
+ const require_as_selection_banner = require("./as-selection-banner-BI5gKHqW.cjs");
5
+ const require_as_table_base = require("./as-table-base-LZ26YlWp.cjs");
6
+ let vue = require("vue");
7
+ //#region src/components/as-table.vue?vue&type=script&setup=true&lang.ts
8
+ const _hoisted_1 = { class: "as-table-outer-wrap" };
9
+ const _hoisted_2 = {
10
+ key: 0,
11
+ class: "as-table-query-overlay"
12
+ };
13
+ //#endregion
14
+ //#region src/components/as-table.vue
15
+ var as_table_default = /* @__PURE__ */ (0, vue.defineComponent)({
16
+ __name: "as-table",
17
+ props: {
18
+ rows: {
19
+ type: Array,
20
+ required: false
21
+ },
22
+ columns: {
23
+ type: Array,
24
+ required: false
25
+ },
26
+ stickyHeader: {
27
+ type: Boolean,
28
+ required: false,
29
+ default: true
30
+ },
31
+ virtualRowHeight: {
32
+ type: Number,
33
+ required: false
34
+ },
35
+ virtualOverscan: {
36
+ type: Number,
37
+ required: false,
38
+ default: 5
39
+ },
40
+ columnMenu: {
41
+ type: Object,
42
+ required: false
43
+ },
44
+ reorderable: {
45
+ type: Boolean,
46
+ required: false,
47
+ default: true
48
+ },
49
+ resizable: {
50
+ type: Boolean,
51
+ required: false,
52
+ default: true
53
+ },
54
+ columnMinWidth: {
55
+ type: Number,
56
+ required: false,
57
+ default: 48
58
+ },
59
+ select: {
60
+ type: String,
61
+ required: false,
62
+ default: "none"
63
+ },
64
+ selectOn: {
65
+ type: String,
66
+ required: false,
67
+ default: "row"
68
+ },
69
+ rowDelete: {
70
+ type: [Boolean, Object],
71
+ required: false,
72
+ default: false
73
+ },
74
+ rowActionsColumn: {
75
+ type: [String, Boolean],
76
+ required: false,
77
+ default: false
78
+ },
79
+ headless: {
80
+ type: Boolean,
81
+ required: false,
82
+ default: false
83
+ },
84
+ rowSelectable: {
85
+ type: Function,
86
+ required: false
87
+ },
88
+ rowClass: {
89
+ type: Function,
90
+ required: false
91
+ },
92
+ rowAttrs: {
93
+ type: Function,
94
+ required: false
95
+ }
96
+ },
97
+ emits: [
98
+ "row-click",
99
+ "row-dblclick",
100
+ "main-action"
101
+ ],
102
+ setup(__props, { emit: __emit }) {
103
+ const props = __props;
104
+ const emit = __emit;
105
+ const { state } = require_use_table_state.useTableContext();
106
+ (0, vue.watch)(() => props.rowDelete, (val) => {
107
+ state.rowDelete.value = val;
108
+ }, { immediate: true });
109
+ (0, vue.watch)(() => props.rowSelectable, (val) => {
110
+ state.rowSelectable.value = val;
111
+ }, { immediate: true });
112
+ require_use_table_selection.useSelectModeReset(state, () => props.select);
113
+ const effectiveRows = (0, vue.computed)(() => state.applyLocalSort(props.rows ?? state.results.value));
114
+ const effectiveColumns = require_as_selection_banner.useRowActionsColumn(state, {
115
+ placement: () => props.rowActionsColumn,
116
+ select: () => props.select,
117
+ columns: () => props.columns ?? state.columns.value
118
+ });
119
+ require_use_table_state.useRegisterMainActionListener(state, (req) => emit("main-action", req.row, req.absIndex, req.event), require_use_has_emit_listener.useHasEmitListener("onMainAction"));
120
+ const { onSort, onHide, onFilter, onFiltersOff, onResetWidth, onReorder, onClearFilters } = require_as_selection_banner.useTableColumnHandlers(state);
121
+ return (_ctx, _cache) => {
122
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_1, [
123
+ (0, vue.createVNode)(require_as_selection_banner.as_selection_banner_default, { scope: "page" }, (0, vue.createSlots)({ _: 2 }, [_ctx.$slots["selection-banner"] ? {
124
+ name: "default",
125
+ fn: (0, vue.withCtx)((bannerProps) => [(0, vue.renderSlot)(_ctx.$slots, "selection-banner", (0, vue.normalizeProps)((0, vue.guardReactiveProps)(bannerProps)))]),
126
+ key: "0"
127
+ } : void 0]), 1024),
128
+ (0, vue.createVNode)(require_as_table_base.as_table_base_default, {
129
+ "render-mode": "standalone",
130
+ columns: (0, vue.unref)(effectiveColumns),
131
+ rows: effectiveRows.value,
132
+ sorters: (0, vue.unref)(state).sorters.value,
133
+ "selected-rows": (0, vue.unref)(state).selectedRows.value,
134
+ select: props.select,
135
+ "select-on": props.selectOn,
136
+ "row-value-fn": (0, vue.unref)(state).rowValueFn,
137
+ querying: (0, vue.unref)(state).querying.value,
138
+ "query-error": (0, vue.unref)(state).queryError.value,
139
+ "on-retry": (0, vue.unref)(state).query,
140
+ "sticky-header": __props.stickyHeader,
141
+ headless: __props.headless,
142
+ "virtual-row-height": __props.virtualRowHeight,
143
+ "virtual-overscan": __props.virtualOverscan,
144
+ filters: (0, vue.unref)(state).filters.value,
145
+ "search-term": (0, vue.unref)(state).searchTerm.value,
146
+ "on-clear-filters": (0, vue.unref)(onClearFilters),
147
+ "column-menu": __props.columnMenu,
148
+ reorderable: __props.reorderable,
149
+ resizable: __props.resizable,
150
+ "column-min-width": __props.columnMinWidth,
151
+ "column-widths": (0, vue.unref)(state).columnWidths.value,
152
+ "row-class": __props.rowClass,
153
+ "row-attrs": __props.rowAttrs,
154
+ onSort: (0, vue.unref)(onSort),
155
+ onHide: (0, vue.unref)(onHide),
156
+ onFilter: (0, vue.unref)(onFilter),
157
+ onFiltersOff: (0, vue.unref)(onFiltersOff),
158
+ onReorder: (0, vue.unref)(onReorder),
159
+ onResize: (0, vue.unref)(state).setColumnWidth,
160
+ onResetWidth: (0, vue.unref)(onResetWidth),
161
+ onRowClick: _cache[0] || (_cache[0] = (row, ev) => emit("row-click", row, ev)),
162
+ onRowDblclick: _cache[1] || (_cache[1] = (row, ev) => emit("row-dblclick", row, ev))
163
+ }, (0, vue.createSlots)({ _: 2 }, [(0, vue.renderList)(_ctx.$slots, (_, name) => {
164
+ return {
165
+ name,
166
+ fn: (0, vue.withCtx)((slotProps) => [(0, vue.renderSlot)(_ctx.$slots, name, (0, vue.normalizeProps)((0, vue.guardReactiveProps)(slotProps ?? {})))])
167
+ };
168
+ })]), 1032, [
169
+ "columns",
170
+ "rows",
171
+ "sorters",
172
+ "selected-rows",
173
+ "select",
174
+ "select-on",
175
+ "row-value-fn",
176
+ "querying",
177
+ "query-error",
178
+ "on-retry",
179
+ "sticky-header",
180
+ "headless",
181
+ "virtual-row-height",
182
+ "virtual-overscan",
183
+ "filters",
184
+ "search-term",
185
+ "on-clear-filters",
186
+ "column-menu",
187
+ "reorderable",
188
+ "resizable",
189
+ "column-min-width",
190
+ "column-widths",
191
+ "row-class",
192
+ "row-attrs",
193
+ "onSort",
194
+ "onHide",
195
+ "onFilter",
196
+ "onFiltersOff",
197
+ "onReorder",
198
+ "onResize",
199
+ "onResetWidth"
200
+ ]),
201
+ (0, vue.unref)(state).querying.value ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", _hoisted_2, [(0, vue.renderSlot)(_ctx.$slots, "query-loading", {}, () => [_cache[2] || (_cache[2] = (0, vue.createElementVNode)("span", {
202
+ class: "as-table-query-overlay-icon",
203
+ "aria-hidden": "true"
204
+ }, null, -1))])])) : (0, vue.createCommentVNode)("v-if", true)
205
+ ]);
206
+ };
207
+ }
208
+ });
209
+ //#endregion
210
+ Object.defineProperty(exports, "as_table_default", {
211
+ enumerable: true,
212
+ get: function() {
213
+ return as_table_default;
214
+ }
215
+ });