@wallarm-org/design-system 0.41.0 → 0.42.0

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 (93) hide show
  1. package/dist/components/FilterInput/FilterInput.d.ts +7 -8
  2. package/dist/components/FilterInput/FilterInputContext/types.d.ts +12 -9
  3. package/dist/components/FilterInput/FilterInputContext/useFilterInputContextValue.d.ts +4 -2
  4. package/dist/components/FilterInput/FilterInputContext/useFilterInputContextValue.js +4 -0
  5. package/dist/components/FilterInput/FilterInputErrors/parseFilterInputErrors.js +1 -2
  6. package/dist/components/FilterInput/FilterInputField/ChipsWithGaps.d.ts +1 -1
  7. package/dist/components/FilterInput/FilterInputField/ChipsWithGaps.js +1 -1
  8. package/dist/components/FilterInput/FilterInputField/FilterInputChip/FilterInputChip.d.ts +1 -1
  9. package/dist/components/FilterInput/FilterInputField/FilterInputChip/FilterInputChip.js +2 -2
  10. package/dist/components/FilterInput/FilterInputField/FilterInputField.js +11 -40
  11. package/dist/components/FilterInput/FilterInputField/hooks/useSegmentEditKeyboard.d.ts +37 -0
  12. package/dist/components/FilterInput/FilterInputField/hooks/useSegmentEditKeyboard.js +78 -0
  13. package/dist/components/FilterInput/FilterInputMenu/FilterInputDateValueMenu/constants.d.ts +2 -2
  14. package/dist/components/FilterInput/FilterInputMenu/FilterInputFieldMenu/FilterInputFieldMenu.d.ts +1 -1
  15. package/dist/components/FilterInput/FilterInputMenu/FilterInputMenu.d.ts +1 -1
  16. package/dist/components/FilterInput/FilterInputMenu/FilterInputValueMenu/FilterInputValueMenu.d.ts +5 -6
  17. package/dist/components/FilterInput/FilterInputMenu/FilterInputValueMenu/useValueMenuDisplayValues.d.ts +4 -14
  18. package/dist/components/FilterInput/FilterInputMenu/FilterInputValueMenu/useValueMenuState.d.ts +3 -5
  19. package/dist/components/FilterInput/FilterInputMenu/hooks/useKeyboardNav.d.ts +1 -1
  20. package/dist/components/FilterInput/FilterInputMenu/hooks/useKeyboardNav.js +5 -2
  21. package/dist/components/FilterInput/hooks/useAutoCleanupDetachedElement.d.ts +13 -0
  22. package/dist/components/FilterInput/hooks/useAutoCleanupDetachedElement.js +22 -0
  23. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/{deriveAutocompleteValues.d.ts → lib/deriveAutocompleteValues.d.ts} +3 -3
  24. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/{deriveAutocompleteValues.js → lib/deriveAutocompleteValues.js} +1 -1
  25. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/lib/getInitialSegmentText.d.ts +9 -0
  26. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/lib/getInitialSegmentText.js +8 -0
  27. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/lib/index.d.ts +3 -0
  28. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/lib/index.js +4 -0
  29. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/{valueCommitHelpers.d.ts → lib/valueResolution.d.ts} +1 -7
  30. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/{valueCommitHelpers.js → lib/valueResolution.js} +3 -25
  31. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useAutocompleteState.d.ts +36 -0
  32. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useAutocompleteState.js +53 -0
  33. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useBlurCommit.d.ts +5 -16
  34. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useBlurCommit.js +12 -5
  35. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useChipActions.d.ts +2 -2
  36. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useChipActions.js +5 -5
  37. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useChipCascade.d.ts +44 -0
  38. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useChipCascade.js +99 -0
  39. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useChipEditing.d.ts +7 -8
  40. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useChipEditing.js +21 -16
  41. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useFilterInputAutocomplete.d.ts +9 -10
  42. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useFilterInputAutocomplete.js +50 -83
  43. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useFocusManagement.d.ts +9 -11
  44. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useFocusManagement.js +47 -20
  45. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useInputHandlers.d.ts +6 -4
  46. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useInputHandlers.js +32 -15
  47. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/index.d.ts +1 -0
  48. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/index.js +2 -0
  49. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/{useMenuFlow.d.ts → useMenuFlow/types.d.ts} +15 -18
  50. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/types.js +0 -0
  51. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useFieldFlow.d.ts +11 -0
  52. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useFieldFlow.js +95 -0
  53. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useMenuFlow.d.ts +20 -0
  54. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useMenuFlow.js +47 -0
  55. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useOperatorFlow.d.ts +11 -0
  56. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useOperatorFlow.js +87 -0
  57. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useValueFlow.d.ts +14 -0
  58. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow/useValueFlow.js +107 -0
  59. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuPositioning.d.ts +25 -8
  60. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuPositioning.js +38 -22
  61. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useResetState.d.ts +10 -19
  62. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useResetState.js +3 -3
  63. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useSegmentEditFlow.d.ts +36 -0
  64. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useSegmentEditFlow.js +69 -0
  65. package/dist/components/FilterInput/hooks/useFilterInputExpression/buildChips.js +1 -2
  66. package/dist/components/FilterInput/hooks/useFilterInputPositioning.d.ts +9 -4
  67. package/dist/components/FilterInput/hooks/useFilterInputPositioning.js +7 -6
  68. package/dist/components/FilterInput/hooks/useFilterInputSelection/lib/dom.d.ts +4 -4
  69. package/dist/components/FilterInput/hooks/useFilterInputSelection/useFilterInputSelection.d.ts +2 -2
  70. package/dist/components/FilterInput/hooks/useFilterInputSelection/useSelectionClipboard.d.ts +2 -5
  71. package/dist/components/FilterInput/hooks/useFloatingRecomputeOn.d.ts +14 -0
  72. package/dist/components/FilterInput/hooks/useFloatingRecomputeOn.js +18 -0
  73. package/dist/components/FilterInput/hooks/useResizeTracker.d.ts +10 -0
  74. package/dist/components/FilterInput/hooks/useResizeTracker.js +21 -0
  75. package/dist/components/FilterInput/lib/applyAcceptChar.d.ts +3 -4
  76. package/dist/components/FilterInput/lib/applyKnownFieldHelpers.d.ts +13 -25
  77. package/dist/components/FilterInput/lib/constants.d.ts +16 -34
  78. package/dist/components/FilterInput/lib/constants.js +3 -1
  79. package/dist/components/FilterInput/lib/dom.d.ts +15 -11
  80. package/dist/components/FilterInput/lib/dom.js +14 -9
  81. package/dist/components/FilterInput/lib/fields.d.ts +10 -19
  82. package/dist/components/FilterInput/lib/index.d.ts +4 -2
  83. package/dist/components/FilterInput/lib/index.js +5 -3
  84. package/dist/components/FilterInput/lib/menuFilterText.d.ts +8 -18
  85. package/dist/components/FilterInput/lib/operators.d.ts +11 -21
  86. package/dist/components/FilterInput/lib/segmentMenu.d.ts +4 -0
  87. package/dist/components/FilterInput/lib/segmentMenu.js +7 -0
  88. package/dist/components/FilterInput/lib/serializeExpression.d.ts +5 -12
  89. package/dist/components/FilterInput/lib/validation.d.ts +9 -0
  90. package/dist/components/FilterInput/lib/validation.js +24 -0
  91. package/dist/metadata/components.json +8 -8
  92. package/package.json +1 -1
  93. package/dist/components/FilterInput/hooks/useFilterInputAutocomplete/useMenuFlow.js +0 -260
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.40.0",
3
- "generatedAt": "2026-05-20T10:06:29.726Z",
2
+ "version": "0.41.0",
3
+ "generatedAt": "2026-05-20T10:19:45.546Z",
4
4
  "components": [
5
5
  {
6
6
  "name": "Accordion",
@@ -19187,7 +19187,7 @@
19187
19187
  "name": "fields",
19188
19188
  "type": "FieldMetadata[] | undefined",
19189
19189
  "required": false,
19190
- "description": "Filter-field configurations driving the autocomplete. Most fields are\npassed through as-is, but a few names are **reserved** and auto-wired\nwith design-system helpers (`acceptChar` / `normalize` / `getSuggestions`\n/ `validate`). Current reserved names:\n\n - `status_code` — HTTP status code field (mask suggestions, format\n validation, digit-or-X input filter, partial-input normalization).\n\nConsumer-supplied callbacks always override the auto-wiring, so you can\nopt out per-field. For the same helpers on a field with a different\n`name`, import the factories (`createStatusCodeSuggestions`, …) and\nattach them manually."
19190
+ "description": "Filter-field configurations driving the autocomplete. A few names are\n**reserved** and auto-wired with design-system helpers — DS-supplied\ncallbacks **override** consumer values for the reserved slots, because\nthe field semantics (mask range, accepted chars, backend form) are fixed\nby DS:\n\n - `status_code` — HTTP status code field (mask suggestions, format\n validation, digit-or-X input filter, partial-input normalization).\n\nTo opt out, use a different `name` and attach the factories\n(`createStatusCodeSuggestions`, …) manually."
19191
19191
  },
19192
19192
  {
19193
19193
  "name": "value",
@@ -19855,7 +19855,7 @@
19855
19855
  "name": "menuRef",
19856
19856
  "type": "RefObject<HTMLDivElement | null> | undefined",
19857
19857
  "required": false,
19858
- "description": "Ref to the menu content element — shared across menus for focus management"
19858
+ "description": "Ref to the menu content (shared across menus for focus management)."
19859
19859
  }
19860
19860
  ]
19861
19861
  },
@@ -19948,25 +19948,25 @@
19948
19948
  "name": "inputRef",
19949
19949
  "type": "RefObject<HTMLInputElement | null> | undefined",
19950
19950
  "required": false,
19951
- "description": "Ref to the query bar input — ArrowUp on first item returns focus here"
19951
+ "description": "Query bar input — ArrowUp on first item returns focus here."
19952
19952
  },
19953
19953
  {
19954
19954
  "name": "filterText",
19955
19955
  "type": "string | undefined",
19956
19956
  "required": false,
19957
- "description": "Text to filter values by label"
19957
+ "description": "Filter values by label."
19958
19958
  },
19959
19959
  {
19960
19960
  "name": "menuRef",
19961
19961
  "type": "RefObject<HTMLDivElement | null> | undefined",
19962
19962
  "required": false,
19963
- "description": "Ref to the menu content element shared across menus for focus management"
19963
+ "description": "Menu content ref (shared across menus for focus management)."
19964
19964
  },
19965
19965
  {
19966
19966
  "name": "blurCommitRef",
19967
19967
  "type": "RefObject<(() => boolean) | null> | undefined",
19968
19968
  "required": false,
19969
- "description": "Ref set by this component to allow blur handler to commit multi-select values"
19969
+ "description": "Set here so blur handler can commit multi-select values."
19970
19970
  }
19971
19971
  ]
19972
19972
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wallarm-org/design-system",
3
- "version": "0.41.0",
3
+ "version": "0.42.0",
4
4
  "description": "Core design system library with React components and Storybook documentation",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -1,260 +0,0 @@
1
- import { useCallback, useRef } from "react";
2
- import { SEGMENT_VARIANT } from "../../FilterInputField/FilterInputChip/index.js";
3
- import { OPERATOR_SYMBOLS, chipIdToConditionIndex, getFieldOperators, getOperatorFromLabel, isBetweenOperator, isMultiSelectOperator, isNoValueOperator, isOperatorAllowedForField, isValueShapeCompatible } from "../../lib/index.js";
4
- import { resolveDateRangeValue, resolveDateValue, resolveMultiValues, resolveSingleValue, validateValueForField } from "./valueCommitHelpers.js";
5
- const useMenuFlow = ({ editing, selectedField, selectedOperator, fields, inputRef, insertIndex, upsertCondition, conditions, resetState, commitBuildingOnBlur, dateRange, setSelectedField, setSelectedOperator, setInputText, setMenuState, setBuildingMultiValue })=>{
6
- const conditionsRef = useRef(conditions);
7
- conditionsRef.current = conditions;
8
- const handleMenuClose = useCallback(()=>{
9
- if (document.activeElement === inputRef.current) return;
10
- if (document.activeElement?.closest?.('[data-slot^="segment-"]')) return;
11
- if (commitBuildingOnBlur()) return;
12
- const hasIncompleteBuilding = null !== selectedField && !editing.editingChipId;
13
- if (hasIncompleteBuilding) return void setMenuState('closed');
14
- resetState();
15
- }, [
16
- commitBuildingOnBlur,
17
- resetState,
18
- inputRef,
19
- selectedField,
20
- editing.editingChipId,
21
- setMenuState
22
- ]);
23
- const handleFieldSelect = useCallback((field)=>{
24
- if (editing.editingChipId && editing.editingSegment === SEGMENT_VARIANT.attribute) {
25
- const idx = chipIdToConditionIndex(editing.editingChipId);
26
- const condition = null !== idx ? conditionsRef.current[idx] : null;
27
- if (condition) {
28
- const hasValueError = validateValueForField(field, condition.value);
29
- upsertCondition(field, condition.operator, condition.value, editing.editingChipId, void 0, hasValueError ? SEGMENT_VARIANT.value : void 0, condition.dateOrigin);
30
- }
31
- resetState();
32
- return;
33
- }
34
- const isBuildingEdit = !editing.editingChipId && editing.editingSegment === SEGMENT_VARIANT.attribute;
35
- if (isBuildingEdit) {
36
- setSelectedField(field);
37
- const keepOperator = selectedOperator ? isOperatorAllowedForField(field, selectedOperator) : false;
38
- if (!keepOperator) setSelectedOperator(null);
39
- editing.clearEditing();
40
- setMenuState(keepOperator ? 'value' : 'operator');
41
- return;
42
- }
43
- setSelectedField(field);
44
- setInputText('');
45
- setMenuState('operator');
46
- }, [
47
- editing,
48
- selectedOperator,
49
- upsertCondition,
50
- resetState,
51
- setSelectedField,
52
- setSelectedOperator,
53
- setInputText,
54
- setMenuState
55
- ]);
56
- const handleOperatorSelect = useCallback((operator)=>{
57
- if (!selectedField) return;
58
- const isBuildingEdit = !editing.editingChipId && editing.editingSegment === SEGMENT_VARIANT.operator;
59
- if (isBuildingEdit) {
60
- const shapeCompatible = isValueShapeCompatible(selectedOperator, operator);
61
- if (!shapeCompatible) setBuildingMultiValue(void 0);
62
- setSelectedOperator(operator);
63
- editing.clearEditing();
64
- if (isNoValueOperator(operator)) {
65
- upsertCondition(selectedField, operator, null, null, insertIndex);
66
- resetState(true);
67
- return;
68
- }
69
- setMenuState('value');
70
- return;
71
- }
72
- if (isNoValueOperator(operator)) {
73
- const isEditing = !!editing.editingChipId;
74
- upsertCondition(selectedField, operator, null, editing.editingChipId, isEditing ? void 0 : insertIndex);
75
- resetState(!isEditing);
76
- return;
77
- }
78
- if (editing.editingChipId && editing.editingSegment === SEGMENT_VARIANT.operator) {
79
- const idx = chipIdToConditionIndex(editing.editingChipId);
80
- const condition = null !== idx ? conditionsRef.current[idx] : null;
81
- if (condition) {
82
- const hasValue = null !== condition.value && '' !== condition.value;
83
- if (hasValue) {
84
- upsertCondition(selectedField, operator, condition.value, editing.editingChipId, void 0, void 0, condition.dateOrigin);
85
- resetState();
86
- return;
87
- }
88
- upsertCondition(selectedField, operator, null, editing.editingChipId);
89
- editing.setEditingSegment(SEGMENT_VARIANT.value);
90
- editing.setSegmentFilterText('');
91
- }
92
- }
93
- setSelectedOperator(operator);
94
- setInputText('');
95
- setMenuState('value');
96
- }, [
97
- editing,
98
- selectedField,
99
- selectedOperator,
100
- insertIndex,
101
- upsertCondition,
102
- resetState,
103
- setSelectedOperator,
104
- setMenuState,
105
- setBuildingMultiValue,
106
- setInputText
107
- ]);
108
- const handleValueSelect = useCallback((val)=>{
109
- if (!selectedField || !selectedOperator) return;
110
- if (isBetweenOperator(selectedOperator) && 'date' === selectedField.type) {
111
- const result = dateRange.selectValue(String(val));
112
- if (!result) return;
113
- upsertCondition(selectedField, selectedOperator, result, editing.editingChipId);
114
- resetState(!editing.editingChipId);
115
- return;
116
- }
117
- const isEditing = !!editing.editingChipId;
118
- upsertCondition(selectedField, selectedOperator, val, editing.editingChipId, isEditing ? void 0 : insertIndex);
119
- resetState(!isEditing);
120
- }, [
121
- selectedField,
122
- selectedOperator,
123
- editing,
124
- dateRange,
125
- insertIndex,
126
- upsertCondition,
127
- resetState
128
- ]);
129
- const handleMultiCommit = useCallback((values)=>{
130
- if (!selectedField || !selectedOperator || 0 === values.length) return;
131
- const isEditing = !!editing.editingChipId;
132
- upsertCondition(selectedField, selectedOperator, values, editing.editingChipId, isEditing ? void 0 : insertIndex);
133
- resetState(!isEditing);
134
- }, [
135
- selectedField,
136
- selectedOperator,
137
- editing,
138
- insertIndex,
139
- upsertCondition,
140
- resetState
141
- ]);
142
- const handleBuildingValueChange = useCallback((preview)=>{
143
- setBuildingMultiValue(preview);
144
- }, [
145
- setBuildingMultiValue
146
- ]);
147
- const handleMultiSelectToggle = useCallback(()=>{
148
- if (editing.editingSegment === SEGMENT_VARIANT.value) editing.resetSegmentTyping();
149
- else setInputText('');
150
- }, [
151
- editing,
152
- setInputText
153
- ]);
154
- const handleRangeSelect = useCallback((from, to)=>{
155
- if (!selectedField || !selectedOperator) return;
156
- const isEditing = !!editing.editingChipId;
157
- upsertCondition(selectedField, selectedOperator, [
158
- from,
159
- to
160
- ], editing.editingChipId, isEditing ? void 0 : insertIndex);
161
- resetState(!isEditing);
162
- }, [
163
- selectedField,
164
- selectedOperator,
165
- editing,
166
- insertIndex,
167
- upsertCondition,
168
- resetState
169
- ]);
170
- const handleCustomValueCommit = useCallback((customText)=>{
171
- if (!selectedField || !selectedOperator || !customText.trim()) return;
172
- const trimmed = customText.trim();
173
- const isEditing = !!editing.editingChipId;
174
- if (isMultiSelectOperator(selectedOperator)) {
175
- const { resolved, error } = resolveMultiValues(selectedField, trimmed);
176
- upsertCondition(selectedField, selectedOperator, resolved, editing.editingChipId, isEditing ? void 0 : insertIndex, error ? SEGMENT_VARIANT.value : void 0);
177
- } else if ('date' === selectedField.type) if (isBetweenOperator(selectedOperator)) {
178
- const rangeValue = resolveDateRangeValue(trimmed);
179
- upsertCondition(selectedField, selectedOperator, rangeValue ?? trimmed, editing.editingChipId, isEditing ? void 0 : insertIndex, rangeValue ? void 0 : SEGMENT_VARIANT.value, 'absolute');
180
- } else {
181
- const { error, dateOrigin } = resolveDateValue(trimmed, editing.editingChipId, conditionsRef.current);
182
- upsertCondition(selectedField, selectedOperator, trimmed, editing.editingChipId, isEditing ? void 0 : insertIndex, error ? SEGMENT_VARIANT.value : void 0, dateOrigin);
183
- }
184
- else {
185
- const { resolved, error } = resolveSingleValue(selectedField, trimmed);
186
- upsertCondition(selectedField, selectedOperator, resolved, editing.editingChipId, isEditing ? void 0 : insertIndex, error ? SEGMENT_VARIANT.value : void 0);
187
- }
188
- resetState(!isEditing);
189
- }, [
190
- selectedField,
191
- selectedOperator,
192
- editing,
193
- insertIndex,
194
- upsertCondition,
195
- resetState
196
- ]);
197
- const handleCustomAttributeCommit = useCallback((customText)=>{
198
- if (!customText.trim()) return;
199
- const trimmed = customText.trim();
200
- const matchedField = fields.find((f)=>f.label.toLowerCase() === trimmed.toLowerCase() || f.name.toLowerCase() === trimmed.toLowerCase());
201
- if (!editing.editingChipId) {
202
- if (matchedField) handleFieldSelect(matchedField);
203
- return;
204
- }
205
- const idx = chipIdToConditionIndex(editing.editingChipId);
206
- const condition = null !== idx ? conditionsRef.current[idx] : null;
207
- if (!condition) return;
208
- if (matchedField) {
209
- const hasValueError = validateValueForField(matchedField, condition.value);
210
- upsertCondition(matchedField, condition.operator, condition.value, editing.editingChipId, void 0, hasValueError ? SEGMENT_VARIANT.value : void 0, condition.dateOrigin);
211
- } else {
212
- const syntheticField = {
213
- name: trimmed,
214
- label: trimmed,
215
- type: 'string'
216
- };
217
- upsertCondition(syntheticField, condition.operator, condition.value, editing.editingChipId, void 0, SEGMENT_VARIANT.attribute, condition.dateOrigin);
218
- }
219
- resetState();
220
- }, [
221
- editing,
222
- fields,
223
- upsertCondition,
224
- resetState,
225
- handleFieldSelect
226
- ]);
227
- const handleCustomOperatorCommit = useCallback((customText)=>{
228
- if (!selectedField || !customText.trim()) return;
229
- const trimmed = customText.trim();
230
- const allowed = getFieldOperators(selectedField);
231
- let matched = getOperatorFromLabel(trimmed, selectedField.type);
232
- if (!matched) {
233
- const symbolMatch = allowed.find((op)=>OPERATOR_SYMBOLS[op].toLowerCase() === trimmed.toLowerCase());
234
- if (symbolMatch) matched = symbolMatch;
235
- }
236
- if (!matched) {
237
- const rawMatch = allowed.find((op)=>op.toLowerCase() === trimmed.toLowerCase());
238
- if (rawMatch) matched = rawMatch;
239
- }
240
- if (!matched || !isOperatorAllowedForField(selectedField, matched)) return;
241
- handleOperatorSelect(matched);
242
- }, [
243
- selectedField,
244
- handleOperatorSelect
245
- ]);
246
- return {
247
- handleMenuClose,
248
- handleFieldSelect,
249
- handleOperatorSelect,
250
- handleValueSelect,
251
- handleMultiCommit,
252
- handleBuildingValueChange,
253
- handleMultiSelectToggle,
254
- handleRangeSelect,
255
- handleCustomValueCommit,
256
- handleCustomOperatorCommit,
257
- handleCustomAttributeCommit
258
- };
259
- };
260
- export { useMenuFlow };