@vuu-ui/vuu-filters 4.0.0-alpha.2 → 4.0.0-alpha.21

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.
Files changed (50) hide show
  1. package/package.json +17 -17
  2. package/src/FilterAggregator.js +61 -42
  3. package/src/column-filter/ColumnFilter.css.js +4 -0
  4. package/src/column-filter/ColumnFilter.js +18 -7
  5. package/src/filter-clause/FilterClause.css.js +1 -1
  6. package/src/filter-clause/operator-picker/operator-utils.js +2 -2
  7. package/src/filter-clause/value-editors/FilterClauseValueEditor.js +8 -5
  8. package/src/filter-clause/value-editors/FilterClauseValueEditorDate.js +11 -43
  9. package/src/filter-clause/value-editors/FilterClauseValueEditorTime.js +16 -42
  10. package/src/filter-container/ExtendedSingleValueFilterClause.js +21 -7
  11. package/src/filter-container/FilterContainer.js +21 -8
  12. package/src/filter-context-menu/useFilterContextMenu.js +36 -9
  13. package/src/filter-pill/getFilterTooltipText.js +2 -8
  14. package/src/filter-provider/FilterContext.js +20 -1
  15. package/src/filter-provider/FilterProvider.js +20 -2
  16. package/src/filter-utils.js +5 -10
  17. package/src/index.js +1 -1
  18. package/src/quick-filters/useQuickFilters.js +6 -1
  19. package/src/tabbed-filter-container/TabbedFilterContainer.js +19 -17
  20. package/src/toggle-filter/ToggleFilter.css.js +8 -0
  21. package/src/toggle-filter/ToggleFilter.js +34 -15
  22. package/src/toggle-filter/useToggleFilter.js +57 -33
  23. package/types/column-filter/ColumnFilter.d.ts +14 -1
  24. package/types/custom-filters/CustomFilters.d.ts +1 -1
  25. package/types/filter-bar/FilterBar.d.ts +1 -1
  26. package/types/filter-bar/FilterBarMenu.d.ts +1 -1
  27. package/types/filter-clause/FilterClause.d.ts +1 -1
  28. package/types/filter-clause/value-editors/FilterClauseValueEditorDate.d.ts +13 -2
  29. package/types/filter-clause/value-editors/FilterClauseValueEditorTime.d.ts +15 -4
  30. package/types/filter-container/ExtendedSingleValueFilterClause.d.ts +6 -0
  31. package/types/filter-container/FilterContainer.d.ts +9 -2
  32. package/types/filter-context-menu/useFilterContextMenu.d.ts +11 -1
  33. package/types/filter-editor/FilterClauseCombinator.d.ts +1 -1
  34. package/types/filter-editor/FilterEditor.d.ts +1 -1
  35. package/types/filter-pill/FilterMenu.d.ts +1 -1
  36. package/types/filter-pill/FilterPill.d.ts +1 -1
  37. package/types/filter-pill/FilterPillNext.d.ts +1 -1
  38. package/types/filter-pill-menu/FilterPillMenu.d.ts +1 -1
  39. package/types/filter-provider/FilterContext.d.ts +34 -0
  40. package/types/filter-provider/FilterProvider.d.ts +19 -1
  41. package/types/filter-toggle-button/FilterToggleButton.d.ts +1 -1
  42. package/types/index.d.ts +4 -4
  43. package/types/inline-filter/InlineFilter.d.ts +1 -1
  44. package/types/quick-filters/QuickFilters.d.ts +1 -1
  45. package/types/saved-filters/DeleteFilterPrompt.d.ts +1 -1
  46. package/types/saved-filters/FilterNamePrompt.d.ts +1 -1
  47. package/types/saved-filters/SavedFilterPanel.d.ts +1 -1
  48. package/types/tabbed-filter-container/TabbedFilterContainer.d.ts +1 -1
  49. package/types/toggle-filter/ToggleFilter.d.ts +16 -1
  50. package/types/toggle-filter/useToggleFilter.d.ts +19 -1
@@ -13,4 +13,4 @@ export interface FilterPillProps extends SplitStateButtonProps, Pick<Partial<Edi
13
13
  onBeginEdit?: (filter: Filter) => void;
14
14
  onMenuAction?: MenuActionHandler;
15
15
  }
16
- export declare const FilterPill: ({ allowClose, allowDelete, allowEdit, allowRename, className: classNameProp, columnsByName, editable, editing, editLabelApiRef, filter, id: idProp, onBeginEdit, onExitEditMode, onMenuAction, ...htmlAttributes }: FilterPillProps) => import("react").JSX.Element;
16
+ export declare const FilterPill: ({ allowClose, allowDelete, allowEdit, allowRename, className: classNameProp, columnsByName, editable, editing, editLabelApiRef, filter, id: idProp, onBeginEdit, onExitEditMode, onMenuAction, ...htmlAttributes }: FilterPillProps) => import("react/jsx-runtime").JSX.Element;
@@ -12,4 +12,4 @@ export interface FilterPillNextProps extends FilterPillNextHookProps, Omit<HTMLA
12
12
  permissions?: FilterPermissions;
13
13
  showTooltip?: boolean;
14
14
  }
15
- export declare const FilterPillNext: ({ active, appearence, columns, className, defaultActive, filter, id, onClick, onMenuAction: onMenuActionProp, permissions, showTooltip, ...htmlAttributes }: FilterPillNextProps) => import("react").JSX.Element;
15
+ export declare const FilterPillNext: ({ active, appearence, columns, className, defaultActive, filter, id, onClick, onMenuAction: onMenuActionProp, permissions, showTooltip, ...htmlAttributes }: FilterPillNextProps) => import("react/jsx-runtime").JSX.Element;
@@ -14,4 +14,4 @@ export interface FilterPillMenuProps {
14
14
  onMenuAction: MenuActionHandler;
15
15
  onMenuClose?: () => void;
16
16
  }
17
- export declare const FilterPillMenu: ({ allowClose, allowDelete, allowEdit, allowRename, filter, location, onMenuAction, onMenuClose, }: FilterPillMenuProps) => import("react").JSX.Element;
17
+ export declare const FilterPillMenu: ({ allowClose, allowDelete, allowEdit, allowRename, filter, location, onMenuAction, onMenuClose, }: FilterPillMenuProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,13 @@
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";
5
+ import type { VuuColumnDataType } from "@vuu-ui/vuu-protocol-types";
6
+ /** The column attributes by which a ColumnFilter pattern is configured */
7
+ export type ColumnFilterPatternColumn = {
8
+ name: string;
9
+ serverDataType?: VuuColumnDataType;
10
+ };
4
11
  export declare const filterDescriptorHasFilter: (f: FilterContainerFilterDescriptor) => f is FilterContainerFilterDescriptorWithFilter;
5
12
  export type FilterContextFilterMenuActionHandler = <T extends FilterAction = FilterAction>(key: string, filterId: string, filterAction: T,
6
13
  /**
@@ -8,6 +15,24 @@ export type FilterContextFilterMenuActionHandler = <T extends FilterAction = Fil
8
15
  */
9
16
  columns?: ColumnDescriptor[]) => void;
10
17
  export interface FilterContextProps {
18
+ /**
19
+ * Returns the column descriptor used by a ColumnFilter (within a
20
+ * FilterContainer) for the named column, if one is registered.
21
+ */
22
+ getColumnFilterColumn?: (key: string, columnName: string) => ColumnDescriptor | undefined;
23
+ /**
24
+ * The date/time pattern of the ColumnFilter for the column, as configured
25
+ * by FilterProvider columnFilterPatterns (by column name) or
26
+ * columnTypeFilterPatterns (by serverDataType). Available whether or not
27
+ * the ColumnFilter is mounted.
28
+ */
29
+ getColumnFilterPattern?: (column: ColumnFilterPatternColumn) => DateTimePattern | undefined;
30
+ /**
31
+ * Register the column descriptor used by a ColumnFilter, which may differ
32
+ * from the Table column descriptor, e.g. a different date/time pattern.
33
+ * Returns a function to unregister.
34
+ */
35
+ registerColumnFilterColumn?: (key: string, column: ColumnDescriptor) => () => void;
11
36
  deleteFilter: (key: string, filterId: string) => void;
12
37
  saveFilter: (key: string, name: string) => void;
13
38
  filterDescriptors: Map<string, FilterContainerFilterDescriptor[]>;
@@ -24,6 +49,15 @@ export declare const isNullFilter: (f?: FilterContainerFilterDescriptor) => bool
24
49
  export declare const NullFilterDescriptor: FilterContainerFilterDescriptor;
25
50
  export declare const EmptyFilterDescriptor: FilterContainerFilterDescriptor;
26
51
  export declare const FilterContext: import("react").Context<FilterContextProps>;
52
+ /**
53
+ * Access the column descriptors registered by ColumnFilters
54
+ * (see FilterContainerColumnFilter).
55
+ */
56
+ export declare function useColumnFilterRegistry(key?: string): {
57
+ getColumnFilterColumn: (columnName: string) => ColumnDescriptor | undefined;
58
+ getColumnFilterPattern: (column: ColumnFilterPatternColumn) => DateTimePattern | undefined;
59
+ registerColumnFilterColumn: (column: ColumnDescriptor) => (() => void) | undefined;
60
+ };
27
61
  interface SavedFilterHookProps {
28
62
  availableColumns?: ColumnDescriptor[];
29
63
  }
@@ -1,10 +1,28 @@
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";
4
+ import type { VuuColumnDataType } from "@vuu-ui/vuu-protocol-types";
3
5
  export type SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;
4
6
  export interface FilterProviderProps {
5
7
  children: ReactNode;
8
+ /**
9
+ * Date/time patterns, keyed by column name, of the ColumnFilters
10
+ * (FilterContainerColumnFilter) within this provider. A ColumnFilter
11
+ * without a pattern prop uses the pattern configured here. As these are
12
+ * available whether or not a ColumnFilter is mounted, the filter context
13
+ * menu can match a temporal cell value at the precision of the ColumnFilter,
14
+ * even where ColumnFilters are created on demand.
15
+ */
16
+ columnFilterPatterns?: Record<string, DateTimePattern>;
17
+ /**
18
+ * Date/time patterns, keyed by serverDataType, of the ColumnFilters within
19
+ * this provider, e.g. { epochtimestampnano: { time: "hh:mm:ss.ms" } }.
20
+ * Applies to columns with no entry in columnFilterPatterns. The column must
21
+ * have a serverDataType (a Table column has one, from the table schema).
22
+ */
23
+ columnTypeFilterPatterns?: Partial<Record<VuuColumnDataType, DateTimePattern>>;
6
24
  onFiltersSaved?: (savedFilters: SavedFilterRecord) => void;
7
25
  savedFilters?: SavedFilterRecord;
8
26
  filterNameMaxLength?: number;
9
27
  }
10
- export declare const FilterProvider: ({ children, onFiltersSaved, savedFilters: savedFiltersProp, filterNameMaxLength, }: FilterProviderProps) => import("react").JSX.Element;
28
+ export declare const FilterProvider: ({ children, columnFilterPatterns, columnTypeFilterPatterns, onFiltersSaved, savedFilters: savedFiltersProp, filterNameMaxLength, }: FilterProviderProps) => import("react/jsx-runtime").JSX.Element;
@@ -6,4 +6,4 @@ export interface FilterToggleButtonProps {
6
6
  filterProviderKey?: string;
7
7
  onToggle: () => void;
8
8
  }
9
- export declare const FilterToggleButton: ({ columns, filterProviderKey, onToggle, }: FilterToggleButtonProps) => import("react").JSX.Element;
9
+ export declare const FilterToggleButton: ({ columns, filterProviderKey, onToggle, }: FilterToggleButtonProps) => import("react/jsx-runtime").JSX.Element;
package/types/index.d.ts CHANGED
@@ -4,15 +4,15 @@ 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";
15
- export { FilterProvider } from "./filter-provider/FilterProvider";
14
+ export { NULL_FILTER, type ColumnFilterPatternColumn, useColumnFilterRegistry, useSavedFilters, } from "./filter-provider/FilterContext";
15
+ export { FilterProvider, type FilterProviderProps, } from "./filter-provider/FilterProvider";
16
16
  export * from "./filter-utils";
17
17
  export * from "./FilterModel";
18
18
  export * from "./inline-filter";
@@ -21,4 +21,4 @@ export { FilterNamePrompt as SaveFilterConfirmPrompt, type FilterNamePromptProps
21
21
  export { SavedFilterPanel, type SavedFilterPanelProps, } from "./saved-filters/SavedFilterPanel";
22
22
  export type { FilterClickHandler } from "./saved-filters/useSavedFilterPanel";
23
23
  export { TabbedFilterContainer, type TabbedFilterContainerProps, } from "./tabbed-filter-container/TabbedFilterContainer";
24
- export { ToggleFilter, type ToggleFilterProps, } from "./toggle-filter/ToggleFilter";
24
+ export { ToggleFilter, type ToggleFilterProps, type ToggleFilterValue, } from "./toggle-filter/ToggleFilter";
@@ -9,4 +9,4 @@ export interface InlineFilterProps extends Partial<BaseRowProps>, Omit<HTMLAttri
9
9
  onFilterCleared?: () => void;
10
10
  table: TableSchemaTable;
11
11
  }
12
- export declare const InlineFilter: ({ ariaRole, onFilterApplied, onFilterCleared, table, ...htmlAttributes }: InlineFilterProps) => import("react").JSX.Element;
12
+ export declare const InlineFilter: ({ ariaRole, onFilterApplied, onFilterCleared, table, ...htmlAttributes }: InlineFilterProps) => import("react/jsx-runtime").JSX.Element;
@@ -14,4 +14,4 @@ export interface QuickFilterProps extends HTMLAttributes<HTMLDivElement>, Pick<F
14
14
  */
15
15
  showFind?: boolean | string[];
16
16
  }
17
- export declare const QuickFilters: ({ allowAddColumn, allowFind, availableColumns, onApplyFilter, onClearFilter, onChangeQuickFilterColumns, quickFilterColumns, vuuTable, }: QuickFilterProps) => import("react").JSX.Element;
17
+ export declare const QuickFilters: ({ allowAddColumn, allowFind, availableColumns, onApplyFilter, onClearFilter, onChangeQuickFilterColumns, quickFilterColumns, vuuTable, }: QuickFilterProps) => import("react/jsx-runtime").JSX.Element;
@@ -6,4 +6,4 @@ export interface DeleteFilterPromptProps extends Pick<PromptProps, "onConfirm" |
6
6
  columns?: ColumnDescriptor[];
7
7
  filterDescriptor: FilterContainerFilterDescriptor;
8
8
  }
9
- export declare const DeleteFilterPrompt: ({ children, className, columns, filterDescriptor, onClose, onConfirm, open, ...htmlAttributes }: DeleteFilterPromptProps) => import("react").JSX.Element;
9
+ export declare const DeleteFilterPrompt: ({ children, className, columns, filterDescriptor, onClose, onConfirm, open, ...htmlAttributes }: DeleteFilterPromptProps) => import("react/jsx-runtime").JSX.Element;
@@ -3,4 +3,4 @@ import { HTMLAttributes } from "react";
3
3
  import { FilterNamePromptHookProps } from "./useFilterNamePrompt";
4
4
  export interface FilterNamePromptProps extends FilterNamePromptHookProps, Pick<PromptProps, "onClose" | "open" | "title">, Omit<HTMLAttributes<HTMLDivElement>, "title"> {
5
5
  }
6
- export declare const FilterNamePrompt: ({ className, filterName, onClose, onConfirm: onConfirmProp, open, title, filterNameMaxLength, ...htmlAttributes }: FilterNamePromptProps) => import("react").JSX.Element;
6
+ export declare const FilterNamePrompt: ({ className, filterName, onClose, onConfirm: onConfirmProp, open, title, filterNameMaxLength, ...htmlAttributes }: FilterNamePromptProps) => import("react/jsx-runtime").JSX.Element;
@@ -11,4 +11,4 @@ export interface SavedFilterPanelProps extends HTMLAttributes<HTMLDivElement>, P
11
11
  availableColumns?: ColumnDescriptor[];
12
12
  filterPillPermissions?: FilterPermissions;
13
13
  }
14
- export declare const SavedFilterPanel: ({ availableColumns, className, filterPillPermissions, filterProviderKey, ...htmlAttributes }: SavedFilterPanelProps) => import("react").JSX.Element;
14
+ export declare const SavedFilterPanel: ({ availableColumns, className, filterPillPermissions, filterProviderKey, ...htmlAttributes }: SavedFilterPanelProps) => import("react/jsx-runtime").JSX.Element;
@@ -7,4 +7,4 @@ export interface TabbedFilterContainerProps extends HTMLAttributes<HTMLDivElemen
7
7
  filterTabLabel?: string;
8
8
  savedFilterLabel?: string;
9
9
  }
10
- export declare const TabbedFilterContainer: ({ SavedFilterPanelProps, children, className, filter, filterProviderKey, filterTabLabel, onFilterApplied, onFilterCleared, savedFilterLabel, ...htmlAttributes }: TabbedFilterContainerProps) => import("react").JSX.Element;
10
+ export declare const TabbedFilterContainer: ({ SavedFilterPanelProps, children, className, filter, filterProviderKey, filterTabLabel, onFilterApplied, onFilterCleared, savedFilterLabel, ...htmlAttributes }: TabbedFilterContainerProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,8 @@
1
1
  import { ToggleButtonGroupProps } from "@salt-ds/core";
2
2
  import { CommitHandler } from "@vuu-ui/vuu-utils";
3
3
  import { type ToggleFilterHookProps } from "./useToggleFilter";
4
+ export type ToggleFilterValue = string | number | boolean;
5
+ type Value = ToggleButtonGroupProps["value"];
4
6
  /**
5
7
  * ToggleFilter is designed to work with a FilterProvider and
6
8
  * DataSourceProvider. With a DataSourceProvider, values will
@@ -11,7 +13,20 @@ import { type ToggleFilterHookProps } from "./useToggleFilter";
11
13
  * With neither of these Providers available, the ToggleFilter is
12
14
  * behaving like a regular ToggleButtonGroup.
13
15
  */
14
- export interface ToggleFilterProps extends ToggleButtonGroupProps, ToggleFilterHookProps {
16
+ export interface ToggleFilterProps extends Omit<ToggleButtonGroupProps, "defaultValue" | "value">, Omit<ToggleFilterHookProps, "values"> {
17
+ defaultValue?: ToggleFilterValue | Value;
18
+ /**
19
+ * Optional labels for the toggle buttons. If provided, must contain
20
+ * the same number of items as values. Defaults to values.
21
+ */
22
+ labels?: string[];
15
23
  onCommit: CommitHandler<HTMLElement>;
24
+ value?: ToggleFilterValue | Value;
25
+ /**
26
+ * Values for the toggle buttons. Boolean values are converted to
27
+ * strings internally, the original value is passed to onCommit.
28
+ */
29
+ values: ToggleFilterValue[];
16
30
  }
17
31
  export declare const ToggleFilter: import("react").ForwardRefExoticComponent<ToggleFilterProps & import("react").RefAttributes<HTMLDivElement>>;
32
+ export {};
@@ -8,4 +8,22 @@ export interface ToggleFilterHookProps {
8
8
  table?: TableSchemaTable;
9
9
  values: string[];
10
10
  }
11
- export declare const useToggleFilter: ({ column, table, values, }: ToggleFilterHookProps) => string | undefined;
11
+ export interface ToggleFilterHookResult {
12
+ /**
13
+ * If only one of the toggle values has matching data, that value.
14
+ */
15
+ onlyAvailableValue?: string;
16
+ /**
17
+ * Toggle values for which there is no matching data.
18
+ */
19
+ unavailableValues: string[];
20
+ }
21
+ /**
22
+ * Determines which toggle values have matching data, using typeahead
23
+ * against the DataSource. Typeahead respects the filter applied to the
24
+ * DataSource, so while a filter on this column is in effect, results
25
+ * would only reflect the filtered value. In that case no check is made
26
+ * and the result of the last check (if any) is retained. If there has
27
+ * been no check, all values are assumed to possibly have data.
28
+ */
29
+ export declare const useToggleFilter: ({ column, table, values, }: ToggleFilterHookProps) => ToggleFilterHookResult;