@vuu-ui/vuu-filters 0.13.33 → 0.13.35
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.css.js +1 -1
- package/cjs/column-filter/ColumnFilter.js +41 -22
- package/cjs/column-filter/ColumnFilter.js.map +1 -1
- package/cjs/column-filter/useColumnFilter.js +111 -2
- package/cjs/column-filter/useColumnFilter.js.map +1 -1
- package/cjs/filter-clause/value-editors/FilterClauseValueEditorTime.js.map +1 -1
- package/esm/column-filter/ColumnFilter.css.js +1 -1
- package/esm/column-filter/ColumnFilter.js +43 -24
- package/esm/column-filter/ColumnFilter.js.map +1 -1
- package/esm/column-filter/useColumnFilter.js +110 -3
- package/esm/column-filter/useColumnFilter.js.map +1 -1
- package/esm/filter-clause/value-editors/FilterClauseValueEditorTime.js.map +1 -1
- package/package.json +11 -11
- package/types/column-filter/ColumnFilter.d.ts +9 -8
- package/types/column-filter/useColumnFilter.d.ts +27 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n
|
|
3
|
+
var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n width: var(--vuuColumnFilter-width, fit-content);\n\n\n .vuuColumnFilter-rangeHigh {\n position: relative;\n }\n\n .vuuColumnFilter-rangeHigh::before {\n content: \"\";\n width: 1px;\n position: absolute;\n background: var(--salt-separable-primary-borderColor);\n /* Accomodate button border */\n left: calc(-1 * var(--salt-spacing-100));\n top: -1px;\n bottom: -1px;\n }\n\n .vuuTimePicker {\n border-radius: 6px;\n }\n\n .vuuTimePicker + .vuuTimePicker {\n margin-left: var(--salt-spacing-100);\n }\n\n .vuuTimeInput {\n border: none;\n outline: none;\n }\n\n .vuuTimeInput:focus-visible {\n outline: none;\n }\n\n}\n\n.vuuColumnFilter-trigger {\n --saltButton-borderRadius: 4px 0px 0px 4px;\n --saltButton-padding: var(--salt-spacing-200);\n}\n";
|
|
4
4
|
|
|
5
5
|
module.exports = columnFilterCss;
|
|
6
6
|
//# sourceMappingURL=ColumnFilter.css.js.map
|
|
@@ -11,33 +11,51 @@ var react = require('react');
|
|
|
11
11
|
var useColumnFilter = require('./useColumnFilter.js');
|
|
12
12
|
|
|
13
13
|
const classBase = "vuuColumnFilter";
|
|
14
|
-
const ColumnFilter = ({
|
|
14
|
+
const ColumnFilter = react.forwardRef(function ColumnFilter2({
|
|
15
15
|
column,
|
|
16
16
|
className,
|
|
17
17
|
operator = "=",
|
|
18
18
|
showOperatorPicker = false,
|
|
19
19
|
table,
|
|
20
20
|
value,
|
|
21
|
+
onFilterChange,
|
|
21
22
|
...buttonGroupProps
|
|
22
|
-
})
|
|
23
|
+
}, forwardRef2) {
|
|
23
24
|
const targetWindow = window.useWindow();
|
|
24
25
|
styles.useComponentCssInjection({
|
|
25
|
-
testId: "vuu-filter
|
|
26
|
+
testId: "vuu-column-filter",
|
|
26
27
|
css: ColumnFilter$1,
|
|
27
28
|
window: targetWindow
|
|
28
29
|
});
|
|
30
|
+
const {
|
|
31
|
+
op,
|
|
32
|
+
allowedOperators,
|
|
33
|
+
filterValue,
|
|
34
|
+
inputProps,
|
|
35
|
+
rangeInputProps,
|
|
36
|
+
handleOperatorChange,
|
|
37
|
+
handleCommit,
|
|
38
|
+
handleRangeCommit
|
|
39
|
+
} = useColumnFilter.useColumnFilter({
|
|
40
|
+
operator,
|
|
41
|
+
column,
|
|
42
|
+
value,
|
|
43
|
+
onFilterChange
|
|
44
|
+
});
|
|
45
|
+
react.useMemo(
|
|
46
|
+
() => useColumnFilter.assertValidOperator(allowedOperators, column, operator),
|
|
47
|
+
[column, operator, allowedOperators]
|
|
48
|
+
);
|
|
29
49
|
react.useMemo(
|
|
30
|
-
() => useColumnFilter.assertValidValue(column,
|
|
31
|
-
[column,
|
|
50
|
+
() => useColumnFilter.assertValidValue(column, op, filterValue),
|
|
51
|
+
[column, op, filterValue]
|
|
32
52
|
);
|
|
33
|
-
const onCommit = react.useCallback((e, value2) => {
|
|
34
|
-
console.log(`onCommit ${value2}`);
|
|
35
|
-
}, []);
|
|
36
53
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
37
54
|
core.SegmentedButtonGroup,
|
|
38
55
|
{
|
|
39
56
|
...buttonGroupProps,
|
|
40
57
|
className: cx(classBase, className),
|
|
58
|
+
ref: forwardRef2,
|
|
41
59
|
children: [
|
|
42
60
|
showOperatorPicker ? /* @__PURE__ */ jsxRuntime.jsxs(core.Menu, { placement: "bottom-start", children: [
|
|
43
61
|
/* @__PURE__ */ jsxRuntime.jsx(core.MenuTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -48,34 +66,35 @@ const ColumnFilter = ({
|
|
|
48
66
|
className: `${classBase}-trigger`,
|
|
49
67
|
"data-embedded": true,
|
|
50
68
|
sentiment: "neutral",
|
|
51
|
-
children:
|
|
69
|
+
children: op
|
|
52
70
|
}
|
|
53
71
|
) }),
|
|
54
|
-
/* @__PURE__ */ jsxRuntime.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsx(core.MenuPanel, { children: allowedOperators.map((allowedOp) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
+
core.MenuItem,
|
|
74
|
+
{
|
|
75
|
+
onClick: () => handleOperatorChange(allowedOp),
|
|
76
|
+
children: allowedOp
|
|
77
|
+
},
|
|
78
|
+
`allowedOp`
|
|
79
|
+
)) })
|
|
61
80
|
] }) : null,
|
|
62
81
|
vuuDataReact.getDataItemEditControl({
|
|
82
|
+
InputProps: { inputProps },
|
|
63
83
|
dataDescriptor: column,
|
|
64
|
-
|
|
65
|
-
onCommit,
|
|
84
|
+
onCommit: handleCommit,
|
|
66
85
|
table
|
|
67
86
|
}),
|
|
68
|
-
|
|
87
|
+
op === "between" ? vuuDataReact.getDataItemEditControl({
|
|
69
88
|
className: `${classBase}-rangeHigh`,
|
|
89
|
+
InputProps: { inputProps: rangeInputProps },
|
|
70
90
|
dataDescriptor: column,
|
|
71
|
-
|
|
72
|
-
onCommit,
|
|
91
|
+
onCommit: handleRangeCommit,
|
|
73
92
|
table
|
|
74
93
|
}) : null
|
|
75
94
|
]
|
|
76
95
|
}
|
|
77
96
|
);
|
|
78
|
-
};
|
|
97
|
+
});
|
|
79
98
|
|
|
80
99
|
exports.ColumnFilter = ColumnFilter;
|
|
81
100
|
//# sourceMappingURL=ColumnFilter.js.map
|
|
@@ -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 {
|
|
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, useMemo } from \"react\";\nimport {\n assertValidOperator,\n assertValidValue,\n ColumnFilterHookProps,\n useColumnFilter,\n} from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n Pick<\n ColumnFilterHookProps,\n \"column\" | \"operator\" | \"value\" | \"onFilterChange\"\n > {\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 operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onFilterChange,\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 filterValue,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n handleCommit,\n handleRangeCommit,\n } = useColumnFilter({\n operator,\n column,\n value,\n onFilterChange,\n });\n\n useMemo(\n () => assertValidOperator(allowedOperators, column, operator),\n [column, operator, allowedOperators],\n );\n\n useMemo(\n () => assertValidValue(column, op, filterValue),\n [column, op, filterValue],\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 dataDescriptor: column,\n onCommit: handleCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: handleRangeCommit,\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","useMemo","assertValidOperator","assertValidValue","jsxs","SegmentedButtonGroup","Menu","jsx","MenuTrigger","Button","MenuPanel","MenuItem","getDataItemEditControl"],"mappings":"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"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
5
|
+
var operatorUtils = require('../filter-clause/operator-utils.js');
|
|
6
|
+
|
|
7
|
+
const assertValidOperator = (allowedOperators, column, op) => {
|
|
8
|
+
if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {
|
|
9
|
+
console.warn(
|
|
10
|
+
`[useColumnFilter] '${op} not supported for column ${column.name}'`
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
3
14
|
const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
4
15
|
if (value !== void 0) {
|
|
5
16
|
if (operator === "between") {
|
|
@@ -9,9 +20,9 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
|
9
20
|
);
|
|
10
21
|
} else if (value.length !== 2) {
|
|
11
22
|
throw Error(
|
|
12
|
-
`[useColumnFilter] 'between operator requires two values, received ${value
|
|
23
|
+
`[useColumnFilter] 'between operator requires two values, received ${value}'`
|
|
13
24
|
);
|
|
14
|
-
} else if (typeof value[0] !== typeof value[1]) {
|
|
25
|
+
} else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {
|
|
15
26
|
throw Error(
|
|
16
27
|
`[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`
|
|
17
28
|
);
|
|
@@ -19,6 +30,104 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
|
19
30
|
}
|
|
20
31
|
}
|
|
21
32
|
};
|
|
33
|
+
const useColumnFilter = ({
|
|
34
|
+
operator = "=",
|
|
35
|
+
value,
|
|
36
|
+
column,
|
|
37
|
+
onFilterChange
|
|
38
|
+
}) => {
|
|
39
|
+
const getDefaultValue = (op2) => op2 === "between" ? ["", ""] : "";
|
|
40
|
+
const filterValue = react.useRef(value ?? getDefaultValue(operator));
|
|
41
|
+
const [op, setOp] = react.useState(operator);
|
|
42
|
+
const allowedOperators = react.useMemo(() => operatorUtils.getOperators(column), [column]);
|
|
43
|
+
react.useMemo(() => {
|
|
44
|
+
if (value && value !== filterValue.current) {
|
|
45
|
+
filterValue.current = value;
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
onFilterChange?.(value, column, op);
|
|
48
|
+
}, 100);
|
|
49
|
+
}
|
|
50
|
+
}, [value, column, op, onFilterChange]);
|
|
51
|
+
const handleOperatorChange = react.useCallback((changedOp) => {
|
|
52
|
+
setOp(changedOp);
|
|
53
|
+
}, []);
|
|
54
|
+
const handleCommit = react.useCallback(
|
|
55
|
+
(e, newValue) => {
|
|
56
|
+
console.log(`[useColumnFilter] handleCommit ${newValue}`);
|
|
57
|
+
if (Array.isArray(filterValue.current)) {
|
|
58
|
+
filterValue.current = [newValue, 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
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
filterValue.current = newValue;
|
|
66
|
+
}
|
|
67
|
+
onFilterChange?.(filterValue.current, column, op);
|
|
68
|
+
},
|
|
69
|
+
[op, column, onFilterChange]
|
|
70
|
+
);
|
|
71
|
+
const handleRangeCommit = react.useCallback(
|
|
72
|
+
(e, newValue) => {
|
|
73
|
+
if (Array.isArray(filterValue.current)) {
|
|
74
|
+
filterValue.current = [filterValue.current[0], newValue];
|
|
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
|
+
onFilterChange?.(filterValue.current, column, op);
|
|
84
|
+
},
|
|
85
|
+
[op, column, onFilterChange]
|
|
86
|
+
);
|
|
87
|
+
const handleInputChange = react.useCallback(
|
|
88
|
+
(e) => {
|
|
89
|
+
if (Array.isArray(filterValue.current)) {
|
|
90
|
+
const editControl = vuuUtils.queryClosest(e.target, "[data-edit-control]", true);
|
|
91
|
+
const updated = [
|
|
92
|
+
!editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[0],
|
|
93
|
+
editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[1]
|
|
94
|
+
];
|
|
95
|
+
filterValue.current = updated;
|
|
96
|
+
onFilterChange?.(updated, column, op);
|
|
97
|
+
} else {
|
|
98
|
+
filterValue.current = e.target.value;
|
|
99
|
+
onFilterChange?.(e.target.value, column, op);
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
[op, column, onFilterChange]
|
|
103
|
+
);
|
|
104
|
+
const inputProps = react.useMemo(
|
|
105
|
+
() => ({
|
|
106
|
+
onChange: handleInputChange,
|
|
107
|
+
value: Array.isArray(filterValue.current) ? filterValue.current[0] : filterValue.current
|
|
108
|
+
}),
|
|
109
|
+
[handleInputChange]
|
|
110
|
+
);
|
|
111
|
+
const rangeInputProps = react.useMemo(
|
|
112
|
+
() => ({
|
|
113
|
+
onChange: handleInputChange,
|
|
114
|
+
value: Array.isArray(filterValue.current) ? filterValue.current[1] : filterValue.current
|
|
115
|
+
}),
|
|
116
|
+
[handleInputChange]
|
|
117
|
+
);
|
|
118
|
+
return {
|
|
119
|
+
op,
|
|
120
|
+
allowedOperators,
|
|
121
|
+
filterValue: filterValue.current,
|
|
122
|
+
inputProps,
|
|
123
|
+
rangeInputProps,
|
|
124
|
+
handleCommit,
|
|
125
|
+
handleRangeCommit,
|
|
126
|
+
handleOperatorChange
|
|
127
|
+
};
|
|
128
|
+
};
|
|
22
129
|
|
|
130
|
+
exports.assertValidOperator = assertValidOperator;
|
|
23
131
|
exports.assertValidValue = assertValidValue;
|
|
132
|
+
exports.useColumnFilter = useColumnFilter;
|
|
24
133
|
//# sourceMappingURL=useColumnFilter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterOp } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type FilterValue = string | number | [string, string] | [number, number];\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: FilterOp | \"between\",\n value?: FilterValue | FilterValue[],\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.length}'`,\n );\n } else if (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 interface ColumnFilterHookProps {\n column: ColumnDescriptor;\n operator?: FilterOp | \"between\";\n}\n\n// export const useColumnFilter = ({\n// column,\n// operator = \"=\",\n// }: ColumnFilterHookProps) => {};\n"],"names":[],"mappings":";;AAKO,MAAM,mBAAmB,CAC9B,EAAE,gBAAgB,CAAE,EAAA,EACpB,UACA,KACG,KAAA;AACH,EAAA,IAAI,UAAU,KAAW,CAAA,EAAA;AACvB,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ;AAAA,SACF;AAAA,OACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,kEAAA,EAAqE,MAAM,MAAM,CAAA,CAAA;AAAA,SACnF;AAAA,OACF,MAAA,IAAW,OAAO,KAAM,CAAA,CAAC,MAAM,OAAO,KAAA,CAAM,CAAC,CAAG,EAAA;AAC9C,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,0EAAA,EAA6E,OAAO,KAAM,CAAA,CAAC,CAAC,CAAQ,KAAA,EAAA,OAAO,KAAM,CAAA,CAAC,CAAC,CAAA;AAAA,SACrH;AAAA;AACF;AACF;AAGJ;;;;"}
|
|
1
|
+
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterClauseOp, FilterValue } 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 type Operator = FilterClauseOp | \"between\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: Operator,\n) => {\n if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: Operator,\n value?: FilterValue,\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?: Operator;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value?: FilterValue;\n /**\n * Filter change events.\n */\n onFilterChange?: (\n value: FilterValue,\n column: ColumnDescriptor,\n op: Operator,\n ) => void;\n};\n\nexport const useColumnFilter = ({\n operator = \"=\",\n value,\n column,\n onFilterChange,\n}: ColumnFilterHookProps) => {\n const getDefaultValue = (op: Operator) => (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 onFilterChange?.(value, column, op);\n }, 100);\n }\n }, [value, column, op, onFilterChange]);\n\n const handleOperatorChange = useCallback((changedOp: Operator) => {\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 as FilterValue, 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 FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [filterValue.current[0], newValue as FilterValue];\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 FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\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: FilterValue = [\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 onFilterChange?.(updated, column, op);\n } else {\n filterValue.current = e.target.value;\n onFilterChange?.(e.target.value, column, op);\n }\n },\n [op, column, onFilterChange],\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<
|
|
1
|
+
{"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLInputElement, string>>(\n (e, selectedDateInputValue) => {\n console.log(\"change time\");\n if (selectedDateInputValue) {\n const dateValue = toCalendarDate(new Date(selectedDateInputValue));\n setDate(dateValue);\n if (selectedDateInputValue /* && source === \"calendar\"*/) {\n onChangeValue(toEpochMilliS(dateValue));\n }\n }\n },\n [onChangeValue, toEpochMilliS],\n );\n\n const onBlur = useCallback(() => {\n date && onChangeValue(toEpochMilliS(date));\n }, [date, onChangeValue, toEpochMilliS]);\n\n return (\n <VuuTimePicker\n data-field=\"value\"\n // inputProps={inputProps}\n className={className}\n onBlur={onBlur}\n onCommit={handleCommit}\n // selectedDate={date}\n />\n );\n};\n\nfunction getInitialState(value: FilterClauseValueEditorTimeProps[\"value\"]) {\n return value ? toCalendarDate(new Date(value)) : undefined;\n}\n\nconst getEpochMillisConverter =\n (op: NumericFilterClauseOp) =>\n (date: DateValue, timezone: string = getLocalTimeZone()): number => {\n const d = date.toDate(timezone);\n switch (op) {\n case \">\":\n case \"<=\":\n d.setHours(23, 59, 59, 999);\n return d.getTime();\n case \">=\":\n case \"<\":\n case \"=\": // converted to \"< `start of next day` and >= `start of this day`\" when query is created\n case \"!=\": // converted to \">= `start of next day` or < `start of this day`\" when query is created\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n };\n"],"names":["useState","useCallback","toCalendarDate","jsx","VuuTimePicker","date","getLocalTimeZone"],"mappings":";;;;;;;;AAca,MAAA,2BAAA,GAA8B,CACzC,KACG,KAAA;AACH,EAAA,MAAM,EAAE,SAAA,EAAW,aAAe,EAAA,QAAA,EAAU,OAAU,GAAA,KAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,wBAAwB,QAAQ,CAAA;AAEtD,EAAM,MAAA,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA;AAAA,IAAgC,MACtD,gBAAgB,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,GAAG,sBAA2B,KAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,IAAI,sBAAwB,EAAA;AAC1B,QAAA,MAAM,SAAY,GAAAC,uBAAA,CAAe,IAAI,IAAA,CAAK,sBAAsB,CAAC,CAAA;AACjE,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,IAAI,sBAAsD,EAAA;AACxD,UAAc,aAAA,CAAA,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA;AACxC;AACF,KACF;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,GAC/B;AAEA,EAAM,MAAA,MAAA,GAASD,kBAAY,MAAM;AAC/B,IAAQ,IAAA,IAAA,aAAA,CAAc,aAAc,CAAA,IAAI,CAAC,CAAA;AAAA,GACxC,EAAA,CAAC,IAAM,EAAA,aAAA,EAAe,aAAa,CAAC,CAAA;AAEvC,EACE,uBAAAE,cAAA;AAAA,IAACC,2BAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MAEX,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA;AAAA;AAAA,GAEZ;AAEJ;AAEA,SAAS,gBAAgB,KAAkD,EAAA;AACzE,EAAA,OAAO,QAAQF,uBAAe,CAAA,IAAI,IAAK,CAAA,KAAK,CAAC,CAAI,GAAA,KAAA,CAAA;AACnD;AAEA,MAAM,0BACJ,CAAC,EAAA,KACD,CAACG,MAAiB,EAAA,QAAA,GAAmBC,uBAA+B,KAAA;AAClE,EAAM,MAAA,CAAA,GAAID,MAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC9B,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,CAAA;AAC1B,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA,IACnB,KAAK,IAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AAEvB,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n
|
|
1
|
+
var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n width: var(--vuuColumnFilter-width, fit-content);\n\n\n .vuuColumnFilter-rangeHigh {\n position: relative;\n }\n\n .vuuColumnFilter-rangeHigh::before {\n content: \"\";\n width: 1px;\n position: absolute;\n background: var(--salt-separable-primary-borderColor);\n /* Accomodate button border */\n left: calc(-1 * var(--salt-spacing-100));\n top: -1px;\n bottom: -1px;\n }\n\n .vuuTimePicker {\n border-radius: 6px;\n }\n\n .vuuTimePicker + .vuuTimePicker {\n margin-left: var(--salt-spacing-100);\n }\n\n .vuuTimeInput {\n border: none;\n outline: none;\n }\n\n .vuuTimeInput:focus-visible {\n outline: none;\n }\n\n}\n\n.vuuColumnFilter-trigger {\n --saltButton-borderRadius: 4px 0px 0px 4px;\n --saltButton-padding: var(--salt-spacing-200);\n}\n";
|
|
2
2
|
|
|
3
3
|
export { columnFilterCss as default };
|
|
4
4
|
//# sourceMappingURL=ColumnFilter.css.js.map
|
|
@@ -5,37 +5,55 @@ 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 {
|
|
9
|
-
import { assertValidValue } from './useColumnFilter.js';
|
|
8
|
+
import { forwardRef, useMemo } from 'react';
|
|
9
|
+
import { useColumnFilter, assertValidOperator, assertValidValue } from './useColumnFilter.js';
|
|
10
10
|
|
|
11
11
|
const classBase = "vuuColumnFilter";
|
|
12
|
-
const ColumnFilter = ({
|
|
12
|
+
const ColumnFilter = forwardRef(function ColumnFilter2({
|
|
13
13
|
column,
|
|
14
14
|
className,
|
|
15
15
|
operator = "=",
|
|
16
16
|
showOperatorPicker = false,
|
|
17
17
|
table,
|
|
18
18
|
value,
|
|
19
|
+
onFilterChange,
|
|
19
20
|
...buttonGroupProps
|
|
20
|
-
})
|
|
21
|
+
}, forwardRef2) {
|
|
21
22
|
const targetWindow = useWindow();
|
|
22
23
|
useComponentCssInjection({
|
|
23
|
-
testId: "vuu-filter
|
|
24
|
+
testId: "vuu-column-filter",
|
|
24
25
|
css: columnFilterCss,
|
|
25
26
|
window: targetWindow
|
|
26
27
|
});
|
|
28
|
+
const {
|
|
29
|
+
op,
|
|
30
|
+
allowedOperators,
|
|
31
|
+
filterValue,
|
|
32
|
+
inputProps,
|
|
33
|
+
rangeInputProps,
|
|
34
|
+
handleOperatorChange,
|
|
35
|
+
handleCommit,
|
|
36
|
+
handleRangeCommit
|
|
37
|
+
} = useColumnFilter({
|
|
38
|
+
operator,
|
|
39
|
+
column,
|
|
40
|
+
value,
|
|
41
|
+
onFilterChange
|
|
42
|
+
});
|
|
43
|
+
useMemo(
|
|
44
|
+
() => assertValidOperator(allowedOperators, column, operator),
|
|
45
|
+
[column, operator, allowedOperators]
|
|
46
|
+
);
|
|
27
47
|
useMemo(
|
|
28
|
-
() => assertValidValue(column,
|
|
29
|
-
[column,
|
|
48
|
+
() => assertValidValue(column, op, filterValue),
|
|
49
|
+
[column, op, filterValue]
|
|
30
50
|
);
|
|
31
|
-
const onCommit = useCallback((e, value2) => {
|
|
32
|
-
console.log(`onCommit ${value2}`);
|
|
33
|
-
}, []);
|
|
34
51
|
return /* @__PURE__ */ jsxs(
|
|
35
52
|
SegmentedButtonGroup,
|
|
36
53
|
{
|
|
37
54
|
...buttonGroupProps,
|
|
38
55
|
className: cx(classBase, className),
|
|
56
|
+
ref: forwardRef2,
|
|
39
57
|
children: [
|
|
40
58
|
showOperatorPicker ? /* @__PURE__ */ jsxs(Menu, { placement: "bottom-start", children: [
|
|
41
59
|
/* @__PURE__ */ jsx(MenuTrigger, { children: /* @__PURE__ */ jsx(
|
|
@@ -46,34 +64,35 @@ const ColumnFilter = ({
|
|
|
46
64
|
className: `${classBase}-trigger`,
|
|
47
65
|
"data-embedded": true,
|
|
48
66
|
sentiment: "neutral",
|
|
49
|
-
children:
|
|
67
|
+
children: op
|
|
50
68
|
}
|
|
51
69
|
) }),
|
|
52
|
-
/* @__PURE__ */
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
70
|
+
/* @__PURE__ */ jsx(MenuPanel, { children: allowedOperators.map((allowedOp) => /* @__PURE__ */ jsx(
|
|
71
|
+
MenuItem,
|
|
72
|
+
{
|
|
73
|
+
onClick: () => handleOperatorChange(allowedOp),
|
|
74
|
+
children: allowedOp
|
|
75
|
+
},
|
|
76
|
+
`allowedOp`
|
|
77
|
+
)) })
|
|
59
78
|
] }) : null,
|
|
60
79
|
getDataItemEditControl({
|
|
80
|
+
InputProps: { inputProps },
|
|
61
81
|
dataDescriptor: column,
|
|
62
|
-
|
|
63
|
-
onCommit,
|
|
82
|
+
onCommit: handleCommit,
|
|
64
83
|
table
|
|
65
84
|
}),
|
|
66
|
-
|
|
85
|
+
op === "between" ? getDataItemEditControl({
|
|
67
86
|
className: `${classBase}-rangeHigh`,
|
|
87
|
+
InputProps: { inputProps: rangeInputProps },
|
|
68
88
|
dataDescriptor: column,
|
|
69
|
-
|
|
70
|
-
onCommit,
|
|
89
|
+
onCommit: handleRangeCommit,
|
|
71
90
|
table
|
|
72
91
|
}) : null
|
|
73
92
|
]
|
|
74
93
|
}
|
|
75
94
|
);
|
|
76
|
-
};
|
|
95
|
+
});
|
|
77
96
|
|
|
78
97
|
export { ColumnFilter };
|
|
79
98
|
//# sourceMappingURL=ColumnFilter.js.map
|
|
@@ -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 {
|
|
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, useMemo } from \"react\";\nimport {\n assertValidOperator,\n assertValidValue,\n ColumnFilterHookProps,\n useColumnFilter,\n} from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n Pick<\n ColumnFilterHookProps,\n \"column\" | \"operator\" | \"value\" | \"onFilterChange\"\n > {\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 operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onFilterChange,\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 filterValue,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n handleCommit,\n handleRangeCommit,\n } = useColumnFilter({\n operator,\n column,\n value,\n onFilterChange,\n });\n\n useMemo(\n () => assertValidOperator(allowedOperators, column, operator),\n [column, operator, allowedOperators],\n );\n\n useMemo(\n () => assertValidValue(column, op, filterValue),\n [column, op, filterValue],\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 dataDescriptor: column,\n onCommit: handleCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: handleRangeCommit,\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":"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"}
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
import { useRef, useState, useMemo, useCallback } from 'react';
|
|
2
|
+
import { queryClosest } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { getOperators } from '../filter-clause/operator-utils.js';
|
|
4
|
+
|
|
5
|
+
const assertValidOperator = (allowedOperators, column, op) => {
|
|
6
|
+
if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {
|
|
7
|
+
console.warn(
|
|
8
|
+
`[useColumnFilter] '${op} not supported for column ${column.name}'`
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
1
12
|
const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
2
13
|
if (value !== void 0) {
|
|
3
14
|
if (operator === "between") {
|
|
@@ -7,9 +18,9 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
|
7
18
|
);
|
|
8
19
|
} else if (value.length !== 2) {
|
|
9
20
|
throw Error(
|
|
10
|
-
`[useColumnFilter] 'between operator requires two values, received ${value
|
|
21
|
+
`[useColumnFilter] 'between operator requires two values, received ${value}'`
|
|
11
22
|
);
|
|
12
|
-
} else if (typeof value[0] !== typeof value[1]) {
|
|
23
|
+
} else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {
|
|
13
24
|
throw Error(
|
|
14
25
|
`[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`
|
|
15
26
|
);
|
|
@@ -17,6 +28,102 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
|
|
|
17
28
|
}
|
|
18
29
|
}
|
|
19
30
|
};
|
|
31
|
+
const useColumnFilter = ({
|
|
32
|
+
operator = "=",
|
|
33
|
+
value,
|
|
34
|
+
column,
|
|
35
|
+
onFilterChange
|
|
36
|
+
}) => {
|
|
37
|
+
const getDefaultValue = (op2) => op2 === "between" ? ["", ""] : "";
|
|
38
|
+
const filterValue = useRef(value ?? getDefaultValue(operator));
|
|
39
|
+
const [op, setOp] = useState(operator);
|
|
40
|
+
const allowedOperators = useMemo(() => getOperators(column), [column]);
|
|
41
|
+
useMemo(() => {
|
|
42
|
+
if (value && value !== filterValue.current) {
|
|
43
|
+
filterValue.current = value;
|
|
44
|
+
setTimeout(() => {
|
|
45
|
+
onFilterChange?.(value, column, op);
|
|
46
|
+
}, 100);
|
|
47
|
+
}
|
|
48
|
+
}, [value, column, op, onFilterChange]);
|
|
49
|
+
const handleOperatorChange = useCallback((changedOp) => {
|
|
50
|
+
setOp(changedOp);
|
|
51
|
+
}, []);
|
|
52
|
+
const handleCommit = useCallback(
|
|
53
|
+
(e, newValue) => {
|
|
54
|
+
console.log(`[useColumnFilter] handleCommit ${newValue}`);
|
|
55
|
+
if (Array.isArray(filterValue.current)) {
|
|
56
|
+
filterValue.current = [newValue, 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
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
filterValue.current = newValue;
|
|
64
|
+
}
|
|
65
|
+
onFilterChange?.(filterValue.current, column, op);
|
|
66
|
+
},
|
|
67
|
+
[op, column, onFilterChange]
|
|
68
|
+
);
|
|
69
|
+
const handleRangeCommit = useCallback(
|
|
70
|
+
(e, newValue) => {
|
|
71
|
+
if (Array.isArray(filterValue.current)) {
|
|
72
|
+
filterValue.current = [filterValue.current[0], newValue];
|
|
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
|
+
onFilterChange?.(filterValue.current, column, op);
|
|
82
|
+
},
|
|
83
|
+
[op, column, onFilterChange]
|
|
84
|
+
);
|
|
85
|
+
const handleInputChange = useCallback(
|
|
86
|
+
(e) => {
|
|
87
|
+
if (Array.isArray(filterValue.current)) {
|
|
88
|
+
const editControl = queryClosest(e.target, "[data-edit-control]", true);
|
|
89
|
+
const updated = [
|
|
90
|
+
!editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[0],
|
|
91
|
+
editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[1]
|
|
92
|
+
];
|
|
93
|
+
filterValue.current = updated;
|
|
94
|
+
onFilterChange?.(updated, column, op);
|
|
95
|
+
} else {
|
|
96
|
+
filterValue.current = e.target.value;
|
|
97
|
+
onFilterChange?.(e.target.value, column, op);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
[op, column, onFilterChange]
|
|
101
|
+
);
|
|
102
|
+
const inputProps = useMemo(
|
|
103
|
+
() => ({
|
|
104
|
+
onChange: handleInputChange,
|
|
105
|
+
value: Array.isArray(filterValue.current) ? filterValue.current[0] : filterValue.current
|
|
106
|
+
}),
|
|
107
|
+
[handleInputChange]
|
|
108
|
+
);
|
|
109
|
+
const rangeInputProps = useMemo(
|
|
110
|
+
() => ({
|
|
111
|
+
onChange: handleInputChange,
|
|
112
|
+
value: Array.isArray(filterValue.current) ? filterValue.current[1] : filterValue.current
|
|
113
|
+
}),
|
|
114
|
+
[handleInputChange]
|
|
115
|
+
);
|
|
116
|
+
return {
|
|
117
|
+
op,
|
|
118
|
+
allowedOperators,
|
|
119
|
+
filterValue: filterValue.current,
|
|
120
|
+
inputProps,
|
|
121
|
+
rangeInputProps,
|
|
122
|
+
handleCommit,
|
|
123
|
+
handleRangeCommit,
|
|
124
|
+
handleOperatorChange
|
|
125
|
+
};
|
|
126
|
+
};
|
|
20
127
|
|
|
21
|
-
export { assertValidValue };
|
|
128
|
+
export { assertValidOperator, assertValidValue, useColumnFilter };
|
|
22
129
|
//# sourceMappingURL=useColumnFilter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterOp } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type FilterValue = string | number | [string, string] | [number, number];\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: FilterOp | \"between\",\n value?: FilterValue | FilterValue[],\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.length}'`,\n );\n } else if (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 interface ColumnFilterHookProps {\n column: ColumnDescriptor;\n operator?: FilterOp | \"between\";\n}\n\n// export const useColumnFilter = ({\n// column,\n// operator = \"=\",\n// }: ColumnFilterHookProps) => {};\n"],"names":[],"mappings":"AAKO,MAAM,mBAAmB,CAC9B,EAAE,gBAAgB,CAAE,EAAA,EACpB,UACA,KACG,KAAA;AACH,EAAA,IAAI,UAAU,KAAW,CAAA,EAAA;AACvB,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ;AAAA,SACF;AAAA,OACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,kEAAA,EAAqE,MAAM,MAAM,CAAA,CAAA;AAAA,SACnF;AAAA,OACF,MAAA,IAAW,OAAO,KAAM,CAAA,CAAC,MAAM,OAAO,KAAA,CAAM,CAAC,CAAG,EAAA;AAC9C,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,0EAAA,EAA6E,OAAO,KAAM,CAAA,CAAC,CAAC,CAAQ,KAAA,EAAA,OAAO,KAAM,CAAA,CAAC,CAAC,CAAA;AAAA,SACrH;AAAA;AACF;AACF;AAGJ;;;;"}
|
|
1
|
+
{"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterClauseOp, FilterValue } 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 type Operator = FilterClauseOp | \"between\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: Operator,\n) => {\n if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: Operator,\n value?: FilterValue,\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?: Operator;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value?: FilterValue;\n /**\n * Filter change events.\n */\n onFilterChange?: (\n value: FilterValue,\n column: ColumnDescriptor,\n op: Operator,\n ) => void;\n};\n\nexport const useColumnFilter = ({\n operator = \"=\",\n value,\n column,\n onFilterChange,\n}: ColumnFilterHookProps) => {\n const getDefaultValue = (op: Operator) => (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 onFilterChange?.(value, column, op);\n }, 100);\n }\n }, [value, column, op, onFilterChange]);\n\n const handleOperatorChange = useCallback((changedOp: Operator) => {\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 as FilterValue, 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 FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [filterValue.current[0], newValue as FilterValue];\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 FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\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: FilterValue = [\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 onFilterChange?.(updated, column, op);\n } else {\n filterValue.current = e.target.value;\n onFilterChange?.(e.target.value, column, op);\n }\n },\n [op, column, onFilterChange],\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<
|
|
1
|
+
{"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLInputElement, string>>(\n (e, selectedDateInputValue) => {\n console.log(\"change time\");\n if (selectedDateInputValue) {\n const dateValue = toCalendarDate(new Date(selectedDateInputValue));\n setDate(dateValue);\n if (selectedDateInputValue /* && source === \"calendar\"*/) {\n onChangeValue(toEpochMilliS(dateValue));\n }\n }\n },\n [onChangeValue, toEpochMilliS],\n );\n\n const onBlur = useCallback(() => {\n date && onChangeValue(toEpochMilliS(date));\n }, [date, onChangeValue, toEpochMilliS]);\n\n return (\n <VuuTimePicker\n data-field=\"value\"\n // inputProps={inputProps}\n className={className}\n onBlur={onBlur}\n onCommit={handleCommit}\n // selectedDate={date}\n />\n );\n};\n\nfunction getInitialState(value: FilterClauseValueEditorTimeProps[\"value\"]) {\n return value ? toCalendarDate(new Date(value)) : undefined;\n}\n\nconst getEpochMillisConverter =\n (op: NumericFilterClauseOp) =>\n (date: DateValue, timezone: string = getLocalTimeZone()): number => {\n const d = date.toDate(timezone);\n switch (op) {\n case \">\":\n case \"<=\":\n d.setHours(23, 59, 59, 999);\n return d.getTime();\n case \">=\":\n case \"<\":\n case \"=\": // converted to \"< `start of next day` and >= `start of this day`\" when query is created\n case \"!=\": // converted to \">= `start of next day` or < `start of this day`\" when query is created\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n };\n"],"names":[],"mappings":";;;;;;AAca,MAAA,2BAAA,GAA8B,CACzC,KACG,KAAA;AACH,EAAA,MAAM,EAAE,SAAA,EAAW,aAAe,EAAA,QAAA,EAAU,OAAU,GAAA,KAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,wBAAwB,QAAQ,CAAA;AAEtD,EAAM,MAAA,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,QAAA;AAAA,IAAgC,MACtD,gBAAgB,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,GAAG,sBAA2B,KAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,IAAI,sBAAwB,EAAA;AAC1B,QAAA,MAAM,SAAY,GAAA,cAAA,CAAe,IAAI,IAAA,CAAK,sBAAsB,CAAC,CAAA;AACjE,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,IAAI,sBAAsD,EAAA;AACxD,UAAc,aAAA,CAAA,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA;AACxC;AACF,KACF;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,GAC/B;AAEA,EAAM,MAAA,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAQ,IAAA,IAAA,aAAA,CAAc,aAAc,CAAA,IAAI,CAAC,CAAA;AAAA,GACxC,EAAA,CAAC,IAAM,EAAA,aAAA,EAAe,aAAa,CAAC,CAAA;AAEvC,EACE,uBAAA,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MAEX,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA;AAAA;AAAA,GAEZ;AAEJ;AAEA,SAAS,gBAAgB,KAAkD,EAAA;AACzE,EAAA,OAAO,QAAQ,cAAe,CAAA,IAAI,IAAK,CAAA,KAAK,CAAC,CAAI,GAAA,KAAA,CAAA;AACnD;AAEA,MAAM,0BACJ,CAAC,EAAA,KACD,CAAC,IAAiB,EAAA,QAAA,GAAmB,kBAA+B,KAAA;AAClE,EAAM,MAAA,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC9B,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,CAAA;AAC1B,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA,IACnB,KAAK,IAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AAEvB,CAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.13.
|
|
2
|
+
"version": "0.13.35",
|
|
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.35",
|
|
8
|
+
"@vuu-ui/vuu-protocol-types": "0.13.35",
|
|
9
|
+
"@vuu-ui/vuu-table-types": "0.13.35",
|
|
10
|
+
"@vuu-ui/vuu-filter-types": "0.13.35"
|
|
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.35",
|
|
14
|
+
"@vuu-ui/vuu-filter-parser": "0.13.35",
|
|
15
|
+
"@vuu-ui/vuu-popups": "0.13.35",
|
|
16
|
+
"@vuu-ui/vuu-ui-controls": "0.13.35",
|
|
17
|
+
"@vuu-ui/vuu-table": "0.13.35",
|
|
18
|
+
"@vuu-ui/vuu-utils": "0.13.35",
|
|
19
19
|
"@salt-ds/core": "1.43.0",
|
|
20
20
|
"@salt-ds/styles": "0.2.1",
|
|
21
21
|
"@salt-ds/window": "0.1.1"
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { SegmentedButtonGroupProps } from "@salt-ds/core";
|
|
2
|
+
import { ForwardedRef, ReactElement } from "react";
|
|
3
|
+
import { ColumnFilterHookProps } from "./useColumnFilter";
|
|
2
4
|
import { VuuTable } from "@vuu-ui/vuu-protocol-types";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
+
export interface ColumnFilterProps extends SegmentedButtonGroupProps, Pick<ColumnFilterHookProps, "column" | "operator" | "value" | "onFilterChange"> {
|
|
6
|
+
/**
|
|
7
|
+
* Display operator picker.
|
|
8
|
+
*/
|
|
5
9
|
showOperatorPicker?: boolean;
|
|
6
10
|
/**
|
|
7
11
|
* VuuTable is required if typeahead support is expected.
|
|
8
12
|
*/
|
|
9
13
|
table?: VuuTable;
|
|
10
|
-
/**
|
|
11
|
-
* Initial filter value. Pair of values expewcted when operator is
|
|
12
|
-
* 'between'
|
|
13
|
-
*/
|
|
14
|
-
value?: FilterValue | [FilterValue, FilterValue];
|
|
15
14
|
}
|
|
16
|
-
export declare const ColumnFilter: (
|
|
15
|
+
export declare const ColumnFilter: (props: ColumnFilterProps & {
|
|
16
|
+
ref?: ForwardedRef<HTMLDivElement>;
|
|
17
|
+
}) => ReactElement<ColumnFilterProps>;
|
|
@@ -1,8 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FilterClauseOp, FilterValue } from "@vuu-ui/vuu-filter-types";
|
|
2
2
|
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
export
|
|
3
|
+
import { CommitHandler } from "@vuu-ui/vuu-utils";
|
|
4
|
+
export type Operator = FilterClauseOp | "between";
|
|
5
|
+
export declare const assertValidOperator: (allowedOperators: FilterClauseOp[], column: ColumnDescriptor, op: Operator) => void;
|
|
6
|
+
export declare const assertValidValue: ({ serverDataType: _ }: ColumnDescriptor, operator: Operator, value?: FilterValue) => void;
|
|
7
|
+
export type ColumnFilterHookProps = {
|
|
6
8
|
column: ColumnDescriptor;
|
|
7
|
-
operator?:
|
|
8
|
-
|
|
9
|
+
operator?: Operator;
|
|
10
|
+
/**
|
|
11
|
+
* Filter value. Pair of values expected when operator is
|
|
12
|
+
* 'between'
|
|
13
|
+
*/
|
|
14
|
+
value?: FilterValue;
|
|
15
|
+
/**
|
|
16
|
+
* Filter change events.
|
|
17
|
+
*/
|
|
18
|
+
onFilterChange?: (value: FilterValue, column: ColumnDescriptor, op: Operator) => void;
|
|
19
|
+
};
|
|
20
|
+
export declare const useColumnFilter: ({ operator, value, column, onFilterChange, }: ColumnFilterHookProps) => {
|
|
21
|
+
op: "contains" | "starts" | "=" | "!=" | ">" | ">=" | "<=" | "<" | "ends" | "in" | "between";
|
|
22
|
+
allowedOperators: FilterClauseOp[];
|
|
23
|
+
filterValue: FilterValue;
|
|
24
|
+
inputProps: (Partial<import("react").InputHTMLAttributes<HTMLInputElement>> & import("@salt-ds/core").DataAttributes) | undefined;
|
|
25
|
+
rangeInputProps: (Partial<import("react").InputHTMLAttributes<HTMLInputElement>> & import("@salt-ds/core").DataAttributes) | undefined;
|
|
26
|
+
handleCommit: CommitHandler<HTMLElement>;
|
|
27
|
+
handleRangeCommit: CommitHandler<HTMLElement>;
|
|
28
|
+
handleOperatorChange: (changedOp: Operator) => void;
|
|
29
|
+
};
|