@vuu-ui/vuu-filters 0.13.40 → 0.13.41
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/column-filter/ColumnFilter.js +4 -0
- package/cjs/column-filter/ColumnFilter.js.map +1 -1
- package/cjs/column-filter/useColumnFilter.js.map +1 -1
- package/cjs/filter-provider/FilterProvider.js +38 -58
- package/cjs/filter-provider/FilterProvider.js.map +1 -1
- package/cjs/filter-provider/filter-descriptor-utils.js +64 -0
- package/cjs/filter-provider/filter-descriptor-utils.js.map +1 -0
- package/esm/column-filter/ColumnFilter.js +4 -0
- package/esm/column-filter/ColumnFilter.js.map +1 -1
- package/esm/column-filter/useColumnFilter.js.map +1 -1
- package/esm/filter-provider/FilterProvider.js +38 -58
- package/esm/filter-provider/FilterProvider.js.map +1 -1
- package/esm/filter-provider/filter-descriptor-utils.js +58 -0
- package/esm/filter-provider/filter-descriptor-utils.js.map +1 -0
- package/package.json +12 -12
- package/types/column-filter/ColumnFilter.d.ts +2 -1
- package/types/column-filter/useColumnFilter.d.ts +1 -1
- package/types/filter-provider/FilterProvider.d.ts +1 -0
- package/types/filter-provider/filter-descriptor-utils.d.ts +7 -0
|
@@ -14,6 +14,7 @@ const classBase = "vuuColumnFilter";
|
|
|
14
14
|
const ColumnFilter = react.forwardRef(function ColumnFilter2({
|
|
15
15
|
column,
|
|
16
16
|
className,
|
|
17
|
+
minCharacterCountToTriggerSuggestions,
|
|
17
18
|
onCommit: onCommitProp,
|
|
18
19
|
operator = "=",
|
|
19
20
|
showOperatorPicker = false,
|
|
@@ -75,6 +76,9 @@ const ColumnFilter = react.forwardRef(function ColumnFilter2({
|
|
|
75
76
|
] }) : null,
|
|
76
77
|
vuuDataReact.getDataItemEditControl({
|
|
77
78
|
InputProps: { inputProps },
|
|
79
|
+
TypeaheadProps: {
|
|
80
|
+
minCharacterCountToTriggerSuggestions
|
|
81
|
+
},
|
|
78
82
|
commitOnBlur: false,
|
|
79
83
|
commitWhenCleared: true,
|
|
80
84
|
dataDescriptor: column,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, ReactElement } from \"react\";\nimport { ColumnFilterHookProps, useColumnFilter } from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n ColumnFilterHookProps {\n /**\n * Display operator picker.\n */\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n}\n\nexport const ColumnFilter = forwardRef(function ColumnFilter(\n {\n column,\n className,\n onCommit: onCommitProp,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n ...buttonGroupProps\n }: ColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-column-filter\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n const {\n op,\n allowedOperators,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n onCommit,\n onCommitRange,\n } = useColumnFilter({\n onCommit: onCommitProp,\n operator,\n column,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n });\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {op}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n {allowedOperators.map((allowedOp) => (\n <MenuItem\n key={`allowedOp`}\n onClick={() => handleOperatorChange(allowedOp)}\n >\n {allowedOp}\n </MenuItem>\n ))}\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n InputProps: { inputProps },\n commitOnBlur: false,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n commitWhenCleared: true,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: onCommitRange,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n}) as (\n props: ColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<ColumnFilterProps>;\n"],"names":["forwardRef","ColumnFilter","useWindow","useComponentCssInjection","columnFilterCss","useColumnFilter","jsxs","SegmentedButtonGroup","Menu","jsx","MenuTrigger","Button","MenuPanel","MenuItem","getDataItemEditControl"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, ReactElement } from \"react\";\nimport { ColumnFilterHookProps, useColumnFilter } from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { VuuTypeaheadInputHookProps } from \"@vuu-ui/vuu-ui-controls/src/vuu-typeahead-input/useVuuTypeaheadInput\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n Pick<VuuTypeaheadInputHookProps, \"minCharacterCountToTriggerSuggestions\">,\n ColumnFilterHookProps {\n /**\n * Display operator picker.\n */\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n}\n\nexport const ColumnFilter = forwardRef(function ColumnFilter(\n {\n column,\n className,\n minCharacterCountToTriggerSuggestions,\n onCommit: onCommitProp,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n ...buttonGroupProps\n }: ColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-column-filter\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n const {\n op,\n allowedOperators,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n onCommit,\n onCommitRange,\n } = useColumnFilter({\n onCommit: onCommitProp,\n operator,\n column,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n });\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {op}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n {allowedOperators.map((allowedOp) => (\n <MenuItem\n key={`allowedOp`}\n onClick={() => handleOperatorChange(allowedOp)}\n >\n {allowedOp}\n </MenuItem>\n ))}\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n InputProps: { inputProps },\n TypeaheadProps: {\n minCharacterCountToTriggerSuggestions,\n },\n commitOnBlur: false,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n commitWhenCleared: true,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: onCommitRange,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n}) as (\n props: ColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<ColumnFilterProps>;\n"],"names":["forwardRef","ColumnFilter","useWindow","useComponentCssInjection","columnFilterCss","useColumnFilter","jsxs","SegmentedButtonGroup","Menu","jsx","MenuTrigger","Button","MenuPanel","MenuItem","getDataItemEditControl"],"mappings":";;;;;;;;;;;;AAoBA,MAAM,SAAY,GAAA,iBAAA;AAgBL,MAAA,YAAA,GAAeA,gBAAW,CAAA,SAASC,aAC9C,CAAA;AAAA,EACE,MAAA;AAAA,EACA,SAAA;AAAA,EACA,qCAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,QAAW,GAAA,GAAA;AAAA,EACX,kBAAqB,GAAA,KAAA;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA,yBAAA;AAAA,EACA,GAAG;AACL,CAAA,EACAD,WACA,EAAA;AACA,EAAA,MAAM,eAAeE,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,cAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,EAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,oBAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACEC,+BAAgB,CAAA;AAAA,IAClB,QAAU,EAAA,YAAA;AAAA,IACV,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EACE,uBAAAC,eAAA;AAAA,IAACC,yBAAA;AAAA,IAAA;AAAA,MACE,GAAG,gBAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAKP,EAAAA,WAAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,QACC,kBAAA,mBAAAM,eAAA,CAACE,SAAK,EAAA,EAAA,SAAA,EAAU,cACd,EAAA,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACC,gBACC,EAAA,EAAA,QAAA,kBAAAD,cAAA;AAAA,YAACE,WAAA;AAAA,YAAA;AAAA,cACC,UAAW,EAAA,OAAA;AAAA,cACX,YAAW,EAAA,WAAA;AAAA,cACX,SAAA,EAAW,GAAG,SAAS,CAAA,QAAA,CAAA;AAAA,cACvB,eAAa,EAAA,IAAA;AAAA,cACb,SAAU,EAAA,SAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WAEL,EAAA,CAAA;AAAA,0BACCF,cAAA,CAAAG,cAAA,EAAA,EACE,QAAiB,EAAA,gBAAA,CAAA,GAAA,CAAI,CAAC,SACrB,qBAAAH,cAAA;AAAA,YAACI,aAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,MAAM,oBAAA,CAAqB,SAAS,CAAA;AAAA,cAE5C,QAAA,EAAA;AAAA,aAAA;AAAA,YAHI,CAAA,SAAA;AAAA,WAKR,CACH,EAAA;AAAA,SAAA,EACF,CACE,GAAA,IAAA;AAAA,QACHC,mCAAuB,CAAA;AAAA,UACtB,UAAA,EAAY,EAAE,UAAW,EAAA;AAAA,UACzB,cAAgB,EAAA;AAAA,YACd;AAAA,WACF;AAAA,UACA,YAAc,EAAA,KAAA;AAAA,UACd,iBAAmB,EAAA,IAAA;AAAA,UACnB,cAAgB,EAAA,MAAA;AAAA,UAChB,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACA,EAAA,KAAO,YACJA,mCAAuB,CAAA;AAAA,UACrB,SAAA,EAAW,GAAG,SAAS,CAAA,UAAA,CAAA;AAAA,UACvB,iBAAmB,EAAA,IAAA;AAAA,UACnB,UAAA,EAAY,EAAE,UAAA,EAAY,eAAgB,EAAA;AAAA,UAC1C,cAAgB,EAAA,MAAA;AAAA,UAChB,QAAU,EAAA,aAAA;AAAA,UACV;AAAA,SACD,CACD,GAAA;AAAA;AAAA;AAAA,GACN;AAEJ,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import {\n ColumnFilterChangeHandler,\n ColumnFilterOp,\n ColumnFilterValue,\n FilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ChangeEventHandler, useCallback, useMemo, useState } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport { VuuTypeaheadInputProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { getOperators } from \"../filter-clause/operator-utils\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n) => {\n if (op !== \"between\" && !allowedOperators.includes(op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport type ColumnFilterCommitHandler = (\n column: ColumnDescriptor,\n op: FilterClauseOp | \"between\",\n value: ColumnFilterValue,\n) => void;\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: ColumnFilterOp,\n value?: ColumnFilterValue,\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value) || value.length !== 2) {\n throw Error(\n `[useColumnFilter] between operator requires array of two values, received ${value}`,\n );\n } else if (\n value[0] !== undefined &&\n value[1] !== undefined &&\n typeof value[0] !== typeof value[1]\n ) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport type ColumnFilterHookProps = {\n column: ColumnDescriptor;\n operator?: ColumnFilterOp;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value
|
|
1
|
+
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import {\n ColumnFilterChangeHandler,\n ColumnFilterOp,\n ColumnFilterValue,\n FilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ChangeEventHandler, useCallback, useMemo, useState } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport { VuuTypeaheadInputProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { getOperators } from \"../filter-clause/operator-utils\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n) => {\n if (op !== \"between\" && !allowedOperators.includes(op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport type ColumnFilterCommitHandler = (\n column: ColumnDescriptor,\n op: FilterClauseOp | \"between\",\n value: ColumnFilterValue,\n) => void;\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: ColumnFilterOp,\n value?: ColumnFilterValue,\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value) || value.length !== 2) {\n throw Error(\n `[useColumnFilter] between operator requires array of two values, received ${value}`,\n );\n } else if (\n value[0] !== undefined &&\n value[1] !== undefined &&\n typeof value[0] !== typeof value[1]\n ) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport type ColumnFilterHookProps = {\n column: ColumnDescriptor;\n operator?: ColumnFilterOp;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value: ColumnFilterValue;\n /**\n * Filter change events.\n */\n onColumnFilterChange?: ColumnFilterChangeHandler;\n /**\n * Filter change events on second control in range filter\n */\n onColumnRangeFilterChange?: ColumnFilterChangeHandler;\n /**\n * Called when user 'commits' filter value, either by pressing enter,\n * tabbing away from control or making selection from list\n */\n onCommit: ColumnFilterCommitHandler;\n};\n\nexport const useColumnFilter = ({\n onCommit,\n operator = \"=\",\n value,\n column,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n}: ColumnFilterHookProps) => {\n const [op, setOp] = useState(operator);\n const allowedOperators = useMemo(() => getOperators(column), [column]);\n\n useMemo(() => {\n assertValidOperator(allowedOperators, column, operator);\n assertValidValue(column, op, value);\n }, [allowedOperators, column, operator, op, value]);\n\n const handleOperatorChange = useCallback((changedOp: ColumnFilterOp) => {\n setOp(changedOp);\n }, []);\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (_e, newValue) => {\n if (Array.isArray(value)) {\n onCommit?.(column, op, [`${newValue}`, value[1]]);\n } else {\n onCommit?.(column, op, `${newValue}`);\n }\n },\n [value, onCommit, column, op],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (_e, newValue) => {\n const [firstValue] = value as [string, string];\n onCommit?.(column, op, [firstValue, `${newValue}`]);\n },\n [onCommit, column, op, value],\n );\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n onColumnFilterChange?.(e.target.value, column, op);\n },\n [onColumnFilterChange, column, op],\n );\n\n const handleRangeInputChange = useCallback<\n ChangeEventHandler<HTMLInputElement>\n >(\n (e) => {\n onColumnRangeFilterChange?.(e.target.value, column, op);\n },\n [onColumnRangeFilterChange, column, op],\n );\n\n const inputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(value) ? value[0] : value,\n }),\n [handleInputChange, value],\n );\n\n const rangeInputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () =>\n Array.isArray(value)\n ? {\n onChange: handleRangeInputChange,\n value: value[1],\n }\n : undefined,\n [handleRangeInputChange, value],\n );\n\n return {\n op,\n allowedOperators,\n inputProps,\n rangeInputProps,\n onCommit: handleCommit,\n onCommitRange: handleRangeCommit,\n handleOperatorChange,\n };\n};\n"],"names":["useState","useMemo","getOperators","useCallback"],"mappings":"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"}
|
|
@@ -4,13 +4,18 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var FilterNamePrompt = require('../saved-filters/FilterNamePrompt.js');
|
|
6
6
|
var DeleteFilterPrompt = require('../saved-filters/DeleteFilterPrompt.js');
|
|
7
|
+
var filterDescriptorUtils = require('./filter-descriptor-utils.js');
|
|
7
8
|
|
|
9
|
+
const UNSAVED_FILTER = "unsaved-filter";
|
|
8
10
|
const FilterContext = react.createContext({
|
|
9
11
|
activeFilter: void 0,
|
|
10
12
|
savedFilters: [],
|
|
11
13
|
onApplyFilter: () => console.warn(
|
|
12
14
|
"[FilterContext] onApplyFilter, no FilterProvider has been configured"
|
|
13
15
|
),
|
|
16
|
+
deleteFilter: () => console.warn(
|
|
17
|
+
"[FilterContext] deleteFilter, no FilterProvider has been configured"
|
|
18
|
+
),
|
|
14
19
|
saveFilter: () => console.warn(
|
|
15
20
|
"[FilterContext] saveFilter, no FilterProvider has been configured"
|
|
16
21
|
),
|
|
@@ -28,19 +33,6 @@ const FilterProvider = ({
|
|
|
28
33
|
const handleApplyFilter = react.useCallback(() => {
|
|
29
34
|
console.log("filter changed");
|
|
30
35
|
}, []);
|
|
31
|
-
const findFilter = react.useCallback(
|
|
32
|
-
(filterId) => {
|
|
33
|
-
const filter = filterDescriptors.find(({ id }) => id === filterId);
|
|
34
|
-
if (filter) {
|
|
35
|
-
return filter;
|
|
36
|
-
} else {
|
|
37
|
-
throw Error(
|
|
38
|
-
`[FilterProvider] findFilter, filter not found ${filterId}`
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
},
|
|
42
|
-
[filterDescriptors]
|
|
43
|
-
);
|
|
44
36
|
const deleteFilter = react.useCallback(
|
|
45
37
|
(filterId) => {
|
|
46
38
|
setFilterDescriptors((filterDescriptors2) => {
|
|
@@ -53,22 +45,14 @@ const FilterProvider = ({
|
|
|
53
45
|
},
|
|
54
46
|
[onFiltersSaved]
|
|
55
47
|
);
|
|
56
|
-
const
|
|
57
|
-
(filterId,
|
|
48
|
+
const applyNewName = react.useCallback(
|
|
49
|
+
(filterId, name) => {
|
|
58
50
|
setFilterDescriptors((currentFilterDescriptors) => {
|
|
59
|
-
const newFilterDescriptors =
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
...f.filter,
|
|
65
|
-
name: filterName
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
} else {
|
|
69
|
-
return f;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
51
|
+
const newFilterDescriptors = filterDescriptorUtils.renameFilter(
|
|
52
|
+
currentFilterDescriptors,
|
|
53
|
+
filterId,
|
|
54
|
+
name
|
|
55
|
+
);
|
|
72
56
|
onFiltersSaved?.(newFilterDescriptors);
|
|
73
57
|
return newFilterDescriptors;
|
|
74
58
|
});
|
|
@@ -88,14 +72,14 @@ const FilterProvider = ({
|
|
|
88
72
|
onConfirm: (name) => {
|
|
89
73
|
setDialog(null);
|
|
90
74
|
if (originalFilterName !== name) {
|
|
91
|
-
|
|
75
|
+
applyNewName(id, name);
|
|
92
76
|
}
|
|
93
77
|
}
|
|
94
78
|
}
|
|
95
79
|
)
|
|
96
80
|
);
|
|
97
81
|
},
|
|
98
|
-
[
|
|
82
|
+
[applyNewName]
|
|
99
83
|
);
|
|
100
84
|
const promptForConfirmationOfDelete = react.useCallback(
|
|
101
85
|
(filterDescriptor) => {
|
|
@@ -117,22 +101,26 @@ const FilterProvider = ({
|
|
|
117
101
|
);
|
|
118
102
|
const handleFilterMenuAction = react.useCallback(
|
|
119
103
|
(filterId, actionType) => {
|
|
120
|
-
const targetFilter = findFilter(filterId);
|
|
104
|
+
const targetFilter = filterDescriptorUtils.findFilter(filterDescriptors, filterId);
|
|
121
105
|
switch (actionType) {
|
|
122
106
|
case "close":
|
|
123
|
-
console.log(`
|
|
107
|
+
console.log(`close filter ${filterId}`);
|
|
124
108
|
break;
|
|
125
109
|
case "edit":
|
|
126
110
|
console.log(`edit filter ${filterId}`);
|
|
127
111
|
break;
|
|
128
112
|
case "remove":
|
|
129
|
-
|
|
113
|
+
if (filterId === UNSAVED_FILTER) {
|
|
114
|
+
console.log("remove unsaved filter");
|
|
115
|
+
} else {
|
|
116
|
+
promptForConfirmationOfDelete(targetFilter);
|
|
117
|
+
}
|
|
130
118
|
break;
|
|
131
119
|
case "rename":
|
|
132
120
|
return PromptForFilterName(targetFilter);
|
|
133
121
|
}
|
|
134
122
|
},
|
|
135
|
-
[
|
|
123
|
+
[filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName]
|
|
136
124
|
);
|
|
137
125
|
const handleSaveFilter = react.useCallback(
|
|
138
126
|
(filterDescriptor) => {
|
|
@@ -146,30 +134,21 @@ const FilterProvider = ({
|
|
|
146
134
|
},
|
|
147
135
|
[onFiltersSaved]
|
|
148
136
|
);
|
|
149
|
-
const setActiveFilter = react.useCallback(
|
|
150
|
-
(
|
|
151
|
-
setFilterDescriptors(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
} else {
|
|
165
|
-
return f;
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
return newFilterDescriptors;
|
|
169
|
-
});
|
|
170
|
-
},
|
|
171
|
-
[findFilter]
|
|
172
|
-
);
|
|
137
|
+
const setActiveFilter = react.useCallback((filter) => {
|
|
138
|
+
if (typeof filter === "string") {
|
|
139
|
+
setFilterDescriptors(
|
|
140
|
+
(currentFilterDescriptors) => filterDescriptorUtils.activateFilter(currentFilterDescriptors, filter)
|
|
141
|
+
);
|
|
142
|
+
} else if (filter) {
|
|
143
|
+
setFilterDescriptors(
|
|
144
|
+
(currentFilterDescriptors) => filterDescriptorUtils.insertOrReplaceFilter(currentFilterDescriptors, {
|
|
145
|
+
active: true,
|
|
146
|
+
filter,
|
|
147
|
+
id: UNSAVED_FILTER
|
|
148
|
+
})
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}, []);
|
|
173
152
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
174
153
|
FilterContext.Provider,
|
|
175
154
|
{
|
|
@@ -177,6 +156,7 @@ const FilterProvider = ({
|
|
|
177
156
|
activeFilter: filterDescriptors.find((f) => f.active),
|
|
178
157
|
onApplyFilter: handleApplyFilter,
|
|
179
158
|
onFilterMenuAction: handleFilterMenuAction,
|
|
159
|
+
deleteFilter,
|
|
180
160
|
saveFilter: handleSaveFilter,
|
|
181
161
|
savedFilters: filterDescriptors,
|
|
182
162
|
setActiveFilter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import { FilterChangeHandler } from \"@vuu-ui/vuu-filter-types\";\nimport {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterDescriptor } from \"../saved-filters/useSavedFilterPanel\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\n\nexport interface FilterContextProps {\n activeFilter: FilterDescriptor | undefined;\n saveFilter: (filter: FilterDescriptor) => void;\n savedFilters?: FilterDescriptor[];\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setActiveFilter: (filterId?: string) => void;\n}\n\nexport const FilterContext = createContext<FilterContextProps>({\n activeFilter: undefined,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setActiveFilter: () =>\n console.warn(\n \"[FilterContext] setActiveFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"activeFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (filterDescriptors: FilterDescriptor[]) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const findFilter = useCallback(\n (filterId: string) => {\n const filter = filterDescriptors.find(({ id }) => id === filterId);\n if (filter) {\n return filter;\n } else {\n throw Error(\n `[FilterProvider] findFilter, filter not found ${filterId}`,\n );\n }\n },\n [filterDescriptors],\n );\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const renameFilter = useCallback(\n (filterId: string, filterName: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors =\n currentFilterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterId) {\n return {\n ...f,\n filter: {\n ...f.filter,\n name: filterName,\n },\n };\n } else {\n return f;\n }\n });\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterDescriptor) => {\n const originalFilterName = filter.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n renameFilter(id, name);\n }\n }}\n />,\n );\n },\n [renameFilter],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setDialog(\n <DeleteFilterPrompt\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType) => {\n const targetFilter = findFilter(filterId);\n switch (actionType) {\n case \"close\":\n console.log(`clode filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n promptForConfirmationOfDelete(targetFilter);\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [findFilter, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptor.active\n ? filterDescriptors\n .map((filterDescriptor) =>\n filterDescriptor.active\n ? { ...filterDescriptor, active: false }\n : filterDescriptor,\n )\n .concat(filterDescriptor)\n : filterDescriptors.concat(filterDescriptor);\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const setActiveFilter = useCallback(\n (filterId?: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const targetFilter = filterId ? findFilter(filterId) : undefined;\n const newFilterDescriptors =\n currentFilterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterId) {\n return {\n ...f,\n active: !f.active,\n };\n } else if (!targetFilter?.active && f.active) {\n return {\n ...f,\n active: false,\n };\n } else {\n return f;\n }\n });\n return newFilterDescriptors;\n });\n },\n [findFilter],\n );\n\n return (\n <FilterContext.Provider\n value={{\n activeFilter: filterDescriptors.find((f) => f.active),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors,\n setActiveFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n\nexport function useActiveFilter() {\n const { activeFilter, onApplyFilter } = useContext(FilterContext);\n return { activeFilter, onApplyFilter };\n}\n\nexport function useSavedFilters() {\n const {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n } = useContext(FilterContext);\n return {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n };\n}\n"],"names":["createContext","useState","useCallback","filterDescriptors","jsx","FilterNamePrompt","DeleteFilterPrompt","filterDescriptor","jsxs","useContext"],"mappings":";;;;;;;AAuBO,MAAM,gBAAgBA,mBAAkC,CAAA;AAAA,EAC7D,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,cAAc,EAAC;AAAA,EACf,aAAA,EAAe,MACb,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,UAAA,EAAY,MACV,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,eAAA,EAAiB,MACf,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA;AAEN,CAAC;AAEM,MAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAe;AACjB,CAGM,KAAA;AACJ,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIC,eAAS,YAAY,CAAA;AACvE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAA8B,IAAI,CAAA;AAE9D,EAAM,MAAA,iBAAA,GAAoBC,kBAAiC,MAAM;AAC/D,IAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAAA,GAC9B,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAa,GAAAA,iBAAA;AAAA,IACjB,CAAC,QAAqB,KAAA;AACpB,MAAM,MAAA,MAAA,GAAS,kBAAkB,IAAK,CAAA,CAAC,EAAE,EAAG,EAAA,KAAM,OAAO,QAAQ,CAAA;AACjE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAO,OAAA,MAAA;AAAA,OACF,MAAA;AACL,QAAM,MAAA,KAAA;AAAA,UACJ,iDAAiD,QAAQ,CAAA;AAAA,SAC3D;AAAA;AACF,KACF;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,MAAM,YAAe,GAAAA,iBAAA;AAAA,IACnB,CAAC,QAAqB,KAAA;AACpB,MAAA,oBAAA,CAAqB,CAACC,kBAAsB,KAAA;AAC1C,QAAA,MAAM,uBAAuBA,kBAAkB,CAAA,MAAA;AAAA,UAC7C,CAAC,EAAE,EAAG,EAAA,KAAM,EAAO,KAAA;AAAA,SACrB;AACA,QAAA,cAAA,GAAiB,oBAAoB,CAAA;AACrC,QAAO,OAAA,oBAAA;AAAA,OACR,CAAA;AAAA,KACH;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,YAAe,GAAAD,iBAAA;AAAA,IACnB,CAAC,UAAkB,UAAuB,KAAA;AACxC,MAAA,oBAAA,CAAqB,CAAC,wBAA6B,KAAA;AACjD,QAAA,MAAM,oBACJ,GAAA,wBAAA,CAAyB,GAAsB,CAAA,CAAC,CAAM,KAAA;AACpD,UAAI,IAAA,CAAA,CAAE,OAAO,QAAU,EAAA;AACrB,YAAO,OAAA;AAAA,cACL,GAAG,CAAA;AAAA,cACH,MAAQ,EAAA;AAAA,gBACN,GAAG,CAAE,CAAA,MAAA;AAAA,gBACL,IAAM,EAAA;AAAA;AACR,aACF;AAAA,WACK,MAAA;AACL,YAAO,OAAA,CAAA;AAAA;AACT,SACD,CAAA;AACH,QAAA,cAAA,GAAiB,oBAAoB,CAAA;AACrC,QAAO,OAAA,oBAAA;AAAA,OACR,CAAA;AAAA,KACH;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,mBAAsB,GAAAA,iBAAA;AAAA,IAC1B,CAAC,EAAE,MAAQ,EAAA,EAAA,EAA2B,KAAA;AACpC,MAAM,MAAA,kBAAA,GAAqB,OAAO,IAAQ,IAAA,EAAA;AAC1C,MAAA,SAAA;AAAA,wBACEE,cAAA;AAAA,UAACC,iCAAA;AAAA,UAAA;AAAA,YACC,YAAY,MAAO,CAAA,IAAA;AAAA,YACnB,KAAM,EAAA,eAAA;AAAA,YACN,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,YAC7B,SAAA,EAAW,CAAC,IAAS,KAAA;AACnB,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAA,IAAI,uBAAuB,IAAM,EAAA;AAC/B,gBAAA,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA;AACvB;AACF;AAAA;AACF,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,6BAAgC,GAAAH,iBAAA;AAAA,IACpC,CAAC,gBAAuC,KAAA;AACtC,MAAA,SAAA;AAAA,wBACEE,cAAA;AAAA,UAACE,qCAAA;AAAA,UAAA;AAAA,YACC,gBAAA;AAAA,YACA,WAAW,MAAM;AACf,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAA,YAAA,CAAa,iBAAiB,EAAE,CAAA;AAAA,aAClC;AAAA,YACA,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI;AAAA;AAAA;AAC/B,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,sBAAyB,GAAAJ,iBAAA;AAAA,IAC7B,CAAC,UAAU,UAAe,KAAA;AACxB,MAAM,MAAA,YAAA,GAAe,WAAW,QAAQ,CAAA;AACxC,MAAA,QAAQ,UAAY;AAAA,QAClB,KAAK,OAAA;AACH,UAAQ,OAAA,CAAA,GAAA,CAAI,CAAgB,aAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACtC,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAQ,OAAA,CAAA,GAAA,CAAI,CAAe,YAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACrC,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,6BAAA,CAA8B,YAAY,CAAA;AAC1C,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,OAAO,oBAAoB,YAAY,CAAA;AAAA;AAC3C,KACF;AAAA,IACA,CAAC,UAAY,EAAA,6BAAA,EAA+B,mBAAmB;AAAA,GACjE;AAEA,EAAA,MAAM,gBAAmB,GAAAA,iBAAA;AAAA,IACvB,CAAC,gBAAuC,KAAA;AACtC,MAAA,oBAAA,CAAqB,CAACC,kBAAsB,KAAA;AAC1C,QAAM,MAAA,oBAAA,GAAuB,gBAAiB,CAAA,MAAA,GAC1CA,kBACG,CAAA,GAAA;AAAA,UAAI,CAACI,sBACJA,iBAAiB,CAAA,MAAA,GACb,EAAE,GAAGA,iBAAAA,EAAkB,MAAQ,EAAA,KAAA,EAC/BA,GAAAA;AAAA,UAEL,MAAO,CAAA,gBAAgB,CAC1BJ,GAAAA,kBAAAA,CAAkB,OAAO,gBAAgB,CAAA;AAC7C,QAAA,cAAA,GAAiB,oBAAoB,CAAA;AACrC,QAAO,OAAA,oBAAA;AAAA,OACR,CAAA;AAAA,KACH;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,eAAkB,GAAAD,iBAAA;AAAA,IACtB,CAAC,QAAsB,KAAA;AACrB,MAAA,oBAAA,CAAqB,CAAC,wBAA6B,KAAA;AACjD,QAAA,MAAM,YAAe,GAAA,QAAA,GAAW,UAAW,CAAA,QAAQ,CAAI,GAAA,KAAA,CAAA;AACvD,QAAA,MAAM,oBACJ,GAAA,wBAAA,CAAyB,GAAsB,CAAA,CAAC,CAAM,KAAA;AACpD,UAAI,IAAA,CAAA,CAAE,OAAO,QAAU,EAAA;AACrB,YAAO,OAAA;AAAA,cACL,GAAG,CAAA;AAAA,cACH,MAAA,EAAQ,CAAC,CAAE,CAAA;AAAA,aACb;AAAA,WACS,MAAA,IAAA,CAAC,YAAc,EAAA,MAAA,IAAU,EAAE,MAAQ,EAAA;AAC5C,YAAO,OAAA;AAAA,cACL,GAAG,CAAA;AAAA,cACH,MAAQ,EAAA;AAAA,aACV;AAAA,WACK,MAAA;AACL,YAAO,OAAA,CAAA;AAAA;AACT,SACD,CAAA;AACH,QAAO,OAAA,oBAAA;AAAA,OACR,CAAA;AAAA,KACH;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EACE,uBAAAM,eAAA;AAAA,IAAC,aAAc,CAAA,QAAA;AAAA,IAAd;AAAA,MACC,KAAO,EAAA;AAAA,QACL,cAAc,iBAAkB,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,QACpD,aAAe,EAAA,iBAAA;AAAA,QACf,kBAAoB,EAAA,sBAAA;AAAA,QACpB,UAAY,EAAA,gBAAA;AAAA,QACZ,YAAc,EAAA,iBAAA;AAAA,QACd;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,eAAkB,GAAA;AAChC,EAAA,MAAM,EAAE,YAAA,EAAc,aAAc,EAAA,GAAIC,iBAAW,aAAa,CAAA;AAChE,EAAO,OAAA,EAAE,cAAc,aAAc,EAAA;AACvC;AAEO,SAAS,eAAkB,GAAA;AAChC,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAIA,iBAAW,aAAa,CAAA;AAC5B,EAAO,OAAA;AAAA,IACL,YAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import { Filter, FilterChangeHandler } from \"@vuu-ui/vuu-filter-types\";\nimport {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterDescriptor } from \"../saved-filters/useSavedFilterPanel\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\n\nconst UNSAVED_FILTER = \"unsaved-filter\";\n\nexport interface FilterContextProps {\n activeFilter: FilterDescriptor | undefined;\n deleteFilter: (filterId: string) => void;\n saveFilter: (filter: FilterDescriptor) => void;\n savedFilters?: FilterDescriptor[];\n // TODO do we need this ?\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setActiveFilter: (filterId?: string) => void;\n}\n\nexport const FilterContext = createContext<FilterContextProps>({\n activeFilter: undefined,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setActiveFilter: () =>\n console.warn(\n \"[FilterContext] setActiveFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"activeFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (filterDescriptors: FilterDescriptor[]) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const applyNewName = useCallback(\n (filterId: string, name: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors = renameFilter(\n currentFilterDescriptors,\n filterId,\n name,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterDescriptor) => {\n const originalFilterName = filter.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setDialog(\n <DeleteFilterPrompt\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType) => {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(targetFilter);\n }\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptor.active\n ? filterDescriptors\n .map((filterDescriptor) =>\n filterDescriptor.active\n ? { ...filterDescriptor, active: false }\n : filterDescriptor,\n )\n .concat(filterDescriptor)\n : filterDescriptors.concat(filterDescriptor);\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n /**\n * Allows switching between saved filtere. ALternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setActiveFilter = useCallback((filter?: string | Filter) => {\n if (typeof filter === \"string\") {\n setFilterDescriptors((currentFilterDescriptors) =>\n activateFilter(currentFilterDescriptors, filter),\n );\n } else if (filter) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n }),\n );\n }\n }, []);\n\n return (\n <FilterContext.Provider\n value={{\n activeFilter: filterDescriptors.find((f) => f.active),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors,\n setActiveFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n\nexport function useActiveFilter() {\n const { activeFilter, onApplyFilter } = useContext(FilterContext);\n return { activeFilter, onApplyFilter };\n}\n\nexport function useSavedFilters() {\n const {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n } = useContext(FilterContext);\n return {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n };\n}\n"],"names":["createContext","useState","useCallback","filterDescriptors","renameFilter","jsx","FilterNamePrompt","DeleteFilterPrompt","findFilter","filterDescriptor","activateFilter","insertOrReplaceFilter","jsxs","useContext"],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function findFilter(filterDescriptors, filterId, throwIfNotFound = true) {
|
|
4
|
+
const filter = filterDescriptors.find(({ id }) => id === filterId);
|
|
5
|
+
if (filter) {
|
|
6
|
+
return filter;
|
|
7
|
+
} else if (throwIfNotFound) {
|
|
8
|
+
throw Error(`[FilterProvider] findFilter, filter not found ${filterId}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const deactivateFilter = (filterDescriptors) => activateFilter(filterDescriptors, void 0);
|
|
12
|
+
const activateFilter = (filterDescriptors, activeFilterId) => filterDescriptors.map((f) => {
|
|
13
|
+
if (f.id === activeFilterId) {
|
|
14
|
+
return {
|
|
15
|
+
...f,
|
|
16
|
+
active: !f.active
|
|
17
|
+
};
|
|
18
|
+
} else if (f.active) {
|
|
19
|
+
return {
|
|
20
|
+
...f,
|
|
21
|
+
active: false
|
|
22
|
+
};
|
|
23
|
+
} else {
|
|
24
|
+
return f;
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
const insertOrReplaceFilter = (filterDescriptors, filterDescriptor) => {
|
|
28
|
+
if (!filterDescriptors.some(({ id }) => id === filterDescriptor.id)) {
|
|
29
|
+
return deactivateFilter(filterDescriptors).concat(filterDescriptor);
|
|
30
|
+
} else {
|
|
31
|
+
return filterDescriptors.map((f) => {
|
|
32
|
+
if (f.id === filterDescriptor.id) {
|
|
33
|
+
return filterDescriptor;
|
|
34
|
+
} else if (f.active) {
|
|
35
|
+
return {
|
|
36
|
+
...f,
|
|
37
|
+
active: false
|
|
38
|
+
};
|
|
39
|
+
} else {
|
|
40
|
+
return f;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const renameFilter = (filterDescriptors, filterId, name) => filterDescriptors.map((f) => {
|
|
46
|
+
if (f.id === filterId) {
|
|
47
|
+
return {
|
|
48
|
+
...f,
|
|
49
|
+
filter: {
|
|
50
|
+
...f.filter,
|
|
51
|
+
name
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
} else {
|
|
55
|
+
return f;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
exports.activateFilter = activateFilter;
|
|
60
|
+
exports.deactivateFilter = deactivateFilter;
|
|
61
|
+
exports.findFilter = findFilter;
|
|
62
|
+
exports.insertOrReplaceFilter = insertOrReplaceFilter;
|
|
63
|
+
exports.renameFilter = renameFilter;
|
|
64
|
+
//# sourceMappingURL=filter-descriptor-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-descriptor-utils.js","sources":["../../../../packages/vuu-filters/src/filter-provider/filter-descriptor-utils.ts"],"sourcesContent":["import { FilterDescriptor } from \"../saved-filters/useSavedFilterPanel\";\n\nexport function findFilter(\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n throwIfNotFound?: true,\n): FilterDescriptor;\nexport function findFilter(\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n throwIfNotFound: false,\n): FilterDescriptor | undefined;\nexport function findFilter(\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n throwIfNotFound = true,\n) {\n const filter = filterDescriptors.find(({ id }) => id === filterId);\n if (filter) {\n return filter;\n } else if (throwIfNotFound) {\n throw Error(`[FilterProvider] findFilter, filter not found ${filterId}`);\n }\n}\n\nexport const deactivateFilter = (filterDescriptors: FilterDescriptor[]) =>\n activateFilter(filterDescriptors, undefined);\n\nexport const activateFilter = (\n filterDescriptors: FilterDescriptor[],\n activeFilterId?: string,\n) =>\n filterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === activeFilterId) {\n return {\n ...f,\n active: !f.active,\n };\n } else if (f.active) {\n return {\n ...f,\n active: false,\n };\n } else {\n return f;\n }\n });\n\nexport const insertOrReplaceFilter = (\n filterDescriptors: FilterDescriptor[],\n filterDescriptor: FilterDescriptor,\n) => {\n if (!filterDescriptors.some(({ id }) => id === filterDescriptor.id)) {\n return deactivateFilter(filterDescriptors).concat(filterDescriptor);\n } else {\n return filterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterDescriptor.id) {\n return filterDescriptor;\n } else if (f.active) {\n return {\n ...f,\n active: false,\n };\n } else {\n return f;\n }\n });\n }\n};\n\nexport const renameFilter = (\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n name: string,\n) =>\n filterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterId) {\n return {\n ...f,\n filter: {\n ...f.filter,\n name,\n },\n };\n } else {\n return f;\n }\n });\n"],"names":[],"mappings":";;AAYO,SAAS,UACd,CAAA,iBAAA,EACA,QACA,EAAA,eAAA,GAAkB,IAClB,EAAA;AACA,EAAM,MAAA,MAAA,GAAS,kBAAkB,IAAK,CAAA,CAAC,EAAE,EAAG,EAAA,KAAM,OAAO,QAAQ,CAAA;AACjE,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,OAAA,MAAA;AAAA,aACE,eAAiB,EAAA;AAC1B,IAAM,MAAA,KAAA,CAAM,CAAiD,8CAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AAAA;AAE3E;AAEO,MAAM,gBAAmB,GAAA,CAAC,iBAC/B,KAAA,cAAA,CAAe,mBAAmB,KAAS,CAAA;AAEtC,MAAM,iBAAiB,CAC5B,iBAAA,EACA,mBAEA,iBAAkB,CAAA,GAAA,CAAsB,CAAC,CAAM,KAAA;AAC7C,EAAI,IAAA,CAAA,CAAE,OAAO,cAAgB,EAAA;AAC3B,IAAO,OAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,MAAA,EAAQ,CAAC,CAAE,CAAA;AAAA,KACb;AAAA,GACF,MAAA,IAAW,EAAE,MAAQ,EAAA;AACnB,IAAO,OAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,MAAQ,EAAA;AAAA,KACV;AAAA,GACK,MAAA;AACL,IAAO,OAAA,CAAA;AAAA;AAEX,CAAC;AAEU,MAAA,qBAAA,GAAwB,CACnC,iBAAA,EACA,gBACG,KAAA;AACH,EAAI,IAAA,CAAC,iBAAkB,CAAA,IAAA,CAAK,CAAC,EAAE,IAAS,KAAA,EAAA,KAAO,gBAAiB,CAAA,EAAE,CAAG,EAAA;AACnE,IAAA,OAAO,gBAAiB,CAAA,iBAAiB,CAAE,CAAA,MAAA,CAAO,gBAAgB,CAAA;AAAA,GAC7D,MAAA;AACL,IAAO,OAAA,iBAAA,CAAkB,GAAsB,CAAA,CAAC,CAAM,KAAA;AACpD,MAAI,IAAA,CAAA,CAAE,EAAO,KAAA,gBAAA,CAAiB,EAAI,EAAA;AAChC,QAAO,OAAA,gBAAA;AAAA,OACT,MAAA,IAAW,EAAE,MAAQ,EAAA;AACnB,QAAO,OAAA;AAAA,UACL,GAAG,CAAA;AAAA,UACH,MAAQ,EAAA;AAAA,SACV;AAAA,OACK,MAAA;AACL,QAAO,OAAA,CAAA;AAAA;AACT,KACD,CAAA;AAAA;AAEL;AAEa,MAAA,YAAA,GAAe,CAC1B,iBACA,EAAA,QAAA,EACA,SAEA,iBAAkB,CAAA,GAAA,CAAsB,CAAC,CAAM,KAAA;AAC7C,EAAI,IAAA,CAAA,CAAE,OAAO,QAAU,EAAA;AACrB,IAAO,OAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,MAAQ,EAAA;AAAA,QACN,GAAG,CAAE,CAAA,MAAA;AAAA,QACL;AAAA;AACF,KACF;AAAA,GACK,MAAA;AACL,IAAO,OAAA,CAAA;AAAA;AAEX,CAAC;;;;;;;;"}
|
|
@@ -12,6 +12,7 @@ const classBase = "vuuColumnFilter";
|
|
|
12
12
|
const ColumnFilter = forwardRef(function ColumnFilter2({
|
|
13
13
|
column,
|
|
14
14
|
className,
|
|
15
|
+
minCharacterCountToTriggerSuggestions,
|
|
15
16
|
onCommit: onCommitProp,
|
|
16
17
|
operator = "=",
|
|
17
18
|
showOperatorPicker = false,
|
|
@@ -73,6 +74,9 @@ const ColumnFilter = forwardRef(function ColumnFilter2({
|
|
|
73
74
|
] }) : null,
|
|
74
75
|
getDataItemEditControl({
|
|
75
76
|
InputProps: { inputProps },
|
|
77
|
+
TypeaheadProps: {
|
|
78
|
+
minCharacterCountToTriggerSuggestions
|
|
79
|
+
},
|
|
76
80
|
commitOnBlur: false,
|
|
77
81
|
commitWhenCleared: true,
|
|
78
82
|
dataDescriptor: column,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, ReactElement } from \"react\";\nimport { ColumnFilterHookProps, useColumnFilter } from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n ColumnFilterHookProps {\n /**\n * Display operator picker.\n */\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n}\n\nexport const ColumnFilter = forwardRef(function ColumnFilter(\n {\n column,\n className,\n onCommit: onCommitProp,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n ...buttonGroupProps\n }: ColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-column-filter\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n const {\n op,\n allowedOperators,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n onCommit,\n onCommitRange,\n } = useColumnFilter({\n onCommit: onCommitProp,\n operator,\n column,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n });\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {op}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n {allowedOperators.map((allowedOp) => (\n <MenuItem\n key={`allowedOp`}\n onClick={() => handleOperatorChange(allowedOp)}\n >\n {allowedOp}\n </MenuItem>\n ))}\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n InputProps: { inputProps },\n commitOnBlur: false,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n commitWhenCleared: true,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: onCommitRange,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n}) as (\n props: ColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<ColumnFilterProps>;\n"],"names":["ColumnFilter","forwardRef"],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, ReactElement } from \"react\";\nimport { ColumnFilterHookProps, useColumnFilter } from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { VuuTypeaheadInputHookProps } from \"@vuu-ui/vuu-ui-controls/src/vuu-typeahead-input/useVuuTypeaheadInput\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n Pick<VuuTypeaheadInputHookProps, \"minCharacterCountToTriggerSuggestions\">,\n ColumnFilterHookProps {\n /**\n * Display operator picker.\n */\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n}\n\nexport const ColumnFilter = forwardRef(function ColumnFilter(\n {\n column,\n className,\n minCharacterCountToTriggerSuggestions,\n onCommit: onCommitProp,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n ...buttonGroupProps\n }: ColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-column-filter\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n const {\n op,\n allowedOperators,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n onCommit,\n onCommitRange,\n } = useColumnFilter({\n onCommit: onCommitProp,\n operator,\n column,\n value,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n });\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {op}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n {allowedOperators.map((allowedOp) => (\n <MenuItem\n key={`allowedOp`}\n onClick={() => handleOperatorChange(allowedOp)}\n >\n {allowedOp}\n </MenuItem>\n ))}\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n InputProps: { inputProps },\n TypeaheadProps: {\n minCharacterCountToTriggerSuggestions,\n },\n commitOnBlur: false,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n commitWhenCleared: true,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: onCommitRange,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n}) as (\n props: ColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<ColumnFilterProps>;\n"],"names":["ColumnFilter","forwardRef"],"mappings":";;;;;;;;;;AAoBA,MAAM,SAAY,GAAA,iBAAA;AAgBL,MAAA,YAAA,GAAe,UAAW,CAAA,SAASA,aAC9C,CAAA;AAAA,EACE,MAAA;AAAA,EACA,SAAA;AAAA,EACA,qCAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,QAAW,GAAA,GAAA;AAAA,EACX,kBAAqB,GAAA,KAAA;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA,EACA,yBAAA;AAAA,EACA,GAAG;AACL,CAAA,EACAC,WACA,EAAA;AACA,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,eAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA;AAAA,IACJ,EAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,oBAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,eAAgB,CAAA;AAAA,IAClB,QAAU,EAAA,YAAA;AAAA,IACV,QAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EACE,uBAAA,IAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACE,GAAG,gBAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAKA,EAAAA,WAAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,QACC,kBAAA,mBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAU,cACd,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,WACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,UAAW,EAAA,OAAA;AAAA,cACX,YAAW,EAAA,WAAA;AAAA,cACX,SAAA,EAAW,GAAG,SAAS,CAAA,QAAA,CAAA;AAAA,cACvB,eAAa,EAAA,IAAA;AAAA,cACb,SAAU,EAAA,SAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WAEL,EAAA,CAAA;AAAA,0BACC,GAAA,CAAA,SAAA,EAAA,EACE,QAAiB,EAAA,gBAAA,CAAA,GAAA,CAAI,CAAC,SACrB,qBAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,MAAM,oBAAA,CAAqB,SAAS,CAAA;AAAA,cAE5C,QAAA,EAAA;AAAA,aAAA;AAAA,YAHI,CAAA,SAAA;AAAA,WAKR,CACH,EAAA;AAAA,SAAA,EACF,CACE,GAAA,IAAA;AAAA,QACH,sBAAuB,CAAA;AAAA,UACtB,UAAA,EAAY,EAAE,UAAW,EAAA;AAAA,UACzB,cAAgB,EAAA;AAAA,YACd;AAAA,WACF;AAAA,UACA,YAAc,EAAA,KAAA;AAAA,UACd,iBAAmB,EAAA,IAAA;AAAA,UACnB,cAAgB,EAAA,MAAA;AAAA,UAChB,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACA,EAAA,KAAO,YACJ,sBAAuB,CAAA;AAAA,UACrB,SAAA,EAAW,GAAG,SAAS,CAAA,UAAA,CAAA;AAAA,UACvB,iBAAmB,EAAA,IAAA;AAAA,UACnB,UAAA,EAAY,EAAE,UAAA,EAAY,eAAgB,EAAA;AAAA,UAC1C,cAAgB,EAAA,MAAA;AAAA,UAChB,QAAU,EAAA,aAAA;AAAA,UACV;AAAA,SACD,CACD,GAAA;AAAA;AAAA;AAAA,GACN;AAEJ,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import {\n ColumnFilterChangeHandler,\n ColumnFilterOp,\n ColumnFilterValue,\n FilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ChangeEventHandler, useCallback, useMemo, useState } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport { VuuTypeaheadInputProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { getOperators } from \"../filter-clause/operator-utils\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n) => {\n if (op !== \"between\" && !allowedOperators.includes(op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport type ColumnFilterCommitHandler = (\n column: ColumnDescriptor,\n op: FilterClauseOp | \"between\",\n value: ColumnFilterValue,\n) => void;\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: ColumnFilterOp,\n value?: ColumnFilterValue,\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value) || value.length !== 2) {\n throw Error(\n `[useColumnFilter] between operator requires array of two values, received ${value}`,\n );\n } else if (\n value[0] !== undefined &&\n value[1] !== undefined &&\n typeof value[0] !== typeof value[1]\n ) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport type ColumnFilterHookProps = {\n column: ColumnDescriptor;\n operator?: ColumnFilterOp;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value
|
|
1
|
+
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import {\n ColumnFilterChangeHandler,\n ColumnFilterOp,\n ColumnFilterValue,\n FilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ChangeEventHandler, useCallback, useMemo, useState } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport { VuuTypeaheadInputProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { getOperators } from \"../filter-clause/operator-utils\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: ColumnFilterOp,\n) => {\n if (op !== \"between\" && !allowedOperators.includes(op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport type ColumnFilterCommitHandler = (\n column: ColumnDescriptor,\n op: FilterClauseOp | \"between\",\n value: ColumnFilterValue,\n) => void;\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: ColumnFilterOp,\n value?: ColumnFilterValue,\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value) || value.length !== 2) {\n throw Error(\n `[useColumnFilter] between operator requires array of two values, received ${value}`,\n );\n } else if (\n value[0] !== undefined &&\n value[1] !== undefined &&\n typeof value[0] !== typeof value[1]\n ) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport type ColumnFilterHookProps = {\n column: ColumnDescriptor;\n operator?: ColumnFilterOp;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value: ColumnFilterValue;\n /**\n * Filter change events.\n */\n onColumnFilterChange?: ColumnFilterChangeHandler;\n /**\n * Filter change events on second control in range filter\n */\n onColumnRangeFilterChange?: ColumnFilterChangeHandler;\n /**\n * Called when user 'commits' filter value, either by pressing enter,\n * tabbing away from control or making selection from list\n */\n onCommit: ColumnFilterCommitHandler;\n};\n\nexport const useColumnFilter = ({\n onCommit,\n operator = \"=\",\n value,\n column,\n onColumnFilterChange,\n onColumnRangeFilterChange,\n}: ColumnFilterHookProps) => {\n const [op, setOp] = useState(operator);\n const allowedOperators = useMemo(() => getOperators(column), [column]);\n\n useMemo(() => {\n assertValidOperator(allowedOperators, column, operator);\n assertValidValue(column, op, value);\n }, [allowedOperators, column, operator, op, value]);\n\n const handleOperatorChange = useCallback((changedOp: ColumnFilterOp) => {\n setOp(changedOp);\n }, []);\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (_e, newValue) => {\n if (Array.isArray(value)) {\n onCommit?.(column, op, [`${newValue}`, value[1]]);\n } else {\n onCommit?.(column, op, `${newValue}`);\n }\n },\n [value, onCommit, column, op],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (_e, newValue) => {\n const [firstValue] = value as [string, string];\n onCommit?.(column, op, [firstValue, `${newValue}`]);\n },\n [onCommit, column, op, value],\n );\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n onColumnFilterChange?.(e.target.value, column, op);\n },\n [onColumnFilterChange, column, op],\n );\n\n const handleRangeInputChange = useCallback<\n ChangeEventHandler<HTMLInputElement>\n >(\n (e) => {\n onColumnRangeFilterChange?.(e.target.value, column, op);\n },\n [onColumnRangeFilterChange, column, op],\n );\n\n const inputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(value) ? value[0] : value,\n }),\n [handleInputChange, value],\n );\n\n const rangeInputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () =>\n Array.isArray(value)\n ? {\n onChange: handleRangeInputChange,\n value: value[1],\n }\n : undefined,\n [handleRangeInputChange, value],\n );\n\n return {\n op,\n allowedOperators,\n inputProps,\n rangeInputProps,\n onCommit: handleCommit,\n onCommitRange: handleRangeCommit,\n handleOperatorChange,\n };\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,18 @@ import { jsx, jsxs } from 'react/jsx-runtime';
|
|
|
2
2
|
import { createContext, useState, useCallback, useContext } from 'react';
|
|
3
3
|
import { FilterNamePrompt } from '../saved-filters/FilterNamePrompt.js';
|
|
4
4
|
import { DeleteFilterPrompt } from '../saved-filters/DeleteFilterPrompt.js';
|
|
5
|
+
import { renameFilter, findFilter, activateFilter, insertOrReplaceFilter } from './filter-descriptor-utils.js';
|
|
5
6
|
|
|
7
|
+
const UNSAVED_FILTER = "unsaved-filter";
|
|
6
8
|
const FilterContext = createContext({
|
|
7
9
|
activeFilter: void 0,
|
|
8
10
|
savedFilters: [],
|
|
9
11
|
onApplyFilter: () => console.warn(
|
|
10
12
|
"[FilterContext] onApplyFilter, no FilterProvider has been configured"
|
|
11
13
|
),
|
|
14
|
+
deleteFilter: () => console.warn(
|
|
15
|
+
"[FilterContext] deleteFilter, no FilterProvider has been configured"
|
|
16
|
+
),
|
|
12
17
|
saveFilter: () => console.warn(
|
|
13
18
|
"[FilterContext] saveFilter, no FilterProvider has been configured"
|
|
14
19
|
),
|
|
@@ -26,19 +31,6 @@ const FilterProvider = ({
|
|
|
26
31
|
const handleApplyFilter = useCallback(() => {
|
|
27
32
|
console.log("filter changed");
|
|
28
33
|
}, []);
|
|
29
|
-
const findFilter = useCallback(
|
|
30
|
-
(filterId) => {
|
|
31
|
-
const filter = filterDescriptors.find(({ id }) => id === filterId);
|
|
32
|
-
if (filter) {
|
|
33
|
-
return filter;
|
|
34
|
-
} else {
|
|
35
|
-
throw Error(
|
|
36
|
-
`[FilterProvider] findFilter, filter not found ${filterId}`
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
[filterDescriptors]
|
|
41
|
-
);
|
|
42
34
|
const deleteFilter = useCallback(
|
|
43
35
|
(filterId) => {
|
|
44
36
|
setFilterDescriptors((filterDescriptors2) => {
|
|
@@ -51,22 +43,14 @@ const FilterProvider = ({
|
|
|
51
43
|
},
|
|
52
44
|
[onFiltersSaved]
|
|
53
45
|
);
|
|
54
|
-
const
|
|
55
|
-
(filterId,
|
|
46
|
+
const applyNewName = useCallback(
|
|
47
|
+
(filterId, name) => {
|
|
56
48
|
setFilterDescriptors((currentFilterDescriptors) => {
|
|
57
|
-
const newFilterDescriptors =
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
...f.filter,
|
|
63
|
-
name: filterName
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
} else {
|
|
67
|
-
return f;
|
|
68
|
-
}
|
|
69
|
-
});
|
|
49
|
+
const newFilterDescriptors = renameFilter(
|
|
50
|
+
currentFilterDescriptors,
|
|
51
|
+
filterId,
|
|
52
|
+
name
|
|
53
|
+
);
|
|
70
54
|
onFiltersSaved?.(newFilterDescriptors);
|
|
71
55
|
return newFilterDescriptors;
|
|
72
56
|
});
|
|
@@ -86,14 +70,14 @@ const FilterProvider = ({
|
|
|
86
70
|
onConfirm: (name) => {
|
|
87
71
|
setDialog(null);
|
|
88
72
|
if (originalFilterName !== name) {
|
|
89
|
-
|
|
73
|
+
applyNewName(id, name);
|
|
90
74
|
}
|
|
91
75
|
}
|
|
92
76
|
}
|
|
93
77
|
)
|
|
94
78
|
);
|
|
95
79
|
},
|
|
96
|
-
[
|
|
80
|
+
[applyNewName]
|
|
97
81
|
);
|
|
98
82
|
const promptForConfirmationOfDelete = useCallback(
|
|
99
83
|
(filterDescriptor) => {
|
|
@@ -115,22 +99,26 @@ const FilterProvider = ({
|
|
|
115
99
|
);
|
|
116
100
|
const handleFilterMenuAction = useCallback(
|
|
117
101
|
(filterId, actionType) => {
|
|
118
|
-
const targetFilter = findFilter(filterId);
|
|
102
|
+
const targetFilter = findFilter(filterDescriptors, filterId);
|
|
119
103
|
switch (actionType) {
|
|
120
104
|
case "close":
|
|
121
|
-
console.log(`
|
|
105
|
+
console.log(`close filter ${filterId}`);
|
|
122
106
|
break;
|
|
123
107
|
case "edit":
|
|
124
108
|
console.log(`edit filter ${filterId}`);
|
|
125
109
|
break;
|
|
126
110
|
case "remove":
|
|
127
|
-
|
|
111
|
+
if (filterId === UNSAVED_FILTER) {
|
|
112
|
+
console.log("remove unsaved filter");
|
|
113
|
+
} else {
|
|
114
|
+
promptForConfirmationOfDelete(targetFilter);
|
|
115
|
+
}
|
|
128
116
|
break;
|
|
129
117
|
case "rename":
|
|
130
118
|
return PromptForFilterName(targetFilter);
|
|
131
119
|
}
|
|
132
120
|
},
|
|
133
|
-
[
|
|
121
|
+
[filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName]
|
|
134
122
|
);
|
|
135
123
|
const handleSaveFilter = useCallback(
|
|
136
124
|
(filterDescriptor) => {
|
|
@@ -144,30 +132,21 @@ const FilterProvider = ({
|
|
|
144
132
|
},
|
|
145
133
|
[onFiltersSaved]
|
|
146
134
|
);
|
|
147
|
-
const setActiveFilter = useCallback(
|
|
148
|
-
(
|
|
149
|
-
setFilterDescriptors(
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
} else {
|
|
163
|
-
return f;
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
return newFilterDescriptors;
|
|
167
|
-
});
|
|
168
|
-
},
|
|
169
|
-
[findFilter]
|
|
170
|
-
);
|
|
135
|
+
const setActiveFilter = useCallback((filter) => {
|
|
136
|
+
if (typeof filter === "string") {
|
|
137
|
+
setFilterDescriptors(
|
|
138
|
+
(currentFilterDescriptors) => activateFilter(currentFilterDescriptors, filter)
|
|
139
|
+
);
|
|
140
|
+
} else if (filter) {
|
|
141
|
+
setFilterDescriptors(
|
|
142
|
+
(currentFilterDescriptors) => insertOrReplaceFilter(currentFilterDescriptors, {
|
|
143
|
+
active: true,
|
|
144
|
+
filter,
|
|
145
|
+
id: UNSAVED_FILTER
|
|
146
|
+
})
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
}, []);
|
|
171
150
|
return /* @__PURE__ */ jsxs(
|
|
172
151
|
FilterContext.Provider,
|
|
173
152
|
{
|
|
@@ -175,6 +154,7 @@ const FilterProvider = ({
|
|
|
175
154
|
activeFilter: filterDescriptors.find((f) => f.active),
|
|
176
155
|
onApplyFilter: handleApplyFilter,
|
|
177
156
|
onFilterMenuAction: handleFilterMenuAction,
|
|
157
|
+
deleteFilter,
|
|
178
158
|
saveFilter: handleSaveFilter,
|
|
179
159
|
savedFilters: filterDescriptors,
|
|
180
160
|
setActiveFilter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import { FilterChangeHandler } from \"@vuu-ui/vuu-filter-types\";\nimport {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterDescriptor } from \"../saved-filters/useSavedFilterPanel\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\n\nexport interface FilterContextProps {\n activeFilter: FilterDescriptor | undefined;\n saveFilter: (filter: FilterDescriptor) => void;\n savedFilters?: FilterDescriptor[];\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setActiveFilter: (filterId?: string) => void;\n}\n\nexport const FilterContext = createContext<FilterContextProps>({\n activeFilter: undefined,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setActiveFilter: () =>\n console.warn(\n \"[FilterContext] setActiveFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"activeFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (filterDescriptors: FilterDescriptor[]) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const findFilter = useCallback(\n (filterId: string) => {\n const filter = filterDescriptors.find(({ id }) => id === filterId);\n if (filter) {\n return filter;\n } else {\n throw Error(\n `[FilterProvider] findFilter, filter not found ${filterId}`,\n );\n }\n },\n [filterDescriptors],\n );\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const renameFilter = useCallback(\n (filterId: string, filterName: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors =\n currentFilterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterId) {\n return {\n ...f,\n filter: {\n ...f.filter,\n name: filterName,\n },\n };\n } else {\n return f;\n }\n });\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterDescriptor) => {\n const originalFilterName = filter.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n renameFilter(id, name);\n }\n }}\n />,\n );\n },\n [renameFilter],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setDialog(\n <DeleteFilterPrompt\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType) => {\n const targetFilter = findFilter(filterId);\n switch (actionType) {\n case \"close\":\n console.log(`clode filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n promptForConfirmationOfDelete(targetFilter);\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [findFilter, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptor.active\n ? filterDescriptors\n .map((filterDescriptor) =>\n filterDescriptor.active\n ? { ...filterDescriptor, active: false }\n : filterDescriptor,\n )\n .concat(filterDescriptor)\n : filterDescriptors.concat(filterDescriptor);\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const setActiveFilter = useCallback(\n (filterId?: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const targetFilter = filterId ? findFilter(filterId) : undefined;\n const newFilterDescriptors =\n currentFilterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterId) {\n return {\n ...f,\n active: !f.active,\n };\n } else if (!targetFilter?.active && f.active) {\n return {\n ...f,\n active: false,\n };\n } else {\n return f;\n }\n });\n return newFilterDescriptors;\n });\n },\n [findFilter],\n );\n\n return (\n <FilterContext.Provider\n value={{\n activeFilter: filterDescriptors.find((f) => f.active),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors,\n setActiveFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n\nexport function useActiveFilter() {\n const { activeFilter, onApplyFilter } = useContext(FilterContext);\n return { activeFilter, onApplyFilter };\n}\n\nexport function useSavedFilters() {\n const {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n } = useContext(FilterContext);\n return {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n };\n}\n"],"names":["filterDescriptors","filterDescriptor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import { Filter, FilterChangeHandler } from \"@vuu-ui/vuu-filter-types\";\nimport {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport { FilterMenuActionHandler } from \"../filter-pill/FilterMenu\";\nimport { FilterDescriptor } from \"../saved-filters/useSavedFilterPanel\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\n\nconst UNSAVED_FILTER = \"unsaved-filter\";\n\nexport interface FilterContextProps {\n activeFilter: FilterDescriptor | undefined;\n deleteFilter: (filterId: string) => void;\n saveFilter: (filter: FilterDescriptor) => void;\n savedFilters?: FilterDescriptor[];\n // TODO do we need this ?\n onApplyFilter: FilterChangeHandler;\n onFilterMenuAction?: FilterMenuActionHandler;\n setActiveFilter: (filterId?: string) => void;\n}\n\nexport const FilterContext = createContext<FilterContextProps>({\n activeFilter: undefined,\n savedFilters: [],\n onApplyFilter: () =>\n console.warn(\n \"[FilterContext] onApplyFilter, no FilterProvider has been configured\",\n ),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setActiveFilter: () =>\n console.warn(\n \"[FilterContext] setActiveFilter, no FilterProvider has been configured\",\n ),\n});\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters = [],\n}: Partial<Pick<FilterContextProps, \"activeFilter\" | \"savedFilters\">> & {\n children: ReactNode;\n onFiltersSaved?: (filterDescriptors: FilterDescriptor[]) => void;\n}) => {\n const [filterDescriptors, setFilterDescriptors] = useState(savedFilters);\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const handleApplyFilter = useCallback<FilterChangeHandler>(() => {\n console.log(\"filter changed\");\n }, []);\n\n const deleteFilter = useCallback(\n (filterId: string) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const applyNewName = useCallback(\n (filterId: string, name: string) => {\n setFilterDescriptors((currentFilterDescriptors) => {\n const newFilterDescriptors = renameFilter(\n currentFilterDescriptors,\n filterId,\n name,\n );\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n const PromptForFilterName = useCallback(\n ({ filter, id }: FilterDescriptor) => {\n const originalFilterName = filter.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setDialog(\n <DeleteFilterPrompt\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction = useCallback<FilterMenuActionHandler>(\n (filterId, actionType) => {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(targetFilter);\n }\n break;\n case \"rename\":\n return PromptForFilterName(targetFilter);\n }\n },\n [filterDescriptors, promptForConfirmationOfDelete, PromptForFilterName],\n );\n\n const handleSaveFilter = useCallback(\n (filterDescriptor: FilterDescriptor) => {\n setFilterDescriptors((filterDescriptors) => {\n const newFilterDescriptors = filterDescriptor.active\n ? filterDescriptors\n .map((filterDescriptor) =>\n filterDescriptor.active\n ? { ...filterDescriptor, active: false }\n : filterDescriptor,\n )\n .concat(filterDescriptor)\n : filterDescriptors.concat(filterDescriptor);\n onFiltersSaved?.(newFilterDescriptors);\n return newFilterDescriptors;\n });\n },\n [onFiltersSaved],\n );\n\n /**\n * Allows switching between saved filtere. ALternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setActiveFilter = useCallback((filter?: string | Filter) => {\n if (typeof filter === \"string\") {\n setFilterDescriptors((currentFilterDescriptors) =>\n activateFilter(currentFilterDescriptors, filter),\n );\n } else if (filter) {\n setFilterDescriptors((currentFilterDescriptors) =>\n insertOrReplaceFilter(currentFilterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n }),\n );\n }\n }, []);\n\n return (\n <FilterContext.Provider\n value={{\n activeFilter: filterDescriptors.find((f) => f.active),\n onApplyFilter: handleApplyFilter,\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n savedFilters: filterDescriptors,\n setActiveFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n\nexport function useActiveFilter() {\n const { activeFilter, onApplyFilter } = useContext(FilterContext);\n return { activeFilter, onApplyFilter };\n}\n\nexport function useSavedFilters() {\n const {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n } = useContext(FilterContext);\n return {\n activeFilter,\n onApplyFilter,\n onFilterMenuAction,\n savedFilters,\n saveFilter,\n setActiveFilter,\n };\n}\n"],"names":["filterDescriptors","filterDescriptor"],"mappings":";;;;;;AAoBA,MAAM,cAAiB,GAAA,gBAAA;AAahB,MAAM,gBAAgB,aAAkC,CAAA;AAAA,EAC7D,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,cAAc,EAAC;AAAA,EACf,aAAA,EAAe,MACb,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,YAAA,EAAc,MACZ,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EAEF,UAAA,EAAY,MACV,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA,GACF;AAAA,EACF,eAAA,EAAiB,MACf,OAAQ,CAAA,IAAA;AAAA,IACN;AAAA;AAEN,CAAC;AAEM,MAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAe;AACjB,CAGM,KAAA;AACJ,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,YAAY,CAAA;AACvE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAA8B,IAAI,CAAA;AAE9D,EAAM,MAAA,iBAAA,GAAoB,YAAiC,MAAM;AAC/D,IAAA,OAAA,CAAQ,IAAI,gBAAgB,CAAA;AAAA,GAC9B,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,QAAqB,KAAA;AACpB,MAAA,oBAAA,CAAqB,CAACA,kBAAsB,KAAA;AAC1C,QAAA,MAAM,uBAAuBA,kBAAkB,CAAA,MAAA;AAAA,UAC7C,CAAC,EAAE,EAAG,EAAA,KAAM,EAAO,KAAA;AAAA,SACrB;AACA,QAAA,cAAA,GAAiB,oBAAoB,CAAA;AACrC,QAAO,OAAA,oBAAA;AAAA,OACR,CAAA;AAAA,KACH;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,UAAkB,IAAiB,KAAA;AAClC,MAAA,oBAAA,CAAqB,CAAC,wBAA6B,KAAA;AACjD,QAAA,MAAM,oBAAuB,GAAA,YAAA;AAAA,UAC3B,wBAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,cAAA,GAAiB,oBAAoB,CAAA;AACrC,QAAO,OAAA,oBAAA;AAAA,OACR,CAAA;AAAA,KACH;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,mBAAsB,GAAA,WAAA;AAAA,IAC1B,CAAC,EAAE,MAAQ,EAAA,EAAA,EAA2B,KAAA;AACpC,MAAM,MAAA,kBAAA,GAAqB,OAAO,IAAQ,IAAA,EAAA;AAC1C,MAAA,SAAA;AAAA,wBACE,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,YAAY,MAAO,CAAA,IAAA;AAAA,YACnB,KAAM,EAAA,eAAA;AAAA,YACN,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,YAC7B,SAAA,EAAW,CAAC,IAAS,KAAA;AACnB,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAA,IAAI,uBAAuB,IAAM,EAAA;AAC/B,gBAAA,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA;AACvB;AACF;AAAA;AACF,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,6BAAgC,GAAA,WAAA;AAAA,IACpC,CAAC,gBAAuC,KAAA;AACtC,MAAA,SAAA;AAAA,wBACE,GAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,gBAAA;AAAA,YACA,WAAW,MAAM;AACf,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAA,YAAA,CAAa,iBAAiB,EAAE,CAAA;AAAA,aAClC;AAAA,YACA,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI;AAAA;AAAA;AAC/B,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,sBAAyB,GAAA,WAAA;AAAA,IAC7B,CAAC,UAAU,UAAe,KAAA;AACxB,MAAM,MAAA,YAAA,GAAe,UAAW,CAAA,iBAAA,EAAmB,QAAQ,CAAA;AAC3D,MAAA,QAAQ,UAAY;AAAA,QAClB,KAAK,OAAA;AACH,UAAQ,OAAA,CAAA,GAAA,CAAI,CAAgB,aAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACtC,UAAA;AAAA,QACF,KAAK,MAAA;AACH,UAAQ,OAAA,CAAA,GAAA,CAAI,CAAe,YAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACrC,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,IAAI,aAAa,cAAgB,EAAA;AAC/B,YAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAAA,WAC9B,MAAA;AACL,YAAA,6BAAA,CAA8B,YAAY,CAAA;AAAA;AAE5C,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,OAAO,oBAAoB,YAAY,CAAA;AAAA;AAC3C,KACF;AAAA,IACA,CAAC,iBAAmB,EAAA,6BAAA,EAA+B,mBAAmB;AAAA,GACxE;AAEA,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,gBAAuC,KAAA;AACtC,MAAA,oBAAA,CAAqB,CAACA,kBAAsB,KAAA;AAC1C,QAAM,MAAA,oBAAA,GAAuB,gBAAiB,CAAA,MAAA,GAC1CA,kBACG,CAAA,GAAA;AAAA,UAAI,CAACC,sBACJA,iBAAiB,CAAA,MAAA,GACb,EAAE,GAAGA,iBAAAA,EAAkB,MAAQ,EAAA,KAAA,EAC/BA,GAAAA;AAAA,UAEL,MAAO,CAAA,gBAAgB,CAC1BD,GAAAA,kBAAAA,CAAkB,OAAO,gBAAgB,CAAA;AAC7C,QAAA,cAAA,GAAiB,oBAAoB,CAAA;AACrC,QAAO,OAAA,oBAAA;AAAA,OACR,CAAA;AAAA,KACH;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAOA,EAAM,MAAA,eAAA,GAAkB,WAAY,CAAA,CAAC,MAA6B,KAAA;AAChE,IAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,MAAA,oBAAA;AAAA,QAAqB,CAAC,wBAAA,KACpB,cAAe,CAAA,wBAAA,EAA0B,MAAM;AAAA,OACjD;AAAA,eACS,MAAQ,EAAA;AACjB,MAAA,oBAAA;AAAA,QAAqB,CAAC,wBACpB,KAAA,qBAAA,CAAsB,wBAA0B,EAAA;AAAA,UAC9C,MAAQ,EAAA,IAAA;AAAA,UACR,MAAA;AAAA,UACA,EAAI,EAAA;AAAA,SACL;AAAA,OACH;AAAA;AACF,GACF,EAAG,EAAE,CAAA;AAEL,EACE,uBAAA,IAAA;AAAA,IAAC,aAAc,CAAA,QAAA;AAAA,IAAd;AAAA,MACC,KAAO,EAAA;AAAA,QACL,cAAc,iBAAkB,CAAA,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,QACpD,aAAe,EAAA,iBAAA;AAAA,QACf,kBAAoB,EAAA,sBAAA;AAAA,QACpB,YAAA;AAAA,QACA,UAAY,EAAA,gBAAA;AAAA,QACZ,YAAc,EAAA,iBAAA;AAAA,QACd;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,eAAkB,GAAA;AAChC,EAAA,MAAM,EAAE,YAAA,EAAc,aAAc,EAAA,GAAI,WAAW,aAAa,CAAA;AAChE,EAAO,OAAA,EAAE,cAAc,aAAc,EAAA;AACvC;AAEO,SAAS,eAAkB,GAAA;AAChC,EAAM,MAAA;AAAA,IACJ,YAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAW,aAAa,CAAA;AAC5B,EAAO,OAAA;AAAA,IACL,YAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
function findFilter(filterDescriptors, filterId, throwIfNotFound = true) {
|
|
2
|
+
const filter = filterDescriptors.find(({ id }) => id === filterId);
|
|
3
|
+
if (filter) {
|
|
4
|
+
return filter;
|
|
5
|
+
} else if (throwIfNotFound) {
|
|
6
|
+
throw Error(`[FilterProvider] findFilter, filter not found ${filterId}`);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const deactivateFilter = (filterDescriptors) => activateFilter(filterDescriptors, void 0);
|
|
10
|
+
const activateFilter = (filterDescriptors, activeFilterId) => filterDescriptors.map((f) => {
|
|
11
|
+
if (f.id === activeFilterId) {
|
|
12
|
+
return {
|
|
13
|
+
...f,
|
|
14
|
+
active: !f.active
|
|
15
|
+
};
|
|
16
|
+
} else if (f.active) {
|
|
17
|
+
return {
|
|
18
|
+
...f,
|
|
19
|
+
active: false
|
|
20
|
+
};
|
|
21
|
+
} else {
|
|
22
|
+
return f;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const insertOrReplaceFilter = (filterDescriptors, filterDescriptor) => {
|
|
26
|
+
if (!filterDescriptors.some(({ id }) => id === filterDescriptor.id)) {
|
|
27
|
+
return deactivateFilter(filterDescriptors).concat(filterDescriptor);
|
|
28
|
+
} else {
|
|
29
|
+
return filterDescriptors.map((f) => {
|
|
30
|
+
if (f.id === filterDescriptor.id) {
|
|
31
|
+
return filterDescriptor;
|
|
32
|
+
} else if (f.active) {
|
|
33
|
+
return {
|
|
34
|
+
...f,
|
|
35
|
+
active: false
|
|
36
|
+
};
|
|
37
|
+
} else {
|
|
38
|
+
return f;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const renameFilter = (filterDescriptors, filterId, name) => filterDescriptors.map((f) => {
|
|
44
|
+
if (f.id === filterId) {
|
|
45
|
+
return {
|
|
46
|
+
...f,
|
|
47
|
+
filter: {
|
|
48
|
+
...f.filter,
|
|
49
|
+
name
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
} else {
|
|
53
|
+
return f;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export { activateFilter, deactivateFilter, findFilter, insertOrReplaceFilter, renameFilter };
|
|
58
|
+
//# sourceMappingURL=filter-descriptor-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-descriptor-utils.js","sources":["../../../../packages/vuu-filters/src/filter-provider/filter-descriptor-utils.ts"],"sourcesContent":["import { FilterDescriptor } from \"../saved-filters/useSavedFilterPanel\";\n\nexport function findFilter(\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n throwIfNotFound?: true,\n): FilterDescriptor;\nexport function findFilter(\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n throwIfNotFound: false,\n): FilterDescriptor | undefined;\nexport function findFilter(\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n throwIfNotFound = true,\n) {\n const filter = filterDescriptors.find(({ id }) => id === filterId);\n if (filter) {\n return filter;\n } else if (throwIfNotFound) {\n throw Error(`[FilterProvider] findFilter, filter not found ${filterId}`);\n }\n}\n\nexport const deactivateFilter = (filterDescriptors: FilterDescriptor[]) =>\n activateFilter(filterDescriptors, undefined);\n\nexport const activateFilter = (\n filterDescriptors: FilterDescriptor[],\n activeFilterId?: string,\n) =>\n filterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === activeFilterId) {\n return {\n ...f,\n active: !f.active,\n };\n } else if (f.active) {\n return {\n ...f,\n active: false,\n };\n } else {\n return f;\n }\n });\n\nexport const insertOrReplaceFilter = (\n filterDescriptors: FilterDescriptor[],\n filterDescriptor: FilterDescriptor,\n) => {\n if (!filterDescriptors.some(({ id }) => id === filterDescriptor.id)) {\n return deactivateFilter(filterDescriptors).concat(filterDescriptor);\n } else {\n return filterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterDescriptor.id) {\n return filterDescriptor;\n } else if (f.active) {\n return {\n ...f,\n active: false,\n };\n } else {\n return f;\n }\n });\n }\n};\n\nexport const renameFilter = (\n filterDescriptors: FilterDescriptor[],\n filterId: string,\n name: string,\n) =>\n filterDescriptors.map<FilterDescriptor>((f) => {\n if (f.id === filterId) {\n return {\n ...f,\n filter: {\n ...f.filter,\n name,\n },\n };\n } else {\n return f;\n }\n });\n"],"names":[],"mappings":"AAYO,SAAS,UACd,CAAA,iBAAA,EACA,QACA,EAAA,eAAA,GAAkB,IAClB,EAAA;AACA,EAAM,MAAA,MAAA,GAAS,kBAAkB,IAAK,CAAA,CAAC,EAAE,EAAG,EAAA,KAAM,OAAO,QAAQ,CAAA;AACjE,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,OAAA,MAAA;AAAA,aACE,eAAiB,EAAA;AAC1B,IAAM,MAAA,KAAA,CAAM,CAAiD,8CAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AAAA;AAE3E;AAEO,MAAM,gBAAmB,GAAA,CAAC,iBAC/B,KAAA,cAAA,CAAe,mBAAmB,KAAS,CAAA;AAEtC,MAAM,iBAAiB,CAC5B,iBAAA,EACA,mBAEA,iBAAkB,CAAA,GAAA,CAAsB,CAAC,CAAM,KAAA;AAC7C,EAAI,IAAA,CAAA,CAAE,OAAO,cAAgB,EAAA;AAC3B,IAAO,OAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,MAAA,EAAQ,CAAC,CAAE,CAAA;AAAA,KACb;AAAA,GACF,MAAA,IAAW,EAAE,MAAQ,EAAA;AACnB,IAAO,OAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,MAAQ,EAAA;AAAA,KACV;AAAA,GACK,MAAA;AACL,IAAO,OAAA,CAAA;AAAA;AAEX,CAAC;AAEU,MAAA,qBAAA,GAAwB,CACnC,iBAAA,EACA,gBACG,KAAA;AACH,EAAI,IAAA,CAAC,iBAAkB,CAAA,IAAA,CAAK,CAAC,EAAE,IAAS,KAAA,EAAA,KAAO,gBAAiB,CAAA,EAAE,CAAG,EAAA;AACnE,IAAA,OAAO,gBAAiB,CAAA,iBAAiB,CAAE,CAAA,MAAA,CAAO,gBAAgB,CAAA;AAAA,GAC7D,MAAA;AACL,IAAO,OAAA,iBAAA,CAAkB,GAAsB,CAAA,CAAC,CAAM,KAAA;AACpD,MAAI,IAAA,CAAA,CAAE,EAAO,KAAA,gBAAA,CAAiB,EAAI,EAAA;AAChC,QAAO,OAAA,gBAAA;AAAA,OACT,MAAA,IAAW,EAAE,MAAQ,EAAA;AACnB,QAAO,OAAA;AAAA,UACL,GAAG,CAAA;AAAA,UACH,MAAQ,EAAA;AAAA,SACV;AAAA,OACK,MAAA;AACL,QAAO,OAAA,CAAA;AAAA;AACT,KACD,CAAA;AAAA;AAEL;AAEa,MAAA,YAAA,GAAe,CAC1B,iBACA,EAAA,QAAA,EACA,SAEA,iBAAkB,CAAA,GAAA,CAAsB,CAAC,CAAM,KAAA;AAC7C,EAAI,IAAA,CAAA,CAAE,OAAO,QAAU,EAAA;AACrB,IAAO,OAAA;AAAA,MACL,GAAG,CAAA;AAAA,MACH,MAAQ,EAAA;AAAA,QACN,GAAG,CAAE,CAAA,MAAA;AAAA,QACL;AAAA;AACF,KACF;AAAA,GACK,MAAA;AACL,IAAO,OAAA,CAAA;AAAA;AAEX,CAAC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.13.
|
|
2
|
+
"version": "0.13.41",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"devDependencies": {
|
|
7
|
-
"@vuu-ui/vuu-data-types": "0.13.
|
|
8
|
-
"@vuu-ui/vuu-protocol-types": "0.13.
|
|
9
|
-
"@vuu-ui/vuu-table-types": "0.13.
|
|
10
|
-
"@vuu-ui/vuu-filter-types": "0.13.
|
|
7
|
+
"@vuu-ui/vuu-data-types": "0.13.41",
|
|
8
|
+
"@vuu-ui/vuu-protocol-types": "0.13.41",
|
|
9
|
+
"@vuu-ui/vuu-table-types": "0.13.41",
|
|
10
|
+
"@vuu-ui/vuu-filter-types": "0.13.41"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@vuu-ui/vuu-data-react": "0.13.
|
|
14
|
-
"@vuu-ui/vuu-filter-parser": "0.13.
|
|
15
|
-
"@vuu-ui/vuu-popups": "0.13.
|
|
16
|
-
"@vuu-ui/vuu-ui-controls": "0.13.
|
|
17
|
-
"@vuu-ui/vuu-table": "0.13.
|
|
18
|
-
"@vuu-ui/vuu-utils": "0.13.
|
|
19
|
-
"@salt-ds/core": "1.
|
|
13
|
+
"@vuu-ui/vuu-data-react": "0.13.41",
|
|
14
|
+
"@vuu-ui/vuu-filter-parser": "0.13.41",
|
|
15
|
+
"@vuu-ui/vuu-popups": "0.13.41",
|
|
16
|
+
"@vuu-ui/vuu-ui-controls": "0.13.41",
|
|
17
|
+
"@vuu-ui/vuu-table": "0.13.41",
|
|
18
|
+
"@vuu-ui/vuu-utils": "0.13.41",
|
|
19
|
+
"@salt-ds/core": "1.48.0",
|
|
20
20
|
"@salt-ds/styles": "0.2.1",
|
|
21
21
|
"@salt-ds/window": "0.1.1"
|
|
22
22
|
},
|
|
@@ -2,7 +2,8 @@ import { SegmentedButtonGroupProps } from "@salt-ds/core";
|
|
|
2
2
|
import { ForwardedRef, ReactElement } from "react";
|
|
3
3
|
import { ColumnFilterHookProps } from "./useColumnFilter";
|
|
4
4
|
import { VuuTable } from "@vuu-ui/vuu-protocol-types";
|
|
5
|
-
|
|
5
|
+
import { VuuTypeaheadInputHookProps } from "@vuu-ui/vuu-ui-controls/src/vuu-typeahead-input/useVuuTypeaheadInput";
|
|
6
|
+
export interface ColumnFilterProps extends SegmentedButtonGroupProps, Pick<VuuTypeaheadInputHookProps, "minCharacterCountToTriggerSuggestions">, ColumnFilterHookProps {
|
|
6
7
|
/**
|
|
7
8
|
* Display operator picker.
|
|
8
9
|
*/
|
|
@@ -4,6 +4,7 @@ import { FilterMenuActionHandler } from "../filter-pill/FilterMenu";
|
|
|
4
4
|
import { FilterDescriptor } from "../saved-filters/useSavedFilterPanel";
|
|
5
5
|
export interface FilterContextProps {
|
|
6
6
|
activeFilter: FilterDescriptor | undefined;
|
|
7
|
+
deleteFilter: (filterId: string) => void;
|
|
7
8
|
saveFilter: (filter: FilterDescriptor) => void;
|
|
8
9
|
savedFilters?: FilterDescriptor[];
|
|
9
10
|
onApplyFilter: FilterChangeHandler;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FilterDescriptor } from "../saved-filters/useSavedFilterPanel";
|
|
2
|
+
export declare function findFilter(filterDescriptors: FilterDescriptor[], filterId: string, throwIfNotFound?: true): FilterDescriptor;
|
|
3
|
+
export declare function findFilter(filterDescriptors: FilterDescriptor[], filterId: string, throwIfNotFound: false): FilterDescriptor | undefined;
|
|
4
|
+
export declare const deactivateFilter: (filterDescriptors: FilterDescriptor[]) => FilterDescriptor[];
|
|
5
|
+
export declare const activateFilter: (filterDescriptors: FilterDescriptor[], activeFilterId?: string) => FilterDescriptor[];
|
|
6
|
+
export declare const insertOrReplaceFilter: (filterDescriptors: FilterDescriptor[], filterDescriptor: FilterDescriptor) => FilterDescriptor[];
|
|
7
|
+
export declare const renameFilter: (filterDescriptors: FilterDescriptor[], filterId: string, name: string) => FilterDescriptor[];
|