@vuu-ui/vuu-filters 3.5.0-beta.2 → 3.5.0-beta.4
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/filter-container/FilterContainer.js +3 -1
- package/src/filter-context-menu/useFilterContextMenu.js +5 -3
- package/src/filter-provider/FilterContext.js +5 -1
- package/src/filter-provider/FilterProvider.js +5 -1
- package/types/filter-container/FilterContainer.d.ts +7 -1
- package/types/filter-provider/FilterContext.d.ts +8 -0
- package/types/filter-provider/FilterProvider.d.ts +11 -1
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "3.5.0-beta.
|
|
2
|
+
"version": "3.5.0-beta.4",
|
|
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.4",
|
|
14
|
+
"@vuu-ui/vuu-protocol-types": "3.5.0-beta.4",
|
|
15
|
+
"@vuu-ui/vuu-table-types": "3.5.0-beta.4",
|
|
16
|
+
"@vuu-ui/vuu-filter-types": "3.5.0-beta.4"
|
|
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.4",
|
|
20
|
+
"@vuu-ui/vuu-data-react": "3.5.0-beta.4",
|
|
21
|
+
"@vuu-ui/vuu-filter-parser": "3.5.0-beta.4",
|
|
22
|
+
"@vuu-ui/vuu-popups": "3.5.0-beta.4",
|
|
23
|
+
"@vuu-ui/vuu-ui-controls": "3.5.0-beta.4",
|
|
24
|
+
"@vuu-ui/vuu-table": "3.5.0-beta.4",
|
|
25
|
+
"@vuu-ui/vuu-utils": "3.5.0-beta.4",
|
|
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",
|
|
@@ -10,7 +10,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: columnProp, operator = "=", pattern, variant, ...props })=>{
|
|
13
|
+
const FilterContainerColumnFilter = ({ column: columnProp, operator = "=", pattern: patternProp, variant, ...props })=>{
|
|
14
|
+
const { getColumnFilterPattern } = useColumnFilterRegistry();
|
|
15
|
+
const pattern = patternProp ?? getColumnFilterPattern(columnProp.name);
|
|
14
16
|
const { date, time } = pattern ?? {};
|
|
15
17
|
const column = useMemo(()=>withDateTimePattern(columnProp, date || time ? {
|
|
16
18
|
date,
|
|
@@ -8,13 +8,14 @@ const defaultProps = {
|
|
|
8
8
|
};
|
|
9
9
|
const useFilterContextMenu = ({ filterColumns = "*", filterPatterns, filterProviderKey } = defaultProps)=>{
|
|
10
10
|
const { currentFilter, clearCurrentFilter, setCurrentFilter } = useSavedFilters(filterProviderKey);
|
|
11
|
-
const { getColumnFilterColumn } = useColumnFilterRegistry(filterProviderKey);
|
|
11
|
+
const { getColumnFilterColumn, getColumnFilterPattern } = useColumnFilterRegistry(filterProviderKey);
|
|
12
12
|
const filterAggregatorRef = useRef(EmptyAggregator);
|
|
13
13
|
const getCellFilter = useCallback((column, dataRow)=>{
|
|
14
14
|
const value = dataRow[column.name];
|
|
15
15
|
if (getTemporalInfo(column)) {
|
|
16
16
|
const pattern = filterPatterns?.[column.name];
|
|
17
|
-
const
|
|
17
|
+
const columnFilterPattern = getColumnFilterPattern(column.name);
|
|
18
|
+
const columnFilterColumn = pattern ? void 0 : getColumnFilterColumn(column.name) ?? (columnFilterPattern ? withDateTimePattern(column, columnFilterPattern) : void 0);
|
|
18
19
|
const filterColumn = pattern ? withDateTimePattern(column, pattern) : columnFilterColumn;
|
|
19
20
|
const temporalCellFilter = getTemporalCellFilter(filterColumn ?? column, value, void 0 !== columnFilterColumn);
|
|
20
21
|
if (temporalCellFilter) return {
|
|
@@ -30,7 +31,8 @@ const useFilterContextMenu = ({ filterColumns = "*", filterPatterns, filterProvi
|
|
|
30
31
|
};
|
|
31
32
|
}, [
|
|
32
33
|
filterPatterns,
|
|
33
|
-
getColumnFilterColumn
|
|
34
|
+
getColumnFilterColumn,
|
|
35
|
+
getColumnFilterPattern
|
|
34
36
|
]);
|
|
35
37
|
useMemo(()=>{
|
|
36
38
|
if (!filtersAreEqual(currentFilter.filter, filterAggregatorRef.current.filter)) filterAggregatorRef.current = currentFilter.filter ? new FilterAggregator(currentFilter.filter) : new FilterAggregator();
|
|
@@ -32,7 +32,7 @@ const FilterContext = createContext({
|
|
|
32
32
|
setCurrentFilter: ()=>console.warn("[FilterContext] setCurrentFilter, no FilterProvider has been configured")
|
|
33
33
|
});
|
|
34
34
|
function useColumnFilterRegistry(key = "GLOBAL") {
|
|
35
|
-
const { getColumnFilterColumn, registerColumnFilterColumn } = useContext(FilterContext);
|
|
35
|
+
const { getColumnFilterColumn, getColumnFilterPattern, registerColumnFilterColumn } = useContext(FilterContext);
|
|
36
36
|
const getColumn = useCallback((columnName)=>getColumnFilterColumn?.(key, columnName), [
|
|
37
37
|
getColumnFilterColumn,
|
|
38
38
|
key
|
|
@@ -41,8 +41,12 @@ function useColumnFilterRegistry(key = "GLOBAL") {
|
|
|
41
41
|
key,
|
|
42
42
|
registerColumnFilterColumn
|
|
43
43
|
]);
|
|
44
|
+
const getPattern = useCallback((columnName)=>getColumnFilterPattern?.(columnName), [
|
|
45
|
+
getColumnFilterPattern
|
|
46
|
+
]);
|
|
44
47
|
return {
|
|
45
48
|
getColumnFilterColumn: getColumn,
|
|
49
|
+
getColumnFilterPattern: getPattern,
|
|
46
50
|
registerColumnFilterColumn: register
|
|
47
51
|
};
|
|
48
52
|
}
|
|
@@ -14,7 +14,7 @@ const mapToRecord = (savedFilters)=>{
|
|
|
14
14
|
});
|
|
15
15
|
return record;
|
|
16
16
|
};
|
|
17
|
-
const FilterProvider = ({ children, onFiltersSaved, savedFilters: savedFiltersProp, filterNameMaxLength })=>{
|
|
17
|
+
const FilterProvider = ({ children, columnFilterPatterns, onFiltersSaved, savedFilters: savedFiltersProp, filterNameMaxLength })=>{
|
|
18
18
|
const [, forceRefresh] = useState({});
|
|
19
19
|
const savedFilters = useMemo(()=>savedFiltersProp ? new Map(Object.entries(savedFiltersProp)) : new Map(), [
|
|
20
20
|
savedFiltersProp
|
|
@@ -30,6 +30,9 @@ const FilterProvider = ({ children, onFiltersSaved, savedFilters: savedFiltersPr
|
|
|
30
30
|
if (columns.get(column.name) === column) columns.delete(column.name);
|
|
31
31
|
};
|
|
32
32
|
}, []);
|
|
33
|
+
const getColumnFilterPattern = useCallback((columnName)=>columnFilterPatterns?.[columnName], [
|
|
34
|
+
columnFilterPatterns
|
|
35
|
+
]);
|
|
33
36
|
const getColumnFilterColumn = useCallback((key, columnName)=>columnFilterColumnsRef.current.get(key)?.get(columnName), []);
|
|
34
37
|
const deleteFilter = useCallback((key, filterId)=>{
|
|
35
38
|
const filterDescriptors = savedFilters.get(key);
|
|
@@ -183,6 +186,7 @@ const FilterProvider = ({ children, onFiltersSaved, savedFilters: savedFiltersPr
|
|
|
183
186
|
return /*#__PURE__*/ jsxs(FilterContext.Provider, {
|
|
184
187
|
value: {
|
|
185
188
|
getColumnFilterColumn,
|
|
189
|
+
getColumnFilterPattern,
|
|
186
190
|
registerColumnFilterColumn,
|
|
187
191
|
onFilterMenuAction: handleFilterMenuAction,
|
|
188
192
|
deleteFilter,
|
|
@@ -2,14 +2,20 @@ import { type HTMLAttributes, type ReactNode } from "react";
|
|
|
2
2
|
import { type ColumnFilterContainerHookProps } from "./useFilterContainer";
|
|
3
3
|
import { ColumnFilterValue } from "@vuu-ui/vuu-filter-types";
|
|
4
4
|
import { ColumnFilterProps } from "../column-filter/ColumnFilter";
|
|
5
|
+
import { type DateTimePattern } from "@vuu-ui/vuu-utils";
|
|
5
6
|
export interface FilterContainerProps extends HTMLAttributes<HTMLDivElement>, ColumnFilterContainerHookProps {
|
|
6
7
|
children: ReactNode;
|
|
7
8
|
filterProviderKey?: string;
|
|
8
9
|
}
|
|
9
10
|
export interface FilterContainerColumnFilterProps extends Omit<ColumnFilterProps, "defaultValue" | "onCommit" | "value"> {
|
|
10
11
|
defaultValue?: ColumnFilterValue;
|
|
12
|
+
/**
|
|
13
|
+
* See ColumnFilter pattern. Defaults to the pattern configured for the
|
|
14
|
+
* column by FilterProvider columnFilterPatterns, if any.
|
|
15
|
+
*/
|
|
16
|
+
pattern?: DateTimePattern;
|
|
11
17
|
}
|
|
12
|
-
export declare const FilterContainerColumnFilter: ({ column: columnProp, operator, pattern, variant, ...props }: FilterContainerColumnFilterProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare const FilterContainerColumnFilter: ({ column: columnProp, operator, pattern: patternProp, variant, ...props }: FilterContainerColumnFilterProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
19
|
/**
|
|
14
20
|
* FilterContainer is a generic UI container for a collection of Filter
|
|
15
21
|
* controls. Each control manages a single filter clause and the Filter
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FilterContainerFilter, FilterContainerFilterDescriptor, FilterContainerFilterDescriptorWithFilter } from "@vuu-ui/vuu-filter-types";
|
|
2
2
|
import { FilterAction } from "../filter-pill/FilterMenu";
|
|
3
3
|
import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
4
|
+
import type { DateTimePattern } from "@vuu-ui/vuu-utils";
|
|
4
5
|
export declare const filterDescriptorHasFilter: (f: FilterContainerFilterDescriptor) => f is FilterContainerFilterDescriptorWithFilter;
|
|
5
6
|
export type FilterContextFilterMenuActionHandler = <T extends FilterAction = FilterAction>(key: string, filterId: string, filterAction: T,
|
|
6
7
|
/**
|
|
@@ -13,6 +14,12 @@ export interface FilterContextProps {
|
|
|
13
14
|
* FilterContainer) for the named column, if one is registered.
|
|
14
15
|
*/
|
|
15
16
|
getColumnFilterColumn?: (key: string, columnName: string) => ColumnDescriptor | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The date/time pattern of the ColumnFilter for the named column, as
|
|
19
|
+
* configured by FilterProvider columnFilterPatterns. Available whether or
|
|
20
|
+
* not the ColumnFilter is mounted.
|
|
21
|
+
*/
|
|
22
|
+
getColumnFilterPattern?: (columnName: string) => DateTimePattern | undefined;
|
|
16
23
|
/**
|
|
17
24
|
* Register the column descriptor used by a ColumnFilter, which may differ
|
|
18
25
|
* from the Table column descriptor, e.g. a different date/time pattern.
|
|
@@ -41,6 +48,7 @@ export declare const FilterContext: import("react").Context<FilterContextProps>;
|
|
|
41
48
|
*/
|
|
42
49
|
export declare function useColumnFilterRegistry(key?: string): {
|
|
43
50
|
getColumnFilterColumn: (columnName: string) => ColumnDescriptor | undefined;
|
|
51
|
+
getColumnFilterPattern: (columnName: string) => DateTimePattern | undefined;
|
|
44
52
|
registerColumnFilterColumn: (column: ColumnDescriptor) => (() => void) | undefined;
|
|
45
53
|
};
|
|
46
54
|
interface SavedFilterHookProps {
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { FilterContainerFilterDescriptor } from "@vuu-ui/vuu-filter-types";
|
|
2
2
|
import { ReactNode } from "react";
|
|
3
|
+
import { type DateTimePattern } from "@vuu-ui/vuu-utils";
|
|
3
4
|
export type SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;
|
|
4
5
|
export interface FilterProviderProps {
|
|
5
6
|
children: ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* Date/time patterns, keyed by column name, of the ColumnFilters
|
|
9
|
+
* (FilterContainerColumnFilter) within this provider. A ColumnFilter
|
|
10
|
+
* without a pattern prop uses the pattern configured here. As these are
|
|
11
|
+
* available whether or not a ColumnFilter is mounted, the filter context
|
|
12
|
+
* menu can match a temporal cell value at the precision of the ColumnFilter,
|
|
13
|
+
* even where ColumnFilters are created on demand.
|
|
14
|
+
*/
|
|
15
|
+
columnFilterPatterns?: Record<string, DateTimePattern>;
|
|
6
16
|
onFiltersSaved?: (savedFilters: SavedFilterRecord) => void;
|
|
7
17
|
savedFilters?: SavedFilterRecord;
|
|
8
18
|
filterNameMaxLength?: number;
|
|
9
19
|
}
|
|
10
|
-
export declare const FilterProvider: ({ children, onFiltersSaved, savedFilters: savedFiltersProp, filterNameMaxLength, }: FilterProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare const FilterProvider: ({ children, columnFilterPatterns, onFiltersSaved, savedFilters: savedFiltersProp, filterNameMaxLength, }: FilterProviderProps) => import("react/jsx-runtime").JSX.Element;
|