@vuu-ui/vuu-filters 0.13.8 → 0.13.10

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 (165) hide show
  1. package/cjs/FilterModel.js +224 -0
  2. package/cjs/FilterModel.js.map +1 -0
  3. package/cjs/custom-filters/CustomFilters.js +108 -0
  4. package/cjs/custom-filters/CustomFilters.js.map +1 -0
  5. package/cjs/custom-filters/filterBarFocusManagement.js +35 -0
  6. package/cjs/custom-filters/filterBarFocusManagement.js.map +1 -0
  7. package/cjs/custom-filters/useCustomFilters.js +260 -0
  8. package/cjs/custom-filters/useCustomFilters.js.map +1 -0
  9. package/cjs/custom-filters/useFilterState.js +149 -0
  10. package/cjs/custom-filters/useFilterState.js.map +1 -0
  11. package/cjs/filter-bar/FilterBar.css.js +6 -0
  12. package/cjs/filter-bar/FilterBar.css.js.map +1 -0
  13. package/cjs/filter-bar/FilterBar.js +120 -0
  14. package/cjs/filter-bar/FilterBar.js.map +1 -0
  15. package/cjs/filter-bar/useFilterBar.js +37 -0
  16. package/cjs/filter-bar/useFilterBar.js.map +1 -0
  17. package/cjs/filter-clause/ColumnPicker.js +37 -0
  18. package/cjs/filter-clause/ColumnPicker.js.map +1 -0
  19. package/cjs/filter-clause/ExpandoCombobox.css.js +6 -0
  20. package/cjs/filter-clause/ExpandoCombobox.css.js.map +1 -0
  21. package/cjs/filter-clause/ExpandoCombobox.js +93 -0
  22. package/cjs/filter-clause/ExpandoCombobox.js.map +1 -0
  23. package/cjs/filter-clause/FilterClause.css.js +6 -0
  24. package/cjs/filter-clause/FilterClause.css.js.map +1 -0
  25. package/cjs/filter-clause/FilterClause.js +95 -0
  26. package/cjs/filter-clause/FilterClause.js.map +1 -0
  27. package/cjs/filter-clause/OperatorPicker.js +33 -0
  28. package/cjs/filter-clause/OperatorPicker.js.map +1 -0
  29. package/cjs/filter-clause/filterClauseFocusManagement.js +205 -0
  30. package/cjs/filter-clause/filterClauseFocusManagement.js.map +1 -0
  31. package/cjs/filter-clause/operator-utils.js +34 -0
  32. package/cjs/filter-clause/operator-utils.js.map +1 -0
  33. package/cjs/filter-clause/useExpandoCombobox.js +25 -0
  34. package/cjs/filter-clause/useExpandoCombobox.js.map +1 -0
  35. package/cjs/filter-clause/useFilterClause.js +151 -0
  36. package/cjs/filter-clause/useFilterClause.js.map +1 -0
  37. package/cjs/filter-clause/value-editors/FilterClauseValueEditor.js +77 -0
  38. package/cjs/filter-clause/value-editors/FilterClauseValueEditor.js.map +1 -0
  39. package/cjs/filter-clause/value-editors/FilterClauseValueEditorDate.js +64 -0
  40. package/cjs/filter-clause/value-editors/FilterClauseValueEditorDate.js.map +1 -0
  41. package/cjs/filter-clause/value-editors/FilterClauseValueEditorNumber.js +55 -0
  42. package/cjs/filter-clause/value-editors/FilterClauseValueEditorNumber.js.map +1 -0
  43. package/cjs/filter-clause/value-editors/FilterClauseValueEditorText.js +189 -0
  44. package/cjs/filter-clause/value-editors/FilterClauseValueEditorText.js.map +1 -0
  45. package/cjs/filter-editor/FilterClauseCombinator.css.js +6 -0
  46. package/cjs/filter-editor/FilterClauseCombinator.css.js.map +1 -0
  47. package/cjs/filter-editor/FilterClauseCombinator.js +42 -0
  48. package/cjs/filter-editor/FilterClauseCombinator.js.map +1 -0
  49. package/cjs/filter-editor/FilterEditor.css.js +6 -0
  50. package/cjs/filter-editor/FilterEditor.css.js.map +1 -0
  51. package/cjs/filter-editor/FilterEditor.js +100 -0
  52. package/cjs/filter-editor/FilterEditor.js.map +1 -0
  53. package/cjs/filter-editor/useFilterEditor.js +191 -0
  54. package/cjs/filter-editor/useFilterEditor.js.map +1 -0
  55. package/cjs/filter-pill/FilterPill.css.js +6 -0
  56. package/cjs/filter-pill/FilterPill.css.js.map +1 -0
  57. package/cjs/filter-pill/FilterPill.js +147 -0
  58. package/cjs/filter-pill/FilterPill.js.map +1 -0
  59. package/cjs/filter-pill/filterAsReactNode.js +27 -0
  60. package/cjs/filter-pill/filterAsReactNode.js.map +1 -0
  61. package/cjs/filter-pill/getFilterLabel.js +22 -0
  62. package/cjs/filter-pill/getFilterLabel.js.map +1 -0
  63. package/cjs/filter-pill/getFilterTooltipText.js +41 -0
  64. package/cjs/filter-pill/getFilterTooltipText.js.map +1 -0
  65. package/cjs/filter-pill-menu/FilterPillMenuOptions.js +32 -0
  66. package/cjs/filter-pill-menu/FilterPillMenuOptions.js.map +1 -0
  67. package/cjs/filter-utils.js +326 -0
  68. package/cjs/filter-utils.js.map +1 -0
  69. package/cjs/index.js +45 -2995
  70. package/cjs/index.js.map +1 -1
  71. package/cjs/inline-filter/InlineFilter.css.js +6 -0
  72. package/cjs/inline-filter/InlineFilter.css.js.map +1 -0
  73. package/cjs/inline-filter/InlineFilter.js +65 -0
  74. package/cjs/inline-filter/InlineFilter.js.map +1 -0
  75. package/cjs/inline-filter/useInlineFilter.js +45 -0
  76. package/cjs/inline-filter/useInlineFilter.js.map +1 -0
  77. package/cjs/quick-filters/QuickFilters.css.js +6 -0
  78. package/cjs/quick-filters/QuickFilters.css.js.map +1 -0
  79. package/cjs/quick-filters/QuickFilters.js +96 -0
  80. package/cjs/quick-filters/QuickFilters.js.map +1 -0
  81. package/cjs/quick-filters/useQuickFilters.js +157 -0
  82. package/cjs/quick-filters/useQuickFilters.js.map +1 -0
  83. package/esm/FilterModel.js +221 -0
  84. package/esm/FilterModel.js.map +1 -0
  85. package/esm/custom-filters/CustomFilters.js +106 -0
  86. package/esm/custom-filters/CustomFilters.js.map +1 -0
  87. package/esm/custom-filters/filterBarFocusManagement.js +33 -0
  88. package/esm/custom-filters/filterBarFocusManagement.js.map +1 -0
  89. package/esm/custom-filters/useCustomFilters.js +257 -0
  90. package/esm/custom-filters/useCustomFilters.js.map +1 -0
  91. package/esm/custom-filters/useFilterState.js +147 -0
  92. package/esm/custom-filters/useFilterState.js.map +1 -0
  93. package/esm/filter-bar/FilterBar.css.js +4 -0
  94. package/esm/filter-bar/FilterBar.css.js.map +1 -0
  95. package/esm/filter-bar/FilterBar.js +118 -0
  96. package/esm/filter-bar/FilterBar.js.map +1 -0
  97. package/esm/filter-bar/useFilterBar.js +35 -0
  98. package/esm/filter-bar/useFilterBar.js.map +1 -0
  99. package/esm/filter-clause/ColumnPicker.js +35 -0
  100. package/esm/filter-clause/ColumnPicker.js.map +1 -0
  101. package/esm/filter-clause/ExpandoCombobox.css.js +4 -0
  102. package/esm/filter-clause/ExpandoCombobox.css.js.map +1 -0
  103. package/esm/filter-clause/ExpandoCombobox.js +91 -0
  104. package/esm/filter-clause/ExpandoCombobox.js.map +1 -0
  105. package/esm/filter-clause/FilterClause.css.js +4 -0
  106. package/esm/filter-clause/FilterClause.css.js.map +1 -0
  107. package/esm/filter-clause/FilterClause.js +93 -0
  108. package/esm/filter-clause/FilterClause.js.map +1 -0
  109. package/esm/filter-clause/OperatorPicker.js +31 -0
  110. package/esm/filter-clause/OperatorPicker.js.map +1 -0
  111. package/esm/filter-clause/filterClauseFocusManagement.js +192 -0
  112. package/esm/filter-clause/filterClauseFocusManagement.js.map +1 -0
  113. package/esm/filter-clause/operator-utils.js +30 -0
  114. package/esm/filter-clause/operator-utils.js.map +1 -0
  115. package/esm/filter-clause/useExpandoCombobox.js +23 -0
  116. package/esm/filter-clause/useExpandoCombobox.js.map +1 -0
  117. package/esm/filter-clause/useFilterClause.js +149 -0
  118. package/esm/filter-clause/useFilterClause.js.map +1 -0
  119. package/esm/filter-clause/value-editors/FilterClauseValueEditor.js +75 -0
  120. package/esm/filter-clause/value-editors/FilterClauseValueEditor.js.map +1 -0
  121. package/esm/filter-clause/value-editors/FilterClauseValueEditorDate.js +62 -0
  122. package/esm/filter-clause/value-editors/FilterClauseValueEditorDate.js.map +1 -0
  123. package/esm/filter-clause/value-editors/FilterClauseValueEditorNumber.js +53 -0
  124. package/esm/filter-clause/value-editors/FilterClauseValueEditorNumber.js.map +1 -0
  125. package/esm/filter-clause/value-editors/FilterClauseValueEditorText.js +187 -0
  126. package/esm/filter-clause/value-editors/FilterClauseValueEditorText.js.map +1 -0
  127. package/esm/filter-editor/FilterClauseCombinator.css.js +4 -0
  128. package/esm/filter-editor/FilterClauseCombinator.css.js.map +1 -0
  129. package/esm/filter-editor/FilterClauseCombinator.js +40 -0
  130. package/esm/filter-editor/FilterClauseCombinator.js.map +1 -0
  131. package/esm/filter-editor/FilterEditor.css.js +4 -0
  132. package/esm/filter-editor/FilterEditor.css.js.map +1 -0
  133. package/esm/filter-editor/FilterEditor.js +98 -0
  134. package/esm/filter-editor/FilterEditor.js.map +1 -0
  135. package/esm/filter-editor/useFilterEditor.js +189 -0
  136. package/esm/filter-editor/useFilterEditor.js.map +1 -0
  137. package/esm/filter-pill/FilterPill.css.js +4 -0
  138. package/esm/filter-pill/FilterPill.css.js.map +1 -0
  139. package/esm/filter-pill/FilterPill.js +145 -0
  140. package/esm/filter-pill/FilterPill.js.map +1 -0
  141. package/esm/filter-pill/filterAsReactNode.js +25 -0
  142. package/esm/filter-pill/filterAsReactNode.js.map +1 -0
  143. package/esm/filter-pill/getFilterLabel.js +20 -0
  144. package/esm/filter-pill/getFilterLabel.js.map +1 -0
  145. package/esm/filter-pill/getFilterTooltipText.js +39 -0
  146. package/esm/filter-pill/getFilterTooltipText.js.map +1 -0
  147. package/esm/filter-pill-menu/FilterPillMenuOptions.js +27 -0
  148. package/esm/filter-pill-menu/FilterPillMenuOptions.js.map +1 -0
  149. package/esm/filter-utils.js +305 -0
  150. package/esm/filter-utils.js.map +1 -0
  151. package/esm/index.js +11 -2965
  152. package/esm/index.js.map +1 -1
  153. package/esm/inline-filter/InlineFilter.css.js +4 -0
  154. package/esm/inline-filter/InlineFilter.css.js.map +1 -0
  155. package/esm/inline-filter/InlineFilter.js +63 -0
  156. package/esm/inline-filter/InlineFilter.js.map +1 -0
  157. package/esm/inline-filter/useInlineFilter.js +43 -0
  158. package/esm/inline-filter/useInlineFilter.js.map +1 -0
  159. package/esm/quick-filters/QuickFilters.css.js +4 -0
  160. package/esm/quick-filters/QuickFilters.css.js.map +1 -0
  161. package/esm/quick-filters/QuickFilters.js +94 -0
  162. package/esm/quick-filters/QuickFilters.js.map +1 -0
  163. package/esm/quick-filters/useQuickFilters.js +155 -0
  164. package/esm/quick-filters/useQuickFilters.js.map +1 -0
  165. package/package.json +11 -11
@@ -0,0 +1,224 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
12
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
13
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
14
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
15
+ var _filterClause, _isValid, _children, _isValid2, _op;
16
+ const hasValues = ({ values }) => Array.isArray(values) && values.length > 0;
17
+ const isValidFilterClause = (filterClause) => {
18
+ if (filterClause.op === void 0 || filterClause.column === void 0) {
19
+ return false;
20
+ } else if (vuuUtils.isMultiValueFilter(filterClause)) {
21
+ return hasValues(filterClause);
22
+ } else if (vuuUtils.isSingleValueFilter(filterClause)) {
23
+ return filterClause.value !== void 0 && filterClause.value !== "";
24
+ }
25
+ throw Error("isValidFilterClause should never reach this far");
26
+ };
27
+ const isValidFilter = (filter) => {
28
+ if (filter === void 0) {
29
+ return false;
30
+ } else if (vuuUtils.isMultiClauseFilter(filter)) {
31
+ return filter.filters.every(isValidFilter);
32
+ } else {
33
+ return isValidFilterClause(filter);
34
+ }
35
+ };
36
+ const isValidFilterModel = (filterModel) => {
37
+ if (filterModel.isMultiClauseFilter) {
38
+ return filterModel.filterClauses.every((f) => f.isValid);
39
+ } else {
40
+ return filterModel.filterClauses.length === 1 && filterModel.filterClauses[0].isValid;
41
+ }
42
+ };
43
+ class FilterClauseModel extends vuuUtils.EventEmitter {
44
+ constructor(filterClause) {
45
+ super();
46
+ __privateAdd(this, _filterClause);
47
+ __privateAdd(this, _isValid);
48
+ __privateSet(this, _filterClause, filterClause);
49
+ __privateSet(this, _isValid, isValidFilterClause(filterClause));
50
+ }
51
+ get isValid() {
52
+ return __privateGet(this, _isValid);
53
+ }
54
+ setIsValid(isValid) {
55
+ __privateSet(this, _isValid, isValid);
56
+ this.emit("isValid", isValid);
57
+ }
58
+ get column() {
59
+ return __privateGet(this, _filterClause).column;
60
+ }
61
+ set column(column) {
62
+ __privateSet(this, _filterClause, {
63
+ column
64
+ });
65
+ const isValid = isValidFilterClause(__privateGet(this, _filterClause));
66
+ this.emit("filterClause", __privateGet(this, _filterClause), isValid);
67
+ if (isValid !== __privateGet(this, _isValid)) {
68
+ this.setIsValid(isValid);
69
+ }
70
+ }
71
+ get op() {
72
+ return __privateGet(this, _filterClause).op;
73
+ }
74
+ setOp(op) {
75
+ __privateSet(this, _filterClause, {
76
+ ...__privateGet(this, _filterClause),
77
+ op
78
+ });
79
+ const isValid = isValidFilterClause(__privateGet(this, _filterClause));
80
+ this.emit("filterClause", __privateGet(this, _filterClause), isValid);
81
+ if (isValid !== __privateGet(this, _isValid)) {
82
+ this.setIsValid(isValid);
83
+ }
84
+ }
85
+ setValue(value, isFinal = true) {
86
+ if (vuuUtils.isSingleValueFilter(__privateGet(this, _filterClause))) {
87
+ __privateSet(this, _filterClause, {
88
+ ...__privateGet(this, _filterClause),
89
+ value
90
+ });
91
+ } else if (Array.isArray(value)) {
92
+ __privateSet(this, _filterClause, {
93
+ ...__privateGet(this, _filterClause),
94
+ values: value
95
+ });
96
+ }
97
+ const isValid = isValidFilterClause(__privateGet(this, _filterClause));
98
+ if (isValid !== __privateGet(this, _isValid)) {
99
+ this.setIsValid(isValid);
100
+ }
101
+ if (isFinal) {
102
+ this.emit("filterClause", __privateGet(this, _filterClause), isValid);
103
+ }
104
+ }
105
+ asFilter(throwIfInvalid = true) {
106
+ if (throwIfInvalid && !__privateGet(this, _isValid)) {
107
+ throw Error("Invalid filter model cannot be returned as Filter");
108
+ }
109
+ return __privateGet(this, _filterClause);
110
+ }
111
+ }
112
+ _filterClause = new WeakMap();
113
+ _isValid = new WeakMap();
114
+ class FilterModel extends vuuUtils.EventEmitter {
115
+ constructor(filter) {
116
+ super();
117
+ __privateAdd(this, _children, []);
118
+ __privateAdd(this, _isValid2);
119
+ __privateAdd(this, _op);
120
+ __publicField(this, "onFilterClauseChange", () => {
121
+ this.emit("filter", this.asFilter(false), __privateGet(this, _isValid2));
122
+ });
123
+ __publicField(this, "onFilterClauseStatusChange", (isValid) => {
124
+ if (!isValid && __privateGet(this, _isValid2)) {
125
+ this.setIsValid(false);
126
+ } else {
127
+ this.checkValidStatus();
128
+ }
129
+ });
130
+ if (vuuUtils.isMultiClauseFilter(filter)) {
131
+ __privateSet(this, _op, filter.op);
132
+ filter.filters.forEach((f) => this.addFilterClause(f));
133
+ } else if (filter) {
134
+ this.addFilterClause(filter);
135
+ } else {
136
+ this.addNewFilterClause();
137
+ }
138
+ __privateSet(this, _isValid2, isValidFilter(filter));
139
+ }
140
+ get isValid() {
141
+ return __privateGet(this, _isValid2);
142
+ }
143
+ setIsValid(isValid) {
144
+ __privateSet(this, _isValid2, isValid);
145
+ this.emit("isValid", isValid);
146
+ }
147
+ addNewFilterClause(operator) {
148
+ const count = __privateGet(this, _children).length;
149
+ if (!operator && !__privateGet(this, _op) && count === 1) {
150
+ __privateSet(this, _op, "and");
151
+ } else if (operator && !__privateGet(this, _op) && count === 1) {
152
+ __privateSet(this, _op, operator);
153
+ } else if (operator && __privateGet(this, _op) && operator !== __privateGet(this, _op)) {
154
+ throw Error(
155
+ "FilterModel: use setOp to change the Filter combinator operator"
156
+ );
157
+ }
158
+ const filterClauseModel = new FilterClauseModel({});
159
+ filterClauseModel.on("isValid", this.onFilterClauseStatusChange);
160
+ filterClauseModel.on("filterClause", this.onFilterClauseChange);
161
+ __privateGet(this, _children).push(filterClauseModel);
162
+ this.setIsValid(false);
163
+ }
164
+ addFilterClause(filterClause = {}) {
165
+ const filterClauseModel = new FilterClauseModel(filterClause);
166
+ filterClauseModel.on("isValid", this.onFilterClauseStatusChange);
167
+ filterClauseModel.on("filterClause", this.onFilterClauseChange);
168
+ __privateGet(this, _children).push(filterClauseModel);
169
+ }
170
+ removeFilterClause(filterClause) {
171
+ if (this.isMultiClauseFilter) {
172
+ const doomedFilter = this.filterClauses.indexOf(filterClause);
173
+ if (doomedFilter !== -1) {
174
+ this.filterClauses.splice(doomedFilter, 1);
175
+ if (this.filterClauses.length === 1) {
176
+ __privateSet(this, _op, void 0);
177
+ }
178
+ this.checkValidStatus();
179
+ }
180
+ }
181
+ }
182
+ checkValidStatus() {
183
+ const nowValid = isValidFilterModel(this);
184
+ if (nowValid !== __privateGet(this, _isValid2)) {
185
+ this.setIsValid(nowValid);
186
+ }
187
+ }
188
+ getFilterClause(index) {
189
+ return __privateGet(this, _children)[index];
190
+ }
191
+ get op() {
192
+ return __privateGet(this, _op);
193
+ }
194
+ setOp(op) {
195
+ __privateSet(this, _op, op);
196
+ this.emit("filter", this.asFilter(false), __privateGet(this, _isValid2));
197
+ }
198
+ get filterClauses() {
199
+ return __privateGet(this, _children);
200
+ }
201
+ get isMultiClauseFilter() {
202
+ return __privateGet(this, _op) === "and" || __privateGet(this, _op) === "or";
203
+ }
204
+ asFilter(throwIfInvalid = true) {
205
+ if (throwIfInvalid && !__privateGet(this, _isValid2)) {
206
+ throw Error("Invalid filter model cannot be returned as Filter");
207
+ }
208
+ if (__privateGet(this, _op) === "and" || __privateGet(this, _op) === "or") {
209
+ return {
210
+ op: __privateGet(this, _op),
211
+ filters: __privateGet(this, _children).map((f) => f.asFilter(throwIfInvalid))
212
+ };
213
+ } else {
214
+ return __privateGet(this, _children)[0].asFilter(throwIfInvalid);
215
+ }
216
+ }
217
+ }
218
+ _children = new WeakMap();
219
+ _isValid2 = new WeakMap();
220
+ _op = new WeakMap();
221
+
222
+ exports.FilterClauseModel = FilterClauseModel;
223
+ exports.FilterModel = FilterModel;
224
+ //# sourceMappingURL=FilterModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterModel.js","sources":["../src/FilterModel.ts"],"sourcesContent":["import {\n Filter,\n FilterClause,\n FilterClauseOp,\n FilterCombinatorOp,\n MultiClauseFilter,\n MultiValueFilterClause,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n EventEmitter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isSingleValueFilter,\n} from \"@vuu-ui/vuu-utils\";\n\nexport type FilterStatusChangeHandler = (isValid: boolean) => void;\nexport type FilterChangeHandler = (\n filter: Partial<Filter>,\n isValid: boolean,\n) => void;\nexport type FilterClauseChangeHandler = (\n filter: Partial<FilterClause>,\n isValid: boolean,\n) => void;\n\nconst hasValues = ({ values }: MultiValueFilterClause) =>\n Array.isArray(values) && values.length > 0;\n\nconst isValidFilterClause = (\n filterClause: Partial<FilterClause>,\n): filterClause is FilterClause => {\n if (filterClause.op === undefined || filterClause.column === undefined) {\n return false;\n } else if (isMultiValueFilter(filterClause)) {\n return hasValues(filterClause);\n } else if (isSingleValueFilter(filterClause)) {\n return filterClause.value !== undefined && filterClause.value !== \"\";\n }\n throw Error(\"isValidFilterClause should never reach this far\");\n};\n\nconst isValidFilter = (filter?: Filter): boolean => {\n if (filter === undefined) {\n return false;\n } else if (isMultiClauseFilter(filter)) {\n return filter.filters.every(isValidFilter);\n } else {\n return isValidFilterClause(filter);\n }\n};\n\nconst isValidFilterModel = (filterModel: FilterModel) => {\n if (filterModel.isMultiClauseFilter) {\n return filterModel.filterClauses.every((f) => f.isValid);\n } else {\n return (\n filterModel.filterClauses.length === 1 &&\n filterModel.filterClauses[0].isValid\n );\n }\n};\n\nexport type FilterClauseModelEvents = {\n filterClause: FilterClauseChangeHandler;\n isValid: FilterStatusChangeHandler;\n};\n\nexport type FilterModelEvents = {\n // TODO do we need an incomplate filter type\n filter: FilterChangeHandler;\n isValid: FilterStatusChangeHandler;\n};\n\nexport class FilterClauseModel extends EventEmitter<FilterClauseModelEvents> {\n #filterClause: Partial<FilterClause>;\n #isValid: boolean;\n constructor(filterClause: Partial<FilterClause>) {\n super();\n this.#filterClause = filterClause;\n this.#isValid = isValidFilterClause(filterClause);\n }\n get isValid() {\n return this.#isValid;\n }\n\n private setIsValid(isValid: boolean) {\n this.#isValid = isValid;\n this.emit(\"isValid\", isValid);\n }\n\n get column() {\n return this.#filterClause.column;\n }\n\n set column(column: undefined | string) {\n // TODO set op, value to empty\n this.#filterClause = {\n column,\n };\n\n const isValid = isValidFilterClause(this.#filterClause);\n this.emit(\"filterClause\", this.#filterClause, isValid);\n if (isValid !== this.#isValid) {\n this.setIsValid(isValid);\n }\n }\n\n get op() {\n return this.#filterClause.op;\n }\n\n setOp(op: undefined | FilterClauseOp) {\n this.#filterClause = {\n ...this.#filterClause,\n op,\n };\n const isValid = isValidFilterClause(this.#filterClause);\n this.emit(\"filterClause\", this.#filterClause, isValid);\n if (isValid !== this.#isValid) {\n this.setIsValid(isValid);\n }\n }\n\n setValue(\n value:\n | undefined\n | string\n | string[]\n | number\n | number[]\n | boolean\n | boolean[],\n isFinal = true,\n ) {\n if (isSingleValueFilter(this.#filterClause)) {\n this.#filterClause = {\n ...this.#filterClause,\n value,\n } as SingleValueFilterClause;\n } else if (Array.isArray(value)) {\n this.#filterClause = {\n ...this.#filterClause,\n values: value,\n } as MultiValueFilterClause;\n }\n\n const isValid = isValidFilterClause(this.#filterClause);\n if (isValid !== this.#isValid) {\n this.setIsValid(isValid);\n }\n if (isFinal) {\n this.emit(\"filterClause\", this.#filterClause, isValid);\n }\n }\n\n asFilter(throwIfInvalid = true): FilterClause {\n if (throwIfInvalid && !this.#isValid) {\n throw Error(\"Invalid filter model cannot be returned as Filter\");\n }\n return this.#filterClause as FilterClause;\n }\n}\n\nexport class FilterModel extends EventEmitter<FilterModelEvents> {\n #children: FilterClauseModel[] = [];\n #isValid: boolean;\n #op?: FilterCombinatorOp;\n\n constructor(filter?: Filter) {\n super();\n if (isMultiClauseFilter(filter)) {\n this.#op = filter.op;\n filter.filters.forEach((f) => this.addFilterClause(f as FilterClause));\n } else if (filter) {\n this.addFilterClause(filter);\n } else {\n this.addNewFilterClause();\n }\n\n this.#isValid = isValidFilter(filter);\n }\n get isValid() {\n return this.#isValid;\n }\n\n private setIsValid(isValid: boolean) {\n this.#isValid = isValid;\n this.emit(\"isValid\", isValid);\n }\n\n addNewFilterClause(operator?: FilterCombinatorOp) {\n const count = this.#children.length;\n if (!operator && !this.#op && count === 1) {\n this.#op = \"and\";\n } else if (operator && !this.#op && count === 1) {\n this.#op = operator;\n } else if (operator && this.#op && operator !== this.#op) {\n throw Error(\n \"FilterModel: use setOp to change the Filter combinator operator\",\n );\n }\n\n const filterClauseModel = new FilterClauseModel({});\n filterClauseModel.on(\"isValid\", this.onFilterClauseStatusChange);\n filterClauseModel.on(\"filterClause\", this.onFilterClauseChange);\n this.#children.push(filterClauseModel);\n this.setIsValid(false);\n }\n\n addFilterClause(filterClause: Partial<FilterClause> = {}) {\n const filterClauseModel = new FilterClauseModel(filterClause);\n filterClauseModel.on(\"isValid\", this.onFilterClauseStatusChange);\n filterClauseModel.on(\"filterClause\", this.onFilterClauseChange);\n this.#children.push(filterClauseModel);\n }\n\n removeFilterClause(filterClause: FilterClauseModel) {\n // We never allow the last clause to be removed\n if (this.isMultiClauseFilter) {\n const doomedFilter = this.filterClauses.indexOf(filterClause);\n if (doomedFilter !== -1) {\n this.filterClauses.splice(doomedFilter, 1);\n // If we're down the the last clause, we are no longer multi-clause\n if (this.filterClauses.length === 1) {\n this.#op = undefined;\n }\n this.checkValidStatus();\n }\n }\n }\n\n checkValidStatus() {\n const nowValid = isValidFilterModel(this);\n\n if (nowValid !== this.#isValid) {\n this.setIsValid(nowValid);\n }\n }\n\n onFilterClauseChange: FilterChangeHandler = () => {\n this.emit(\"filter\", this.asFilter(false), this.#isValid);\n };\n\n onFilterClauseStatusChange = (isValid: boolean) => {\n if (!isValid && this.#isValid) {\n this.setIsValid(false);\n } else {\n this.checkValidStatus();\n }\n };\n\n getFilterClause(index: number) {\n return this.#children[index];\n }\n\n get op() {\n return this.#op;\n }\n\n setOp(op: FilterCombinatorOp) {\n this.#op = op;\n this.emit(\"filter\", this.asFilter(false), this.#isValid);\n }\n\n get filterClauses() {\n return this.#children;\n }\n\n get isMultiClauseFilter() {\n return this.#op === \"and\" || this.#op === \"or\";\n }\n\n asFilter(throwIfInvalid = true): Filter {\n if (throwIfInvalid && !this.#isValid) {\n throw Error(\"Invalid filter model cannot be returned as Filter\");\n }\n if (this.#op === \"and\" || this.#op === \"or\") {\n return {\n op: this.#op,\n filters: this.#children.map((f) => f.asFilter(throwIfInvalid)),\n } as MultiClauseFilter;\n } else {\n return this.#children[0].asFilter(throwIfInvalid);\n }\n }\n}\n"],"names":["_isValid","isMultiValueFilter","isSingleValueFilter","isMultiClauseFilter","EventEmitter"],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var vuuPopups = require('@vuu-ui/vuu-popups');
6
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
7
+ var FilterEditor = require('../filter-editor/FilterEditor.js');
8
+ var FilterPill = require('../filter-pill/FilterPill.js');
9
+ var FilterModel = require('../FilterModel.js');
10
+ var useCustomFilters = require('./useCustomFilters.js');
11
+
12
+ const classBase = "vuuCustomFilters";
13
+ const CustomFilters = ({
14
+ columnDescriptors,
15
+ defaultFilterState,
16
+ filterState,
17
+ onApplyFilter,
18
+ onFilterDeleted,
19
+ onFilterRenamed,
20
+ onFilterStateChanged,
21
+ vuuTable
22
+ }) => {
23
+ const rootRef = react.useRef(null);
24
+ const {
25
+ activeFilterIndex,
26
+ addButtonProps,
27
+ columnsByName,
28
+ filters,
29
+ interactedFilterState,
30
+ onCancelEdit,
31
+ onSave,
32
+ FilterPillProps,
33
+ promptProps
34
+ } = useCustomFilters.useCustomFilters({
35
+ containerRef: rootRef,
36
+ columnDescriptors,
37
+ defaultFilterState,
38
+ filterState,
39
+ onApplyFilter,
40
+ onFilterStateChanged,
41
+ onFilterDeleted,
42
+ onFilterRenamed
43
+ });
44
+ const indexOfFilterBeingRenamed = interactedFilterState?.state === "rename" ? interactedFilterState.index : -1;
45
+ const filterModel = useCustomFilters.isEditFilterState(interactedFilterState?.state) ? new FilterModel.FilterModel(interactedFilterState.filter) : void 0;
46
+ const getFilterPills = () => {
47
+ const items = [];
48
+ filters.forEach((filter, i) => {
49
+ items.push(
50
+ /* @__PURE__ */ react.createElement(
51
+ FilterPill.FilterPill,
52
+ {
53
+ ...FilterPillProps,
54
+ editing: indexOfFilterBeingRenamed === i,
55
+ columnsByName,
56
+ "data-index": i,
57
+ filter,
58
+ key: `filter-${i}`,
59
+ selected: activeFilterIndex.includes(i)
60
+ }
61
+ )
62
+ );
63
+ });
64
+ return items;
65
+ };
66
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
67
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "vuuCustomFilters", ref: rootRef, children: [
68
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-filters`, children: getFilterPills() }),
69
+ /* @__PURE__ */ react.createElement(
70
+ vuuUiControls.IconButton,
71
+ {
72
+ ...addButtonProps,
73
+ "aria-label": "Add filter",
74
+ "data-selectable": false,
75
+ icon: "plus",
76
+ key: "filter-add",
77
+ tabIndex: 0,
78
+ variant: "secondary"
79
+ }
80
+ ),
81
+ promptProps ? /* @__PURE__ */ jsxRuntime.jsx(
82
+ vuuPopups.Prompt,
83
+ {
84
+ ...promptProps,
85
+ PopupProps: {
86
+ anchorElement: rootRef,
87
+ offsetTop: 16,
88
+ placement: "below-center"
89
+ }
90
+ }
91
+ ) : null
92
+ ] }),
93
+ filterModel && vuuTable && /* @__PURE__ */ jsxRuntime.jsx(
94
+ FilterEditor.FilterEditor,
95
+ {
96
+ columnDescriptors,
97
+ onCancel: onCancelEdit,
98
+ onSave,
99
+ filter: interactedFilterState?.filter,
100
+ vuuTable
101
+ },
102
+ "filter-editor"
103
+ )
104
+ ] });
105
+ };
106
+
107
+ exports.CustomFilters = CustomFilters;
108
+ //# sourceMappingURL=CustomFilters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFilters.js","sources":["../../src/custom-filters/CustomFilters.tsx"],"sourcesContent":["import { Prompt } from \"@vuu-ui/vuu-popups\";\nimport type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { IconButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { HTMLAttributes, ReactElement, useRef } from \"react\";\nimport { type FilterBarProps } from \"../filter-bar\";\nimport { FilterEditor } from \"../filter-editor\";\nimport { FilterPill } from \"../filter-pill\";\nimport { FilterModel } from \"../FilterModel\";\nimport { isEditFilterState, useCustomFilters } from \"./useCustomFilters\";\n\nconst classBase = \"vuuCustomFilters\";\n\nexport interface CustomFilterProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterBarProps,\n | \"defaultFilterState\"\n | \"filterState\"\n | \"onApplyFilter\"\n | \"onFilterDeleted\"\n | \"onFilterRenamed\"\n | \"onFilterStateChanged\"\n | \"vuuTable\"\n > {\n columnDescriptors: ColumnDescriptor[];\n}\n\nexport const CustomFilters = ({\n columnDescriptors,\n defaultFilterState,\n filterState,\n onApplyFilter,\n onFilterDeleted,\n onFilterRenamed,\n onFilterStateChanged,\n vuuTable,\n}: CustomFilterProps) => {\n const rootRef = useRef<HTMLDivElement>(null);\n\n const {\n activeFilterIndex,\n addButtonProps,\n columnsByName,\n filters,\n interactedFilterState,\n onCancelEdit,\n onSave,\n FilterPillProps,\n promptProps,\n } = useCustomFilters({\n containerRef: rootRef,\n columnDescriptors,\n defaultFilterState,\n filterState,\n onApplyFilter,\n onFilterStateChanged,\n onFilterDeleted,\n onFilterRenamed,\n });\n\n const indexOfFilterBeingRenamed =\n interactedFilterState?.state === \"rename\"\n ? interactedFilterState.index\n : -1;\n\n const filterModel = isEditFilterState(interactedFilterState?.state)\n ? new FilterModel(interactedFilterState.filter)\n : undefined;\n\n const getFilterPills = () => {\n const items: ReactElement[] = [];\n filters.forEach((filter, i) => {\n items.push(\n <FilterPill\n {...FilterPillProps}\n editing={indexOfFilterBeingRenamed === i}\n columnsByName={columnsByName}\n data-index={i}\n filter={filter}\n key={`filter-${i}`}\n selected={activeFilterIndex.includes(i)}\n />,\n );\n });\n return items;\n };\n\n return (\n <>\n <div className=\"vuuCustomFilters\" ref={rootRef}>\n <div className={`${classBase}-filters`}>{getFilterPills()}</div>\n <IconButton\n {...addButtonProps}\n aria-label=\"Add filter\"\n data-selectable={false}\n icon=\"plus\"\n key=\"filter-add\"\n tabIndex={0}\n variant=\"secondary\"\n />\n\n {promptProps ? (\n <Prompt\n {...promptProps}\n PopupProps={{\n anchorElement: rootRef,\n offsetTop: 16,\n placement: \"below-center\",\n }}\n />\n ) : null}\n </div>\n {filterModel && vuuTable && (\n <FilterEditor\n columnDescriptors={columnDescriptors}\n key=\"filter-editor\"\n onCancel={onCancelEdit}\n onSave={onSave}\n filter={interactedFilterState?.filter}\n vuuTable={vuuTable}\n />\n )}\n </>\n );\n};\n"],"names":["useRef","useCustomFilters","isEditFilterState","FilterModel","createElement","FilterPill","jsxs","Fragment","jsx","IconButton","Prompt","FilterEditor"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+
5
+ const QUERY_ADD_BUTTON = '.saltButton:has([aria-label="Add filter"])';
6
+ const navigateToNextItem = (el, direction = "fwd") => {
7
+ const pill = vuuUtils.queryClosest(el, ".vuuFilterPill");
8
+ if (pill) {
9
+ const index = vuuUtils.getElementDataIndex(pill);
10
+ if (typeof index === "number") {
11
+ const target = direction === "fwd" ? vuuUtils.getElementByDataIndex(pill.parentElement, index + 1) : vuuUtils.getElementByDataIndex(pill.parentElement, index - 1);
12
+ if (target) {
13
+ target.focus();
14
+ } else if (direction === "fwd") {
15
+ const filterBar = vuuUtils.queryClosest(el, ".vuuFilterBar");
16
+ const addButton = filterBar?.querySelector(
17
+ QUERY_ADD_BUTTON
18
+ );
19
+ addButton?.focus();
20
+ }
21
+ }
22
+ } else {
23
+ const button = vuuUtils.queryClosest(el, QUERY_ADD_BUTTON);
24
+ if (button) {
25
+ const filterBar = vuuUtils.queryClosest(el, ".vuuFilterBar");
26
+ const target = filterBar?.querySelector(
27
+ ".vuuFilterPill:last-child"
28
+ );
29
+ target?.focus();
30
+ }
31
+ }
32
+ };
33
+
34
+ exports.navigateToNextItem = navigateToNextItem;
35
+ //# sourceMappingURL=filterBarFocusManagement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterBarFocusManagement.js","sources":["../../src/custom-filters/filterBarFocusManagement.ts"],"sourcesContent":["import {\n getElementByDataIndex,\n getElementDataIndex,\n queryClosest,\n} from \"@vuu-ui/vuu-utils\";\n\nconst QUERY_ADD_BUTTON = '.saltButton:has([aria-label=\"Add filter\"])';\n\nexport const navigateToNextItem = (\n el: HTMLElement | EventTarget,\n direction: \"bwd\" | \"fwd\" = \"fwd\",\n) => {\n const pill = queryClosest(el, \".vuuFilterPill\");\n if (pill) {\n const index = getElementDataIndex(pill);\n if (typeof index === \"number\") {\n const target =\n direction === \"fwd\"\n ? getElementByDataIndex(pill.parentElement, index + 1)\n : getElementByDataIndex(pill.parentElement, index - 1);\n if (target) {\n target.focus();\n } else if (direction === \"fwd\") {\n const filterBar = queryClosest(el, \".vuuFilterBar\");\n const addButton = filterBar?.querySelector(\n QUERY_ADD_BUTTON,\n ) as HTMLElement;\n addButton?.focus();\n }\n }\n } else {\n const button = queryClosest(el, QUERY_ADD_BUTTON);\n if (button) {\n const filterBar = queryClosest(el, \".vuuFilterBar\");\n const target = filterBar?.querySelector(\n \".vuuFilterPill:last-child\",\n ) as HTMLElement;\n target?.focus();\n }\n }\n};\n"],"names":["queryClosest","getElementDataIndex","getElementByDataIndex"],"mappings":";;;;AAMA,MAAM,gBAAmB,GAAA,4CAAA;AAElB,MAAM,kBAAqB,GAAA,CAChC,EACA,EAAA,SAAA,GAA2B,KACxB,KAAA;AACH,EAAM,MAAA,IAAA,GAAOA,qBAAa,CAAA,EAAA,EAAI,gBAAgB,CAAA;AAC9C,EAAA,IAAI,IAAM,EAAA;AACR,IAAM,MAAA,KAAA,GAAQC,6BAAoB,IAAI,CAAA;AACtC,IAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,MAAA,MAAM,MACJ,GAAA,SAAA,KAAc,KACV,GAAAC,8BAAA,CAAsB,IAAK,CAAA,aAAA,EAAe,KAAQ,GAAA,CAAC,CACnD,GAAAA,8BAAA,CAAsB,IAAK,CAAA,aAAA,EAAe,QAAQ,CAAC,CAAA;AACzD,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,MAAA,CAAO,KAAM,EAAA;AAAA,OACf,MAAA,IAAW,cAAc,KAAO,EAAA;AAC9B,QAAM,MAAA,SAAA,GAAYF,qBAAa,CAAA,EAAA,EAAI,eAAe,CAAA;AAClD,QAAA,MAAM,YAAY,SAAW,EAAA,aAAA;AAAA,UAC3B;AAAA,SACF;AACA,QAAA,SAAA,EAAW,KAAM,EAAA;AAAA;AACnB;AACF,GACK,MAAA;AACL,IAAM,MAAA,MAAA,GAASA,qBAAa,CAAA,EAAA,EAAI,gBAAgB,CAAA;AAChD,IAAA,IAAI,MAAQ,EAAA;AACV,MAAM,MAAA,SAAA,GAAYA,qBAAa,CAAA,EAAA,EAAI,eAAe,CAAA;AAClD,MAAA,MAAM,SAAS,SAAW,EAAA,aAAA;AAAA,QACxB;AAAA,OACF;AACA,MAAA,MAAA,EAAQ,KAAM,EAAA;AAAA;AAChB;AAEJ;;;;"}
@@ -0,0 +1,260 @@
1
+ 'use strict';
2
+
3
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var react = require('react');
6
+ var filterBarFocusManagement = require('./filterBarFocusManagement.js');
7
+ var useFilterState = require('./useFilterState.js');
8
+
9
+ const isEditFilterState = (filterState) => filterState === "edit" || filterState === "create";
10
+ const useCustomFilters = ({
11
+ columnDescriptors,
12
+ containerRef,
13
+ defaultFilterState,
14
+ filterState,
15
+ onApplyFilter,
16
+ onFilterDeleted,
17
+ onFilterRenamed,
18
+ onFilterStateChanged
19
+ }) => {
20
+ const addButtonRef = react.useRef(null);
21
+ const [interactedFilterState, setInteractedFilterState] = react.useState();
22
+ const [promptProps, setPromptProps] = react.useState(null);
23
+ const editPillLabelAPI = react.useRef(vuuUiControls.NullEditAPI);
24
+ const columnsByName = react.useMemo(
25
+ () => columnDescriptorsByName(columnDescriptors),
26
+ [columnDescriptors]
27
+ );
28
+ const {
29
+ activeFilterIndex,
30
+ filters,
31
+ onAddFilter,
32
+ onChangeFilter,
33
+ onDeleteFilter,
34
+ onRenameFilter,
35
+ onToggleFilterActive
36
+ } = useFilterState.useFilterState({
37
+ defaultFilterState,
38
+ filterState,
39
+ onFilterDeleted,
40
+ onFilterRenamed,
41
+ onFilterStateChanged
42
+ });
43
+ react.useEffect(() => {
44
+ const activeFilters = activeFilterIndex.map((i) => filters[i]);
45
+ const applyFilter = (filter) => {
46
+ const query = filter ? vuuUtils.filterAsQuery(filter, { columnsByName }) : "";
47
+ onApplyFilter({ filter: query, filterStruct: filter });
48
+ };
49
+ if (activeFilters.length === 0) {
50
+ applyFilter();
51
+ } else if (activeFilters.length === 1) {
52
+ const [filter] = activeFilters;
53
+ applyFilter(filter);
54
+ } else {
55
+ applyFilter({ op: "and", filters: activeFilters });
56
+ }
57
+ }, [activeFilterIndex, columnsByName, filters, onApplyFilter]);
58
+ const editPillLabel = react.useCallback((index, filter) => {
59
+ setTimeout(() => {
60
+ setInteractedFilterState({
61
+ filter,
62
+ index,
63
+ state: "rename"
64
+ });
65
+ }, 100);
66
+ }, []);
67
+ const focusFilterPill = react.useCallback(
68
+ (index = 0) => {
69
+ requestAnimationFrame(() => {
70
+ const target = containerRef.current?.querySelector(
71
+ `.vuuFilterPill[data-index="${index}"] button`
72
+ );
73
+ if (target) {
74
+ target.focus();
75
+ }
76
+ });
77
+ },
78
+ [containerRef]
79
+ );
80
+ const deleteConfirmed = react.useCallback(
81
+ (filter) => {
82
+ onDeleteFilter(filter);
83
+ requestAnimationFrame(() => {
84
+ if (filters.length) {
85
+ focusFilterPill(0);
86
+ }
87
+ });
88
+ },
89
+ [filters.length, focusFilterPill, onDeleteFilter]
90
+ );
91
+ const getDeletePrompt = react.useMemo(
92
+ () => (filter) => {
93
+ const close = () => {
94
+ setPromptProps(null);
95
+ focusFilterPill();
96
+ };
97
+ return {
98
+ confirmButtonLabel: "Remove",
99
+ icon: "warn-triangle",
100
+ onCancel: close,
101
+ onClose: close,
102
+ onConfirm: () => {
103
+ setPromptProps(null);
104
+ deleteConfirmed(filter);
105
+ },
106
+ text: `Are you sure you want to delete ${filter.name}`,
107
+ title: "Remove Filter",
108
+ variant: "warn"
109
+ };
110
+ },
111
+ [deleteConfirmed, focusFilterPill]
112
+ );
113
+ const deleteFilter = react.useCallback(
114
+ (filter, withPrompt) => {
115
+ if (withPrompt) {
116
+ setPromptProps(getDeletePrompt(filter));
117
+ } else {
118
+ deleteConfirmed(filter);
119
+ }
120
+ },
121
+ [deleteConfirmed, getDeletePrompt]
122
+ );
123
+ const handleExitEditFilterName = react.useCallback(
124
+ (_, editedValue = "") => {
125
+ if (interactedFilterState?.state === "rename" && interactedFilterState.filter) {
126
+ const { filter } = interactedFilterState;
127
+ const indexOfEditedFilter = onRenameFilter(filter, editedValue);
128
+ setInteractedFilterState(void 0);
129
+ focusFilterPill(indexOfEditedFilter);
130
+ }
131
+ setInteractedFilterState(void 0);
132
+ },
133
+ [focusFilterPill, interactedFilterState, onRenameFilter]
134
+ );
135
+ const handlePillMenuAction = react.useCallback(
136
+ (menuId, options) => {
137
+ switch (menuId) {
138
+ case "delete-filter": {
139
+ const { filter } = options;
140
+ deleteFilter(filter, true);
141
+ return true;
142
+ }
143
+ case "rename-filter": {
144
+ const { filter } = options;
145
+ const index = filters.indexOf(filter);
146
+ editPillLabel(index, filter);
147
+ return true;
148
+ }
149
+ case "edit-filter": {
150
+ const { filter } = options;
151
+ setInteractedFilterState({
152
+ filter,
153
+ index: filters.indexOf(filter),
154
+ state: "edit"
155
+ });
156
+ return true;
157
+ }
158
+ default:
159
+ return false;
160
+ }
161
+ },
162
+ [deleteFilter, editPillLabel, filters]
163
+ );
164
+ const handlePillKeyDown = react.useCallback((e) => {
165
+ if (e.key === "ArrowRight" || e.key === "ArrowLeft") {
166
+ filterBarFocusManagement.navigateToNextItem(e.target, e.key === "ArrowLeft" ? "bwd" : "fwd");
167
+ }
168
+ }, []);
169
+ const addIfNewElseUpdate = react.useCallback(
170
+ (newOrUpdatedFilter, existing) => {
171
+ if (existing === void 0) {
172
+ const idx = onAddFilter(newOrUpdatedFilter);
173
+ focusFilterPill(idx);
174
+ editPillLabel(idx, newOrUpdatedFilter);
175
+ } else {
176
+ const idx = onChangeFilter(existing, newOrUpdatedFilter);
177
+ focusFilterPill(idx);
178
+ }
179
+ },
180
+ [editPillLabel, focusFilterPill, onAddFilter, onChangeFilter]
181
+ );
182
+ const filterSaveHandler = react.useCallback(
183
+ (filter) => {
184
+ if (interactedFilterState) {
185
+ const { filter: existingFilter } = interactedFilterState;
186
+ setInteractedFilterState(void 0);
187
+ addIfNewElseUpdate(filter, existingFilter);
188
+ }
189
+ },
190
+ [addIfNewElseUpdate, interactedFilterState]
191
+ );
192
+ const handlePillClick = react.useCallback(
193
+ (e) => {
194
+ const isEditing = e.target.querySelector(
195
+ ".vuuEditableLabel-editing"
196
+ );
197
+ if (!isEditing) {
198
+ const pill = vuuUtils.queryClosest(e.target, ".vuuFilterPill");
199
+ if (pill) {
200
+ const index = vuuUtils.getElementDataIndex(pill);
201
+ onToggleFilterActive(index, e.shiftKey);
202
+ }
203
+ }
204
+ },
205
+ [onToggleFilterActive]
206
+ );
207
+ const FilterPillProps2 = {
208
+ editLabelApiRef: editPillLabelAPI,
209
+ // onBeginEdit: handleBeginEditFilterName,
210
+ onClick: handlePillClick,
211
+ onKeyDown: handlePillKeyDown,
212
+ onMenuAction: handlePillMenuAction,
213
+ onExitEditMode: handleExitEditFilterName
214
+ };
215
+ const handleClickAddButton = react.useCallback(() => {
216
+ setInteractedFilterState({
217
+ index: -1,
218
+ state: "create"
219
+ });
220
+ }, []);
221
+ const handleKeyDownAddButton = react.useCallback((evt) => {
222
+ if (evt.key === "ArrowLeft") {
223
+ filterBarFocusManagement.navigateToNextItem(evt.target, "bwd");
224
+ }
225
+ }, []);
226
+ const handleCancelEdit = react.useCallback(() => {
227
+ if (interactedFilterState) {
228
+ const { index } = interactedFilterState;
229
+ if (index === -1) {
230
+ addButtonRef.current?.focus();
231
+ } else {
232
+ focusFilterPill(index);
233
+ }
234
+ setInteractedFilterState(void 0);
235
+ }
236
+ }, [focusFilterPill, interactedFilterState]);
237
+ const addButtonProps = {
238
+ ref: addButtonRef,
239
+ onClick: handleClickAddButton,
240
+ onKeyDown: handleKeyDownAddButton
241
+ };
242
+ return {
243
+ FilterPillProps: FilterPillProps2,
244
+ activeFilterIndex,
245
+ addButtonProps,
246
+ columnsByName,
247
+ filters,
248
+ interactedFilterState,
249
+ onCancelEdit: handleCancelEdit,
250
+ onSave: filterSaveHandler,
251
+ promptProps
252
+ };
253
+ };
254
+ function columnDescriptorsByName(columns) {
255
+ return columns.reduce((m, col) => ({ ...m, [col.name]: col }), {});
256
+ }
257
+
258
+ exports.isEditFilterState = isEditFilterState;
259
+ exports.useCustomFilters = useCustomFilters;
260
+ //# sourceMappingURL=useCustomFilters.js.map