@vuu-ui/vuu-filters 0.13.79 → 0.13.80

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 (33) hide show
  1. package/cjs/FilterAggregator.js +13 -0
  2. package/cjs/FilterAggregator.js.map +1 -1
  3. package/cjs/filter-container/FilterContainer.js +5 -4
  4. package/cjs/filter-container/FilterContainer.js.map +1 -1
  5. package/cjs/filter-context-menu/useFilterContextMenu.js +134 -0
  6. package/cjs/filter-context-menu/useFilterContextMenu.js.map +1 -0
  7. package/cjs/filter-panel/useFilterPanel.js +3 -0
  8. package/cjs/filter-panel/useFilterPanel.js.map +1 -1
  9. package/cjs/filter-provider/FilterContext.js +10 -0
  10. package/cjs/filter-provider/FilterContext.js.map +1 -1
  11. package/cjs/filter-provider/FilterProvider.js +7 -0
  12. package/cjs/filter-provider/FilterProvider.js.map +1 -1
  13. package/cjs/index.js +3 -0
  14. package/cjs/index.js.map +1 -1
  15. package/esm/FilterAggregator.js +13 -0
  16. package/esm/FilterAggregator.js.map +1 -1
  17. package/esm/filter-container/FilterContainer.js +6 -5
  18. package/esm/filter-container/FilterContainer.js.map +1 -1
  19. package/esm/filter-context-menu/useFilterContextMenu.js +132 -0
  20. package/esm/filter-context-menu/useFilterContextMenu.js.map +1 -0
  21. package/esm/filter-panel/useFilterPanel.js +3 -0
  22. package/esm/filter-panel/useFilterPanel.js.map +1 -1
  23. package/esm/filter-provider/FilterContext.js +10 -0
  24. package/esm/filter-provider/FilterContext.js.map +1 -1
  25. package/esm/filter-provider/FilterProvider.js +7 -0
  26. package/esm/filter-provider/FilterProvider.js.map +1 -1
  27. package/esm/index.js +2 -1
  28. package/esm/index.js.map +1 -1
  29. package/package.json +12 -11
  30. package/types/FilterAggregator.d.ts +6 -0
  31. package/types/filter-context-menu/useFilterContextMenu.d.ts +5 -0
  32. package/types/filter-provider/FilterContext.d.ts +2 -0
  33. package/types/index.d.ts +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FilterAggregator.js","sources":["../../../packages/vuu-filters/src/FilterAggregator.ts"],"sourcesContent":["import {\n ColumnFilterValue,\n ExtendedFilterOptions,\n FilterClauseOp,\n FilterContainerFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n getTypedRange,\n getTypedValue,\n isAndFilter,\n isBetweenFilter,\n isExtendedFilter,\n isMultiClauseFilter,\n isSingleValueFilter,\n isTypeDescriptor,\n} from \"@vuu-ui/vuu-utils\";\nimport { ExtendedSingleValueFilterClause } from \"./filter-container/ExtendedSingleValueFilterClause\";\n\nfunction installExtendedFilters<\n F extends FilterContainerFilter = FilterContainerFilter,\n>(filter: F, throwIfUndefined: true): F;\nfunction installExtendedFilters<\n F extends FilterContainerFilter = FilterContainerFilter,\n>(filter: F | undefined, throwIfUndefined?: false): F | undefined;\n\nfunction installExtendedFilters(\n filter: FilterContainerFilter | undefined,\n throwIfUndefined = false,\n): FilterContainerFilter | undefined {\n if (filter !== undefined) {\n if (isExtendedFilter(filter)) {\n const { column, op, value, extendedOptions } = filter;\n return new ExtendedSingleValueFilterClause(\n column,\n op,\n value,\n extendedOptions,\n );\n } else if (isMultiClauseFilter(filter)) {\n if (filter.filters.some(isExtendedFilter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => installExtendedFilters(f, true)),\n };\n } else {\n return filter;\n }\n } else {\n return filter;\n }\n }\n if (throwIfUndefined) {\n throw Error(\"filter is undefined\");\n }\n}\n\n/**\n * Manages a filter that can be updated one clause at a time.\n * Works with FilterContainer to aggregate multiple filter\n * clauses edited via individual controls. It is just a wrapper\n * around a Map, does not support switching filters - create a\n * new FilterAggregator for a new filter.\n *\n */\nexport class FilterAggregator {\n #filters = new Map<string, FilterContainerFilter>();\n\n constructor(filter?: FilterContainerFilter) {\n const runtimeFilter = installExtendedFilters(filter);\n if (isSingleValueFilter(runtimeFilter)) {\n this.#filters.set(runtimeFilter.column, runtimeFilter);\n } else if (isBetweenFilter(runtimeFilter)) {\n this.#filters.set(runtimeFilter.filters[0].column, runtimeFilter);\n } else if (isAndFilter(runtimeFilter)) {\n runtimeFilter.filters.forEach((f) => {\n if (isBetweenFilter(f)) {\n this.#filters.set(f.filters[0].column, f);\n } else {\n this.#filters.set(f.column, f);\n }\n });\n }\n }\n\n add(\n column: ColumnDescriptor,\n value: ColumnFilterValue,\n op: FilterClauseOp | \"between\" | \"between-inclusive\",\n extendedFilterOptions?: ExtendedFilterOptions,\n ) {\n const { serverDataType = \"string\", type } = column;\n const isInclusive = op === \"between-inclusive\";\n const dataType = isTypeDescriptor(type)\n ? type.name\n : (type ?? serverDataType);\n if (Array.isArray(value)) {\n const [value1, value2] = getTypedRange(\n value,\n dataType,\n extendedFilterOptions,\n );\n if (value1 !== undefined && value2 !== undefined) {\n const filter: FilterContainerFilter = extendedFilterOptions\n ? {\n op: \"and\",\n filters: [\n new ExtendedSingleValueFilterClause(\n column.name,\n isInclusive ? \">=\" : \">\",\n value1,\n extendedFilterOptions,\n ),\n new ExtendedSingleValueFilterClause(\n column.name,\n isInclusive ? \"<=\" : \"<\",\n value2,\n extendedFilterOptions,\n ),\n ],\n }\n : {\n op: \"and\",\n filters: [\n { column: column.name, op: \">\", value: value1 },\n { column: column.name, op: \"<\", value: value2 },\n ],\n };\n\n this.#filters.set(column.name, filter);\n } else if (value1 !== undefined) {\n this.#filters.set(column.name, {\n column: column.name,\n op: \"=\",\n value: value1,\n });\n } else if (value2 !== undefined) {\n this.#filters.set(column.name, {\n column: column.name,\n op: \"<\",\n value: value2,\n });\n }\n } else {\n const typedValue = getTypedValue(value.toString(), dataType, true);\n\n this.#filters.set(column.name, {\n column: column.name,\n op: \"=\",\n value: typedValue,\n });\n }\n }\n\n has({ name }: ColumnDescriptor) {\n return this.#filters.has(name);\n }\n\n get({ name }: ColumnDescriptor) {\n return this.#filters.get(name);\n }\n\n /**\n * Remove filter for this column. Return false if no filter found, otw true\n */\n remove(column: ColumnDescriptor) {\n if (this.#filters.has(column.name)) {\n this.#filters.delete(column.name);\n return true;\n } else {\n return false;\n }\n }\n\n get filter(): FilterContainerFilter | undefined {\n const { size } = this.#filters;\n if (size === 0) {\n return undefined;\n } else if (size === 1) {\n const [filter] = this.#filters.values();\n return filter;\n } else {\n return {\n op: \"and\",\n filters: Array.from(this.#filters.values()),\n } as FilterContainerFilter;\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FilterAggregator.js","sources":["../../../packages/vuu-filters/src/FilterAggregator.ts"],"sourcesContent":["import {\n ColumnFilterValue,\n ExtendedFilterOptions,\n FilterClauseOp,\n FilterContainerFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n getTypedRange,\n getTypedValue,\n isAndFilter,\n isBetweenFilter,\n isExtendedFilter,\n isMultiClauseFilter,\n isSingleValueFilter,\n isTypeDescriptor,\n} from \"@vuu-ui/vuu-utils\";\nimport { ExtendedSingleValueFilterClause } from \"./filter-container/ExtendedSingleValueFilterClause\";\n\nfunction installExtendedFilters<\n F extends FilterContainerFilter = FilterContainerFilter,\n>(filter: F, throwIfUndefined: true): F;\nfunction installExtendedFilters<\n F extends FilterContainerFilter = FilterContainerFilter,\n>(filter: F | undefined, throwIfUndefined?: false): F | undefined;\n\nfunction installExtendedFilters(\n filter: FilterContainerFilter | undefined,\n throwIfUndefined = false,\n): FilterContainerFilter | undefined {\n if (filter !== undefined) {\n if (isExtendedFilter(filter)) {\n const { column, op, value, extendedOptions } = filter;\n return new ExtendedSingleValueFilterClause(\n column,\n op,\n value,\n extendedOptions,\n );\n } else if (isMultiClauseFilter(filter)) {\n if (filter.filters.some(isExtendedFilter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => installExtendedFilters(f, true)),\n };\n } else {\n return filter;\n }\n } else {\n return filter;\n }\n }\n if (throwIfUndefined) {\n throw Error(\"filter is undefined\");\n }\n}\n\n/**\n * Manages a filter that can be updated one clause at a time.\n * Works with FilterContainer to aggregate multiple filter\n * clauses edited via individual controls. It is just a wrapper\n * around a Map, does not support switching filters - create a\n * new FilterAggregator for a new filter.\n *\n */\nexport class FilterAggregator {\n #filters = new Map<string, FilterContainerFilter>();\n\n constructor(filter?: FilterContainerFilter) {\n console.log(`[FilterAggregator] ${JSON.stringify(filter)}`);\n const runtimeFilter = installExtendedFilters(filter);\n if (isSingleValueFilter(runtimeFilter)) {\n this.#filters.set(runtimeFilter.column, runtimeFilter);\n } else if (isBetweenFilter(runtimeFilter)) {\n this.#filters.set(runtimeFilter.filters[0].column, runtimeFilter);\n } else if (isAndFilter(runtimeFilter)) {\n runtimeFilter.filters.forEach((f) => {\n if (isBetweenFilter(f)) {\n this.#filters.set(f.filters[0].column, f);\n } else {\n this.#filters.set(f.column, f);\n }\n });\n }\n }\n\n add(\n column: ColumnDescriptor,\n value: ColumnFilterValue,\n op: FilterClauseOp | \"between\" | \"between-inclusive\",\n extendedFilterOptions?: ExtendedFilterOptions,\n ) {\n const { serverDataType = \"string\", type } = column;\n const isInclusive = op === \"between-inclusive\";\n const dataType = isTypeDescriptor(type)\n ? type.name\n : (type ?? serverDataType);\n if (Array.isArray(value)) {\n const [value1, value2] = getTypedRange(\n value,\n dataType,\n extendedFilterOptions,\n );\n if (value1 !== undefined && value2 !== undefined) {\n const filter: FilterContainerFilter = extendedFilterOptions\n ? {\n op: \"and\",\n filters: [\n new ExtendedSingleValueFilterClause(\n column.name,\n isInclusive ? \">=\" : \">\",\n value1,\n extendedFilterOptions,\n ),\n new ExtendedSingleValueFilterClause(\n column.name,\n isInclusive ? \"<=\" : \"<\",\n value2,\n extendedFilterOptions,\n ),\n ],\n }\n : {\n op: \"and\",\n filters: [\n { column: column.name, op: \">\", value: value1 },\n { column: column.name, op: \"<\", value: value2 },\n ],\n };\n\n this.#filters.set(column.name, filter);\n } else if (value1 !== undefined) {\n this.#filters.set(column.name, {\n column: column.name,\n op: \"=\",\n value: value1,\n });\n } else if (value2 !== undefined) {\n this.#filters.set(column.name, {\n column: column.name,\n op: \"<\",\n value: value2,\n });\n }\n } else {\n const typedValue = getTypedValue(value.toString(), dataType, true);\n\n this.#filters.set(column.name, {\n column: column.name,\n op: \"=\",\n value: typedValue,\n });\n }\n }\n\n has({ name }: ColumnDescriptor) {\n return this.#filters.has(name);\n }\n\n get({ name }: ColumnDescriptor) {\n return this.#filters.get(name);\n }\n\n clear() {\n this.#filters.clear();\n }\n\n /**\n * Remove filter for this column. Return false if no filter found, otw true\n */\n remove(column: ColumnDescriptor) {\n if (this.#filters.has(column.name)) {\n this.#filters.delete(column.name);\n return true;\n } else {\n return false;\n }\n }\n\n get isEmpty() {\n return this.#filters.size === 0;\n }\n\n /**\n * Count of the number of columns for which filters are stored\n */\n get count() {\n return this.#filters.size;\n }\n\n get filter(): FilterContainerFilter | undefined {\n const { size } = this.#filters;\n if (size === 0) {\n return undefined;\n } else if (size === 1) {\n const [filter] = this.#filters.values();\n return filter;\n } else {\n return {\n op: \"and\",\n filters: Array.from(this.#filters.values()),\n } as FilterContainerFilter;\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import { useMemo, useState, useRef, useCallback } from 'react';
4
4
  import { useFilterContext, useFilterContainer, ColumnFilterContext } from './useFilterContainer.js';
5
5
  import { ColumnFilter } from '../column-filter/ColumnFilter.js';
6
6
  import { useSavedFilters, isNullFilter, filterDescriptorHasFilter } from '../filter-provider/FilterContext.js';
7
- import { getColumnValueFromFilter, isBetweenOperator } from '@vuu-ui/vuu-utils';
7
+ import { filtersAreEqual, getColumnValueFromFilter, isBetweenOperator } from '@vuu-ui/vuu-utils';
8
8
  import { useComponentCssInjection } from '@salt-ds/styles';
9
9
  import { useWindow } from '@salt-ds/window';
10
10
  import filterContainerCss from './FilterContainer.css.js';
@@ -30,10 +30,10 @@ const FilterContainerColumnFilter = ({
30
30
  const [value, setValue] = useState(initialValue);
31
31
  const valueRef = useRef(initialValue);
32
32
  const { currentFilter } = useSavedFilters(filterProviderKey);
33
- const currentFilterRef = useRef(currentFilter.id);
33
+ const currentFilterRef = useRef(currentFilter);
34
34
  useMemo(() => {
35
- if (currentFilterRef.current !== currentFilter.id) {
36
- currentFilterRef.current = currentFilter.id;
35
+ if (currentFilterRef.current.id !== currentFilter.id || !filtersAreEqual(currentFilterRef.current.filter, currentFilter.filter)) {
36
+ currentFilterRef.current = currentFilter;
37
37
  if (isNullFilter(currentFilter) && notEmpty(valueRef.current)) {
38
38
  if (Array.isArray(valueRef.current)) {
39
39
  if (column.type === "time") {
@@ -65,7 +65,7 @@ const FilterContainerColumnFilter = ({
65
65
  }
66
66
  }
67
67
  }
68
- }, [column, currentFilter.id]);
68
+ }, [column, currentFilter]);
69
69
  const handleCommit = useCallback(
70
70
  (column2, op, value2, extendedFilterOptions) => {
71
71
  valueRef.current = value2;
@@ -121,6 +121,7 @@ const FilterContainer = ({
121
121
  css: filterContainerCss,
122
122
  window: targetWindow
123
123
  });
124
+ console.log(`[FilterContainer] current filter ${JSON.stringify(filter)}`);
124
125
  const filterContextProps = useFilterContainer({
125
126
  filter,
126
127
  filterProviderKey,
@@ -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, isBetweenOperator } 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 if (Array.isArray(valueRef.current)) {\n if (column.type === \"time\") {\n valueRef.current = [\"00:00:00\", \"23:59:59\"];\n } else {\n valueRef.current = [\"\", \"\"];\n }\n } else {\n valueRef.current = \"\";\n }\n setValue(valueRef.current);\n } else if (filterDescriptorHasFilter(currentFilter)) {\n const v = getColumnValueFromFilter(\n column,\n operator,\n currentFilter.filter,\n );\n if (\n isBetweenOperator(operator) &&\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, extendedFilterOptions) => {\n valueRef.current = value;\n setValue(value);\n onFilterContextCommit(column, op, value, extendedFilterOptions);\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":"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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 {\n filtersAreEqual,\n getColumnValueFromFilter,\n isBetweenOperator,\n} 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);\n\n useMemo(() => {\n if (\n currentFilterRef.current.id !== currentFilter.id ||\n !filtersAreEqual(currentFilterRef.current.filter, currentFilter.filter)\n ) {\n currentFilterRef.current = currentFilter;\n\n if (isNullFilter(currentFilter) && notEmpty(valueRef.current)) {\n if (Array.isArray(valueRef.current)) {\n if (column.type === \"time\") {\n valueRef.current = [\"00:00:00\", \"23:59:59\"];\n } else {\n valueRef.current = [\"\", \"\"];\n }\n } else {\n valueRef.current = \"\";\n }\n setValue(valueRef.current);\n } else if (filterDescriptorHasFilter(currentFilter)) {\n const v = getColumnValueFromFilter(\n column,\n operator,\n currentFilter.filter,\n );\n if (\n isBetweenOperator(operator) &&\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]);\n\n const handleCommit = useCallback<ColumnFilterCommitHandler>(\n (column, op, value, extendedFilterOptions) => {\n valueRef.current = value;\n setValue(value);\n onFilterContextCommit(column, op, value, extendedFilterOptions);\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 console.log(`[FilterContainer] current filter ${JSON.stringify(filter)}`);\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":"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"}
@@ -0,0 +1,132 @@
1
+ import { filtersAreEqual } from '@vuu-ui/vuu-utils';
2
+ import { useRef, useMemo, useCallback } from 'react';
3
+ import { useSavedFilters } from '../filter-provider/FilterContext.js';
4
+ import { FilterAggregator } from '../FilterAggregator.js';
5
+
6
+ const EmptyAggregator = new FilterAggregator();
7
+ const defaultProps = {
8
+ filterColumns: "*"
9
+ };
10
+ const useFilterContextMenu = ({
11
+ filterColumns = "*"
12
+ } = defaultProps) => {
13
+ const { currentFilter, clearCurrentFilter, setCurrentFilter } = useSavedFilters();
14
+ const filterAggregatorRef = useRef(EmptyAggregator);
15
+ useMemo(() => {
16
+ if (!filtersAreEqual(currentFilter.filter, filterAggregatorRef.current.filter)) {
17
+ filterAggregatorRef.current = currentFilter.filter ? new FilterAggregator(currentFilter.filter) : new FilterAggregator();
18
+ }
19
+ }, [currentFilter]);
20
+ const menuBuilder = useCallback(
21
+ (_location, options) => {
22
+ console.log(`menuBuilder _location ${_location} options `, {
23
+ options
24
+ });
25
+ const { column, columnMap, row } = options;
26
+ const { current: fag } = filterAggregatorRef;
27
+ const { name, label = name } = column;
28
+ const colIdx = columnMap[column.name];
29
+ const value = row[colIdx];
30
+ const ClearFilter = {
31
+ id: "filter-clear",
32
+ label: "Clear filter",
33
+ options
34
+ };
35
+ if (filterColumns === "*" || filterColumns.includes(column.name)) {
36
+ const SetFilter = {
37
+ id: "filter-set",
38
+ label: `Set filter ${label} '${value}'`,
39
+ options
40
+ };
41
+ if (fag.isEmpty) {
42
+ return [SetFilter];
43
+ } else if (fag.has(column)) {
44
+ if (fag.count === 1) {
45
+ return [ClearFilter];
46
+ } else {
47
+ return [
48
+ {
49
+ id: "filter-remove",
50
+ label: `Remove ${label} '${value}' from filter`,
51
+ options
52
+ },
53
+ SetFilter,
54
+ ClearFilter
55
+ ];
56
+ }
57
+ } else {
58
+ return [
59
+ SetFilter,
60
+ {
61
+ id: "filter-add",
62
+ label: `Add ${label} '${value}' to existing filter`,
63
+ options
64
+ },
65
+ ClearFilter
66
+ ];
67
+ }
68
+ } else if (!fag.isEmpty) {
69
+ return [ClearFilter];
70
+ } else {
71
+ return [];
72
+ }
73
+ },
74
+ [filterColumns]
75
+ );
76
+ const menuActionHandler = useCallback(
77
+ (menuItemId, options) => {
78
+ if (options) {
79
+ const { current: fag } = filterAggregatorRef;
80
+ const { column, columnMap, row } = options;
81
+ switch (menuItemId) {
82
+ case "filter-clear":
83
+ {
84
+ clearCurrentFilter();
85
+ }
86
+ break;
87
+ case "filter-add":
88
+ {
89
+ const colIdx = columnMap[column.name];
90
+ const value = row[colIdx];
91
+ fag.add(column, value, "=");
92
+ if (fag.filter) {
93
+ setCurrentFilter(fag.filter);
94
+ }
95
+ }
96
+ break;
97
+ case "filter-remove":
98
+ {
99
+ fag.remove(column);
100
+ if (fag.filter) {
101
+ setCurrentFilter(fag.filter);
102
+ }
103
+ }
104
+ break;
105
+ case "filter-set":
106
+ {
107
+ const colIdx = columnMap[column.name];
108
+ const value = row[colIdx];
109
+ fag.clear();
110
+ fag.add(column, value, "=");
111
+ if (fag.filter) {
112
+ setCurrentFilter(fag.filter);
113
+ }
114
+ }
115
+ break;
116
+ default:
117
+ return false;
118
+ }
119
+ } else {
120
+ return false;
121
+ }
122
+ },
123
+ [clearCurrentFilter, setCurrentFilter]
124
+ );
125
+ return {
126
+ menuActionHandler,
127
+ menuBuilder
128
+ };
129
+ };
130
+
131
+ export { useFilterContextMenu };
132
+ //# sourceMappingURL=useFilterContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFilterContextMenu.js","sources":["../../../../packages/vuu-filters/src/filter-context-menu/useFilterContextMenu.ts"],"sourcesContent":["import {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"@vuu-ui/vuu-context-menu\";\nimport type {\n TableContextMenuDef,\n TableContextMenuOptions,\n TableMenuLocation,\n} from \"@vuu-ui/vuu-table-types\";\nimport { filtersAreEqual } from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { useSavedFilters } from \"../filter-provider/FilterContext\";\nimport { FilterAggregator } from \"../FilterAggregator\";\n\nconst EmptyAggregator = new FilterAggregator();\n\nexport interface FilterContextMenuHookProps {\n filterColumns: string[] | \"*\";\n}\n\nconst defaultProps: FilterContextMenuHookProps = {\n filterColumns: \"*\",\n};\n\nexport const useFilterContextMenu = ({\n filterColumns = \"*\",\n}: FilterContextMenuHookProps = defaultProps): TableContextMenuDef => {\n const { currentFilter, clearCurrentFilter, setCurrentFilter } =\n useSavedFilters();\n const filterAggregatorRef = useRef(EmptyAggregator);\n\n useMemo(() => {\n if (\n !filtersAreEqual(currentFilter.filter, filterAggregatorRef.current.filter)\n ) {\n filterAggregatorRef.current = currentFilter.filter\n ? new FilterAggregator(currentFilter.filter)\n : new FilterAggregator();\n }\n }, [currentFilter]);\n\n const menuBuilder: MenuBuilder<TableMenuLocation, TableContextMenuOptions> =\n useCallback(\n (_location, options) => {\n console.log(`menuBuilder _location ${_location} options `, {\n options,\n });\n const { column, columnMap, row } = options;\n const { current: fag } = filterAggregatorRef;\n const { name, label = name } = column;\n const colIdx = columnMap[column.name];\n const value = row[colIdx] as string | number;\n\n const ClearFilter: ContextMenuItemDescriptor = {\n id: \"filter-clear\",\n label: \"Clear filter\",\n options,\n };\n\n if (filterColumns === \"*\" || filterColumns.includes(column.name)) {\n const SetFilter: ContextMenuItemDescriptor = {\n id: \"filter-set\",\n label: `Set filter ${label} '${value}'`,\n options,\n };\n\n if (fag.isEmpty) {\n return [SetFilter];\n } else if (fag.has(column)) {\n if (fag.count === 1) {\n return [ClearFilter];\n } else {\n return [\n {\n id: \"filter-remove\",\n label: `Remove ${label} '${value}' from filter`,\n options,\n },\n SetFilter,\n ClearFilter,\n ];\n }\n } else {\n return [\n SetFilter,\n {\n id: \"filter-add\",\n label: `Add ${label} '${value}' to existing filter`,\n options,\n },\n ClearFilter,\n ];\n }\n } else if (!fag.isEmpty) {\n return [ClearFilter];\n } else {\n return [];\n }\n },\n [filterColumns],\n );\n\n const menuActionHandler = useCallback<\n MenuActionHandler<string, TableContextMenuOptions>\n >(\n (menuItemId, options) => {\n if (options) {\n const { current: fag } = filterAggregatorRef;\n const { column, columnMap, row } = options;\n switch (menuItemId) {\n case \"filter-clear\":\n {\n clearCurrentFilter();\n }\n break;\n\n case \"filter-add\":\n {\n const colIdx = columnMap[column.name];\n const value = row[colIdx] as string | number;\n fag.add(column, value, \"=\");\n if (fag.filter) {\n setCurrentFilter(fag.filter);\n }\n }\n break;\n case \"filter-remove\":\n {\n fag.remove(column);\n if (fag.filter) {\n setCurrentFilter(fag.filter);\n }\n }\n break;\n case \"filter-set\":\n {\n const colIdx = columnMap[column.name];\n const value = row[colIdx] as string | number;\n fag.clear();\n fag.add(column, value, \"=\");\n if (fag.filter) {\n setCurrentFilter(fag.filter);\n }\n }\n break;\n default:\n return false;\n }\n } else {\n return false;\n }\n },\n [clearCurrentFilter, setCurrentFilter],\n );\n\n return {\n menuActionHandler,\n menuBuilder,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -13,6 +13,9 @@ const useFilterPanel = ({
13
13
  const [saveFilterPrompt, setSaveFilterPrompt] = useState(
14
14
  null
15
15
  );
16
+ console.log(
17
+ `[useFilterPanel] current filter ${JSON.stringify(currentFilter)}`
18
+ );
16
19
  const clearFilter = useCallback(() => {
17
20
  setCurrentFilter(NULL_FILTER);
18
21
  }, [setCurrentFilter]);
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterPanel.js","sources":["../../../../packages/vuu-filters/src/filter-panel/useFilterPanel.tsx"],"sourcesContent":["import { ReactElement, useCallback, useState } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport {\n EMPTY_FILTER,\n NULL_FILTER,\n useSavedFilters,\n} from \"../filter-provider/FilterContext\";\nimport { FilterAppliedHandler } from \"../filter-container/useFilterContainer\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\n\nexport const useFilterPanel = ({\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n}: Pick<\n FilterContainerProps,\n \"filter\" | \"filterProviderKey\" | \"onFilterApplied\" | \"onFilterCleared\"\n>) => {\n const { saveFilter, currentFilter, setCurrentFilter } =\n useSavedFilters(filterProviderKey);\n const [saveFilterPrompt, setSaveFilterPrompt] = useState<ReactElement | null>(\n null,\n );\n\n const clearFilter = useCallback(() => {\n setCurrentFilter(NULL_FILTER);\n }, [setCurrentFilter]);\n\n const handleConfirm = useCallback(\n (name: string) => {\n setSaveFilterPrompt(null);\n saveFilter(name);\n },\n [saveFilter],\n );\n\n const handleClose = () => {\n setSaveFilterPrompt(null);\n };\n\n const handleSaveFilter = useCallback(() => {\n setSaveFilterPrompt(\n <FilterNamePrompt\n onClose={handleClose}\n onConfirm={handleConfirm}\n title=\"Save Filter\"\n />,\n );\n }, [handleConfirm]);\n\n const handleFilterApplied = useCallback<\n FilterAppliedHandler<FilterContainerFilter>\n >(\n (filter) => {\n setCurrentFilter?.(filter);\n onFilterApplied?.(filter);\n },\n [onFilterApplied, setCurrentFilter],\n );\n\n const handleFilterCleared = useCallback(() => {\n setCurrentFilter(EMPTY_FILTER);\n onFilterCleared?.();\n }, [onFilterCleared, setCurrentFilter]);\n\n return {\n clearFilter,\n disableClear: currentFilter.filter === null,\n disableSave: currentFilter.filter === null,\n filter: currentFilter.filter ?? filter,\n onFilterApplied: handleFilterApplied,\n onFilterCleared: handleFilterCleared,\n saveFilter: handleSaveFilter,\n saveFilterPrompt,\n };\n};\n"],"names":["filter"],"mappings":";;;;;AAWO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,MAAM,EAAE,UAAY,EAAA,aAAA,EAAe,gBAAiB,EAAA,GAClD,gBAAgB,iBAAiB,CAAA;AACnC,EAAM,MAAA,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAA,QAAA;AAAA,IAC9C;AAAA,GACF;AAEA,EAAM,MAAA,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,gBAAA,CAAiB,WAAW,CAAA;AAAA,GAC9B,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,IAAiB,KAAA;AAChB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,KACjB;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,GAC1B;AAEA,EAAM,MAAA,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,mBAAA;AAAA,sBACE,GAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAS,EAAA,WAAA;AAAA,UACT,SAAW,EAAA,aAAA;AAAA,UACX,KAAM,EAAA;AAAA;AAAA;AACR,KACF;AAAA,GACF,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,mBAAsB,GAAA,WAAA;AAAA,IAG1B,CAACA,OAAW,KAAA;AACV,MAAA,gBAAA,GAAmBA,OAAM,CAAA;AACzB,MAAA,eAAA,GAAkBA,OAAM,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,iBAAiB,gBAAgB;AAAA,GACpC;AAEA,EAAM,MAAA,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAA,gBAAA,CAAiB,YAAY,CAAA;AAC7B,IAAkB,eAAA,IAAA;AAAA,GACjB,EAAA,CAAC,eAAiB,EAAA,gBAAgB,CAAC,CAAA;AAEtC,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,YAAA,EAAc,cAAc,MAAW,KAAA,IAAA;AAAA,IACvC,WAAA,EAAa,cAAc,MAAW,KAAA,IAAA;AAAA,IACtC,MAAA,EAAQ,cAAc,MAAU,IAAA,MAAA;AAAA,IAChC,eAAiB,EAAA,mBAAA;AAAA,IACjB,eAAiB,EAAA,mBAAA;AAAA,IACjB,UAAY,EAAA,gBAAA;AAAA,IACZ;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useFilterPanel.js","sources":["../../../../packages/vuu-filters/src/filter-panel/useFilterPanel.tsx"],"sourcesContent":["import { ReactElement, useCallback, useState } from \"react\";\nimport { FilterContainerProps } from \"../filter-container/FilterContainer\";\nimport {\n EMPTY_FILTER,\n NULL_FILTER,\n useSavedFilters,\n} from \"../filter-provider/FilterContext\";\nimport { FilterAppliedHandler } from \"../filter-container/useFilterContainer\";\nimport { FilterNamePrompt } from \"../saved-filters/FilterNamePrompt\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\n\nexport const useFilterPanel = ({\n filter,\n filterProviderKey,\n onFilterApplied,\n onFilterCleared,\n}: Pick<\n FilterContainerProps,\n \"filter\" | \"filterProviderKey\" | \"onFilterApplied\" | \"onFilterCleared\"\n>) => {\n const { saveFilter, currentFilter, setCurrentFilter } =\n useSavedFilters(filterProviderKey);\n const [saveFilterPrompt, setSaveFilterPrompt] = useState<ReactElement | null>(\n null,\n );\n\n console.log(\n `[useFilterPanel] current filter ${JSON.stringify(currentFilter)}`,\n );\n\n const clearFilter = useCallback(() => {\n setCurrentFilter(NULL_FILTER);\n }, [setCurrentFilter]);\n\n const handleConfirm = useCallback(\n (name: string) => {\n setSaveFilterPrompt(null);\n saveFilter(name);\n },\n [saveFilter],\n );\n\n const handleClose = () => {\n setSaveFilterPrompt(null);\n };\n\n const handleSaveFilter = useCallback(() => {\n setSaveFilterPrompt(\n <FilterNamePrompt\n onClose={handleClose}\n onConfirm={handleConfirm}\n title=\"Save Filter\"\n />,\n );\n }, [handleConfirm]);\n\n const handleFilterApplied = useCallback<\n FilterAppliedHandler<FilterContainerFilter>\n >(\n (filter) => {\n setCurrentFilter?.(filter);\n onFilterApplied?.(filter);\n },\n [onFilterApplied, setCurrentFilter],\n );\n\n const handleFilterCleared = useCallback(() => {\n setCurrentFilter(EMPTY_FILTER);\n onFilterCleared?.();\n }, [onFilterCleared, setCurrentFilter]);\n\n return {\n clearFilter,\n disableClear: currentFilter.filter === null,\n disableSave: currentFilter.filter === null,\n filter: currentFilter.filter ?? filter,\n onFilterApplied: handleFilterApplied,\n onFilterCleared: handleFilterCleared,\n saveFilter: handleSaveFilter,\n saveFilterPrompt,\n };\n};\n"],"names":["filter"],"mappings":";;;;;AAWO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,MAAM,EAAE,UAAY,EAAA,aAAA,EAAe,gBAAiB,EAAA,GAClD,gBAAgB,iBAAiB,CAAA;AACnC,EAAM,MAAA,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAA,QAAA;AAAA,IAC9C;AAAA,GACF;AAEA,EAAQ,OAAA,CAAA,GAAA;AAAA,IACN,CAAmC,gCAAA,EAAA,IAAA,CAAK,SAAU,CAAA,aAAa,CAAC,CAAA;AAAA,GAClE;AAEA,EAAM,MAAA,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,gBAAA,CAAiB,WAAW,CAAA;AAAA,GAC9B,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,aAAgB,GAAA,WAAA;AAAA,IACpB,CAAC,IAAiB,KAAA;AAChB,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AAAA,KACjB;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,GAC1B;AAEA,EAAM,MAAA,gBAAA,GAAmB,YAAY,MAAM;AACzC,IAAA,mBAAA;AAAA,sBACE,GAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAS,EAAA,WAAA;AAAA,UACT,SAAW,EAAA,aAAA;AAAA,UACX,KAAM,EAAA;AAAA;AAAA;AACR,KACF;AAAA,GACF,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,mBAAsB,GAAA,WAAA;AAAA,IAG1B,CAACA,OAAW,KAAA;AACV,MAAA,gBAAA,GAAmBA,OAAM,CAAA;AACzB,MAAA,eAAA,GAAkBA,OAAM,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,iBAAiB,gBAAgB;AAAA,GACpC;AAEA,EAAM,MAAA,mBAAA,GAAsB,YAAY,MAAM;AAC5C,IAAA,gBAAA,CAAiB,YAAY,CAAA;AAC7B,IAAkB,eAAA,IAAA;AAAA,GACjB,EAAA,CAAC,eAAiB,EAAA,gBAAgB,CAAC,CAAA;AAEtC,EAAO,OAAA;AAAA,IACL,WAAA;AAAA,IACA,YAAA,EAAc,cAAc,MAAW,KAAA,IAAA;AAAA,IACvC,WAAA,EAAa,cAAc,MAAW,KAAA,IAAA;AAAA,IACtC,MAAA,EAAQ,cAAc,MAAU,IAAA,MAAA;AAAA,IAChC,eAAiB,EAAA,mBAAA;AAAA,IACjB,eAAiB,EAAA,mBAAA;AAAA,IACjB,UAAY,EAAA,gBAAA;AAAA,IACZ;AAAA,GACF;AACF;;;;"}
@@ -35,6 +35,9 @@ const FilterContext = createContext({
35
35
  saveFilter: () => console.warn(
36
36
  "[FilterContext] saveFilter, no FilterProvider has been configured"
37
37
  ),
38
+ clearCurrentFilter: () => console.warn(
39
+ "[FilterContext] clearFilter, no FilterProvider has been configured"
40
+ ),
38
41
  setCurrentFilter: () => console.warn(
39
42
  "[FilterContext] setCurrentFilter, no FilterProvider has been configured"
40
43
  )
@@ -69,11 +72,18 @@ function useSavedFilters(key = "GLOBAL", props) {
69
72
  },
70
73
  [key, setCurrentFilter]
71
74
  );
75
+ const handleClearCurrentFilter = useCallback(
76
+ (localKey = key) => {
77
+ setCurrentFilter(localKey, NULL_FILTER);
78
+ },
79
+ [key, setCurrentFilter]
80
+ );
72
81
  return {
73
82
  currentFilter: getCurrentFilter(key, filterDescriptors),
74
83
  onFilterMenuAction: handleFilterMenuAction,
75
84
  savedFilters: filterDescriptors?.get(key)?.filter(isSavedFilter),
76
85
  saveFilter: handleSaveFilter,
86
+ clearCurrentFilter: handleClearCurrentFilter,
77
87
  setCurrentFilter: handleSetCurrentFilter
78
88
  };
79
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FilterContext.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterContext.ts"],"sourcesContent":["import {\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { FilterAction } from \"../filter-pill/FilterMenu\";\nimport { createContext, useCallback, useContext } from \"react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport const filterDescriptorHasFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n !isEmptyFilter(f) && !isNullFilter(f);\n\nconst isSavedFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n f.id !== UNSAVED_FILTER && f.id !== NULL_FILTER && f.id !== EMPTY_FILTER;\n\nconst getCurrentFilter = (\n key: string,\n savedFilters: Map<string, FilterContainerFilterDescriptor[]>,\n) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors) {\n const activeFilter = filterDescriptors.find((f) => f.active);\n if (activeFilter) {\n return activeFilter;\n }\n }\n return NullFilterDescriptor;\n};\n\nexport type FilterContextFilterMenuActionHandler = <\n T extends FilterAction = FilterAction,\n>(\n key: string,\n filterId: string,\n filterAction: T,\n /**\n * Some menu action handlers may use columns to enrich filter display\n */\n columns?: ColumnDescriptor[],\n) => void;\n\nexport interface FilterContextProps {\n deleteFilter: (key: string, filterId: string) => void;\n saveFilter: (key: string, name: string) => void;\n filterDescriptors: Map<string, FilterContainerFilterDescriptor[]>;\n onFilterMenuAction?: FilterContextFilterMenuActionHandler;\n setCurrentFilter: (\n key: string,\n filter: string | FilterContainerFilter,\n ) => void;\n}\n\nexport const UNSAVED_FILTER = \"unsaved-filter\";\nexport const EMPTY_FILTER = \"empty-filter\";\nexport const NULL_FILTER = \"null-filter\";\n\nexport const isEmptyFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === EMPTY_FILTER;\nexport const isNullFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === NULL_FILTER;\n\nexport const NullFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: NULL_FILTER,\n filter: null,\n};\n\nexport const EmptyFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: EMPTY_FILTER,\n filter: null,\n};\n\nexport const FilterContext = createContext<FilterContextProps>({\n filterDescriptors: new Map<string, FilterContainerFilterDescriptor[]>(),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n setCurrentFilter: () =>\n console.warn(\n \"[FilterContext] setCurrentFilter, no FilterProvider has been configured\",\n ),\n});\n\ninterface SavedFilterHookProps {\n availableColumns?: ColumnDescriptor[];\n}\n\nexport function useSavedFilters(key = \"GLOBAL\", props?: SavedFilterHookProps) {\n const {\n onFilterMenuAction,\n filterDescriptors,\n saveFilter,\n setCurrentFilter,\n } = useContext(FilterContext);\n\n const handleFilterMenuAction = useCallback(\n (filterId: string, filterAction: FilterAction) => {\n onFilterMenuAction?.(\n key,\n filterId,\n filterAction,\n props?.availableColumns,\n );\n },\n [key, onFilterMenuAction, props?.availableColumns],\n );\n\n const handleSaveFilter = useCallback(\n (name: string) => {\n saveFilter(key, name);\n },\n [key, saveFilter],\n );\n\n /**\n * Set the current filter, using the filterProviderKey specified\n * in hook call. Alternatively, a localKey can be provided in this\n * call to override the key above. This can be useful where\n * setCurrentFilter is called from a hook where the key is not in\n * scope at the point where useSavedFilters is called.\n */\n const handleSetCurrentFilter = useCallback(\n (filter: string | FilterContainerFilter, localKey = key) => {\n setCurrentFilter(localKey, filter);\n },\n [key, setCurrentFilter],\n );\n\n return {\n currentFilter: getCurrentFilter(key, filterDescriptors),\n onFilterMenuAction: handleFilterMenuAction,\n savedFilters: filterDescriptors?.get(key)?.filter(isSavedFilter),\n saveFilter: handleSaveFilter,\n setCurrentFilter: handleSetCurrentFilter,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FilterContext.js","sources":["../../../../packages/vuu-filters/src/filter-provider/FilterContext.ts"],"sourcesContent":["import {\n FilterContainerFilter,\n FilterContainerFilterDescriptor,\n FilterContainerFilterDescriptorWithFilter,\n} from \"@vuu-ui/vuu-filter-types\";\nimport { FilterAction } from \"../filter-pill/FilterMenu\";\nimport { createContext, useCallback, useContext } from \"react\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport const filterDescriptorHasFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n !isEmptyFilter(f) && !isNullFilter(f);\n\nconst isSavedFilter = (\n f: FilterContainerFilterDescriptor,\n): f is FilterContainerFilterDescriptorWithFilter =>\n f.id !== UNSAVED_FILTER && f.id !== NULL_FILTER && f.id !== EMPTY_FILTER;\n\nconst getCurrentFilter = (\n key: string,\n savedFilters: Map<string, FilterContainerFilterDescriptor[]>,\n) => {\n const filterDescriptors = savedFilters.get(key);\n if (filterDescriptors) {\n const activeFilter = filterDescriptors.find((f) => f.active);\n if (activeFilter) {\n return activeFilter;\n }\n }\n return NullFilterDescriptor;\n};\n\nexport type FilterContextFilterMenuActionHandler = <\n T extends FilterAction = FilterAction,\n>(\n key: string,\n filterId: string,\n filterAction: T,\n /**\n * Some menu action handlers may use columns to enrich filter display\n */\n columns?: ColumnDescriptor[],\n) => void;\n\nexport interface FilterContextProps {\n deleteFilter: (key: string, filterId: string) => void;\n saveFilter: (key: string, name: string) => void;\n filterDescriptors: Map<string, FilterContainerFilterDescriptor[]>;\n onFilterMenuAction?: FilterContextFilterMenuActionHandler;\n clearCurrentFilter: (key: string) => void;\n setCurrentFilter: (\n key: string,\n filter: string | FilterContainerFilter,\n ) => void;\n}\n\nexport const UNSAVED_FILTER = \"unsaved-filter\";\nexport const EMPTY_FILTER = \"empty-filter\";\nexport const NULL_FILTER = \"null-filter\";\n\nexport const isEmptyFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === EMPTY_FILTER;\nexport const isNullFilter = (f?: FilterContainerFilterDescriptor) =>\n f?.id === NULL_FILTER;\n\nexport const NullFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: NULL_FILTER,\n filter: null,\n};\n\nexport const EmptyFilterDescriptor: FilterContainerFilterDescriptor = {\n active: true,\n id: EMPTY_FILTER,\n filter: null,\n};\n\nexport const FilterContext = createContext<FilterContextProps>({\n filterDescriptors: new Map<string, FilterContainerFilterDescriptor[]>(),\n deleteFilter: () =>\n console.warn(\n \"[FilterContext] deleteFilter, no FilterProvider has been configured\",\n ),\n saveFilter: () =>\n console.warn(\n \"[FilterContext] saveFilter, no FilterProvider has been configured\",\n ),\n clearCurrentFilter: () =>\n console.warn(\n \"[FilterContext] clearFilter, no FilterProvider has been configured\",\n ),\n setCurrentFilter: () =>\n console.warn(\n \"[FilterContext] setCurrentFilter, no FilterProvider has been configured\",\n ),\n});\n\ninterface SavedFilterHookProps {\n availableColumns?: ColumnDescriptor[];\n}\n\nexport function useSavedFilters(key = \"GLOBAL\", props?: SavedFilterHookProps) {\n const {\n onFilterMenuAction,\n filterDescriptors,\n saveFilter,\n setCurrentFilter,\n } = useContext(FilterContext);\n\n const handleFilterMenuAction = useCallback(\n (filterId: string, filterAction: FilterAction) => {\n onFilterMenuAction?.(\n key,\n filterId,\n filterAction,\n props?.availableColumns,\n );\n },\n [key, onFilterMenuAction, props?.availableColumns],\n );\n\n const handleSaveFilter = useCallback(\n (name: string) => {\n saveFilter(key, name);\n },\n [key, saveFilter],\n );\n\n /**\n * Set the current filter, using the filterProviderKey specified\n * in hook call. Alternatively, a localKey can be provided in this\n * call to override the key above. This can be useful where\n * setCurrentFilter is called from a hook where the key is not in\n * scope at the point where useSavedFilters is called.\n */\n const handleSetCurrentFilter = useCallback(\n (filter: string | FilterContainerFilter, localKey = key) => {\n setCurrentFilter(localKey, filter);\n },\n [key, setCurrentFilter],\n );\n\n const handleClearCurrentFilter = useCallback(\n (localKey = key) => {\n setCurrentFilter(localKey, NULL_FILTER);\n },\n [key, setCurrentFilter],\n );\n\n return {\n currentFilter: getCurrentFilter(key, filterDescriptors),\n onFilterMenuAction: handleFilterMenuAction,\n savedFilters: filterDescriptors?.get(key)?.filter(isSavedFilter),\n saveFilter: handleSaveFilter,\n clearCurrentFilter: handleClearCurrentFilter,\n setCurrentFilter: handleSetCurrentFilter,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -206,6 +206,12 @@ const FilterProvider = ({
206
206
  },
207
207
  [deleteFilter, savedFilters]
208
208
  );
209
+ const clearCurrentFilter = useCallback(
210
+ (key) => {
211
+ setCurrentFilter(key, NULL_FILTER);
212
+ },
213
+ [setCurrentFilter]
214
+ );
209
215
  return /* @__PURE__ */ jsxs(
210
216
  FilterContext.Provider,
211
217
  {
@@ -214,6 +220,7 @@ const FilterProvider = ({
214
220
  deleteFilter,
215
221
  saveFilter: handleSaveFilter,
216
222
  filterDescriptors: savedFilters,
223
+ clearCurrentFilter,
217
224
  setCurrentFilter
218
225
  },
219
226
  children: [
@@ -1 +1 @@
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":"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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 const clearCurrentFilter = useCallback(\n (key: string) => {\n setCurrentFilter(key, NULL_FILTER);\n },\n [setCurrentFilter],\n );\n\n return (\n <FilterContext.Provider\n value={{\n onFilterMenuAction: handleFilterMenuAction,\n deleteFilter,\n saveFilter: handleSaveFilter,\n filterDescriptors: savedFilters,\n clearCurrentFilter,\n setCurrentFilter,\n }}\n >\n {children}\n {dialog}\n </FilterContext.Provider>\n );\n};\n"],"names":[],"mappings":"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"}
package/esm/index.js CHANGED
@@ -6,12 +6,13 @@ export { FilterClause } from './filter-clause/FilterClause.js';
6
6
  export { FilterClauseValueEditorText } from './filter-clause/value-editors/FilterClauseValueEditorText.js';
7
7
  export { ExtendedSingleValueFilterClause } from './filter-container/ExtendedSingleValueFilterClause.js';
8
8
  export { FilterContainer, FilterContainerColumnFilter } from './filter-container/FilterContainer.js';
9
+ export { useFilterContextMenu } from './filter-context-menu/useFilterContextMenu.js';
9
10
  export { FilterDisplay } from './filter-display/FilterDisplay.js';
10
11
  export { FilterEditor } from './filter-editor/FilterEditor.js';
11
12
  export { FilterPanel } from './filter-panel/FilterPanel.js';
12
13
  export { FilterPill } from './filter-pill/FilterPill.js';
13
14
  export { FilterPillNext } from './filter-pill/FilterPillNext.js';
14
- export { useSavedFilters } from './filter-provider/FilterContext.js';
15
+ export { NULL_FILTER, useSavedFilters } from './filter-provider/FilterContext.js';
15
16
  export { FilterProvider } from './filter-provider/FilterProvider.js';
16
17
  export { AND, ENDS_WITH, EQUALS, GREATER_THAN, IN, LESS_THAN, OR, STARTS_WITH, addClause, addFilter, filterClauses, filterEquals, filterIncludesColumn, findMatchingFilter, getFilterClausesForDisplay, getNumericFilter, getTypeaheadFilter, overrideColName, removeFilter, removeLastClause, splitFilterOnColumn, updateFilter } from './filter-utils.js';
17
18
  export { FilterClauseModel, FilterModel } from './FilterModel.js';
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":";;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,21 +1,22 @@
1
1
  {
2
- "version": "0.13.79",
2
+ "version": "0.13.80",
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.79",
8
- "@vuu-ui/vuu-protocol-types": "0.13.79",
9
- "@vuu-ui/vuu-table-types": "0.13.79",
10
- "@vuu-ui/vuu-filter-types": "0.13.79"
7
+ "@vuu-ui/vuu-data-types": "0.13.80",
8
+ "@vuu-ui/vuu-protocol-types": "0.13.80",
9
+ "@vuu-ui/vuu-table-types": "0.13.80",
10
+ "@vuu-ui/vuu-filter-types": "0.13.80"
11
11
  },
12
12
  "dependencies": {
13
- "@vuu-ui/vuu-data-react": "0.13.79",
14
- "@vuu-ui/vuu-filter-parser": "0.13.79",
15
- "@vuu-ui/vuu-popups": "0.13.79",
16
- "@vuu-ui/vuu-ui-controls": "0.13.79",
17
- "@vuu-ui/vuu-table": "0.13.79",
18
- "@vuu-ui/vuu-utils": "0.13.79",
13
+ "@vuu-ui/vuu-context-menu": "0.13.80",
14
+ "@vuu-ui/vuu-data-react": "0.13.80",
15
+ "@vuu-ui/vuu-filter-parser": "0.13.80",
16
+ "@vuu-ui/vuu-popups": "0.13.80",
17
+ "@vuu-ui/vuu-ui-controls": "0.13.80",
18
+ "@vuu-ui/vuu-table": "0.13.80",
19
+ "@vuu-ui/vuu-utils": "0.13.80",
19
20
  "@salt-ds/core": "1.48.0",
20
21
  "@salt-ds/lab": "1.0.0-alpha.76",
21
22
  "@salt-ds/styles": "0.2.1",
@@ -14,9 +14,15 @@ export declare class FilterAggregator {
14
14
  add(column: ColumnDescriptor, value: ColumnFilterValue, op: FilterClauseOp | "between" | "between-inclusive", extendedFilterOptions?: ExtendedFilterOptions): void;
15
15
  has({ name }: ColumnDescriptor): boolean;
16
16
  get({ name }: ColumnDescriptor): FilterContainerFilter | undefined;
17
+ clear(): void;
17
18
  /**
18
19
  * Remove filter for this column. Return false if no filter found, otw true
19
20
  */
20
21
  remove(column: ColumnDescriptor): boolean;
22
+ get isEmpty(): boolean;
23
+ /**
24
+ * Count of the number of columns for which filters are stored
25
+ */
26
+ get count(): number;
21
27
  get filter(): FilterContainerFilter | undefined;
22
28
  }
@@ -0,0 +1,5 @@
1
+ import type { TableContextMenuDef } from "@vuu-ui/vuu-table-types";
2
+ export interface FilterContextMenuHookProps {
3
+ filterColumns: string[] | "*";
4
+ }
5
+ export declare const useFilterContextMenu: ({ filterColumns, }?: FilterContextMenuHookProps) => TableContextMenuDef;
@@ -12,6 +12,7 @@ export interface FilterContextProps {
12
12
  saveFilter: (key: string, name: string) => void;
13
13
  filterDescriptors: Map<string, FilterContainerFilterDescriptor[]>;
14
14
  onFilterMenuAction?: FilterContextFilterMenuActionHandler;
15
+ clearCurrentFilter: (key: string) => void;
15
16
  setCurrentFilter: (key: string, filter: string | FilterContainerFilter) => void;
16
17
  }
17
18
  export declare const UNSAVED_FILTER = "unsaved-filter";
@@ -30,6 +31,7 @@ export declare function useSavedFilters(key?: string, props?: SavedFilterHookPro
30
31
  onFilterMenuAction: (filterId: string, filterAction: FilterAction) => void;
31
32
  savedFilters: FilterContainerFilterDescriptorWithFilter[] | undefined;
32
33
  saveFilter: (name: string) => void;
34
+ clearCurrentFilter: (localKey?: string) => void;
33
35
  setCurrentFilter: (filter: string | FilterContainerFilter, localKey?: string) => void;
34
36
  };
35
37
  export {};
package/types/index.d.ts CHANGED
@@ -4,13 +4,14 @@ export * from "./filter-clause";
4
4
  export { ExtendedSingleValueFilterClause } from "./filter-container/ExtendedSingleValueFilterClause";
5
5
  export { FilterContainer, FilterContainerColumnFilter, type FilterContainerColumnFilterProps, type FilterContainerProps, } from "./filter-container/FilterContainer";
6
6
  export type { FilterAppliedHandler } from "./filter-container/useFilterContainer";
7
+ export { useFilterContextMenu } from "./filter-context-menu/useFilterContextMenu";
7
8
  export { FilterDisplay } from "./filter-display/FilterDisplay";
8
9
  export * from "./filter-editor";
9
10
  export { FilterPanel } from "./filter-panel/FilterPanel";
10
11
  export * from "./filter-pill";
11
12
  export { type FilterPermissions } from "./filter-pill/FilterMenu";
12
13
  export { FilterPillNext, type FilterPillNextProps, } from "./filter-pill/FilterPillNext";
13
- export { useSavedFilters } from "./filter-provider/FilterContext";
14
+ export { NULL_FILTER, useSavedFilters } from "./filter-provider/FilterContext";
14
15
  export { FilterProvider } from "./filter-provider/FilterProvider";
15
16
  export * from "./filter-utils";
16
17
  export * from "./FilterModel";