@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
@@ -40,6 +40,7 @@ function installExtendedFilters(filter, throwIfUndefined = false) {
40
40
  class FilterAggregator {
41
41
  constructor(filter) {
42
42
  __privateAdd(this, _filters, /* @__PURE__ */ new Map());
43
+ console.log(`[FilterAggregator] ${JSON.stringify(filter)}`);
43
44
  const runtimeFilter = installExtendedFilters(filter);
44
45
  if (vuuUtils.isSingleValueFilter(runtimeFilter)) {
45
46
  __privateGet(this, _filters).set(runtimeFilter.column, runtimeFilter);
@@ -118,6 +119,9 @@ class FilterAggregator {
118
119
  get({ name }) {
119
120
  return __privateGet(this, _filters).get(name);
120
121
  }
122
+ clear() {
123
+ __privateGet(this, _filters).clear();
124
+ }
121
125
  /**
122
126
  * Remove filter for this column. Return false if no filter found, otw true
123
127
  */
@@ -129,6 +133,15 @@ class FilterAggregator {
129
133
  return false;
130
134
  }
131
135
  }
136
+ get isEmpty() {
137
+ return __privateGet(this, _filters).size === 0;
138
+ }
139
+ /**
140
+ * Count of the number of columns for which filters are stored
141
+ */
142
+ get count() {
143
+ return __privateGet(this, _filters).size;
144
+ }
132
145
  get filter() {
133
146
  const { size } = __privateGet(this, _filters);
134
147
  if (size === 0) {
@@ -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":["isExtendedFilter","ExtendedSingleValueFilterClause","isMultiClauseFilter","isSingleValueFilter","isBetweenFilter","isAndFilter","isTypeDescriptor","getTypedRange","getTypedValue"],"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":["isExtendedFilter","ExtendedSingleValueFilterClause","isMultiClauseFilter","isSingleValueFilter","isBetweenFilter","isAndFilter","isTypeDescriptor","getTypedRange","getTypedValue"],"mappings":"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"}
@@ -32,10 +32,10 @@ const FilterContainerColumnFilter = ({
32
32
  const [value, setValue] = react.useState(initialValue);
33
33
  const valueRef = react.useRef(initialValue);
34
34
  const { currentFilter } = FilterContext.useSavedFilters(filterProviderKey);
35
- const currentFilterRef = react.useRef(currentFilter.id);
35
+ const currentFilterRef = react.useRef(currentFilter);
36
36
  react.useMemo(() => {
37
- if (currentFilterRef.current !== currentFilter.id) {
38
- currentFilterRef.current = currentFilter.id;
37
+ if (currentFilterRef.current.id !== currentFilter.id || !vuuUtils.filtersAreEqual(currentFilterRef.current.filter, currentFilter.filter)) {
38
+ currentFilterRef.current = currentFilter;
39
39
  if (FilterContext.isNullFilter(currentFilter) && notEmpty(valueRef.current)) {
40
40
  if (Array.isArray(valueRef.current)) {
41
41
  if (column.type === "time") {
@@ -67,7 +67,7 @@ const FilterContainerColumnFilter = ({
67
67
  }
68
68
  }
69
69
  }
70
- }, [column, currentFilter.id]);
70
+ }, [column, currentFilter]);
71
71
  const handleCommit = react.useCallback(
72
72
  (column2, op, value2, extendedFilterOptions) => {
73
73
  valueRef.current = value2;
@@ -123,6 +123,7 @@ const FilterContainer = ({
123
123
  css: FilterContainer$1,
124
124
  window: targetWindow
125
125
  });
126
+ console.log(`[FilterContainer] current filter ${JSON.stringify(filter)}`);
126
127
  const filterContextProps = useFilterContainer.useFilterContainer({
127
128
  filter,
128
129
  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":["useFilterContext","useMemo","useState","useRef","useSavedFilters","isNullFilter","filterDescriptorHasFilter","getColumnValueFromFilter","isBetweenOperator","useCallback","column","value","jsx","ColumnFilter","useWindow","useComponentCssInjection","filterContainerCss","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 {\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":["useFilterContext","useMemo","useState","useRef","useSavedFilters","filtersAreEqual","isNullFilter","filterDescriptorHasFilter","getColumnValueFromFilter","isBetweenOperator","useCallback","column","value","jsx","ColumnFilter","useWindow","useComponentCssInjection","filterContainerCss","useFilterContainer","ColumnFilterContext"],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var react = require('react');
5
+ var FilterContext = require('../filter-provider/FilterContext.js');
6
+ var FilterAggregator = require('../FilterAggregator.js');
7
+
8
+ const EmptyAggregator = new FilterAggregator.FilterAggregator();
9
+ const defaultProps = {
10
+ filterColumns: "*"
11
+ };
12
+ const useFilterContextMenu = ({
13
+ filterColumns = "*"
14
+ } = defaultProps) => {
15
+ const { currentFilter, clearCurrentFilter, setCurrentFilter } = FilterContext.useSavedFilters();
16
+ const filterAggregatorRef = react.useRef(EmptyAggregator);
17
+ react.useMemo(() => {
18
+ if (!vuuUtils.filtersAreEqual(currentFilter.filter, filterAggregatorRef.current.filter)) {
19
+ filterAggregatorRef.current = currentFilter.filter ? new FilterAggregator.FilterAggregator(currentFilter.filter) : new FilterAggregator.FilterAggregator();
20
+ }
21
+ }, [currentFilter]);
22
+ const menuBuilder = react.useCallback(
23
+ (_location, options) => {
24
+ console.log(`menuBuilder _location ${_location} options `, {
25
+ options
26
+ });
27
+ const { column, columnMap, row } = options;
28
+ const { current: fag } = filterAggregatorRef;
29
+ const { name, label = name } = column;
30
+ const colIdx = columnMap[column.name];
31
+ const value = row[colIdx];
32
+ const ClearFilter = {
33
+ id: "filter-clear",
34
+ label: "Clear filter",
35
+ options
36
+ };
37
+ if (filterColumns === "*" || filterColumns.includes(column.name)) {
38
+ const SetFilter = {
39
+ id: "filter-set",
40
+ label: `Set filter ${label} '${value}'`,
41
+ options
42
+ };
43
+ if (fag.isEmpty) {
44
+ return [SetFilter];
45
+ } else if (fag.has(column)) {
46
+ if (fag.count === 1) {
47
+ return [ClearFilter];
48
+ } else {
49
+ return [
50
+ {
51
+ id: "filter-remove",
52
+ label: `Remove ${label} '${value}' from filter`,
53
+ options
54
+ },
55
+ SetFilter,
56
+ ClearFilter
57
+ ];
58
+ }
59
+ } else {
60
+ return [
61
+ SetFilter,
62
+ {
63
+ id: "filter-add",
64
+ label: `Add ${label} '${value}' to existing filter`,
65
+ options
66
+ },
67
+ ClearFilter
68
+ ];
69
+ }
70
+ } else if (!fag.isEmpty) {
71
+ return [ClearFilter];
72
+ } else {
73
+ return [];
74
+ }
75
+ },
76
+ [filterColumns]
77
+ );
78
+ const menuActionHandler = react.useCallback(
79
+ (menuItemId, options) => {
80
+ if (options) {
81
+ const { current: fag } = filterAggregatorRef;
82
+ const { column, columnMap, row } = options;
83
+ switch (menuItemId) {
84
+ case "filter-clear":
85
+ {
86
+ clearCurrentFilter();
87
+ }
88
+ break;
89
+ case "filter-add":
90
+ {
91
+ const colIdx = columnMap[column.name];
92
+ const value = row[colIdx];
93
+ fag.add(column, value, "=");
94
+ if (fag.filter) {
95
+ setCurrentFilter(fag.filter);
96
+ }
97
+ }
98
+ break;
99
+ case "filter-remove":
100
+ {
101
+ fag.remove(column);
102
+ if (fag.filter) {
103
+ setCurrentFilter(fag.filter);
104
+ }
105
+ }
106
+ break;
107
+ case "filter-set":
108
+ {
109
+ const colIdx = columnMap[column.name];
110
+ const value = row[colIdx];
111
+ fag.clear();
112
+ fag.add(column, value, "=");
113
+ if (fag.filter) {
114
+ setCurrentFilter(fag.filter);
115
+ }
116
+ }
117
+ break;
118
+ default:
119
+ return false;
120
+ }
121
+ } else {
122
+ return false;
123
+ }
124
+ },
125
+ [clearCurrentFilter, setCurrentFilter]
126
+ );
127
+ return {
128
+ menuActionHandler,
129
+ menuBuilder
130
+ };
131
+ };
132
+
133
+ exports.useFilterContextMenu = useFilterContextMenu;
134
+ //# 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":["FilterAggregator","useSavedFilters","useRef","useMemo","filtersAreEqual","useCallback"],"mappings":"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"}
@@ -15,6 +15,9 @@ const useFilterPanel = ({
15
15
  const [saveFilterPrompt, setSaveFilterPrompt] = react.useState(
16
16
  null
17
17
  );
18
+ console.log(
19
+ `[useFilterPanel] current filter ${JSON.stringify(currentFilter)}`
20
+ );
18
21
  const clearFilter = react.useCallback(() => {
19
22
  setCurrentFilter(FilterContext.NULL_FILTER);
20
23
  }, [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":["useSavedFilters","useState","useCallback","NULL_FILTER","jsx","FilterNamePrompt","filter","EMPTY_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,GAClDA,8BAAgB,iBAAiB,CAAA;AACnC,EAAM,MAAA,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAAC,cAAA;AAAA,IAC9C;AAAA,GACF;AAEA,EAAM,MAAA,WAAA,GAAcC,kBAAY,MAAM;AACpC,IAAA,gBAAA,CAAiBC,yBAAW,CAAA;AAAA,GAC9B,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,aAAgB,GAAAD,iBAAA;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,GAAmBA,kBAAY,MAAM;AACzC,IAAA,mBAAA;AAAA,sBACEE,cAAA;AAAA,QAACC,iCAAA;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,GAAAH,iBAAA;AAAA,IAG1B,CAACI,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,GAAsBJ,kBAAY,MAAM;AAC5C,IAAA,gBAAA,CAAiBK,0BAAY,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":["useSavedFilters","useState","useCallback","NULL_FILTER","jsx","FilterNamePrompt","filter","EMPTY_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,GAClDA,8BAAgB,iBAAiB,CAAA;AACnC,EAAM,MAAA,CAAC,gBAAkB,EAAA,mBAAmB,CAAI,GAAAC,cAAA;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,GAAcC,kBAAY,MAAM;AACpC,IAAA,gBAAA,CAAiBC,yBAAW,CAAA;AAAA,GAC9B,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,aAAgB,GAAAD,iBAAA;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,GAAmBA,kBAAY,MAAM;AACzC,IAAA,mBAAA;AAAA,sBACEE,cAAA;AAAA,QAACC,iCAAA;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,GAAAH,iBAAA;AAAA,IAG1B,CAACI,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,GAAsBJ,kBAAY,MAAM;AAC5C,IAAA,gBAAA,CAAiBK,0BAAY,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;;;;"}
@@ -37,6 +37,9 @@ const FilterContext = react.createContext({
37
37
  saveFilter: () => console.warn(
38
38
  "[FilterContext] saveFilter, no FilterProvider has been configured"
39
39
  ),
40
+ clearCurrentFilter: () => console.warn(
41
+ "[FilterContext] clearFilter, no FilterProvider has been configured"
42
+ ),
40
43
  setCurrentFilter: () => console.warn(
41
44
  "[FilterContext] setCurrentFilter, no FilterProvider has been configured"
42
45
  )
@@ -71,11 +74,18 @@ function useSavedFilters(key = "GLOBAL", props) {
71
74
  },
72
75
  [key, setCurrentFilter]
73
76
  );
77
+ const handleClearCurrentFilter = react.useCallback(
78
+ (localKey = key) => {
79
+ setCurrentFilter(localKey, NULL_FILTER);
80
+ },
81
+ [key, setCurrentFilter]
82
+ );
74
83
  return {
75
84
  currentFilter: getCurrentFilter(key, filterDescriptors),
76
85
  onFilterMenuAction: handleFilterMenuAction,
77
86
  savedFilters: filterDescriptors?.get(key)?.filter(isSavedFilter),
78
87
  saveFilter: handleSaveFilter,
88
+ clearCurrentFilter: handleClearCurrentFilter,
79
89
  setCurrentFilter: handleSetCurrentFilter
80
90
  };
81
91
  }
@@ -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":["createContext","useContext","useCallback"],"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":["createContext","useContext","useCallback"],"mappings":"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"}
@@ -208,6 +208,12 @@ const FilterProvider = ({
208
208
  },
209
209
  [deleteFilter, savedFilters]
210
210
  );
211
+ const clearCurrentFilter = react.useCallback(
212
+ (key) => {
213
+ setCurrentFilter(key, FilterContext.NULL_FILTER);
214
+ },
215
+ [setCurrentFilter]
216
+ );
211
217
  return /* @__PURE__ */ jsxRuntime.jsxs(
212
218
  FilterContext.FilterContext.Provider,
213
219
  {
@@ -216,6 +222,7 @@ const FilterProvider = ({
216
222
  deleteFilter,
217
223
  saveFilter: handleSaveFilter,
218
224
  filterDescriptors: savedFilters,
225
+ clearCurrentFilter,
219
226
  setCurrentFilter
220
227
  },
221
228
  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":["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 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":["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
@@ -8,6 +8,7 @@ var FilterClause = require('./filter-clause/FilterClause.js');
8
8
  var FilterClauseValueEditorText = require('./filter-clause/value-editors/FilterClauseValueEditorText.js');
9
9
  var ExtendedSingleValueFilterClause = require('./filter-container/ExtendedSingleValueFilterClause.js');
10
10
  var FilterContainer = require('./filter-container/FilterContainer.js');
11
+ var useFilterContextMenu = require('./filter-context-menu/useFilterContextMenu.js');
11
12
  var FilterDisplay = require('./filter-display/FilterDisplay.js');
12
13
  var FilterEditor = require('./filter-editor/FilterEditor.js');
13
14
  var FilterPanel = require('./filter-panel/FilterPanel.js');
@@ -35,11 +36,13 @@ exports.FilterClauseValueEditorText = FilterClauseValueEditorText.FilterClauseVa
35
36
  exports.ExtendedSingleValueFilterClause = ExtendedSingleValueFilterClause.ExtendedSingleValueFilterClause;
36
37
  exports.FilterContainer = FilterContainer.FilterContainer;
37
38
  exports.FilterContainerColumnFilter = FilterContainer.FilterContainerColumnFilter;
39
+ exports.useFilterContextMenu = useFilterContextMenu.useFilterContextMenu;
38
40
  exports.FilterDisplay = FilterDisplay.FilterDisplay;
39
41
  exports.FilterEditor = FilterEditor.FilterEditor;
40
42
  exports.FilterPanel = FilterPanel.FilterPanel;
41
43
  exports.FilterPill = FilterPill.FilterPill;
42
44
  exports.FilterPillNext = FilterPillNext.FilterPillNext;
45
+ exports.NULL_FILTER = FilterContext.NULL_FILTER;
43
46
  exports.useSavedFilters = FilterContext.useSavedFilters;
44
47
  exports.FilterProvider = FilterProvider.FilterProvider;
45
48
  exports.AND = filterUtils.AND;
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -38,6 +38,7 @@ function installExtendedFilters(filter, throwIfUndefined = false) {
38
38
  class FilterAggregator {
39
39
  constructor(filter) {
40
40
  __privateAdd(this, _filters, /* @__PURE__ */ new Map());
41
+ console.log(`[FilterAggregator] ${JSON.stringify(filter)}`);
41
42
  const runtimeFilter = installExtendedFilters(filter);
42
43
  if (isSingleValueFilter(runtimeFilter)) {
43
44
  __privateGet(this, _filters).set(runtimeFilter.column, runtimeFilter);
@@ -116,6 +117,9 @@ class FilterAggregator {
116
117
  get({ name }) {
117
118
  return __privateGet(this, _filters).get(name);
118
119
  }
120
+ clear() {
121
+ __privateGet(this, _filters).clear();
122
+ }
119
123
  /**
120
124
  * Remove filter for this column. Return false if no filter found, otw true
121
125
  */
@@ -127,6 +131,15 @@ class FilterAggregator {
127
131
  return false;
128
132
  }
129
133
  }
134
+ get isEmpty() {
135
+ return __privateGet(this, _filters).size === 0;
136
+ }
137
+ /**
138
+ * Count of the number of columns for which filters are stored
139
+ */
140
+ get count() {
141
+ return __privateGet(this, _filters).size;
142
+ }
130
143
  get filter() {
131
144
  const { size } = __privateGet(this, _filters);
132
145
  if (size === 0) {