@atscript/vue-table 0.1.138 → 0.1.140

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 (185) 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-D8f60mY-.cjs → as-action-menu-content-B5RFt7Hc.cjs} +1 -1
  4. package/dist/{as-action-menu-content-CVlExEpl.mjs → as-action-menu-content-KNJr1EkO.mjs} +1 -1
  5. package/dist/{as-cell-array-BWHkJX3I.mjs → as-cell-array-Bgc4GYZf.mjs} +1 -1
  6. package/dist/{as-cell-array-D-8Pqlgo.cjs → as-cell-array-CCZ0Ajj9.cjs} +1 -1
  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-mGlnDeLP.mjs → as-cell-date-B9mu0OOD.mjs} +1 -1
  11. package/dist/{as-cell-date-DviMJEqs.cjs → as-cell-date-RU5JPJhI.cjs} +1 -1
  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-2I081xnO.mjs → as-cell-json-ByEGYRST.mjs} +1 -1
  16. package/dist/{as-cell-json-CaVB6e7V.cjs → as-cell-json-w5YJxNuF.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-CP2AZI9g.mjs → as-cell-number-CNDT6gfw.mjs} +1 -1
  21. package/dist/{as-cell-number-BnYbxOiG.cjs → as-cell-number-DGJCTXDf.cjs} +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-NHpDCXty.mjs → as-cell-union-DMnoa7RM.mjs} +2 -2
  26. package/dist/{as-cell-union-BjMP91PS.cjs → as-cell-union-LOGvhPeK.cjs} +2 -2
  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-BMTS3DO2.mjs → as-column-menu-CBtUfYEE.mjs} +2 -2
  31. package/dist/{as-column-menu-D_8NxujZ.cjs → as-column-menu-ChB7hzmr.cjs} +1 -1
  32. package/dist/as-column-menu.cjs +1 -1
  33. package/dist/as-column-menu.d.cts +1 -1
  34. package/dist/as-column-menu.d.mts +1 -1
  35. package/dist/as-column-menu.mjs +1 -1
  36. package/dist/{as-column-menu.vue-SRkxrvo_.d.mts → as-column-menu.vue-DKQNY5gh.d.cts} +2 -2
  37. package/dist/{as-column-menu.vue-CgvDp7JK.d.cts → as-column-menu.vue-hOmuVcKf.d.mts} +2 -2
  38. package/dist/{as-config-dialog-BrVhIV_e.cjs → as-config-dialog-B1KJJSHE.cjs} +4 -4
  39. package/dist/{as-config-dialog-DHdpmRo9.mjs → as-config-dialog-JXNkCCrh.mjs} +5 -5
  40. package/dist/as-config-dialog.cjs +1 -1
  41. package/dist/as-config-dialog.d.mts +1 -1
  42. package/dist/as-config-dialog.mjs +1 -1
  43. package/dist/{as-confirm-dialog-BG5vlbvV.mjs → as-confirm-dialog-CC6U8nLZ.mjs} +1 -1
  44. package/dist/{as-confirm-dialog-iytk-urB.cjs → as-confirm-dialog-a736BLOm.cjs} +1 -1
  45. package/dist/as-confirm-dialog.cjs +1 -1
  46. package/dist/as-confirm-dialog.d.mts +1 -1
  47. package/dist/as-confirm-dialog.mjs +1 -1
  48. package/dist/{as-filter-dialog-Dis7tkN_.mjs → as-filter-dialog-C3wltqrN.mjs} +16 -16
  49. package/dist/{as-filter-dialog-CW8-zoag.cjs → as-filter-dialog-IflKkOd8.cjs} +15 -15
  50. package/dist/as-filter-dialog.cjs +1 -1
  51. package/dist/as-filter-dialog.d.mts +1 -1
  52. package/dist/as-filter-dialog.mjs +1 -1
  53. package/dist/{as-filter-field-BKoxTudl.mjs → as-filter-field-D_6DlFcp.mjs} +5 -6
  54. package/dist/{as-filter-field-bVIXoH3j.cjs → as-filter-field-pygBjA-K.cjs} +4 -5
  55. package/dist/as-filter-field.cjs +1 -1
  56. package/dist/as-filter-field.d.mts +1 -1
  57. package/dist/as-filter-field.mjs +1 -1
  58. package/dist/as-filter-input.cjs +1 -1
  59. package/dist/as-filter-input.d.mts +1 -1
  60. package/dist/as-filter-input.mjs +1 -1
  61. package/dist/{as-filters-CxVy00LQ.mjs → as-filters-BDzQ2SM_.mjs} +19 -4
  62. package/dist/{as-filters-Dx8WkGiA.cjs → as-filters-BIoEsPD0.cjs} +19 -4
  63. package/dist/as-filters.cjs +1 -1
  64. package/dist/as-filters.d.cts +1 -1
  65. package/dist/as-filters.d.mts +1 -1
  66. package/dist/as-filters.mjs +1 -1
  67. package/dist/{as-filters.vue-DcxDnWAU.d.cts → as-filters.vue-BSgUEh4D.d.mts} +23 -1
  68. package/dist/{as-filters.vue-BG_ysCkC.d.mts → as-filters.vue-DMXZhQW3.d.cts} +23 -1
  69. package/dist/{as-preset-dialog-D8o2ChtM.cjs → as-preset-dialog-BgZB8xyk.cjs} +2 -2
  70. package/dist/{as-preset-dialog-C0f_6VxJ.mjs → as-preset-dialog-D_w4cxKS.mjs} +2 -2
  71. package/dist/as-preset-dialog.cjs +1 -1
  72. package/dist/as-preset-dialog.d.mts +1 -1
  73. package/dist/as-preset-dialog.mjs +1 -1
  74. package/dist/{as-preset-picker-CDItDinB.mjs → as-preset-picker-B8d6l3U1.mjs} +12 -7
  75. package/dist/{as-preset-picker-DonMQ8Ia.cjs → as-preset-picker-XnGrqHyF.cjs} +12 -7
  76. package/dist/as-preset-picker.cjs +1 -1
  77. package/dist/as-preset-picker.d.mts +1 -1
  78. package/dist/as-preset-picker.mjs +1 -1
  79. package/dist/as-residual-filter-C65QsWxr.mjs +49 -0
  80. package/dist/as-residual-filter-ihvXCtpH.cjs +54 -0
  81. package/dist/as-residual-filter.cjs +2 -0
  82. package/dist/as-residual-filter.d.cts +2 -0
  83. package/dist/as-residual-filter.d.mts +2 -0
  84. package/dist/as-residual-filter.mjs +2 -0
  85. package/dist/as-residual-filter.vue-Dfw1l2wS.d.cts +21 -0
  86. package/dist/as-residual-filter.vue-N89YqlCz.d.mts +21 -0
  87. package/dist/{as-row-actions-CAiCfw8d.cjs → as-row-actions-C6N0lcZb.cjs} +2 -2
  88. package/dist/{as-row-actions-B8YANdb4.mjs → as-row-actions-xQ9M1PrO.mjs} +2 -2
  89. package/dist/as-row-actions.cjs +1 -1
  90. package/dist/as-row-actions.d.cts +1 -1
  91. package/dist/as-row-actions.d.mts +1 -1
  92. package/dist/as-row-actions.mjs +1 -1
  93. package/dist/{as-row-actions.vue-BCgHsU18.d.mts → as-row-actions.vue-B3XAxDAL.d.cts} +1 -1
  94. package/dist/{as-row-actions.vue-C49h8PpE.d.cts → as-row-actions.vue-C8vslg0n.d.mts} +1 -1
  95. package/dist/{as-table-BAoJ60tx.mjs → as-table-B49x0hDM.mjs} +3 -3
  96. package/dist/{as-table-actions-8yf2QIER.cjs → as-table-actions-B-jY3s6f.cjs} +2 -2
  97. package/dist/{as-table-actions-z5xUWtvK.mjs → as-table-actions-B2Hy3h7v.mjs} +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-BTGQnFH_.d.mts → as-table-actions.vue-BgTJuXEH.d.cts} +2 -2
  103. package/dist/{as-table-actions.vue-oxyikRAt.d.cts → as-table-actions.vue-BnLH2NqO.d.mts} +2 -2
  104. package/dist/{as-table-base-DA5T7x_K.mjs → as-table-base-DErJfFYz.mjs} +2 -2
  105. package/dist/{as-table-base-wPJuru7P.cjs → as-table-base-ceywcVRq.cjs} +2 -2
  106. package/dist/{as-table-cell-value-BAi5yadc.cjs → as-table-cell-value-COyZnwUj.cjs} +1 -1
  107. package/dist/{as-table-cell-value-BVcfhhCb.mjs → as-table-cell-value-DoH8Mieo.mjs} +1 -1
  108. package/dist/as-table-cell-value.cjs +1 -1
  109. package/dist/as-table-cell-value.d.cts +1 -1
  110. package/dist/as-table-cell-value.d.mts +1 -1
  111. package/dist/as-table-cell-value.mjs +1 -1
  112. package/dist/{as-table-header-cell-Cl8waY_g.mjs → as-table-header-cell-Ccf06b2_.mjs} +2 -2
  113. package/dist/{as-table-header-cell-CiRLNVJz.cjs → as-table-header-cell-ZCk3XD_d.cjs} +2 -2
  114. package/dist/as-table-header-cell.cjs +1 -1
  115. package/dist/as-table-header-cell.d.cts +1 -1
  116. package/dist/as-table-header-cell.d.mts +1 -1
  117. package/dist/as-table-header-cell.mjs +1 -1
  118. package/dist/{as-table-header-cell.vue-BjgxfKhi.d.cts → as-table-header-cell.vue-C7jNmdDh.d.mts} +2 -2
  119. package/dist/{as-table-header-cell.vue-zGeuzm3w.d.mts → as-table-header-cell.vue-DkClJBAT.d.cts} +2 -2
  120. package/dist/{as-table-QoXP-NZr.cjs → as-table-ouPxssqv.cjs} +3 -3
  121. package/dist/{as-table-root-Bza3ZGJZ.mjs → as-table-root-CG7bLzcQ.mjs} +18 -29
  122. package/dist/{as-table-root-C6a6iO6M.cjs → as-table-root-_58hdHAi.cjs} +19 -30
  123. package/dist/as-table-root.cjs +1 -1
  124. package/dist/as-table-root.d.cts +1 -1
  125. package/dist/as-table-root.d.mts +1 -1
  126. package/dist/as-table-root.mjs +1 -1
  127. package/dist/{as-table-root.vue-Dze91qga.d.cts → as-table-root.vue-D8hH1xGK.d.cts} +29 -5
  128. package/dist/{as-table-root.vue-DnOHVQtA.d.mts → as-table-root.vue-DpPRMy3v.d.mts} +29 -5
  129. package/dist/{as-table-status-aebsG7bR.mjs → as-table-status-2rA91OFT.mjs} +5 -5
  130. package/dist/{as-table-status-B2O3hLGg.cjs → as-table-status-UWTPJJUL.cjs} +5 -5
  131. package/dist/as-table.cjs +1 -1
  132. package/dist/as-table.d.cts +1 -1
  133. package/dist/as-table.d.mts +1 -1
  134. package/dist/as-table.mjs +1 -1
  135. package/dist/{as-table.vue-emq84QmP.d.mts → as-table.vue-Bv6sKnL5.d.cts} +3 -3
  136. package/dist/{as-table.vue-BSKifGzD.d.cts → as-table.vue-CudFoZTF.d.mts} +3 -3
  137. package/dist/{as-window-table-DS30wumm.cjs → as-window-table-C9YtzepV.cjs} +3 -3
  138. package/dist/{as-window-table-ByTXS8yA.mjs → as-window-table-KyS6YUpa.mjs} +3 -3
  139. package/dist/as-window-table.cjs +1 -1
  140. package/dist/as-window-table.d.cts +1 -1
  141. package/dist/as-window-table.d.mts +1 -1
  142. package/dist/as-window-table.mjs +1 -1
  143. package/dist/{as-window-table.vue-DJNJ-6dd.d.cts → as-window-table.vue-COVl3die.d.mts} +2 -2
  144. package/dist/{as-window-table.vue-DUJgZDXy.d.mts → as-window-table.vue-CRWdhOgC.d.cts} +2 -2
  145. package/dist/index.cjs +45 -71
  146. package/dist/index.d.cts +10 -10
  147. package/dist/index.d.mts +22 -22
  148. package/dist/index.mjs +46 -72
  149. package/dist/{types-CsgAGRfG.d.mts → types-BCixOa8x.d.cts} +41 -11
  150. package/dist/{types-DvWLY5zQ.d.cts → types-D7qVxU_y.d.mts} +41 -11
  151. package/dist/{use-table-DRN4nlZs.mjs → use-table-2xPxoNRX.mjs} +3 -2
  152. package/dist/{use-table-JU7BAX4e.cjs → use-table-B45WZLwg.cjs} +3 -2
  153. package/dist/{use-table-column-handlers-DGn4ZW9j.mjs → use-table-column-handlers-p_xK-l0e.mjs} +1 -1
  154. package/dist/{use-table-column-handlers-r47WDxEh.cjs → use-table-column-handlers-rqFo9HLz.cjs} +1 -1
  155. package/dist/{use-table-component-VUFlxIk-.mjs → use-table-component-BYO0zMQj.mjs} +1 -1
  156. package/dist/{use-table-component-DIWiP_Vs.cjs → use-table-component-XQ-Qt_sp.cjs} +1 -1
  157. package/dist/{use-table-nav-bridge-DT8oU-6r.mjs → use-table-nav-bridge-BDBnRc4C.mjs} +1 -1
  158. package/dist/{use-table-nav-bridge-BBtXE70x.cjs → use-table-nav-bridge-DvrsPanF.cjs} +1 -1
  159. package/dist/{use-table-state-CqU1N4Q9.mjs → use-table-state-BzjbnpBA.mjs} +100 -12
  160. package/dist/{use-table-state-CoVe_8NI.cjs → use-table-state-pF_9gnTG.cjs} +104 -10
  161. package/package.json +14 -7
  162. /package/dist/{as-cell-array.vue-D4vS7C_D.d.mts → as-cell-array.vue-ow34clSF.d.mts} +0 -0
  163. /package/dist/{as-cell-date.vue-Chs7WTZ9.d.mts → as-cell-date.vue-B4JCr1qP.d.mts} +0 -0
  164. /package/dist/{as-cell-json-popover-vty5vMjW.cjs → as-cell-json-popover-BM2QLgfk.cjs} +0 -0
  165. /package/dist/{as-cell-json-popover-CH5bAcLE.mjs → as-cell-json-popover-Dkdv5Y9E.mjs} +0 -0
  166. /package/dist/{as-cell-json.vue-C0_LDvQw.d.mts → as-cell-json.vue-B-T3TuFj.d.mts} +0 -0
  167. /package/dist/{as-cell-number.vue-BBF0OuU8.d.mts → as-cell-number.vue-CNH2fbCB.d.mts} +0 -0
  168. /package/dist/{as-cell-union.vue-CL-Lf-Rm.d.mts → as-cell-union.vue-CZwN81H4.d.mts} +0 -0
  169. /package/dist/{as-config-dialog.vue-BvFZZRuY.d.mts → as-config-dialog.vue-BKo2GpzN.d.mts} +0 -0
  170. /package/dist/{as-confirm-dialog.vue-Cz52-v6c.d.mts → as-confirm-dialog.vue-BN_yzu3h.d.mts} +0 -0
  171. /package/dist/{as-filter-dialog.vue-likNLqzF.d.mts → as-filter-dialog.vue-Bl8OIKOf.d.mts} +0 -0
  172. /package/dist/{as-filter-field.vue-BbXLhd6O.d.mts → as-filter-field.vue-DD0IZXS1.d.mts} +0 -0
  173. /package/dist/{as-filter-input-C8KmOus8.mjs → as-filter-input-BM23TNeh.mjs} +0 -0
  174. /package/dist/{as-filter-input-DUqpkTkg.cjs → as-filter-input-DJu2k9gO.cjs} +0 -0
  175. /package/dist/{as-filter-input.vue-B9ma2l9j.d.mts → as-filter-input.vue-CFZ33B--.d.mts} +0 -0
  176. /package/dist/{as-preset-dialog.vue-BRjjfPty.d.mts → as-preset-dialog.vue-ChM7H7B4.d.mts} +0 -0
  177. /package/dist/{as-preset-picker.vue-BPjsiaVt.d.mts → as-preset-picker.vue-OaAV2v9z.d.mts} +0 -0
  178. /package/dist/{as-table-cell-value.vue-BgFDv2JQ.d.cts → as-table-cell-value.vue-C0VR9GRK.d.cts} +0 -0
  179. /package/dist/{as-table-cell-value.vue-kfNgVhzn.d.mts → as-table-cell-value.vue-DphckGq-.d.mts} +0 -0
  180. /package/dist/{format-cell-Bx7wNc4X.mjs → format-cell-D1Ziv96Q.mjs} +0 -0
  181. /package/dist/{format-cell-DaxV6WIJ.cjs → format-cell-vCNTh4WZ.cjs} +0 -0
  182. /package/dist/{use-cell-locale-caG2Fzpc.cjs → use-cell-locale-BGBRQB7s.cjs} +0 -0
  183. /package/dist/{use-cell-locale-CxQOQsns.mjs → use-cell-locale-MQXoONh5.mjs} +0 -0
  184. /package/dist/{use-seed-on-open-DSh4XFyp.mjs → use-seed-on-open-DO3A1kIb.mjs} +0 -0
  185. /package/dist/{use-seed-on-open-9TSm1Vbv.cjs → use-seed-on-open-Dg9I89fU.cjs} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { t as getCellValue } from "./get-cell-value-Cb3X8nUn.mjs";
2
2
  import { navigateHrefFor } from "@atscript/ui";
3
3
  import { computed, inject, nextTick, onBeforeUnmount, onScopeDispose, provide, ref, shallowRef, toValue, watch } from "vue";
4
- import { STANDARD_PRESET_ID, blockStartFor, buildTableQuery, cellAsString, debounce, derivePresetAspects, fromWireSnapshot, gateOwns, isDirtyAgainst, isFilled, isSystemPresetId, mergeDisplayColumns, mergeSorters, pageAlignedBlocksFor, planFetch, reconcileColumnWidthDefaults, resolveAspectGate, resolveSystemPresets, rowsToPks, sameColumnSet, sortRowsLocally, sortersEqual, stateToUrlQueryString, togglePk, urlQueryStringToState, walkBackwardAbsorb, walkForwardAbsorb } from "@atscript/ui-table";
4
+ import { DEV, STANDARD_PRESET_ID, arraysEqual, blockStartFor, buildTableQuery, cellAsString, debounce, derivePresetAspects, filterExprFields, filterExprKey, fromWireSnapshot, gateOwns, isDirtyAgainst, isFilled, isSystemPresetId, mergeDisplayColumns, mergeSorters, normalizeResidualFilters, pageAlignedBlocksFor, planFetch, reconcileColumnWidthDefaults, residualGateOwns, resolveAspectGate, resolveSystemPresets, rowsToPks, sameColumnSet, sortRowsLocally, sortersEqual, stateToUrlQueryString, togglePk, urlQueryStringToState, walkBackwardAbsorb, walkForwardAbsorb } from "@atscript/ui-table";
5
5
  import { formatIdentifier } from "@atscript/db-client";
6
6
  //#region src/types.ts
7
7
  /** UI-side sentinel for the synthesised row-delete processor. */
@@ -1023,6 +1023,7 @@ function createPresetState(opts) {
1023
1023
  apply(o, value, isSystem) {
1024
1024
  if (!value && !isSystem) return;
1025
1025
  o.filters.value = value ? { ...value } : {};
1026
+ if (o.residualFilters?.value.length) o.residualFilters.value = [];
1026
1027
  },
1027
1028
  expandDefault: () => ({})
1028
1029
  },
@@ -1151,7 +1152,7 @@ function createPresetState(opts) {
1151
1152
  const wire = row.data?.content;
1152
1153
  return wire ? fromWireSnapshot(wire) : {};
1153
1154
  });
1154
- const isDirty = computed(() => isDirtyAgainst(activeSnapshot.value, captureSnapshot()));
1155
+ const isDirty = computed(() => isDirtyAgainst(activeSnapshot.value, captureSnapshot()) || activeSnapshot.value.filterOps !== void 0 && !!opts.residualFilters?.value.length);
1155
1156
  function requirePresets() {
1156
1157
  if (!opts.presetsHandle) throw new Error("[vue-table] presets feature not configured (preset.url missing)");
1157
1158
  return opts.presetsHandle;
@@ -1586,6 +1587,26 @@ function createRequestSlot(cancelValue) {
1586
1587
  release
1587
1588
  };
1588
1589
  }
1590
+ const cloneConditions = (conds) => conds.map((c) => ({
1591
+ type: c.type,
1592
+ value: [...c.value]
1593
+ }));
1594
+ const cloneSorter = (s) => ({
1595
+ field: s.field,
1596
+ direction: s.direction
1597
+ });
1598
+ /** Same residual conditions, in the same (canonical) order. */
1599
+ function sameResidualFilters(a, b) {
1600
+ return arraysEqual(a.map(filterExprKey), b.map(filterExprKey));
1601
+ }
1602
+ /**
1603
+ * The report for a restored URL's filter piece when nobody handles it
1604
+ * (`onUnsupportedFilter` / `@unsupported-filter`): a dev-mode warning.
1605
+ */
1606
+ function warnUnsupportedFilter(issue) {
1607
+ if (!DEV) return;
1608
+ console.warn(`[vue-table] URL filter left out (${issue.reason}): ${JSON.stringify(issue.expr)}. Field filters cannot express it, so the table shows more rows than the URL described.`);
1609
+ }
1589
1610
  function createTableState(opts) {
1590
1611
  const client = opts.client;
1591
1612
  const modelOpts = opts.model;
@@ -1622,6 +1643,7 @@ function createTableState(opts) {
1622
1643
  */
1623
1644
  const rowActionsPolicy = computed(() => compileRowActionsConfig(rowActions.value));
1624
1645
  const filters = shallowRef({});
1646
+ const residualFilters = shallowRef([]);
1625
1647
  const results = shallowRef([]);
1626
1648
  const resultsStart = ref(0);
1627
1649
  const querying = ref(false);
@@ -1664,6 +1686,7 @@ function createTableState(opts) {
1664
1686
  columnWidths,
1665
1687
  filterFields,
1666
1688
  filters,
1689
+ residualFilters,
1667
1690
  sorters,
1668
1691
  pagination,
1669
1692
  allColumns,
@@ -1762,6 +1785,7 @@ function createTableState(opts) {
1762
1785
  sorters: splitSorters.value.server,
1763
1786
  forceSorters: queryOpts?.forceSorters,
1764
1787
  filters: filters.value,
1788
+ residualFilters: residualFilters.value,
1765
1789
  forceFilters: queryOpts?.forceFilters,
1766
1790
  search: searchTerm.value || void 0,
1767
1791
  ignoreSorters: sortersIgnored(),
@@ -1948,6 +1972,10 @@ function createTableState(opts) {
1948
1972
  }
1949
1973
  };
1950
1974
  }
1975
+ function setResidualFilters(exprs) {
1976
+ const next = normalizeResidualFilters(exprs);
1977
+ if (!sameResidualFilters(next, residualFilters.value)) residualFilters.value = next;
1978
+ }
1951
1979
  const state = {
1952
1980
  tableDef,
1953
1981
  loadingMetadata,
@@ -1957,6 +1985,7 @@ function createTableState(opts) {
1957
1985
  columnWidths,
1958
1986
  filterFields,
1959
1987
  filters,
1988
+ residualFilters,
1960
1989
  sorters,
1961
1990
  results,
1962
1991
  resultsStart,
@@ -2031,8 +2060,14 @@ function createTableState(opts) {
2031
2060
  loadingAt,
2032
2061
  errorAt,
2033
2062
  resetFilters() {
2034
- if (Object.keys(filters.value).length === 0) return;
2035
- filters.value = {};
2063
+ if (Object.keys(filters.value).length > 0) filters.value = {};
2064
+ if (residualFilters.value.length > 0) residualFilters.value = [];
2065
+ },
2066
+ setResidualFilters,
2067
+ removeResidualFilter(index) {
2068
+ const list = residualFilters.value;
2069
+ if (index < 0 || index >= list.length) return;
2070
+ residualFilters.value = list.filter((_, i) => i !== index);
2036
2071
  },
2037
2072
  showConfigDialog(tab) {
2038
2073
  configTab.value = tab ?? "columns";
@@ -2083,6 +2118,7 @@ function createTableState(opts) {
2083
2118
  function serializeStateForUrl() {
2084
2119
  return stateToUrlQueryString({
2085
2120
  filters: filters.value,
2121
+ residualFilters: residualFilters.value,
2086
2122
  sorters: sorters.value,
2087
2123
  page: pagination.value.page,
2088
2124
  itemsPerPage: pagination.value.itemsPerPage,
@@ -2111,31 +2147,78 @@ function createTableState(opts) {
2111
2147
  lastEmittedUrl = next;
2112
2148
  queryOpts.onUrlQueryChange(next);
2113
2149
  }
2150
+ const filtersGate = resolveAspectGate(urlQuerySync?.filters);
2151
+ const sortersGate = resolveAspectGate(urlQuerySync?.sorters);
2152
+ const residualSync = urlQuerySync?.residual !== false;
2153
+ const urlOwnsResidual = (expr) => residualSync && residualGateOwns(filtersGate, expr);
2154
+ let urlBaseline = null;
2155
+ function captureUrlBaseline() {
2156
+ if (urlBaseline) return;
2157
+ const owned = {};
2158
+ for (const path in filters.value) {
2159
+ if (!gateOwns(filtersGate, path)) continue;
2160
+ owned[path] = cloneConditions(filters.value[path]);
2161
+ }
2162
+ urlBaseline = {
2163
+ filters: owned,
2164
+ residual: residualFilters.value.filter(urlOwnsResidual),
2165
+ sorters: sorters.value.filter((s) => gateOwns(sortersGate, s.field)).map(cloneSorter)
2166
+ };
2167
+ }
2168
+ if (queryOpts?.onUrlQueryChange) {
2169
+ const gate = queryOpts.urlQueryReady;
2170
+ if (!gate || gate.value) lastEmittedUrl = serializeStateForUrl();
2171
+ else {
2172
+ const stop = watch(() => gate.value, () => {
2173
+ captureUrlBaseline();
2174
+ lastEmittedUrl = serializeStateForUrl();
2175
+ stop();
2176
+ }, { flush: "sync" });
2177
+ }
2178
+ }
2114
2179
  function applyUrlQuery(urlString, opts) {
2180
+ captureUrlBaseline();
2115
2181
  if (urlsEquivalent(urlString, lastEmittedUrl)) return;
2116
- const replace = opts?.mode === "replace";
2117
2182
  const cols = allColumns.value;
2118
2183
  const parsed = urlQueryStringToState(urlString, {
2119
- knownFields: cols.length > 0 ? cols.map((c) => c.path) : void 0,
2184
+ knownFields: cols.length > 0 ? cols.filter((c) => !c.local).map((c) => c.path) : void 0,
2120
2185
  sync: urlQuerySync
2121
2186
  });
2187
+ for (const issue of parsed.unsupported ?? []) (queryOpts?.onUnsupportedFilter ?? warnUnsupportedFilter)(issue);
2188
+ const urlResidual = parsed.residual ?? [];
2189
+ const residualPaths = new Set(urlResidual.flatMap((expr) => filterExprFields(expr)));
2190
+ const base = (opts?.mode ? opts.mode === "replace" : parsed.snapshot === true) ? null : urlBaseline;
2122
2191
  const currentItemsPerPage = pagination.value.itemsPerPage;
2123
2192
  const skip = parsed.skip ?? 0;
2124
2193
  const nextPage = skip > 0 && currentItemsPerPage > 0 ? Math.floor(skip / currentItemsPerPage) + 1 : 1;
2125
2194
  const wasQueryDetected = queryDetected;
2126
2195
  hydratingFromUrl = true;
2127
- const filtersGate = resolveAspectGate(urlQuerySync?.filters);
2128
2196
  if (filtersGate !== "none") {
2129
2197
  const next = {};
2130
- for (const path in filters.value) if (!replace || !gateOwns(filtersGate, path)) next[path] = filters.value[path];
2198
+ const fromBase = (path) => !!base?.filters[path] && !residualPaths.has(path);
2199
+ for (const path in filters.value) if (!gateOwns(filtersGate, path)) next[path] = filters.value[path];
2200
+ else if (fromBase(path)) next[path] = cloneConditions(base.filters[path]);
2201
+ if (base) {
2202
+ for (const path in base.filters) if (fromBase(path)) next[path] ??= cloneConditions(base.filters[path]);
2203
+ }
2131
2204
  for (const path in parsed.filters) next[path] = parsed.filters[path];
2132
2205
  filters.value = next;
2133
2206
  }
2134
- const sortersGate = resolveAspectGate(urlQuerySync?.sorters);
2207
+ if (residualSync) {
2208
+ const mentioned = new Set([...Object.keys(parsed.filters), ...residualPaths]);
2209
+ const next = residualFilters.value.filter((expr) => !urlOwnsResidual(expr));
2210
+ if (base) {
2211
+ for (const expr of base.residual) if (!filterExprFields(expr).some((f) => mentioned.has(f))) next.push(expr);
2212
+ }
2213
+ next.push(...urlResidual);
2214
+ setResidualFilters(next);
2215
+ }
2135
2216
  let urlSortersChanged = false;
2136
2217
  if (sortersGate !== "none") {
2137
2218
  const urlSortFields = new Set(parsed.sorters.map((s) => s.field));
2138
- const merged = [...sorters.value.filter((s) => !(replace ? gateOwns(sortersGate, s.field) : urlSortFields.has(s.field))), ...parsed.sorters];
2219
+ const start = sorters.value.filter((s) => !gateOwns(sortersGate, s.field));
2220
+ if (base) start.push(...base.sorters.map(cloneSorter));
2221
+ const merged = [...start.filter((s) => !urlSortFields.has(s.field)), ...parsed.sorters];
2139
2222
  if (!sortersEqual(sorters.value, merged)) {
2140
2223
  sorters.value = merged;
2141
2224
  urlSortersChanged = true;
@@ -2174,7 +2257,11 @@ function createTableState(opts) {
2174
2257
  const debouncedFilterQuery = debounce(() => {
2175
2258
  if (queryDetected) scheduleQuery();
2176
2259
  }, FILTER_DEBOUNCE_MS);
2177
- watch([() => filters.value, () => searchTerm.value], () => {
2260
+ watch([
2261
+ () => filters.value,
2262
+ () => residualFilters.value,
2263
+ () => searchTerm.value
2264
+ ], () => {
2178
2265
  if (hydratingFromUrl) return;
2179
2266
  if (!queryDetected) return;
2180
2267
  mustRefresh.value = true;
@@ -2221,6 +2308,7 @@ function createTableState(opts) {
2221
2308
  });
2222
2309
  watch([
2223
2310
  () => filters.value,
2311
+ () => residualFilters.value,
2224
2312
  () => sorters.value,
2225
2313
  () => searchTerm.value,
2226
2314
  () => pagination.value,
@@ -2405,4 +2493,4 @@ function useRegisterMainActionListener(state, listener, enabled) {
2405
2493
  });
2406
2494
  }
2407
2495
  //#endregion
2408
- export { isModClick as C, ROW_ACTIONS_TYPE as D, ROW_ACTIONS_PATH as E, intentToScope as S, triggerAction as T, ariaLabelFor as _, useTableContext as a, extractIdentifier as b, ASPECT_ICONS as c, readPresetLabel as d, INTERACTIVE_SELECTOR as f, applyRowsGate as g, applyRowGate as h, useRegisterMainActionListener as i, ASPECT_LABELS as l, rowActionHref as m, createTableState as n, useTableContextOptional as o, onSelectControlKeydown as p, provideTableContext as r, DEFAULT_AVAILABLE_ASPECTS as s, createStaticTableState as t, ownerNameOf as u, collectIdentifiers as v, isPlainLeftClick as w, intentClass as x, createNavigateGestures as y };
2496
+ export { intentToScope as C, ROW_ACTIONS_PATH as D, triggerAction as E, ROW_ACTIONS_TYPE as O, intentClass as S, isPlainLeftClick as T, applyRowsGate as _, useTableContext as a, createNavigateGestures as b, DEFAULT_AVAILABLE_ASPECTS as c, ownerNameOf as d, readPresetLabel as f, applyRowGate as g, rowActionHref as h, useRegisterMainActionListener as i, ASPECT_ICONS as l, onSelectControlKeydown as m, createTableState as n, useTableContextOptional as o, INTERACTIVE_SELECTOR as p, provideTableContext as r, warnUnsupportedFilter as s, createStaticTableState as t, ASPECT_LABELS as u, ariaLabelFor as v, isModClick as w, extractIdentifier as x, collectIdentifiers as y };
@@ -1023,6 +1023,7 @@ function createPresetState(opts) {
1023
1023
  apply(o, value, isSystem) {
1024
1024
  if (!value && !isSystem) return;
1025
1025
  o.filters.value = value ? { ...value } : {};
1026
+ if (o.residualFilters?.value.length) o.residualFilters.value = [];
1026
1027
  },
1027
1028
  expandDefault: () => ({})
1028
1029
  },
@@ -1151,7 +1152,7 @@ function createPresetState(opts) {
1151
1152
  const wire = row.data?.content;
1152
1153
  return wire ? (0, _atscript_ui_table.fromWireSnapshot)(wire) : {};
1153
1154
  });
1154
- const isDirty = (0, vue.computed)(() => (0, _atscript_ui_table.isDirtyAgainst)(activeSnapshot.value, captureSnapshot()));
1155
+ const isDirty = (0, vue.computed)(() => (0, _atscript_ui_table.isDirtyAgainst)(activeSnapshot.value, captureSnapshot()) || activeSnapshot.value.filterOps !== void 0 && !!opts.residualFilters?.value.length);
1155
1156
  function requirePresets() {
1156
1157
  if (!opts.presetsHandle) throw new Error("[vue-table] presets feature not configured (preset.url missing)");
1157
1158
  return opts.presetsHandle;
@@ -1586,6 +1587,26 @@ function createRequestSlot(cancelValue) {
1586
1587
  release
1587
1588
  };
1588
1589
  }
1590
+ const cloneConditions = (conds) => conds.map((c) => ({
1591
+ type: c.type,
1592
+ value: [...c.value]
1593
+ }));
1594
+ const cloneSorter = (s) => ({
1595
+ field: s.field,
1596
+ direction: s.direction
1597
+ });
1598
+ /** Same residual conditions, in the same (canonical) order. */
1599
+ function sameResidualFilters(a, b) {
1600
+ return (0, _atscript_ui_table.arraysEqual)(a.map(_atscript_ui_table.filterExprKey), b.map(_atscript_ui_table.filterExprKey));
1601
+ }
1602
+ /**
1603
+ * The report for a restored URL's filter piece when nobody handles it
1604
+ * (`onUnsupportedFilter` / `@unsupported-filter`): a dev-mode warning.
1605
+ */
1606
+ function warnUnsupportedFilter(issue) {
1607
+ if (!_atscript_ui_table.DEV) return;
1608
+ console.warn(`[vue-table] URL filter left out (${issue.reason}): ${JSON.stringify(issue.expr)}. Field filters cannot express it, so the table shows more rows than the URL described.`);
1609
+ }
1589
1610
  function createTableState(opts) {
1590
1611
  const client = opts.client;
1591
1612
  const modelOpts = opts.model;
@@ -1622,6 +1643,7 @@ function createTableState(opts) {
1622
1643
  */
1623
1644
  const rowActionsPolicy = (0, vue.computed)(() => compileRowActionsConfig(rowActions.value));
1624
1645
  const filters = (0, vue.shallowRef)({});
1646
+ const residualFilters = (0, vue.shallowRef)([]);
1625
1647
  const results = (0, vue.shallowRef)([]);
1626
1648
  const resultsStart = (0, vue.ref)(0);
1627
1649
  const querying = (0, vue.ref)(false);
@@ -1664,6 +1686,7 @@ function createTableState(opts) {
1664
1686
  columnWidths,
1665
1687
  filterFields,
1666
1688
  filters,
1689
+ residualFilters,
1667
1690
  sorters,
1668
1691
  pagination,
1669
1692
  allColumns,
@@ -1762,6 +1785,7 @@ function createTableState(opts) {
1762
1785
  sorters: splitSorters.value.server,
1763
1786
  forceSorters: queryOpts?.forceSorters,
1764
1787
  filters: filters.value,
1788
+ residualFilters: residualFilters.value,
1765
1789
  forceFilters: queryOpts?.forceFilters,
1766
1790
  search: searchTerm.value || void 0,
1767
1791
  ignoreSorters: sortersIgnored(),
@@ -1948,6 +1972,10 @@ function createTableState(opts) {
1948
1972
  }
1949
1973
  };
1950
1974
  }
1975
+ function setResidualFilters(exprs) {
1976
+ const next = (0, _atscript_ui_table.normalizeResidualFilters)(exprs);
1977
+ if (!sameResidualFilters(next, residualFilters.value)) residualFilters.value = next;
1978
+ }
1951
1979
  const state = {
1952
1980
  tableDef,
1953
1981
  loadingMetadata,
@@ -1957,6 +1985,7 @@ function createTableState(opts) {
1957
1985
  columnWidths,
1958
1986
  filterFields,
1959
1987
  filters,
1988
+ residualFilters,
1960
1989
  sorters,
1961
1990
  results,
1962
1991
  resultsStart,
@@ -2031,8 +2060,14 @@ function createTableState(opts) {
2031
2060
  loadingAt,
2032
2061
  errorAt,
2033
2062
  resetFilters() {
2034
- if (Object.keys(filters.value).length === 0) return;
2035
- filters.value = {};
2063
+ if (Object.keys(filters.value).length > 0) filters.value = {};
2064
+ if (residualFilters.value.length > 0) residualFilters.value = [];
2065
+ },
2066
+ setResidualFilters,
2067
+ removeResidualFilter(index) {
2068
+ const list = residualFilters.value;
2069
+ if (index < 0 || index >= list.length) return;
2070
+ residualFilters.value = list.filter((_, i) => i !== index);
2036
2071
  },
2037
2072
  showConfigDialog(tab) {
2038
2073
  configTab.value = tab ?? "columns";
@@ -2083,6 +2118,7 @@ function createTableState(opts) {
2083
2118
  function serializeStateForUrl() {
2084
2119
  return (0, _atscript_ui_table.stateToUrlQueryString)({
2085
2120
  filters: filters.value,
2121
+ residualFilters: residualFilters.value,
2086
2122
  sorters: sorters.value,
2087
2123
  page: pagination.value.page,
2088
2124
  itemsPerPage: pagination.value.itemsPerPage,
@@ -2111,31 +2147,78 @@ function createTableState(opts) {
2111
2147
  lastEmittedUrl = next;
2112
2148
  queryOpts.onUrlQueryChange(next);
2113
2149
  }
2150
+ const filtersGate = (0, _atscript_ui_table.resolveAspectGate)(urlQuerySync?.filters);
2151
+ const sortersGate = (0, _atscript_ui_table.resolveAspectGate)(urlQuerySync?.sorters);
2152
+ const residualSync = urlQuerySync?.residual !== false;
2153
+ const urlOwnsResidual = (expr) => residualSync && (0, _atscript_ui_table.residualGateOwns)(filtersGate, expr);
2154
+ let urlBaseline = null;
2155
+ function captureUrlBaseline() {
2156
+ if (urlBaseline) return;
2157
+ const owned = {};
2158
+ for (const path in filters.value) {
2159
+ if (!(0, _atscript_ui_table.gateOwns)(filtersGate, path)) continue;
2160
+ owned[path] = cloneConditions(filters.value[path]);
2161
+ }
2162
+ urlBaseline = {
2163
+ filters: owned,
2164
+ residual: residualFilters.value.filter(urlOwnsResidual),
2165
+ sorters: sorters.value.filter((s) => (0, _atscript_ui_table.gateOwns)(sortersGate, s.field)).map(cloneSorter)
2166
+ };
2167
+ }
2168
+ if (queryOpts?.onUrlQueryChange) {
2169
+ const gate = queryOpts.urlQueryReady;
2170
+ if (!gate || gate.value) lastEmittedUrl = serializeStateForUrl();
2171
+ else {
2172
+ const stop = (0, vue.watch)(() => gate.value, () => {
2173
+ captureUrlBaseline();
2174
+ lastEmittedUrl = serializeStateForUrl();
2175
+ stop();
2176
+ }, { flush: "sync" });
2177
+ }
2178
+ }
2114
2179
  function applyUrlQuery(urlString, opts) {
2180
+ captureUrlBaseline();
2115
2181
  if (urlsEquivalent(urlString, lastEmittedUrl)) return;
2116
- const replace = opts?.mode === "replace";
2117
2182
  const cols = allColumns.value;
2118
2183
  const parsed = (0, _atscript_ui_table.urlQueryStringToState)(urlString, {
2119
- knownFields: cols.length > 0 ? cols.map((c) => c.path) : void 0,
2184
+ knownFields: cols.length > 0 ? cols.filter((c) => !c.local).map((c) => c.path) : void 0,
2120
2185
  sync: urlQuerySync
2121
2186
  });
2187
+ for (const issue of parsed.unsupported ?? []) (queryOpts?.onUnsupportedFilter ?? warnUnsupportedFilter)(issue);
2188
+ const urlResidual = parsed.residual ?? [];
2189
+ const residualPaths = new Set(urlResidual.flatMap((expr) => (0, _atscript_ui_table.filterExprFields)(expr)));
2190
+ const base = (opts?.mode ? opts.mode === "replace" : parsed.snapshot === true) ? null : urlBaseline;
2122
2191
  const currentItemsPerPage = pagination.value.itemsPerPage;
2123
2192
  const skip = parsed.skip ?? 0;
2124
2193
  const nextPage = skip > 0 && currentItemsPerPage > 0 ? Math.floor(skip / currentItemsPerPage) + 1 : 1;
2125
2194
  const wasQueryDetected = queryDetected;
2126
2195
  hydratingFromUrl = true;
2127
- const filtersGate = (0, _atscript_ui_table.resolveAspectGate)(urlQuerySync?.filters);
2128
2196
  if (filtersGate !== "none") {
2129
2197
  const next = {};
2130
- for (const path in filters.value) if (!replace || !(0, _atscript_ui_table.gateOwns)(filtersGate, path)) next[path] = filters.value[path];
2198
+ const fromBase = (path) => !!base?.filters[path] && !residualPaths.has(path);
2199
+ for (const path in filters.value) if (!(0, _atscript_ui_table.gateOwns)(filtersGate, path)) next[path] = filters.value[path];
2200
+ else if (fromBase(path)) next[path] = cloneConditions(base.filters[path]);
2201
+ if (base) {
2202
+ for (const path in base.filters) if (fromBase(path)) next[path] ??= cloneConditions(base.filters[path]);
2203
+ }
2131
2204
  for (const path in parsed.filters) next[path] = parsed.filters[path];
2132
2205
  filters.value = next;
2133
2206
  }
2134
- const sortersGate = (0, _atscript_ui_table.resolveAspectGate)(urlQuerySync?.sorters);
2207
+ if (residualSync) {
2208
+ const mentioned = new Set([...Object.keys(parsed.filters), ...residualPaths]);
2209
+ const next = residualFilters.value.filter((expr) => !urlOwnsResidual(expr));
2210
+ if (base) {
2211
+ for (const expr of base.residual) if (!(0, _atscript_ui_table.filterExprFields)(expr).some((f) => mentioned.has(f))) next.push(expr);
2212
+ }
2213
+ next.push(...urlResidual);
2214
+ setResidualFilters(next);
2215
+ }
2135
2216
  let urlSortersChanged = false;
2136
2217
  if (sortersGate !== "none") {
2137
2218
  const urlSortFields = new Set(parsed.sorters.map((s) => s.field));
2138
- const merged = [...sorters.value.filter((s) => !(replace ? (0, _atscript_ui_table.gateOwns)(sortersGate, s.field) : urlSortFields.has(s.field))), ...parsed.sorters];
2219
+ const start = sorters.value.filter((s) => !(0, _atscript_ui_table.gateOwns)(sortersGate, s.field));
2220
+ if (base) start.push(...base.sorters.map(cloneSorter));
2221
+ const merged = [...start.filter((s) => !urlSortFields.has(s.field)), ...parsed.sorters];
2139
2222
  if (!(0, _atscript_ui_table.sortersEqual)(sorters.value, merged)) {
2140
2223
  sorters.value = merged;
2141
2224
  urlSortersChanged = true;
@@ -2174,7 +2257,11 @@ function createTableState(opts) {
2174
2257
  const debouncedFilterQuery = (0, _atscript_ui_table.debounce)(() => {
2175
2258
  if (queryDetected) scheduleQuery();
2176
2259
  }, FILTER_DEBOUNCE_MS);
2177
- (0, vue.watch)([() => filters.value, () => searchTerm.value], () => {
2260
+ (0, vue.watch)([
2261
+ () => filters.value,
2262
+ () => residualFilters.value,
2263
+ () => searchTerm.value
2264
+ ], () => {
2178
2265
  if (hydratingFromUrl) return;
2179
2266
  if (!queryDetected) return;
2180
2267
  mustRefresh.value = true;
@@ -2221,6 +2308,7 @@ function createTableState(opts) {
2221
2308
  });
2222
2309
  (0, vue.watch)([
2223
2310
  () => filters.value,
2311
+ () => residualFilters.value,
2224
2312
  () => sorters.value,
2225
2313
  () => searchTerm.value,
2226
2314
  () => pagination.value,
@@ -2567,3 +2655,9 @@ Object.defineProperty(exports, "useTableContextOptional", {
2567
2655
  return useTableContextOptional;
2568
2656
  }
2569
2657
  });
2658
+ Object.defineProperty(exports, "warnUnsupportedFilter", {
2659
+ enumerable: true,
2660
+ get: function() {
2661
+ return warnUnsupportedFilter;
2662
+ }
2663
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atscript/vue-table",
3
- "version": "0.1.138",
3
+ "version": "0.1.140",
4
4
  "description": "Type-driven table components for Atscript with Vue 3",
5
5
  "keywords": [
6
6
  "atscript",
@@ -117,6 +117,11 @@
117
117
  "import": "./dist/as-preset-picker.mjs",
118
118
  "require": "./dist/as-preset-picker.cjs"
119
119
  },
120
+ "./as-residual-filter": {
121
+ "types": "./dist/as-residual-filter.d.mts",
122
+ "import": "./dist/as-residual-filter.mjs",
123
+ "require": "./dist/as-residual-filter.cjs"
124
+ },
120
125
  "./as-row-actions": {
121
126
  "types": "./dist/as-row-actions.d.mts",
122
127
  "import": "./dist/as-row-actions.mjs",
@@ -162,15 +167,16 @@
162
167
  "access": "public"
163
168
  },
164
169
  "dependencies": {
165
- "@atscript/ui": "^0.1.138",
166
- "@atscript/ui-table": "^0.1.138",
167
- "@atscript/vue-form": "^0.1.138"
170
+ "@atscript/ui": "^0.1.140",
171
+ "@atscript/ui-table": "^0.1.140",
172
+ "@atscript/vue-form": "^0.1.140"
168
173
  },
169
174
  "devDependencies": {
170
- "@atscript/db-client": "^0.1.131",
175
+ "@atscript/db-client": "^0.1.133",
171
176
  "@atscript/typescript": "^0.1.93",
172
177
  "@tanstack/vue-virtual": "^3.13.26",
173
- "@uniqu/core": "^0.1.8",
178
+ "@uniqu/core": "^0.1.10",
179
+ "@uniqu/url": "^0.1.10",
174
180
  "@vitejs/plugin-vue": "^6",
175
181
  "@vue/test-utils": "^2",
176
182
  "@vueuse/core": "^14.3.0",
@@ -183,8 +189,9 @@
183
189
  "vunor": "^0.3.0"
184
190
  },
185
191
  "peerDependencies": {
186
- "@atscript/db-client": "^0.1.131",
192
+ "@atscript/db-client": "^0.1.133",
187
193
  "@tanstack/vue-virtual": "^3.13.26",
194
+ "@uniqu/url": "^0.1.10",
188
195
  "@vueuse/core": "^14.3.0",
189
196
  "reka-ui": "^2.9.8",
190
197
  "vue": "^3"