@vuu-ui/vuu-filters 0.13.59 → 0.13.60

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 (37) hide show
  1. package/cjs/filter-container/FilterContainer.css.js +1 -1
  2. package/cjs/filter-container/FilterContainer.js +17 -8
  3. package/cjs/filter-container/FilterContainer.js.map +1 -1
  4. package/cjs/filter-panel/FilterPanel.css.js +1 -1
  5. package/cjs/filter-provider/FilterProvider.js +0 -3
  6. package/cjs/filter-provider/FilterProvider.js.map +1 -1
  7. package/cjs/index.js +2 -0
  8. package/cjs/index.js.map +1 -1
  9. package/cjs/tabbed-filter-container/TabbedFilterContainer.js +0 -1
  10. package/cjs/tabbed-filter-container/TabbedFilterContainer.js.map +1 -1
  11. package/cjs/toggle-filter/ToggleFilter.css.js +6 -0
  12. package/cjs/toggle-filter/ToggleFilter.css.js.map +1 -0
  13. package/cjs/toggle-filter/ToggleFilter.js +40 -24
  14. package/cjs/toggle-filter/ToggleFilter.js.map +1 -1
  15. package/cjs/toggle-filter/useToggleFilter.js +67 -0
  16. package/cjs/toggle-filter/useToggleFilter.js.map +1 -0
  17. package/esm/filter-container/FilterContainer.css.js +1 -1
  18. package/esm/filter-container/FilterContainer.js +17 -8
  19. package/esm/filter-container/FilterContainer.js.map +1 -1
  20. package/esm/filter-panel/FilterPanel.css.js +1 -1
  21. package/esm/filter-provider/FilterProvider.js +0 -3
  22. package/esm/filter-provider/FilterProvider.js.map +1 -1
  23. package/esm/index.js +1 -0
  24. package/esm/index.js.map +1 -1
  25. package/esm/tabbed-filter-container/TabbedFilterContainer.js +0 -1
  26. package/esm/tabbed-filter-container/TabbedFilterContainer.js.map +1 -1
  27. package/esm/toggle-filter/ToggleFilter.css.js +4 -0
  28. package/esm/toggle-filter/ToggleFilter.css.js.map +1 -0
  29. package/esm/toggle-filter/ToggleFilter.js +41 -25
  30. package/esm/toggle-filter/ToggleFilter.js.map +1 -1
  31. package/esm/toggle-filter/useToggleFilter.js +65 -0
  32. package/esm/toggle-filter/useToggleFilter.js.map +1 -0
  33. package/package.json +11 -11
  34. package/types/filter-container/FilterContainer.d.ts +1 -1
  35. package/types/index.d.ts +1 -0
  36. package/types/toggle-filter/ToggleFilter.d.ts +13 -6
  37. package/types/toggle-filter/useToggleFilter.d.ts +11 -0
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var filterContainerCss = ".vuuFilterContainer {\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-100)\n\n}";
3
+ var filterContainerCss = ".vuuFilterContainer {\n display: var(--vuuFilterContainer-display,flex);\n flex: var(--vuuFilterContainer-flex);\n flex-direction: var(--vuuFilterContainer-flexDirection,column);\n gap: var(--salt-spacing-100);\n height: var(--vuuFilterContainer-height);\n overflow: auto;\n}";
4
4
 
5
5
  module.exports = filterContainerCss;
6
6
  //# sourceMappingURL=FilterContainer.css.js.map
@@ -16,14 +16,9 @@ const notEmpty = (value) => Array.isArray(value) ? value[0] !== "" && value[1] !
16
16
  const FilterContainerColumnFilter = ({
17
17
  column,
18
18
  operator = "=",
19
+ variant,
19
20
  ...props
20
21
  }) => {
21
- const targetWindow = window.useWindow();
22
- styles.useComponentCssInjection({
23
- testId: "vuu-filter-container",
24
- css: FilterContainer$1,
25
- window: targetWindow
26
- });
27
22
  const {
28
23
  filterProviderKey,
29
24
  onChange: onFilterContextChange,
@@ -100,7 +95,8 @@ const FilterContainerColumnFilter = ({
100
95
  onColumnRangeFilterChange: handleColumnRangeFilterChange,
101
96
  onCommit: handleCommit,
102
97
  operator,
103
- value
98
+ value,
99
+ variant
104
100
  }
105
101
  );
106
102
  };
@@ -113,13 +109,26 @@ const FilterContainer = ({
113
109
  onFilterCleared,
114
110
  ...htmlAttributes
115
111
  }) => {
112
+ const targetWindow = window.useWindow();
113
+ styles.useComponentCssInjection({
114
+ testId: "vuu-filter-container",
115
+ css: FilterContainer$1,
116
+ window: targetWindow
117
+ });
116
118
  const filterContextProps = useFilterContainer.useFilterContainer({
117
119
  filter,
118
120
  filterProviderKey,
119
121
  onFilterApplied,
120
122
  onFilterCleared
121
123
  });
122
- return /* @__PURE__ */ jsxRuntime.jsx(useFilterContainer.ColumnFilterContext.Provider, { value: filterContextProps, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ...htmlAttributes, className: cx(classBase, className), children }) });
124
+ return /* @__PURE__ */ jsxRuntime.jsx(useFilterContainer.ColumnFilterContext.Provider, { value: filterContextProps, children: /* @__PURE__ */ jsxRuntime.jsx(
125
+ "div",
126
+ {
127
+ ...htmlAttributes,
128
+ className: cx(classBase, className, "vuuScrollable"),
129
+ children
130
+ }
131
+ ) });
123
132
  };
124
133
 
125
134
  exports.FilterContainer = FilterContainer;
@@ -1 +1 @@
1
- {"version":3,"file":"FilterContainer.js","sources":["../../../../packages/vuu-filters/src/filter-container/FilterContainer.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport {\n ColumnFilterContext,\n useFilterContainer,\n useFilterContext,\n type ColumnFilterContainerHookProps,\n} from \"./useFilterContainer\";\nimport {\n ColumnFilterChangeHandler,\n ColumnFilterCommitHandler,\n ColumnFilterValue,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnFilter, ColumnFilterProps } from \"../column-filter/ColumnFilter\";\nimport {\n filterDescriptorHasFilter,\n isNullFilter,\n useSavedFilters,\n} from \"../filter-provider/FilterContext\";\nimport { getColumnValueFromFilter } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport filterContainerCss from \"./FilterContainer.css\";\n\nconst classBase = \"vuuFilterContainer\";\n\nconst notEmpty = (value: ColumnFilterValue) =>\n Array.isArray(value) ? value[0] !== \"\" && value[1] !== \"\" : value !== \"\";\n\nexport interface FilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n ColumnFilterContainerHookProps {\n children: ReactNode;\n filterProviderKey?: string;\n}\n\nexport interface FilterContainerColumnFilterProps\n extends Omit<ColumnFilterProps, \"defaultValue\" | \"onCommit\" | \"value\"> {\n defaultValue?: ColumnFilterValue;\n}\n\nexport const FilterContainerColumnFilter = ({\n column,\n operator = \"=\",\n ...props\n}: FilterContainerColumnFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-container\",\n css: filterContainerCss,\n window: targetWindow,\n });\n\n const {\n filterProviderKey,\n onChange: onFilterContextChange,\n onCommit: onFilterContextCommit,\n register,\n } = useFilterContext(column, true);\n\n const initialValue = useMemo(\n () => register(column, operator),\n [column, operator, register],\n );\n\n const [value, setValue] = useState(initialValue);\n const valueRef = useRef<ColumnFilterValue>(initialValue);\n const { currentFilter } = useSavedFilters(filterProviderKey);\n\n // This is primarily to guard against client passing non-stable 'column' reference\n // which would trigger the commit check below.\n const currentFilterRef = useRef(currentFilter.id);\n\n useMemo(() => {\n if (currentFilterRef.current !== currentFilter.id) {\n currentFilterRef.current = currentFilter.id;\n\n if (isNullFilter(currentFilter) && notEmpty(valueRef.current)) {\n valueRef.current = Array.isArray(valueRef.current) ? [\"\", \"\"] : \"\";\n setValue(valueRef.current);\n } else if (filterDescriptorHasFilter(currentFilter)) {\n const v = getColumnValueFromFilter(\n column,\n operator,\n currentFilter.filter,\n );\n if (\n operator === \"between\" &&\n !Array.isArray(v) &&\n Array.isArray(valueRef.current)\n ) {\n // A between filter with only the first item filled is converted to an '=' filter\n // in FilterAggregator. Translate value back to range value here\n const [v1, v2] = valueRef.current;\n if (`${v}` === v1 && v2 === \"\") {\n return;\n } else {\n valueRef.current = [`${v}`, \"\"];\n setValue(valueRef.current);\n }\n } else if (v !== valueRef.current) {\n valueRef.current = v;\n setValue(v);\n }\n }\n }\n // We only want this to run when the filter id changes, not when\n // filter instance changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [column, currentFilter.id]);\n\n const handleCommit = useCallback<ColumnFilterCommitHandler>(\n (column, op, value) => {\n valueRef.current = value;\n setValue(value);\n onFilterContextCommit(column, op, value);\n },\n [onFilterContextCommit],\n );\n\n const handleColumnFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [`${value}`, v[1]] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n const handleColumnRangeFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [v[0], `${value}`] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n return (\n <ColumnFilter\n {...props}\n column={column}\n onColumnFilterChange={handleColumnFilterChange}\n onColumnRangeFilterChange={handleColumnRangeFilterChange}\n onCommit={handleCommit}\n operator={operator}\n value={value}\n />\n );\n};\n\n/**\n * FilterContainer is a generic UI container for a collection of Filter\n * controls. Each control manages a single filter clause and the Filter\n * Container aggregates these clauses into a single filter. FilterContainer\n * provides a FilterContainerFilter which can be used to provide children.\n * This is a wrapper around ColumnFilter, which adds some plumbing to allow\n * the container to track changes and manage each individual contribution to\n * the top-level filter.\n * See FilterPanel and InlineFilter for examples of FilterContainer usage.\n */\nexport const FilterContainer = ({\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: FilterContainerProps) => {\n const filterContextProps = useFilterContainer({\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n });\n return (\n <ColumnFilterContext.Provider value={filterContextProps}>\n <div {...htmlAttributes} className={cx(classBase, className)}>\n {children}\n </div>\n </ColumnFilterContext.Provider>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","filterContainerCss","useFilterContext","useMemo","useState","useRef","useSavedFilters","isNullFilter","filterDescriptorHasFilter","getColumnValueFromFilter","useCallback","column","value","jsx","ColumnFilter","useFilterContainer","ColumnFilterContext"],"mappings":"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"}
1
+ {"version":3,"file":"FilterContainer.js","sources":["../../../../packages/vuu-filters/src/filter-container/FilterContainer.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport {\n ColumnFilterContext,\n useFilterContainer,\n useFilterContext,\n type ColumnFilterContainerHookProps,\n} from \"./useFilterContainer\";\nimport {\n ColumnFilterChangeHandler,\n ColumnFilterCommitHandler,\n ColumnFilterValue,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnFilter, ColumnFilterProps } from \"../column-filter/ColumnFilter\";\nimport {\n filterDescriptorHasFilter,\n isNullFilter,\n useSavedFilters,\n} from \"../filter-provider/FilterContext\";\nimport { getColumnValueFromFilter } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport filterContainerCss from \"./FilterContainer.css\";\n\nconst classBase = \"vuuFilterContainer\";\n\nconst notEmpty = (value: ColumnFilterValue) =>\n Array.isArray(value) ? value[0] !== \"\" && value[1] !== \"\" : value !== \"\";\n\nexport interface FilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n ColumnFilterContainerHookProps {\n children: ReactNode;\n filterProviderKey?: string;\n}\n\nexport interface FilterContainerColumnFilterProps\n extends Omit<ColumnFilterProps, \"defaultValue\" | \"onCommit\" | \"value\"> {\n defaultValue?: ColumnFilterValue;\n}\n\nexport const FilterContainerColumnFilter = ({\n column,\n operator = \"=\",\n variant,\n ...props\n}: FilterContainerColumnFilterProps) => {\n const {\n filterProviderKey,\n onChange: onFilterContextChange,\n onCommit: onFilterContextCommit,\n register,\n } = useFilterContext(column, true);\n\n const initialValue = useMemo(\n () => register(column, operator),\n [column, operator, register],\n );\n\n const [value, setValue] = useState(initialValue);\n const valueRef = useRef<ColumnFilterValue>(initialValue);\n const { currentFilter } = useSavedFilters(filterProviderKey);\n\n // This is primarily to guard against client passing non-stable 'column' reference\n // which would trigger the commit check below.\n const currentFilterRef = useRef(currentFilter.id);\n\n useMemo(() => {\n if (currentFilterRef.current !== currentFilter.id) {\n currentFilterRef.current = currentFilter.id;\n\n if (isNullFilter(currentFilter) && notEmpty(valueRef.current)) {\n valueRef.current = Array.isArray(valueRef.current) ? [\"\", \"\"] : \"\";\n setValue(valueRef.current);\n } else if (filterDescriptorHasFilter(currentFilter)) {\n const v = getColumnValueFromFilter(\n column,\n operator,\n currentFilter.filter,\n );\n if (\n operator === \"between\" &&\n !Array.isArray(v) &&\n Array.isArray(valueRef.current)\n ) {\n // A between filter with only the first item filled is converted to an '=' filter\n // in FilterAggregator. Translate value back to range value here\n const [v1, v2] = valueRef.current;\n if (`${v}` === v1 && v2 === \"\") {\n return;\n } else {\n valueRef.current = [`${v}`, \"\"];\n setValue(valueRef.current);\n }\n } else if (v !== valueRef.current) {\n valueRef.current = v;\n setValue(v);\n }\n }\n }\n // We only want this to run when the filter id changes, not when\n // filter instance changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [column, currentFilter.id]);\n\n const handleCommit = useCallback<ColumnFilterCommitHandler>(\n (column, op, value) => {\n valueRef.current = value;\n setValue(value);\n onFilterContextCommit(column, op, value);\n },\n [onFilterContextCommit],\n );\n\n const handleColumnFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [`${value}`, v[1]] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n const handleColumnRangeFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [v[0], `${value}`] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n return (\n <ColumnFilter\n {...props}\n column={column}\n onColumnFilterChange={handleColumnFilterChange}\n onColumnRangeFilterChange={handleColumnRangeFilterChange}\n onCommit={handleCommit}\n operator={operator}\n value={value}\n variant={variant}\n />\n );\n};\n\n/**\n * FilterContainer is a generic UI container for a collection of Filter\n * controls. Each control manages a single filter clause and the Filter\n * Container aggregates these clauses into a single filter. FilterContainer\n * provides a FilterContainerFilter which can be used to provide children.\n * This is a wrapper around ColumnFilter, which adds some plumbing to allow\n * the container to track changes and manage each individual contribution to\n * the top-level filter.\n * See FilterPanel and InlineFilter for examples of FilterContainer usage.\n */\nexport const FilterContainer = ({\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: FilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-container\",\n css: filterContainerCss,\n window: targetWindow,\n });\n\n const filterContextProps = useFilterContainer({\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n });\n return (\n <ColumnFilterContext.Provider value={filterContextProps}>\n <div\n {...htmlAttributes}\n className={cx(classBase, className, \"vuuScrollable\")}\n >\n {children}\n </div>\n </ColumnFilterContext.Provider>\n );\n};\n"],"names":["useFilterContext","useMemo","useState","useRef","useSavedFilters","isNullFilter","filterDescriptorHasFilter","getColumnValueFromFilter","useCallback","column","value","jsx","ColumnFilter","useWindow","useComponentCssInjection","filterContainerCss","useFilterContainer","ColumnFilterContext"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var filterPanelCss = ".vuuFilterPanel {\n .vuuFilterPanel-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n}";
3
+ var filterPanelCss = ".vuuFilterPanel {\n display: flex;\n flex-direction: column;\n gap: var(--vuuFilterPanel-gap, var(--salt-spacing-100));\n height: var(--vuuFilterPanel-height, auto);\n padding: var(--vuuFilterPanel-padding, 0);\n\n --vuuFilterContainer-flex: 1 1 auto; \n\n .vuuFilterPanel-toolbar {\n align-items: center;\n display: flex;\n flex: 0 0 var(--salt-size-base);\n padding: var(--salt-spacing-200) 0;\n justify-content: space-between;\n }\n}";
4
4
 
5
5
  module.exports = filterPanelCss;
6
6
  //# sourceMappingURL=FilterPanel.css.js.map
@@ -178,9 +178,6 @@ const FilterProvider = ({
178
178
  );
179
179
  const setCurrentFilter = react.useCallback(
180
180
  (key, filter) => {
181
- console.log(
182
- `[FilterProvider] setCurrentFilter ${JSON.stringify(filter)}`
183
- );
184
181
  const filterDescriptors = savedFilters.get(key) ?? [];
185
182
  if (filter === FilterContext.NULL_FILTER) {
186
183
  const newFilterDescriptors = filterDescriptorUtils.insertOrReplaceFilter(
@@ -1 +1 @@
1
- {"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextFilterMenuActionHandler,\n NULL_FILTER,\n NullFilterDescriptor,\n UNSAVED_FILTER,\n} from \"./FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\ntype SavedFilterMap = Map<string, FilterContainerFilterDescriptor[]>;\ntype SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;\n\nconst mapToRecord = (savedFilters: SavedFilterMap) => {\n const record: SavedFilterRecord = {};\n savedFilters.forEach((filterDescriptors, key) => {\n record[key] = filterDescriptors;\n });\n return record;\n};\n\nexport interface FilterProviderProps {\n children: ReactNode;\n onFiltersSaved?: (savedFilters: SavedFilterRecord) => void;\n savedFilters?: SavedFilterRecord;\n}\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters: savedFiltersProp,\n}: FilterProviderProps) => {\n const [, forceRefresh] = useState({});\n const savedFilters = useMemo<SavedFilterMap>(\n () =>\n savedFiltersProp ? new Map(Object.entries(savedFiltersProp)) : new Map(),\n [savedFiltersProp],\n );\n\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const deleteFilter = useCallback(\n (key: string, filterId: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] deleteFilter, key ${key} not found`);\n } else {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n savedFilters.set(key, newFilterDescriptors);\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const applyNewName = useCallback(\n (key: string, filterId: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const newFilterDescriptors = renameFilter(\n filterDescriptors,\n filterId,\n name,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const promptForFilterName = useCallback(\n (key: string, { filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(key, id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (\n key: string,\n filterDescriptor: FilterContainerFilterDescriptor,\n columns?: ColumnDescriptor[],\n ) => {\n setDialog(\n <DeleteFilterPrompt\n columns={columns}\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(key, filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction =\n useCallback<FilterContextFilterMenuActionHandler>(\n (key: string, filterId, actionType, columns) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(key, targetFilter, columns);\n }\n break;\n case \"rename\":\n return promptForFilterName(key, targetFilter);\n }\n }\n },\n [promptForConfirmationOfDelete, promptForFilterName, savedFilters],\n );\n\n const handleSaveFilter = useCallback(\n (key: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n const newFilterDescriptors = filterDescriptors.reduce<\n FilterContainerFilterDescriptor[]\n >((list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n }, []);\n savedFilters.set(key, newFilterDescriptors);\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n forceRefresh({});\n },\n [onFiltersSaved, savedFilters],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (key: string, filter: string | FilterContainerFilter) => {\n console.log(\n `[FilterProvider] setCurrentFilter ${JSON.stringify(filter)}`,\n );\n const filterDescriptors = savedFilters.get(key) ?? [];\n\n if (filter === NULL_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n NullFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter === EMPTY_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n EmptyFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (typeof filter === \"string\") {\n const newFilterDescriptors = activateFilter(filterDescriptors, filter);\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter) {\n const newFilterDescriptors = insertOrReplaceFilter(filterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n });\n savedFilters.set(key, newFilterDescriptors);\n } else {\n deleteFilter(key, UNSAVED_FILTER);\n }\n\n forceRefresh({});\n },\n [deleteFilter, savedFilters],\n );\n\n return (\n <FilterContext.Provider\n value={{\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n filterDescriptors: savedFilters,\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":["NullFilterDescriptor","useState","useMemo","useCallback","UNSAVED_FILTER","renameFilter","jsx","FilterNamePrompt","DeleteFilterPrompt","findFilter","uuid","NULL_FILTER","insertOrReplaceFilter","EMPTY_FILTER","EmptyFilterDescriptor","activateFilter","jsxs","FilterContext"],"mappings":"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"}
1
+ {"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextFilterMenuActionHandler,\n NULL_FILTER,\n NullFilterDescriptor,\n UNSAVED_FILTER,\n} from \"./FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\ntype SavedFilterMap = Map<string, FilterContainerFilterDescriptor[]>;\ntype SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;\n\nconst mapToRecord = (savedFilters: SavedFilterMap) => {\n const record: SavedFilterRecord = {};\n savedFilters.forEach((filterDescriptors, key) => {\n record[key] = filterDescriptors;\n });\n return record;\n};\n\nexport interface FilterProviderProps {\n children: ReactNode;\n onFiltersSaved?: (savedFilters: SavedFilterRecord) => void;\n savedFilters?: SavedFilterRecord;\n}\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters: savedFiltersProp,\n}: FilterProviderProps) => {\n const [, forceRefresh] = useState({});\n const savedFilters = useMemo<SavedFilterMap>(\n () =>\n savedFiltersProp ? new Map(Object.entries(savedFiltersProp)) : new Map(),\n [savedFiltersProp],\n );\n\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const deleteFilter = useCallback(\n (key: string, filterId: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] deleteFilter, key ${key} not found`);\n } else {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n savedFilters.set(key, newFilterDescriptors);\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const applyNewName = useCallback(\n (key: string, filterId: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const newFilterDescriptors = renameFilter(\n filterDescriptors,\n filterId,\n name,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const promptForFilterName = useCallback(\n (key: string, { filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(key, id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (\n key: string,\n filterDescriptor: FilterContainerFilterDescriptor,\n columns?: ColumnDescriptor[],\n ) => {\n setDialog(\n <DeleteFilterPrompt\n columns={columns}\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(key, filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction =\n useCallback<FilterContextFilterMenuActionHandler>(\n (key: string, filterId, actionType, columns) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(key, targetFilter, columns);\n }\n break;\n case \"rename\":\n return promptForFilterName(key, targetFilter);\n }\n }\n },\n [promptForConfirmationOfDelete, promptForFilterName, savedFilters],\n );\n\n const handleSaveFilter = useCallback(\n (key: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n const newFilterDescriptors = filterDescriptors.reduce<\n FilterContainerFilterDescriptor[]\n >((list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n }, []);\n savedFilters.set(key, newFilterDescriptors);\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n forceRefresh({});\n },\n [onFiltersSaved, savedFilters],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (key: string, filter: string | FilterContainerFilter) => {\n const filterDescriptors = savedFilters.get(key) ?? [];\n\n if (filter === NULL_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n NullFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter === EMPTY_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n EmptyFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (typeof filter === \"string\") {\n const newFilterDescriptors = activateFilter(filterDescriptors, filter);\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter) {\n const newFilterDescriptors = insertOrReplaceFilter(filterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n });\n savedFilters.set(key, newFilterDescriptors);\n } else {\n deleteFilter(key, UNSAVED_FILTER);\n }\n\n forceRefresh({});\n },\n [deleteFilter, savedFilters],\n );\n\n return (\n <FilterContext.Provider\n value={{\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n filterDescriptors: savedFilters,\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":["NullFilterDescriptor","useState","useMemo","useCallback","UNSAVED_FILTER","renameFilter","jsx","FilterNamePrompt","DeleteFilterPrompt","findFilter","uuid","NULL_FILTER","insertOrReplaceFilter","EMPTY_FILTER","EmptyFilterDescriptor","activateFilter","jsxs","FilterContext"],"mappings":"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"}
package/cjs/index.js CHANGED
@@ -21,6 +21,7 @@ var FilterNamePrompt = require('./saved-filters/FilterNamePrompt.js');
21
21
  var SavedFilterPanel = require('./saved-filters/SavedFilterPanel.js');
22
22
  var TabbedFilterContainer = require('./tabbed-filter-container/TabbedFilterContainer.js');
23
23
  var ToggleFilter = require('./toggle-filter/ToggleFilter.js');
24
+ var FilterPanel = require('./filter-panel/FilterPanel.js');
24
25
 
25
26
 
26
27
 
@@ -68,4 +69,5 @@ exports.SaveFilterConfirmPrompt = FilterNamePrompt.FilterNamePrompt;
68
69
  exports.SavedFilterPanel = SavedFilterPanel.SavedFilterPanel;
69
70
  exports.TabbedFilterContainer = TabbedFilterContainer.TabbedFilterContainer;
70
71
  exports.ToggleFilter = ToggleFilter.ToggleFilter;
72
+ exports.FilterPanel = FilterPanel.FilterPanel;
71
73
  //# sourceMappingURL=index.js.map
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -26,7 +26,6 @@ const TabbedFilterContainer = ({
26
26
  css: TabbedFilterContainer$1,
27
27
  window: targetWindow
28
28
  });
29
- console.log(`[TabbedFilterContainer] render`);
30
29
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ...htmlAttributes, className: cx(classBase, className), children: /* @__PURE__ */ jsxRuntime.jsxs(lab.TabsNext, { defaultValue: "ad-hoc-filter", children: [
31
30
  /* @__PURE__ */ jsxRuntime.jsxs(lab.TabListNext, { appearance: "transparent", children: [
32
31
  /* @__PURE__ */ jsxRuntime.jsx(lab.TabNext, { value: "ad-hoc-filter", children: /* @__PURE__ */ jsxRuntime.jsx(lab.TabNextTrigger, { children: "AD HOC" }) }, "ad-hoc-filter"),
@@ -1 +1 @@
1
- {"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"filterProviderKey\" | \"onFilterApplied\" | \"onFilterCleared\"\n > {\n SavedFilterPanelProps?: Pick<\n SavedFilterPanelProps,\n \"availableColumns\" | \"filterPillPermissions\"\n >;\n children: ReactNode;\n}\n\nexport const TabbedFilterContainer = ({\n SavedFilterPanelProps,\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: TabbedFilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-tabbed-filter-container\",\n css: tabbedFilterContainerCss,\n window: targetWindow,\n });\n\n console.log(`[TabbedFilterContainer] render`);\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <TabsNext defaultValue=\"ad-hoc-filter\">\n <TabListNext appearance=\"transparent\">\n <TabNext value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <TabNextTrigger>AD HOC</TabNextTrigger>\n </TabNext>\n <TabNext value=\"saved-filters\" key=\"saved-filters\">\n <TabNextTrigger>SAVED</TabNextTrigger>\n </TabNext>\n </TabListNext>\n <TabNextPanel value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <FilterPanel\n filter={filter}\n filterProviderKey={filterProviderKey}\n onFilterApplied={onFilterApplied}\n onFilterCleared={onFilterCleared}\n >\n {children}\n </FilterPanel>\n </TabNextPanel>\n <TabNextPanel value=\"saved-filters\" key=\"saved-filters\">\n <SavedFilterPanel\n {...SavedFilterPanelProps}\n filterProviderKey={filterProviderKey}\n />\n </TabNextPanel>\n </TabsNext>\n </div>\n );\n};\n"],"names":["SavedFilterPanelProps","useWindow","useComponentCssInjection","tabbedFilterContainerCss","jsx","jsxs","TabsNext","TabListNext","TabNext","TabNextTrigger","TabNextPanel","FilterPanel","SavedFilterPanel"],"mappings":";;;;;;;;;;;AAmBA,MAAM,SAAY,GAAA,0BAAA;AAeX,MAAM,wBAAwB,CAAC;AAAA,EACpC,qBAAAA,EAAAA,sBAAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,6BAAA;AAAA,IACR,GAAK,EAAAC,uBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,OAAA,CAAQ,IAAI,CAAgC,8BAAA,CAAA,CAAA;AAE5C,EAAA,uBACGC,cAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,SAAS,CACzD,EAAA,QAAA,kBAAAC,eAAA,CAACC,YAAS,EAAA,EAAA,YAAA,EAAa,eACrB,EAAA,QAAA,EAAA;AAAA,oBAACD,eAAA,CAAAE,eAAA,EAAA,EAAY,YAAW,aACtB,EAAA,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,eAAQ,KAAM,EAAA,eAAA,EACb,yCAACC,kBAAe,EAAA,EAAA,QAAA,EAAA,QAAA,EAAM,KADW,eAEnC,CAAA;AAAA,sBACAL,cAAA,CAACI,eAAQ,KAAM,EAAA,eAAA,EACb,yCAACC,kBAAe,EAAA,EAAA,QAAA,EAAA,OAAA,EAAK,KADY,eAEnC;AAAA,KACF,EAAA,CAAA;AAAA,oBACAL,cAAA,CAACM,gBAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAAN,cAAA;AAAA,MAACO,uBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QAEC;AAAA;AAAA,SAPmC,eASxC,CAAA;AAAA,oBACAP,cAAA,CAACM,gBAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAAN,cAAA;AAAA,MAACQ,iCAAA;AAAA,MAAA;AAAA,QACE,GAAGZ,sBAAAA;AAAA,QACJ;AAAA;AAAA,SAHoC,eAKxC;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"filterProviderKey\" | \"onFilterApplied\" | \"onFilterCleared\"\n > {\n SavedFilterPanelProps?: Pick<\n SavedFilterPanelProps,\n \"availableColumns\" | \"filterPillPermissions\"\n >;\n children: ReactNode;\n}\n\nexport const TabbedFilterContainer = ({\n SavedFilterPanelProps,\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: TabbedFilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-tabbed-filter-container\",\n css: tabbedFilterContainerCss,\n window: targetWindow,\n });\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <TabsNext defaultValue=\"ad-hoc-filter\">\n <TabListNext appearance=\"transparent\">\n <TabNext value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <TabNextTrigger>AD HOC</TabNextTrigger>\n </TabNext>\n <TabNext value=\"saved-filters\" key=\"saved-filters\">\n <TabNextTrigger>SAVED</TabNextTrigger>\n </TabNext>\n </TabListNext>\n <TabNextPanel value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <FilterPanel\n filter={filter}\n filterProviderKey={filterProviderKey}\n onFilterApplied={onFilterApplied}\n onFilterCleared={onFilterCleared}\n >\n {children}\n </FilterPanel>\n </TabNextPanel>\n <TabNextPanel value=\"saved-filters\" key=\"saved-filters\">\n <SavedFilterPanel\n {...SavedFilterPanelProps}\n filterProviderKey={filterProviderKey}\n />\n </TabNextPanel>\n </TabsNext>\n </div>\n );\n};\n"],"names":["SavedFilterPanelProps","useWindow","useComponentCssInjection","tabbedFilterContainerCss","jsx","jsxs","TabsNext","TabListNext","TabNext","TabNextTrigger","TabNextPanel","FilterPanel","SavedFilterPanel"],"mappings":";;;;;;;;;;;AAmBA,MAAM,SAAY,GAAA,0BAAA;AAeX,MAAM,wBAAwB,CAAC;AAAA,EACpC,qBAAAA,EAAAA,sBAAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,6BAAA;AAAA,IACR,GAAK,EAAAC,uBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,uBACGC,cAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,SAAS,CACzD,EAAA,QAAA,kBAAAC,eAAA,CAACC,YAAS,EAAA,EAAA,YAAA,EAAa,eACrB,EAAA,QAAA,EAAA;AAAA,oBAACD,eAAA,CAAAE,eAAA,EAAA,EAAY,YAAW,aACtB,EAAA,QAAA,EAAA;AAAA,sBAAAH,cAAA,CAACI,eAAQ,KAAM,EAAA,eAAA,EACb,yCAACC,kBAAe,EAAA,EAAA,QAAA,EAAA,QAAA,EAAM,KADW,eAEnC,CAAA;AAAA,sBACAL,cAAA,CAACI,eAAQ,KAAM,EAAA,eAAA,EACb,yCAACC,kBAAe,EAAA,EAAA,QAAA,EAAA,OAAA,EAAK,KADY,eAEnC;AAAA,KACF,EAAA,CAAA;AAAA,oBACAL,cAAA,CAACM,gBAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAAN,cAAA;AAAA,MAACO,uBAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QAEC;AAAA;AAAA,SAPmC,eASxC,CAAA;AAAA,oBACAP,cAAA,CAACM,gBAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAAN,cAAA;AAAA,MAACQ,iCAAA;AAAA,MAAA;AAAA,QACE,GAAGZ,sBAAAA;AAAA,QACJ;AAAA;AAAA,SAHoC,eAKxC;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var toggleFilterCss = ".vuuToggleFilter {\n .vuuToggleFilter-onlyAvailableValue:not([aria-checked=\"true\"],:hover) {\n background-color: var(--vuuToggleFilter-implicitActive-bg, var(--salt-actionable-bold-background));\n }\n}\n";
4
+
5
+ module.exports = toggleFilterCss;
6
+ //# sourceMappingURL=ToggleFilter.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleFilter.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -2,35 +2,47 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var core = require('@salt-ds/core');
5
- var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var styles = require('@salt-ds/styles');
6
+ var window = require('@salt-ds/window');
6
7
  var cx = require('clsx');
7
- var vuuDataReact = require('@vuu-ui/vuu-data-react');
8
8
  var react = require('react');
9
+ var useToggleFilter = require('./useToggleFilter.js');
10
+ var ToggleFilter$1 = require('./ToggleFilter.css.js');
9
11
 
12
+ const getValues = (defaultValue, value) => {
13
+ if (defaultValue === void 0 && value === void 0) {
14
+ return ["all"];
15
+ } else if (defaultValue !== void 0 && value !== void 0) {
16
+ throw Error(
17
+ "[ToggleFilter] only one of defaultValue/value must be provided"
18
+ );
19
+ } else if (defaultValue === "") {
20
+ return ["all"];
21
+ } else if (value === "") {
22
+ return [void 0, "all"];
23
+ } else {
24
+ return [defaultValue, value];
25
+ }
26
+ };
10
27
  const classBase = "vuuToggleFilter";
11
- const ToggleFilter = ({
28
+ const ToggleFilter = react.forwardRef(function ToggleFilter2({
12
29
  className,
13
30
  column,
31
+ defaultValue: defaultValueProp,
14
32
  onCommit,
15
33
  table,
16
34
  value: valueProp,
17
35
  values,
18
36
  ...ToggleButtonGroupProps2
19
- }) => {
20
- const [typeaheadValues, setTypeaheadValues] = react.useState([]);
21
- const getSuggestions = vuuDataReact.useTypeaheadSuggestions();
22
- const value = valueProp === "" ? "all" : valueProp;
23
- react.useMemo(() => {
24
- const vuuTable = vuuUtils.getVuuTable(table);
25
- const params = [vuuTable, column];
26
- getSuggestions(params).then((suggestions) => {
27
- if (suggestions === false) {
28
- setTypeaheadValues([]);
29
- } else {
30
- setTypeaheadValues(suggestions);
31
- }
32
- });
33
- }, [column, getSuggestions, table]);
37
+ }, forwardedRef) {
38
+ const targetWindow = window.useWindow();
39
+ styles.useComponentCssInjection({
40
+ testId: "vuu-toggle-filter",
41
+ css: ToggleFilter$1,
42
+ window: targetWindow
43
+ });
44
+ const [defaultValue, value] = getValues(defaultValueProp, valueProp);
45
+ const onlyAvailableValue = useToggleFilter.useToggleFilter({ column, table, values });
34
46
  const handleChange = react.useCallback(
35
47
  (e) => {
36
48
  const value2 = e.currentTarget.value;
@@ -47,23 +59,27 @@ const ToggleFilter = ({
47
59
  {
48
60
  ...ToggleButtonGroupProps2,
49
61
  className: cx(classBase, className),
62
+ defaultValue,
50
63
  onChange: handleChange,
64
+ ref: forwardedRef,
51
65
  value,
52
66
  children: [
53
67
  /* @__PURE__ */ jsxRuntime.jsx(core.ToggleButton, { value: "all", children: "ALL" }, "all"),
54
- values.map((value2) => /* @__PURE__ */ jsxRuntime.jsx(
68
+ values.map((toggleValue) => /* @__PURE__ */ jsxRuntime.jsx(
55
69
  core.ToggleButton,
56
70
  {
57
- value: value2,
58
- disabled: !typeaheadValues.includes(value2) && value2 === "all",
59
- children: value2
71
+ className: cx({
72
+ [`${classBase}-onlyAvailableValue`]: onlyAvailableValue === toggleValue
73
+ }),
74
+ value: toggleValue,
75
+ children: toggleValue
60
76
  },
61
- value2
77
+ toggleValue
62
78
  ))
63
79
  ]
64
80
  }
65
81
  );
66
- };
82
+ });
67
83
 
68
84
  exports.ToggleFilter = ToggleFilter;
69
85
  //# sourceMappingURL=ToggleFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleFilter.js","sources":["../../../../packages/vuu-filters/src/toggle-filter/ToggleFilter.tsx"],"sourcesContent":["import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { CommitHandler, getVuuTable } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useTypeaheadSuggestions } from \"@vuu-ui/vuu-data-react\";\nimport { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { SyntheticEvent, useCallback, useMemo, useState } from \"react\";\n\nexport interface ToggleFilterProps extends ToggleButtonGroupProps {\n column: string;\n onCommit: CommitHandler<HTMLElement>;\n table: TableSchemaTable;\n values: string[];\n}\n\nconst classBase = \"vuuToggleFilter\";\n\nexport const ToggleFilter = ({\n className,\n column,\n onCommit,\n table,\n value: valueProp,\n values,\n ...ToggleButtonGroupProps\n}: ToggleFilterProps) => {\n const [typeaheadValues, setTypeaheadValues] = useState<string[]>([]);\n const getSuggestions = useTypeaheadSuggestions();\n\n const value = valueProp === \"\" ? \"all\" : valueProp;\n\n useMemo(() => {\n const vuuTable = getVuuTable(table);\n const params: TypeaheadParams = [vuuTable, column];\n getSuggestions(params).then((suggestions) => {\n if (suggestions === false) {\n // TODO is this right\n setTypeaheadValues([]);\n } else {\n setTypeaheadValues(suggestions);\n }\n });\n }, [column, getSuggestions, table]);\n\n const handleChange = useCallback(\n (e: SyntheticEvent<HTMLButtonElement>) => {\n const value = e.currentTarget.value;\n if (value === \"all\") {\n onCommit(e, \"\");\n } else {\n onCommit(e, value);\n }\n },\n [onCommit],\n );\n\n return (\n <ToggleButtonGroup\n {...ToggleButtonGroupProps}\n className={cx(classBase, className)}\n onChange={handleChange}\n value={value}\n >\n <ToggleButton key=\"all\" value=\"all\">\n ALL\n </ToggleButton>\n {values.map((value) => (\n <ToggleButton\n key={value}\n value={value}\n disabled={!typeaheadValues.includes(value) && value === \"all\"}\n >\n {value}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n};\n"],"names":["ToggleButtonGroupProps","useState","useTypeaheadSuggestions","useMemo","getVuuTable","useCallback","value","jsxs","ToggleButtonGroup","jsx","ToggleButton"],"mappings":";;;;;;;;;AAmBA,MAAM,SAAY,GAAA,iBAAA;AAEX,MAAM,eAAe,CAAC;AAAA,EAC3B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,MAAA;AAAA,EACA,GAAGA;AACL,CAAyB,KAAA;AACvB,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAAC,cAAA,CAAmB,EAAE,CAAA;AACnE,EAAA,MAAM,iBAAiBC,oCAAwB,EAAA;AAE/C,EAAM,MAAA,KAAA,GAAQ,SAAc,KAAA,EAAA,GAAK,KAAQ,GAAA,SAAA;AAEzC,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAM,MAAA,QAAA,GAAWC,qBAAY,KAAK,CAAA;AAClC,IAAM,MAAA,MAAA,GAA0B,CAAC,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,cAAA,CAAe,MAAM,CAAA,CAAE,IAAK,CAAA,CAAC,WAAgB,KAAA;AAC3C,MAAA,IAAI,gBAAgB,KAAO,EAAA;AAEzB,QAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,OAChB,MAAA;AACL,QAAA,kBAAA,CAAmB,WAAW,CAAA;AAAA;AAChC,KACD,CAAA;AAAA,GACA,EAAA,CAAC,MAAQ,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAElC,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,CAAyC,KAAA;AACxC,MAAMC,MAAAA,MAAAA,GAAQ,EAAE,aAAc,CAAA,KAAA;AAC9B,MAAA,IAAIA,WAAU,KAAO,EAAA;AACnB,QAAA,QAAA,CAAS,GAAG,EAAE,CAAA;AAAA,OACT,MAAA;AACL,QAAA,QAAA,CAAS,GAAGA,MAAK,CAAA;AAAA;AACnB,KACF;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EACE,uBAAAC,eAAA;AAAA,IAACC,sBAAA;AAAA,IAAA;AAAA,MACE,GAAGR,uBAAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,QAAU,EAAA,YAAA;AAAA,MACV,KAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAS,cAAA,CAACC,iBAAuB,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,QAAA,EAAA,KAAA,EAAA,EAAlB,KAElB,CAAA;AAAA,QACC,MAAA,CAAO,GAAI,CAAA,CAACJ,MACX,qBAAAG,cAAA;AAAA,UAACC,iBAAA;AAAA,UAAA;AAAA,YAEC,KAAOJ,EAAAA,MAAAA;AAAA,YACP,UAAU,CAAC,eAAA,CAAgB,QAASA,CAAAA,MAAK,KAAKA,MAAU,KAAA,KAAA;AAAA,YAEvD,QAAAA,EAAAA;AAAA,WAAA;AAAA,UAJIA;AAAA,SAMR;AAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
1
+ {"version":3,"file":"ToggleFilter.js","sources":["../../../../packages/vuu-filters/src/toggle-filter/ToggleFilter.tsx"],"sourcesContent":["import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { ForwardedRef, forwardRef, SyntheticEvent, useCallback } from \"react\";\nimport { type ToggleFilterHookProps, useToggleFilter } from \"./useToggleFilter\";\n\ntype Value = ToggleButtonGroupProps[\"value\"];\n\nconst getValues = (\n defaultValue: Value | undefined,\n value: Value | undefined,\n) => {\n if (defaultValue === undefined && value === undefined) {\n return [\"all\"];\n } else if (defaultValue !== undefined && value !== undefined) {\n throw Error(\n \"[ToggleFilter] only one of defaultValue/value must be provided\",\n );\n } else if (defaultValue === \"\") {\n return [\"all\"];\n } else if (value === \"\") {\n return [undefined, \"all\"];\n } else {\n return [defaultValue, value];\n }\n};\n\nimport toggleFilterCss from \"./ToggleFilter.css\";\n/**\n * ToggleFilter is designed to work with a FilterProvider and\n * DataSourceProvider. With a DataSourceProvider, values will\n * be validated against available values from datasource.\n * With both FilterProvider and a DataSourceProvider, changes to\n * the currentFilter will also trigger re-evaluation of available\n * values from dataSource.\n * With neither of these Providers available, the ToggleFilter is\n * behaving like a regular ToggleButtonGroup.\n */\nexport interface ToggleFilterProps\n extends ToggleButtonGroupProps,\n ToggleFilterHookProps {\n onCommit: CommitHandler<HTMLElement>;\n}\n\nconst classBase = \"vuuToggleFilter\";\n\nexport const ToggleFilter = forwardRef(function ToggleFilter(\n {\n className,\n column,\n defaultValue: defaultValueProp,\n onCommit,\n table,\n value: valueProp,\n values,\n ...ToggleButtonGroupProps\n }: ToggleFilterProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-toggle-filter\",\n css: toggleFilterCss,\n window: targetWindow,\n });\n\n const [defaultValue, value] = getValues(defaultValueProp, valueProp);\n\n const onlyAvailableValue = useToggleFilter({ column, table, values });\n\n const handleChange = useCallback(\n (e: SyntheticEvent<HTMLButtonElement>) => {\n const value = e.currentTarget.value;\n if (value === \"all\") {\n onCommit(e, \"\");\n } else {\n onCommit(e, value);\n }\n },\n [onCommit],\n );\n\n return (\n <ToggleButtonGroup\n {...ToggleButtonGroupProps}\n className={cx(classBase, className)}\n defaultValue={defaultValue}\n onChange={handleChange}\n ref={forwardedRef}\n value={value}\n >\n <ToggleButton key=\"all\" value=\"all\">\n ALL\n </ToggleButton>\n {values.map((toggleValue) => (\n <ToggleButton\n className={cx({\n [`${classBase}-onlyAvailableValue`]:\n onlyAvailableValue === toggleValue,\n })}\n key={toggleValue}\n value={toggleValue}\n >\n {toggleValue}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n});\n"],"names":["forwardRef","ToggleFilter","ToggleButtonGroupProps","useWindow","useComponentCssInjection","toggleFilterCss","useToggleFilter","useCallback","value","jsxs","ToggleButtonGroup","jsx","ToggleButton"],"mappings":";;;;;;;;;;;AAcA,MAAM,SAAA,GAAY,CAChB,YAAA,EACA,KACG,KAAA;AACH,EAAI,IAAA,YAAA,KAAiB,KAAa,CAAA,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AACrD,IAAA,OAAO,CAAC,KAAK,CAAA;AAAA,GACJ,MAAA,IAAA,YAAA,KAAiB,KAAa,CAAA,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AAC5D,IAAM,MAAA,KAAA;AAAA,MACJ;AAAA,KACF;AAAA,GACF,MAAA,IAAW,iBAAiB,EAAI,EAAA;AAC9B,IAAA,OAAO,CAAC,KAAK,CAAA;AAAA,GACf,MAAA,IAAW,UAAU,EAAI,EAAA;AACvB,IAAO,OAAA,CAAC,QAAW,KAAK,CAAA;AAAA,GACnB,MAAA;AACL,IAAO,OAAA,CAAC,cAAc,KAAK,CAAA;AAAA;AAE/B,CAAA;AAmBA,MAAM,SAAY,GAAA,iBAAA;AAEL,MAAA,YAAA,GAAeA,gBAAW,CAAA,SAASC,aAC9C,CAAA;AAAA,EACE,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAc,EAAA,gBAAA;AAAA,EACd,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,MAAA;AAAA,EACA,GAAGC;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,cAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,CAAC,YAAc,EAAA,KAAK,CAAI,GAAA,SAAA,CAAU,kBAAkB,SAAS,CAAA;AAEnE,EAAA,MAAM,qBAAqBC,+BAAgB,CAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,QAAQ,CAAA;AAEpE,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,CAAyC,KAAA;AACxC,MAAMC,MAAAA,MAAAA,GAAQ,EAAE,aAAc,CAAA,KAAA;AAC9B,MAAA,IAAIA,WAAU,KAAO,EAAA;AACnB,QAAA,QAAA,CAAS,GAAG,EAAE,CAAA;AAAA,OACT,MAAA;AACL,QAAA,QAAA,CAAS,GAAGA,MAAK,CAAA;AAAA;AACnB,KACF;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EACE,uBAAAC,eAAA;AAAA,IAACC,sBAAA;AAAA,IAAA;AAAA,MACE,GAAGR,uBAAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,YAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACV,GAAK,EAAA,YAAA;AAAA,MACL,KAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAS,cAAA,CAACC,iBAAuB,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,QAAA,EAAA,KAAA,EAAA,EAAlB,KAElB,CAAA;AAAA,QACC,MAAA,CAAO,GAAI,CAAA,CAAC,WACX,qBAAAD,cAAA;AAAA,UAACC,iBAAA;AAAA,UAAA;AAAA,YACC,WAAW,EAAG,CAAA;AAAA,cACZ,CAAC,CAAA,EAAG,SAAS,CAAA,mBAAA,CAAqB,GAChC,kBAAuB,KAAA;AAAA,aAC1B,CAAA;AAAA,YAED,KAAO,EAAA,WAAA;AAAA,YAEN,QAAA,EAAA;AAAA,WAAA;AAAA,UAHI;AAAA,SAKR;AAAA;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ var FilterContext = require('../filter-provider/FilterContext.js');
4
+ var vuuDataReact = require('@vuu-ui/vuu-data-react');
5
+ var react = require('react');
6
+ var vuuUtils = require('@vuu-ui/vuu-utils');
7
+
8
+ const assertValid = (values, actualValues) => {
9
+ if (actualValues.some((val) => values.indexOf(val) === -1)) {
10
+ console.warn(`[useToggleFilter] ToggleFilter is configured with values which do not include all values from data source
11
+ [${values.join()}]
12
+ [${actualValues.join()}]`);
13
+ }
14
+ };
15
+ const typeaheadRefreshRequired = (f1, f2) => {
16
+ if (f1 === null && f2 === null) {
17
+ return false;
18
+ } else if (f1 === null || f2 === null) {
19
+ return true;
20
+ } else if (vuuUtils.filtersAreEqual(f1, f2)) {
21
+ return false;
22
+ } else {
23
+ return true;
24
+ }
25
+ };
26
+ const useToggleFilter = ({
27
+ column,
28
+ table,
29
+ values
30
+ }) => {
31
+ const { currentFilter } = FilterContext.useSavedFilters();
32
+ const currentFilterRef = react.useRef(currentFilter.filter);
33
+ const [typeaheadValues, setTypeaheadValues] = react.useState([]);
34
+ const getSuggestions = vuuDataReact.useTypeaheadSuggestions();
35
+ const refreshSuggestions = react.useCallback(
36
+ (table2) => {
37
+ const vuuTable = vuuUtils.getVuuTable(table2);
38
+ const params = [vuuTable, column];
39
+ getSuggestions(params).then((suggestions) => {
40
+ if (suggestions === false) {
41
+ setTypeaheadValues([]);
42
+ } else {
43
+ assertValid(values, suggestions);
44
+ setTypeaheadValues(suggestions);
45
+ }
46
+ });
47
+ },
48
+ [column, getSuggestions, values]
49
+ );
50
+ react.useMemo(() => {
51
+ if (table) {
52
+ refreshSuggestions(table);
53
+ }
54
+ }, [refreshSuggestions, table]);
55
+ react.useMemo(() => {
56
+ const { current: filter } = currentFilterRef;
57
+ if (table && typeaheadRefreshRequired(filter, currentFilter.filter)) {
58
+ refreshSuggestions(table);
59
+ }
60
+ currentFilterRef.current = currentFilter.filter;
61
+ }, [currentFilter.filter, refreshSuggestions, table]);
62
+ const [firstValue] = typeaheadValues;
63
+ return typeaheadValues.length === 1 ? firstValue : void 0;
64
+ };
65
+
66
+ exports.useToggleFilter = useToggleFilter;
67
+ //# sourceMappingURL=useToggleFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToggleFilter.js","sources":["../../../../packages/vuu-filters/src/toggle-filter/useToggleFilter.ts"],"sourcesContent":["import { useSavedFilters } from \"../filter-provider/FilterContext\";\nimport { useTypeaheadSuggestions } from \"@vuu-ui/vuu-data-react\";\nimport type { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { filtersAreEqual, getVuuTable } from \"@vuu-ui/vuu-utils\";\nimport type { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\n\nconst assertValid = (values: string[], actualValues: string[]) => {\n if (actualValues.some((val) => values.indexOf(val) === -1)) {\n console.warn(`[useToggleFilter] ToggleFilter is configured with values which do not include all values from data source\n [${values.join()}]\n [${actualValues.join()}]`);\n }\n};\n\nexport interface ToggleFilterHookProps {\n column: string;\n /**\n * table must be provided to enable validation\n * of values using server data.\n */\n table?: TableSchemaTable;\n values: string[];\n}\n\nconst typeaheadRefreshRequired = (\n f1: FilterContainerFilter | null,\n f2: FilterContainerFilter | null,\n) => {\n if (f1 === null && f2 === null) {\n return false;\n } else if (f1 === null || f2 === null) {\n return true;\n } else if (filtersAreEqual(f1, f2)) {\n return false;\n } else {\n return true;\n }\n};\n\nexport const useToggleFilter = ({\n column,\n table,\n values,\n}: ToggleFilterHookProps) => {\n const { currentFilter } = useSavedFilters();\n const currentFilterRef = useRef(currentFilter.filter);\n const [typeaheadValues, setTypeaheadValues] = useState<string[]>([]);\n const getSuggestions = useTypeaheadSuggestions();\n\n const refreshSuggestions = useCallback(\n (table: TableSchemaTable) => {\n const vuuTable = getVuuTable(table);\n const params: TypeaheadParams = [vuuTable, column];\n getSuggestions(params).then((suggestions) => {\n if (suggestions === false) {\n setTypeaheadValues([]);\n } else {\n assertValid(values, suggestions);\n setTypeaheadValues(suggestions);\n }\n });\n },\n [column, getSuggestions, values],\n );\n\n useMemo(() => {\n if (table) {\n refreshSuggestions(table);\n }\n }, [refreshSuggestions, table]);\n\n // Changes to currentFilter may affect the suggestions we receive\n // if it has changed and been applied to dataSource. If there is no FilterProvider\n // it will never change, so won't matter.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => {\n const { current: filter } = currentFilterRef;\n if (table && typeaheadRefreshRequired(filter, currentFilter.filter)) {\n refreshSuggestions(table);\n }\n currentFilterRef.current = currentFilter.filter;\n }, [currentFilter.filter, refreshSuggestions, table]);\n\n const [firstValue] = typeaheadValues;\n\n // onlyAvailableValue\n return typeaheadValues.length === 1 ? firstValue : undefined;\n};\n"],"names":["filtersAreEqual","useSavedFilters","useRef","useState","useTypeaheadSuggestions","useCallback","table","getVuuTable","useMemo"],"mappings":";;;;;;;AAQA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAkB,YAA2B,KAAA;AAChE,EAAI,IAAA,YAAA,CAAa,KAAK,CAAC,GAAA,KAAQ,OAAO,OAAQ,CAAA,GAAG,CAAM,KAAA,CAAA,CAAE,CAAG,EAAA;AAC1D,IAAA,OAAA,CAAQ,IAAK,CAAA,CAAA;AAAA,aACF,EAAA,MAAA,CAAO,MAAM,CAAA;AAAA,aACb,EAAA,YAAA,CAAa,IAAK,EAAC,CAAG,CAAA,CAAA,CAAA;AAAA;AAErC,CAAA;AAYA,MAAM,wBAAA,GAA2B,CAC/B,EAAA,EACA,EACG,KAAA;AACH,EAAI,IAAA,EAAA,KAAO,IAAQ,IAAA,EAAA,KAAO,IAAM,EAAA;AAC9B,IAAO,OAAA,KAAA;AAAA,GACE,MAAA,IAAA,EAAA,KAAO,IAAQ,IAAA,EAAA,KAAO,IAAM,EAAA;AACrC,IAAO,OAAA,IAAA;AAAA,GACE,MAAA,IAAAA,wBAAA,CAAgB,EAAI,EAAA,EAAE,CAAG,EAAA;AAClC,IAAO,OAAA,KAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,IAAA;AAAA;AAEX,CAAA;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAA6B,KAAA;AAC3B,EAAM,MAAA,EAAE,aAAc,EAAA,GAAIC,6BAAgB,EAAA;AAC1C,EAAM,MAAA,gBAAA,GAAmBC,YAAO,CAAA,aAAA,CAAc,MAAM,CAAA;AACpD,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAAC,cAAA,CAAmB,EAAE,CAAA;AACnE,EAAA,MAAM,iBAAiBC,oCAAwB,EAAA;AAE/C,EAAA,MAAM,kBAAqB,GAAAC,iBAAA;AAAA,IACzB,CAACC,MAA4B,KAAA;AAC3B,MAAM,MAAA,QAAA,GAAWC,qBAAYD,MAAK,CAAA;AAClC,MAAM,MAAA,MAAA,GAA0B,CAAC,QAAA,EAAU,MAAM,CAAA;AACjD,MAAA,cAAA,CAAe,MAAM,CAAA,CAAE,IAAK,CAAA,CAAC,WAAgB,KAAA;AAC3C,QAAA,IAAI,gBAAgB,KAAO,EAAA;AACzB,UAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,SAChB,MAAA;AACL,UAAA,WAAA,CAAY,QAAQ,WAAW,CAAA;AAC/B,UAAA,kBAAA,CAAmB,WAAW,CAAA;AAAA;AAChC,OACD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,MAAQ,EAAA,cAAA,EAAgB,MAAM;AAAA,GACjC;AAEA,EAAAE,aAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA;AAC1B,GACC,EAAA,CAAC,kBAAoB,EAAA,KAAK,CAAC,CAAA;AAM9B,EAAAA,aAAA,CAAQ,MAAM;AACZ,IAAM,MAAA,EAAE,OAAS,EAAA,MAAA,EAAW,GAAA,gBAAA;AAC5B,IAAA,IAAI,KAAS,IAAA,wBAAA,CAAyB,MAAQ,EAAA,aAAA,CAAc,MAAM,CAAG,EAAA;AACnE,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA;AAE1B,IAAA,gBAAA,CAAiB,UAAU,aAAc,CAAA,MAAA;AAAA,KACxC,CAAC,aAAA,CAAc,MAAQ,EAAA,kBAAA,EAAoB,KAAK,CAAC,CAAA;AAEpD,EAAM,MAAA,CAAC,UAAU,CAAI,GAAA,eAAA;AAGrB,EAAO,OAAA,eAAA,CAAgB,MAAW,KAAA,CAAA,GAAI,UAAa,GAAA,KAAA,CAAA;AACrD;;;;"}
@@ -1,4 +1,4 @@
1
- var filterContainerCss = ".vuuFilterContainer {\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-100)\n\n}";
1
+ var filterContainerCss = ".vuuFilterContainer {\n display: var(--vuuFilterContainer-display,flex);\n flex: var(--vuuFilterContainer-flex);\n flex-direction: var(--vuuFilterContainer-flexDirection,column);\n gap: var(--salt-spacing-100);\n height: var(--vuuFilterContainer-height);\n overflow: auto;\n}";
2
2
 
3
3
  export { filterContainerCss as default };
4
4
  //# sourceMappingURL=FilterContainer.css.js.map
@@ -14,14 +14,9 @@ const notEmpty = (value) => Array.isArray(value) ? value[0] !== "" && value[1] !
14
14
  const FilterContainerColumnFilter = ({
15
15
  column,
16
16
  operator = "=",
17
+ variant,
17
18
  ...props
18
19
  }) => {
19
- const targetWindow = useWindow();
20
- useComponentCssInjection({
21
- testId: "vuu-filter-container",
22
- css: filterContainerCss,
23
- window: targetWindow
24
- });
25
20
  const {
26
21
  filterProviderKey,
27
22
  onChange: onFilterContextChange,
@@ -98,7 +93,8 @@ const FilterContainerColumnFilter = ({
98
93
  onColumnRangeFilterChange: handleColumnRangeFilterChange,
99
94
  onCommit: handleCommit,
100
95
  operator,
101
- value
96
+ value,
97
+ variant
102
98
  }
103
99
  );
104
100
  };
@@ -111,13 +107,26 @@ const FilterContainer = ({
111
107
  onFilterCleared,
112
108
  ...htmlAttributes
113
109
  }) => {
110
+ const targetWindow = useWindow();
111
+ useComponentCssInjection({
112
+ testId: "vuu-filter-container",
113
+ css: filterContainerCss,
114
+ window: targetWindow
115
+ });
114
116
  const filterContextProps = useFilterContainer({
115
117
  filter,
116
118
  filterProviderKey,
117
119
  onFilterApplied,
118
120
  onFilterCleared
119
121
  });
120
- return /* @__PURE__ */ jsx(ColumnFilterContext.Provider, { value: filterContextProps, children: /* @__PURE__ */ jsx("div", { ...htmlAttributes, className: cx(classBase, className), children }) });
122
+ return /* @__PURE__ */ jsx(ColumnFilterContext.Provider, { value: filterContextProps, children: /* @__PURE__ */ jsx(
123
+ "div",
124
+ {
125
+ ...htmlAttributes,
126
+ className: cx(classBase, className, "vuuScrollable"),
127
+ children
128
+ }
129
+ ) });
121
130
  };
122
131
 
123
132
  export { FilterContainer, FilterContainerColumnFilter };
@@ -1 +1 @@
1
- {"version":3,"file":"FilterContainer.js","sources":["../../../../packages/vuu-filters/src/filter-container/FilterContainer.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport {\n ColumnFilterContext,\n useFilterContainer,\n useFilterContext,\n type ColumnFilterContainerHookProps,\n} from \"./useFilterContainer\";\nimport {\n ColumnFilterChangeHandler,\n ColumnFilterCommitHandler,\n ColumnFilterValue,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnFilter, ColumnFilterProps } from \"../column-filter/ColumnFilter\";\nimport {\n filterDescriptorHasFilter,\n isNullFilter,\n useSavedFilters,\n} from \"../filter-provider/FilterContext\";\nimport { getColumnValueFromFilter } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport filterContainerCss from \"./FilterContainer.css\";\n\nconst classBase = \"vuuFilterContainer\";\n\nconst notEmpty = (value: ColumnFilterValue) =>\n Array.isArray(value) ? value[0] !== \"\" && value[1] !== \"\" : value !== \"\";\n\nexport interface FilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n ColumnFilterContainerHookProps {\n children: ReactNode;\n filterProviderKey?: string;\n}\n\nexport interface FilterContainerColumnFilterProps\n extends Omit<ColumnFilterProps, \"defaultValue\" | \"onCommit\" | \"value\"> {\n defaultValue?: ColumnFilterValue;\n}\n\nexport const FilterContainerColumnFilter = ({\n column,\n operator = \"=\",\n ...props\n}: FilterContainerColumnFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-container\",\n css: filterContainerCss,\n window: targetWindow,\n });\n\n const {\n filterProviderKey,\n onChange: onFilterContextChange,\n onCommit: onFilterContextCommit,\n register,\n } = useFilterContext(column, true);\n\n const initialValue = useMemo(\n () => register(column, operator),\n [column, operator, register],\n );\n\n const [value, setValue] = useState(initialValue);\n const valueRef = useRef<ColumnFilterValue>(initialValue);\n const { currentFilter } = useSavedFilters(filterProviderKey);\n\n // This is primarily to guard against client passing non-stable 'column' reference\n // which would trigger the commit check below.\n const currentFilterRef = useRef(currentFilter.id);\n\n useMemo(() => {\n if (currentFilterRef.current !== currentFilter.id) {\n currentFilterRef.current = currentFilter.id;\n\n if (isNullFilter(currentFilter) && notEmpty(valueRef.current)) {\n valueRef.current = Array.isArray(valueRef.current) ? [\"\", \"\"] : \"\";\n setValue(valueRef.current);\n } else if (filterDescriptorHasFilter(currentFilter)) {\n const v = getColumnValueFromFilter(\n column,\n operator,\n currentFilter.filter,\n );\n if (\n operator === \"between\" &&\n !Array.isArray(v) &&\n Array.isArray(valueRef.current)\n ) {\n // A between filter with only the first item filled is converted to an '=' filter\n // in FilterAggregator. Translate value back to range value here\n const [v1, v2] = valueRef.current;\n if (`${v}` === v1 && v2 === \"\") {\n return;\n } else {\n valueRef.current = [`${v}`, \"\"];\n setValue(valueRef.current);\n }\n } else if (v !== valueRef.current) {\n valueRef.current = v;\n setValue(v);\n }\n }\n }\n // We only want this to run when the filter id changes, not when\n // filter instance changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [column, currentFilter.id]);\n\n const handleCommit = useCallback<ColumnFilterCommitHandler>(\n (column, op, value) => {\n valueRef.current = value;\n setValue(value);\n onFilterContextCommit(column, op, value);\n },\n [onFilterContextCommit],\n );\n\n const handleColumnFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [`${value}`, v[1]] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n const handleColumnRangeFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [v[0], `${value}`] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n return (\n <ColumnFilter\n {...props}\n column={column}\n onColumnFilterChange={handleColumnFilterChange}\n onColumnRangeFilterChange={handleColumnRangeFilterChange}\n onCommit={handleCommit}\n operator={operator}\n value={value}\n />\n );\n};\n\n/**\n * FilterContainer is a generic UI container for a collection of Filter\n * controls. Each control manages a single filter clause and the Filter\n * Container aggregates these clauses into a single filter. FilterContainer\n * provides a FilterContainerFilter which can be used to provide children.\n * This is a wrapper around ColumnFilter, which adds some plumbing to allow\n * the container to track changes and manage each individual contribution to\n * the top-level filter.\n * See FilterPanel and InlineFilter for examples of FilterContainer usage.\n */\nexport const FilterContainer = ({\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: FilterContainerProps) => {\n const filterContextProps = useFilterContainer({\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n });\n return (\n <ColumnFilterContext.Provider value={filterContextProps}>\n <div {...htmlAttributes} className={cx(classBase, className)}>\n {children}\n </div>\n </ColumnFilterContext.Provider>\n );\n};\n"],"names":["column","value"],"mappings":"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"}
1
+ {"version":3,"file":"FilterContainer.js","sources":["../../../../packages/vuu-filters/src/filter-container/FilterContainer.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport {\n ColumnFilterContext,\n useFilterContainer,\n useFilterContext,\n type ColumnFilterContainerHookProps,\n} from \"./useFilterContainer\";\nimport {\n ColumnFilterChangeHandler,\n ColumnFilterCommitHandler,\n ColumnFilterValue,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnFilter, ColumnFilterProps } from \"../column-filter/ColumnFilter\";\nimport {\n filterDescriptorHasFilter,\n isNullFilter,\n useSavedFilters,\n} from \"../filter-provider/FilterContext\";\nimport { getColumnValueFromFilter } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport filterContainerCss from \"./FilterContainer.css\";\n\nconst classBase = \"vuuFilterContainer\";\n\nconst notEmpty = (value: ColumnFilterValue) =>\n Array.isArray(value) ? value[0] !== \"\" && value[1] !== \"\" : value !== \"\";\n\nexport interface FilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n ColumnFilterContainerHookProps {\n children: ReactNode;\n filterProviderKey?: string;\n}\n\nexport interface FilterContainerColumnFilterProps\n extends Omit<ColumnFilterProps, \"defaultValue\" | \"onCommit\" | \"value\"> {\n defaultValue?: ColumnFilterValue;\n}\n\nexport const FilterContainerColumnFilter = ({\n column,\n operator = \"=\",\n variant,\n ...props\n}: FilterContainerColumnFilterProps) => {\n const {\n filterProviderKey,\n onChange: onFilterContextChange,\n onCommit: onFilterContextCommit,\n register,\n } = useFilterContext(column, true);\n\n const initialValue = useMemo(\n () => register(column, operator),\n [column, operator, register],\n );\n\n const [value, setValue] = useState(initialValue);\n const valueRef = useRef<ColumnFilterValue>(initialValue);\n const { currentFilter } = useSavedFilters(filterProviderKey);\n\n // This is primarily to guard against client passing non-stable 'column' reference\n // which would trigger the commit check below.\n const currentFilterRef = useRef(currentFilter.id);\n\n useMemo(() => {\n if (currentFilterRef.current !== currentFilter.id) {\n currentFilterRef.current = currentFilter.id;\n\n if (isNullFilter(currentFilter) && notEmpty(valueRef.current)) {\n valueRef.current = Array.isArray(valueRef.current) ? [\"\", \"\"] : \"\";\n setValue(valueRef.current);\n } else if (filterDescriptorHasFilter(currentFilter)) {\n const v = getColumnValueFromFilter(\n column,\n operator,\n currentFilter.filter,\n );\n if (\n operator === \"between\" &&\n !Array.isArray(v) &&\n Array.isArray(valueRef.current)\n ) {\n // A between filter with only the first item filled is converted to an '=' filter\n // in FilterAggregator. Translate value back to range value here\n const [v1, v2] = valueRef.current;\n if (`${v}` === v1 && v2 === \"\") {\n return;\n } else {\n valueRef.current = [`${v}`, \"\"];\n setValue(valueRef.current);\n }\n } else if (v !== valueRef.current) {\n valueRef.current = v;\n setValue(v);\n }\n }\n }\n // We only want this to run when the filter id changes, not when\n // filter instance changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [column, currentFilter.id]);\n\n const handleCommit = useCallback<ColumnFilterCommitHandler>(\n (column, op, value) => {\n valueRef.current = value;\n setValue(value);\n onFilterContextCommit(column, op, value);\n },\n [onFilterContextCommit],\n );\n\n const handleColumnFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [`${value}`, v[1]] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n const handleColumnRangeFilterChange = useCallback<ColumnFilterChangeHandler>(\n (value, column, op) => {\n const { current: v } = valueRef;\n valueRef.current = Array.isArray(v) ? [v[0], `${value}`] : value;\n setValue(valueRef.current);\n onFilterContextChange(valueRef.current, column, op);\n },\n [onFilterContextChange],\n );\n\n return (\n <ColumnFilter\n {...props}\n column={column}\n onColumnFilterChange={handleColumnFilterChange}\n onColumnRangeFilterChange={handleColumnRangeFilterChange}\n onCommit={handleCommit}\n operator={operator}\n value={value}\n variant={variant}\n />\n );\n};\n\n/**\n * FilterContainer is a generic UI container for a collection of Filter\n * controls. Each control manages a single filter clause and the Filter\n * Container aggregates these clauses into a single filter. FilterContainer\n * provides a FilterContainerFilter which can be used to provide children.\n * This is a wrapper around ColumnFilter, which adds some plumbing to allow\n * the container to track changes and manage each individual contribution to\n * the top-level filter.\n * See FilterPanel and InlineFilter for examples of FilterContainer usage.\n */\nexport const FilterContainer = ({\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: FilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-container\",\n css: filterContainerCss,\n window: targetWindow,\n });\n\n const filterContextProps = useFilterContainer({\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n });\n return (\n <ColumnFilterContext.Provider value={filterContextProps}>\n <div\n {...htmlAttributes}\n className={cx(classBase, className, \"vuuScrollable\")}\n >\n {children}\n </div>\n </ColumnFilterContext.Provider>\n );\n};\n"],"names":["column","value"],"mappings":";;;;;;;;;;;AAgCA,MAAM,SAAY,GAAA,oBAAA;AAElB,MAAM,QAAW,GAAA,CAAC,KAChB,KAAA,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,KAAM,CAAA,CAAC,MAAM,EAAM,IAAA,KAAA,CAAM,CAAC,CAAA,KAAM,KAAK,KAAU,KAAA,EAAA;AAcjE,MAAM,8BAA8B,CAAC;AAAA,EAC1C,MAAA;AAAA,EACA,QAAW,GAAA,GAAA;AAAA,EACX,OAAA;AAAA,EACA,GAAG;AACL,CAAwC,KAAA;AACtC,EAAM,MAAA;AAAA,IACJ,iBAAA;AAAA,IACA,QAAU,EAAA,qBAAA;AAAA,IACV,QAAU,EAAA,qBAAA;AAAA,IACV;AAAA,GACF,GAAI,gBAAiB,CAAA,MAAA,EAAQ,IAAI,CAAA;AAEjC,EAAA,MAAM,YAAe,GAAA,OAAA;AAAA,IACnB,MAAM,QAAS,CAAA,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC/B,CAAC,MAAQ,EAAA,QAAA,EAAU,QAAQ;AAAA,GAC7B;AAEA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,YAAY,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,OAA0B,YAAY,CAAA;AACvD,EAAA,MAAM,EAAE,aAAA,EAAkB,GAAA,eAAA,CAAgB,iBAAiB,CAAA;AAI3D,EAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,aAAA,CAAc,EAAE,CAAA;AAEhD,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAI,IAAA,gBAAA,CAAiB,OAAY,KAAA,aAAA,CAAc,EAAI,EAAA;AACjD,MAAA,gBAAA,CAAiB,UAAU,aAAc,CAAA,EAAA;AAEzC,MAAA,IAAI,aAAa,aAAa,CAAA,IAAK,QAAS,CAAA,QAAA,CAAS,OAAO,CAAG,EAAA;AAC7D,QAAS,QAAA,CAAA,OAAA,GAAU,MAAM,OAAQ,CAAA,QAAA,CAAS,OAAO,CAAI,GAAA,CAAC,EAAI,EAAA,EAAE,CAAI,GAAA,EAAA;AAChE,QAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,OAC3B,MAAA,IAAW,yBAA0B,CAAA,aAAa,CAAG,EAAA;AACnD,QAAA,MAAM,CAAI,GAAA,wBAAA;AAAA,UACR,MAAA;AAAA,UACA,QAAA;AAAA,UACA,aAAc,CAAA;AAAA,SAChB;AACA,QACE,IAAA,QAAA,KAAa,SACb,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA,IAChB,KAAM,CAAA,OAAA,CAAQ,QAAS,CAAA,OAAO,CAC9B,EAAA;AAGA,UAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,QAAS,CAAA,OAAA;AAC1B,UAAA,IAAI,CAAG,EAAA,CAAC,CAAO,CAAA,KAAA,EAAA,IAAM,OAAO,EAAI,EAAA;AAC9B,YAAA;AAAA,WACK,MAAA;AACL,YAAA,QAAA,CAAS,OAAU,GAAA,CAAC,CAAG,EAAA,CAAC,IAAI,EAAE,CAAA;AAC9B,YAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA;AAC3B,SACF,MAAA,IAAW,CAAM,KAAA,QAAA,CAAS,OAAS,EAAA;AACjC,UAAA,QAAA,CAAS,OAAU,GAAA,CAAA;AACnB,UAAA,QAAA,CAAS,CAAC,CAAA;AAAA;AACZ;AACF;AACF,GAIC,EAAA,CAAC,MAAQ,EAAA,aAAA,CAAc,EAAE,CAAC,CAAA;AAE7B,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAACA,OAAQ,EAAA,EAAA,EAAIC,MAAU,KAAA;AACrB,MAAA,QAAA,CAAS,OAAUA,GAAAA,MAAAA;AACnB,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAsBD,qBAAAA,CAAAA,OAAAA,EAAQ,IAAIC,MAAK,CAAA;AAAA,KACzC;AAAA,IACA,CAAC,qBAAqB;AAAA,GACxB;AAEA,EAAA,MAAM,wBAA2B,GAAA,WAAA;AAAA,IAC/B,CAACA,MAAOD,EAAAA,OAAAA,EAAQ,EAAO,KAAA;AACrB,MAAM,MAAA,EAAE,OAAS,EAAA,CAAA,EAAM,GAAA,QAAA;AACvB,MAAA,QAAA,CAAS,OAAU,GAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAI,GAAA,CAAC,CAAGC,EAAAA,MAAK,CAAI,CAAA,EAAA,CAAA,CAAE,CAAC,CAAC,CAAIA,GAAAA,MAAAA;AAC3D,MAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AACzB,MAAsB,qBAAA,CAAA,QAAA,CAAS,OAASD,EAAAA,OAAAA,EAAQ,EAAE,CAAA;AAAA,KACpD;AAAA,IACA,CAAC,qBAAqB;AAAA,GACxB;AAEA,EAAA,MAAM,6BAAgC,GAAA,WAAA;AAAA,IACpC,CAACC,MAAOD,EAAAA,OAAAA,EAAQ,EAAO,KAAA;AACrB,MAAM,MAAA,EAAE,OAAS,EAAA,CAAA,EAAM,GAAA,QAAA;AACvB,MAAA,QAAA,CAAS,OAAU,GAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,CAAI,GAAA,CAAC,CAAE,CAAA,CAAC,CAAG,EAAA,CAAA,EAAGC,MAAK,CAAA,CAAE,CAAIA,GAAAA,MAAAA;AAC3D,MAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AACzB,MAAsB,qBAAA,CAAA,QAAA,CAAS,OAASD,EAAAA,OAAAA,EAAQ,EAAE,CAAA;AAAA,KACpD;AAAA,IACA,CAAC,qBAAqB;AAAA,GACxB;AAEA,EACE,uBAAA,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,MAAA;AAAA,MACA,oBAAsB,EAAA,wBAAA;AAAA,MACtB,yBAA2B,EAAA,6BAAA;AAAA,MAC3B,QAAU,EAAA,YAAA;AAAA,MACV,QAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAYO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAA4B,KAAA;AAC1B,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,sBAAA;AAAA,IACR,GAAK,EAAA,kBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,qBAAqB,kBAAmB,CAAA;AAAA,IAC5C,MAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,uBACG,GAAA,CAAA,mBAAA,CAAoB,QAApB,EAAA,EAA6B,OAAO,kBACnC,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,SAAA,EAAW,eAAe,CAAA;AAAA,MAElD;AAAA;AAAA,GAEL,EAAA,CAAA;AAEJ;;;;"}
@@ -1,4 +1,4 @@
1
- var filterPanelCss = ".vuuFilterPanel {\n .vuuFilterPanel-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n}";
1
+ var filterPanelCss = ".vuuFilterPanel {\n display: flex;\n flex-direction: column;\n gap: var(--vuuFilterPanel-gap, var(--salt-spacing-100));\n height: var(--vuuFilterPanel-height, auto);\n padding: var(--vuuFilterPanel-padding, 0);\n\n --vuuFilterContainer-flex: 1 1 auto; \n\n .vuuFilterPanel-toolbar {\n align-items: center;\n display: flex;\n flex: 0 0 var(--salt-size-base);\n padding: var(--salt-spacing-200) 0;\n justify-content: space-between;\n }\n}";
2
2
 
3
3
  export { filterPanelCss as default };
4
4
  //# sourceMappingURL=FilterPanel.css.js.map
@@ -176,9 +176,6 @@ const FilterProvider = ({
176
176
  );
177
177
  const setCurrentFilter = useCallback(
178
178
  (key, filter) => {
179
- console.log(
180
- `[FilterProvider] setCurrentFilter ${JSON.stringify(filter)}`
181
- );
182
179
  const filterDescriptors = savedFilters.get(key) ?? [];
183
180
  if (filter === NULL_FILTER) {
184
181
  const newFilterDescriptors = insertOrReplaceFilter(
@@ -1 +1 @@
1
- {"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextFilterMenuActionHandler,\n NULL_FILTER,\n NullFilterDescriptor,\n UNSAVED_FILTER,\n} from \"./FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\ntype SavedFilterMap = Map<string, FilterContainerFilterDescriptor[]>;\ntype SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;\n\nconst mapToRecord = (savedFilters: SavedFilterMap) => {\n const record: SavedFilterRecord = {};\n savedFilters.forEach((filterDescriptors, key) => {\n record[key] = filterDescriptors;\n });\n return record;\n};\n\nexport interface FilterProviderProps {\n children: ReactNode;\n onFiltersSaved?: (savedFilters: SavedFilterRecord) => void;\n savedFilters?: SavedFilterRecord;\n}\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters: savedFiltersProp,\n}: FilterProviderProps) => {\n const [, forceRefresh] = useState({});\n const savedFilters = useMemo<SavedFilterMap>(\n () =>\n savedFiltersProp ? new Map(Object.entries(savedFiltersProp)) : new Map(),\n [savedFiltersProp],\n );\n\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const deleteFilter = useCallback(\n (key: string, filterId: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] deleteFilter, key ${key} not found`);\n } else {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n savedFilters.set(key, newFilterDescriptors);\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const applyNewName = useCallback(\n (key: string, filterId: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const newFilterDescriptors = renameFilter(\n filterDescriptors,\n filterId,\n name,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const promptForFilterName = useCallback(\n (key: string, { filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(key, id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (\n key: string,\n filterDescriptor: FilterContainerFilterDescriptor,\n columns?: ColumnDescriptor[],\n ) => {\n setDialog(\n <DeleteFilterPrompt\n columns={columns}\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(key, filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction =\n useCallback<FilterContextFilterMenuActionHandler>(\n (key: string, filterId, actionType, columns) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(key, targetFilter, columns);\n }\n break;\n case \"rename\":\n return promptForFilterName(key, targetFilter);\n }\n }\n },\n [promptForConfirmationOfDelete, promptForFilterName, savedFilters],\n );\n\n const handleSaveFilter = useCallback(\n (key: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n const newFilterDescriptors = filterDescriptors.reduce<\n FilterContainerFilterDescriptor[]\n >((list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n }, []);\n savedFilters.set(key, newFilterDescriptors);\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n forceRefresh({});\n },\n [onFiltersSaved, savedFilters],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (key: string, filter: string | FilterContainerFilter) => {\n console.log(\n `[FilterProvider] setCurrentFilter ${JSON.stringify(filter)}`,\n );\n const filterDescriptors = savedFilters.get(key) ?? [];\n\n if (filter === NULL_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n NullFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter === EMPTY_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n EmptyFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (typeof filter === \"string\") {\n const newFilterDescriptors = activateFilter(filterDescriptors, filter);\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter) {\n const newFilterDescriptors = insertOrReplaceFilter(filterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n });\n savedFilters.set(key, newFilterDescriptors);\n } else {\n deleteFilter(key, UNSAVED_FILTER);\n }\n\n forceRefresh({});\n },\n [deleteFilter, savedFilters],\n );\n\n return (\n <FilterContext.Provider\n value={{\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n filterDescriptors: savedFilters,\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FilterProvider.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterProvider.tsx"],"sourcesContent":["import {\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ReactElement, ReactNode, useCallback, useMemo, useState } from \"react\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { DeleteFilterPrompt } from \"../saved-filters/DeleteFilterPrompt\";\nimport {\n activateFilter,\n findFilter,\n insertOrReplaceFilter,\n renameFilter,\n} from \"./filter-descriptor-utils\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport {\n EMPTY_FILTER,\n EmptyFilterDescriptor,\n FilterContext,\n FilterContextFilterMenuActionHandler,\n NULL_FILTER,\n NullFilterDescriptor,\n UNSAVED_FILTER,\n} from \"./FilterContext\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nconst findActiveFilter = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n) => filterDescriptors.find((f) => f.active) ?? NullFilterDescriptor;\n\nconst findFilterByName = (\n filterDescriptors: FilterContainerFilterDescriptor[],\n name: string,\n) => filterDescriptors.find((f) => f.filter?.name === name);\n\ntype SavedFilterMap = Map<string, FilterContainerFilterDescriptor[]>;\ntype SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;\n\nconst mapToRecord = (savedFilters: SavedFilterMap) => {\n const record: SavedFilterRecord = {};\n savedFilters.forEach((filterDescriptors, key) => {\n record[key] = filterDescriptors;\n });\n return record;\n};\n\nexport interface FilterProviderProps {\n children: ReactNode;\n onFiltersSaved?: (savedFilters: SavedFilterRecord) => void;\n savedFilters?: SavedFilterRecord;\n}\n\nexport const FilterProvider = ({\n children,\n onFiltersSaved,\n savedFilters: savedFiltersProp,\n}: FilterProviderProps) => {\n const [, forceRefresh] = useState({});\n const savedFilters = useMemo<SavedFilterMap>(\n () =>\n savedFiltersProp ? new Map(Object.entries(savedFiltersProp)) : new Map(),\n [savedFiltersProp],\n );\n\n const [dialog, setDialog] = useState<ReactElement | null>(null);\n\n const deleteFilter = useCallback(\n (key: string, filterId: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] deleteFilter, key ${key} not found`);\n } else {\n const newFilterDescriptors = filterDescriptors.filter(\n ({ id }) => id !== filterId,\n );\n savedFilters.set(key, newFilterDescriptors);\n if (filterId !== UNSAVED_FILTER) {\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const applyNewName = useCallback(\n (key: string, filterId: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const newFilterDescriptors = renameFilter(\n filterDescriptors,\n filterId,\n name,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n },\n [onFiltersSaved, savedFilters],\n );\n\n const promptForFilterName = useCallback(\n (key: string, { filter, id }: FilterContainerFilterDescriptor) => {\n const originalFilterName = filter?.name ?? \"\";\n setDialog(\n <FilterNamePrompt\n filterName={filter?.name}\n title=\"Rename filter\"\n onClose={() => setDialog(null)}\n onConfirm={(name) => {\n setDialog(null);\n if (originalFilterName !== name) {\n applyNewName(key, id, name);\n }\n }}\n />,\n );\n },\n [applyNewName],\n );\n\n const promptForConfirmationOfDelete = useCallback(\n (\n key: string,\n filterDescriptor: FilterContainerFilterDescriptor,\n columns?: ColumnDescriptor[],\n ) => {\n setDialog(\n <DeleteFilterPrompt\n columns={columns}\n filterDescriptor={filterDescriptor}\n onConfirm={() => {\n setDialog(null);\n deleteFilter(key, filterDescriptor.id);\n }}\n onClose={() => setDialog(null)}\n />,\n );\n },\n [deleteFilter],\n );\n\n const handleFilterMenuAction =\n useCallback<FilterContextFilterMenuActionHandler>(\n (key: string, filterId, actionType, columns) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const targetFilter = findFilter(filterDescriptors, filterId);\n switch (actionType) {\n case \"close\":\n console.log(`close filter ${filterId}`);\n break;\n case \"edit\":\n console.log(`edit filter ${filterId}`);\n break;\n case \"remove\":\n if (filterId === UNSAVED_FILTER) {\n console.log(\"remove unsaved filter\");\n } else {\n promptForConfirmationOfDelete(key, targetFilter, columns);\n }\n break;\n case \"rename\":\n return promptForFilterName(key, targetFilter);\n }\n }\n },\n [promptForConfirmationOfDelete, promptForFilterName, savedFilters],\n );\n\n const handleSaveFilter = useCallback(\n (key: string, name: string) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors === undefined) {\n throw Error(`[FilterProvider] applyNewName, key ${key} not found`);\n } else {\n const activeFilter = findActiveFilter(filterDescriptors);\n if (activeFilter.filter === null) {\n throw Error(\"[FilterProvider] cannot save an empty filter\");\n }\n const filterWithSameName = findFilterByName(filterDescriptors, name);\n // We are always renaming the active filter, how this will play out depends on whether\n // the name is unique and has actually changed\n if (activeFilter === filterWithSameName) {\n // name has not changed\n return;\n } else if (filterWithSameName !== undefined) {\n // we are renaming the active filter, but another filter already has the same name,\n // keep the active filter, remove the duplicate.\n const newFilterDescriptors = filterDescriptors.reduce<\n FilterContainerFilterDescriptor[]\n >((list, filterDescriptor) => {\n if (filterDescriptor === activeFilter) {\n list.push({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor);\n } else if (filterDescriptor.filter?.name !== name) {\n list.push(filterDescriptor);\n }\n return list;\n }, []);\n savedFilters.set(key, newFilterDescriptors);\n } else {\n const newFilterDescriptors = filterDescriptors.map(\n (filterDescriptor) =>\n filterDescriptor === activeFilter\n ? ({\n active: true,\n filter: { ...filterDescriptor.filter, name },\n id: uuid(),\n name,\n } as FilterContainerFilterDescriptor)\n : filterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n onFiltersSaved?.(mapToRecord(savedFilters));\n }\n }\n forceRefresh({});\n },\n [onFiltersSaved, savedFilters],\n );\n\n /**\n * Allows switching between saved filters. Alternatively, an anonymous\n * filter can be assigned. This is to allow for a dynamically created\n * filter to be active.\n */\n const setCurrentFilter = useCallback(\n (key: string, filter: string | FilterContainerFilter) => {\n const filterDescriptors = savedFilters.get(key) ?? [];\n\n if (filter === NULL_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n NullFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter === EMPTY_FILTER) {\n const newFilterDescriptors = insertOrReplaceFilter(\n filterDescriptors,\n EmptyFilterDescriptor,\n );\n savedFilters.set(key, newFilterDescriptors);\n } else if (typeof filter === \"string\") {\n const newFilterDescriptors = activateFilter(filterDescriptors, filter);\n savedFilters.set(key, newFilterDescriptors);\n } else if (filter) {\n const newFilterDescriptors = insertOrReplaceFilter(filterDescriptors, {\n active: true,\n filter,\n id: UNSAVED_FILTER,\n });\n savedFilters.set(key, newFilterDescriptors);\n } else {\n deleteFilter(key, UNSAVED_FILTER);\n }\n\n forceRefresh({});\n },\n [deleteFilter, savedFilters],\n );\n\n return (\n <FilterContext.Provider\n value={{\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n filterDescriptors: savedFilters,\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAyBA,MAAM,gBAAA,GAAmB,CACvB,iBACG,KAAA,iBAAA,CAAkB,KAAK,CAAC,CAAA,KAAM,CAAE,CAAA,MAAM,CAAK,IAAA,oBAAA;AAEhD,MAAM,gBAAA,GAAmB,CACvB,iBAAA,EACA,IACG,KAAA,iBAAA,CAAkB,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,MAAQ,EAAA,IAAA,KAAS,IAAI,CAAA;AAK1D,MAAM,WAAA,GAAc,CAAC,YAAiC,KAAA;AACpD,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,iBAAA,EAAmB,GAAQ,KAAA;AAC/C,IAAA,MAAA,CAAO,GAAG,CAAI,GAAA,iBAAA;AAAA,GACf,CAAA;AACD,EAAO,OAAA,MAAA;AACT,CAAA;AAQO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAc,EAAA;AAChB,CAA2B,KAAA;AACzB,EAAA,MAAM,GAAG,YAAY,CAAI,GAAA,QAAA,CAAS,EAAE,CAAA;AACpC,EAAA,MAAM,YAAe,GAAA,OAAA;AAAA,IACnB,MACE,gBAAmB,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAC,CAAI,mBAAA,IAAI,GAAI,EAAA;AAAA,IACzE,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAA8B,IAAI,CAAA;AAE9D,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,KAAa,QAAqB,KAAA;AACjC,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAA,MAAM,uBAAuB,iBAAkB,CAAA,MAAA;AAAA,UAC7C,CAAC,EAAE,EAAG,EAAA,KAAM,EAAO,KAAA;AAAA,SACrB;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAC1C,QAAA,IAAI,aAAa,cAAgB,EAAA;AAC/B,UAAiB,cAAA,GAAA,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA;AAC5C;AACF,KACF;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,GAAa,EAAA,QAAA,EAAkB,IAAiB,KAAA;AAC/C,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAA,MAAM,oBAAuB,GAAA,YAAA;AAAA,UAC3B,iBAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAC1C,QAAiB,cAAA,GAAA,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA;AAC5C,KACF;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAEA,EAAA,MAAM,mBAAsB,GAAA,WAAA;AAAA,IAC1B,CAAC,GAAA,EAAa,EAAE,MAAA,EAAQ,IAA0C,KAAA;AAChE,MAAM,MAAA,kBAAA,GAAqB,QAAQ,IAAQ,IAAA,EAAA;AAC3C,MAAA,SAAA;AAAA,wBACE,GAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,YAAY,MAAQ,EAAA,IAAA;AAAA,YACpB,KAAM,EAAA,eAAA;AAAA,YACN,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,YAC7B,SAAA,EAAW,CAAC,IAAS,KAAA;AACnB,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAA,IAAI,uBAAuB,IAAM,EAAA;AAC/B,gBAAa,YAAA,CAAA,GAAA,EAAK,IAAI,IAAI,CAAA;AAAA;AAC5B;AACF;AAAA;AACF,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,6BAAgC,GAAA,WAAA;AAAA,IACpC,CACE,GACA,EAAA,gBAAA,EACA,OACG,KAAA;AACH,MAAA,SAAA;AAAA,wBACE,GAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,gBAAA;AAAA,YACA,WAAW,MAAM;AACf,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAa,YAAA,CAAA,GAAA,EAAK,iBAAiB,EAAE,CAAA;AAAA,aACvC;AAAA,YACA,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI;AAAA;AAAA;AAC/B,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,sBACJ,GAAA,WAAA;AAAA,IACE,CAAC,GAAA,EAAa,QAAU,EAAA,UAAA,EAAY,OAAY,KAAA;AAC9C,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAM,MAAA,YAAA,GAAe,UAAW,CAAA,iBAAA,EAAmB,QAAQ,CAAA;AAC3D,QAAA,QAAQ,UAAY;AAAA,UAClB,KAAK,OAAA;AACH,YAAQ,OAAA,CAAA,GAAA,CAAI,CAAgB,aAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACtC,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAQ,OAAA,CAAA,GAAA,CAAI,CAAe,YAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACrC,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,IAAI,aAAa,cAAgB,EAAA;AAC/B,cAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAAA,aAC9B,MAAA;AACL,cAA8B,6BAAA,CAAA,GAAA,EAAK,cAAc,OAAO,CAAA;AAAA;AAE1D,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAO,OAAA,mBAAA,CAAoB,KAAK,YAAY,CAAA;AAAA;AAChD;AACF,KACF;AAAA,IACA,CAAC,6BAA+B,EAAA,mBAAA,EAAqB,YAAY;AAAA,GACnE;AAEF,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,KAAa,IAAiB,KAAA;AAC7B,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAM,MAAA,YAAA,GAAe,iBAAiB,iBAAiB,CAAA;AACvD,QAAI,IAAA,YAAA,CAAa,WAAW,IAAM,EAAA;AAChC,UAAA,MAAM,MAAM,8CAA8C,CAAA;AAAA;AAE5D,QAAM,MAAA,kBAAA,GAAqB,gBAAiB,CAAA,iBAAA,EAAmB,IAAI,CAAA;AAGnE,QAAA,IAAI,iBAAiB,kBAAoB,EAAA;AAEvC,UAAA;AAAA,SACF,MAAA,IAAW,uBAAuB,KAAW,CAAA,EAAA;AAG3C,UAAA,MAAM,oBAAuB,GAAA,iBAAA,CAAkB,MAE7C,CAAA,CAAC,MAAM,gBAAqB,KAAA;AAC5B,YAAA,IAAI,qBAAqB,YAAc,EAAA;AACrC,cAAA,IAAA,CAAK,IAAK,CAAA;AAAA,gBACR,MAAQ,EAAA,IAAA;AAAA,gBACR,MAAQ,EAAA,EAAE,GAAG,gBAAA,CAAiB,QAAQ,IAAK,EAAA;AAAA,gBAC3C,IAAI,IAAK,EAAA;AAAA,gBACT;AAAA,eACkC,CAAA;AAAA,aAC3B,MAAA,IAAA,gBAAA,CAAiB,MAAQ,EAAA,IAAA,KAAS,IAAM,EAAA;AACjD,cAAA,IAAA,CAAK,KAAK,gBAAgB,CAAA;AAAA;AAE5B,YAAO,OAAA,IAAA;AAAA,WACT,EAAG,EAAE,CAAA;AACL,UAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,SACrC,MAAA;AACL,UAAA,MAAM,uBAAuB,iBAAkB,CAAA,GAAA;AAAA,YAC7C,CAAC,gBACC,KAAA,gBAAA,KAAqB,YAChB,GAAA;AAAA,cACC,MAAQ,EAAA,IAAA;AAAA,cACR,MAAQ,EAAA,EAAE,GAAG,gBAAA,CAAiB,QAAQ,IAAK,EAAA;AAAA,cAC3C,IAAI,IAAK,EAAA;AAAA,cACT;AAAA,aAEF,GAAA;AAAA,WACR;AACA,UAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAC1C,UAAiB,cAAA,GAAA,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA;AAC5C;AAEF,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,KACjB;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAOA,EAAA,MAAM,gBAAmB,GAAA,WAAA;AAAA,IACvB,CAAC,KAAa,MAA2C,KAAA;AACvD,MAAA,MAAM,iBAAoB,GAAA,YAAA,CAAa,GAAI,CAAA,GAAG,KAAK,EAAC;AAEpD,MAAA,IAAI,WAAW,WAAa,EAAA;AAC1B,QAAA,MAAM,oBAAuB,GAAA,qBAAA;AAAA,UAC3B,iBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,OAC5C,MAAA,IAAW,WAAW,YAAc,EAAA;AAClC,QAAA,MAAM,oBAAuB,GAAA,qBAAA;AAAA,UAC3B,iBAAA;AAAA,UACA;AAAA,SACF;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,OAC5C,MAAA,IAAW,OAAO,MAAA,KAAW,QAAU,EAAA;AACrC,QAAM,MAAA,oBAAA,GAAuB,cAAe,CAAA,iBAAA,EAAmB,MAAM,CAAA;AACrE,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,iBACjC,MAAQ,EAAA;AACjB,QAAM,MAAA,oBAAA,GAAuB,sBAAsB,iBAAmB,EAAA;AAAA,UACpE,MAAQ,EAAA,IAAA;AAAA,UACR,MAAA;AAAA,UACA,EAAI,EAAA;AAAA,SACL,CAAA;AACD,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,OACrC,MAAA;AACL,QAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAAA;AAGlC,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,KACjB;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,GAC7B;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,aAAc,CAAA,QAAA;AAAA,IAAd;AAAA,MACC,KAAO,EAAA;AAAA,QACL,kBAAoB,EAAA,sBAAA;AAAA,QACpB,YAAA;AAAA,QACA,UAAY,EAAA,gBAAA;AAAA,QACZ,iBAAmB,EAAA,YAAA;AAAA,QACnB;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
package/esm/index.js CHANGED
@@ -19,4 +19,5 @@ export { FilterNamePrompt as SaveFilterConfirmPrompt } from './saved-filters/Fil
19
19
  export { SavedFilterPanel } from './saved-filters/SavedFilterPanel.js';
20
20
  export { TabbedFilterContainer } from './tabbed-filter-container/TabbedFilterContainer.js';
21
21
  export { ToggleFilter } from './toggle-filter/ToggleFilter.js';
22
+ export { FilterPanel } from './filter-panel/FilterPanel.js';
22
23
  //# sourceMappingURL=index.js.map
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
@@ -24,7 +24,6 @@ const TabbedFilterContainer = ({
24
24
  css: tabbedFilterContainerCss,
25
25
  window: targetWindow
26
26
  });
27
- console.log(`[TabbedFilterContainer] render`);
28
27
  return /* @__PURE__ */ jsx("div", { ...htmlAttributes, className: cx(classBase, className), children: /* @__PURE__ */ jsxs(TabsNext, { defaultValue: "ad-hoc-filter", children: [
29
28
  /* @__PURE__ */ jsxs(TabListNext, { appearance: "transparent", children: [
30
29
  /* @__PURE__ */ jsx(TabNext, { value: "ad-hoc-filter", children: /* @__PURE__ */ jsx(TabNextTrigger, { children: "AD HOC" }) }, "ad-hoc-filter"),
@@ -1 +1 @@
1
- {"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"filterProviderKey\" | \"onFilterApplied\" | \"onFilterCleared\"\n > {\n SavedFilterPanelProps?: Pick<\n SavedFilterPanelProps,\n \"availableColumns\" | \"filterPillPermissions\"\n >;\n children: ReactNode;\n}\n\nexport const TabbedFilterContainer = ({\n SavedFilterPanelProps,\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: TabbedFilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-tabbed-filter-container\",\n css: tabbedFilterContainerCss,\n window: targetWindow,\n });\n\n console.log(`[TabbedFilterContainer] render`);\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <TabsNext defaultValue=\"ad-hoc-filter\">\n <TabListNext appearance=\"transparent\">\n <TabNext value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <TabNextTrigger>AD HOC</TabNextTrigger>\n </TabNext>\n <TabNext value=\"saved-filters\" key=\"saved-filters\">\n <TabNextTrigger>SAVED</TabNextTrigger>\n </TabNext>\n </TabListNext>\n <TabNextPanel value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <FilterPanel\n filter={filter}\n filterProviderKey={filterProviderKey}\n onFilterApplied={onFilterApplied}\n onFilterCleared={onFilterCleared}\n >\n {children}\n </FilterPanel>\n </TabNextPanel>\n <TabNextPanel value=\"saved-filters\" key=\"saved-filters\">\n <SavedFilterPanel\n {...SavedFilterPanelProps}\n filterProviderKey={filterProviderKey}\n />\n </TabNextPanel>\n </TabsNext>\n </div>\n );\n};\n"],"names":["SavedFilterPanelProps"],"mappings":";;;;;;;;;AAmBA,MAAM,SAAY,GAAA,0BAAA;AAeX,MAAM,wBAAwB,CAAC;AAAA,EACpC,qBAAAA,EAAAA,sBAAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,6BAAA;AAAA,IACR,GAAK,EAAA,wBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,OAAA,CAAQ,IAAI,CAAgC,8BAAA,CAAA,CAAA;AAE5C,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,SAAS,CACzD,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAS,EAAA,EAAA,YAAA,EAAa,eACrB,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,WAAA,EAAA,EAAY,YAAW,aACtB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAQ,KAAM,EAAA,eAAA,EACb,8BAAC,cAAe,EAAA,EAAA,QAAA,EAAA,QAAA,EAAM,KADW,eAEnC,CAAA;AAAA,sBACA,GAAA,CAAC,WAAQ,KAAM,EAAA,eAAA,EACb,8BAAC,cAAe,EAAA,EAAA,QAAA,EAAA,OAAA,EAAK,KADY,eAEnC;AAAA,KACF,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QAEC;AAAA;AAAA,SAPmC,eASxC,CAAA;AAAA,oBACA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACE,GAAGA,sBAAAA;AAAA,QACJ;AAAA;AAAA,SAHoC,eAKxC;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TabbedFilterContainer.js","sources":["../../../../packages/vuu-filters/src/tabbed-filter-container/TabbedFilterContainer.tsx"],"sourcesContent":["import {\n TabListNext,\n TabNext,\n TabNextPanel,\n TabNextTrigger,\n TabsNext,\n} from \"@salt-ds/lab\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport { FilterPanel } from \"../filter-panel/FilterPanel\";\nimport {\n SavedFilterPanel,\n SavedFilterPanelProps,\n} from \"../saved-filters/SavedFilterPanel\";\nimport tabbedFilterContainerCss from \"./TabbedFilterContainer.css\";\n\nconst classBase = \"vuuTabbedFilterContainer\";\n\nexport interface TabbedFilterContainerProps\n extends HTMLAttributes<HTMLDivElement>,\n Pick<\n FilterContainerProps,\n \"filter\" | \"filterProviderKey\" | \"onFilterApplied\" | \"onFilterCleared\"\n > {\n SavedFilterPanelProps?: Pick<\n SavedFilterPanelProps,\n \"availableColumns\" | \"filterPillPermissions\"\n >;\n children: ReactNode;\n}\n\nexport const TabbedFilterContainer = ({\n SavedFilterPanelProps,\n children,\n className,\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n ...htmlAttributes\n}: TabbedFilterContainerProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-tabbed-filter-container\",\n css: tabbedFilterContainerCss,\n window: targetWindow,\n });\n\n return (\n <div {...htmlAttributes} className={cx(classBase, className)}>\n <TabsNext defaultValue=\"ad-hoc-filter\">\n <TabListNext appearance=\"transparent\">\n <TabNext value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <TabNextTrigger>AD HOC</TabNextTrigger>\n </TabNext>\n <TabNext value=\"saved-filters\" key=\"saved-filters\">\n <TabNextTrigger>SAVED</TabNextTrigger>\n </TabNext>\n </TabListNext>\n <TabNextPanel value=\"ad-hoc-filter\" key=\"ad-hoc-filter\">\n <FilterPanel\n filter={filter}\n filterProviderKey={filterProviderKey}\n onFilterApplied={onFilterApplied}\n onFilterCleared={onFilterCleared}\n >\n {children}\n </FilterPanel>\n </TabNextPanel>\n <TabNextPanel value=\"saved-filters\" key=\"saved-filters\">\n <SavedFilterPanel\n {...SavedFilterPanelProps}\n filterProviderKey={filterProviderKey}\n />\n </TabNextPanel>\n </TabsNext>\n </div>\n );\n};\n"],"names":["SavedFilterPanelProps"],"mappings":";;;;;;;;;AAmBA,MAAM,SAAY,GAAA,0BAAA;AAeX,MAAM,wBAAwB,CAAC;AAAA,EACpC,qBAAAA,EAAAA,sBAAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAAkC,KAAA;AAChC,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,6BAAA;AAAA,IACR,GAAK,EAAA,wBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,uBACG,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,cAAA,EAAgB,SAAW,EAAA,EAAA,CAAG,SAAW,EAAA,SAAS,CACzD,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAS,EAAA,EAAA,YAAA,EAAa,eACrB,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,WAAA,EAAA,EAAY,YAAW,aACtB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,WAAQ,KAAM,EAAA,eAAA,EACb,8BAAC,cAAe,EAAA,EAAA,QAAA,EAAA,QAAA,EAAM,KADW,eAEnC,CAAA;AAAA,sBACA,GAAA,CAAC,WAAQ,KAAM,EAAA,eAAA,EACb,8BAAC,cAAe,EAAA,EAAA,QAAA,EAAA,OAAA,EAAK,KADY,eAEnC;AAAA,KACF,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,eAAA;AAAA,QACA,eAAA;AAAA,QAEC;AAAA;AAAA,SAPmC,eASxC,CAAA;AAAA,oBACA,GAAA,CAAC,YAAa,EAAA,EAAA,KAAA,EAAM,eAClB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACE,GAAGA,sBAAAA;AAAA,QACJ;AAAA;AAAA,SAHoC,eAKxC;AAAA,GAAA,EACF,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,4 @@
1
+ var toggleFilterCss = ".vuuToggleFilter {\n .vuuToggleFilter-onlyAvailableValue:not([aria-checked=\"true\"],:hover) {\n background-color: var(--vuuToggleFilter-implicitActive-bg, var(--salt-actionable-bold-background));\n }\n}\n";
2
+
3
+ export { toggleFilterCss as default };
4
+ //# sourceMappingURL=ToggleFilter.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToggleFilter.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,34 +1,46 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { ToggleButtonGroup, ToggleButton } from '@salt-ds/core';
3
- import { getVuuTable } from '@vuu-ui/vuu-utils';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
4
5
  import cx from 'clsx';
5
- import { useTypeaheadSuggestions } from '@vuu-ui/vuu-data-react';
6
- import { useState, useMemo, useCallback } from 'react';
6
+ import { forwardRef, useCallback } from 'react';
7
+ import { useToggleFilter } from './useToggleFilter.js';
8
+ import toggleFilterCss from './ToggleFilter.css.js';
7
9
 
10
+ const getValues = (defaultValue, value) => {
11
+ if (defaultValue === void 0 && value === void 0) {
12
+ return ["all"];
13
+ } else if (defaultValue !== void 0 && value !== void 0) {
14
+ throw Error(
15
+ "[ToggleFilter] only one of defaultValue/value must be provided"
16
+ );
17
+ } else if (defaultValue === "") {
18
+ return ["all"];
19
+ } else if (value === "") {
20
+ return [void 0, "all"];
21
+ } else {
22
+ return [defaultValue, value];
23
+ }
24
+ };
8
25
  const classBase = "vuuToggleFilter";
9
- const ToggleFilter = ({
26
+ const ToggleFilter = forwardRef(function ToggleFilter2({
10
27
  className,
11
28
  column,
29
+ defaultValue: defaultValueProp,
12
30
  onCommit,
13
31
  table,
14
32
  value: valueProp,
15
33
  values,
16
34
  ...ToggleButtonGroupProps2
17
- }) => {
18
- const [typeaheadValues, setTypeaheadValues] = useState([]);
19
- const getSuggestions = useTypeaheadSuggestions();
20
- const value = valueProp === "" ? "all" : valueProp;
21
- useMemo(() => {
22
- const vuuTable = getVuuTable(table);
23
- const params = [vuuTable, column];
24
- getSuggestions(params).then((suggestions) => {
25
- if (suggestions === false) {
26
- setTypeaheadValues([]);
27
- } else {
28
- setTypeaheadValues(suggestions);
29
- }
30
- });
31
- }, [column, getSuggestions, table]);
35
+ }, forwardedRef) {
36
+ const targetWindow = useWindow();
37
+ useComponentCssInjection({
38
+ testId: "vuu-toggle-filter",
39
+ css: toggleFilterCss,
40
+ window: targetWindow
41
+ });
42
+ const [defaultValue, value] = getValues(defaultValueProp, valueProp);
43
+ const onlyAvailableValue = useToggleFilter({ column, table, values });
32
44
  const handleChange = useCallback(
33
45
  (e) => {
34
46
  const value2 = e.currentTarget.value;
@@ -45,23 +57,27 @@ const ToggleFilter = ({
45
57
  {
46
58
  ...ToggleButtonGroupProps2,
47
59
  className: cx(classBase, className),
60
+ defaultValue,
48
61
  onChange: handleChange,
62
+ ref: forwardedRef,
49
63
  value,
50
64
  children: [
51
65
  /* @__PURE__ */ jsx(ToggleButton, { value: "all", children: "ALL" }, "all"),
52
- values.map((value2) => /* @__PURE__ */ jsx(
66
+ values.map((toggleValue) => /* @__PURE__ */ jsx(
53
67
  ToggleButton,
54
68
  {
55
- value: value2,
56
- disabled: !typeaheadValues.includes(value2) && value2 === "all",
57
- children: value2
69
+ className: cx({
70
+ [`${classBase}-onlyAvailableValue`]: onlyAvailableValue === toggleValue
71
+ }),
72
+ value: toggleValue,
73
+ children: toggleValue
58
74
  },
59
- value2
75
+ toggleValue
60
76
  ))
61
77
  ]
62
78
  }
63
79
  );
64
- };
80
+ });
65
81
 
66
82
  export { ToggleFilter };
67
83
  //# sourceMappingURL=ToggleFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ToggleFilter.js","sources":["../../../../packages/vuu-filters/src/toggle-filter/ToggleFilter.tsx"],"sourcesContent":["import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { CommitHandler, getVuuTable } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { useTypeaheadSuggestions } from \"@vuu-ui/vuu-data-react\";\nimport { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { SyntheticEvent, useCallback, useMemo, useState } from \"react\";\n\nexport interface ToggleFilterProps extends ToggleButtonGroupProps {\n column: string;\n onCommit: CommitHandler<HTMLElement>;\n table: TableSchemaTable;\n values: string[];\n}\n\nconst classBase = \"vuuToggleFilter\";\n\nexport const ToggleFilter = ({\n className,\n column,\n onCommit,\n table,\n value: valueProp,\n values,\n ...ToggleButtonGroupProps\n}: ToggleFilterProps) => {\n const [typeaheadValues, setTypeaheadValues] = useState<string[]>([]);\n const getSuggestions = useTypeaheadSuggestions();\n\n const value = valueProp === \"\" ? \"all\" : valueProp;\n\n useMemo(() => {\n const vuuTable = getVuuTable(table);\n const params: TypeaheadParams = [vuuTable, column];\n getSuggestions(params).then((suggestions) => {\n if (suggestions === false) {\n // TODO is this right\n setTypeaheadValues([]);\n } else {\n setTypeaheadValues(suggestions);\n }\n });\n }, [column, getSuggestions, table]);\n\n const handleChange = useCallback(\n (e: SyntheticEvent<HTMLButtonElement>) => {\n const value = e.currentTarget.value;\n if (value === \"all\") {\n onCommit(e, \"\");\n } else {\n onCommit(e, value);\n }\n },\n [onCommit],\n );\n\n return (\n <ToggleButtonGroup\n {...ToggleButtonGroupProps}\n className={cx(classBase, className)}\n onChange={handleChange}\n value={value}\n >\n <ToggleButton key=\"all\" value=\"all\">\n ALL\n </ToggleButton>\n {values.map((value) => (\n <ToggleButton\n key={value}\n value={value}\n disabled={!typeaheadValues.includes(value) && value === \"all\"}\n >\n {value}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n};\n"],"names":["ToggleButtonGroupProps","value"],"mappings":";;;;;;;AAmBA,MAAM,SAAY,GAAA,iBAAA;AAEX,MAAM,eAAe,CAAC;AAAA,EAC3B,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,MAAA;AAAA,EACA,GAAGA;AACL,CAAyB,KAAA;AACvB,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACnE,EAAA,MAAM,iBAAiB,uBAAwB,EAAA;AAE/C,EAAM,MAAA,KAAA,GAAQ,SAAc,KAAA,EAAA,GAAK,KAAQ,GAAA,SAAA;AAEzC,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAM,MAAA,QAAA,GAAW,YAAY,KAAK,CAAA;AAClC,IAAM,MAAA,MAAA,GAA0B,CAAC,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,cAAA,CAAe,MAAM,CAAA,CAAE,IAAK,CAAA,CAAC,WAAgB,KAAA;AAC3C,MAAA,IAAI,gBAAgB,KAAO,EAAA;AAEzB,QAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,OAChB,MAAA;AACL,QAAA,kBAAA,CAAmB,WAAW,CAAA;AAAA;AAChC,KACD,CAAA;AAAA,GACA,EAAA,CAAC,MAAQ,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAElC,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,CAAyC,KAAA;AACxC,MAAMC,MAAAA,MAAAA,GAAQ,EAAE,aAAc,CAAA,KAAA;AAC9B,MAAA,IAAIA,WAAU,KAAO,EAAA;AACnB,QAAA,QAAA,CAAS,GAAG,EAAE,CAAA;AAAA,OACT,MAAA;AACL,QAAA,QAAA,CAAS,GAAGA,MAAK,CAAA;AAAA;AACnB,KACF;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACE,GAAGD,uBAAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,QAAU,EAAA,YAAA;AAAA,MACV,KAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAuB,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,QAAA,EAAA,KAAA,EAAA,EAAlB,KAElB,CAAA;AAAA,QACC,MAAA,CAAO,GAAI,CAAA,CAACC,MACX,qBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YAEC,KAAOA,EAAAA,MAAAA;AAAA,YACP,UAAU,CAAC,eAAA,CAAgB,QAASA,CAAAA,MAAK,KAAKA,MAAU,KAAA,KAAA;AAAA,YAEvD,QAAAA,EAAAA;AAAA,WAAA;AAAA,UAJIA;AAAA,SAMR;AAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
1
+ {"version":3,"file":"ToggleFilter.js","sources":["../../../../packages/vuu-filters/src/toggle-filter/ToggleFilter.tsx"],"sourcesContent":["import {\n ToggleButton,\n ToggleButtonGroup,\n ToggleButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { ForwardedRef, forwardRef, SyntheticEvent, useCallback } from \"react\";\nimport { type ToggleFilterHookProps, useToggleFilter } from \"./useToggleFilter\";\n\ntype Value = ToggleButtonGroupProps[\"value\"];\n\nconst getValues = (\n defaultValue: Value | undefined,\n value: Value | undefined,\n) => {\n if (defaultValue === undefined && value === undefined) {\n return [\"all\"];\n } else if (defaultValue !== undefined && value !== undefined) {\n throw Error(\n \"[ToggleFilter] only one of defaultValue/value must be provided\",\n );\n } else if (defaultValue === \"\") {\n return [\"all\"];\n } else if (value === \"\") {\n return [undefined, \"all\"];\n } else {\n return [defaultValue, value];\n }\n};\n\nimport toggleFilterCss from \"./ToggleFilter.css\";\n/**\n * ToggleFilter is designed to work with a FilterProvider and\n * DataSourceProvider. With a DataSourceProvider, values will\n * be validated against available values from datasource.\n * With both FilterProvider and a DataSourceProvider, changes to\n * the currentFilter will also trigger re-evaluation of available\n * values from dataSource.\n * With neither of these Providers available, the ToggleFilter is\n * behaving like a regular ToggleButtonGroup.\n */\nexport interface ToggleFilterProps\n extends ToggleButtonGroupProps,\n ToggleFilterHookProps {\n onCommit: CommitHandler<HTMLElement>;\n}\n\nconst classBase = \"vuuToggleFilter\";\n\nexport const ToggleFilter = forwardRef(function ToggleFilter(\n {\n className,\n column,\n defaultValue: defaultValueProp,\n onCommit,\n table,\n value: valueProp,\n values,\n ...ToggleButtonGroupProps\n }: ToggleFilterProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-toggle-filter\",\n css: toggleFilterCss,\n window: targetWindow,\n });\n\n const [defaultValue, value] = getValues(defaultValueProp, valueProp);\n\n const onlyAvailableValue = useToggleFilter({ column, table, values });\n\n const handleChange = useCallback(\n (e: SyntheticEvent<HTMLButtonElement>) => {\n const value = e.currentTarget.value;\n if (value === \"all\") {\n onCommit(e, \"\");\n } else {\n onCommit(e, value);\n }\n },\n [onCommit],\n );\n\n return (\n <ToggleButtonGroup\n {...ToggleButtonGroupProps}\n className={cx(classBase, className)}\n defaultValue={defaultValue}\n onChange={handleChange}\n ref={forwardedRef}\n value={value}\n >\n <ToggleButton key=\"all\" value=\"all\">\n ALL\n </ToggleButton>\n {values.map((toggleValue) => (\n <ToggleButton\n className={cx({\n [`${classBase}-onlyAvailableValue`]:\n onlyAvailableValue === toggleValue,\n })}\n key={toggleValue}\n value={toggleValue}\n >\n {toggleValue}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n});\n"],"names":["ToggleFilter","ToggleButtonGroupProps","value"],"mappings":";;;;;;;;;AAcA,MAAM,SAAA,GAAY,CAChB,YAAA,EACA,KACG,KAAA;AACH,EAAI,IAAA,YAAA,KAAiB,KAAa,CAAA,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AACrD,IAAA,OAAO,CAAC,KAAK,CAAA;AAAA,GACJ,MAAA,IAAA,YAAA,KAAiB,KAAa,CAAA,IAAA,KAAA,KAAU,KAAW,CAAA,EAAA;AAC5D,IAAM,MAAA,KAAA;AAAA,MACJ;AAAA,KACF;AAAA,GACF,MAAA,IAAW,iBAAiB,EAAI,EAAA;AAC9B,IAAA,OAAO,CAAC,KAAK,CAAA;AAAA,GACf,MAAA,IAAW,UAAU,EAAI,EAAA;AACvB,IAAO,OAAA,CAAC,QAAW,KAAK,CAAA;AAAA,GACnB,MAAA;AACL,IAAO,OAAA,CAAC,cAAc,KAAK,CAAA;AAAA;AAE/B,CAAA;AAmBA,MAAM,SAAY,GAAA,iBAAA;AAEL,MAAA,YAAA,GAAe,UAAW,CAAA,SAASA,aAC9C,CAAA;AAAA,EACE,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAc,EAAA,gBAAA;AAAA,EACd,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,MAAA;AAAA,EACA,GAAGC;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,eAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,CAAC,YAAc,EAAA,KAAK,CAAI,GAAA,SAAA,CAAU,kBAAkB,SAAS,CAAA;AAEnE,EAAA,MAAM,qBAAqB,eAAgB,CAAA,EAAE,MAAQ,EAAA,KAAA,EAAO,QAAQ,CAAA;AAEpE,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,CAAyC,KAAA;AACxC,MAAMC,MAAAA,MAAAA,GAAQ,EAAE,aAAc,CAAA,KAAA;AAC9B,MAAA,IAAIA,WAAU,KAAO,EAAA;AACnB,QAAA,QAAA,CAAS,GAAG,EAAE,CAAA;AAAA,OACT,MAAA;AACL,QAAA,QAAA,CAAS,GAAGA,MAAK,CAAA;AAAA;AACnB,KACF;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACE,GAAGD,uBAAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,YAAA;AAAA,MACA,QAAU,EAAA,YAAA;AAAA,MACV,GAAK,EAAA,YAAA;AAAA,MACL,KAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAuB,EAAA,EAAA,KAAA,EAAM,KAAM,EAAA,QAAA,EAAA,KAAA,EAAA,EAAlB,KAElB,CAAA;AAAA,QACC,MAAA,CAAO,GAAI,CAAA,CAAC,WACX,qBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,WAAW,EAAG,CAAA;AAAA,cACZ,CAAC,CAAA,EAAG,SAAS,CAAA,mBAAA,CAAqB,GAChC,kBAAuB,KAAA;AAAA,aAC1B,CAAA;AAAA,YAED,KAAO,EAAA,WAAA;AAAA,YAEN,QAAA,EAAA;AAAA,WAAA;AAAA,UAHI;AAAA,SAKR;AAAA;AAAA;AAAA,GACH;AAEJ,CAAC;;;;"}
@@ -0,0 +1,65 @@
1
+ import { useSavedFilters } from '../filter-provider/FilterContext.js';
2
+ import { useTypeaheadSuggestions } from '@vuu-ui/vuu-data-react';
3
+ import { useRef, useState, useCallback, useMemo } from 'react';
4
+ import { getVuuTable, filtersAreEqual } from '@vuu-ui/vuu-utils';
5
+
6
+ const assertValid = (values, actualValues) => {
7
+ if (actualValues.some((val) => values.indexOf(val) === -1)) {
8
+ console.warn(`[useToggleFilter] ToggleFilter is configured with values which do not include all values from data source
9
+ [${values.join()}]
10
+ [${actualValues.join()}]`);
11
+ }
12
+ };
13
+ const typeaheadRefreshRequired = (f1, f2) => {
14
+ if (f1 === null && f2 === null) {
15
+ return false;
16
+ } else if (f1 === null || f2 === null) {
17
+ return true;
18
+ } else if (filtersAreEqual(f1, f2)) {
19
+ return false;
20
+ } else {
21
+ return true;
22
+ }
23
+ };
24
+ const useToggleFilter = ({
25
+ column,
26
+ table,
27
+ values
28
+ }) => {
29
+ const { currentFilter } = useSavedFilters();
30
+ const currentFilterRef = useRef(currentFilter.filter);
31
+ const [typeaheadValues, setTypeaheadValues] = useState([]);
32
+ const getSuggestions = useTypeaheadSuggestions();
33
+ const refreshSuggestions = useCallback(
34
+ (table2) => {
35
+ const vuuTable = getVuuTable(table2);
36
+ const params = [vuuTable, column];
37
+ getSuggestions(params).then((suggestions) => {
38
+ if (suggestions === false) {
39
+ setTypeaheadValues([]);
40
+ } else {
41
+ assertValid(values, suggestions);
42
+ setTypeaheadValues(suggestions);
43
+ }
44
+ });
45
+ },
46
+ [column, getSuggestions, values]
47
+ );
48
+ useMemo(() => {
49
+ if (table) {
50
+ refreshSuggestions(table);
51
+ }
52
+ }, [refreshSuggestions, table]);
53
+ useMemo(() => {
54
+ const { current: filter } = currentFilterRef;
55
+ if (table && typeaheadRefreshRequired(filter, currentFilter.filter)) {
56
+ refreshSuggestions(table);
57
+ }
58
+ currentFilterRef.current = currentFilter.filter;
59
+ }, [currentFilter.filter, refreshSuggestions, table]);
60
+ const [firstValue] = typeaheadValues;
61
+ return typeaheadValues.length === 1 ? firstValue : void 0;
62
+ };
63
+
64
+ export { useToggleFilter };
65
+ //# sourceMappingURL=useToggleFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToggleFilter.js","sources":["../../../../packages/vuu-filters/src/toggle-filter/useToggleFilter.ts"],"sourcesContent":["import { useSavedFilters } from \"../filter-provider/FilterContext\";\nimport { useTypeaheadSuggestions } from \"@vuu-ui/vuu-data-react\";\nimport type { TypeaheadParams } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { filtersAreEqual, getVuuTable } from \"@vuu-ui/vuu-utils\";\nimport type { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\n\nconst assertValid = (values: string[], actualValues: string[]) => {\n if (actualValues.some((val) => values.indexOf(val) === -1)) {\n console.warn(`[useToggleFilter] ToggleFilter is configured with values which do not include all values from data source\n [${values.join()}]\n [${actualValues.join()}]`);\n }\n};\n\nexport interface ToggleFilterHookProps {\n column: string;\n /**\n * table must be provided to enable validation\n * of values using server data.\n */\n table?: TableSchemaTable;\n values: string[];\n}\n\nconst typeaheadRefreshRequired = (\n f1: FilterContainerFilter | null,\n f2: FilterContainerFilter | null,\n) => {\n if (f1 === null && f2 === null) {\n return false;\n } else if (f1 === null || f2 === null) {\n return true;\n } else if (filtersAreEqual(f1, f2)) {\n return false;\n } else {\n return true;\n }\n};\n\nexport const useToggleFilter = ({\n column,\n table,\n values,\n}: ToggleFilterHookProps) => {\n const { currentFilter } = useSavedFilters();\n const currentFilterRef = useRef(currentFilter.filter);\n const [typeaheadValues, setTypeaheadValues] = useState<string[]>([]);\n const getSuggestions = useTypeaheadSuggestions();\n\n const refreshSuggestions = useCallback(\n (table: TableSchemaTable) => {\n const vuuTable = getVuuTable(table);\n const params: TypeaheadParams = [vuuTable, column];\n getSuggestions(params).then((suggestions) => {\n if (suggestions === false) {\n setTypeaheadValues([]);\n } else {\n assertValid(values, suggestions);\n setTypeaheadValues(suggestions);\n }\n });\n },\n [column, getSuggestions, values],\n );\n\n useMemo(() => {\n if (table) {\n refreshSuggestions(table);\n }\n }, [refreshSuggestions, table]);\n\n // Changes to currentFilter may affect the suggestions we receive\n // if it has changed and been applied to dataSource. If there is no FilterProvider\n // it will never change, so won't matter.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useMemo(() => {\n const { current: filter } = currentFilterRef;\n if (table && typeaheadRefreshRequired(filter, currentFilter.filter)) {\n refreshSuggestions(table);\n }\n currentFilterRef.current = currentFilter.filter;\n }, [currentFilter.filter, refreshSuggestions, table]);\n\n const [firstValue] = typeaheadValues;\n\n // onlyAvailableValue\n return typeaheadValues.length === 1 ? firstValue : undefined;\n};\n"],"names":["table"],"mappings":";;;;;AAQA,MAAM,WAAA,GAAc,CAAC,MAAA,EAAkB,YAA2B,KAAA;AAChE,EAAI,IAAA,YAAA,CAAa,KAAK,CAAC,GAAA,KAAQ,OAAO,OAAQ,CAAA,GAAG,CAAM,KAAA,CAAA,CAAE,CAAG,EAAA;AAC1D,IAAA,OAAA,CAAQ,IAAK,CAAA,CAAA;AAAA,aACF,EAAA,MAAA,CAAO,MAAM,CAAA;AAAA,aACb,EAAA,YAAA,CAAa,IAAK,EAAC,CAAG,CAAA,CAAA,CAAA;AAAA;AAErC,CAAA;AAYA,MAAM,wBAAA,GAA2B,CAC/B,EAAA,EACA,EACG,KAAA;AACH,EAAI,IAAA,EAAA,KAAO,IAAQ,IAAA,EAAA,KAAO,IAAM,EAAA;AAC9B,IAAO,OAAA,KAAA;AAAA,GACE,MAAA,IAAA,EAAA,KAAO,IAAQ,IAAA,EAAA,KAAO,IAAM,EAAA;AACrC,IAAO,OAAA,IAAA;AAAA,GACE,MAAA,IAAA,eAAA,CAAgB,EAAI,EAAA,EAAE,CAAG,EAAA;AAClC,IAAO,OAAA,KAAA;AAAA,GACF,MAAA;AACL,IAAO,OAAA,IAAA;AAAA;AAEX,CAAA;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,MAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAA6B,KAAA;AAC3B,EAAM,MAAA,EAAE,aAAc,EAAA,GAAI,eAAgB,EAAA;AAC1C,EAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,aAAA,CAAc,MAAM,CAAA;AACpD,EAAA,MAAM,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA,CAAmB,EAAE,CAAA;AACnE,EAAA,MAAM,iBAAiB,uBAAwB,EAAA;AAE/C,EAAA,MAAM,kBAAqB,GAAA,WAAA;AAAA,IACzB,CAACA,MAA4B,KAAA;AAC3B,MAAM,MAAA,QAAA,GAAW,YAAYA,MAAK,CAAA;AAClC,MAAM,MAAA,MAAA,GAA0B,CAAC,QAAA,EAAU,MAAM,CAAA;AACjD,MAAA,cAAA,CAAe,MAAM,CAAA,CAAE,IAAK,CAAA,CAAC,WAAgB,KAAA;AAC3C,QAAA,IAAI,gBAAgB,KAAO,EAAA;AACzB,UAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,SAChB,MAAA;AACL,UAAA,WAAA,CAAY,QAAQ,WAAW,CAAA;AAC/B,UAAA,kBAAA,CAAmB,WAAW,CAAA;AAAA;AAChC,OACD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,MAAQ,EAAA,cAAA,EAAgB,MAAM;AAAA,GACjC;AAEA,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA;AAC1B,GACC,EAAA,CAAC,kBAAoB,EAAA,KAAK,CAAC,CAAA;AAM9B,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAM,MAAA,EAAE,OAAS,EAAA,MAAA,EAAW,GAAA,gBAAA;AAC5B,IAAA,IAAI,KAAS,IAAA,wBAAA,CAAyB,MAAQ,EAAA,aAAA,CAAc,MAAM,CAAG,EAAA;AACnE,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA;AAE1B,IAAA,gBAAA,CAAiB,UAAU,aAAc,CAAA,MAAA;AAAA,KACxC,CAAC,aAAA,CAAc,MAAQ,EAAA,kBAAA,EAAoB,KAAK,CAAC,CAAA;AAEpD,EAAM,MAAA,CAAC,UAAU,CAAI,GAAA,eAAA;AAGrB,EAAO,OAAA,eAAA,CAAgB,MAAW,KAAA,CAAA,GAAI,UAAa,GAAA,KAAA,CAAA;AACrD;;;;"}
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
- "version": "0.13.59",
2
+ "version": "0.13.60",
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.59",
8
- "@vuu-ui/vuu-protocol-types": "0.13.59",
9
- "@vuu-ui/vuu-table-types": "0.13.59",
10
- "@vuu-ui/vuu-filter-types": "0.13.59"
7
+ "@vuu-ui/vuu-data-types": "0.13.60",
8
+ "@vuu-ui/vuu-protocol-types": "0.13.60",
9
+ "@vuu-ui/vuu-table-types": "0.13.60",
10
+ "@vuu-ui/vuu-filter-types": "0.13.60"
11
11
  },
12
12
  "dependencies": {
13
- "@vuu-ui/vuu-data-react": "0.13.59",
14
- "@vuu-ui/vuu-filter-parser": "0.13.59",
15
- "@vuu-ui/vuu-popups": "0.13.59",
16
- "@vuu-ui/vuu-ui-controls": "0.13.59",
17
- "@vuu-ui/vuu-table": "0.13.59",
18
- "@vuu-ui/vuu-utils": "0.13.59",
13
+ "@vuu-ui/vuu-data-react": "0.13.60",
14
+ "@vuu-ui/vuu-filter-parser": "0.13.60",
15
+ "@vuu-ui/vuu-popups": "0.13.60",
16
+ "@vuu-ui/vuu-ui-controls": "0.13.60",
17
+ "@vuu-ui/vuu-table": "0.13.60",
18
+ "@vuu-ui/vuu-utils": "0.13.60",
19
19
  "@salt-ds/core": "1.48.0",
20
20
  "@salt-ds/lab": "1.0.0-alpha.76",
21
21
  "@salt-ds/styles": "0.2.1",
@@ -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, ...props }: FilterContainerColumnFilterProps) => import("react/jsx-runtime").JSX.Element;
12
+ export declare const FilterContainerColumnFilter: ({ column, operator, 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
package/types/index.d.ts CHANGED
@@ -19,3 +19,4 @@ export { SavedFilterPanel, type SavedFilterPanelProps, } from "./saved-filters/S
19
19
  export type { FilterClickHandler } from "./saved-filters/useSavedFilterPanel";
20
20
  export { TabbedFilterContainer, type TabbedFilterContainerProps, } from "./tabbed-filter-container/TabbedFilterContainer";
21
21
  export { ToggleFilter, type ToggleFilterProps, } from "./toggle-filter/ToggleFilter";
22
+ export { FilterPanel } from "./filter-panel/FilterPanel";
@@ -1,10 +1,17 @@
1
1
  import { ToggleButtonGroupProps } from "@salt-ds/core";
2
- import { TableSchemaTable } from "@vuu-ui/vuu-data-types";
3
2
  import { CommitHandler } from "@vuu-ui/vuu-utils";
4
- export interface ToggleFilterProps extends ToggleButtonGroupProps {
5
- column: string;
3
+ import { type ToggleFilterHookProps } from "./useToggleFilter";
4
+ /**
5
+ * ToggleFilter is designed to work with a FilterProvider and
6
+ * DataSourceProvider. With a DataSourceProvider, values will
7
+ * be validated against available values from datasource.
8
+ * With both FilterProvider and a DataSourceProvider, changes to
9
+ * the currentFilter will also trigger re-evaluation of available
10
+ * values from dataSource.
11
+ * With neither of these Providers available, the ToggleFilter is
12
+ * behaving like a regular ToggleButtonGroup.
13
+ */
14
+ export interface ToggleFilterProps extends ToggleButtonGroupProps, ToggleFilterHookProps {
6
15
  onCommit: CommitHandler<HTMLElement>;
7
- table: TableSchemaTable;
8
- values: string[];
9
16
  }
10
- export declare const ToggleFilter: ({ className, column, onCommit, table, value: valueProp, values, ...ToggleButtonGroupProps }: ToggleFilterProps) => import("react/jsx-runtime").JSX.Element;
17
+ export declare const ToggleFilter: import("react").ForwardRefExoticComponent<ToggleFilterProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,11 @@
1
+ import type { TableSchemaTable } from "@vuu-ui/vuu-data-types";
2
+ export interface ToggleFilterHookProps {
3
+ column: string;
4
+ /**
5
+ * table must be provided to enable validation
6
+ * of values using server data.
7
+ */
8
+ table?: TableSchemaTable;
9
+ values: string[];
10
+ }
11
+ export declare const useToggleFilter: ({ column, table, values, }: ToggleFilterHookProps) => string | undefined;