@vuu-ui/vuu-filters 3.5.0-beta.1 → 3.5.0-beta.2
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/package.json +12 -12
- package/src/column-filter/ColumnFilter.js +15 -6
- package/src/filter-container/FilterContainer.js +18 -4
- package/src/filter-context-menu/useFilterContextMenu.js +34 -9
- package/src/filter-provider/FilterContext.js +16 -1
- package/src/filter-provider/FilterProvider.js +14 -1
- package/src/index.js +1 -1
- package/types/column-filter/ColumnFilter.d.ts +13 -0
- package/types/filter-container/FilterContainer.d.ts +1 -1
- package/types/filter-context-menu/useFilterContextMenu.d.ts +11 -1
- package/types/filter-provider/FilterContext.d.ts +19 -0
- package/types/index.d.ts +2 -2
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.5.0-beta.
|
|
2
|
+
"version": "3.5.0-beta.2",
|
|
3
3
|
"main": "./src/index.js",
|
|
4
4
|
"author": "heswell",
|
|
5
5
|
"license": "Apache-2.0",
|
|
@@ -10,19 +10,19 @@
|
|
|
10
10
|
"type-defs": "node ../../scripts/build-type-defs.mjs"
|
|
11
11
|
},
|
|
12
12
|
"devDependencies": {
|
|
13
|
-
"@vuu-ui/vuu-data-types": "3.5.0-beta.
|
|
14
|
-
"@vuu-ui/vuu-protocol-types": "3.5.0-beta.
|
|
15
|
-
"@vuu-ui/vuu-table-types": "3.5.0-beta.
|
|
16
|
-
"@vuu-ui/vuu-filter-types": "3.5.0-beta.
|
|
13
|
+
"@vuu-ui/vuu-data-types": "3.5.0-beta.2",
|
|
14
|
+
"@vuu-ui/vuu-protocol-types": "3.5.0-beta.2",
|
|
15
|
+
"@vuu-ui/vuu-table-types": "3.5.0-beta.2",
|
|
16
|
+
"@vuu-ui/vuu-filter-types": "3.5.0-beta.2"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@vuu-ui/vuu-context-menu": "3.5.0-beta.
|
|
20
|
-
"@vuu-ui/vuu-data-react": "3.5.0-beta.
|
|
21
|
-
"@vuu-ui/vuu-filter-parser": "3.5.0-beta.
|
|
22
|
-
"@vuu-ui/vuu-popups": "3.5.0-beta.
|
|
23
|
-
"@vuu-ui/vuu-ui-controls": "3.5.0-beta.
|
|
24
|
-
"@vuu-ui/vuu-table": "3.5.0-beta.
|
|
25
|
-
"@vuu-ui/vuu-utils": "3.5.0-beta.
|
|
19
|
+
"@vuu-ui/vuu-context-menu": "3.5.0-beta.2",
|
|
20
|
+
"@vuu-ui/vuu-data-react": "3.5.0-beta.2",
|
|
21
|
+
"@vuu-ui/vuu-filter-parser": "3.5.0-beta.2",
|
|
22
|
+
"@vuu-ui/vuu-popups": "3.5.0-beta.2",
|
|
23
|
+
"@vuu-ui/vuu-ui-controls": "3.5.0-beta.2",
|
|
24
|
+
"@vuu-ui/vuu-table": "3.5.0-beta.2",
|
|
25
|
+
"@vuu-ui/vuu-utils": "3.5.0-beta.2",
|
|
26
26
|
"@salt-ds/core": "1.54.1",
|
|
27
27
|
"@salt-ds/lab": "1.0.0-alpha.83",
|
|
28
28
|
"@salt-ds/styles": "0.2.1",
|
|
@@ -2,23 +2,32 @@ import { jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { SegmentedButtonGroup } from "@salt-ds/core";
|
|
3
3
|
import { getDataItemEditControl } from "@vuu-ui/vuu-data-react";
|
|
4
4
|
import clsx from "clsx";
|
|
5
|
-
import { forwardRef as external_react_forwardRef } from "react";
|
|
5
|
+
import { forwardRef as external_react_forwardRef, useMemo } from "react";
|
|
6
6
|
import { useColumnFilter } from "./useColumnFilter.js";
|
|
7
7
|
import { useComponentCssInjection } from "@salt-ds/styles";
|
|
8
8
|
import { useWindow } from "@salt-ds/window";
|
|
9
9
|
import ColumnFilter_0 from "./ColumnFilter.css";
|
|
10
|
-
import { isBetweenOperator } from "@vuu-ui/vuu-utils";
|
|
10
|
+
import { isBetweenOperator, withDateTimePattern } from "@vuu-ui/vuu-utils";
|
|
11
11
|
const classBase = "vuuColumnFilter";
|
|
12
|
-
const ColumnFilter_ColumnFilter = /*#__PURE__*/ external_react_forwardRef(function({ InputProps: InputPropsProp, TypeaheadProps, className, column, defaultValue, extendedFilterOptions, onColumnFilterChange, onColumnRangeFilterChange, onCommit: onCommitProp, operator = "=", table, value: valueProp, values, variant, ...buttonGroupProps }, forwardRef) {
|
|
12
|
+
const ColumnFilter_ColumnFilter = /*#__PURE__*/ external_react_forwardRef(function({ InputProps: InputPropsProp, TypeaheadProps, className, column, defaultValue, extendedFilterOptions, onColumnFilterChange, onColumnRangeFilterChange, onCommit: onCommitProp, operator = "=", pattern, table, value: valueProp, values, variant, ...buttonGroupProps }, forwardRef) {
|
|
13
13
|
const targetWindow = useWindow();
|
|
14
14
|
useComponentCssInjection({
|
|
15
15
|
testId: "vuu-filter-editor",
|
|
16
16
|
css: ColumnFilter_0,
|
|
17
17
|
window: targetWindow
|
|
18
18
|
});
|
|
19
|
+
const { date, time } = pattern ?? {};
|
|
20
|
+
const controlDescriptor = useMemo(()=>withDateTimePattern(column, date || time ? {
|
|
21
|
+
date,
|
|
22
|
+
time
|
|
23
|
+
} : void 0), [
|
|
24
|
+
column,
|
|
25
|
+
date,
|
|
26
|
+
time
|
|
27
|
+
]);
|
|
19
28
|
const { InputProps, InputPropsRange, isInvalid, onCommit, onCommitRange } = useColumnFilter({
|
|
20
29
|
InputProps: InputPropsProp,
|
|
21
|
-
column,
|
|
30
|
+
column: controlDescriptor,
|
|
22
31
|
defaultValue,
|
|
23
32
|
extendedFilterOptions,
|
|
24
33
|
onColumnFilterChange,
|
|
@@ -38,7 +47,7 @@ const ColumnFilter_ColumnFilter = /*#__PURE__*/ external_react_forwardRef(functi
|
|
|
38
47
|
InputProps,
|
|
39
48
|
TypeaheadProps,
|
|
40
49
|
commitWhenCleared: true,
|
|
41
|
-
dataDescriptor:
|
|
50
|
+
dataDescriptor: controlDescriptor,
|
|
42
51
|
onCommit,
|
|
43
52
|
table,
|
|
44
53
|
values,
|
|
@@ -49,7 +58,7 @@ const ColumnFilter_ColumnFilter = /*#__PURE__*/ external_react_forwardRef(functi
|
|
|
49
58
|
className: `${classBase}-rangeHigh`,
|
|
50
59
|
commitWhenCleared: true,
|
|
51
60
|
variant,
|
|
52
|
-
dataDescriptor:
|
|
61
|
+
dataDescriptor: controlDescriptor,
|
|
53
62
|
onCommit: onCommitRange,
|
|
54
63
|
table
|
|
55
64
|
}) : null
|
|
@@ -1,17 +1,31 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
2
|
import clsx from "clsx";
|
|
3
|
-
import { useCallback, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
4
|
import { ColumnFilterContext, useFilterContainer, useFilterContext } from "./useFilterContainer.js";
|
|
5
5
|
import { ColumnFilter } from "../column-filter/ColumnFilter.js";
|
|
6
|
-
import { filterDescriptorHasFilter, isNullFilter, useSavedFilters } from "../filter-provider/FilterContext.js";
|
|
7
|
-
import { filtersAreEqual, getColumnValueFromFilter, getDefaultTimeRange, isBetweenOperator, isTimeDataValue } from "@vuu-ui/vuu-utils";
|
|
6
|
+
import { filterDescriptorHasFilter, isNullFilter, useColumnFilterRegistry, useSavedFilters } from "../filter-provider/FilterContext.js";
|
|
7
|
+
import { filtersAreEqual, getColumnValueFromFilter, getDefaultTimeRange, isBetweenOperator, isTimeDataValue, withDateTimePattern } from "@vuu-ui/vuu-utils";
|
|
8
8
|
import { useComponentCssInjection } from "@salt-ds/styles";
|
|
9
9
|
import { useWindow } from "@salt-ds/window";
|
|
10
10
|
import FilterContainer from "./FilterContainer.css";
|
|
11
11
|
const classBase = "vuuFilterContainer";
|
|
12
12
|
const notEmpty = (value)=>Array.isArray(value) ? "" !== value[0] && "" !== value[1] : "" !== value;
|
|
13
|
-
const FilterContainerColumnFilter = ({ column, operator = "=", variant, ...props })=>{
|
|
13
|
+
const FilterContainerColumnFilter = ({ column: columnProp, operator = "=", pattern, variant, ...props })=>{
|
|
14
|
+
const { date, time } = pattern ?? {};
|
|
15
|
+
const column = useMemo(()=>withDateTimePattern(columnProp, date || time ? {
|
|
16
|
+
date,
|
|
17
|
+
time
|
|
18
|
+
} : void 0), [
|
|
19
|
+
columnProp,
|
|
20
|
+
date,
|
|
21
|
+
time
|
|
22
|
+
]);
|
|
14
23
|
const { filterProviderKey, onChange: onFilterContextChange, onCommit: onFilterContextCommit, register } = useFilterContext(column, true);
|
|
24
|
+
const { registerColumnFilterColumn } = useColumnFilterRegistry(filterProviderKey);
|
|
25
|
+
useEffect(()=>registerColumnFilterColumn(column), [
|
|
26
|
+
column,
|
|
27
|
+
registerColumnFilterColumn
|
|
28
|
+
]);
|
|
15
29
|
const initialValue = useMemo(()=>register(column, operator), [
|
|
16
30
|
column,
|
|
17
31
|
operator,
|
|
@@ -1,14 +1,37 @@
|
|
|
1
|
-
import { filtersAreEqual } from "@vuu-ui/vuu-utils";
|
|
1
|
+
import { filtersAreEqual, getTemporalCellFilter, getTemporalInfo, withDateTimePattern } from "@vuu-ui/vuu-utils";
|
|
2
2
|
import { useCallback, useMemo, useRef } from "react";
|
|
3
|
-
import { useSavedFilters } from "../filter-provider/FilterContext.js";
|
|
3
|
+
import { useColumnFilterRegistry, useSavedFilters } from "../filter-provider/FilterContext.js";
|
|
4
4
|
import { FilterAggregator } from "../FilterAggregator.js";
|
|
5
5
|
const EmptyAggregator = new FilterAggregator();
|
|
6
6
|
const defaultProps = {
|
|
7
7
|
filterColumns: "*"
|
|
8
8
|
};
|
|
9
|
-
const useFilterContextMenu = ({ filterColumns = "*", filterProviderKey } = defaultProps)=>{
|
|
9
|
+
const useFilterContextMenu = ({ filterColumns = "*", filterPatterns, filterProviderKey } = defaultProps)=>{
|
|
10
10
|
const { currentFilter, clearCurrentFilter, setCurrentFilter } = useSavedFilters(filterProviderKey);
|
|
11
|
+
const { getColumnFilterColumn } = useColumnFilterRegistry(filterProviderKey);
|
|
11
12
|
const filterAggregatorRef = useRef(EmptyAggregator);
|
|
13
|
+
const getCellFilter = useCallback((column, dataRow)=>{
|
|
14
|
+
const value = dataRow[column.name];
|
|
15
|
+
if (getTemporalInfo(column)) {
|
|
16
|
+
const pattern = filterPatterns?.[column.name];
|
|
17
|
+
const columnFilterColumn = pattern ? void 0 : getColumnFilterColumn(column.name);
|
|
18
|
+
const filterColumn = pattern ? withDateTimePattern(column, pattern) : columnFilterColumn;
|
|
19
|
+
const temporalCellFilter = getTemporalCellFilter(filterColumn ?? column, value, void 0 !== columnFilterColumn);
|
|
20
|
+
if (temporalCellFilter) return {
|
|
21
|
+
column: filterColumn ?? column,
|
|
22
|
+
...temporalCellFilter
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
column,
|
|
27
|
+
label: `${value}`,
|
|
28
|
+
op: "=",
|
|
29
|
+
value
|
|
30
|
+
};
|
|
31
|
+
}, [
|
|
32
|
+
filterPatterns,
|
|
33
|
+
getColumnFilterColumn
|
|
34
|
+
]);
|
|
12
35
|
useMemo(()=>{
|
|
13
36
|
if (!filtersAreEqual(currentFilter.filter, filterAggregatorRef.current.filter)) filterAggregatorRef.current = currentFilter.filter ? new FilterAggregator(currentFilter.filter) : new FilterAggregator();
|
|
14
37
|
}, [
|
|
@@ -18,13 +41,13 @@ const useFilterContextMenu = ({ filterColumns = "*", filterProviderKey } = defau
|
|
|
18
41
|
const { column, dataRow } = options;
|
|
19
42
|
const { current: fag } = filterAggregatorRef;
|
|
20
43
|
const { name, label = name } = column;
|
|
21
|
-
const value = dataRow[column.name];
|
|
22
44
|
const ClearFilter = {
|
|
23
45
|
id: "filter-clear",
|
|
24
46
|
label: "Clear filter",
|
|
25
47
|
options
|
|
26
48
|
};
|
|
27
49
|
if ("*" === filterColumns || filterColumns.includes(column.name)) {
|
|
50
|
+
const { label: value } = getCellFilter(column, dataRow);
|
|
28
51
|
const SetFilter = {
|
|
29
52
|
id: "filter-set",
|
|
30
53
|
label: `Set filter ${label} '${value}'`,
|
|
@@ -60,7 +83,8 @@ const useFilterContextMenu = ({ filterColumns = "*", filterProviderKey } = defau
|
|
|
60
83
|
];
|
|
61
84
|
return [];
|
|
62
85
|
}, [
|
|
63
|
-
filterColumns
|
|
86
|
+
filterColumns,
|
|
87
|
+
getCellFilter
|
|
64
88
|
]);
|
|
65
89
|
const menuActionHandler = useCallback((menuItemId, options)=>{
|
|
66
90
|
if (!options) return false;
|
|
@@ -73,8 +97,8 @@ const useFilterContextMenu = ({ filterColumns = "*", filterProviderKey } = defau
|
|
|
73
97
|
break;
|
|
74
98
|
case "filter-add":
|
|
75
99
|
{
|
|
76
|
-
const
|
|
77
|
-
fag.add(column, value,
|
|
100
|
+
const cellFilter = getCellFilter(column, dataRow);
|
|
101
|
+
fag.add(cellFilter.column, cellFilter.value, cellFilter.op);
|
|
78
102
|
if (fag.filter) setCurrentFilter(fag.filter);
|
|
79
103
|
}
|
|
80
104
|
break;
|
|
@@ -84,9 +108,9 @@ const useFilterContextMenu = ({ filterColumns = "*", filterProviderKey } = defau
|
|
|
84
108
|
break;
|
|
85
109
|
case "filter-set":
|
|
86
110
|
{
|
|
87
|
-
const
|
|
111
|
+
const cellFilter = getCellFilter(column, dataRow);
|
|
88
112
|
fag.clear();
|
|
89
|
-
fag.add(column, value,
|
|
113
|
+
fag.add(cellFilter.column, cellFilter.value, cellFilter.op);
|
|
90
114
|
if (fag.filter) setCurrentFilter(fag.filter);
|
|
91
115
|
}
|
|
92
116
|
break;
|
|
@@ -96,6 +120,7 @@ const useFilterContextMenu = ({ filterColumns = "*", filterProviderKey } = defau
|
|
|
96
120
|
}
|
|
97
121
|
}, [
|
|
98
122
|
clearCurrentFilter,
|
|
123
|
+
getCellFilter,
|
|
99
124
|
setCurrentFilter
|
|
100
125
|
]);
|
|
101
126
|
return {
|
|
@@ -31,6 +31,21 @@ const FilterContext = createContext({
|
|
|
31
31
|
clearCurrentFilter: ()=>console.warn("[FilterContext] clearFilter, no FilterProvider has been configured"),
|
|
32
32
|
setCurrentFilter: ()=>console.warn("[FilterContext] setCurrentFilter, no FilterProvider has been configured")
|
|
33
33
|
});
|
|
34
|
+
function useColumnFilterRegistry(key = "GLOBAL") {
|
|
35
|
+
const { getColumnFilterColumn, registerColumnFilterColumn } = useContext(FilterContext);
|
|
36
|
+
const getColumn = useCallback((columnName)=>getColumnFilterColumn?.(key, columnName), [
|
|
37
|
+
getColumnFilterColumn,
|
|
38
|
+
key
|
|
39
|
+
]);
|
|
40
|
+
const register = useCallback((column)=>registerColumnFilterColumn?.(key, column), [
|
|
41
|
+
key,
|
|
42
|
+
registerColumnFilterColumn
|
|
43
|
+
]);
|
|
44
|
+
return {
|
|
45
|
+
getColumnFilterColumn: getColumn,
|
|
46
|
+
registerColumnFilterColumn: register
|
|
47
|
+
};
|
|
48
|
+
}
|
|
34
49
|
function useSavedFilters(key = "GLOBAL", props) {
|
|
35
50
|
const { onFilterMenuAction, filterDescriptors, saveFilter, setCurrentFilter, filterNameMaxLength } = useContext(FilterContext);
|
|
36
51
|
const handleFilterMenuAction = useCallback((filterId, filterAction)=>{
|
|
@@ -68,4 +83,4 @@ function useSavedFilters(key = "GLOBAL", props) {
|
|
|
68
83
|
filterNameMaxLength
|
|
69
84
|
};
|
|
70
85
|
}
|
|
71
|
-
export { EMPTY_FILTER, EmptyFilterDescriptor, FilterContext, NULL_FILTER, NullFilterDescriptor, UNSAVED_FILTER, filterDescriptorHasFilter, isEmptyFilter, isNullFilter, useSavedFilters };
|
|
86
|
+
export { EMPTY_FILTER, EmptyFilterDescriptor, FilterContext, NULL_FILTER, NullFilterDescriptor, UNSAVED_FILTER, filterDescriptorHasFilter, isEmptyFilter, isNullFilter, useColumnFilterRegistry, useSavedFilters };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useMemo, useState } from "react";
|
|
2
|
+
import { useCallback, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { FilterNamePrompt } from "../saved-filters/FilterNamePrompt.js";
|
|
4
4
|
import { DeleteFilterPrompt } from "../saved-filters/DeleteFilterPrompt.js";
|
|
5
5
|
import { activateFilter, findFilter, insertOrReplaceFilter, renameFilter } from "./filter-descriptor-utils.js";
|
|
@@ -20,6 +20,17 @@ const FilterProvider = ({ children, onFiltersSaved, savedFilters: savedFiltersPr
|
|
|
20
20
|
savedFiltersProp
|
|
21
21
|
]);
|
|
22
22
|
const [dialog, setDialog] = useState(null);
|
|
23
|
+
const columnFilterColumnsRef = useRef(new Map());
|
|
24
|
+
const registerColumnFilterColumn = useCallback((key, column)=>{
|
|
25
|
+
const { current: columnsByKey } = columnFilterColumnsRef;
|
|
26
|
+
let columns = columnsByKey.get(key);
|
|
27
|
+
if (void 0 === columns) columnsByKey.set(key, columns = new Map());
|
|
28
|
+
columns.set(column.name, column);
|
|
29
|
+
return ()=>{
|
|
30
|
+
if (columns.get(column.name) === column) columns.delete(column.name);
|
|
31
|
+
};
|
|
32
|
+
}, []);
|
|
33
|
+
const getColumnFilterColumn = useCallback((key, columnName)=>columnFilterColumnsRef.current.get(key)?.get(columnName), []);
|
|
23
34
|
const deleteFilter = useCallback((key, filterId)=>{
|
|
24
35
|
const filterDescriptors = savedFilters.get(key);
|
|
25
36
|
if (void 0 === filterDescriptors) throw Error(`[FilterProvider] deleteFilter, key ${key} not found`);
|
|
@@ -171,6 +182,8 @@ const FilterProvider = ({ children, onFiltersSaved, savedFilters: savedFiltersPr
|
|
|
171
182
|
]);
|
|
172
183
|
return /*#__PURE__*/ jsxs(FilterContext.Provider, {
|
|
173
184
|
value: {
|
|
185
|
+
getColumnFilterColumn,
|
|
186
|
+
registerColumnFilterColumn,
|
|
174
187
|
onFilterMenuAction: handleFilterMenuAction,
|
|
175
188
|
deleteFilter,
|
|
176
189
|
saveFilter: handleSaveFilter,
|
package/src/index.js
CHANGED
|
@@ -13,7 +13,7 @@ export { useFilterContextMenu } from "./filter-context-menu/useFilterContextMenu
|
|
|
13
13
|
export { FilterDisplay } from "./filter-display/FilterDisplay.js";
|
|
14
14
|
export { FilterPanel } from "./filter-panel/FilterPanel.js";
|
|
15
15
|
export { FilterPillNext } from "./filter-pill/FilterPillNext.js";
|
|
16
|
-
export { NULL_FILTER, useSavedFilters } from "./filter-provider/FilterContext.js";
|
|
16
|
+
export { NULL_FILTER, useColumnFilterRegistry, useSavedFilters } from "./filter-provider/FilterContext.js";
|
|
17
17
|
export { FilterProvider } from "./filter-provider/FilterProvider.js";
|
|
18
18
|
export { FilterNamePrompt as SaveFilterConfirmPrompt } from "./saved-filters/FilterNamePrompt.js";
|
|
19
19
|
export { SavedFilterPanel } from "./saved-filters/SavedFilterPanel.js";
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import { type SegmentedButtonGroupProps } from "@salt-ds/core";
|
|
2
2
|
import { DataItemEditControlProps } from "@vuu-ui/vuu-data-react";
|
|
3
3
|
import { ColumnFilterHookProps } from "./useColumnFilter";
|
|
4
|
+
import { type DateTimePattern } from "@vuu-ui/vuu-utils";
|
|
4
5
|
export interface ColumnFilterProps extends ColumnFilterHookProps, Omit<SegmentedButtonGroupProps, "defaultValue">, Pick<DataItemEditControlProps, "TypeaheadProps" | "table" | "values" | "variant"> {
|
|
6
|
+
/**
|
|
7
|
+
* Temporal columns only. The date/time pattern used by the filter control,
|
|
8
|
+
* overriding any pattern configured on the column type. The pattern also
|
|
9
|
+
* determines the control rendered: a time picker for a time only pattern
|
|
10
|
+
* (with milliseconds if time is 'hh:mm:ss.ms'), otherwise a date picker.
|
|
11
|
+
* This allows a filter to use different formatting to the Table, e.g.
|
|
12
|
+
* the Table might display nanoseconds whilst the filter accepts a time
|
|
13
|
+
* of day with milliseconds. The column passed to change and commit
|
|
14
|
+
* handlers is the column with this pattern applied (see withDateTimePattern),
|
|
15
|
+
* so that filter values are interpreted consistently with the control.
|
|
16
|
+
*/
|
|
17
|
+
pattern?: DateTimePattern;
|
|
5
18
|
}
|
|
6
19
|
export declare const ColumnFilter: import("react").ForwardRefExoticComponent<ColumnFilterProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -9,7 +9,7 @@ export interface FilterContainerProps extends HTMLAttributes<HTMLDivElement>, Co
|
|
|
9
9
|
export interface FilterContainerColumnFilterProps extends Omit<ColumnFilterProps, "defaultValue" | "onCommit" | "value"> {
|
|
10
10
|
defaultValue?: ColumnFilterValue;
|
|
11
11
|
}
|
|
12
|
-
export declare const FilterContainerColumnFilter: ({ column, operator, variant, ...props }: FilterContainerColumnFilterProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare const FilterContainerColumnFilter: ({ column: columnProp, operator, pattern, variant, ...props }: FilterContainerColumnFilterProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
13
|
/**
|
|
14
14
|
* FilterContainer is a generic UI container for a collection of Filter
|
|
15
15
|
* controls. Each control manages a single filter clause and the Filter
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { TableContextMenuDef } from "@vuu-ui/vuu-table-types";
|
|
2
|
+
import { type DateTimePattern } from "@vuu-ui/vuu-utils";
|
|
2
3
|
export interface FilterContextMenuHookProps {
|
|
3
4
|
filterColumns: string[] | "*";
|
|
5
|
+
/**
|
|
6
|
+
* The date/time pattern of the ColumnFilter for a temporal column, keyed by
|
|
7
|
+
* column name. A filter created from a cell value matches the value at the
|
|
8
|
+
* precision displayed by the ColumnFilter, e.g a ColumnFilter with time
|
|
9
|
+
* pattern 'hh:mm:ss.ms' filters the whole millisecond. Where no pattern is
|
|
10
|
+
* provided, the column descriptor registered by a FilterContainerColumnFilter
|
|
11
|
+
* for the column is used, if there is one, otherwise the Table column.
|
|
12
|
+
*/
|
|
13
|
+
filterPatterns?: Record<string, DateTimePattern>;
|
|
4
14
|
filterProviderKey?: string;
|
|
5
15
|
}
|
|
6
|
-
export declare const useFilterContextMenu: ({ filterColumns, filterProviderKey, }?: FilterContextMenuHookProps) => TableContextMenuDef;
|
|
16
|
+
export declare const useFilterContextMenu: ({ filterColumns, filterPatterns, filterProviderKey, }?: FilterContextMenuHookProps) => TableContextMenuDef;
|
|
@@ -8,6 +8,17 @@ export type FilterContextFilterMenuActionHandler = <T extends FilterAction = Fil
|
|
|
8
8
|
*/
|
|
9
9
|
columns?: ColumnDescriptor[]) => void;
|
|
10
10
|
export interface FilterContextProps {
|
|
11
|
+
/**
|
|
12
|
+
* Returns the column descriptor used by a ColumnFilter (within a
|
|
13
|
+
* FilterContainer) for the named column, if one is registered.
|
|
14
|
+
*/
|
|
15
|
+
getColumnFilterColumn?: (key: string, columnName: string) => ColumnDescriptor | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Register the column descriptor used by a ColumnFilter, which may differ
|
|
18
|
+
* from the Table column descriptor, e.g. a different date/time pattern.
|
|
19
|
+
* Returns a function to unregister.
|
|
20
|
+
*/
|
|
21
|
+
registerColumnFilterColumn?: (key: string, column: ColumnDescriptor) => () => void;
|
|
11
22
|
deleteFilter: (key: string, filterId: string) => void;
|
|
12
23
|
saveFilter: (key: string, name: string) => void;
|
|
13
24
|
filterDescriptors: Map<string, FilterContainerFilterDescriptor[]>;
|
|
@@ -24,6 +35,14 @@ export declare const isNullFilter: (f?: FilterContainerFilterDescriptor) => bool
|
|
|
24
35
|
export declare const NullFilterDescriptor: FilterContainerFilterDescriptor;
|
|
25
36
|
export declare const EmptyFilterDescriptor: FilterContainerFilterDescriptor;
|
|
26
37
|
export declare const FilterContext: import("react").Context<FilterContextProps>;
|
|
38
|
+
/**
|
|
39
|
+
* Access the column descriptors registered by ColumnFilters
|
|
40
|
+
* (see FilterContainerColumnFilter).
|
|
41
|
+
*/
|
|
42
|
+
export declare function useColumnFilterRegistry(key?: string): {
|
|
43
|
+
getColumnFilterColumn: (columnName: string) => ColumnDescriptor | undefined;
|
|
44
|
+
registerColumnFilterColumn: (column: ColumnDescriptor) => (() => void) | undefined;
|
|
45
|
+
};
|
|
27
46
|
interface SavedFilterHookProps {
|
|
28
47
|
availableColumns?: ColumnDescriptor[];
|
|
29
48
|
}
|
package/types/index.d.ts
CHANGED
|
@@ -4,14 +4,14 @@ export * from "./filter-clause";
|
|
|
4
4
|
export { ExtendedSingleValueFilterClause } from "./filter-container/ExtendedSingleValueFilterClause";
|
|
5
5
|
export { FilterContainer, FilterContainerColumnFilter, type FilterContainerColumnFilterProps, type FilterContainerProps, } from "./filter-container/FilterContainer";
|
|
6
6
|
export type { FilterAppliedHandler } from "./filter-container/useFilterContainer";
|
|
7
|
-
export { useFilterContextMenu } from "./filter-context-menu/useFilterContextMenu";
|
|
7
|
+
export { type FilterContextMenuHookProps, useFilterContextMenu, } from "./filter-context-menu/useFilterContextMenu";
|
|
8
8
|
export { FilterDisplay } from "./filter-display/FilterDisplay";
|
|
9
9
|
export * from "./filter-editor";
|
|
10
10
|
export { FilterPanel } from "./filter-panel/FilterPanel";
|
|
11
11
|
export * from "./filter-pill";
|
|
12
12
|
export { type FilterPermissions } from "./filter-pill/FilterMenu";
|
|
13
13
|
export { FilterPillNext, type FilterPillNextProps, } from "./filter-pill/FilterPillNext";
|
|
14
|
-
export { NULL_FILTER, useSavedFilters } from "./filter-provider/FilterContext";
|
|
14
|
+
export { NULL_FILTER, useColumnFilterRegistry, useSavedFilters, } from "./filter-provider/FilterContext";
|
|
15
15
|
export { FilterProvider } from "./filter-provider/FilterProvider";
|
|
16
16
|
export * from "./filter-utils";
|
|
17
17
|
export * from "./FilterModel";
|