@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 CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "3.5.0-beta.2",
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.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"
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.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",
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 columnFilterColumn = pattern ? void 0 : getColumnFilterColumn(column.name);
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;