@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.
- package/cjs/FilterModel.js +224 -0
- package/cjs/FilterModel.js.map +1 -0
- package/cjs/custom-filters/CustomFilters.js +108 -0
- package/cjs/custom-filters/CustomFilters.js.map +1 -0
- package/cjs/custom-filters/filterBarFocusManagement.js +35 -0
- package/cjs/custom-filters/filterBarFocusManagement.js.map +1 -0
- package/cjs/custom-filters/useCustomFilters.js +260 -0
- package/cjs/custom-filters/useCustomFilters.js.map +1 -0
- package/cjs/custom-filters/useFilterState.js +149 -0
- package/cjs/custom-filters/useFilterState.js.map +1 -0
- package/cjs/filter-bar/FilterBar.css.js +6 -0
- package/cjs/filter-bar/FilterBar.css.js.map +1 -0
- package/cjs/filter-bar/FilterBar.js +120 -0
- package/cjs/filter-bar/FilterBar.js.map +1 -0
- package/cjs/filter-bar/useFilterBar.js +37 -0
- package/cjs/filter-bar/useFilterBar.js.map +1 -0
- package/cjs/filter-clause/ColumnPicker.js +37 -0
- package/cjs/filter-clause/ColumnPicker.js.map +1 -0
- package/cjs/filter-clause/ExpandoCombobox.css.js +6 -0
- package/cjs/filter-clause/ExpandoCombobox.css.js.map +1 -0
- package/cjs/filter-clause/ExpandoCombobox.js +93 -0
- package/cjs/filter-clause/ExpandoCombobox.js.map +1 -0
- package/cjs/filter-clause/FilterClause.css.js +6 -0
- package/cjs/filter-clause/FilterClause.css.js.map +1 -0
- package/cjs/filter-clause/FilterClause.js +95 -0
- package/cjs/filter-clause/FilterClause.js.map +1 -0
- package/cjs/filter-clause/OperatorPicker.js +33 -0
- package/cjs/filter-clause/OperatorPicker.js.map +1 -0
- package/cjs/filter-clause/filterClauseFocusManagement.js +205 -0
- package/cjs/filter-clause/filterClauseFocusManagement.js.map +1 -0
- package/cjs/filter-clause/operator-utils.js +34 -0
- package/cjs/filter-clause/operator-utils.js.map +1 -0
- package/cjs/filter-clause/useExpandoCombobox.js +25 -0
- package/cjs/filter-clause/useExpandoCombobox.js.map +1 -0
- package/cjs/filter-clause/useFilterClause.js +151 -0
- package/cjs/filter-clause/useFilterClause.js.map +1 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditor.js +77 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditor.js.map +1 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditorDate.js +64 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditorDate.js.map +1 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditorNumber.js +55 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditorNumber.js.map +1 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditorText.js +189 -0
- package/cjs/filter-clause/value-editors/FilterClauseValueEditorText.js.map +1 -0
- package/cjs/filter-editor/FilterClauseCombinator.css.js +6 -0
- package/cjs/filter-editor/FilterClauseCombinator.css.js.map +1 -0
- package/cjs/filter-editor/FilterClauseCombinator.js +42 -0
- package/cjs/filter-editor/FilterClauseCombinator.js.map +1 -0
- package/cjs/filter-editor/FilterEditor.css.js +6 -0
- package/cjs/filter-editor/FilterEditor.css.js.map +1 -0
- package/cjs/filter-editor/FilterEditor.js +100 -0
- package/cjs/filter-editor/FilterEditor.js.map +1 -0
- package/cjs/filter-editor/useFilterEditor.js +191 -0
- package/cjs/filter-editor/useFilterEditor.js.map +1 -0
- package/cjs/filter-pill/FilterPill.css.js +6 -0
- package/cjs/filter-pill/FilterPill.css.js.map +1 -0
- package/cjs/filter-pill/FilterPill.js +147 -0
- package/cjs/filter-pill/FilterPill.js.map +1 -0
- package/cjs/filter-pill/filterAsReactNode.js +27 -0
- package/cjs/filter-pill/filterAsReactNode.js.map +1 -0
- package/cjs/filter-pill/getFilterLabel.js +22 -0
- package/cjs/filter-pill/getFilterLabel.js.map +1 -0
- package/cjs/filter-pill/getFilterTooltipText.js +41 -0
- package/cjs/filter-pill/getFilterTooltipText.js.map +1 -0
- package/cjs/filter-pill-menu/FilterPillMenuOptions.js +32 -0
- package/cjs/filter-pill-menu/FilterPillMenuOptions.js.map +1 -0
- package/cjs/filter-utils.js +326 -0
- package/cjs/filter-utils.js.map +1 -0
- package/cjs/index.js +45 -2995
- package/cjs/index.js.map +1 -1
- package/cjs/inline-filter/InlineFilter.css.js +6 -0
- package/cjs/inline-filter/InlineFilter.css.js.map +1 -0
- package/cjs/inline-filter/InlineFilter.js +65 -0
- package/cjs/inline-filter/InlineFilter.js.map +1 -0
- package/cjs/inline-filter/useInlineFilter.js +45 -0
- package/cjs/inline-filter/useInlineFilter.js.map +1 -0
- package/cjs/quick-filters/QuickFilters.css.js +6 -0
- package/cjs/quick-filters/QuickFilters.css.js.map +1 -0
- package/cjs/quick-filters/QuickFilters.js +96 -0
- package/cjs/quick-filters/QuickFilters.js.map +1 -0
- package/cjs/quick-filters/useQuickFilters.js +157 -0
- package/cjs/quick-filters/useQuickFilters.js.map +1 -0
- package/esm/FilterModel.js +221 -0
- package/esm/FilterModel.js.map +1 -0
- package/esm/custom-filters/CustomFilters.js +106 -0
- package/esm/custom-filters/CustomFilters.js.map +1 -0
- package/esm/custom-filters/filterBarFocusManagement.js +33 -0
- package/esm/custom-filters/filterBarFocusManagement.js.map +1 -0
- package/esm/custom-filters/useCustomFilters.js +257 -0
- package/esm/custom-filters/useCustomFilters.js.map +1 -0
- package/esm/custom-filters/useFilterState.js +147 -0
- package/esm/custom-filters/useFilterState.js.map +1 -0
- package/esm/filter-bar/FilterBar.css.js +4 -0
- package/esm/filter-bar/FilterBar.css.js.map +1 -0
- package/esm/filter-bar/FilterBar.js +118 -0
- package/esm/filter-bar/FilterBar.js.map +1 -0
- package/esm/filter-bar/useFilterBar.js +35 -0
- package/esm/filter-bar/useFilterBar.js.map +1 -0
- package/esm/filter-clause/ColumnPicker.js +35 -0
- package/esm/filter-clause/ColumnPicker.js.map +1 -0
- package/esm/filter-clause/ExpandoCombobox.css.js +4 -0
- package/esm/filter-clause/ExpandoCombobox.css.js.map +1 -0
- package/esm/filter-clause/ExpandoCombobox.js +91 -0
- package/esm/filter-clause/ExpandoCombobox.js.map +1 -0
- package/esm/filter-clause/FilterClause.css.js +4 -0
- package/esm/filter-clause/FilterClause.css.js.map +1 -0
- package/esm/filter-clause/FilterClause.js +93 -0
- package/esm/filter-clause/FilterClause.js.map +1 -0
- package/esm/filter-clause/OperatorPicker.js +31 -0
- package/esm/filter-clause/OperatorPicker.js.map +1 -0
- package/esm/filter-clause/filterClauseFocusManagement.js +192 -0
- package/esm/filter-clause/filterClauseFocusManagement.js.map +1 -0
- package/esm/filter-clause/operator-utils.js +30 -0
- package/esm/filter-clause/operator-utils.js.map +1 -0
- package/esm/filter-clause/useExpandoCombobox.js +23 -0
- package/esm/filter-clause/useExpandoCombobox.js.map +1 -0
- package/esm/filter-clause/useFilterClause.js +149 -0
- package/esm/filter-clause/useFilterClause.js.map +1 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditor.js +75 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditor.js.map +1 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditorDate.js +62 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditorDate.js.map +1 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditorNumber.js +53 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditorNumber.js.map +1 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditorText.js +187 -0
- package/esm/filter-clause/value-editors/FilterClauseValueEditorText.js.map +1 -0
- package/esm/filter-editor/FilterClauseCombinator.css.js +4 -0
- package/esm/filter-editor/FilterClauseCombinator.css.js.map +1 -0
- package/esm/filter-editor/FilterClauseCombinator.js +40 -0
- package/esm/filter-editor/FilterClauseCombinator.js.map +1 -0
- package/esm/filter-editor/FilterEditor.css.js +4 -0
- package/esm/filter-editor/FilterEditor.css.js.map +1 -0
- package/esm/filter-editor/FilterEditor.js +98 -0
- package/esm/filter-editor/FilterEditor.js.map +1 -0
- package/esm/filter-editor/useFilterEditor.js +189 -0
- package/esm/filter-editor/useFilterEditor.js.map +1 -0
- package/esm/filter-pill/FilterPill.css.js +4 -0
- package/esm/filter-pill/FilterPill.css.js.map +1 -0
- package/esm/filter-pill/FilterPill.js +145 -0
- package/esm/filter-pill/FilterPill.js.map +1 -0
- package/esm/filter-pill/filterAsReactNode.js +25 -0
- package/esm/filter-pill/filterAsReactNode.js.map +1 -0
- package/esm/filter-pill/getFilterLabel.js +20 -0
- package/esm/filter-pill/getFilterLabel.js.map +1 -0
- package/esm/filter-pill/getFilterTooltipText.js +39 -0
- package/esm/filter-pill/getFilterTooltipText.js.map +1 -0
- package/esm/filter-pill-menu/FilterPillMenuOptions.js +27 -0
- package/esm/filter-pill-menu/FilterPillMenuOptions.js.map +1 -0
- package/esm/filter-utils.js +305 -0
- package/esm/filter-utils.js.map +1 -0
- package/esm/index.js +11 -2965
- package/esm/index.js.map +1 -1
- package/esm/inline-filter/InlineFilter.css.js +4 -0
- package/esm/inline-filter/InlineFilter.css.js.map +1 -0
- package/esm/inline-filter/InlineFilter.js +63 -0
- package/esm/inline-filter/InlineFilter.js.map +1 -0
- package/esm/inline-filter/useInlineFilter.js +43 -0
- package/esm/inline-filter/useInlineFilter.js.map +1 -0
- package/esm/quick-filters/QuickFilters.css.js +4 -0
- package/esm/quick-filters/QuickFilters.css.js.map +1 -0
- package/esm/quick-filters/QuickFilters.js +94 -0
- package/esm/quick-filters/QuickFilters.js.map +1 -0
- package/esm/quick-filters/useQuickFilters.js +155 -0
- package/esm/quick-filters/useQuickFilters.js.map +1 -0
- 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
|