@wheelhouse/ui 0.2.2 → 0.2.3

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 (192) hide show
  1. package/dist/blocks/columns/columns-types.d.ts +40 -0
  2. package/dist/blocks/columns/columns-types.d.ts.map +1 -0
  3. package/dist/blocks/columns/columns-types.js +10 -0
  4. package/dist/blocks/columns/columns-utils.d.ts +13 -0
  5. package/dist/blocks/columns/columns-utils.d.ts.map +1 -0
  6. package/dist/blocks/columns/columns-utils.js +85 -0
  7. package/dist/blocks/columns/columns.d.ts +3 -0
  8. package/dist/blocks/columns/columns.d.ts.map +1 -0
  9. package/dist/blocks/columns/columns.js +79 -0
  10. package/dist/blocks/columns/columns.stories.d.ts +12 -0
  11. package/dist/blocks/columns/columns.stories.d.ts.map +1 -0
  12. package/dist/blocks/columns/columns.stories.js +67 -0
  13. package/dist/blocks/columns/index.d.ts +6 -0
  14. package/dist/blocks/columns/index.d.ts.map +1 -0
  15. package/dist/blocks/columns/index.js +3 -0
  16. package/dist/blocks/date-selector/date-selector-context.d.ts.map +1 -0
  17. package/dist/blocks/date-selector/date-selector-default-i18n.d.ts +10 -0
  18. package/dist/blocks/date-selector/date-selector-default-i18n.d.ts.map +1 -0
  19. package/dist/blocks/date-selector/date-selector-default-i18n.js +29 -0
  20. package/dist/blocks/date-selector/date-selector-i18n-resources.d.ts +11 -0
  21. package/dist/blocks/date-selector/date-selector-i18n-resources.d.ts.map +1 -0
  22. package/dist/blocks/date-selector/date-selector-i18n-resources.js +248 -0
  23. package/dist/blocks/date-selector/date-selector-i18n.shared.d.ts +12 -0
  24. package/dist/blocks/date-selector/date-selector-i18n.shared.d.ts.map +1 -0
  25. package/dist/blocks/date-selector/date-selector-i18n.shared.js +84 -0
  26. package/dist/{components → blocks}/date-selector/date-selector-parts.d.ts +9 -0
  27. package/dist/blocks/date-selector/date-selector-parts.d.ts.map +1 -0
  28. package/dist/{components → blocks}/date-selector/date-selector-parts.js +21 -6
  29. package/dist/{components → blocks}/date-selector/date-selector-types.d.ts +70 -0
  30. package/dist/blocks/date-selector/date-selector-types.d.ts.map +1 -0
  31. package/dist/{components → blocks}/date-selector/date-selector-types.js +22 -0
  32. package/dist/blocks/date-selector/date-selector-value.d.ts +81 -0
  33. package/dist/blocks/date-selector/date-selector-value.d.ts.map +1 -0
  34. package/dist/blocks/date-selector/date-selector-value.js +423 -0
  35. package/dist/{components → blocks}/date-selector/date-selector.d.ts +1 -1
  36. package/dist/blocks/date-selector/date-selector.d.ts.map +1 -0
  37. package/dist/blocks/date-selector/date-selector.js +191 -0
  38. package/dist/{components → blocks}/date-selector/date-selector.stories.d.ts +14 -0
  39. package/dist/blocks/date-selector/date-selector.stories.d.ts.map +1 -0
  40. package/dist/blocks/date-selector/date-selector.stories.js +299 -0
  41. package/dist/blocks/date-selector/index.d.ts +11 -0
  42. package/dist/blocks/date-selector/index.d.ts.map +1 -0
  43. package/dist/blocks/date-selector/index.js +8 -0
  44. package/dist/{components → blocks}/date-selector/use-date-selector.d.ts +4 -3
  45. package/dist/blocks/date-selector/use-date-selector.d.ts.map +1 -0
  46. package/dist/{components → blocks}/date-selector/use-date-selector.js +14 -8
  47. package/dist/blocks/index.d.ts +4 -0
  48. package/dist/blocks/index.d.ts.map +1 -0
  49. package/dist/blocks/index.js +3 -0
  50. package/dist/blocks/navigation/index.d.ts +5 -0
  51. package/dist/blocks/navigation/index.d.ts.map +1 -0
  52. package/dist/blocks/navigation/index.js +2 -0
  53. package/dist/blocks/navigation/navigation-types.d.ts +60 -0
  54. package/dist/blocks/navigation/navigation-types.d.ts.map +1 -0
  55. package/dist/blocks/navigation/navigation-types.js +1 -0
  56. package/dist/blocks/navigation/navigation.d.ts +9 -0
  57. package/dist/blocks/navigation/navigation.d.ts.map +1 -0
  58. package/dist/blocks/navigation/navigation.demo.d.ts +4 -0
  59. package/dist/blocks/navigation/navigation.demo.d.ts.map +1 -0
  60. package/dist/blocks/navigation/navigation.demo.js +46 -0
  61. package/dist/blocks/navigation/navigation.js +98 -0
  62. package/dist/blocks/navigation/navigation.stories.d.ts +14 -0
  63. package/dist/blocks/navigation/navigation.stories.d.ts.map +1 -0
  64. package/dist/blocks/navigation/navigation.stories.js +16 -0
  65. package/dist/components/accordion/accordion.stories.js +1 -1
  66. package/dist/components/alert/alert.stories.js +1 -1
  67. package/dist/components/alert-dialog/alert-dialog.stories.js +1 -1
  68. package/dist/components/aspect-ratio/aspect-ratio.stories.js +1 -1
  69. package/dist/components/avatar/avatar.stories.js +1 -1
  70. package/dist/components/badge/badge.stories.js +1 -1
  71. package/dist/components/breadcrumb/breadcrumb.stories.js +1 -1
  72. package/dist/components/button/button.stories.js +1 -1
  73. package/dist/components/button-group/button-group.d.ts +10 -4
  74. package/dist/components/button-group/button-group.d.ts.map +1 -1
  75. package/dist/components/button-group/button-group.js +15 -3
  76. package/dist/components/button-group/button-group.stories.js +1 -1
  77. package/dist/components/button-group/index.d.ts +2 -2
  78. package/dist/components/button-group/index.d.ts.map +1 -1
  79. package/dist/components/button-group/index.js +1 -1
  80. package/dist/components/calendar/calendar.stories.js +1 -1
  81. package/dist/components/card/card.stories.js +1 -1
  82. package/dist/components/checkbox/checkbox.stories.js +1 -1
  83. package/dist/components/collapsible/collapsible.stories.js +1 -1
  84. package/dist/components/combobox/combobox.stories.js +1 -1
  85. package/dist/components/command/command.stories.js +1 -1
  86. package/dist/components/context-menu/context-menu.stories.js +1 -1
  87. package/dist/components/dialog/dialog.stories.js +1 -1
  88. package/dist/components/direction/direction.stories.js +1 -1
  89. package/dist/components/drawer/drawer.stories.js +1 -1
  90. package/dist/components/dropdown-menu/dropdown-menu.d.ts +9 -2
  91. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  92. package/dist/components/dropdown-menu/dropdown-menu.js +4 -1
  93. package/dist/components/dropdown-menu/dropdown-menu.stories.js +1 -1
  94. package/dist/components/dropdown-menu/index.d.ts +2 -2
  95. package/dist/components/dropdown-menu/index.d.ts.map +1 -1
  96. package/dist/components/dropdown-menu/index.js +1 -1
  97. package/dist/components/empty/empty.stories.js +1 -1
  98. package/dist/components/field/field.stories.js +1 -1
  99. package/dist/components/filters/filter-date-metric-value.d.ts +32 -0
  100. package/dist/components/filters/filter-date-metric-value.d.ts.map +1 -0
  101. package/dist/components/filters/filter-date-metric-value.js +331 -0
  102. package/dist/components/filters/filters-defaults.d.ts +4 -0
  103. package/dist/components/filters/filters-defaults.d.ts.map +1 -1
  104. package/dist/components/filters/filters-defaults.js +59 -1
  105. package/dist/components/filters/filters-i18n-resources.d.ts +277 -0
  106. package/dist/components/filters/filters-i18n-resources.d.ts.map +1 -0
  107. package/dist/components/filters/filters-i18n-resources.js +276 -0
  108. package/dist/components/filters/filters-i18n.shared.d.ts +16 -0
  109. package/dist/components/filters/filters-i18n.shared.d.ts.map +1 -0
  110. package/dist/components/filters/filters-i18n.shared.js +111 -0
  111. package/dist/components/filters/filters-types.d.ts +33 -1
  112. package/dist/components/filters/filters-types.d.ts.map +1 -1
  113. package/dist/components/filters/filters-utils.d.ts +28 -1
  114. package/dist/components/filters/filters-utils.d.ts.map +1 -1
  115. package/dist/components/filters/filters-utils.js +102 -0
  116. package/dist/components/filters/filters.d.ts +21 -3
  117. package/dist/components/filters/filters.d.ts.map +1 -1
  118. package/dist/components/filters/filters.js +493 -290
  119. package/dist/components/filters/filters.stories.d.ts +107 -2
  120. package/dist/components/filters/filters.stories.d.ts.map +1 -1
  121. package/dist/components/filters/filters.stories.js +364 -29
  122. package/dist/components/filters/index.d.ts +3 -1
  123. package/dist/components/filters/index.d.ts.map +1 -1
  124. package/dist/components/filters/index.js +3 -1
  125. package/dist/components/frame/frame.stories.js +1 -1
  126. package/dist/components/hover-card/hover-card.stories.js +1 -1
  127. package/dist/components/index.d.ts +0 -2
  128. package/dist/components/index.d.ts.map +1 -1
  129. package/dist/components/index.js +0 -2
  130. package/dist/components/input/input.stories.js +1 -1
  131. package/dist/components/input-group/input-group.stories.js +1 -1
  132. package/dist/components/item/item.stories.js +1 -1
  133. package/dist/components/kbd/kbd.stories.js +1 -1
  134. package/dist/components/label/label.stories.js +1 -1
  135. package/dist/components/menubar/menubar.stories.js +1 -1
  136. package/dist/components/native-select/native-select.stories.js +1 -1
  137. package/dist/components/navigation-menu/navigation-menu.stories.js +1 -1
  138. package/dist/components/pagination/pagination.stories.js +1 -1
  139. package/dist/components/popover/popover.stories.js +1 -1
  140. package/dist/components/progress/progress.stories.js +1 -1
  141. package/dist/components/radio-group/radio-group.stories.js +1 -1
  142. package/dist/components/resizable/resizable.stories.js +1 -1
  143. package/dist/components/scroll-area/scroll-area.stories.js +1 -1
  144. package/dist/components/select/select.stories.js +1 -1
  145. package/dist/components/separator/separator.stories.js +1 -1
  146. package/dist/components/sheet/sheet.stories.js +1 -1
  147. package/dist/components/slider/slider.stories.js +1 -1
  148. package/dist/components/sonner/sonner.stories.js +1 -1
  149. package/dist/components/sortable/sortable.stories.js +1 -1
  150. package/dist/components/spinner/spinner.stories.js +1 -1
  151. package/dist/components/status-indicator/status-indicator.stories.js +1 -1
  152. package/dist/components/switch/switch.stories.js +1 -1
  153. package/dist/components/tabs/tabs.stories.js +1 -1
  154. package/dist/components/text/text.stories.js +1 -1
  155. package/dist/components/textarea/textarea.stories.js +1 -1
  156. package/dist/components/toggle/toggle.stories.js +1 -1
  157. package/dist/components/toggle-group/toggle-group.stories.js +1 -1
  158. package/dist/components/tooltip/tooltip.stories.js +1 -1
  159. package/dist/index.d.ts +1 -0
  160. package/dist/index.d.ts.map +1 -1
  161. package/dist/index.js +1 -0
  162. package/dist/tsconfig.tsbuildinfo +1 -1
  163. package/llms.txt +10 -5
  164. package/package.json +8 -4
  165. package/dist/components/date-selector/date-selector-context.d.ts.map +0 -1
  166. package/dist/components/date-selector/date-selector-parts.d.ts.map +0 -1
  167. package/dist/components/date-selector/date-selector-types.d.ts.map +0 -1
  168. package/dist/components/date-selector/date-selector-value.d.ts +0 -47
  169. package/dist/components/date-selector/date-selector-value.d.ts.map +0 -1
  170. package/dist/components/date-selector/date-selector-value.js +0 -183
  171. package/dist/components/date-selector/date-selector.d.ts.map +0 -1
  172. package/dist/components/date-selector/date-selector.js +0 -144
  173. package/dist/components/date-selector/date-selector.stories.d.ts.map +0 -1
  174. package/dist/components/date-selector/date-selector.stories.js +0 -144
  175. package/dist/components/date-selector/index.d.ts +0 -7
  176. package/dist/components/date-selector/index.d.ts.map +0 -1
  177. package/dist/components/date-selector/index.js +0 -5
  178. package/dist/components/date-selector/use-date-selector.d.ts.map +0 -1
  179. package/dist/components/navigation-pattern-1/index.d.ts +0 -3
  180. package/dist/components/navigation-pattern-1/index.d.ts.map +0 -1
  181. package/dist/components/navigation-pattern-1/index.js +0 -1
  182. package/dist/components/navigation-pattern-1/pattern-1.config.d.ts +0 -47
  183. package/dist/components/navigation-pattern-1/pattern-1.config.d.ts.map +0 -1
  184. package/dist/components/navigation-pattern-1/pattern-1.config.js +0 -55
  185. package/dist/components/navigation-pattern-1/pattern-1.d.ts +0 -7
  186. package/dist/components/navigation-pattern-1/pattern-1.d.ts.map +0 -1
  187. package/dist/components/navigation-pattern-1/pattern-1.js +0 -83
  188. package/dist/components/navigation-pattern-1/pattern-1.stories.d.ts +0 -16
  189. package/dist/components/navigation-pattern-1/pattern-1.stories.d.ts.map +0 -1
  190. package/dist/components/navigation-pattern-1/pattern-1.stories.js +0 -20
  191. /package/dist/{components → blocks}/date-selector/date-selector-context.d.ts +0 -0
  192. /package/dist/{components → blocks}/date-selector/date-selector-context.js +0 -0
@@ -0,0 +1,111 @@
1
+ import { DEFAULT_I18N, defaultDateMetricDateConnector } from './filters-defaults';
2
+ import { FILTERS_NAMESPACE, FILTERS_RESOURCE_BUNDLES } from './filters-i18n-resources';
3
+ export { FILTERS_NAMESPACE, FILTERS_RESOURCE_BUNDLES } from './filters-i18n-resources';
4
+ const registeredFiltersI18nInstances = new WeakSet();
5
+ /**
6
+ * Merges built-in `filters` resource bundles into an i18next instance (idempotent per instance).
7
+ * Call once after your app initializes i18next (Storybook does this in `.storybook/i18n.ts`).
8
+ */
9
+ export function registerFiltersI18n(instance) {
10
+ if (registeredFiltersI18nInstances.has(instance))
11
+ return;
12
+ for (const [lng, bundle] of Object.entries(FILTERS_RESOURCE_BUNDLES)) {
13
+ instance.addResourceBundle(lng, FILTERS_NAMESPACE, bundle, true, true);
14
+ }
15
+ registeredFiltersI18nInstances.add(instance);
16
+ }
17
+ const NUMBER_FORMAT_LOCALE_BY_LANG = {
18
+ en: 'en-US',
19
+ es: 'es-ES',
20
+ fr: 'fr-FR',
21
+ de: 'de-DE',
22
+ pt: 'pt-BR',
23
+ };
24
+ /** BCP 47 locale for {@link FilterI18nConfig.numberFormatLocale} from a Storybook / i18next language code. */
25
+ export function resolveFilterNumberFormatLocale(language) {
26
+ return NUMBER_FORMAT_LOCALE_BY_LANG[language] ?? NUMBER_FORMAT_LOCALE_BY_LANG.en ?? 'en-US';
27
+ }
28
+ /**
29
+ * Maps the `filters` namespace `t` function to {@link FilterI18nConfig}.
30
+ * Pass `i18n.language` (or the active locale string) as `language` so number formatting matches the toolbar.
31
+ */
32
+ export function buildFilterI18nFromT(t, language) {
33
+ const d = DEFAULT_I18N;
34
+ const dateMetricDateIn = t('dateMetricDateIn', { defaultValue: t('dateMetricRollingIn', { defaultValue: d.dateMetricDateIn }) });
35
+ const dateMetricDateOn = t('dateMetricDateOn', { defaultValue: d.dateMetricDateOn });
36
+ const dateMetricDateConnector = (date, dateI18n) => defaultDateMetricDateConnector(date, dateI18n, { dateMetricDateOn, dateMetricDateIn });
37
+ return {
38
+ addFilter: t('addFilter', { defaultValue: d.addFilter }),
39
+ searchFields: t('searchFields', { defaultValue: d.searchFields }),
40
+ noFieldsFound: t('noFieldsFound', { defaultValue: d.noFieldsFound }),
41
+ noResultsFound: t('noResultsFound', { defaultValue: d.noResultsFound }),
42
+ select: t('selectPrompt', { defaultValue: d.select }),
43
+ true: t('trueLabel', { defaultValue: d.true }),
44
+ false: t('falseLabel', { defaultValue: d.false }),
45
+ min: t('min', { defaultValue: d.min }),
46
+ max: t('max', { defaultValue: d.max }),
47
+ to: t('toLabel', { defaultValue: d.to }),
48
+ typeAndPressEnter: t('typeAndPressEnter', { defaultValue: d.typeAndPressEnter }),
49
+ selected: t('selected', { defaultValue: d.selected }),
50
+ selectedCount: t('selectedCount', { defaultValue: d.selectedCount }),
51
+ percent: t('percent', { defaultValue: d.percent }),
52
+ defaultCurrency: t('defaultCurrency', { defaultValue: d.defaultCurrency }),
53
+ numberFormatLocale: resolveFilterNumberFormatLocale(language),
54
+ defaultColor: t('defaultColor', { defaultValue: d.defaultColor }),
55
+ addFilterTitle: t('addFilterTitle', { defaultValue: d.addFilterTitle }),
56
+ addFilterUngroupedSection: t('addFilterUngroupedSection', { defaultValue: d.addFilterUngroupedSection }),
57
+ dateMetricBetweenAnd: t('dateMetricBetweenAnd', { defaultValue: d.dateMetricBetweenAnd }),
58
+ dateMetricDialogDone: t('dateMetricDialogDone', { defaultValue: d.dateMetricDialogDone }),
59
+ dateMetricDateOn,
60
+ dateMetricDateIn,
61
+ operators: {
62
+ is: t('operators.is', { defaultValue: d.operators.is }),
63
+ isNot: t('operators.isNot', { defaultValue: d.operators.isNot }),
64
+ isAnyOf: t('operators.isAnyOf', { defaultValue: d.operators.isAnyOf }),
65
+ isNotAnyOf: t('operators.isNotAnyOf', { defaultValue: d.operators.isNotAnyOf }),
66
+ includesAll: t('operators.includesAll', { defaultValue: d.operators.includesAll }),
67
+ excludesAll: t('operators.excludesAll', { defaultValue: d.operators.excludesAll }),
68
+ before: t('operators.before', { defaultValue: d.operators.before }),
69
+ after: t('operators.after', { defaultValue: d.operators.after }),
70
+ between: t('operators.between', { defaultValue: d.operators.between }),
71
+ notBetween: t('operators.notBetween', { defaultValue: d.operators.notBetween }),
72
+ contains: t('operators.contains', { defaultValue: d.operators.contains }),
73
+ notContains: t('operators.notContains', { defaultValue: d.operators.notContains }),
74
+ startsWith: t('operators.startsWith', { defaultValue: d.operators.startsWith }),
75
+ endsWith: t('operators.endsWith', { defaultValue: d.operators.endsWith }),
76
+ isExactly: t('operators.isExactly', { defaultValue: d.operators.isExactly }),
77
+ equals: t('operators.equals', { defaultValue: d.operators.equals }),
78
+ notEquals: t('operators.notEquals', { defaultValue: d.operators.notEquals }),
79
+ greaterThan: t('operators.greaterThan', { defaultValue: d.operators.greaterThan }),
80
+ lessThan: t('operators.lessThan', { defaultValue: d.operators.lessThan }),
81
+ overlaps: t('operators.overlaps', { defaultValue: d.operators.overlaps }),
82
+ includes: t('operators.includes', { defaultValue: d.operators.includes }),
83
+ excludes: t('operators.excludes', { defaultValue: d.operators.excludes }),
84
+ includesAllOf: t('operators.includesAllOf', { defaultValue: d.operators.includesAllOf }),
85
+ includesAnyOf: t('operators.includesAnyOf', { defaultValue: d.operators.includesAnyOf }),
86
+ empty: t('operators.empty', { defaultValue: d.operators.empty }),
87
+ notEmpty: t('operators.notEmpty', { defaultValue: d.operators.notEmpty }),
88
+ valueAny: t('operators.valueAny', { defaultValue: d.operators.valueAny }),
89
+ },
90
+ placeholders: {
91
+ enterField: (fieldType) => t('placeholders.enterField', { fieldType, defaultValue: d.placeholders.enterField(fieldType) }),
92
+ selectField: t('placeholders.selectField', { defaultValue: d.placeholders.selectField }),
93
+ searchField: (fieldName) => t('placeholders.searchField', {
94
+ fieldName: fieldName.toLowerCase(),
95
+ defaultValue: d.placeholders.searchField(fieldName),
96
+ }),
97
+ enterKey: t('placeholders.enterKey', { defaultValue: d.placeholders.enterKey }),
98
+ enterValue: t('placeholders.enterValue', { defaultValue: d.placeholders.enterValue }),
99
+ },
100
+ helpers: {
101
+ formatOperator: d.helpers.formatOperator,
102
+ dateMetricDateConnector,
103
+ },
104
+ validation: {
105
+ invalidEmail: t('validation.invalidEmail', { defaultValue: d.validation.invalidEmail }),
106
+ invalidUrl: t('validation.invalidUrl', { defaultValue: d.validation.invalidUrl }),
107
+ invalidTel: t('validation.invalidTel', { defaultValue: d.validation.invalidTel }),
108
+ invalid: t('validation.invalid', { defaultValue: d.validation.invalid }),
109
+ },
110
+ };
111
+ }
@@ -1,4 +1,11 @@
1
1
  import type React from 'react';
2
+ import type { DateSelectorI18nConfig, DateSelectorProps, DateSelectorValue } from '../../blocks/date-selector/date-selector-types';
3
+ /** Stored at `Filter.values[0]` when `FilterFieldConfig.type === 'date_metric'`. */
4
+ export interface DateMetricFilterPayload {
5
+ date: DateSelectorValue;
6
+ min?: number | null;
7
+ max?: number | null;
8
+ }
2
9
  export interface FilterI18nConfig {
3
10
  addFilter: string;
4
11
  searchFields: string;
@@ -15,8 +22,20 @@ export interface FilterI18nConfig {
15
22
  selectedCount: string;
16
23
  percent: string;
17
24
  defaultCurrency: string;
25
+ /** BCP 47 locale for grouping/separators on date-metric bar amounts ({@link Intl.NumberFormat}). */
26
+ numberFormatLocale: string;
18
27
  defaultColor: string;
19
28
  addFilterTitle: string;
29
+ /** Label for grouped add-filter sections that have no `group` name (collapsible menu). */
30
+ addFilterUngroupedSection: string;
31
+ /** Between min and max value inputs for `date_metric` + `value_between`. */
32
+ dateMetricBetweenAnd: string;
33
+ /** Primary action in the custom date range dialog for `date_metric` filters. */
34
+ dateMetricDialogDone: string;
35
+ /** Bar connector for custom `is` on a single calendar day (e.g. “on 4/14/26”). */
36
+ dateMetricDateOn: string;
37
+ /** Bar connector for rolling windows and custom `is` on month / quarter / year (or multi-day). */
38
+ dateMetricDateIn: string;
20
39
  operators: {
21
40
  is: string;
22
41
  isNot: string;
@@ -44,6 +63,8 @@ export interface FilterI18nConfig {
44
63
  includesAnyOf: string;
45
64
  empty: string;
46
65
  notEmpty: string;
66
+ /** Value-range: no numeric constraint (date metric filters). */
67
+ valueAny: string;
47
68
  };
48
69
  placeholders: {
49
70
  enterField: (fieldType: string) => string;
@@ -54,6 +75,13 @@ export interface FilterI18nConfig {
54
75
  };
55
76
  helpers: {
56
77
  formatOperator: (operator: string) => string;
78
+ /**
79
+ * Joins the numeric threshold segment and the date summary on the `date_metric` filter bar.
80
+ * Rolling presets and custom **`is`** on periods other than a single day use {@link FilterI18nConfig.dateMetricDateIn};
81
+ * custom **`is`** on one calendar day uses {@link FilterI18nConfig.dateMetricDateOn}. Other operators use
82
+ * {@link DateSelectorI18nConfig.filterTypes} (`before`, `after`, `between`).
83
+ */
84
+ dateMetricDateConnector: (date: DateSelectorValue, dateI18n: DateSelectorI18nConfig) => string;
57
85
  };
58
86
  validation: {
59
87
  invalidEmail: string;
@@ -73,6 +101,8 @@ export interface FilterOperator {
73
101
  value: string;
74
102
  label: string;
75
103
  supportsMultiple?: boolean;
104
+ /** When set, the operator control can render compactly (icon + tooltip) while `label` stays the accessible name. */
105
+ icon?: React.ReactNode;
76
106
  }
77
107
  export interface CustomRendererProps<T = unknown> {
78
108
  field: FilterFieldConfig<T>;
@@ -89,7 +119,7 @@ export interface FilterFieldConfig<T = unknown> {
89
119
  key?: string;
90
120
  label?: string;
91
121
  icon?: React.ReactNode;
92
- type?: 'select' | 'multiselect' | 'text' | 'custom' | 'separator';
122
+ type?: 'select' | 'multiselect' | 'text' | 'custom' | 'date_metric' | 'separator';
93
123
  group?: string;
94
124
  fields?: FilterFieldConfig<T>[];
95
125
  options?: FilterOption<T>[];
@@ -117,6 +147,8 @@ export interface FilterFieldConfig<T = unknown> {
117
147
  offLabel?: string;
118
148
  onInputChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
119
149
  defaultOperator?: string;
150
+ /** Passed to {@link DateSelector} when `type === 'date_metric'`. */
151
+ dateMetricProps?: Partial<DateSelectorProps>;
120
152
  value?: T[];
121
153
  onValueChange?: (values: T[]) => void;
122
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"filters-types.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filters-types.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAEnI,oFAAoF;AACpF,MAAM,WAAW,uBAAuB;IACpC,IAAI,EAAE,iBAAiB,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,oGAAoG;IACpG,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,yBAAyB,EAAE,MAAM,CAAC;IAClC,4EAA4E;IAC5E,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,CAAC;IACzB,kGAAkG;IAClG,gBAAgB,EAAE,MAAM,CAAC;IAEzB,SAAS,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,gEAAgE;QAChE,QAAQ,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,YAAY,EAAE;QACV,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;QAC1C,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;QAC3C,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,OAAO,EAAE;QACL,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;QAC7C;;;;;WAKG;QACH,uBAAuB,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,sBAAsB,KAAK,MAAM,CAAC;KAClG,CAAC;IAEF,UAAU,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACnB,CAAC;CACL;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACrC,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oHAAoH;IACpH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC5C,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;AAE7F,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,GAAG,WAAW,CAAC;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC;IACpE,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,eAAe,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7C,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACZ,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,OAAO;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,CAAC,EAAE,CAAC;CACf;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;CAClC"}
@@ -1,4 +1,31 @@
1
- import type { Filter, FilterFieldConfig, FilterGroup } from './filters-types';
1
+ import type { DateSelectorValue } from '../../blocks/date-selector/date-selector-types';
2
+ import type { DateMetricFilterPayload, Filter, FilterFieldConfig, FilterGroup, FilterI18nConfig, FilterOperator } from './filters-types';
3
+ /**
4
+ * Use when {@link DateSelector} is embedded without rolling preset tabs (e.g. rolling next/last live in a parent menu).
5
+ * Preserves `startDate` / `endDate` so the calendar can edit a range that was stored as rolling.
6
+ */
7
+ export declare function dateMetricValueForCustomEditor(date: DateSelectorValue): DateSelectorValue;
8
+ /**
9
+ * Default payload when adding a `date_metric` filter.
10
+ * Date range is unset until the user picks a rolling preset or a custom range (`DateSelector` empty day / between state).
11
+ */
12
+ export declare function createDefaultDateMetricPayload(): DateMetricFilterPayload;
13
+ /**
14
+ * Normalizes `values[0]` to a {@link DateMetricFilterPayload} for `date_metric` filter rows.
15
+ */
16
+ export declare function getDateMetricPayloadFromValues(values: unknown[]): DateMetricFilterPayload;
17
+ /**
18
+ * When changing `date_metric` value operators, copy a single threshold onto the field the next
19
+ * operator uses (min vs max) so an entered amount is not lost (e.g. greater than → less than).
20
+ */
21
+ export declare function migrateDateMetricPayloadForOperatorChange(previousOperator: string, nextOperator: string, payload: DateMetricFilterPayload): DateMetricFilterPayload;
22
+ /**
23
+ * Applies partial updates to a filter row, including empty-operator value clearing and
24
+ * `date_metric` threshold migration when the operator changes.
25
+ */
26
+ export declare function mergeFilterUpdate<T>(filter: Filter<T>, updates: Partial<Filter<T>>, fieldConfig: FilterFieldConfig<T> | undefined): Filter<T>;
2
27
  export declare const createFilter: <T = unknown>(field: string, operator?: string, values?: T[]) => Filter<T>;
3
28
  export declare const createFilterGroup: <T = unknown>(id: string, label: string, fields: FilterFieldConfig<T>[], initialFilters?: Filter<T>[]) => FilterGroup<T>;
29
+ /** Resolves operator definitions for a field (custom `field.operators` or defaults from i18n). */
30
+ export declare function getOperatorsForField<T = unknown>(field: FilterFieldConfig<T>, values: T[], i18n: FilterI18nConfig): FilterOperator[];
4
31
  //# sourceMappingURL=filters-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filters-utils.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9E,eAAO,MAAM,YAAY,GAAI,CAAC,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,WAAW,MAAM,EAAE,SAAQ,CAAC,EAAO,KAAG,MAAM,CAAC,CAAC,CAKrG,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,CAAC,GAAG,OAAO,EACzC,IAAI,MAAM,EACV,OAAO,MAAM,EACb,QAAQ,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC9B,iBAAgB,MAAM,CAAC,CAAC,CAAC,EAAO,KACjC,WAAW,CAAC,CAAC,CAKd,CAAC"}
1
+ {"version":3,"file":"filters-utils.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAExF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEzI;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,CAKzF;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,IAAI,uBAAuB,CAOxE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,uBAAuB,CASzF;AAED;;;GAGG;AACH,wBAAgB,yCAAyC,CACrD,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,uBAAuB,GACjC,uBAAuB,CA8BzB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAY7I;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE,WAAW,MAAM,EAAE,SAAQ,CAAC,EAAO,KAAG,MAAM,CAAC,CAAC,CAKrG,CAAC;AAEH,eAAO,MAAM,iBAAiB,GAAI,CAAC,GAAG,OAAO,EACzC,IAAI,MAAM,EACV,OAAO,MAAM,EACb,QAAQ,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAC9B,iBAAgB,MAAM,CAAC,CAAC,CAAC,EAAO,KACjC,WAAW,CAAC,CAAC,CAKd,CAAC;AAEH,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,gBAAgB,GAAG,cAAc,EAAE,CAoBpI"}
@@ -1,3 +1,88 @@
1
+ import { createOperatorsFromI18n } from './filters-defaults';
2
+ /**
3
+ * Use when {@link DateSelector} is embedded without rolling preset tabs (e.g. rolling next/last live in a parent menu).
4
+ * Preserves `startDate` / `endDate` so the calendar can edit a range that was stored as rolling.
5
+ */
6
+ export function dateMetricValueForCustomEditor(date) {
7
+ if (date.selectionMode === 'rolling-next' || date.selectionMode === 'rolling-last') {
8
+ return { ...date, selectionMode: 'custom', rollingDays: undefined, rollingUnit: undefined, rollingCount: undefined };
9
+ }
10
+ return date;
11
+ }
12
+ /**
13
+ * Default payload when adding a `date_metric` filter.
14
+ * Date range is unset until the user picks a rolling preset or a custom range (`DateSelector` empty day / between state).
15
+ */
16
+ export function createDefaultDateMetricPayload() {
17
+ return {
18
+ date: {
19
+ period: 'day',
20
+ operator: 'between',
21
+ },
22
+ };
23
+ }
24
+ /**
25
+ * Normalizes `values[0]` to a {@link DateMetricFilterPayload} for `date_metric` filter rows.
26
+ */
27
+ export function getDateMetricPayloadFromValues(values) {
28
+ const raw = values[0];
29
+ if (raw && typeof raw === 'object' && 'date' in raw) {
30
+ const d = raw.date;
31
+ if (d && typeof d === 'object') {
32
+ return raw;
33
+ }
34
+ }
35
+ return createDefaultDateMetricPayload();
36
+ }
37
+ /**
38
+ * When changing `date_metric` value operators, copy a single threshold onto the field the next
39
+ * operator uses (min vs max) so an entered amount is not lost (e.g. greater than → less than).
40
+ */
41
+ export function migrateDateMetricPayloadForOperatorChange(previousOperator, nextOperator, payload) {
42
+ if (previousOperator === nextOperator) {
43
+ return payload;
44
+ }
45
+ const min = payload.min;
46
+ const max = payload.max;
47
+ const hasMin = min != null && !Number.isNaN(min);
48
+ const hasMax = max != null && !Number.isNaN(max);
49
+ if (previousOperator === 'value_greater_than' && nextOperator === 'value_less_than' && hasMin && !hasMax) {
50
+ return { ...payload, max: min };
51
+ }
52
+ if (previousOperator === 'value_less_than' && nextOperator === 'value_greater_than' && hasMax && !hasMin) {
53
+ return { ...payload, min: max };
54
+ }
55
+ if (previousOperator === 'value_greater_than' && nextOperator === 'value_between' && hasMin && !hasMax) {
56
+ return { ...payload, max: min };
57
+ }
58
+ if (previousOperator === 'value_less_than' && nextOperator === 'value_between' && hasMax && !hasMin) {
59
+ return { ...payload, min: max };
60
+ }
61
+ if (previousOperator === 'value_between' && nextOperator === 'value_greater_than' && !hasMin && hasMax) {
62
+ return { ...payload, min: max };
63
+ }
64
+ if (previousOperator === 'value_between' && nextOperator === 'value_less_than' && hasMin && !hasMax) {
65
+ return { ...payload, max: min };
66
+ }
67
+ return payload;
68
+ }
69
+ /**
70
+ * Applies partial updates to a filter row, including empty-operator value clearing and
71
+ * `date_metric` threshold migration when the operator changes.
72
+ */
73
+ export function mergeFilterUpdate(filter, updates, fieldConfig) {
74
+ const updatedFilter = { ...filter, ...updates };
75
+ if (updates.operator === 'empty' || updates.operator === 'not_empty') {
76
+ updatedFilter.values = [];
77
+ }
78
+ if (fieldConfig?.type === 'date_metric' && updates.operator !== undefined && updates.operator !== 'empty' && updates.operator !== 'not_empty') {
79
+ const p = updatedFilter.values[0];
80
+ if (p && typeof p === 'object' && 'date' in p) {
81
+ updatedFilter.values = [migrateDateMetricPayloadForOperatorChange(filter.operator, updates.operator, p)];
82
+ }
83
+ }
84
+ return updatedFilter;
85
+ }
1
86
  export const createFilter = (field, operator, values = []) => ({
2
87
  id: `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,
3
88
  field,
@@ -10,3 +95,20 @@ export const createFilterGroup = (id, label, fields, initialFilters = []) => ({
10
95
  filters: initialFilters,
11
96
  fields,
12
97
  });
98
+ /** Resolves operator definitions for a field (custom `field.operators` or defaults from i18n). */
99
+ export function getOperatorsForField(field, values, i18n) {
100
+ if (field.operators)
101
+ return field.operators;
102
+ const operators = createOperatorsFromI18n(i18n);
103
+ let fieldType = field.type || 'select';
104
+ if (fieldType === 'select' && values.length > 1) {
105
+ fieldType = 'multiselect';
106
+ }
107
+ if (fieldType === 'multiselect' || field.type === 'multiselect') {
108
+ return operators.multiselect;
109
+ }
110
+ if (field.type === 'date_metric') {
111
+ return operators.dateMetric;
112
+ }
113
+ return operators[fieldType] || operators.select;
114
+ }
@@ -1,29 +1,47 @@
1
1
  import type React from 'react';
2
2
  import type { Filter, FilterFieldsConfig, FilterI18nConfig } from './filters-types';
3
+ /** Default for `Filters` `submenuSearchMinOptions`. */
4
+ export declare const DEFAULT_SUBMENU_SEARCH_MIN_OPTIONS = 10;
3
5
  interface FiltersContentProps<T = unknown> {
4
6
  filters: Filter<T>[];
5
7
  fields: FilterFieldsConfig<T>;
6
8
  onChange: (filters: Filter<T>[]) => void;
9
+ /** When it matches a filter `id`, that row gets `autoFocus` (e.g. after adding a filter). */
10
+ lastAddedFilterId?: string | null;
7
11
  }
8
- export declare const FiltersContent: <T = unknown>({ filters, fields, onChange }: FiltersContentProps<T>) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const FiltersContent: <T = unknown>({ filters, fields, onChange, lastAddedFilterId }: FiltersContentProps<T>) => import("react/jsx-runtime").JSX.Element;
9
13
  interface FiltersProps<T = unknown> {
10
14
  filters: Filter<T>[];
11
15
  fields: FilterFieldsConfig<T>;
12
16
  onChange: (filters: Filter<T>[]) => void;
13
17
  className?: string;
14
- variant?: 'solid' | 'default';
15
18
  size?: 'sm' | 'default' | 'lg';
16
19
  radius?: 'default' | 'full';
17
20
  i18n?: Partial<FilterI18nConfig>;
18
21
  showSearchInput?: boolean;
22
+ /**
23
+ * Minimum number of options before the search field is shown in add-filter option submenus and in value popovers on the bar.
24
+ * Ignored when `field.searchable === false`. Default `10`.
25
+ */
26
+ submenuSearchMinOptions?: number;
19
27
  trigger?: React.ReactNode;
20
28
  allowMultiple?: boolean;
21
29
  menuPopupClassName?: string;
30
+ /** When the add-filter menu uses grouped fields, show accordion-style expand/collapse per group. */
31
+ collapsibleAddFilterGroups?: boolean;
32
+ /** When `collapsibleAddFilterGroups` is true, start with every group collapsed each time the add-filter menu opens. */
33
+ defaultAddFilterGroupsCollapsed?: boolean;
34
+ /**
35
+ * When the add-filter config uses top-level groups, render each group as a hover/focus **submenu** (category row opens to the side)
36
+ * instead of an accordion. Field rows that open option submenus still nest one level deeper. Ignores `collapsibleAddFilterGroups` / `defaultAddFilterGroupsCollapsed`.
37
+ */
38
+ nestedAddFilterGroups?: boolean;
39
+ /** When true and at least one filter exists, the add-filter trigger switches to a compact icon button (custom `trigger` is not used in that state). */
22
40
  collapseAddButton?: boolean;
23
41
  enableShortcut?: boolean;
24
42
  shortcutKey?: string;
25
43
  shortcutLabel?: string;
26
44
  }
27
- export declare function Filters<T = unknown>({ filters, fields, onChange, className, variant, size, radius, i18n, showSearchInput, trigger, allowMultiple, menuPopupClassName, enableShortcut, shortcutKey, shortcutLabel, }: FiltersProps<T>): import("react/jsx-runtime").JSX.Element;
45
+ export declare function Filters<T = unknown>({ filters, fields, onChange, className, size, radius, i18n, showSearchInput, submenuSearchMinOptions, trigger, allowMultiple, menuPopupClassName, collapsibleAddFilterGroups, defaultAddFilterGroupsCollapsed, nestedAddFilterGroups, collapseAddButton, enableShortcut, shortcutKey, shortcutLabel, }: FiltersProps<T>): import("react/jsx-runtime").JSX.Element;
28
46
  export {};
29
47
  //# sourceMappingURL=filters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA6B/B,OAAO,KAAK,EAAE,MAAM,EAAuC,kBAAkB,EAAE,gBAAgB,EAAkB,MAAM,iBAAiB,CAAC;AA4kBzI,UAAU,mBAAmB,CAAC,CAAC,GAAG,OAAO;IACrC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;CAC5C;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,GAAG,OAAO,EAAG,+BAA+B,mBAAmB,CAAC,CAAC,CAAC,4CAuEjG,CAAC;AAEF,UAAU,YAAY,CAAC,CAAC,GAAG,OAAO;IAC9B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiND,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,EACjC,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,MAAkB,EAClB,IAAI,EACJ,eAAsB,EACtB,OAAO,EACP,aAAoB,EACpB,kBAAkB,EAClB,cAAsB,EACtB,WAAiB,EACjB,aAAmB,GACtB,EAAE,YAAY,CAAC,CAAC,CAAC,2CAiajB"}
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filters.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA+B/B,OAAO,KAAK,EAAE,MAAM,EAAuC,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEzH,uDAAuD;AACvD,eAAO,MAAM,kCAAkC,KAAK,CAAC;AA0sBrD,UAAU,mBAAmB,CAAC,CAAC,GAAG,OAAO;IACrC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;IACzC,6FAA6F;IAC7F,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,GAAG,OAAO,EAAG,kDAAyD,mBAAmB,CAAC,CAAC,CAAC,4CAoD3H,CAAC;AAEF,UAAU,YAAY,CAAC,CAAC,GAAG,OAAO;IAC9B,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oGAAoG;IACpG,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,uHAAuH;IACvH,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uJAAuJ;IACvJ,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AA8LD,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,EACjC,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,IAAW,EACX,MAAkB,EAClB,IAAI,EACJ,eAAsB,EACtB,uBAA4D,EAC5D,OAAO,EACP,aAAoB,EACpB,kBAAkB,EAClB,0BAAkC,EAClC,+BAAuC,EACvC,qBAA6B,EAC7B,iBAAyB,EACzB,cAAsB,EACtB,WAAiB,EACjB,aAAmB,GACtB,EAAE,YAAY,CAAC,CAAC,CAAC,2CAgsBjB"}