nuxt-ui-tools 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/module.d.mts +4 -0
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +30 -15
  4. package/dist/runtime/form/components/actions/FormActions.d.vue.ts +0 -2
  5. package/dist/runtime/form/components/actions/FormActions.vue +5 -8
  6. package/dist/runtime/form/components/actions/FormActions.vue.d.ts +0 -2
  7. package/dist/runtime/form/components/layout/DrawerLayout.vue +5 -1
  8. package/dist/runtime/form/components/layout/ModalLayout.vue +5 -1
  9. package/dist/runtime/form/components/renderer/FormCompositeControl.d.vue.ts +15 -0
  10. package/dist/runtime/form/components/renderer/FormCompositeControl.vue +13 -0
  11. package/dist/runtime/form/components/renderer/FormCompositeControl.vue.d.ts +15 -0
  12. package/dist/runtime/form/components/renderer/FormFieldRenderer.d.vue.ts +1 -0
  13. package/dist/runtime/form/components/renderer/FormFieldRenderer.vue +19 -3
  14. package/dist/runtime/form/components/renderer/FormFieldRenderer.vue.d.ts +1 -0
  15. package/dist/runtime/form/components/renderer/FormFieldShell.d.vue.ts +4 -4
  16. package/dist/runtime/form/components/renderer/FormFieldShell.vue +15 -1
  17. package/dist/runtime/form/components/renderer/FormFieldShell.vue.d.ts +4 -4
  18. package/dist/runtime/form/components/root/Form.d.vue.ts +2 -2
  19. package/dist/runtime/form/components/root/Form.vue +5 -3
  20. package/dist/runtime/form/components/root/Form.vue.d.ts +2 -2
  21. package/dist/runtime/form/composables/use-field-control.d.ts +1 -1
  22. package/dist/runtime/form/composables/use-field-control.js +4 -0
  23. package/dist/runtime/form/composables/use-field-options.d.ts +1 -1
  24. package/dist/runtime/form/composables/use-field-options.js +75 -31
  25. package/dist/runtime/form/composables/use-form-field-chrome.d.ts +3 -0
  26. package/dist/runtime/form/composables/use-form-field-chrome.js +9 -0
  27. package/dist/runtime/form/composables/use-form-runtime.js +17 -5
  28. package/dist/runtime/form/fields/array-list/component.vue +4 -1
  29. package/dist/runtime/form/fields/auto-complete/component.vue +23 -16
  30. package/dist/runtime/form/fields/checkbox-card/component.vue +28 -29
  31. package/dist/runtime/form/fields/checkbox-group/component.vue +28 -29
  32. package/dist/runtime/form/fields/color-picker/component.vue +4 -2
  33. package/dist/runtime/form/fields/date-family/component.vue +9 -4
  34. package/dist/runtime/form/fields/hierarchy/SelectionCheckbox.d.vue.ts +13 -0
  35. package/dist/runtime/form/fields/hierarchy/SelectionCheckbox.vue +24 -0
  36. package/dist/runtime/form/fields/hierarchy/SelectionCheckbox.vue.d.ts +13 -0
  37. package/dist/runtime/form/fields/hierarchy/SelectionRadio.d.vue.ts +14 -0
  38. package/dist/runtime/form/fields/hierarchy/SelectionRadio.vue +27 -0
  39. package/dist/runtime/form/fields/hierarchy/SelectionRadio.vue.d.ts +14 -0
  40. package/dist/runtime/form/fields/hierarchy/component.vue +257 -142
  41. package/dist/runtime/form/fields/hierarchy/utils.d.ts +9 -0
  42. package/dist/runtime/form/fields/hierarchy/utils.js +32 -0
  43. package/dist/runtime/form/fields/input-group/component.vue +7 -30
  44. package/dist/runtime/form/fields/matrix/component.vue +9 -3
  45. package/dist/runtime/form/fields/phone-number/component.vue +7 -2
  46. package/dist/runtime/form/fields/rating/component.vue +25 -2
  47. package/dist/runtime/form/fields/select/component.vue +29 -21
  48. package/dist/runtime/form/fields/switch-group/component.vue +8 -3
  49. package/dist/runtime/form/fields/time/component.vue +7 -5
  50. package/dist/runtime/form/fields/upload/component.vue +5 -3
  51. package/dist/runtime/form/types/api.d.ts +9 -3
  52. package/dist/runtime/form/types/field-base.d.ts +3 -1
  53. package/dist/runtime/form/types/runtime.d.ts +2 -0
  54. package/dist/runtime/form/types/ui.d.ts +1 -0
  55. package/dist/runtime/form/utils/api.js +3 -0
  56. package/dist/runtime/form/utils/options.d.ts +11 -2
  57. package/dist/runtime/form/utils/options.js +57 -9
  58. package/dist/runtime/form/utils/state.js +10 -2
  59. package/dist/runtime/i18n/locales/en.js +38 -0
  60. package/dist/runtime/i18n/locales/fr.js +38 -0
  61. package/dist/runtime/i18n/types.d.ts +38 -0
  62. package/dist/runtime/i18n/use-locale.d.ts +2 -2
  63. package/dist/runtime/i18n/use-locale.js +3 -3
  64. package/dist/runtime/spreadsheet/components/layout/SpreadsheetImportFooter.d.vue.ts +2 -2
  65. package/dist/runtime/spreadsheet/components/layout/SpreadsheetImportFooter.vue.d.ts +2 -2
  66. package/dist/runtime/spreadsheet/components/steps/review/SpreadsheetReviewInspection.d.vue.ts +2 -2
  67. package/dist/runtime/spreadsheet/components/steps/review/SpreadsheetReviewInspection.vue.d.ts +2 -2
  68. package/dist/runtime/spreadsheet/composables/use-spreadsheet-internals.d.ts +15 -15
  69. package/dist/runtime/spreadsheet/composables/use-spreadsheet-resolutions.d.ts +2 -2
  70. package/dist/runtime/spreadsheet/schema/normalize.d.ts +1 -1
  71. package/dist/runtime/spreadsheet/utils/references/sources.d.ts +1 -1
  72. package/dist/runtime/table/components/DataList.d.vue.ts +2 -0
  73. package/dist/runtime/table/components/DataList.vue.d.ts +2 -0
  74. package/dist/runtime/table/components/actions/RowActions.d.vue.ts +4 -2
  75. package/dist/runtime/table/components/actions/RowActions.vue +2 -0
  76. package/dist/runtime/table/components/actions/RowActions.vue.d.ts +4 -2
  77. package/dist/runtime/table/components/data-list/DataListAddFilter.d.vue.ts +5 -3
  78. package/dist/runtime/table/components/data-list/DataListAddFilter.vue +6 -1
  79. package/dist/runtime/table/components/data-list/DataListAddFilter.vue.d.ts +5 -3
  80. package/dist/runtime/table/components/data-list/DataListContent.d.vue.ts +24 -17
  81. package/dist/runtime/table/components/data-list/DataListContent.vue +70 -17
  82. package/dist/runtime/table/components/data-list/DataListContent.vue.d.ts +24 -17
  83. package/dist/runtime/table/components/data-list/DataListDefault.d.vue.ts +2 -0
  84. package/dist/runtime/table/components/data-list/DataListDefault.vue.d.ts +2 -0
  85. package/dist/runtime/table/components/data-list/DataListFilterTags.d.vue.ts +2 -0
  86. package/dist/runtime/table/components/data-list/DataListFilterTags.vue.d.ts +2 -0
  87. package/dist/runtime/table/components/data-list/DataListInfiniteLoader.d.vue.ts +1 -1
  88. package/dist/runtime/table/components/data-list/DataListInfiniteLoader.vue.d.ts +1 -1
  89. package/dist/runtime/table/components/data-list/DataListLayoutSwitch.vue +17 -11
  90. package/dist/runtime/table/components/data-list/DataListPagination.d.vue.ts +1 -1
  91. package/dist/runtime/table/components/data-list/DataListPagination.vue.d.ts +1 -1
  92. package/dist/runtime/table/components/data-list/DataListRoot.vue +2 -46
  93. package/dist/runtime/table/components/data-list/DataListSortMenu.d.vue.ts +1 -1
  94. package/dist/runtime/table/components/data-list/DataListSortMenu.vue +6 -0
  95. package/dist/runtime/table/components/data-list/DataListSortMenu.vue.d.ts +1 -1
  96. package/dist/runtime/table/components/filters/shared/DynamicFilterPicker.d.vue.ts +5 -0
  97. package/dist/runtime/table/components/filters/shared/DynamicFilterPicker.vue +182 -59
  98. package/dist/runtime/table/components/filters/shared/DynamicFilterPicker.vue.d.ts +5 -0
  99. package/dist/runtime/table/components/filters/shared/FilterMatchModeButton.d.vue.ts +3 -1
  100. package/dist/runtime/table/components/filters/shared/FilterMatchModeButton.vue +29 -5
  101. package/dist/runtime/table/components/filters/shared/FilterMatchModeButton.vue.d.ts +3 -1
  102. package/dist/runtime/table/components/filters/shared/FilterMatchModePanel.d.vue.ts +17 -0
  103. package/dist/runtime/table/components/filters/shared/FilterMatchModePanel.vue +47 -0
  104. package/dist/runtime/table/components/filters/shared/FilterMatchModePanel.vue.d.ts +17 -0
  105. package/dist/runtime/table/components/filters/shared/FilterOptionMultipleList.d.vue.ts +3 -1
  106. package/dist/runtime/table/components/filters/shared/FilterOptionMultipleList.vue +12 -3
  107. package/dist/runtime/table/components/filters/shared/FilterOptionMultipleList.vue.d.ts +3 -1
  108. package/dist/runtime/table/components/filters/shared/FilterOptionPickerContent.d.vue.ts +3 -0
  109. package/dist/runtime/table/components/filters/shared/FilterOptionPickerContent.vue +11 -1
  110. package/dist/runtime/table/components/filters/shared/FilterOptionPickerContent.vue.d.ts +3 -0
  111. package/dist/runtime/table/components/filters/shared/FilterOptionRow.d.vue.ts +3 -0
  112. package/dist/runtime/table/components/filters/shared/FilterOptionRow.vue +48 -9
  113. package/dist/runtime/table/components/filters/shared/FilterOptionRow.vue.d.ts +3 -0
  114. package/dist/runtime/table/components/filters/shared/FilterOptionSingleList.d.vue.ts +3 -0
  115. package/dist/runtime/table/components/filters/shared/FilterOptionSingleList.vue +35 -9
  116. package/dist/runtime/table/components/filters/shared/FilterOptionSingleList.vue.d.ts +3 -0
  117. package/dist/runtime/table/components/filters/shared/FilterOptionTreeContent.d.vue.ts +3 -0
  118. package/dist/runtime/table/components/filters/shared/FilterOptionTreeContent.vue +77 -20
  119. package/dist/runtime/table/components/filters/shared/FilterOptionTreeContent.vue.d.ts +3 -0
  120. package/dist/runtime/table/components/filters/shared/FilterPopoverShell.d.vue.ts +27 -0
  121. package/dist/runtime/table/components/filters/shared/FilterPopoverShell.vue +36 -0
  122. package/dist/runtime/table/components/filters/shared/FilterPopoverShell.vue.d.ts +27 -0
  123. package/dist/runtime/table/components/filters/shared/FilterSearchablePanel.d.vue.ts +3 -0
  124. package/dist/runtime/table/components/filters/shared/FilterSearchablePanel.vue +40 -10
  125. package/dist/runtime/table/components/filters/shared/FilterSearchablePanel.vue.d.ts +3 -0
  126. package/dist/runtime/table/components/filters/shared/FilterStageTransition.d.vue.ts +23 -0
  127. package/dist/runtime/table/components/filters/shared/FilterStageTransition.vue +21 -0
  128. package/dist/runtime/table/components/filters/shared/FilterStageTransition.vue.d.ts +23 -0
  129. package/dist/runtime/table/components/filters/shared/FilterTriggerTag.d.vue.ts +3 -2
  130. package/dist/runtime/table/components/filters/shared/FilterTriggerTag.vue +26 -25
  131. package/dist/runtime/table/components/filters/shared/FilterTriggerTag.vue.d.ts +3 -2
  132. package/dist/runtime/table/components/filters/tags/BooleanFilterTag.d.vue.ts +1 -1
  133. package/dist/runtime/table/components/filters/tags/BooleanFilterTag.vue +75 -22
  134. package/dist/runtime/table/components/filters/tags/BooleanFilterTag.vue.d.ts +1 -1
  135. package/dist/runtime/table/components/filters/tags/DateFilterTag.d.vue.ts +3 -1
  136. package/dist/runtime/table/components/filters/tags/DateFilterTag.vue +254 -160
  137. package/dist/runtime/table/components/filters/tags/DateFilterTag.vue.d.ts +3 -1
  138. package/dist/runtime/table/components/filters/tags/FilterTagsBar.d.vue.ts +7 -6
  139. package/dist/runtime/table/components/filters/tags/FilterTagsBar.vue +12 -27
  140. package/dist/runtime/table/components/filters/tags/FilterTagsBar.vue.d.ts +7 -6
  141. package/dist/runtime/table/components/filters/tags/NumberFilterTag.d.vue.ts +3 -2
  142. package/dist/runtime/table/components/filters/tags/NumberFilterTag.vue +192 -106
  143. package/dist/runtime/table/components/filters/tags/NumberFilterTag.vue.d.ts +3 -2
  144. package/dist/runtime/table/components/filters/tags/OptionFilterTag.d.vue.ts +3 -2
  145. package/dist/runtime/table/components/filters/tags/OptionFilterTag.vue +110 -48
  146. package/dist/runtime/table/components/filters/tags/OptionFilterTag.vue.d.ts +3 -2
  147. package/dist/runtime/table/components/filters/tags/TextFilterTag.d.vue.ts +3 -2
  148. package/dist/runtime/table/components/filters/tags/TextFilterTag.vue +120 -57
  149. package/dist/runtime/table/components/filters/tags/TextFilterTag.vue.d.ts +3 -2
  150. package/dist/runtime/table/components/grid/GridRenderer.vue +1 -1
  151. package/dist/runtime/table/components/layout/TableFooter.d.vue.ts +1 -1
  152. package/dist/runtime/table/components/layout/TableFooter.vue +1 -0
  153. package/dist/runtime/table/components/layout/TableFooter.vue.d.ts +1 -1
  154. package/dist/runtime/table/components/table/TableCellEllipsis.d.ts +1 -1
  155. package/dist/runtime/table/components/table/TableRenderer.vue +24 -12
  156. package/dist/runtime/table/composables/use-filter-tag-session.d.ts +3 -4
  157. package/dist/runtime/table/composables/use-filter-tag-session.js +12 -32
  158. package/dist/runtime/table/composables/use-query-state.d.ts +5 -5
  159. package/dist/runtime/table/composables/use-query-state.js +7 -32
  160. package/dist/runtime/table/composables/use-table-api.js +2 -2
  161. package/dist/runtime/table/composables/use-table-columns.d.ts +4 -14
  162. package/dist/runtime/table/composables/use-table-filter-presentation.d.ts +0 -3
  163. package/dist/runtime/table/composables/use-table-filter-presentation.js +0 -9
  164. package/dist/runtime/table/composables/use-table-filters.js +18 -7
  165. package/dist/runtime/table/composables/use-table-internals.d.ts +24 -63
  166. package/dist/runtime/table/composables/use-table-pagination.d.ts +2 -2
  167. package/dist/runtime/table/composables/use-table-state.d.ts +2 -2
  168. package/dist/runtime/table/types/actions.d.ts +1 -1
  169. package/dist/runtime/table/types/data-list.d.ts +41 -8
  170. package/dist/runtime/table/types/filters.d.ts +4 -0
  171. package/dist/runtime/table/utils/actions.d.ts +1 -1
  172. package/dist/runtime/table/utils/columns/menu.d.ts +2 -11
  173. package/dist/runtime/table/utils/columns/render.d.ts +2 -9
  174. package/dist/runtime/table/utils/columns/render.js +39 -30
  175. package/dist/runtime/table/utils/columns/state.d.ts +1 -1
  176. package/dist/runtime/table/utils/data-list-ui.d.ts +3 -1
  177. package/dist/runtime/table/utils/data-list-ui.js +45 -0
  178. package/dist/runtime/table/utils/filters/editor-size.d.ts +11 -0
  179. package/dist/runtime/table/utils/filters/editor-size.js +45 -0
  180. package/dist/runtime/table/utils/filters/index.d.ts +1 -1
  181. package/dist/runtime/table/utils/filters/index.js +1 -1
  182. package/dist/runtime/table/utils/query-state.d.ts +18 -1
  183. package/dist/runtime/table/utils/query-state.js +109 -0
  184. package/package.json +4 -2
  185. package/dist/runtime/table/utils/filters/operators.d.ts +0 -4
  186. package/dist/runtime/table/utils/filters/operators.js +0 -6
@@ -3,36 +3,47 @@ import { CalendarDate, getLocalTimeZone } from "@internationalized/date";
3
3
  import UButton from "@nuxt/ui/components/Button.vue";
4
4
  import UCalendar from "@nuxt/ui/components/Calendar.vue";
5
5
  import UInputDate from "@nuxt/ui/components/InputDate.vue";
6
- import UPopover from "@nuxt/ui/components/Popover.vue";
7
6
  import { useMediaQuery } from "@vueuse/core";
8
- import { computed, ref, shallowRef, toRef, watch } from "vue";
7
+ import { computed, ref, shallowRef, watch } from "vue";
9
8
  import { useUiToolsLocale } from "#ui-tools/i18n";
9
+ import { useDataListUi } from "../../../composables/use-data-list-ui";
10
10
  import { useFilterTagSession } from "../../../composables/use-filter-tag-session";
11
11
  import { useTableInternals } from "../../../composables/use-table-internals";
12
12
  import {
13
13
  formatFilterDate,
14
14
  getDateRangeValue,
15
+ mergeDataListUiClass,
15
16
  resolveFilterTriggerIcon,
16
17
  resolveDateFilterRangeCalendarPanels,
17
18
  resolveDateFilterRangePresets,
18
19
  resolveDateFilterScalarPresets,
19
20
  resolveDateFilterUi
20
21
  } from "../../../utils";
22
+ import FilterMatchModePanel from "../shared/FilterMatchModePanel.vue";
23
+ import FilterPopoverShell from "../shared/FilterPopoverShell.vue";
24
+ import FilterStageTransition from "../shared/FilterStageTransition.vue";
21
25
  import TableFilterTrigger from "../shared/FilterTriggerTag.vue";
22
26
  const props = defineProps({
23
27
  definition: { type: Object, required: true },
24
28
  dynamic: { type: Boolean, required: false },
25
29
  session: { type: Boolean, required: false },
26
- activationToken: { type: Number, required: false }
30
+ embedded: { type: Boolean, required: false },
31
+ initialOperator: { type: String, required: false }
27
32
  });
28
33
  const emit = defineEmits(["dismiss", "sessionClosed"]);
29
34
  const internals = useTableInternals();
35
+ const dataListUi = useDataListUi();
36
+ const dataListFilterUi = computed(() => dataListUi.ui.value.filterTags?.ui);
37
+ const size = computed(() => dataListUi.ui.value.filterTags?.size ?? dataListUi.controlSize.value);
30
38
  const { t } = useUiToolsLocale();
31
39
  const isMobile = useMediaQuery("(max-width: 639px)");
32
- const pendingOperator = ref();
40
+ const pendingOperator = ref(props.initialOperator);
33
41
  const localDate = shallowRef(void 0);
34
42
  const localRangeStart = shallowRef(void 0);
35
43
  const localRangeEnd = shallowRef(void 0);
44
+ const stage = ref("editor");
45
+ const stageDirection = ref("forward");
46
+ const stageTransitioning = ref(false);
36
47
  const preview = computed(
37
48
  () => internals.filters.getFilterPreview({
38
49
  key: props.definition.key
@@ -88,11 +99,10 @@ const rangeSummary = computed(() => {
88
99
  return t("table.filters.preview.empty");
89
100
  });
90
101
  const session = useFilterTagSession({
91
- activationToken: toRef(props, "activationToken"),
92
102
  session: props.session,
93
103
  dynamic: props.dynamic,
104
+ embedded: props.embedded,
94
105
  hasCommittedState: () => internals.filters.getFilterState({ key: props.definition.key }) != null,
95
- onActivated: () => handleActivate(operator.value),
96
106
  onOpen: initLocalState,
97
107
  onClose: () => {
98
108
  pendingOperator.value = void 0;
@@ -108,7 +118,15 @@ watch(
108
118
  );
109
119
  function handleActivate(op) {
110
120
  pendingOperator.value = op;
111
- session.openWithLock();
121
+ stage.value = "editor";
122
+ stageDirection.value = "backward";
123
+ session.open();
124
+ }
125
+ function handleRequestMatchMode() {
126
+ stageDirection.value = "forward";
127
+ stageTransitioning.value = true;
128
+ stage.value = "match-mode";
129
+ session.open();
112
130
  }
113
131
  function initLocalState() {
114
132
  const rule = internals.filters.getFilterState({ key: props.definition.key });
@@ -156,14 +174,13 @@ function clearFilter() {
156
174
  session.close();
157
175
  }
158
176
  function handleOperatorChange(op) {
159
- if (filterUi.value.clearOnOperatorChange) {
160
- internals.filters.clearFilter({ key: props.definition.key });
161
- }
162
177
  localDate.value = void 0;
163
178
  localRangeStart.value = void 0;
164
179
  localRangeEnd.value = void 0;
165
- if (filterUi.value.reopenOnOperatorChange) handleActivate(op);
166
- else pendingOperator.value = op;
180
+ pendingOperator.value = op;
181
+ stageDirection.value = "forward";
182
+ stageTransitioning.value = true;
183
+ stage.value = "editor";
167
184
  }
168
185
  function applyScalarPreset(value) {
169
186
  localDate.value = toCalendarDate(value);
@@ -236,13 +253,18 @@ function areSameCalendarDay(left, right) {
236
253
  </script>
237
254
 
238
255
  <template>
239
- <UPopover
256
+ <FilterPopoverShell
240
257
  :open="session.isOpen.value"
241
- :content="{ side: 'bottom', align: 'start', sideOffset: 8 }"
242
- :ui="{
243
- content: 'max-w-[calc(100vw-1rem)] overflow-hidden p-0 shadow-none'
244
- }"
245
- @update:open="session.handleOpenChange"
258
+ :embedded="embedded"
259
+ :transitioning="stageTransitioning"
260
+ :content-class="
261
+ mergeDataListUiClass(
262
+ 'max-w-[calc(100vw-1rem)] overflow-hidden p-0',
263
+ void 0,
264
+ dataListFilterUi?.popoverContent
265
+ )
266
+ "
267
+ @update-open="session.handleOpenChange"
246
268
  >
247
269
  <slot
248
270
  name="trigger"
@@ -258,203 +280,275 @@ function areSameCalendarDay(left, right) {
258
280
  <TableFilterTrigger
259
281
  :label="internals.filters.getFilterLabelText({ label: definition.label })"
260
282
  :leading-icon="resolveFilterTriggerIcon(definition)"
283
+ :operator="operator"
261
284
  :operator-label="operatorLabel"
262
285
  :operator-items="operatorItems"
263
286
  :preview-summary="preview.summary"
264
287
  :active="preview.active"
265
- @select-operator="handleOperatorChange"
266
288
  @activate="handleActivate"
289
+ @request-match-mode="handleRequestMatchMode"
267
290
  @clear="clearFilter"
268
291
  />
269
292
  </slot>
270
293
 
271
294
  <template #content>
272
- <div
273
- class="bg-default"
274
- :class="operator === 'between' ? 'w-[min(100vw-1rem,48rem)]' : 'w-[min(100vw-1rem,22rem)]'"
295
+ <FilterStageTransition
296
+ :stage-key="stage"
297
+ :direction="stageDirection"
298
+ @settled="stageTransitioning = false"
275
299
  >
276
- <div v-if="operator === 'between'">
277
- <div
278
- class="grid gap-0"
279
- :class="
280
- filterUi.range.presetsPlacement === 'side' ? 'lg:grid-cols-[14rem_minmax(0,1fr)]' : 'grid-cols-1'
300
+ <FilterMatchModePanel
301
+ v-if="stage === 'match-mode'"
302
+ :items="operatorItems"
303
+ :selected="operator"
304
+ :size="size"
305
+ :ui="dataListFilterUi"
306
+ @select="handleOperatorChange"
307
+ />
308
+ <div
309
+ v-else
310
+ :class="
311
+ mergeDataListUiClass(
312
+ `bg-default ${operator === 'between' ? 'w-[min(100vw-1rem,48rem)]' : 'w-[min(100vw-1rem,22rem)]'}`,
313
+ void 0,
314
+ dataListFilterUi?.editor
315
+ )
281
316
  "
282
- >
317
+ >
318
+ <div v-if="operator === 'between'">
283
319
  <div
284
- v-if="rangePresets.length"
285
- class="border-b border-default p-3"
286
- :class="filterUi.range.presetsPlacement === 'side' ? 'lg:border-r lg:border-b-0' : ''"
320
+ class="grid gap-0"
321
+ :class="
322
+ filterUi.range.presetsPlacement === 'side' ? 'lg:grid-cols-[14rem_minmax(0,1fr)]' : 'grid-cols-1'
323
+ "
287
324
  >
288
- <div class="text-[11px] font-medium uppercase tracking-[0.18em] text-muted">
289
- Date range
290
- </div>
291
-
292
325
  <div
293
- class="mt-3 flex gap-1.5"
294
- :class="filterUi.range.presetsPlacement === 'side' ? 'flex-col' : 'flex-wrap'"
326
+ v-if="rangePresets.length"
327
+ :class="
328
+ mergeDataListUiClass(
329
+ `border-b border-default p-3 ${filterUi.range.presetsPlacement === 'side' ? 'lg:border-r lg:border-b-0' : ''}`,
330
+ void 0,
331
+ dataListFilterUi?.presets
332
+ )
333
+ "
295
334
  >
296
- <UButton
297
- v-for="preset in rangePresets"
298
- :key="preset.label"
299
- :variant="isRangePresetActive(preset.value) ? 'subtle' : 'ghost'"
300
- class="justify-start rounded-lg px-3"
301
- @click="applyRangePreset(preset.value)"
335
+ <div class="text-[11px] font-medium uppercase tracking-[0.18em] text-muted">
336
+ Date range
337
+ </div>
338
+
339
+ <div
340
+ class="mt-3 flex gap-1.5"
341
+ :class="filterUi.range.presetsPlacement === 'side' ? 'flex-col' : 'flex-wrap'"
302
342
  >
303
- {{ preset.label }}
304
- </UButton>
343
+ <UButton
344
+ v-for="preset in rangePresets"
345
+ :key="preset.label"
346
+ :variant="isRangePresetActive(preset.value) ? 'subtle' : 'ghost'"
347
+ :size="size"
348
+ :class="
349
+ mergeDataListUiClass(
350
+ 'justify-start rounded-lg px-3',
351
+ void 0,
352
+ dataListFilterUi?.preset
353
+ )
354
+ "
355
+ @click="applyRangePreset(preset.value)"
356
+ >
357
+ {{ preset.label }}
358
+ </UButton>
359
+ </div>
305
360
  </div>
306
- </div>
307
361
 
308
- <div v-if="filterUi.range.display !== 'inputs'" class="p-3">
309
- <UCalendar
310
- :model-value="calendarRange"
311
- range
312
- :number-of-months="rangeCalendarPanels"
313
- :paged-navigation="
362
+ <div
363
+ v-if="filterUi.range.display !== 'inputs'"
364
+ :class="mergeDataListUiClass('p-3', void 0, dataListFilterUi?.calendar)"
365
+ >
366
+ <UCalendar
367
+ :model-value="calendarRange"
368
+ range
369
+ :number-of-months="rangeCalendarPanels"
370
+ :paged-navigation="
314
371
  filterUi.range.calendar.pagedNavigation ?? rangeCalendarPanels > 1
315
372
  "
316
- :fixed-weeks="filterUi.range.calendar.fixedWeeks"
317
- :maximum-days="filterUi.range.calendar.maxRangeDays"
318
- :ui="{
319
- root: 'border-0 bg-transparent p-0 shadow-none',
373
+ :fixed-weeks="filterUi.range.calendar.fixedWeeks"
374
+ :maximum-days="filterUi.range.calendar.maxRangeDays"
375
+ :ui="{
320
376
  header: 'px-1 pb-2',
321
377
  body: 'gap-3',
322
378
  grid: 'gap-y-1',
323
379
  cell: 'p-0.5',
324
- cellTrigger: 'rounded-md'
380
+ cellTrigger: 'rounded-md',
381
+ root: mergeDataListUiClass(
382
+ 'border-0 bg-transparent p-0',
383
+ void 0,
384
+ dataListFilterUi?.calendar
385
+ )
325
386
  }"
326
- @update:model-value="setCalendarRange"
327
- />
328
- </div>
329
- </div>
330
-
331
- <div
332
- v-if="filterUi.range.display !== 'calendar'"
333
- class="border-t border-default px-3 py-3"
334
- >
335
- <div class="flex items-center justify-between gap-3">
336
- <div class="text-[11px] font-medium uppercase tracking-[0.18em] text-muted">
337
- Custom range
338
- </div>
339
- <div class="truncate text-xs text-muted">
340
- {{ rangeSummary }}
387
+ @update:model-value="setCalendarRange"
388
+ />
341
389
  </div>
342
390
  </div>
343
391
 
344
- <div class="mt-3 grid gap-2 sm:grid-cols-2">
345
- <div class="space-y-1">
346
- <span class="px-1 text-xs text-muted">Start</span>
347
- <UInputDate
348
- :model-value="localRangeStart"
349
- leading
350
- :fixed="filterUi.range.input.fixed"
351
- :highlight="filterUi.range.input.highlight"
352
- :granularity="filterUi.range.input.granularity"
353
- :hide-time-zone="filterUi.range.input.hideTimeZone"
354
- :hour-cycle="filterUi.range.input.hourCycle"
355
- leading-icon="i-lucide-arrow-right"
356
- class="w-full"
357
- @update:model-value="setRangeStart"
358
- />
392
+ <div
393
+ v-if="filterUi.range.display !== 'calendar'"
394
+ :class="
395
+ mergeDataListUiClass(
396
+ 'border-t border-default px-3 py-3',
397
+ void 0,
398
+ dataListFilterUi?.inputs
399
+ )
400
+ "
401
+ >
402
+ <div class="flex items-center justify-between gap-3">
403
+ <div class="text-[11px] font-medium uppercase tracking-[0.18em] text-muted">
404
+ Custom range
405
+ </div>
406
+ <div class="truncate text-xs text-muted">
407
+ {{ rangeSummary }}
408
+ </div>
359
409
  </div>
360
410
 
361
- <div class="space-y-1">
362
- <span class="px-1 text-xs text-muted">End</span>
363
- <UInputDate
364
- :model-value="localRangeEnd"
365
- leading
366
- :fixed="filterUi.range.input.fixed"
367
- :highlight="filterUi.range.input.highlight"
368
- :granularity="filterUi.range.input.granularity"
369
- :hide-time-zone="filterUi.range.input.hideTimeZone"
370
- :hour-cycle="filterUi.range.input.hourCycle"
371
- leading-icon="i-lucide-arrow-left"
372
- class="w-full"
373
- @update:model-value="setRangeEnd"
374
- />
411
+ <div class="mt-3 grid gap-2 sm:grid-cols-2">
412
+ <div class="space-y-1">
413
+ <span class="px-1 text-xs text-muted">Start</span>
414
+ <UInputDate
415
+ :model-value="localRangeStart"
416
+ leading
417
+ :fixed="filterUi.range.input.fixed"
418
+ :highlight="filterUi.range.input.highlight"
419
+ :granularity="filterUi.range.input.granularity"
420
+ :hide-time-zone="filterUi.range.input.hideTimeZone"
421
+ :hour-cycle="filterUi.range.input.hourCycle"
422
+ leading-icon="i-lucide-arrow-right"
423
+ :size="size"
424
+ class="w-full"
425
+ @update:model-value="setRangeStart"
426
+ />
427
+ </div>
428
+
429
+ <div class="space-y-1">
430
+ <span class="px-1 text-xs text-muted">End</span>
431
+ <UInputDate
432
+ :model-value="localRangeEnd"
433
+ leading
434
+ :fixed="filterUi.range.input.fixed"
435
+ :highlight="filterUi.range.input.highlight"
436
+ :granularity="filterUi.range.input.granularity"
437
+ :hide-time-zone="filterUi.range.input.hideTimeZone"
438
+ :hour-cycle="filterUi.range.input.hourCycle"
439
+ leading-icon="i-lucide-arrow-left"
440
+ :size="size"
441
+ class="w-full"
442
+ @update:model-value="setRangeEnd"
443
+ />
444
+ </div>
375
445
  </div>
376
446
  </div>
377
447
  </div>
378
- </div>
379
448
 
380
- <div v-else class="grid gap-2 p-3">
381
- <div v-if="scalarPresets.length" class="flex flex-wrap gap-1.5">
382
- <UButton
383
- v-for="preset in scalarPresets"
384
- :key="preset.label"
385
- variant="ghost"
386
- class="rounded-lg px-3"
387
- @click="applyScalarPreset(preset.value)"
449
+ <div
450
+ v-else
451
+ :class="mergeDataListUiClass('grid gap-2 p-3', void 0, dataListFilterUi?.inputs)"
452
+ >
453
+ <div
454
+ v-if="scalarPresets.length"
455
+ :class="
456
+ mergeDataListUiClass('flex flex-wrap gap-1.5', void 0, dataListFilterUi?.presets)
457
+ "
388
458
  >
389
- {{ preset.label }}
390
- </UButton>
391
- </div>
459
+ <UButton
460
+ v-for="preset in scalarPresets"
461
+ :key="preset.label"
462
+ variant="ghost"
463
+ :size="size"
464
+ :class="
465
+ mergeDataListUiClass('rounded-lg px-3', void 0, dataListFilterUi?.preset)
466
+ "
467
+ @click="applyScalarPreset(preset.value)"
468
+ >
469
+ {{ preset.label }}
470
+ </UButton>
471
+ </div>
392
472
 
393
- <UInputDate
394
- v-if="
473
+ <UInputDate
474
+ v-if="
395
475
  filterUi.scalar.display === 'input' || filterUi.scalar.display === 'input-calendar'
396
476
  "
397
- :model-value="localDate"
398
- leading
399
- :fixed="filterUi.scalar.input.fixed"
400
- :highlight="filterUi.scalar.input.highlight"
401
- :granularity="filterUi.scalar.input.granularity"
402
- :hide-time-zone="filterUi.scalar.input.hideTimeZone"
403
- :hour-cycle="filterUi.scalar.input.hourCycle"
404
- leading-icon="i-lucide-calendar-days"
405
- class="w-full"
406
- @update:model-value="setSingleDate"
407
- />
477
+ :model-value="localDate"
478
+ leading
479
+ :fixed="filterUi.scalar.input.fixed"
480
+ :highlight="filterUi.scalar.input.highlight"
481
+ :granularity="filterUi.scalar.input.granularity"
482
+ :hide-time-zone="filterUi.scalar.input.hideTimeZone"
483
+ :hour-cycle="filterUi.scalar.input.hourCycle"
484
+ leading-icon="i-lucide-calendar-days"
485
+ :size="size"
486
+ class="w-full"
487
+ @update:model-value="setSingleDate"
488
+ />
408
489
 
409
- <UCalendar
410
- v-if="
490
+ <UCalendar
491
+ v-if="
411
492
  filterUi.scalar.display === 'calendar' || filterUi.scalar.display === 'input-calendar'
412
493
  "
413
- :model-value="localDate"
414
- :fixed-weeks="filterUi.scalar.calendar.fixedWeeks"
415
- :ui="{
416
- root: 'border-0 bg-transparent p-0 shadow-none',
494
+ :model-value="localDate"
495
+ :fixed-weeks="filterUi.scalar.calendar.fixedWeeks"
496
+ :ui="{
497
+ root: mergeDataListUiClass(
498
+ 'border-0 bg-transparent p-0',
499
+ void 0,
500
+ dataListFilterUi?.calendar
501
+ ),
417
502
  header: 'px-1 pb-2',
418
503
  grid: 'gap-y-1',
419
504
  cell: 'p-0.5',
420
505
  cellTrigger: 'rounded-md'
421
506
  }"
422
- @update:model-value="setSingleDate"
423
- />
424
- </div>
507
+ @update:model-value="setSingleDate"
508
+ />
509
+ </div>
425
510
 
426
- <div
427
- v-if="filterUi.commitMode === 'manual'"
428
- class="flex items-center border-t border-default p-2"
429
- :class="operator === 'between' ? 'justify-between' : 'justify-end'"
430
- >
431
- <UButton
432
- v-if="operator === 'between'"
433
- color="neutral"
434
- variant="ghost"
435
- size="sm"
436
- :label="filterUi.actions.clear"
437
- @click="clearFilter"
438
- />
439
- <div class="flex items-center gap-2">
511
+ <div
512
+ v-if="filterUi.commitMode === 'manual'"
513
+ :class="
514
+ mergeDataListUiClass(
515
+ `flex items-center border-t border-default p-2 ${operator === 'between' ? 'justify-between' : 'justify-end'}`,
516
+ void 0,
517
+ dataListFilterUi?.footer
518
+ )
519
+ "
520
+ >
440
521
  <UButton
441
- v-if="operator !== 'between'"
522
+ v-if="operator === 'between'"
442
523
  color="neutral"
443
524
  variant="ghost"
444
- size="sm"
525
+ :size="size"
445
526
  :label="filterUi.actions.clear"
527
+ :ui="{ base: dataListFilterUi?.clear }"
446
528
  @click="clearFilter"
447
529
  />
448
- <UButton
449
- color="neutral"
450
- variant="subtle"
451
- size="sm"
452
- :label="filterUi.actions.apply"
453
- @click="applyFilter"
454
- />
530
+ <div class="flex items-center gap-2">
531
+ <UButton
532
+ v-if="operator !== 'between'"
533
+ color="neutral"
534
+ variant="ghost"
535
+ :size="size"
536
+ :label="filterUi.actions.clear"
537
+ :ui="{ base: dataListFilterUi?.clear }"
538
+ @click="clearFilter"
539
+ />
540
+ <UButton
541
+ color="neutral"
542
+ variant="subtle"
543
+ :size="size"
544
+ :label="filterUi.actions.apply"
545
+ :ui="{ base: dataListFilterUi?.apply }"
546
+ @click="applyFilter"
547
+ />
548
+ </div>
455
549
  </div>
456
550
  </div>
457
- </div>
551
+ </FilterStageTransition>
458
552
  </template>
459
- </UPopover>
553
+ </FilterPopoverShell>
460
554
  </template>
@@ -1,9 +1,11 @@
1
+ import type { TableFilterOperator } from '../../../types/index.js';
1
2
  import type { TableDateFilterDefinition } from '../../../types/filters.js';
2
3
  type __VLS_Props = {
3
4
  definition: TableDateFilterDefinition;
4
5
  dynamic?: boolean;
5
6
  session?: boolean;
6
- activationToken?: number;
7
+ embedded?: boolean;
8
+ initialOperator?: TableFilterOperator;
7
9
  };
8
10
  declare var __VLS_10: {
9
11
  preview: import("../../../utils/index.js").FilterPreviewResult;
@@ -1,25 +1,26 @@
1
+ import type { TableUiFilterDefinition } from '../../../types/index.js';
1
2
  type __VLS_Props = {
2
3
  showAdd?: boolean;
3
4
  showClear?: boolean;
4
5
  };
5
- declare var __VLS_10: any, __VLS_22: any, __VLS_33: {
6
+ declare var __VLS_10: any, __VLS_22: {
6
7
  open: () => void;
7
8
  close: () => void;
8
9
  toggle: () => void;
9
10
  openState: boolean;
11
+ stage: "editor" | "match-mode" | "picker";
12
+ definition: TableUiFilterDefinition | undefined;
10
13
  triggerProps: {
11
14
  type: string;
12
15
  'aria-expanded': boolean;
13
16
  };
14
- }, __VLS_43: {};
17
+ }, __VLS_32: {};
15
18
  type __VLS_Slots = {} & {
16
19
  filter?: (props: typeof __VLS_10) => any;
17
20
  } & {
18
- filter?: (props: typeof __VLS_22) => any;
21
+ 'add-filter-trigger'?: (props: typeof __VLS_22) => any;
19
22
  } & {
20
- 'add-filter-trigger'?: (props: typeof __VLS_33) => any;
21
- } & {
22
- 'clear-filter-label'?: (props: typeof __VLS_43) => any;
23
+ 'clear-filter-label'?: (props: typeof __VLS_32) => any;
23
24
  };
24
25
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
25
26
  showAdd: boolean;
@@ -40,49 +40,34 @@ function getFilterLabel(definition) {
40
40
  internals.filterPresentation.activeDynamicDefinitions.value.some(
41
41
  (item) => item.key === definition.key
42
42
  )
43
- "
44
- @dismiss="internals.filterPresentation.releaseDynamicSession({ key: definition.key })"
45
- >
46
- <template v-if="$slots.filter" #trigger="scope">
47
- <slot name="filter" v-bind="scope" :filter="definition" />
48
- </template>
49
- </component>
50
-
51
- <component
52
- :is="resolveFilterTagComponent(dynamicSessionDefinition)"
53
- v-if="dynamicSessionDefinition"
54
- :key="`dynamic-session:${dynamicSessionDefinition.key}`"
55
- :definition="dynamicSessionDefinition"
56
- dynamic
57
- session
58
- :activation-token="
59
- internals.filterPresentation.getDynamicActivationToken({
60
- key: dynamicSessionDefinition.key
61
- })
62
43
  "
63
44
  @dismiss="
64
- internals.filterPresentation.releaseDynamicSession({ key: dynamicSessionDefinition.key })
65
- "
66
- @session-closed="
67
- internals.filterPresentation.releaseDynamicSession({ key: dynamicSessionDefinition.key })
45
+ internals.filterPresentation.releaseDynamicSession({
46
+ key: definition.key
47
+ })
68
48
  "
69
49
  >
70
50
  <template v-if="$slots.filter" #trigger="scope">
71
- <slot name="filter" v-bind="scope" :filter="dynamicSessionDefinition" />
51
+ <slot name="filter" v-bind="scope" :filter="definition" />
72
52
  </template>
73
53
  </component>
74
54
 
75
55
  <DynamicFilterPicker
76
- v-else-if="
77
- props.showAdd && internals.filterPresentation.dormantDynamicDefinitions.value.length
56
+ v-if="
57
+ props.showAdd && (internals.filterPresentation.dormantDynamicDefinitions.value.length || dynamicSessionDefinition)
78
58
  "
79
59
  :definitions="internals.filterPresentation.dormantDynamicDefinitions.value"
60
+ :session-definition="dynamicSessionDefinition"
80
61
  :get-label="getFilterLabel"
81
- :size="dataListUi.ui.value.filterTags?.size ?? dataListUi.controlSize.value"
62
+ :size="
63
+ dataListUi.ui.value.addFilter?.size ?? dataListUi.ui.value.filterTags?.size ?? dataListUi.controlSize.value
64
+ "
82
65
  :ui="{
66
+ ...dataListUi.ui.value.addFilter?.ui,
83
67
  trigger: dataListUi.ui.value.filterTags?.ui?.addTrigger
84
68
  }"
85
69
  @select="internals.filterPresentation.activateDynamicFilter({ key: $event })"
70
+ @release="internals.filterPresentation.releaseDynamicSession({ key: $event })"
86
71
  >
87
72
  <template v-if="$slots['add-filter-trigger']" #trigger="scope">
88
73
  <slot name="add-filter-trigger" v-bind="scope" />