@servicetitan/table 31.2.0 → 31.3.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.
- package/dist/demo/column-hiding/index.js +1 -0
- package/dist/demo/column-hiding/index.js.map +1 -1
- package/dist/demo/column-hiding/product.js +7 -6
- package/dist/demo/column-hiding/product.js.map +1 -1
- package/dist/demo/column-hiding/products.js +12 -11
- package/dist/demo/column-hiding/products.js.map +1 -1
- package/dist/demo/column-hiding/table.js +126 -32
- package/dist/demo/column-hiding/table.js.map +1 -1
- package/dist/demo/column-hiding/table.store.js +30 -27
- package/dist/demo/column-hiding/table.store.js.map +1 -1
- package/dist/demo/filters/async-select-filter.js +59 -12
- package/dist/demo/filters/async-select-filter.js.map +1 -1
- package/dist/demo/filters/categories.js +20 -16
- package/dist/demo/filters/categories.js.map +1 -1
- package/dist/demo/filters/multiselect-filter.js +37 -5
- package/dist/demo/filters/multiselect-filter.js.map +1 -1
- package/dist/demo/filters/range-filter.js +104 -10
- package/dist/demo/filters/range-filter.js.map +1 -1
- package/dist/demo/filters/select-filter.js +139 -41
- package/dist/demo/filters/select-filter.js.map +1 -1
- package/dist/demo/filters/single-select-filter.js +109 -18
- package/dist/demo/filters/single-select-filter.js.map +1 -1
- package/dist/demo/filters/table.store.js +77 -86
- package/dist/demo/filters/table.store.js.map +1 -1
- package/dist/demo/footer-page-size/index.js +1 -0
- package/dist/demo/footer-page-size/index.js.map +1 -1
- package/dist/demo/footer-page-size/table.js +82 -6
- package/dist/demo/footer-page-size/table.js.map +1 -1
- package/dist/demo/index.js +1 -0
- package/dist/demo/index.js.map +1 -1
- package/dist/demo/master-detail/detail-table.js +41 -9
- package/dist/demo/master-detail/detail-table.js.map +1 -1
- package/dist/demo/master-detail/detail-table.store.js +60 -56
- package/dist/demo/master-detail/detail-table.store.js.map +1 -1
- package/dist/demo/master-detail/index.js +1 -0
- package/dist/demo/master-detail/index.js.map +1 -1
- package/dist/demo/master-detail/master-table.store.js +65 -61
- package/dist/demo/master-detail/master-table.store.js.map +1 -1
- package/dist/demo/master-detail/product-detail.js +2 -1
- package/dist/demo/master-detail/product-detail.js.map +1 -1
- package/dist/demo/master-detail/product-details.js +10 -9
- package/dist/demo/master-detail/product-details.js.map +1 -1
- package/dist/demo/master-detail/product.js +7 -6
- package/dist/demo/master-detail/product.js.map +1 -1
- package/dist/demo/master-detail/products.js +12 -11
- package/dist/demo/master-detail/products.js.map +1 -1
- package/dist/demo/master-detail/table-master-detail.js +39 -8
- package/dist/demo/master-detail/table-master-detail.js.map +1 -1
- package/dist/demo/overview/actions-cell.js +47 -10
- package/dist/demo/overview/actions-cell.js.map +1 -1
- package/dist/demo/overview/index.js +1 -0
- package/dist/demo/overview/index.js.map +1 -1
- package/dist/demo/overview/product.js +7 -6
- package/dist/demo/overview/product.js.map +1 -1
- package/dist/demo/overview/products.js +15 -14
- package/dist/demo/overview/products.js.map +1 -1
- package/dist/demo/overview/table.js +176 -21
- package/dist/demo/overview/table.js.map +1 -1
- package/dist/demo/overview/table.store.js +45 -51
- package/dist/demo/overview/table.store.js.map +1 -1
- package/dist/demo/row-details/index.js +1 -0
- package/dist/demo/row-details/index.js.map +1 -1
- package/dist/demo/row-details/row-details-table.js +52 -5
- package/dist/demo/row-details/row-details-table.js.map +1 -1
- package/dist/demo/row-details/row-details-table.store.js +27 -19
- package/dist/demo/row-details/row-details-table.store.js.map +1 -1
- package/dist/demo/state-caching/beverages.js +11 -10
- package/dist/demo/state-caching/beverages.js.map +1 -1
- package/dist/demo/state-caching/index.js +1 -0
- package/dist/demo/state-caching/index.js.map +1 -1
- package/dist/demo/state-caching/product.js +2 -1
- package/dist/demo/state-caching/product.js.map +1 -1
- package/dist/demo/state-caching/products.js +12 -11
- package/dist/demo/state-caching/products.js.map +1 -1
- package/dist/demo/state-caching/state-caching-table.js +44 -3
- package/dist/demo/state-caching/state-caching-table.js.map +1 -1
- package/dist/demo/state-caching/state-caching-table.store.js +42 -54
- package/dist/demo/state-caching/state-caching-table.store.js.map +1 -1
- package/dist/details/expand-column.js +31 -7
- package/dist/details/expand-column.js.map +1 -1
- package/dist/details/index.js +1 -0
- package/dist/details/index.js.map +1 -1
- package/dist/editable-cell/boolean-editable-cell.js +15 -4
- package/dist/editable-cell/boolean-editable-cell.js.map +1 -1
- package/dist/editable-cell/get-action-cell.js +14 -7
- package/dist/editable-cell/get-action-cell.js.map +1 -1
- package/dist/editable-cell/get-editable-cell.js +16 -8
- package/dist/editable-cell/get-editable-cell.js.map +1 -1
- package/dist/editable-cell/get-select-editable-cell.js +19 -5
- package/dist/editable-cell/get-select-editable-cell.js.map +1 -1
- package/dist/editable-cell/index.js +1 -0
- package/dist/editable-cell/index.js.map +1 -1
- package/dist/editable-cell/text-editable-cell.js +23 -5
- package/dist/editable-cell/text-editable-cell.js.map +1 -1
- package/dist/export/export.js +38 -1
- package/dist/export/export.js.map +1 -1
- package/dist/export/export.module.css.d.ts +3 -0
- package/dist/export/index.js +1 -0
- package/dist/export/index.js.map +1 -1
- package/dist/filters/async-select/async-select-filter.js +167 -132
- package/dist/filters/async-select/async-select-filter.js.map +1 -1
- package/dist/filters/column-menu-filters.js +39 -8
- package/dist/filters/column-menu-filters.js.map +1 -1
- package/dist/filters/datetime-filter/datetime-filter.js +73 -50
- package/dist/filters/datetime-filter/datetime-filter.js.map +1 -1
- package/dist/filters/field-values-filter.js +80 -72
- package/dist/filters/field-values-filter.js.map +1 -1
- package/dist/filters/index.js +1 -0
- package/dist/filters/index.js.map +1 -1
- package/dist/filters/multiselect-filter/multiselect-filter.js +77 -73
- package/dist/filters/multiselect-filter/multiselect-filter.js.map +1 -1
- package/dist/filters/numeric-filter-extended/numeric-extended-operators.js +10 -3
- package/dist/filters/numeric-filter-extended/numeric-extended-operators.js.map +1 -1
- package/dist/filters/numeric-filter-extended/numeric-filter-extended.js +39 -16
- package/dist/filters/numeric-filter-extended/numeric-filter-extended.js.map +1 -1
- package/dist/filters/range-filter/range-filter.js +76 -72
- package/dist/filters/range-filter/range-filter.js.map +1 -1
- package/dist/filters/select-filter/object-search.js +4 -3
- package/dist/filters/select-filter/object-search.js.map +1 -1
- package/dist/filters/select-filter/operators.js +6 -5
- package/dist/filters/select-filter/operators.js.map +1 -1
- package/dist/filters/select-filter/select-filter.js +180 -145
- package/dist/filters/select-filter/select-filter.js.map +1 -1
- package/dist/filters/select-filter/value-getter.js +2 -1
- package/dist/filters/select-filter/value-getter.js.map +1 -1
- package/dist/filters/single-select/single-select-filter.js +29 -15
- package/dist/filters/single-select/single-select-filter.js.map +1 -1
- package/dist/filters/standard-filter-with-multiselect/filter-cell-ext.js +114 -67
- package/dist/filters/standard-filter-with-multiselect/filter-cell-ext.js.map +1 -1
- package/dist/filters/standard-filter-with-multiselect/filter-cell-ext.module.css.d.ts +7 -0
- package/dist/filters/standard-filter-with-multiselect/multiselect-operators.js +10 -3
- package/dist/filters/standard-filter-with-multiselect/multiselect-operators.js.map +1 -1
- package/dist/filters/standard-filter-with-multiselect/standard-filter-with-multiselect.js +77 -55
- package/dist/filters/standard-filter-with-multiselect/standard-filter-with-multiselect.js.map +1 -1
- package/dist/filters/standard-filter-with-multiselect/table-column-menu-filter-ext.js +23 -10
- package/dist/filters/standard-filter-with-multiselect/table-column-menu-filter-ext.js.map +1 -1
- package/dist/filters/time-filter/time-filter.js +63 -49
- package/dist/filters/time-filter/time-filter.js.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/select-cell/index.js +1 -0
- package/dist/select-cell/index.js.map +1 -1
- package/dist/select-cell/select-cell.js +36 -11
- package/dist/select-cell/select-cell.js.map +1 -1
- package/dist/select-cell/select-cell.module.css.d.ts +3 -0
- package/dist/table-state.js +479 -660
- package/dist/table-state.js.map +1 -1
- package/dist/table.js +235 -250
- package/dist/table.js.map +1 -1
- package/dist/table.module.css.d.ts +5 -0
- package/dist/use-observing-table-state/demo/components/use-observing-table-state-demo.js +97 -5
- package/dist/use-observing-table-state/demo/components/use-observing-table-state-demo.js.map +1 -1
- package/dist/use-observing-table-state/demo/stores/use-observing-table-state-demo.store.js +71 -97
- package/dist/use-observing-table-state/demo/stores/use-observing-table-state-demo.store.js.map +1 -1
- package/dist/use-observing-table-state/index.js +1 -0
- package/dist/use-observing-table-state/index.js.map +1 -1
- package/dist/use-observing-table-state/use-observing-table-state.js +26 -20
- package/dist/use-observing-table-state/use-observing-table-state.js.map +1 -1
- package/dist/utils/filters.js +14 -9
- package/dist/utils/filters.js.map +1 -1
- package/dist/utils/use-td-props.js +3 -2
- package/dist/utils/use-td-props.js.map +1 -1
- package/package.json +13 -13
- package/dist/filters/async-select/async-select-filter.stories.js +0 -7
- package/dist/filters/async-select/async-select-filter.stories.js.map +0 -1
- package/dist/filters/multiselect-filter/multiselect-filter.stories.js +0 -7
- package/dist/filters/multiselect-filter/multiselect-filter.stories.js.map +0 -1
- package/dist/filters/range-filter/range-filter.stories.js +0 -9
- package/dist/filters/range-filter/range-filter.stories.js.map +0 -1
- package/dist/filters/select-filter/__tests__/object-search.test.js +0 -28
- package/dist/filters/select-filter/__tests__/object-search.test.js.map +0 -1
- package/dist/filters/select-filter/select-filter.stories.js +0 -8
- package/dist/filters/select-filter/select-filter.stories.js.map +0 -1
- package/dist/filters/single-select/single-select-filter.stories.js +0 -8
- package/dist/filters/single-select/single-select-filter.stories.js.map +0 -1
- package/dist/table.stories.js +0 -12
- package/dist/table.stories.js.map +0 -1
- package/dist/use-observing-table-state/use-observing-table-state.stories.js +0 -11
- package/dist/use-observing-table-state/use-observing-table-state.stories.js.map +0 -1
- package/dist/utils/__tests__/filters.test.js +0 -24
- package/dist/utils/__tests__/filters.test.js.map +0 -1
@@ -2,85 +2,132 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { runInAction } from 'mobx';
|
3
3
|
import { observer, useLocalStore } from 'mobx-react';
|
4
4
|
import { multiselectOperators, isMultiselectOperator } from './multiselect-operators';
|
5
|
-
import { DropDownList, MultiSelect
|
6
|
-
import { IsUnaryFilter, cellOperatorChange
|
5
|
+
import { DropDownList, MultiSelect } from '@progress/kendo-react-dropdowns';
|
6
|
+
import { IsUnaryFilter, cellOperatorChange } from '@progress/kendo-react-grid/dist/npm/filterCommon';
|
7
7
|
import { Icon, Tooltip } from '@servicetitan/design-system';
|
8
8
|
import * as Styles from './filter-cell-ext.module.css';
|
9
9
|
import classNames from 'classnames';
|
10
10
|
// like standard filter cell (rendered for string type), but with support of multiselect operators
|
11
|
-
export const FilterCellExt = observer(props
|
12
|
-
const store = useLocalStore(oprops
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
get multiselectValue() {
|
44
|
-
return Array.isArray(oprops.value)
|
45
|
-
? oprops.value.map(v => {
|
46
|
-
var _a;
|
47
|
-
return ({
|
11
|
+
export const FilterCellExt = observer((props)=>{
|
12
|
+
const store = useLocalStore((oprops)=>({
|
13
|
+
get operators () {
|
14
|
+
return multiselectOperators.concat(oprops.onlyMultiselectAndEmptyOperators ? oprops.operators.filter((o)=>o.operator === 'isempty' || o.operator === 'isnotempty') : oprops.operators);
|
15
|
+
},
|
16
|
+
get operatorValue () {
|
17
|
+
return this.operators.find((item)=>item.operator === oprops.operator);
|
18
|
+
},
|
19
|
+
searchQuery: '',
|
20
|
+
filterChange (event) {
|
21
|
+
runInAction(()=>this.searchQuery = event.filter.value);
|
22
|
+
},
|
23
|
+
get filteredValuesSet () {
|
24
|
+
const queryLC = this.searchQuery.toLowerCase();
|
25
|
+
return oprops.options.filter((v)=>v.textLC.includes(queryLC));
|
26
|
+
},
|
27
|
+
get onlyFirstValues () {
|
28
|
+
return oprops.maxFoundValues && oprops.maxFoundValues < this.filteredValuesSet.length ? oprops.maxFoundValues : false;
|
29
|
+
},
|
30
|
+
get filteredVisibleValues () {
|
31
|
+
return this.onlyFirstValues ? this.filteredValuesSet.slice(0, this.onlyFirstValues) : this.filteredValuesSet;
|
32
|
+
},
|
33
|
+
get valueTextMap () {
|
34
|
+
return new Map(oprops.options.map((o)=>[
|
35
|
+
o.value,
|
36
|
+
o.text
|
37
|
+
]));
|
38
|
+
},
|
39
|
+
get multiselectValue () {
|
40
|
+
return Array.isArray(oprops.value) ? oprops.value.map((v)=>{
|
41
|
+
var _this_valueTextMap_get;
|
42
|
+
return {
|
48
43
|
value: v,
|
49
|
-
text: (
|
50
|
-
}
|
51
|
-
})
|
52
|
-
|
53
|
-
},
|
54
|
-
|
55
|
-
const
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
44
|
+
text: (_this_valueTextMap_get = this.valueTextMap.get(v)) !== null && _this_valueTextMap_get !== void 0 ? _this_valueTextMap_get : v.toString()
|
45
|
+
};
|
46
|
+
}) : [];
|
47
|
+
}
|
48
|
+
}), props);
|
49
|
+
const { operator = '', onChange, allowCustomValues, multiselectItemRender, multiselectTagRender, multiselectListNoDataRender } = props;
|
50
|
+
const handleInputChange = (e)=>onChange({
|
51
|
+
operator,
|
52
|
+
value: e.target.value,
|
53
|
+
syntheticEvent: e
|
54
|
+
});
|
55
|
+
const handleMultiselectChange = (e)=>{
|
56
|
+
const newValue = e.value.map((v)=>{
|
57
|
+
var _v_value;
|
58
|
+
return (_v_value = v.value) !== null && _v_value !== void 0 ? _v_value : props.handleCustomValuesAsNumber ? +v.text : v.text;
|
59
|
+
});
|
63
60
|
onChange({
|
64
61
|
operator,
|
65
|
-
value: newValue.length ? newValue : '',
|
66
|
-
syntheticEvent: e.syntheticEvent
|
62
|
+
value: newValue.length ? newValue : '',
|
63
|
+
syntheticEvent: e.syntheticEvent
|
67
64
|
});
|
68
65
|
};
|
69
66
|
// conversions for better compatibility when switching plain/array operators
|
70
|
-
const handleOperatorChange = (event)
|
71
|
-
const newValue = isMultiselectOperator(operator) === isMultiselectOperator(event.target.value.operator)
|
72
|
-
? props.value
|
73
|
-
: '';
|
67
|
+
const handleOperatorChange = (event)=>{
|
68
|
+
const newValue = isMultiselectOperator(operator) === isMultiselectOperator(event.target.value.operator) ? props.value : '';
|
74
69
|
cellOperatorChange(event, newValue, onChange);
|
75
70
|
};
|
76
|
-
const allowCustomAdd =
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
71
|
+
const allowCustomAdd = allowCustomValues && store.searchQuery && (!props.handleCustomValuesAsNumber || !isNaN(+store.searchQuery)) || false;
|
72
|
+
return /*#__PURE__*/ _jsxs("div", {
|
73
|
+
children: [
|
74
|
+
/*#__PURE__*/ _jsx(DropDownList, {
|
75
|
+
value: store.operatorValue,
|
76
|
+
onChange: handleOperatorChange,
|
77
|
+
data: store.operators,
|
78
|
+
className: "m-b-1",
|
79
|
+
textField: "text"
|
80
|
+
}),
|
81
|
+
(typeof operator !== 'string' || !IsUnaryFilter(operator)) && (isMultiselectOperator(operator) ? /*#__PURE__*/ _jsx(MultiSelect, {
|
82
|
+
value: store.multiselectValue,
|
83
|
+
onChange: handleMultiselectChange,
|
84
|
+
filterable: true,
|
85
|
+
onFilterChange: store.filterChange,
|
86
|
+
allowCustom: allowCustomAdd,
|
87
|
+
data: store.filteredVisibleValues,
|
88
|
+
textField: "text",
|
89
|
+
dataItemKey: "value",
|
90
|
+
className: classNames('m-b-1', Styles.multiSelect),
|
91
|
+
header: allowCustomAdd && /*#__PURE__*/ _jsx("div", {
|
92
|
+
className: Styles.customItemAddMarker
|
93
|
+
}),
|
94
|
+
footer: allowCustomAdd ? /*#__PURE__*/ _jsxs("div", {
|
95
|
+
className: Styles.returnToUse,
|
96
|
+
children: [
|
97
|
+
/*#__PURE__*/ _jsx(Icon, {
|
98
|
+
name: "keyboard_return"
|
99
|
+
}),
|
100
|
+
"to create filter"
|
101
|
+
]
|
102
|
+
}) : store.onlyFirstValues && /*#__PURE__*/ _jsxs("div", {
|
103
|
+
className: Styles.returnToUse,
|
104
|
+
children: [
|
105
|
+
"First ",
|
106
|
+
store.onlyFirstValues,
|
107
|
+
" values are shown. ",
|
108
|
+
/*#__PURE__*/ _jsx("br", {}),
|
109
|
+
"Type to search for other values."
|
110
|
+
]
|
111
|
+
}),
|
112
|
+
itemRender: multiselectItemRender,
|
113
|
+
tagRender: multiselectTagRender !== null && multiselectTagRender !== void 0 ? multiselectTagRender : defaultMultiselectTagRender,
|
114
|
+
listNoDataRender: multiselectListNoDataRender
|
115
|
+
}) : /*#__PURE__*/ _jsx("input", {
|
116
|
+
className: "k-input k-input-md k-rounded-md k-input-solid m-b-1",
|
117
|
+
value: props.value,
|
118
|
+
onChange: handleInputChange
|
119
|
+
}))
|
120
|
+
]
|
121
|
+
});
|
82
122
|
});
|
83
|
-
const defaultMultiselectTagRender = (tagData, li)
|
84
|
-
return
|
123
|
+
const defaultMultiselectTagRender = (tagData, li)=>{
|
124
|
+
return /*#__PURE__*/ _jsx(Tooltip, {
|
125
|
+
portal: true,
|
126
|
+
text: tagData.text,
|
127
|
+
className: Styles.multiSelectTagTooltipWrapper,
|
128
|
+
popperClassName: Styles.multiSelectTagTooltip,
|
129
|
+
children: li
|
130
|
+
});
|
85
131
|
};
|
132
|
+
|
86
133
|
//# sourceMappingURL=filter-cell-ext.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"filter-cell-ext.js","sourceRoot":"","sources":["../../../src/filters/standard-filter-with-multiselect/filter-cell-ext.tsx"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/filter-cell-ext.tsx"],"sourcesContent":["import { ReactElement, ReactNode, FC, ChangeEvent } from 'react';\nimport { runInAction } from 'mobx';\nimport { observer, useLocalStore } from 'mobx-react';\nimport { multiselectOperators, isMultiselectOperator } from './multiselect-operators';\n\nimport {\n DropDownList,\n DropDownListChangeEvent,\n MultiSelect,\n MultiSelectChangeEvent,\n MultiSelectFilterChangeEvent,\n ListItemProps,\n MultiSelectTagData,\n} from '@progress/kendo-react-dropdowns';\n\nimport { GridColumnMenuFilterCellProps as TableColumnMenuFilterCellProps } from '@progress/kendo-react-grid/dist/npm/columnMenu/GridColumnMenuFilterCell';\nimport {\n IsUnaryFilter,\n cellOperatorChange,\n} from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport { Icon, Tooltip } from '@servicetitan/design-system';\n\nimport * as Styles from './filter-cell-ext.module.css';\nimport classNames from 'classnames';\n//\n\ninterface ValueWithLowerCase {\n value: any;\n text: string;\n textLC: string;\n}\n\nexport interface FilterCellExtProps extends TableColumnMenuFilterCellProps {\n options: ValueWithLowerCase[];\n maxFoundValues?: number;\n allowCustomValues?: boolean;\n onlyMultiselectAndEmptyOperators?: boolean;\n handleCustomValuesAsNumber?: boolean;\n multiselectItemRender?(li: ReactElement<HTMLLIElement>, itemProps: ListItemProps): ReactNode;\n multiselectTagRender?(\n tagData: MultiSelectTagData,\n li: ReactElement<HTMLLIElement>\n ): ReactElement<HTMLLIElement>;\n multiselectListNoDataRender?(element: ReactElement<HTMLDivElement>): ReactNode;\n}\n\n// like standard filter cell (rendered for string type), but with support of multiselect operators\nexport const FilterCellExt: FC<FilterCellExtProps> = observer(props => {\n const store = useLocalStore(\n oprops => ({\n get operators() {\n return multiselectOperators.concat(\n oprops.onlyMultiselectAndEmptyOperators\n ? oprops.operators.filter(\n o => o.operator === 'isempty' || o.operator === 'isnotempty'\n )\n : oprops.operators\n );\n },\n get operatorValue() {\n return this.operators.find(item => item.operator === oprops.operator);\n },\n searchQuery: '',\n filterChange(event: MultiSelectFilterChangeEvent) {\n runInAction(() => (this.searchQuery = event.filter.value));\n },\n get filteredValuesSet() {\n const queryLC = this.searchQuery.toLowerCase();\n return oprops.options.filter(v => v.textLC.includes(queryLC));\n },\n get onlyFirstValues() {\n return oprops.maxFoundValues &&\n oprops.maxFoundValues < this.filteredValuesSet.length\n ? oprops.maxFoundValues\n : false;\n },\n get filteredVisibleValues() {\n return this.onlyFirstValues\n ? this.filteredValuesSet.slice(0, this.onlyFirstValues)\n : this.filteredValuesSet;\n },\n get valueTextMap() {\n return new Map(oprops.options.map(o => [o.value, o.text]));\n },\n get multiselectValue() {\n return Array.isArray(oprops.value)\n ? oprops.value.map(v => ({\n value: v,\n text: this.valueTextMap.get(v) ?? v.toString(),\n }))\n : [];\n },\n }),\n props\n );\n\n const {\n operator = '',\n onChange,\n allowCustomValues,\n multiselectItemRender,\n multiselectTagRender,\n multiselectListNoDataRender,\n } = props;\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) =>\n onChange({\n operator,\n value: e.target.value,\n syntheticEvent: e,\n });\n\n const handleMultiselectChange = (e: MultiSelectChangeEvent) => {\n const newValue = e.value.map(\n (v: any) => v.value ?? (props.handleCustomValuesAsNumber ? +v.text : v.text)\n );\n onChange({\n operator,\n value: newValue.length ? newValue : '', // for Kendo to handle empty array as an empty value TODO: check if there is another way\n syntheticEvent: e.syntheticEvent,\n });\n };\n\n // conversions for better compatibility when switching plain/array operators\n const handleOperatorChange = (event: DropDownListChangeEvent) => {\n const newValue =\n isMultiselectOperator(operator) === isMultiselectOperator(event.target.value.operator)\n ? props.value\n : '';\n cellOperatorChange(event, newValue, onChange);\n };\n\n const allowCustomAdd =\n (allowCustomValues &&\n store.searchQuery &&\n (!props.handleCustomValuesAsNumber || !isNaN(+store.searchQuery))) ||\n false;\n\n return (\n <div>\n <DropDownList\n value={store.operatorValue}\n onChange={handleOperatorChange}\n data={store.operators}\n className=\"m-b-1\"\n textField=\"text\"\n />\n {(typeof operator !== 'string' || !IsUnaryFilter(operator)) &&\n (isMultiselectOperator(operator) ? (\n <MultiSelect\n value={store.multiselectValue}\n onChange={handleMultiselectChange}\n filterable\n onFilterChange={store.filterChange}\n allowCustom={allowCustomAdd}\n data={store.filteredVisibleValues}\n textField=\"text\"\n dataItemKey=\"value\"\n className={classNames('m-b-1', Styles.multiSelect)}\n header={allowCustomAdd && <div className={Styles.customItemAddMarker} />}\n footer={\n allowCustomAdd ? (\n <div className={Styles.returnToUse}>\n <Icon name=\"keyboard_return\" />\n to create filter\n </div>\n ) : (\n store.onlyFirstValues && (\n <div className={Styles.returnToUse}>\n First {store.onlyFirstValues} values are shown. <br />\n Type to search for other values.\n </div>\n )\n )\n }\n itemRender={multiselectItemRender}\n tagRender={multiselectTagRender ?? defaultMultiselectTagRender}\n listNoDataRender={multiselectListNoDataRender}\n />\n ) : (\n <input\n className=\"k-input k-input-md k-rounded-md k-input-solid m-b-1\"\n value={props.value}\n onChange={handleInputChange}\n />\n ))}\n </div>\n );\n});\n\nconst defaultMultiselectTagRender = (\n tagData: MultiSelectTagData,\n li: ReactElement<HTMLLIElement>\n): ReactElement<HTMLLIElement> => {\n return (\n <Tooltip\n portal\n text={tagData.text}\n className={Styles.multiSelectTagTooltipWrapper}\n popperClassName={Styles.multiSelectTagTooltip}\n >\n {li}\n </Tooltip>\n );\n};\n"],"names":["runInAction","observer","useLocalStore","multiselectOperators","isMultiselectOperator","DropDownList","MultiSelect","IsUnaryFilter","cellOperatorChange","Icon","Tooltip","Styles","classNames","FilterCellExt","props","store","oprops","operators","concat","onlyMultiselectAndEmptyOperators","filter","o","operator","operatorValue","find","item","searchQuery","filterChange","event","value","filteredValuesSet","queryLC","toLowerCase","options","v","textLC","includes","onlyFirstValues","maxFoundValues","length","filteredVisibleValues","slice","valueTextMap","Map","map","text","multiselectValue","Array","isArray","get","toString","onChange","allowCustomValues","multiselectItemRender","multiselectTagRender","multiselectListNoDataRender","handleInputChange","e","target","syntheticEvent","handleMultiselectChange","newValue","handleCustomValuesAsNumber","handleOperatorChange","allowCustomAdd","isNaN","div","data","className","textField","filterable","onFilterChange","allowCustom","dataItemKey","multiSelect","header","customItemAddMarker","footer","returnToUse","name","br","itemRender","tagRender","defaultMultiselectTagRender","listNoDataRender","input","tagData","li","portal","multiSelectTagTooltipWrapper","popperClassName","multiSelectTagTooltip"],"mappings":"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"}
|
@@ -1,6 +1,13 @@
|
|
1
1
|
export const multiselectOperators = [
|
2
|
-
{
|
3
|
-
|
2
|
+
{
|
3
|
+
text: 'Is one of',
|
4
|
+
operator: 'in'
|
5
|
+
},
|
6
|
+
{
|
7
|
+
text: 'Is not one of',
|
8
|
+
operator: 'notin'
|
9
|
+
}
|
4
10
|
];
|
5
|
-
export const isMultiselectOperator = (operator)
|
11
|
+
export const isMultiselectOperator = (operator)=>multiselectOperators.some((o)=>o.operator === operator);
|
12
|
+
|
6
13
|
//# sourceMappingURL=multiselect-operators.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"
|
1
|
+
{"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/multiselect-operators.ts"],"sourcesContent":["export const multiselectOperators = [\n { text: 'Is one of', operator: 'in' },\n { text: 'Is not one of', operator: 'notin' },\n];\n\nexport const isMultiselectOperator = (operator: string | Function) =>\n multiselectOperators.some(o => o.operator === operator);\n"],"names":["multiselectOperators","text","operator","isMultiselectOperator","some","o"],"mappings":"AAAA,OAAO,MAAMA,uBAAuB;IAChC;QAAEC,MAAM;QAAaC,UAAU;IAAK;IACpC;QAAED,MAAM;QAAiBC,UAAU;IAAQ;CAC9C,CAAC;AAEF,OAAO,MAAMC,wBAAwB,CAACD,WAClCF,qBAAqBI,IAAI,CAACC,CAAAA,IAAKA,EAAEH,QAAQ,KAAKA,UAAU"}
|
@@ -7,71 +7,93 @@ import { FilterCellExt } from './filter-cell-ext';
|
|
7
7
|
/*
|
8
8
|
* StandardFilterWithMultiselect is like standard Kendo filter, but with additional operators 'Is one of' / 'Is not one of'.
|
9
9
|
* Intended to be used with string fields (though it's possible to adopt for number fields as well, if someone will have a need).
|
10
|
-
*/
|
11
|
-
export function standardFilterWithMultiselect(optionsConfig = {}, filterCellConfig = {}) {
|
10
|
+
*/ export function standardFilterWithMultiselect(optionsConfig = {}, filterCellConfig = {}) {
|
12
11
|
const optionsConfigFull = {
|
13
12
|
maxExtractedLength: 64,
|
14
13
|
options: [],
|
15
|
-
...optionsConfig
|
14
|
+
...optionsConfig
|
16
15
|
};
|
17
16
|
const filterCellConfigFull = {
|
18
17
|
allowCustomValues: true,
|
19
18
|
maxFoundValues: 1000,
|
20
|
-
...filterCellConfig
|
19
|
+
...filterCellConfig
|
21
20
|
};
|
22
21
|
// Filter UI with data fetcher
|
23
|
-
const FilterUIWithValues = observer(props
|
24
|
-
const store = useLocalStore(oprops
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
return [];
|
37
|
-
}
|
38
|
-
return this.itemsFromDataSource.value.data
|
39
|
-
.map(i => i[this.field])
|
40
|
-
.filter(v => typeof v === 'number' ||
|
41
|
-
(typeof v === 'string' &&
|
42
|
-
v.length > 0 &&
|
43
|
-
v.length <= optionsConfigFull.maxExtractedLength));
|
44
|
-
},
|
45
|
-
get options() {
|
46
|
-
return Array.from(new Set(this.valuesfromTableState.concat(optionsConfigFull.options))).map(v => {
|
47
|
-
switch (typeof v) {
|
48
|
-
case 'string':
|
49
|
-
return {
|
50
|
-
value: v,
|
51
|
-
text: v,
|
52
|
-
textLC: v.toLowerCase(),
|
53
|
-
};
|
54
|
-
case 'number':
|
55
|
-
return {
|
56
|
-
value: v,
|
57
|
-
text: v.toString(),
|
58
|
-
textLC: v.toString().toLowerCase(),
|
59
|
-
};
|
60
|
-
case 'object':
|
61
|
-
return {
|
62
|
-
value: v.value,
|
63
|
-
text: v.text,
|
64
|
-
textLC: v.text.toLowerCase(),
|
65
|
-
};
|
66
|
-
default:
|
67
|
-
throw 'Incompatible option type.';
|
22
|
+
const FilterUIWithValues = observer((props)=>{
|
23
|
+
const store = useLocalStore((oprops)=>({
|
24
|
+
get field () {
|
25
|
+
return oprops.firstFilterProps.field;
|
26
|
+
},
|
27
|
+
get itemsFromDataSource () {
|
28
|
+
var _optionsConfigFull_tableState;
|
29
|
+
const dataSource = (_optionsConfigFull_tableState = optionsConfigFull.tableState) === null || _optionsConfigFull_tableState === void 0 ? void 0 : _optionsConfigFull_tableState.dataSource;
|
30
|
+
return dataSource && this.field && fromPromise(dataSource.getData({}));
|
31
|
+
},
|
32
|
+
get valuesfromTableState () {
|
33
|
+
if (!this.itemsFromDataSource || !(this.itemsFromDataSource.state === 'fulfilled')) {
|
34
|
+
return [];
|
68
35
|
}
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
36
|
+
return this.itemsFromDataSource.value.data.map((i)=>i[this.field]).filter((v)=>typeof v === 'number' || typeof v === 'string' && v.length > 0 && v.length <= optionsConfigFull.maxExtractedLength);
|
37
|
+
},
|
38
|
+
get options () {
|
39
|
+
return Array.from(new Set(this.valuesfromTableState.concat(optionsConfigFull.options))).map((v)=>{
|
40
|
+
switch(typeof v){
|
41
|
+
case 'string':
|
42
|
+
return {
|
43
|
+
value: v,
|
44
|
+
text: v,
|
45
|
+
textLC: v.toLowerCase()
|
46
|
+
};
|
47
|
+
case 'number':
|
48
|
+
return {
|
49
|
+
value: v,
|
50
|
+
text: v.toString(),
|
51
|
+
textLC: v.toString().toLowerCase()
|
52
|
+
};
|
53
|
+
case 'object':
|
54
|
+
return {
|
55
|
+
value: v.value,
|
56
|
+
text: v.text,
|
57
|
+
textLC: v.text.toLowerCase()
|
58
|
+
};
|
59
|
+
default:
|
60
|
+
throw 'Incompatible option type.';
|
61
|
+
}
|
62
|
+
});
|
63
|
+
}
|
64
|
+
}), props);
|
65
|
+
const { firstFilterProps, secondFilterProps, hideSecondFilter, logicData, logicValue, onLogicChange } = props;
|
66
|
+
return /*#__PURE__*/ _jsxs("div", {
|
67
|
+
children: [
|
68
|
+
/*#__PURE__*/ _jsx(FilterCellExt, {
|
69
|
+
...firstFilterProps,
|
70
|
+
options: store.options,
|
71
|
+
...filterCellConfigFull
|
72
|
+
}),
|
73
|
+
!hideSecondFilter && /*#__PURE__*/ _jsxs("div", {
|
74
|
+
children: [
|
75
|
+
/*#__PURE__*/ _jsx(DropDownList, {
|
76
|
+
data: logicData,
|
77
|
+
value: logicValue,
|
78
|
+
onChange: onLogicChange,
|
79
|
+
className: "k-filter-and m-b-1-i",
|
80
|
+
textField: "text"
|
81
|
+
}),
|
82
|
+
/*#__PURE__*/ _jsx(FilterCellExt, {
|
83
|
+
...secondFilterProps,
|
84
|
+
options: store.options,
|
85
|
+
...filterCellConfigFull
|
86
|
+
})
|
87
|
+
]
|
88
|
+
})
|
89
|
+
]
|
90
|
+
});
|
74
91
|
});
|
75
|
-
return (props)
|
92
|
+
return (props)=>/*#__PURE__*/ _jsx(TableColumnMenuFilterExt, {
|
93
|
+
...props,
|
94
|
+
filterUI: FilterUIWithValues,
|
95
|
+
expanded: true
|
96
|
+
});
|
76
97
|
}
|
98
|
+
|
77
99
|
//# sourceMappingURL=standard-filter-with-multiselect.js.map
|
package/dist/filters/standard-filter-with-multiselect/standard-filter-with-multiselect.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"
|
1
|
+
{"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/standard-filter-with-multiselect.tsx"],"sourcesContent":["import { FC } from 'react';\nimport { observer, useLocalStore } from 'mobx-react';\nimport { fromPromise } from 'mobx-utils';\n\nimport { DropDownList } from '@progress/kendo-react-dropdowns';\n\nimport { TableColumnMenuProps } from '@servicetitan/design-system';\nimport { GridColumnMenuFilterUIProps as TableColumnMenuFilterUIProps } from '@progress/kendo-react-grid/dist/npm/interfaces/GridColumnMenuFilterUIProps';\nimport { IdType } from '@servicetitan/data-query';\nimport { TableState } from '../../table-state';\n\nimport { TableColumnMenuFilterExt } from './table-column-menu-filter-ext';\nimport { FilterCellExt, FilterCellExtProps } from './filter-cell-ext';\n//\n\ntype AcceptableOption = string | number | { value: any; text: string };\n\ninterface OptionsConfig<T, TId extends IdType = never> {\n /* tableState is used to extract values set for multiselect */\n tableState?: TableState<T, TId>;\n /* values longer than maxExtractedLength wouldn't be extracted from tableState (for sanity). Default is 65 characters */\n maxExtractedLength?: number;\n /* set of values for multiselect */\n options?: AcceptableOption[];\n}\n\ninterface FilterCellConfig {\n /* maximum number of values to show in Multiselect dropdown list at one time */\n maxFoundValues?: number;\n /* allow user to input custom values; default: true */\n allowCustomValues?: boolean;\n /* convert user-added Multiselect options to numbers; default: false */\n handleCustomValuesAsNumber?: boolean;\n /* allow only \"Is [not] one of\" and \"Is [not] empty\" operators; default: false */\n onlyMultiselectAndEmptyOperators?: boolean;\n /* Multiselect itemRender property (for very special cases) */\n multiselectItemRender?: FilterCellExtProps['multiselectItemRender'];\n /* Multiselect tagRender property (for very special cases) */\n multiselectTagRender?: FilterCellExtProps['multiselectTagRender'];\n /* Multiselect listNoDataRender property (for very special cases) */\n multiselectListNoDataRender?: FilterCellExtProps['multiselectListNoDataRender'];\n}\n\n/*\n * StandardFilterWithMultiselect is like standard Kendo filter, but with additional operators 'Is one of' / 'Is not one of'.\n * Intended to be used with string fields (though it's possible to adopt for number fields as well, if someone will have a need).\n */\n\nexport function standardFilterWithMultiselect<T, TId extends IdType = never>(\n optionsConfig: OptionsConfig<T, TId> = {},\n filterCellConfig: FilterCellConfig = {}\n) {\n const optionsConfigFull = {\n maxExtractedLength: 64,\n options: [] as string[],\n ...optionsConfig,\n };\n\n const filterCellConfigFull = {\n allowCustomValues: true,\n maxFoundValues: 1000,\n ...filterCellConfig,\n };\n\n // Filter UI with data fetcher\n const FilterUIWithValues: FC<TableColumnMenuFilterUIProps> = observer(props => {\n const store = useLocalStore(\n oprops => ({\n get field() {\n return oprops.firstFilterProps.field as keyof T;\n },\n get itemsFromDataSource() {\n const dataSource = optionsConfigFull.tableState?.dataSource;\n return dataSource && this.field && fromPromise(dataSource.getData({}));\n },\n get valuesfromTableState(): AcceptableOption[] {\n if (\n !this.itemsFromDataSource ||\n !(this.itemsFromDataSource.state === 'fulfilled')\n ) {\n return [];\n }\n return (this.itemsFromDataSource.value.data as T[])\n .map(i => i[this.field])\n .filter(\n v =>\n typeof v === 'number' ||\n (typeof v === 'string' &&\n v.length > 0 &&\n v.length <= optionsConfigFull.maxExtractedLength)\n ) as any[];\n },\n get options() {\n return Array.from(\n new Set(this.valuesfromTableState.concat(optionsConfigFull.options))\n ).map(v => {\n switch (typeof v) {\n case 'string':\n return {\n value: v,\n text: v,\n textLC: v.toLowerCase(),\n };\n case 'number':\n return {\n value: v,\n text: v.toString(),\n textLC: v.toString().toLowerCase(),\n };\n case 'object':\n return {\n value: v.value,\n text: v.text,\n textLC: v.text.toLowerCase(),\n };\n default:\n throw 'Incompatible option type.';\n }\n });\n },\n }),\n props\n );\n\n const {\n firstFilterProps,\n secondFilterProps,\n hideSecondFilter,\n logicData,\n logicValue,\n onLogicChange,\n } = props;\n\n return (\n <div>\n <FilterCellExt\n {...firstFilterProps}\n options={store.options}\n {...filterCellConfigFull}\n />\n {!hideSecondFilter && (\n <div>\n <DropDownList\n data={logicData}\n value={logicValue}\n onChange={onLogicChange}\n className=\"k-filter-and m-b-1-i\"\n textField=\"text\"\n />\n <FilterCellExt\n {...secondFilterProps}\n options={store.options}\n {...filterCellConfigFull}\n />\n </div>\n )}\n </div>\n );\n });\n\n return (props: TableColumnMenuProps) => (\n <TableColumnMenuFilterExt {...props} filterUI={FilterUIWithValues} expanded />\n );\n}\n"],"names":["observer","useLocalStore","fromPromise","DropDownList","TableColumnMenuFilterExt","FilterCellExt","standardFilterWithMultiselect","optionsConfig","filterCellConfig","optionsConfigFull","maxExtractedLength","options","filterCellConfigFull","allowCustomValues","maxFoundValues","FilterUIWithValues","props","store","oprops","field","firstFilterProps","itemsFromDataSource","dataSource","tableState","getData","valuesfromTableState","state","value","data","map","i","filter","v","length","Array","from","Set","concat","text","textLC","toLowerCase","toString","secondFilterProps","hideSecondFilter","logicData","logicValue","onLogicChange","div","onChange","className","textField","filterUI","expanded"],"mappings":"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"}
|
@@ -4,17 +4,23 @@ import { getDefaultOperator } from '@progress/kendo-react-grid/dist/npm/filterCo
|
|
4
4
|
import { multiselectOperators } from './multiselect-operators';
|
5
5
|
// constructor override: if state.filterGroup was filled with default, we override it with new default
|
6
6
|
export class TableColumnMenuFilterExt extends TableColumnMenuFilter {
|
7
|
-
constructor(props)
|
8
|
-
var _a;
|
7
|
+
constructor(props){
|
9
8
|
super(props);
|
10
|
-
|
9
|
+
var _props_column_filter;
|
10
|
+
const defaultOperator = getDefaultOperator(props.filterOperators, (_props_column_filter = props.column.filter) !== null && _props_column_filter !== void 0 ? _props_column_filter : 'text');
|
11
11
|
// I know the check is a bit hacky, but that's compensated with its low criticality: even if it fails, nothing really bad happens
|
12
12
|
if (comparer.structural(this.state.filterGroup, {
|
13
13
|
logic: 'and',
|
14
14
|
filters: [
|
15
|
-
{
|
16
|
-
|
17
|
-
|
15
|
+
{
|
16
|
+
field: props.column.field,
|
17
|
+
operator: defaultOperator
|
18
|
+
},
|
19
|
+
{
|
20
|
+
field: props.column.field,
|
21
|
+
operator: defaultOperator
|
22
|
+
}
|
23
|
+
]
|
18
24
|
})) {
|
19
25
|
const newDefaultOperator = multiselectOperators[0].operator;
|
20
26
|
this.state = {
|
@@ -22,12 +28,19 @@ export class TableColumnMenuFilterExt extends TableColumnMenuFilter {
|
|
22
28
|
filterGroup: {
|
23
29
|
logic: 'and',
|
24
30
|
filters: [
|
25
|
-
{
|
26
|
-
|
27
|
-
|
28
|
-
|
31
|
+
{
|
32
|
+
field: props.column.field,
|
33
|
+
operator: newDefaultOperator
|
34
|
+
},
|
35
|
+
{
|
36
|
+
field: props.column.field,
|
37
|
+
operator: newDefaultOperator
|
38
|
+
}
|
39
|
+
]
|
40
|
+
}
|
29
41
|
};
|
30
42
|
}
|
31
43
|
}
|
32
44
|
}
|
45
|
+
|
33
46
|
//# sourceMappingURL=table-column-menu-filter-ext.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"
|
1
|
+
{"version":3,"sources":["../../../src/filters/standard-filter-with-multiselect/table-column-menu-filter-ext.tsx"],"sourcesContent":["import { comparer } from 'mobx';\n\nimport { TableColumnMenuFilter } from '@servicetitan/design-system';\nimport { GridColumnMenuFilterProps as TableColumnMenuFilterProps } from '@progress/kendo-react-grid/dist/npm/columnMenu/GridColumnMenuFilter';\nimport { getDefaultOperator } from '@progress/kendo-react-grid/dist/npm/filterCommon';\n\nimport { multiselectOperators } from './multiselect-operators';\n\n// constructor override: if state.filterGroup was filled with default, we override it with new default\nexport class TableColumnMenuFilterExt extends TableColumnMenuFilter {\n constructor(props: TableColumnMenuFilterProps) {\n super(props);\n\n const defaultOperator = getDefaultOperator(\n props.filterOperators,\n props.column.filter ?? 'text'\n );\n // I know the check is a bit hacky, but that's compensated with its low criticality: even if it fails, nothing really bad happens\n if (\n comparer.structural(this.state.filterGroup, {\n logic: 'and',\n filters: [\n { field: props.column.field, operator: defaultOperator },\n { field: props.column.field, operator: defaultOperator },\n ],\n })\n ) {\n const newDefaultOperator = multiselectOperators[0].operator;\n this.state = {\n ...this.state,\n filterGroup: {\n logic: 'and',\n filters: [\n { field: props.column.field, operator: newDefaultOperator },\n { field: props.column.field, operator: newDefaultOperator },\n ],\n },\n };\n }\n }\n}\n"],"names":["comparer","TableColumnMenuFilter","getDefaultOperator","multiselectOperators","TableColumnMenuFilterExt","constructor","props","defaultOperator","filterOperators","column","filter","structural","state","filterGroup","logic","filters","field","operator","newDefaultOperator"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,OAAO;AAEhC,SAASC,qBAAqB,QAAQ,8BAA8B;AAEpE,SAASC,kBAAkB,QAAQ,mDAAmD;AAEtF,SAASC,oBAAoB,QAAQ,0BAA0B;AAE/D,sGAAsG;AACtG,OAAO,MAAMC,iCAAiCH;IAC1CI,YAAYC,KAAiC,CAAE;QAC3C,KAAK,CAACA;YAIFA;QAFJ,MAAMC,kBAAkBL,mBACpBI,MAAME,eAAe,EACrBF,CAAAA,uBAAAA,MAAMG,MAAM,CAACC,MAAM,cAAnBJ,kCAAAA,uBAAuB;QAE3B,iIAAiI;QACjI,IACIN,SAASW,UAAU,CAAC,IAAI,CAACC,KAAK,CAACC,WAAW,EAAE;YACxCC,OAAO;YACPC,SAAS;gBACL;oBAAEC,OAAOV,MAAMG,MAAM,CAACO,KAAK;oBAAEC,UAAUV;gBAAgB;gBACvD;oBAAES,OAAOV,MAAMG,MAAM,CAACO,KAAK;oBAAEC,UAAUV;gBAAgB;aAC1D;QACL,IACF;YACE,MAAMW,qBAAqBf,oBAAoB,CAAC,EAAE,CAACc,QAAQ;YAC3D,IAAI,CAACL,KAAK,GAAG;gBACT,GAAG,IAAI,CAACA,KAAK;gBACbC,aAAa;oBACTC,OAAO;oBACPC,SAAS;wBACL;4BAAEC,OAAOV,MAAMG,MAAM,CAACO,KAAK;4BAAEC,UAAUC;wBAAmB;wBAC1D;4BAAEF,OAAOV,MAAMG,MAAM,CAACO,KAAK;4BAAEC,UAAUC;wBAAmB;qBAC7D;gBACL;YACJ;QACJ;IACJ;AACJ"}
|