@atscript/vue-table 0.1.147 → 0.1.149

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 (177) 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-35yQWbLF.mjs → as-action-menu-content-BBwL1YZU.mjs} +1 -1
  4. package/dist/{as-action-menu-content-BJ0tn6jq.cjs → as-action-menu-content-DAOjkslC.cjs} +1 -1
  5. package/dist/{as-cell-array-CCZ0Ajj9.cjs → as-cell-array-CB4Nt6Fo.cjs} +3 -2
  6. package/dist/{as-cell-array-Bgc4GYZf.mjs → as-cell-array-CnoVd9ps.mjs} +4 -3
  7. package/dist/as-cell-array.cjs +1 -1
  8. package/dist/as-cell-array.d.mts +1 -1
  9. package/dist/as-cell-array.mjs +1 -1
  10. package/dist/{as-cell-date-RU5JPJhI.cjs → as-cell-date-DrnhvCr4.cjs} +3 -14
  11. package/dist/{as-cell-date-B9mu0OOD.mjs → as-cell-date-dhIM7hWA.mjs} +2 -13
  12. package/dist/as-cell-date.cjs +1 -1
  13. package/dist/as-cell-date.d.mts +1 -1
  14. package/dist/as-cell-date.mjs +1 -1
  15. package/dist/{as-cell-json-ByEGYRST.mjs → as-cell-json-ChN_NDhO.mjs} +1 -1
  16. package/dist/{as-cell-json-w5YJxNuF.cjs → as-cell-json-CzHTpkjS.cjs} +1 -1
  17. package/dist/as-cell-json.cjs +1 -1
  18. package/dist/as-cell-json.d.mts +1 -1
  19. package/dist/as-cell-json.mjs +1 -1
  20. package/dist/{as-cell-number-DGJCTXDf.cjs → as-cell-number-C4JMqvqa.cjs} +1 -1
  21. package/dist/{as-cell-number-CNDT6gfw.mjs → as-cell-number-D-mSaE_G.mjs} +1 -1
  22. package/dist/as-cell-number.cjs +1 -1
  23. package/dist/as-cell-number.d.mts +1 -1
  24. package/dist/as-cell-number.mjs +1 -1
  25. package/dist/{as-cell-union-DMnoa7RM.mjs → as-cell-union-C9Bbnkrg.mjs} +1 -1
  26. package/dist/{as-cell-union-LOGvhPeK.cjs → as-cell-union-DpCEHLzN.cjs} +1 -1
  27. package/dist/as-cell-union.cjs +1 -1
  28. package/dist/as-cell-union.d.mts +1 -1
  29. package/dist/as-cell-union.mjs +1 -1
  30. package/dist/as-column-menu.d.cts +1 -1
  31. package/dist/as-column-menu.d.mts +1 -1
  32. package/dist/{as-column-menu.vue-B6iuKmIj.d.cts → as-column-menu.vue-4zJmC_M6.d.mts} +2 -2
  33. package/dist/{as-column-menu.vue-wxb2f92k.d.mts → as-column-menu.vue-CS_8jHG3.d.cts} +2 -2
  34. package/dist/{as-config-dialog-BJkBzaku.cjs → as-config-dialog-CnIvMsK0.cjs} +10 -5
  35. package/dist/{as-config-dialog-D503Ek_m.mjs → as-config-dialog-ZKMnfirD.mjs} +10 -5
  36. package/dist/as-config-dialog.cjs +1 -1
  37. package/dist/as-config-dialog.d.mts +1 -1
  38. package/dist/as-config-dialog.mjs +1 -1
  39. package/dist/{as-confirm-dialog-CJfDnaiU.mjs → as-confirm-dialog-DMiGquH1.mjs} +1 -1
  40. package/dist/{as-confirm-dialog-C5xPbkox.cjs → as-confirm-dialog-cSEHVFBq.cjs} +1 -1
  41. package/dist/as-confirm-dialog.cjs +1 -1
  42. package/dist/as-confirm-dialog.d.mts +1 -1
  43. package/dist/as-confirm-dialog.mjs +1 -1
  44. package/dist/{as-filter-dialog-CxjO-Ge5.mjs → as-filter-dialog-DNFR30fV.mjs} +61 -38
  45. package/dist/{as-filter-dialog-Co0WfWOe.cjs → as-filter-dialog-KjvJdaMg.cjs} +60 -37
  46. package/dist/as-filter-dialog.cjs +1 -1
  47. package/dist/as-filter-dialog.d.mts +1 -1
  48. package/dist/as-filter-dialog.mjs +1 -1
  49. package/dist/{as-filter-field-FTrxFkTw.cjs → as-filter-field-BsucQwbm.cjs} +247 -35
  50. package/dist/{as-filter-field-ByPlGyWz.mjs → as-filter-field-DE6MJMx7.mjs} +227 -39
  51. package/dist/as-filter-field.cjs +1 -1
  52. package/dist/as-filter-field.d.mts +1 -1
  53. package/dist/as-filter-field.mjs +1 -1
  54. package/dist/as-filter-input-ChJ8JE6-.cjs +254 -0
  55. package/dist/as-filter-input-DmOW_jzK.mjs +249 -0
  56. package/dist/as-filter-input.cjs +1 -1
  57. package/dist/as-filter-input.d.cts +1 -1
  58. package/dist/as-filter-input.d.mts +1 -1
  59. package/dist/as-filter-input.mjs +1 -1
  60. package/dist/{as-filter-input.vue-CksJOtqw.d.cts → as-filter-input.vue-BLTzA2Iy.d.cts} +9 -0
  61. package/dist/{as-filter-input.vue-DMwr0ArL.d.mts → as-filter-input.vue-CmWQGQCv.d.mts} +9 -0
  62. package/dist/{as-filters-W3iMELuL.cjs → as-filters-CYC_SXaA.cjs} +4 -4
  63. package/dist/{as-filters-CJZJiOXb.mjs → as-filters-DErM2bFq.mjs} +4 -4
  64. package/dist/as-filters.cjs +1 -1
  65. package/dist/as-filters.d.mts +1 -1
  66. package/dist/as-filters.mjs +1 -1
  67. package/dist/{as-preset-dialog-CLOVEpWZ.mjs → as-preset-dialog-CY5dPfZa.mjs} +2 -2
  68. package/dist/{as-preset-dialog-Dvvx0jmU.cjs → as-preset-dialog-tM-jrQgs.cjs} +2 -2
  69. package/dist/as-preset-dialog.cjs +1 -1
  70. package/dist/as-preset-dialog.d.mts +1 -1
  71. package/dist/as-preset-dialog.mjs +1 -1
  72. package/dist/{as-preset-picker-DFLhbm59.cjs → as-preset-picker-CjSXtx83.cjs} +2 -2
  73. package/dist/{as-preset-picker-CwFObhME.mjs → as-preset-picker-DkZ7sinz.mjs} +2 -2
  74. package/dist/as-preset-picker.cjs +1 -1
  75. package/dist/as-preset-picker.d.mts +1 -1
  76. package/dist/as-preset-picker.mjs +1 -1
  77. package/dist/{as-residual-filter-BRsEs8oe.mjs → as-residual-filter-DHfbtTQj.mjs} +4 -5
  78. package/dist/{as-residual-filter-sZlsFPDS.cjs → as-residual-filter-XkXnMQNu.cjs} +4 -5
  79. package/dist/as-residual-filter.cjs +1 -1
  80. package/dist/as-residual-filter.d.mts +1 -1
  81. package/dist/as-residual-filter.mjs +1 -1
  82. package/dist/{as-row-actions-DyjIXePd.mjs → as-row-actions-BNQ7jrie.mjs} +2 -2
  83. package/dist/{as-row-actions-DFv2cSrP.cjs → as-row-actions-q_oMmUz1.cjs} +2 -2
  84. package/dist/as-row-actions.cjs +1 -1
  85. package/dist/as-row-actions.d.cts +1 -1
  86. package/dist/as-row-actions.d.mts +1 -1
  87. package/dist/as-row-actions.mjs +1 -1
  88. package/dist/{as-row-actions.vue-BHrZBXVU.d.cts → as-row-actions.vue-BB8ATWBY.d.mts} +1 -1
  89. package/dist/{as-row-actions.vue-D4MylwCW.d.mts → as-row-actions.vue-CnjcRD0P.d.cts} +1 -1
  90. package/dist/{as-select-cell-CoQJjhnq.cjs → as-select-cell-Dc3lArvR.cjs} +5 -5
  91. package/dist/{as-select-cell-Dl8fohIj.mjs → as-select-cell-DjcPorVb.mjs} +5 -5
  92. package/dist/{as-selection-banner-DBtLjulh.mjs → as-selection-banner-Ca9DWVdW.mjs} +1 -1
  93. package/dist/{as-selection-banner-BI5gKHqW.cjs → as-selection-banner-CxPXBztW.cjs} +1 -1
  94. package/dist/{as-table-B1FowaPF.cjs → as-table-BIAkCI4g.cjs} +4 -4
  95. package/dist/{as-table-Cpvfv9zA.mjs → as-table-Bcz-WOTS.mjs} +4 -4
  96. package/dist/{as-table-actions-BlbAps1h.mjs → as-table-actions-DPq5SrGa.mjs} +2 -2
  97. package/dist/{as-table-actions-B0xaicfv.cjs → as-table-actions-TaI-NeVv.cjs} +2 -2
  98. package/dist/as-table-actions.cjs +1 -1
  99. package/dist/as-table-actions.d.cts +1 -1
  100. package/dist/as-table-actions.d.mts +1 -1
  101. package/dist/as-table-actions.mjs +1 -1
  102. package/dist/{as-table-actions.vue-7ml3JiOO.d.mts → as-table-actions.vue-C2szPEXd.d.mts} +2 -2
  103. package/dist/{as-table-actions.vue-BKRqHprR.d.cts → as-table-actions.vue-CBD_tEpe.d.cts} +2 -2
  104. package/dist/{as-table-base-EzKaChOp.mjs → as-table-base-CsK79vYe.mjs} +2 -2
  105. package/dist/{as-table-base-LZ26YlWp.cjs → as-table-base-Dvey_Gie.cjs} +2 -2
  106. package/dist/{as-table-cell-value-DoH8Mieo.mjs → as-table-cell-value-D-S127gr.mjs} +13 -2
  107. package/dist/{as-table-cell-value-COyZnwUj.cjs → as-table-cell-value-VWlXc5dA.cjs} +12 -1
  108. package/dist/as-table-cell-value.cjs +1 -1
  109. package/dist/as-table-cell-value.d.mts +1 -1
  110. package/dist/as-table-cell-value.mjs +1 -1
  111. package/dist/{as-table-header-cell-gHhCdxJX.cjs → as-table-header-cell-DB7Cdskr.cjs} +1 -1
  112. package/dist/{as-table-header-cell-DrVzYaof.mjs → as-table-header-cell-ahzAeHXj.mjs} +1 -1
  113. package/dist/as-table-header-cell.cjs +1 -1
  114. package/dist/as-table-header-cell.d.cts +1 -1
  115. package/dist/as-table-header-cell.d.mts +1 -1
  116. package/dist/as-table-header-cell.mjs +1 -1
  117. package/dist/{as-table-header-cell.vue-BCk4NPYT.d.cts → as-table-header-cell.vue-D2s9YLSJ.d.cts} +1 -1
  118. package/dist/{as-table-header-cell.vue-BZU8s9CT.d.mts → as-table-header-cell.vue-DfDNma_Z.d.mts} +1 -1
  119. package/dist/{as-table-root-BYHXuNPI.mjs → as-table-root-BnkF5-rh.mjs} +49 -9
  120. package/dist/{as-table-root-K6fWKHtF.cjs → as-table-root-Nsk-9XaH.cjs} +48 -8
  121. package/dist/as-table-root.cjs +1 -1
  122. package/dist/as-table-root.d.cts +1 -1
  123. package/dist/as-table-root.d.mts +1 -1
  124. package/dist/as-table-root.mjs +1 -1
  125. package/dist/{as-table-root.vue-CF03c4vu.d.cts → as-table-root.vue-BJMOyB9Q.d.cts} +309 -1634
  126. package/dist/{as-table-root.vue-Bm2DxAqU.d.mts → as-table-root.vue-CES8cqKw.d.mts} +309 -1634
  127. package/dist/as-table.cjs +1 -1
  128. package/dist/as-table.d.cts +1 -1
  129. package/dist/as-table.d.mts +1 -1
  130. package/dist/as-table.mjs +1 -1
  131. package/dist/{as-window-table-CygDqZMU.mjs → as-window-table-DjplqWzr.mjs} +4 -4
  132. package/dist/{as-window-table-_flc8o64.cjs → as-window-table-ubm2u8_i.cjs} +4 -4
  133. package/dist/as-window-table.cjs +1 -1
  134. package/dist/as-window-table.d.cts +1 -1
  135. package/dist/as-window-table.d.mts +1 -1
  136. package/dist/as-window-table.mjs +1 -1
  137. package/dist/index.cjs +68 -90
  138. package/dist/index.d.cts +8 -8
  139. package/dist/index.d.mts +21 -21
  140. package/dist/index.mjs +69 -91
  141. package/dist/{intent-scope-BXPEN5kJ.d.cts → intent-scope-CGch9yhy.d.cts} +13 -0
  142. package/dist/{intent-scope-Ck7RZ0dK.d.mts → intent-scope-CvD4YOvf.d.mts} +13 -0
  143. package/dist/use-condition-format-5LcuInDy.mjs +34 -0
  144. package/dist/use-condition-format-DrgfX6xL.cjs +39 -0
  145. package/dist/{use-table-DP6Y0kbl.mjs → use-table-BYNBpLJt.mjs} +23 -2
  146. package/dist/{use-table-CydIJZbx.cjs → use-table-C9qI-TL6.cjs} +22 -1
  147. package/dist/{use-table-component-aqfGzECx.cjs → use-table-component-CsdvdGJT.cjs} +1 -1
  148. package/dist/{use-table-component-DNGUvhf7.mjs → use-table-component-Dy397695.mjs} +1 -1
  149. package/dist/{use-table-nav-bridge-BhOPIT2R.mjs → use-table-nav-bridge-CJBERyPB.mjs} +1 -1
  150. package/dist/{use-table-nav-bridge-B7A30yja.cjs → use-table-nav-bridge-Gm4ZfOjJ.cjs} +1 -1
  151. package/dist/{use-table-state-sDnqOi3b.cjs → use-table-state-BQchKxUr.cjs} +53 -6
  152. package/dist/{use-table-state-1OZfdhQi.mjs → use-table-state-CIoWhwTD.mjs} +54 -7
  153. package/package.json +11 -11
  154. package/dist/as-filter-input-BM23TNeh.mjs +0 -101
  155. package/dist/as-filter-input-DJu2k9gO.cjs +0 -106
  156. /package/dist/{as-cell-array.vue-Dj3nZop3.d.mts → as-cell-array.vue-D4vS7C_D.d.mts} +0 -0
  157. /package/dist/{as-cell-date.vue-BPuyH7q3.d.mts → as-cell-date.vue-Chs7WTZ9.d.mts} +0 -0
  158. /package/dist/{as-cell-json-popover-Dkdv5Y9E.mjs → as-cell-json-popover-CH5bAcLE.mjs} +0 -0
  159. /package/dist/{as-cell-json-popover-BM2QLgfk.cjs → as-cell-json-popover-vty5vMjW.cjs} +0 -0
  160. /package/dist/{as-cell-json.vue-D8J7YwVV.d.mts → as-cell-json.vue-C0_LDvQw.d.mts} +0 -0
  161. /package/dist/{as-cell-number.vue-sUoZvuat.d.mts → as-cell-number.vue-BBF0OuU8.d.mts} +0 -0
  162. /package/dist/{as-cell-union.vue-DZBejMxR.d.mts → as-cell-union.vue-CL-Lf-Rm.d.mts} +0 -0
  163. /package/dist/{as-config-dialog.vue-D2AVR1a5.d.mts → as-config-dialog.vue-BvFZZRuY.d.mts} +0 -0
  164. /package/dist/{as-confirm-dialog.vue-BxAaCuYf.d.mts → as-confirm-dialog.vue-Cz52-v6c.d.mts} +0 -0
  165. /package/dist/{as-filter-dialog.vue-WYXGtymZ.d.mts → as-filter-dialog.vue-likNLqzF.d.mts} +0 -0
  166. /package/dist/{as-filter-field.vue-DTpuDkHh.d.mts → as-filter-field.vue-BbXLhd6O.d.mts} +0 -0
  167. /package/dist/{as-filters.vue-dHbGmcbr.d.mts → as-filters.vue-Bu4wK0iD.d.mts} +0 -0
  168. /package/dist/{as-preset-dialog.vue-BrnvBWxJ.d.mts → as-preset-dialog.vue-BRjjfPty.d.mts} +0 -0
  169. /package/dist/{as-preset-picker.vue-OaAV2v9z.d.mts → as-preset-picker.vue-DAUZOlOD.d.mts} +0 -0
  170. /package/dist/{as-residual-filter.vue-Cev_8Wy7.d.mts → as-residual-filter.vue-DbeOOtR7.d.mts} +0 -0
  171. /package/dist/{as-table-cell-value.vue-kfNgVhzn.d.mts → as-table-cell-value.vue-BXIH_yfq.d.mts} +0 -0
  172. /package/dist/{error-message-CfKpn_5w.cjs → error-message-CoUcpWal.cjs} +0 -0
  173. /package/dist/{error-message-gNEXnnbb.mjs → error-message-rziSiSjs.mjs} +0 -0
  174. /package/dist/{use-cell-locale-MQXoONh5.mjs → use-cell-locale-BTJZ6UcP.mjs} +0 -0
  175. /package/dist/{use-cell-locale-BGBRQB7s.cjs → use-cell-locale-Dv514-Al.cjs} +0 -0
  176. /package/dist/{use-has-emit-listener-DrBbsLHQ.mjs → use-has-emit-listener-CsF2w9iT.mjs} +0 -0
  177. /package/dist/{use-has-emit-listener-BaGFZDyM.cjs → use-has-emit-listener-gD1aWp6N.cjs} +0 -0
@@ -1,11 +1,171 @@
1
- import { a as useTableContext } from "./use-table-state-1OZfdhQi.mjs";
2
- import { r as useTable } from "./use-table-DP6Y0kbl.mjs";
3
- import { t as as_table_base_default } from "./as-table-base-EzKaChOp.mjs";
4
- import { ValueHelpClient, getMetaEntry, resolveValueHelp, valueHelpDictPaths } from "@atscript/ui";
5
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, onBeforeUnmount, openBlock, ref, renderList, shallowRef, toDisplayString, unref, useId, watch, withCtx, withKeys, withModifiers } from "vue";
6
- import { arraysEqual, debounce, formatFilterCondition, isFilled, isSimpleEq, parseColumnFilterInput } from "@atscript/ui-table";
1
+ import { a as useTableContext } from "./use-table-state-CIoWhwTD.mjs";
2
+ import { r as useTable } from "./use-table-BYNBpLJt.mjs";
3
+ import { t as useConditionFormat } from "./use-condition-format-5LcuInDy.mjs";
4
+ import { t as as_table_base_default } from "./as-table-base-CsK79vYe.mjs";
5
+ import { NUMERIC_VALUE_KINDS, ValueHelpClient, fetchDistinctValues, getMetaEntry, isPickerDeclined, optionValue, resolveValueHelp, valueHelpDictPaths } from "@atscript/ui";
6
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, onBeforeUnmount, openBlock, ref, renderList, shallowReactive, shallowRef, toDisplayString, unref, useId, watch, withCtx, withKeys, withModifiers } from "vue";
7
+ import { arraysEqual, columnFilterKind, debounce, isFilled, isSimpleEq, isTemporalKind, parseColumnFilterInput, stableValueKey } from "@atscript/ui-table";
7
8
  import { until } from "@vueuse/core";
8
9
  import { ComboboxAnchor, ComboboxContent, ComboboxInput, ComboboxRoot, ComboboxViewport } from "reka-ui";
10
+ //#region src/composables/use-value-pickers.ts
11
+ /** The single "Value" column of an enum or distinct-values picker table (rows carry `__value` / `__label`). */
12
+ function valueColumn(sortable) {
13
+ return {
14
+ path: "__label",
15
+ label: "Value",
16
+ type: "text",
17
+ sortable,
18
+ filterable: false,
19
+ nullable: false,
20
+ order: 0
21
+ };
22
+ }
23
+ /** How long an unsearched first page is reused (the inline field and the dialog share it). */
24
+ const PAGE1_TTL_MS = 3e4;
25
+ const createStore = () => ({
26
+ declined: shallowReactive(/* @__PURE__ */ new Set()),
27
+ page1: /* @__PURE__ */ new Map()
28
+ });
29
+ const stores = /* @__PURE__ */ new WeakMap();
30
+ function storeOf(host) {
31
+ const def = host?.tableDef.value;
32
+ if (!def) return createStore();
33
+ let store = stores.get(def);
34
+ if (!store) {
35
+ store = createStore();
36
+ stores.set(def, store);
37
+ }
38
+ return store;
39
+ }
40
+ const keyOf = (info) => `${info.url}\0${info.targetField}`;
41
+ /**
42
+ * Whether `column` offers a value picker: literal options, the distinct values of
43
+ * its own table, or a dictionary the server has not declined for this table —
44
+ * and only on a column the server filters by value with the operators a picker
45
+ * emits (`$eq` / `$in`): an existence-only (JSON-stored) column takes the
46
+ * empty / not-empty input instead.
47
+ */
48
+ function hasValuePicker(host, column) {
49
+ if (!column.filterable) return false;
50
+ const ops = column.filterOps;
51
+ if (ops && !(ops.includes("$eq") || ops.includes("$in"))) return false;
52
+ if (column.options?.length || column.distinct) return true;
53
+ const info = column.valueHelpInfo;
54
+ return !!info && !storeOf(host).declined.has(keyOf(info));
55
+ }
56
+ /**
57
+ * The dictionary answered 4xx (not readable for this caller): this table stops
58
+ * offering that picker and the column takes free text. Anything else is no verdict.
59
+ */
60
+ function declineIfRejected(host, info, err) {
61
+ if (isPickerDeclined(err)) storeOf(host).declined.add(keyOf(info));
62
+ }
63
+ /**
64
+ * Pager over the distinct values of `column.distinct`: `fetch(searchTerm, page, size)`
65
+ * asks the table's controller via `$groupBy`. Values are ordered (and so paged) only
66
+ * on a sortable column; otherwise the first `size` values are the whole list — search
67
+ * narrows it. A 4xx rejects: the picker shows the error. An unsearched first page is
68
+ * reused for a short while, so reopening a picker (or its dialog) does not re-ask.
69
+ */
70
+ function createDistinctPager(host, column) {
71
+ const { url, field } = column.distinct;
72
+ const numeric = column.valueKind !== void 0 && NUMERIC_VALUE_KINDS.has(column.valueKind);
73
+ const paged = column.sortable;
74
+ return async function fetch(searchTerm, page, size) {
75
+ const text = searchTerm.trim();
76
+ const skip = paged ? (page - 1) * size : 0;
77
+ const empty = !paged && page > 1;
78
+ const scope = host?.forceFilters?.value;
79
+ const load = () => fetchDistinctValues(getMetaEntry(url).client, field, {
80
+ text,
81
+ limit: size,
82
+ skip,
83
+ sortable: paged,
84
+ numeric,
85
+ filter: scope
86
+ });
87
+ let result;
88
+ if (empty) result = {
89
+ items: [],
90
+ hasMore: false
91
+ };
92
+ else if (text || page > 1) result = await load();
93
+ else {
94
+ const store = storeOf(host);
95
+ const key = `${url}\0${field}\0${size}\0${scope ? stableValueKey(scope) : ""}`;
96
+ let hit = store.page1.get(key);
97
+ if (!hit || Date.now() - hit.at > PAGE1_TTL_MS) {
98
+ const pending = load();
99
+ hit = {
100
+ at: Date.now(),
101
+ result: pending
102
+ };
103
+ store.page1.set(key, hit);
104
+ pending.catch(() => store.page1.delete(key));
105
+ }
106
+ result = await hit.result;
107
+ }
108
+ const hasMore = paged && result.hasMore;
109
+ const count = skip + result.items.length + (hasMore ? 1 : 0);
110
+ return {
111
+ data: result.items.map((v) => ({
112
+ __value: v,
113
+ __label: String(v)
114
+ })),
115
+ count,
116
+ page,
117
+ itemsPerPage: size,
118
+ pages: Math.max(1, Math.ceil(count / size))
119
+ };
120
+ };
121
+ }
122
+ /**
123
+ * Reactive state of an inline distinct-values dropdown over `pager`: the first
124
+ * `shown` values of the first `size`, and how many exist (`count`, one past `size`
125
+ * when more follow — the dialog pages the rest). A superseded search is dropped.
126
+ */
127
+ function useDistinctPicker(pager, size, shown) {
128
+ const rows = shallowRef([]);
129
+ const count = ref(0);
130
+ /** More values exist past the first `size` (`count` is then one past `size`). */
131
+ const more = ref(false);
132
+ const querying = ref(false);
133
+ const error = shallowRef(null);
134
+ /** The first page arrived once — reopening the dropdown does not ask again. */
135
+ const loaded = ref(false);
136
+ let seq = 0;
137
+ async function load(text) {
138
+ const mine = ++seq;
139
+ querying.value = true;
140
+ try {
141
+ const res = await pager(text, 1, size);
142
+ if (mine !== seq) return;
143
+ rows.value = res.data.slice(0, shown);
144
+ count.value = res.count;
145
+ more.value = res.count > size;
146
+ error.value = null;
147
+ loaded.value = true;
148
+ } catch (err) {
149
+ if (mine !== seq) return;
150
+ rows.value = [];
151
+ count.value = 0;
152
+ more.value = false;
153
+ error.value = err instanceof Error ? err : new Error(String(err));
154
+ } finally {
155
+ if (mine === seq) querying.value = false;
156
+ }
157
+ }
158
+ return {
159
+ rows,
160
+ count,
161
+ more,
162
+ querying,
163
+ error,
164
+ loaded,
165
+ load
166
+ };
167
+ }
168
+ //#endregion
9
169
  //#region src/composables/use-drag-scroll.ts
10
170
  /**
11
171
  * Pointer-drag horizontal scroll for a container. Listens for pointerdown on
@@ -115,8 +275,11 @@ const _hoisted_15 = ["onClick"];
115
275
  const _hoisted_16 = [
116
276
  "id",
117
277
  "value",
278
+ "placeholder",
118
279
  "onKeydown"
119
280
  ];
281
+ const DISTINCT_WINDOW = 100;
282
+ const DISTINCT_SHOWN = 10;
120
283
  //#endregion
121
284
  //#region src/components/defaults/as-filter-field.vue
122
285
  var as_filter_field_default = /* @__PURE__ */ defineComponent({
@@ -128,28 +291,34 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
128
291
  setup(__props) {
129
292
  const props = __props;
130
293
  const { state } = useTableContext();
294
+ const { formatCondition } = useConditionFormat(state);
295
+ const isTemporal = computed(() => isTemporalKind(columnFilterKind(props.column)));
131
296
  const chipsScrollEl = ref(null);
132
297
  useDragScroll(chipsScrollEl);
133
298
  const info = props.column.valueHelpInfo;
134
- const hasValueHelp = !!info;
299
+ const distinct = props.column.distinct;
135
300
  const hasOptions = !!(props.column.options && props.column.options.length > 0);
136
- const hasDropdown = hasValueHelp || hasOptions;
301
+ const hasDropdown = computed(() => hasValuePicker(state, props.column));
137
302
  let vhClient;
138
303
  let innerState;
139
304
  const resolved = shallowRef(null);
140
- if (hasValueHelp && info) {
305
+ if (info) {
141
306
  vhClient = new ValueHelpClient(getMetaEntry(info.url).client);
142
307
  innerState = useTable(info.url, {
143
308
  select: "none",
144
309
  queryOnMount: false,
145
310
  limit: 10,
146
- provideContext: false
311
+ provideContext: false,
312
+ forceFilters: info.filter,
313
+ alwaysSelected: [info.targetField]
147
314
  });
148
315
  }
316
+ const distinctPicker = distinct ? useDistinctPicker(createDistinctPager(state, props.column), DISTINCT_WINDOW, DISTINCT_SHOWN) : void 0;
149
317
  const dictColumns = computed(() => {
150
318
  if (!resolved.value || !innerState) return [];
151
319
  const paths = valueHelpDictPaths(resolved.value);
152
- return innerState.allColumns.value.filter((c) => paths.has(c.path));
320
+ const pinned = new Set(info?.pinned);
321
+ return innerState.allColumns.value.filter((c) => paths.has(c.path) && !pinned.has(c.path));
153
322
  });
154
323
  async function ensureResolved() {
155
324
  if (resolved.value) return resolved.value;
@@ -157,7 +326,8 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
157
326
  try {
158
327
  resolved.value = await resolveValueHelp(info.url);
159
328
  return resolved.value;
160
- } catch {
329
+ } catch (err) {
330
+ declineIfRejected(state, info, err);
161
331
  return null;
162
332
  }
163
333
  }
@@ -166,33 +336,28 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
166
336
  }
167
337
  const enumRows = hasOptions ? computed(() => (props.column.options ?? []).map((opt) => ({
168
338
  __key: opt.key,
169
- __label: opt.label
339
+ __label: opt.label,
340
+ __value: optionValue(opt)
170
341
  }))) : void 0;
171
- const enumColumns = hasOptions ? [{
172
- path: "__label",
173
- label: "Value",
174
- type: "text",
175
- sortable: false,
176
- filterable: false,
177
- order: 0
178
- }] : void 0;
342
+ const enumColumns = hasOptions || distinct ? [valueColumn(false)] : void 0;
179
343
  const dropdownRows = computed(() => {
180
344
  if (innerState) return innerState.results.value;
345
+ if (distinctPicker) return distinctPicker.rows.value;
181
346
  if (enumRows) return enumRows.value;
182
347
  return [];
183
348
  });
184
349
  const dropdownColumns = computed(() => {
185
- if (hasValueHelp) return dictColumns.value;
350
+ if (info) return dictColumns.value;
186
351
  if (enumColumns) return enumColumns;
187
352
  return [];
188
353
  });
189
354
  const dropdownQuerying = computed(() => {
190
355
  if (innerState) return innerState.querying.value;
191
- return false;
356
+ return distinctPicker?.querying.value ?? false;
192
357
  });
193
358
  const dropdownQueryError = computed(() => {
194
359
  if (innerState) return innerState.queryError.value;
195
- return null;
360
+ return distinctPicker?.error.value ?? null;
196
361
  });
197
362
  const dropdownLoadingMetadata = computed(() => {
198
363
  if (innerState) return innerState.loadingMetadata.value;
@@ -200,17 +365,21 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
200
365
  });
201
366
  const seeAllCount = computed(() => {
202
367
  if (innerState) return innerState.totalCount.value;
368
+ if (distinctPicker) return distinctPicker.count.value;
203
369
  if (enumRows) return enumRows.value.length;
204
370
  return 0;
205
371
  });
372
+ /** "100+" when a distinct picker has more values than its first page (its count is one past it). */
373
+ const seeAllLabel = computed(() => !innerState && distinctPicker?.more.value ? `${distinctPicker.count.value - 1}+` : String(seeAllCount.value));
206
374
  function extractEqValues(conditions) {
207
375
  if (!conditions) return [];
208
376
  const values = [];
209
377
  for (const c of conditions) if (isSimpleEq(c)) values.push(c.value[0]);
210
378
  return values;
211
379
  }
212
- const selectedValues = ref(hasDropdown ? extractEqValues(state.filters.value[props.column.path]) : []);
213
- if (hasDropdown) {
380
+ const dropdownCapable = !!info || hasOptions || !!distinct;
381
+ const selectedValues = ref(dropdownCapable ? extractEqValues(state.filters.value[props.column.path]) : []);
382
+ if (dropdownCapable) {
214
383
  watch(selectedValues, (values) => {
215
384
  if (arraysEqual(values, extractEqValues(state.filters.value[props.column.path]))) return;
216
385
  const nonEq = (state.filters.value[props.column.path] ?? []).filter((c) => c.type !== "eq");
@@ -229,7 +398,7 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
229
398
  const chips = computed(() => {
230
399
  return (state.filters.value[props.column.path] ?? []).filter(isFilled).map((cond, i) => ({
231
400
  key: `${cond.type}:${i}:${String(cond.value[0] ?? "")}`,
232
- label: formatFilterCondition(cond),
401
+ label: formatCondition(props.column, cond),
233
402
  condition: cond
234
403
  }));
235
404
  });
@@ -243,8 +412,8 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
243
412
  if (len > prev) scrollChipsToEnd();
244
413
  });
245
414
  function rowValueFn(row) {
246
- if (hasValueHelp && info) return row[info.targetField];
247
- if (hasOptions) return row.__key;
415
+ if (info) return row[info.targetField];
416
+ if (hasOptions || distinct) return row.__value;
248
417
  }
249
418
  const inputId = useId();
250
419
  const searchTerm = ref("");
@@ -260,17 +429,27 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
260
429
  }
261
430
  innerState.query();
262
431
  }, { once: true });
263
- const debouncedSearch = hasValueHelp ? debounce(() => {
432
+ const serverSearch = !!info || !!distinct;
433
+ const debouncedSearch = serverSearch ? debounce(() => {
264
434
  doSearch(searchTerm.value);
265
435
  }, 500) : void 0;
436
+ if (distinctPicker) {
437
+ watch(() => stableValueKey(state.forceFilters.value ?? null), () => {
438
+ distinctPicker.loaded.value = false;
439
+ });
440
+ watch(dropdownOpen, (open) => {
441
+ if (open && !distinctPicker.loaded.value && !distinctPicker.querying.value) distinctPicker.load("");
442
+ });
443
+ }
266
444
  onBeforeUnmount(() => {
267
445
  debouncedSearch?.cancel();
268
446
  });
269
447
  function onSearchInput(event) {
270
448
  searchTerm.value = event.target.value;
271
- if (hasValueHelp) debouncedSearch();
449
+ if (serverSearch) debouncedSearch();
272
450
  }
273
451
  async function doSearch(text) {
452
+ if (distinctPicker) return distinctPicker.load(text);
274
453
  if (!vhClient || !innerState) return;
275
454
  const r = await ensureResolved();
276
455
  if (!r) return;
@@ -279,7 +458,9 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
279
458
  const result = await vhClient.search(r, {
280
459
  text: text || void 0,
281
460
  mode: "filter",
282
- limit: 10
461
+ limit: 10,
462
+ filter: info?.filter,
463
+ valueField: info?.targetField
283
464
  });
284
465
  innerState.results.value = result.items;
285
466
  innerState.queryError.value = null;
@@ -302,7 +483,9 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
302
483
  });
303
484
  }
304
485
  const noEnumMatches = computed(() => {
305
- if (!dropdownOpen.value || !enumRows) return false;
486
+ if (!dropdownOpen.value) return false;
487
+ if (distinctPicker) return !distinctPicker.querying.value && !distinctPicker.error.value && distinctPicker.rows.value.length === 0;
488
+ if (!enumRows) return false;
306
489
  return filterFunction(enumRows.value).length === 0;
307
490
  });
308
491
  function removeChip(chip) {
@@ -334,7 +517,7 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
334
517
  scrollChipsToEnd();
335
518
  }
336
519
  function onEnter() {
337
- if (hasDropdown || !searchTerm.value.trim()) return;
520
+ if (hasDropdown.value || !searchTerm.value.trim()) return;
338
521
  const parsed = parseColumnFilterInput(searchTerm.value, props.column);
339
522
  if (!parsed) return;
340
523
  const filled = (state.filters.value[props.column.path] ?? []).filter(isFilled);
@@ -356,7 +539,7 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
356
539
  dropdownLoadingMetadata.value ? (openBlock(), createElementBlock("div", _hoisted_4, [..._cache[5] || (_cache[5] = [createElementVNode("span", {
357
540
  class: "as-filter-field-loading-icon",
358
541
  "aria-hidden": "true"
359
- }, null, -1)])])) : unref(hasDropdown) ? (openBlock(), createBlock(unref(ComboboxRoot), {
542
+ }, null, -1)])])) : hasDropdown.value ? (openBlock(), createBlock(unref(ComboboxRoot), {
360
543
  key: 1,
361
544
  modelValue: selectedValues.value,
362
545
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => selectedValues.value = $event),
@@ -364,7 +547,7 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
364
547
  "onUpdate:open": _cache[2] || (_cache[2] = ($event) => dropdownOpen.value = $event),
365
548
  multiple: true,
366
549
  "reset-search-term-on-blur": false,
367
- "ignore-filter": hasValueHelp,
550
+ "ignore-filter": unref(serverSearch),
368
551
  "as-child": ""
369
552
  }, {
370
553
  default: withCtx(() => [createVNode(unref(ComboboxAnchor), { "as-child": "" }, {
@@ -452,11 +635,15 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
452
635
  key: 1,
453
636
  type: "button",
454
637
  onClick: openFilterDialog
455
- }, [createTextVNode(" See All (" + toDisplayString(seeAllCount.value) + ") ", 1), _cache[12] || (_cache[12] = createElementVNode("span", { class: "as-kbd" }, "F4", -1))])) : createCommentVNode("v-if", true)])) : createCommentVNode("v-if", true)]),
638
+ }, [createTextVNode(" See All (" + toDisplayString(seeAllLabel.value) + ") ", 1), _cache[12] || (_cache[12] = createElementVNode("span", { class: "as-kbd" }, "F4", -1))])) : createCommentVNode("v-if", true)])) : createCommentVNode("v-if", true)]),
456
639
  _: 1
457
640
  })]),
458
641
  _: 1
459
- }, 8, ["modelValue", "open"])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createCommentVNode(" Plain input (no dropdown) "), createElementVNode("div", _hoisted_14, [createElementVNode("div", {
642
+ }, 8, [
643
+ "modelValue",
644
+ "open",
645
+ "ignore-filter"
646
+ ])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createCommentVNode(" Plain input (no dropdown) "), createElementVNode("div", _hoisted_14, [createElementVNode("div", {
460
647
  ref_key: "chipsScrollEl",
461
648
  ref: chipsScrollEl,
462
649
  class: "as-filter-field-chips"
@@ -474,6 +661,7 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
474
661
  id: unref(inputId),
475
662
  class: "as-filter-field-search",
476
663
  value: searchTerm.value,
664
+ placeholder: isTemporal.value ? "YYYY-MM-DD" : void 0,
477
665
  onInput: _cache[3] || (_cache[3] = ($event) => searchTerm.value = $event.target.value),
478
666
  onKeydown: [
479
667
  withKeys(onBackspace, ["backspace"]),
@@ -499,4 +687,4 @@ var as_filter_field_default = /* @__PURE__ */ defineComponent({
499
687
  }
500
688
  });
501
689
  //#endregion
502
- export { as_filter_field_default as t };
690
+ export { valueColumn as a, hasValuePicker as i, createDistinctPager as n, declineIfRejected as r, as_filter_field_default as t };
@@ -1,2 +1,2 @@
1
- const require_as_filter_field = require("./as-filter-field-FTrxFkTw.cjs");
1
+ const require_as_filter_field = require("./as-filter-field-BsucQwbm.cjs");
2
2
  module.exports = require_as_filter_field.as_filter_field_default;
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./as-filter-field.vue-DTpuDkHh.mjs";
1
+ import { t as _default } from "./as-filter-field.vue-BbXLhd6O.mjs";
2
2
  export { _default as default };
@@ -1,2 +1,2 @@
1
- import { t as as_filter_field_default } from "./as-filter-field-ByPlGyWz.mjs";
1
+ import { t as as_filter_field_default } from "./as-filter-field-DE6MJMx7.mjs";
2
2
  export { as_filter_field_default as default };