@vuu-ui/vuu-filters 0.13.37 → 0.13.38
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 +9 -13
- package/cjs/column-filter/ColumnFilter.js.map +1 -1
- package/cjs/column-filter/useColumnFilter.js +29 -57
- package/cjs/column-filter/useColumnFilter.js.map +1 -1
- package/cjs/index.js +0 -2
- package/cjs/index.js.map +1 -1
- package/esm/column-filter/ColumnFilter.js +11 -15
- package/esm/column-filter/ColumnFilter.js.map +1 -1
- package/esm/column-filter/useColumnFilter.js +30 -58
- package/esm/column-filter/useColumnFilter.js.map +1 -1
- package/esm/index.js +0 -1
- package/esm/index.js.map +1 -1
- package/package.json +11 -11
- package/types/column-filter/ColumnFilter.d.ts +1 -1
- package/types/column-filter/useColumnFilter.d.ts +9 -4
- package/types/index.d.ts +0 -1
- package/cjs/basic-column-filter/BasicColumnFilter.css.js +0 -6
- package/cjs/basic-column-filter/BasicColumnFilter.css.js.map +0 -1
- package/cjs/basic-column-filter/BasicColumnFilter.js +0 -61
- package/cjs/basic-column-filter/BasicColumnFilter.js.map +0 -1
- package/cjs/basic-column-filter/useBasicColumnFilter.js +0 -45
- package/cjs/basic-column-filter/useBasicColumnFilter.js.map +0 -1
- package/esm/basic-column-filter/BasicColumnFilter.css.js +0 -4
- package/esm/basic-column-filter/BasicColumnFilter.css.js.map +0 -1
- package/esm/basic-column-filter/BasicColumnFilter.js +0 -59
- package/esm/basic-column-filter/BasicColumnFilter.js.map +0 -1
- package/esm/basic-column-filter/useBasicColumnFilter.js +0 -43
- package/esm/basic-column-filter/useBasicColumnFilter.js.map +0 -1
- package/types/basic-column-filter/BasicColumnFilter.d.ts +0 -26
- package/types/basic-column-filter/useBasicColumnFilter.d.ts +0 -10
|
@@ -14,6 +14,7 @@ const classBase = "vuuColumnFilter";
|
|
|
14
14
|
const ColumnFilter = react.forwardRef(function ColumnFilter2({
|
|
15
15
|
column,
|
|
16
16
|
className,
|
|
17
|
+
onCommit: onCommitProp,
|
|
17
18
|
operator = "=",
|
|
18
19
|
showOperatorPicker = false,
|
|
19
20
|
table,
|
|
@@ -30,26 +31,18 @@ const ColumnFilter = react.forwardRef(function ColumnFilter2({
|
|
|
30
31
|
const {
|
|
31
32
|
op,
|
|
32
33
|
allowedOperators,
|
|
33
|
-
filterValue,
|
|
34
34
|
inputProps,
|
|
35
35
|
rangeInputProps,
|
|
36
36
|
handleOperatorChange,
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
onCommit,
|
|
38
|
+
onCommitRange
|
|
39
39
|
} = useColumnFilter.useColumnFilter({
|
|
40
|
+
onCommit: onCommitProp,
|
|
40
41
|
operator,
|
|
41
42
|
column,
|
|
42
43
|
value,
|
|
43
44
|
onColumnFilterChange
|
|
44
45
|
});
|
|
45
|
-
react.useMemo(
|
|
46
|
-
() => useColumnFilter.assertValidOperator(allowedOperators, column, operator),
|
|
47
|
-
[column, operator, allowedOperators]
|
|
48
|
-
);
|
|
49
|
-
react.useMemo(
|
|
50
|
-
() => useColumnFilter.assertValidValue(column, op, filterValue),
|
|
51
|
-
[column, op, filterValue]
|
|
52
|
-
);
|
|
53
46
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
54
47
|
core.SegmentedButtonGroup,
|
|
55
48
|
{
|
|
@@ -80,15 +73,18 @@ const ColumnFilter = react.forwardRef(function ColumnFilter2({
|
|
|
80
73
|
] }) : null,
|
|
81
74
|
vuuDataReact.getDataItemEditControl({
|
|
82
75
|
InputProps: { inputProps },
|
|
76
|
+
commitOnBlur: false,
|
|
77
|
+
commitWhenCleared: true,
|
|
83
78
|
dataDescriptor: column,
|
|
84
|
-
onCommit
|
|
79
|
+
onCommit,
|
|
85
80
|
table
|
|
86
81
|
}),
|
|
87
82
|
op === "between" ? vuuDataReact.getDataItemEditControl({
|
|
88
83
|
className: `${classBase}-rangeHigh`,
|
|
84
|
+
commitWhenCleared: true,
|
|
89
85
|
InputProps: { inputProps: rangeInputProps },
|
|
90
86
|
dataDescriptor: column,
|
|
91
|
-
onCommit:
|
|
87
|
+
onCommit: onCommitRange,
|
|
92
88
|
table
|
|
93
89
|
}) : null
|
|
94
90
|
]
|
|
@@ -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
|
|
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 ...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 });\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":";;;;;;;;;;;;AAmBA,MAAM,SAAY,GAAA,iBAAA;AAeL,MAAA,YAAA,GAAeA,gBAAW,CAAA,SAASC,aAC9C,CAAA;AAAA,EACE,MAAA;AAAA,EACA,SAAA;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,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;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,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;;;;"}
|
|
@@ -5,7 +5,7 @@ var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
|
5
5
|
var operatorUtils = require('../filter-clause/operator-utils.js');
|
|
6
6
|
|
|
7
7
|
const assertValidOperator = (allowedOperators, column, op) => {
|
|
8
|
-
if (
|
|
8
|
+
if (op !== "between" && !allowedOperators.includes(op)) {
|
|
9
9
|
console.warn(
|
|
10
10
|
`[useColumnFilter] '${op} not supported for column ${column.name}'`
|
|
11
11
|
);
|
|
@@ -14,15 +14,11 @@ const assertValidOperator = (allowedOperators, column, op) => {
|
|
|
14
14
|
const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
15
15
|
if (value !== void 0) {
|
|
16
16
|
if (operator === "between") {
|
|
17
|
-
if (!Array.isArray(value)) {
|
|
17
|
+
if (!Array.isArray(value) || value.length !== 2) {
|
|
18
18
|
throw Error(
|
|
19
|
-
|
|
19
|
+
`[useColumnFilter] between operator requires array of two values, received ${value}`
|
|
20
20
|
);
|
|
21
|
-
} else if (value
|
|
22
|
-
throw Error(
|
|
23
|
-
`[useColumnFilter] 'between operator requires two values, received ${value}'`
|
|
24
|
-
);
|
|
25
|
-
} else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {
|
|
21
|
+
} else if (value[0] !== void 0 && value[1] !== void 0 && typeof value[0] !== typeof value[1]) {
|
|
26
22
|
throw Error(
|
|
27
23
|
`[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`
|
|
28
24
|
);
|
|
@@ -31,98 +27,74 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
|
31
27
|
}
|
|
32
28
|
};
|
|
33
29
|
const useColumnFilter = ({
|
|
30
|
+
onCommit,
|
|
34
31
|
operator = "=",
|
|
35
32
|
value,
|
|
36
33
|
column,
|
|
37
34
|
onColumnFilterChange
|
|
38
35
|
}) => {
|
|
39
|
-
const getDefaultValue = (op2) => op2 === "between" ? ["", ""] : "";
|
|
40
|
-
const filterValue = react.useRef(value ?? getDefaultValue(operator));
|
|
41
36
|
const [op, setOp] = react.useState(operator);
|
|
42
37
|
const allowedOperators = react.useMemo(() => operatorUtils.getOperators(column), [column]);
|
|
43
38
|
react.useMemo(() => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
onColumnFilterChange?.(value, column, op);
|
|
48
|
-
}, 100);
|
|
49
|
-
}
|
|
50
|
-
}, [value, column, op, onColumnFilterChange]);
|
|
39
|
+
assertValidOperator(allowedOperators, column, operator);
|
|
40
|
+
assertValidValue(column, op, value);
|
|
41
|
+
}, [allowedOperators, column, operator, op, value]);
|
|
51
42
|
const handleOperatorChange = react.useCallback((changedOp) => {
|
|
52
43
|
setOp(changedOp);
|
|
53
44
|
}, []);
|
|
54
45
|
const handleCommit = react.useCallback(
|
|
55
|
-
(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
filterValue.current = [newValue.toString(), filterValue.current[1]];
|
|
59
|
-
if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
|
|
60
|
-
console.info(
|
|
61
|
-
"Range start or end value missing - ignoring onFilterChange"
|
|
62
|
-
);
|
|
63
|
-
}
|
|
46
|
+
(_e, newValue) => {
|
|
47
|
+
if (Array.isArray(value)) {
|
|
48
|
+
onCommit?.(column, op, [`${newValue}`, value[1]]);
|
|
64
49
|
} else {
|
|
65
|
-
|
|
50
|
+
onCommit?.(column, op, `${newValue}`);
|
|
66
51
|
}
|
|
67
|
-
onColumnFilterChange?.(filterValue.current, column, op);
|
|
68
52
|
},
|
|
69
|
-
[
|
|
53
|
+
[value, onCommit, column, op]
|
|
70
54
|
);
|
|
71
55
|
const handleRangeCommit = react.useCallback(
|
|
72
|
-
(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
|
|
76
|
-
console.info(
|
|
77
|
-
"Range start or end value missing - ignoring onFilterChange"
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
} else {
|
|
81
|
-
filterValue.current = newValue;
|
|
82
|
-
}
|
|
83
|
-
onColumnFilterChange?.(filterValue.current, column, op);
|
|
56
|
+
(_e, newValue) => {
|
|
57
|
+
const [firstValue] = value;
|
|
58
|
+
onCommit?.(column, op, [firstValue, `${newValue}`]);
|
|
84
59
|
},
|
|
85
|
-
[
|
|
60
|
+
[onCommit, column, op, value]
|
|
86
61
|
);
|
|
87
62
|
const handleInputChange = react.useCallback(
|
|
88
63
|
(e) => {
|
|
89
|
-
if (Array.isArray(
|
|
64
|
+
if (Array.isArray(value)) {
|
|
90
65
|
const editControl = vuuUtils.queryClosest(e.target, "[data-edit-control]", true);
|
|
91
66
|
const updated = [
|
|
92
|
-
!editControl.className
|
|
93
|
-
editControl.className?.includes("rangeHigh") ? e.target.value :
|
|
67
|
+
!editControl.className.includes("rangeHigh") ? e.target.value : value[0],
|
|
68
|
+
editControl.className?.includes("rangeHigh") ? e.target.value : value[1]
|
|
94
69
|
];
|
|
95
|
-
filterValue.current = updated;
|
|
96
70
|
onColumnFilterChange?.(updated, column, op);
|
|
97
71
|
} else {
|
|
98
|
-
filterValue.current = e.target.value;
|
|
99
72
|
onColumnFilterChange?.(e.target.value, column, op);
|
|
100
73
|
}
|
|
101
74
|
},
|
|
102
|
-
[
|
|
75
|
+
[value, onColumnFilterChange, column, op]
|
|
103
76
|
);
|
|
104
77
|
const inputProps = react.useMemo(
|
|
105
78
|
() => ({
|
|
106
79
|
onChange: handleInputChange,
|
|
107
|
-
value: Array.isArray(
|
|
80
|
+
value: Array.isArray(value) ? value[0] : value
|
|
108
81
|
}),
|
|
109
|
-
[handleInputChange]
|
|
82
|
+
[handleInputChange, value]
|
|
110
83
|
);
|
|
111
84
|
const rangeInputProps = react.useMemo(
|
|
112
|
-
() => ({
|
|
85
|
+
() => Array.isArray(value) ? {
|
|
113
86
|
onChange: handleInputChange,
|
|
114
|
-
value:
|
|
115
|
-
}
|
|
116
|
-
[handleInputChange]
|
|
87
|
+
value: value[1]
|
|
88
|
+
} : void 0,
|
|
89
|
+
[handleInputChange, value]
|
|
117
90
|
);
|
|
118
91
|
return {
|
|
119
92
|
op,
|
|
120
93
|
allowedOperators,
|
|
121
|
-
filterValue: filterValue.current,
|
|
122
94
|
inputProps,
|
|
123
95
|
rangeInputProps,
|
|
124
|
-
handleCommit,
|
|
125
|
-
handleRangeCommit,
|
|
96
|
+
onCommit: handleCommit,
|
|
97
|
+
onCommitRange: handleRangeCommit,
|
|
126
98
|
handleOperatorChange
|
|
127
99
|
};
|
|
128
100
|
};
|
|
@@ -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 {\n ChangeEventHandler,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { CommitHandler, queryClosest } 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 (\n !allowedOperators.find((filterClauseOp) => filterClauseOp === op) &&\n !(op === \"between\")\n ) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\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)) {\n throw Error(\n \"[useColumnFilter] 'between operator requires array of two values'\",\n );\n } else if (value.length !== 2) {\n throw Error(\n `[useColumnFilter] 'between operator requires two values, received ${value}'`,\n );\n } else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {\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\nexport const useColumnFilter = ({\n operator = \"=\",\n value,\n column,\n onColumnFilterChange,\n}: ColumnFilterHookProps) => {\n const getDefaultValue = (op: ColumnFilterOp): ColumnFilterValue =>\n op === \"between\" ? [\"\", \"\"] : \"\";\n const filterValue = useRef(value ?? getDefaultValue(operator));\n const [op, setOp] = useState(operator);\n const allowedOperators = useMemo(() => getOperators(column), [column]);\n\n useMemo(() => {\n if (value && value !== filterValue.current) {\n filterValue.current = value;\n setTimeout(() => {\n onColumnFilterChange?.(value, column, op);\n }, 100);\n }\n }, [value, column, op, onColumnFilterChange]);\n\n const handleOperatorChange = useCallback((changedOp: ColumnFilterOp) => {\n setOp(changedOp);\n }, []);\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n console.log(`[useColumnFilter] handleCommit ${newValue}`);\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [newValue.toString(), filterValue.current[1]];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as ColumnFilterValue;\n }\n onColumnFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onColumnFilterChange],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [filterValue.current[0], newValue.toString()];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as ColumnFilterValue;\n }\n onColumnFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onColumnFilterChange],\n );\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n if (Array.isArray(filterValue.current)) {\n const editControl = queryClosest(e.target, \"[data-edit-control]\", true);\n const updated: ColumnFilterValue = [\n !editControl.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[0],\n editControl.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[1],\n ];\n filterValue.current = updated;\n onColumnFilterChange?.(updated, column, op);\n } else {\n filterValue.current = e.target.value;\n onColumnFilterChange?.(e.target.value, column, op);\n }\n },\n [op, column, onColumnFilterChange],\n );\n\n const inputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[0]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n const rangeInputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[1]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n return {\n op,\n allowedOperators,\n filterValue: filterValue.current,\n inputProps,\n rangeInputProps,\n handleCommit,\n handleRangeCommit,\n handleOperatorChange,\n };\n};\n"],"names":["op","useRef","useState","useMemo","getOperators","useCallback","queryClosest"],"mappings":"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"}
|
|
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, queryClosest } 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 * 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}: 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 if (Array.isArray(value)) {\n const editControl = queryClosest(e.target, \"[data-edit-control]\", true);\n const updated: ColumnFilterValue = [\n !editControl.className.includes(\"rangeHigh\")\n ? e.target.value\n : value[0],\n editControl.className?.includes(\"rangeHigh\")\n ? e.target.value\n : value[1],\n ];\n onColumnFilterChange?.(updated, column, op);\n } else {\n onColumnFilterChange?.(e.target.value, column, op);\n }\n },\n [value, onColumnFilterChange, 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: handleInputChange,\n value: value[1],\n }\n : undefined,\n [handleInputChange, 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","queryClosest"],"mappings":"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"}
|
package/cjs/index.js
CHANGED
|
@@ -14,7 +14,6 @@ var filterUtils = require('./filter-utils.js');
|
|
|
14
14
|
var FilterModel = require('./FilterModel.js');
|
|
15
15
|
var InlineFilter = require('./inline-filter/InlineFilter.js');
|
|
16
16
|
var QuickFilters = require('./quick-filters/QuickFilters.js');
|
|
17
|
-
var BasicColumnFilter = require('./basic-column-filter/BasicColumnFilter.js');
|
|
18
17
|
var SavedFilterPanel = require('./saved-filters/SavedFilterPanel.js');
|
|
19
18
|
var FilterNamePrompt = require('./saved-filters/FilterNamePrompt.js');
|
|
20
19
|
|
|
@@ -56,7 +55,6 @@ exports.FilterClauseModel = FilterModel.FilterClauseModel;
|
|
|
56
55
|
exports.FilterModel = FilterModel.FilterModel;
|
|
57
56
|
exports.InlineFilter = InlineFilter.InlineFilter;
|
|
58
57
|
exports.QuickFilters = QuickFilters.QuickFilters;
|
|
59
|
-
exports.BasicColumnFilter = BasicColumnFilter.BasicColumnFilter;
|
|
60
58
|
exports.SavedFilterPanel = SavedFilterPanel.SavedFilterPanel;
|
|
61
59
|
exports.SaveFilterConfirmPrompt = FilterNamePrompt.FilterNamePrompt;
|
|
62
60
|
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -5,13 +5,14 @@ import { useWindow } from '@salt-ds/window';
|
|
|
5
5
|
import cx from 'clsx';
|
|
6
6
|
import columnFilterCss from './ColumnFilter.css.js';
|
|
7
7
|
import { getDataItemEditControl } from '@vuu-ui/vuu-data-react';
|
|
8
|
-
import { forwardRef
|
|
9
|
-
import { useColumnFilter
|
|
8
|
+
import { forwardRef } from 'react';
|
|
9
|
+
import { useColumnFilter } from './useColumnFilter.js';
|
|
10
10
|
|
|
11
11
|
const classBase = "vuuColumnFilter";
|
|
12
12
|
const ColumnFilter = forwardRef(function ColumnFilter2({
|
|
13
13
|
column,
|
|
14
14
|
className,
|
|
15
|
+
onCommit: onCommitProp,
|
|
15
16
|
operator = "=",
|
|
16
17
|
showOperatorPicker = false,
|
|
17
18
|
table,
|
|
@@ -28,26 +29,18 @@ const ColumnFilter = forwardRef(function ColumnFilter2({
|
|
|
28
29
|
const {
|
|
29
30
|
op,
|
|
30
31
|
allowedOperators,
|
|
31
|
-
filterValue,
|
|
32
32
|
inputProps,
|
|
33
33
|
rangeInputProps,
|
|
34
34
|
handleOperatorChange,
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
onCommit,
|
|
36
|
+
onCommitRange
|
|
37
37
|
} = useColumnFilter({
|
|
38
|
+
onCommit: onCommitProp,
|
|
38
39
|
operator,
|
|
39
40
|
column,
|
|
40
41
|
value,
|
|
41
42
|
onColumnFilterChange
|
|
42
43
|
});
|
|
43
|
-
useMemo(
|
|
44
|
-
() => assertValidOperator(allowedOperators, column, operator),
|
|
45
|
-
[column, operator, allowedOperators]
|
|
46
|
-
);
|
|
47
|
-
useMemo(
|
|
48
|
-
() => assertValidValue(column, op, filterValue),
|
|
49
|
-
[column, op, filterValue]
|
|
50
|
-
);
|
|
51
44
|
return /* @__PURE__ */ jsxs(
|
|
52
45
|
SegmentedButtonGroup,
|
|
53
46
|
{
|
|
@@ -78,15 +71,18 @@ const ColumnFilter = forwardRef(function ColumnFilter2({
|
|
|
78
71
|
] }) : null,
|
|
79
72
|
getDataItemEditControl({
|
|
80
73
|
InputProps: { inputProps },
|
|
74
|
+
commitOnBlur: false,
|
|
75
|
+
commitWhenCleared: true,
|
|
81
76
|
dataDescriptor: column,
|
|
82
|
-
onCommit
|
|
77
|
+
onCommit,
|
|
83
78
|
table
|
|
84
79
|
}),
|
|
85
80
|
op === "between" ? getDataItemEditControl({
|
|
86
81
|
className: `${classBase}-rangeHigh`,
|
|
82
|
+
commitWhenCleared: true,
|
|
87
83
|
InputProps: { inputProps: rangeInputProps },
|
|
88
84
|
dataDescriptor: column,
|
|
89
|
-
onCommit:
|
|
85
|
+
onCommit: onCommitRange,
|
|
90
86
|
table
|
|
91
87
|
}) : null
|
|
92
88
|
]
|
|
@@ -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
|
|
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 ...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 });\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":";;;;;;;;;;AAmBA,MAAM,SAAY,GAAA,iBAAA;AAeL,MAAA,YAAA,GAAe,UAAW,CAAA,SAASA,aAC9C,CAAA;AAAA,EACE,MAAA;AAAA,EACA,SAAA;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,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;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,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,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useState, useMemo, useCallback } from 'react';
|
|
2
2
|
import { queryClosest } from '@vuu-ui/vuu-utils';
|
|
3
3
|
import { getOperators } from '../filter-clause/operator-utils.js';
|
|
4
4
|
|
|
5
5
|
const assertValidOperator = (allowedOperators, column, op) => {
|
|
6
|
-
if (
|
|
6
|
+
if (op !== "between" && !allowedOperators.includes(op)) {
|
|
7
7
|
console.warn(
|
|
8
8
|
`[useColumnFilter] '${op} not supported for column ${column.name}'`
|
|
9
9
|
);
|
|
@@ -12,15 +12,11 @@ const assertValidOperator = (allowedOperators, column, op) => {
|
|
|
12
12
|
const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
13
13
|
if (value !== void 0) {
|
|
14
14
|
if (operator === "between") {
|
|
15
|
-
if (!Array.isArray(value)) {
|
|
15
|
+
if (!Array.isArray(value) || value.length !== 2) {
|
|
16
16
|
throw Error(
|
|
17
|
-
|
|
17
|
+
`[useColumnFilter] between operator requires array of two values, received ${value}`
|
|
18
18
|
);
|
|
19
|
-
} else if (value
|
|
20
|
-
throw Error(
|
|
21
|
-
`[useColumnFilter] 'between operator requires two values, received ${value}'`
|
|
22
|
-
);
|
|
23
|
-
} else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {
|
|
19
|
+
} else if (value[0] !== void 0 && value[1] !== void 0 && typeof value[0] !== typeof value[1]) {
|
|
24
20
|
throw Error(
|
|
25
21
|
`[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`
|
|
26
22
|
);
|
|
@@ -29,98 +25,74 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
|
29
25
|
}
|
|
30
26
|
};
|
|
31
27
|
const useColumnFilter = ({
|
|
28
|
+
onCommit,
|
|
32
29
|
operator = "=",
|
|
33
30
|
value,
|
|
34
31
|
column,
|
|
35
32
|
onColumnFilterChange
|
|
36
33
|
}) => {
|
|
37
|
-
const getDefaultValue = (op2) => op2 === "between" ? ["", ""] : "";
|
|
38
|
-
const filterValue = useRef(value ?? getDefaultValue(operator));
|
|
39
34
|
const [op, setOp] = useState(operator);
|
|
40
35
|
const allowedOperators = useMemo(() => getOperators(column), [column]);
|
|
41
36
|
useMemo(() => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
onColumnFilterChange?.(value, column, op);
|
|
46
|
-
}, 100);
|
|
47
|
-
}
|
|
48
|
-
}, [value, column, op, onColumnFilterChange]);
|
|
37
|
+
assertValidOperator(allowedOperators, column, operator);
|
|
38
|
+
assertValidValue(column, op, value);
|
|
39
|
+
}, [allowedOperators, column, operator, op, value]);
|
|
49
40
|
const handleOperatorChange = useCallback((changedOp) => {
|
|
50
41
|
setOp(changedOp);
|
|
51
42
|
}, []);
|
|
52
43
|
const handleCommit = useCallback(
|
|
53
|
-
(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
filterValue.current = [newValue.toString(), filterValue.current[1]];
|
|
57
|
-
if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
|
|
58
|
-
console.info(
|
|
59
|
-
"Range start or end value missing - ignoring onFilterChange"
|
|
60
|
-
);
|
|
61
|
-
}
|
|
44
|
+
(_e, newValue) => {
|
|
45
|
+
if (Array.isArray(value)) {
|
|
46
|
+
onCommit?.(column, op, [`${newValue}`, value[1]]);
|
|
62
47
|
} else {
|
|
63
|
-
|
|
48
|
+
onCommit?.(column, op, `${newValue}`);
|
|
64
49
|
}
|
|
65
|
-
onColumnFilterChange?.(filterValue.current, column, op);
|
|
66
50
|
},
|
|
67
|
-
[
|
|
51
|
+
[value, onCommit, column, op]
|
|
68
52
|
);
|
|
69
53
|
const handleRangeCommit = useCallback(
|
|
70
|
-
(
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
|
|
74
|
-
console.info(
|
|
75
|
-
"Range start or end value missing - ignoring onFilterChange"
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
} else {
|
|
79
|
-
filterValue.current = newValue;
|
|
80
|
-
}
|
|
81
|
-
onColumnFilterChange?.(filterValue.current, column, op);
|
|
54
|
+
(_e, newValue) => {
|
|
55
|
+
const [firstValue] = value;
|
|
56
|
+
onCommit?.(column, op, [firstValue, `${newValue}`]);
|
|
82
57
|
},
|
|
83
|
-
[
|
|
58
|
+
[onCommit, column, op, value]
|
|
84
59
|
);
|
|
85
60
|
const handleInputChange = useCallback(
|
|
86
61
|
(e) => {
|
|
87
|
-
if (Array.isArray(
|
|
62
|
+
if (Array.isArray(value)) {
|
|
88
63
|
const editControl = queryClosest(e.target, "[data-edit-control]", true);
|
|
89
64
|
const updated = [
|
|
90
|
-
!editControl.className
|
|
91
|
-
editControl.className?.includes("rangeHigh") ? e.target.value :
|
|
65
|
+
!editControl.className.includes("rangeHigh") ? e.target.value : value[0],
|
|
66
|
+
editControl.className?.includes("rangeHigh") ? e.target.value : value[1]
|
|
92
67
|
];
|
|
93
|
-
filterValue.current = updated;
|
|
94
68
|
onColumnFilterChange?.(updated, column, op);
|
|
95
69
|
} else {
|
|
96
|
-
filterValue.current = e.target.value;
|
|
97
70
|
onColumnFilterChange?.(e.target.value, column, op);
|
|
98
71
|
}
|
|
99
72
|
},
|
|
100
|
-
[
|
|
73
|
+
[value, onColumnFilterChange, column, op]
|
|
101
74
|
);
|
|
102
75
|
const inputProps = useMemo(
|
|
103
76
|
() => ({
|
|
104
77
|
onChange: handleInputChange,
|
|
105
|
-
value: Array.isArray(
|
|
78
|
+
value: Array.isArray(value) ? value[0] : value
|
|
106
79
|
}),
|
|
107
|
-
[handleInputChange]
|
|
80
|
+
[handleInputChange, value]
|
|
108
81
|
);
|
|
109
82
|
const rangeInputProps = useMemo(
|
|
110
|
-
() => ({
|
|
83
|
+
() => Array.isArray(value) ? {
|
|
111
84
|
onChange: handleInputChange,
|
|
112
|
-
value:
|
|
113
|
-
}
|
|
114
|
-
[handleInputChange]
|
|
85
|
+
value: value[1]
|
|
86
|
+
} : void 0,
|
|
87
|
+
[handleInputChange, value]
|
|
115
88
|
);
|
|
116
89
|
return {
|
|
117
90
|
op,
|
|
118
91
|
allowedOperators,
|
|
119
|
-
filterValue: filterValue.current,
|
|
120
92
|
inputProps,
|
|
121
93
|
rangeInputProps,
|
|
122
|
-
handleCommit,
|
|
123
|
-
handleRangeCommit,
|
|
94
|
+
onCommit: handleCommit,
|
|
95
|
+
onCommitRange: handleRangeCommit,
|
|
124
96
|
handleOperatorChange
|
|
125
97
|
};
|
|
126
98
|
};
|
|
@@ -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 {\n ChangeEventHandler,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { CommitHandler, queryClosest } 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 (\n !allowedOperators.find((filterClauseOp) => filterClauseOp === op) &&\n !(op === \"between\")\n ) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\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)) {\n throw Error(\n \"[useColumnFilter] 'between operator requires array of two values'\",\n );\n } else if (value.length !== 2) {\n throw Error(\n `[useColumnFilter] 'between operator requires two values, received ${value}'`,\n );\n } else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {\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\nexport const useColumnFilter = ({\n operator = \"=\",\n value,\n column,\n onColumnFilterChange,\n}: ColumnFilterHookProps) => {\n const getDefaultValue = (op: ColumnFilterOp): ColumnFilterValue =>\n op === \"between\" ? [\"\", \"\"] : \"\";\n const filterValue = useRef(value ?? getDefaultValue(operator));\n const [op, setOp] = useState(operator);\n const allowedOperators = useMemo(() => getOperators(column), [column]);\n\n useMemo(() => {\n if (value && value !== filterValue.current) {\n filterValue.current = value;\n setTimeout(() => {\n onColumnFilterChange?.(value, column, op);\n }, 100);\n }\n }, [value, column, op, onColumnFilterChange]);\n\n const handleOperatorChange = useCallback((changedOp: ColumnFilterOp) => {\n setOp(changedOp);\n }, []);\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n console.log(`[useColumnFilter] handleCommit ${newValue}`);\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [newValue.toString(), filterValue.current[1]];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as ColumnFilterValue;\n }\n onColumnFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onColumnFilterChange],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [filterValue.current[0], newValue.toString()];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as ColumnFilterValue;\n }\n onColumnFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onColumnFilterChange],\n );\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n if (Array.isArray(filterValue.current)) {\n const editControl = queryClosest(e.target, \"[data-edit-control]\", true);\n const updated: ColumnFilterValue = [\n !editControl.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[0],\n editControl.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[1],\n ];\n filterValue.current = updated;\n onColumnFilterChange?.(updated, column, op);\n } else {\n filterValue.current = e.target.value;\n onColumnFilterChange?.(e.target.value, column, op);\n }\n },\n [op, column, onColumnFilterChange],\n );\n\n const inputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[0]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n const rangeInputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[1]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n return {\n op,\n allowedOperators,\n filterValue: filterValue.current,\n inputProps,\n rangeInputProps,\n handleCommit,\n handleRangeCommit,\n handleOperatorChange,\n };\n};\n"],"names":["op"],"mappings":"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"}
|
|
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, queryClosest } 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 * 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}: 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 if (Array.isArray(value)) {\n const editControl = queryClosest(e.target, \"[data-edit-control]\", true);\n const updated: ColumnFilterValue = [\n !editControl.className.includes(\"rangeHigh\")\n ? e.target.value\n : value[0],\n editControl.className?.includes(\"rangeHigh\")\n ? e.target.value\n : value[1],\n ];\n onColumnFilterChange?.(updated, column, op);\n } else {\n onColumnFilterChange?.(e.target.value, column, op);\n }\n },\n [value, onColumnFilterChange, 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: handleInputChange,\n value: value[1],\n }\n : undefined,\n [handleInputChange, 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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"}
|
package/esm/index.js
CHANGED
|
@@ -12,7 +12,6 @@ export { AND, ENDS_WITH, EQUALS, GREATER_THAN, IN, LESS_THAN, OR, STARTS_WITH, a
|
|
|
12
12
|
export { FilterClauseModel, FilterModel } from './FilterModel.js';
|
|
13
13
|
export { InlineFilter } from './inline-filter/InlineFilter.js';
|
|
14
14
|
export { QuickFilters } from './quick-filters/QuickFilters.js';
|
|
15
|
-
export { BasicColumnFilter } from './basic-column-filter/BasicColumnFilter.js';
|
|
16
15
|
export { SavedFilterPanel } from './saved-filters/SavedFilterPanel.js';
|
|
17
16
|
export { FilterNamePrompt as SaveFilterConfirmPrompt } from './saved-filters/FilterNamePrompt.js';
|
|
18
17
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.13.
|
|
2
|
+
"version": "0.13.38",
|
|
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.38",
|
|
8
|
+
"@vuu-ui/vuu-protocol-types": "0.13.38",
|
|
9
|
+
"@vuu-ui/vuu-table-types": "0.13.38",
|
|
10
|
+
"@vuu-ui/vuu-filter-types": "0.13.38"
|
|
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.
|
|
13
|
+
"@vuu-ui/vuu-data-react": "0.13.38",
|
|
14
|
+
"@vuu-ui/vuu-filter-parser": "0.13.38",
|
|
15
|
+
"@vuu-ui/vuu-popups": "0.13.38",
|
|
16
|
+
"@vuu-ui/vuu-ui-controls": "0.13.38",
|
|
17
|
+
"@vuu-ui/vuu-table": "0.13.38",
|
|
18
|
+
"@vuu-ui/vuu-utils": "0.13.38",
|
|
19
19
|
"@salt-ds/core": "1.43.0",
|
|
20
20
|
"@salt-ds/styles": "0.2.1",
|
|
21
21
|
"@salt-ds/window": "0.1.1"
|
|
@@ -2,7 +2,7 @@ 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
|
-
export interface ColumnFilterProps extends SegmentedButtonGroupProps,
|
|
5
|
+
export interface ColumnFilterProps extends SegmentedButtonGroupProps, ColumnFilterHookProps {
|
|
6
6
|
/**
|
|
7
7
|
* Display operator picker.
|
|
8
8
|
*/
|
|
@@ -2,6 +2,7 @@ import { ColumnFilterChangeHandler, ColumnFilterOp, ColumnFilterValue, FilterCla
|
|
|
2
2
|
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
3
3
|
import { CommitHandler } from "@vuu-ui/vuu-utils";
|
|
4
4
|
export declare const assertValidOperator: (allowedOperators: FilterClauseOp[], column: ColumnDescriptor, op: ColumnFilterOp) => void;
|
|
5
|
+
export type ColumnFilterCommitHandler = (column: ColumnDescriptor, op: FilterClauseOp | "between", value: ColumnFilterValue) => void;
|
|
5
6
|
export declare const assertValidValue: ({ serverDataType: _ }: ColumnDescriptor, operator: ColumnFilterOp, value?: ColumnFilterValue) => void;
|
|
6
7
|
export type ColumnFilterHookProps = {
|
|
7
8
|
column: ColumnDescriptor;
|
|
@@ -15,14 +16,18 @@ export type ColumnFilterHookProps = {
|
|
|
15
16
|
* Filter change events.
|
|
16
17
|
*/
|
|
17
18
|
onColumnFilterChange?: ColumnFilterChangeHandler;
|
|
19
|
+
/**
|
|
20
|
+
* Called when user 'commits' filter value, either by pressing enter,
|
|
21
|
+
* tabbing away from control or making selection from list
|
|
22
|
+
*/
|
|
23
|
+
onCommit: ColumnFilterCommitHandler;
|
|
18
24
|
};
|
|
19
|
-
export declare const useColumnFilter: ({ operator, value, column, onColumnFilterChange, }: ColumnFilterHookProps) => {
|
|
25
|
+
export declare const useColumnFilter: ({ onCommit, operator, value, column, onColumnFilterChange, }: ColumnFilterHookProps) => {
|
|
20
26
|
op: "contains" | "starts" | "=" | "!=" | ">" | ">=" | "<=" | "<" | "ends" | "in" | "between";
|
|
21
27
|
allowedOperators: FilterClauseOp[];
|
|
22
|
-
filterValue: ColumnFilterValue;
|
|
23
28
|
inputProps: (Partial<import("react").InputHTMLAttributes<HTMLInputElement>> & import("@salt-ds/core").DataAttributes) | undefined;
|
|
24
29
|
rangeInputProps: (Partial<import("react").InputHTMLAttributes<HTMLInputElement>> & import("@salt-ds/core").DataAttributes) | undefined;
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
onCommit: CommitHandler<HTMLElement>;
|
|
31
|
+
onCommitRange: CommitHandler<HTMLElement>;
|
|
27
32
|
handleOperatorChange: (changedOp: ColumnFilterOp) => void;
|
|
28
33
|
};
|
package/types/index.d.ts
CHANGED
|
@@ -10,7 +10,6 @@ export * from "./filter-utils";
|
|
|
10
10
|
export * from "./FilterModel";
|
|
11
11
|
export * from "./inline-filter";
|
|
12
12
|
export * from "./quick-filters";
|
|
13
|
-
export { BasicColumnFilter, type BasicColumnFilterProps, } from "./basic-column-filter/BasicColumnFilter";
|
|
14
13
|
export { SavedFilterPanel } from "./saved-filters/SavedFilterPanel";
|
|
15
14
|
export type { FilterClickHandler, FilterDescriptor, } from "./saved-filters/useSavedFilterPanel";
|
|
16
15
|
export { FilterNamePrompt as SaveFilterConfirmPrompt, type FilterNamePromptProps as SaveFilterConfirmPromptProps, } from "./saved-filters/FilterNamePrompt";
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var basicColumnFilterCss = ".vuuBasicColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n border-radius: 4px;\n max-width: 210px;\n\n .vuuBasicColumnFilter-edit-control {\n display: flex;\n }\n}\n";
|
|
4
|
-
|
|
5
|
-
module.exports = basicColumnFilterCss;
|
|
6
|
-
//# sourceMappingURL=BasicColumnFilter.css.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BasicColumnFilter.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var styles = require('@salt-ds/styles');
|
|
5
|
-
var window = require('@salt-ds/window');
|
|
6
|
-
var cx = require('clsx');
|
|
7
|
-
var vuuDataReact = require('@vuu-ui/vuu-data-react');
|
|
8
|
-
var react = require('react');
|
|
9
|
-
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
10
|
-
var useBasicColumnFilter = require('./useBasicColumnFilter.js');
|
|
11
|
-
var BasicColumnFilter$1 = require('./BasicColumnFilter.css.js');
|
|
12
|
-
|
|
13
|
-
const classBase = "vuuBasicColumnFilter";
|
|
14
|
-
const searchIcon = /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: "search", size: 18 });
|
|
15
|
-
const BasicColumnFilter = react.forwardRef(function BasicColumnFilter2({
|
|
16
|
-
column,
|
|
17
|
-
className,
|
|
18
|
-
table,
|
|
19
|
-
initialValue,
|
|
20
|
-
onApplyFilter,
|
|
21
|
-
withStartAdornment = true,
|
|
22
|
-
...htmlAttributes
|
|
23
|
-
}, forwardRef2) {
|
|
24
|
-
const targetWindow = window.useWindow();
|
|
25
|
-
styles.useComponentCssInjection({
|
|
26
|
-
testId: "vuu-basic-column-filter",
|
|
27
|
-
css: BasicColumnFilter$1,
|
|
28
|
-
window: targetWindow
|
|
29
|
-
});
|
|
30
|
-
const { filterValue, onInputChange, onCommit } = useBasicColumnFilter.useBasicColumnFilter({
|
|
31
|
-
column,
|
|
32
|
-
initialValue,
|
|
33
|
-
onApplyFilter
|
|
34
|
-
});
|
|
35
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
36
|
-
"div",
|
|
37
|
-
{
|
|
38
|
-
...htmlAttributes,
|
|
39
|
-
className: cx(classBase, className),
|
|
40
|
-
ref: forwardRef2,
|
|
41
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-edit-control`, children: [
|
|
42
|
-
withStartAdornment && searchIcon,
|
|
43
|
-
vuuDataReact.getDataItemEditControl({
|
|
44
|
-
InputProps: {
|
|
45
|
-
inputProps: {
|
|
46
|
-
placeholder: "Find",
|
|
47
|
-
value: filterValue,
|
|
48
|
-
onChange: onInputChange
|
|
49
|
-
}
|
|
50
|
-
},
|
|
51
|
-
dataDescriptor: column,
|
|
52
|
-
table,
|
|
53
|
-
onCommit
|
|
54
|
-
})
|
|
55
|
-
] })
|
|
56
|
-
}
|
|
57
|
-
);
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
exports.BasicColumnFilter = BasicColumnFilter;
|
|
61
|
-
//# sourceMappingURL=BasicColumnFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BasicColumnFilter.js","sources":["../../../../packages/vuu-filters/src/basic-column-filter/BasicColumnFilter.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, HTMLAttributes, ReactElement } from \"react\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport { FilterBarProps } from \"../filter-bar\";\nimport { useBasicColumnFilter } from \"./useBasicColumnFilter\";\n\nimport basicColumnFilterCss from \"./BasicColumnFilter.css\";\n\nexport type FilterValue = string | number;\n\nconst classBase = \"vuuBasicColumnFilter\";\nconst searchIcon = <Icon name=\"search\" size={18} />;\n\nexport interface BasicColumnFilterProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<FilterBarProps, \"onApplyFilter\"> {\n /**\n * Column Attributes.\n */\n column: ColumnDescriptor;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n /**\n * Initial filter value.\n */\n initialValue?: FilterValue;\n /**\n *Show search icon as start adornment.\n */\n withStartAdornment?: boolean;\n}\n\nexport const BasicColumnFilter = forwardRef(function BasicColumnFilter(\n {\n column,\n className,\n table,\n initialValue,\n onApplyFilter,\n withStartAdornment = true,\n ...htmlAttributes\n }: BasicColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-basic-column-filter\",\n css: basicColumnFilterCss,\n window: targetWindow,\n });\n\n const { filterValue, onInputChange, onCommit } = useBasicColumnFilter({\n column,\n initialValue,\n onApplyFilter,\n });\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n <div className={`${classBase}-edit-control`}>\n {withStartAdornment && searchIcon}\n {getDataItemEditControl({\n InputProps: {\n inputProps: {\n placeholder: \"Find\",\n value: filterValue,\n onChange: onInputChange,\n },\n },\n dataDescriptor: column,\n table,\n onCommit,\n })}\n </div>\n </div>\n );\n}) as (\n props: BasicColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<BasicColumnFilterProps>;\n"],"names":["jsx","Icon","forwardRef","BasicColumnFilter","useWindow","useComponentCssInjection","basicColumnFilterCss","useBasicColumnFilter","jsxs","getDataItemEditControl"],"mappings":";;;;;;;;;;;;AAeA,MAAM,SAAY,GAAA,sBAAA;AAClB,MAAM,6BAAcA,cAAA,CAAAC,kBAAA,EAAA,EAAK,IAAK,EAAA,QAAA,EAAS,MAAM,EAAI,EAAA,CAAA;AAuBpC,MAAA,iBAAA,GAAoBC,gBAAW,CAAA,SAASC,kBACnD,CAAA;AAAA,EACE,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAqB,GAAA,IAAA;AAAA,EACrB,GAAG;AACL,CAAA,EACAD,WACA,EAAA;AACA,EAAA,MAAM,eAAeE,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,yBAAA;AAAA,IACR,GAAK,EAAAC,mBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,WAAA,EAAa,aAAe,EAAA,QAAA,KAAaC,yCAAqB,CAAA;AAAA,IACpE,MAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EACE,uBAAAP,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAKE,EAAAA,WAAAA;AAAA,MAEL,QAAC,kBAAAM,eAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CACzB,aAAA,CAAA,EAAA,QAAA,EAAA;AAAA,QAAsB,kBAAA,IAAA,UAAA;AAAA,QACtBC,mCAAuB,CAAA;AAAA,UACtB,UAAY,EAAA;AAAA,YACV,UAAY,EAAA;AAAA,cACV,WAAa,EAAA,MAAA;AAAA,cACb,KAAO,EAAA,WAAA;AAAA,cACP,QAAU,EAAA;AAAA;AACZ,WACF;AAAA,UACA,cAAgB,EAAA,MAAA;AAAA,UAChB,KAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH,EAAA;AAAA;AAAA,GACF;AAEJ,CAAC;;;;"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var react = require('react');
|
|
4
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
5
|
-
|
|
6
|
-
const filterOp = "=";
|
|
7
|
-
const asDataSourceFilter = (filter) => {
|
|
8
|
-
if (filter) {
|
|
9
|
-
return {
|
|
10
|
-
filter: vuuUtils.filterAsQuery(filter),
|
|
11
|
-
filterStruct: filter
|
|
12
|
-
};
|
|
13
|
-
} else {
|
|
14
|
-
return vuuUtils.NoFilter;
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
const useBasicColumnFilter = ({
|
|
18
|
-
initialValue,
|
|
19
|
-
column,
|
|
20
|
-
onApplyFilter
|
|
21
|
-
}) => {
|
|
22
|
-
const [filterValue, setFilterValue] = react.useState(initialValue);
|
|
23
|
-
const handleInputChange = react.useCallback(
|
|
24
|
-
(e) => {
|
|
25
|
-
setFilterValue(e.target.value);
|
|
26
|
-
},
|
|
27
|
-
[]
|
|
28
|
-
);
|
|
29
|
-
const handleCommit = react.useCallback(
|
|
30
|
-
(_, value) => {
|
|
31
|
-
const filter = { column: column.name, op: filterOp, value };
|
|
32
|
-
setFilterValue((value ?? "").toString());
|
|
33
|
-
onApplyFilter?.(asDataSourceFilter(filter));
|
|
34
|
-
},
|
|
35
|
-
[column, onApplyFilter]
|
|
36
|
-
);
|
|
37
|
-
return {
|
|
38
|
-
filterValue: filterValue ?? "",
|
|
39
|
-
onInputChange: handleInputChange,
|
|
40
|
-
onCommit: handleCommit
|
|
41
|
-
};
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
exports.useBasicColumnFilter = useBasicColumnFilter;
|
|
45
|
-
//# sourceMappingURL=useBasicColumnFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useBasicColumnFilter.js","sources":["../../../../packages/vuu-filters/src/basic-column-filter/useBasicColumnFilter.ts"],"sourcesContent":["import { ChangeEventHandler, useCallback, useState } from \"react\";\nimport { BasicColumnFilterProps } from \"./BasicColumnFilter\";\nimport { CommitHandler, filterAsQuery, NoFilter } from \"@vuu-ui/vuu-utils\";\nimport { Filter, SingleValueFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\n\nexport type FilterValue = string | number;\n\nexport type BasicColumnFilterHookProps = Pick<\n BasicColumnFilterProps,\n \"column\" | \"onApplyFilter\" | \"initialValue\"\n>;\n\nconst filterOp: SingleValueFilterClauseOp = \"=\";\n\nconst asDataSourceFilter = (filter: Filter): DataSourceFilter => {\n if (filter) {\n return {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n } else {\n return NoFilter;\n }\n};\n\nexport const useBasicColumnFilter = ({\n initialValue,\n column,\n onApplyFilter,\n}: BasicColumnFilterHookProps) => {\n const [filterValue, setFilterValue] = useState(initialValue);\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n setFilterValue(e.target.value);\n },\n [],\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (_, value) => {\n const filter: Filter = { column: column.name, op: filterOp, value };\n setFilterValue((value ?? \"\").toString());\n onApplyFilter?.(asDataSourceFilter(filter));\n },\n [column, onApplyFilter],\n );\n\n return {\n filterValue: filterValue ?? \"\",\n onInputChange: handleInputChange,\n onCommit: handleCommit,\n };\n};\n"],"names":["filterAsQuery","NoFilter","useState","useCallback"],"mappings":";;;;;AAaA,MAAM,QAAsC,GAAA,GAAA;AAE5C,MAAM,kBAAA,GAAqB,CAAC,MAAqC,KAAA;AAC/D,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,OAAA;AAAA,MACL,MAAA,EAAQA,uBAAc,MAAM,CAAA;AAAA,MAC5B,YAAc,EAAA;AAAA,KAChB;AAAA,GACK,MAAA;AACL,IAAO,OAAAC,iBAAA;AAAA;AAEX,CAAA;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAkC,KAAA;AAChC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAS,YAAY,CAAA;AAE3D,EAAA,MAAM,iBAAoB,GAAAC,iBAAA;AAAA,IACxB,CAAC,CAAM,KAAA;AACL,MAAe,cAAA,CAAA,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,KAC/B;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,YAAe,GAAAA,iBAAA;AAAA,IACnB,CAAC,GAAG,KAAU,KAAA;AACZ,MAAA,MAAM,SAAiB,EAAE,MAAA,EAAQ,OAAO,IAAM,EAAA,EAAA,EAAI,UAAU,KAAM,EAAA;AAClE,MAAgB,cAAA,CAAA,CAAA,KAAA,IAAS,EAAI,EAAA,QAAA,EAAU,CAAA;AACvC,MAAgB,aAAA,GAAA,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,KAC5C;AAAA,IACA,CAAC,QAAQ,aAAa;AAAA,GACxB;AAEA,EAAO,OAAA;AAAA,IACL,aAAa,WAAe,IAAA,EAAA;AAAA,IAC5B,aAAe,EAAA,iBAAA;AAAA,IACf,QAAU,EAAA;AAAA,GACZ;AACF;;;;"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
var basicColumnFilterCss = ".vuuBasicColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n border-radius: 4px;\n max-width: 210px;\n\n .vuuBasicColumnFilter-edit-control {\n display: flex;\n }\n}\n";
|
|
2
|
-
|
|
3
|
-
export { basicColumnFilterCss as default };
|
|
4
|
-
//# sourceMappingURL=BasicColumnFilter.css.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BasicColumnFilter.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
3
|
-
import { useWindow } from '@salt-ds/window';
|
|
4
|
-
import cx from 'clsx';
|
|
5
|
-
import { getDataItemEditControl } from '@vuu-ui/vuu-data-react';
|
|
6
|
-
import { forwardRef } from 'react';
|
|
7
|
-
import { Icon } from '@vuu-ui/vuu-ui-controls';
|
|
8
|
-
import { useBasicColumnFilter } from './useBasicColumnFilter.js';
|
|
9
|
-
import basicColumnFilterCss from './BasicColumnFilter.css.js';
|
|
10
|
-
|
|
11
|
-
const classBase = "vuuBasicColumnFilter";
|
|
12
|
-
const searchIcon = /* @__PURE__ */ jsx(Icon, { name: "search", size: 18 });
|
|
13
|
-
const BasicColumnFilter = forwardRef(function BasicColumnFilter2({
|
|
14
|
-
column,
|
|
15
|
-
className,
|
|
16
|
-
table,
|
|
17
|
-
initialValue,
|
|
18
|
-
onApplyFilter,
|
|
19
|
-
withStartAdornment = true,
|
|
20
|
-
...htmlAttributes
|
|
21
|
-
}, forwardRef2) {
|
|
22
|
-
const targetWindow = useWindow();
|
|
23
|
-
useComponentCssInjection({
|
|
24
|
-
testId: "vuu-basic-column-filter",
|
|
25
|
-
css: basicColumnFilterCss,
|
|
26
|
-
window: targetWindow
|
|
27
|
-
});
|
|
28
|
-
const { filterValue, onInputChange, onCommit } = useBasicColumnFilter({
|
|
29
|
-
column,
|
|
30
|
-
initialValue,
|
|
31
|
-
onApplyFilter
|
|
32
|
-
});
|
|
33
|
-
return /* @__PURE__ */ jsx(
|
|
34
|
-
"div",
|
|
35
|
-
{
|
|
36
|
-
...htmlAttributes,
|
|
37
|
-
className: cx(classBase, className),
|
|
38
|
-
ref: forwardRef2,
|
|
39
|
-
children: /* @__PURE__ */ jsxs("div", { className: `${classBase}-edit-control`, children: [
|
|
40
|
-
withStartAdornment && searchIcon,
|
|
41
|
-
getDataItemEditControl({
|
|
42
|
-
InputProps: {
|
|
43
|
-
inputProps: {
|
|
44
|
-
placeholder: "Find",
|
|
45
|
-
value: filterValue,
|
|
46
|
-
onChange: onInputChange
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
dataDescriptor: column,
|
|
50
|
-
table,
|
|
51
|
-
onCommit
|
|
52
|
-
})
|
|
53
|
-
] })
|
|
54
|
-
}
|
|
55
|
-
);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
export { BasicColumnFilter };
|
|
59
|
-
//# sourceMappingURL=BasicColumnFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BasicColumnFilter.js","sources":["../../../../packages/vuu-filters/src/basic-column-filter/BasicColumnFilter.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, HTMLAttributes, ReactElement } from \"react\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport { FilterBarProps } from \"../filter-bar\";\nimport { useBasicColumnFilter } from \"./useBasicColumnFilter\";\n\nimport basicColumnFilterCss from \"./BasicColumnFilter.css\";\n\nexport type FilterValue = string | number;\n\nconst classBase = \"vuuBasicColumnFilter\";\nconst searchIcon = <Icon name=\"search\" size={18} />;\n\nexport interface BasicColumnFilterProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<FilterBarProps, \"onApplyFilter\"> {\n /**\n * Column Attributes.\n */\n column: ColumnDescriptor;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n /**\n * Initial filter value.\n */\n initialValue?: FilterValue;\n /**\n *Show search icon as start adornment.\n */\n withStartAdornment?: boolean;\n}\n\nexport const BasicColumnFilter = forwardRef(function BasicColumnFilter(\n {\n column,\n className,\n table,\n initialValue,\n onApplyFilter,\n withStartAdornment = true,\n ...htmlAttributes\n }: BasicColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-basic-column-filter\",\n css: basicColumnFilterCss,\n window: targetWindow,\n });\n\n const { filterValue, onInputChange, onCommit } = useBasicColumnFilter({\n column,\n initialValue,\n onApplyFilter,\n });\n\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n <div className={`${classBase}-edit-control`}>\n {withStartAdornment && searchIcon}\n {getDataItemEditControl({\n InputProps: {\n inputProps: {\n placeholder: \"Find\",\n value: filterValue,\n onChange: onInputChange,\n },\n },\n dataDescriptor: column,\n table,\n onCommit,\n })}\n </div>\n </div>\n );\n}) as (\n props: BasicColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<BasicColumnFilterProps>;\n"],"names":["BasicColumnFilter","forwardRef"],"mappings":";;;;;;;;;;AAeA,MAAM,SAAY,GAAA,sBAAA;AAClB,MAAM,6BAAc,GAAA,CAAA,IAAA,EAAA,EAAK,IAAK,EAAA,QAAA,EAAS,MAAM,EAAI,EAAA,CAAA;AAuBpC,MAAA,iBAAA,GAAoB,UAAW,CAAA,SAASA,kBACnD,CAAA;AAAA,EACE,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAqB,GAAA,IAAA;AAAA,EACrB,GAAG;AACL,CAAA,EACAC,WACA,EAAA;AACA,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,yBAAA;AAAA,IACR,GAAK,EAAA,oBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,WAAA,EAAa,aAAe,EAAA,QAAA,KAAa,oBAAqB,CAAA;AAAA,IACpE,MAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAKA,EAAAA,WAAAA;AAAA,MAEL,QAAC,kBAAA,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CACzB,aAAA,CAAA,EAAA,QAAA,EAAA;AAAA,QAAsB,kBAAA,IAAA,UAAA;AAAA,QACtB,sBAAuB,CAAA;AAAA,UACtB,UAAY,EAAA;AAAA,YACV,UAAY,EAAA;AAAA,cACV,WAAa,EAAA,MAAA;AAAA,cACb,KAAO,EAAA,WAAA;AAAA,cACP,QAAU,EAAA;AAAA;AACZ,WACF;AAAA,UACA,cAAgB,EAAA,MAAA;AAAA,UAChB,KAAA;AAAA,UACA;AAAA,SACD;AAAA,OACH,EAAA;AAAA;AAAA,GACF;AAEJ,CAAC;;;;"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { useState, useCallback } from 'react';
|
|
2
|
-
import { filterAsQuery, NoFilter } from '@vuu-ui/vuu-utils';
|
|
3
|
-
|
|
4
|
-
const filterOp = "=";
|
|
5
|
-
const asDataSourceFilter = (filter) => {
|
|
6
|
-
if (filter) {
|
|
7
|
-
return {
|
|
8
|
-
filter: filterAsQuery(filter),
|
|
9
|
-
filterStruct: filter
|
|
10
|
-
};
|
|
11
|
-
} else {
|
|
12
|
-
return NoFilter;
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
const useBasicColumnFilter = ({
|
|
16
|
-
initialValue,
|
|
17
|
-
column,
|
|
18
|
-
onApplyFilter
|
|
19
|
-
}) => {
|
|
20
|
-
const [filterValue, setFilterValue] = useState(initialValue);
|
|
21
|
-
const handleInputChange = useCallback(
|
|
22
|
-
(e) => {
|
|
23
|
-
setFilterValue(e.target.value);
|
|
24
|
-
},
|
|
25
|
-
[]
|
|
26
|
-
);
|
|
27
|
-
const handleCommit = useCallback(
|
|
28
|
-
(_, value) => {
|
|
29
|
-
const filter = { column: column.name, op: filterOp, value };
|
|
30
|
-
setFilterValue((value ?? "").toString());
|
|
31
|
-
onApplyFilter?.(asDataSourceFilter(filter));
|
|
32
|
-
},
|
|
33
|
-
[column, onApplyFilter]
|
|
34
|
-
);
|
|
35
|
-
return {
|
|
36
|
-
filterValue: filterValue ?? "",
|
|
37
|
-
onInputChange: handleInputChange,
|
|
38
|
-
onCommit: handleCommit
|
|
39
|
-
};
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export { useBasicColumnFilter };
|
|
43
|
-
//# sourceMappingURL=useBasicColumnFilter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useBasicColumnFilter.js","sources":["../../../../packages/vuu-filters/src/basic-column-filter/useBasicColumnFilter.ts"],"sourcesContent":["import { ChangeEventHandler, useCallback, useState } from \"react\";\nimport { BasicColumnFilterProps } from \"./BasicColumnFilter\";\nimport { CommitHandler, filterAsQuery, NoFilter } from \"@vuu-ui/vuu-utils\";\nimport { Filter, SingleValueFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\n\nexport type FilterValue = string | number;\n\nexport type BasicColumnFilterHookProps = Pick<\n BasicColumnFilterProps,\n \"column\" | \"onApplyFilter\" | \"initialValue\"\n>;\n\nconst filterOp: SingleValueFilterClauseOp = \"=\";\n\nconst asDataSourceFilter = (filter: Filter): DataSourceFilter => {\n if (filter) {\n return {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n } else {\n return NoFilter;\n }\n};\n\nexport const useBasicColumnFilter = ({\n initialValue,\n column,\n onApplyFilter,\n}: BasicColumnFilterHookProps) => {\n const [filterValue, setFilterValue] = useState(initialValue);\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n setFilterValue(e.target.value);\n },\n [],\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (_, value) => {\n const filter: Filter = { column: column.name, op: filterOp, value };\n setFilterValue((value ?? \"\").toString());\n onApplyFilter?.(asDataSourceFilter(filter));\n },\n [column, onApplyFilter],\n );\n\n return {\n filterValue: filterValue ?? \"\",\n onInputChange: handleInputChange,\n onCommit: handleCommit,\n };\n};\n"],"names":[],"mappings":";;;AAaA,MAAM,QAAsC,GAAA,GAAA;AAE5C,MAAM,kBAAA,GAAqB,CAAC,MAAqC,KAAA;AAC/D,EAAA,IAAI,MAAQ,EAAA;AACV,IAAO,OAAA;AAAA,MACL,MAAA,EAAQ,cAAc,MAAM,CAAA;AAAA,MAC5B,YAAc,EAAA;AAAA,KAChB;AAAA,GACK,MAAA;AACL,IAAO,OAAA,QAAA;AAAA;AAEX,CAAA;AAEO,MAAM,uBAAuB,CAAC;AAAA,EACnC,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAkC,KAAA;AAChC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,YAAY,CAAA;AAE3D,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,CAAM,KAAA;AACL,MAAe,cAAA,CAAA,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,KAC/B;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,GAAG,KAAU,KAAA;AACZ,MAAA,MAAM,SAAiB,EAAE,MAAA,EAAQ,OAAO,IAAM,EAAA,EAAA,EAAI,UAAU,KAAM,EAAA;AAClE,MAAgB,cAAA,CAAA,CAAA,KAAA,IAAS,EAAI,EAAA,QAAA,EAAU,CAAA;AACvC,MAAgB,aAAA,GAAA,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,KAC5C;AAAA,IACA,CAAC,QAAQ,aAAa;AAAA,GACxB;AAEA,EAAO,OAAA;AAAA,IACL,aAAa,WAAe,IAAA,EAAA;AAAA,IAC5B,aAAe,EAAA,iBAAA;AAAA,IACf,QAAU,EAAA;AAAA,GACZ;AACF;;;;"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { ForwardedRef, HTMLAttributes, ReactElement } from "react";
|
|
2
|
-
import { VuuTable } from "@vuu-ui/vuu-protocol-types";
|
|
3
|
-
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
4
|
-
import { FilterBarProps } from "../filter-bar";
|
|
5
|
-
export type FilterValue = string | number;
|
|
6
|
-
export interface BasicColumnFilterProps extends HTMLAttributes<HTMLDivElement>, Pick<FilterBarProps, "onApplyFilter"> {
|
|
7
|
-
/**
|
|
8
|
-
* Column Attributes.
|
|
9
|
-
*/
|
|
10
|
-
column: ColumnDescriptor;
|
|
11
|
-
/**
|
|
12
|
-
* VuuTable is required if typeahead support is expected.
|
|
13
|
-
*/
|
|
14
|
-
table?: VuuTable;
|
|
15
|
-
/**
|
|
16
|
-
* Initial filter value.
|
|
17
|
-
*/
|
|
18
|
-
initialValue?: FilterValue;
|
|
19
|
-
/**
|
|
20
|
-
*Show search icon as start adornment.
|
|
21
|
-
*/
|
|
22
|
-
withStartAdornment?: boolean;
|
|
23
|
-
}
|
|
24
|
-
export declare const BasicColumnFilter: (props: BasicColumnFilterProps & {
|
|
25
|
-
ref?: ForwardedRef<HTMLDivElement>;
|
|
26
|
-
}) => ReactElement<BasicColumnFilterProps>;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { ChangeEventHandler } from "react";
|
|
2
|
-
import { BasicColumnFilterProps } from "./BasicColumnFilter";
|
|
3
|
-
import { CommitHandler } from "@vuu-ui/vuu-utils";
|
|
4
|
-
export type FilterValue = string | number;
|
|
5
|
-
export type BasicColumnFilterHookProps = Pick<BasicColumnFilterProps, "column" | "onApplyFilter" | "initialValue">;
|
|
6
|
-
export declare const useBasicColumnFilter: ({ initialValue, column, onApplyFilter, }: BasicColumnFilterHookProps) => {
|
|
7
|
-
filterValue: string | number;
|
|
8
|
-
onInputChange: ChangeEventHandler<HTMLInputElement>;
|
|
9
|
-
onCommit: CommitHandler<HTMLElement>;
|
|
10
|
-
};
|