@vuu-ui/vuu-filters 0.13.88 → 0.13.89

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.
@@ -21,7 +21,7 @@ const numericOperators = [
21
21
  const getOperators = (column) => {
22
22
  if (vuuUtils.isTextColumn(column)) {
23
23
  return textOperators;
24
- } else if (vuuUtils.isNumericColumn(column)) {
24
+ } else if (vuuUtils.isNumericColumn(column) || vuuUtils.isTimestampColumn(column)) {
25
25
  return numericOperators;
26
26
  } else {
27
27
  throw Error("getOperators only supports text and numeric columns");
@@ -1 +1 @@
1
- {"version":3,"file":"operator-utils.js","sources":["../../../../packages/vuu-filters/src/filter-clause/operator-utils.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { isNumericColumn, isTextColumn } from \"@vuu-ui/vuu-utils\";\nimport type {\n FilterClauseOp,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nexport const textOperators: FilterClauseOp[] = [\n \"=\",\n \"in\",\n \"!=\",\n \"starts\",\n \"ends\",\n \"contains\",\n];\nexport const numericOperators: NumericFilterClauseOp[] = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n];\n\nexport const getOperators = (column: ColumnDescriptor): FilterClauseOp[] => {\n if (isTextColumn(column)) {\n return textOperators;\n } else if (isNumericColumn(column)) {\n return numericOperators;\n } else {\n throw Error(\"getOperators only supports text and numeric columns\");\n }\n};\n"],"names":["isTextColumn","isNumericColumn"],"mappings":";;;;AAOO,MAAM,aAAkC,GAAA;AAAA,EAC7C,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AACO,MAAM,gBAA4C,GAAA;AAAA,EACvD,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF;AAEa,MAAA,YAAA,GAAe,CAAC,MAA+C,KAAA;AAC1E,EAAI,IAAAA,qBAAA,CAAa,MAAM,CAAG,EAAA;AACxB,IAAO,OAAA,aAAA;AAAA,GACT,MAAA,IAAWC,wBAAgB,CAAA,MAAM,CAAG,EAAA;AAClC,IAAO,OAAA,gBAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,qDAAqD,CAAA;AAAA;AAErE;;;;;;"}
1
+ {"version":3,"file":"operator-utils.js","sources":["../../../../packages/vuu-filters/src/filter-clause/operator-utils.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n isNumericColumn,\n isTextColumn,\n isTimestampColumn,\n} from \"@vuu-ui/vuu-utils\";\nimport type {\n FilterClauseOp,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nexport const textOperators: FilterClauseOp[] = [\n \"=\",\n \"in\",\n \"!=\",\n \"starts\",\n \"ends\",\n \"contains\",\n];\nexport const numericOperators: NumericFilterClauseOp[] = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n];\n\nexport const getOperators = (column: ColumnDescriptor): FilterClauseOp[] => {\n if (isTextColumn(column)) {\n return textOperators;\n } else if (isNumericColumn(column) || isTimestampColumn(column)) {\n return numericOperators;\n } else {\n throw Error(\"getOperators only supports text and numeric columns\");\n }\n};\n"],"names":["isTextColumn","isNumericColumn","isTimestampColumn"],"mappings":";;;;AAWO,MAAM,aAAkC,GAAA;AAAA,EAC7C,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AACO,MAAM,gBAA4C,GAAA;AAAA,EACvD,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF;AAEa,MAAA,YAAA,GAAe,CAAC,MAA+C,KAAA;AAC1E,EAAI,IAAAA,qBAAA,CAAa,MAAM,CAAG,EAAA;AACxB,IAAO,OAAA,aAAA;AAAA,aACEC,wBAAgB,CAAA,MAAM,CAAK,IAAAC,0BAAA,CAAkB,MAAM,CAAG,EAAA;AAC/D,IAAO,OAAA,gBAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,qDAAqD,CAAA;AAAA;AAErE;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var filterDisplayCss = ".vuuFilterDisplay {\n display: grid;\n column-gap: 12px;\n grid-template-columns: auto auto;\n grid-template-rows: repeat(30px);\n padding: var(--salt-spacing-100);\n width: fit-content;\n\n .vuuFilterDisplay-column {\n white-space: no\n }\n .vuuFilterDisplay-value {\n white-space: nowrap;\n }\n}";
3
+ var filterDisplayCss = ".vuuFilterDisplay {\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-50);\n padding: var(--vuuFilterDisplay-padding, var(--salt-spacing-200));\n width: fit-content;\n\n .vuuFilterDisplay-filter-clause {\n align-items: center;\n display: flex;\n gap: var(--salt-spacing-200);\n justify-content: space-between;\n white-space: no\n }\n\n .vuuFilterDisplay-column {\n flex: 1 1 auto;\n white-space: no\n }\n .vuuFilterDisplay-value {\n flex: 0 0 120px;\n text-align: right;\n white-space: nowrap;\n }\n}\n";
4
4
 
5
5
  module.exports = filterDisplayCss;
6
6
  //# sourceMappingURL=FilterDisplay.css.js.map
@@ -7,18 +7,38 @@ var cx = require('clsx');
7
7
  var react = require('react');
8
8
  var filterUtils = require('../filter-utils.js');
9
9
  var FilterDisplay$1 = require('./FilterDisplay.css.js');
10
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
11
+ var vuuUtils = require('@vuu-ui/vuu-utils');
10
12
 
11
13
  const classBase = "vuuFilterDisplay";
12
14
  const getColumnLabel = (columnName, columns) => {
13
15
  return columnName;
14
16
  };
15
- const FilterDisplay = react.forwardRef(function FilterDisplay2({ className, columns, filter, ...htmlAttributes }, forwardedRef) {
17
+ const FilterDisplay = react.forwardRef(function FilterDisplay2({
18
+ allowDelete = false,
19
+ className,
20
+ columns,
21
+ filter,
22
+ onDeleteFilterClause,
23
+ ...htmlAttributes
24
+ }, forwardedRef) {
16
25
  const targetWindow = window.useWindow();
17
26
  styles.useComponentCssInjection({
18
27
  testId: "vuu-filter-display",
19
28
  css: FilterDisplay$1,
20
29
  window: targetWindow
21
30
  });
31
+ const handleDelete = react.useCallback(
32
+ (e) => {
33
+ const {
34
+ dataset: { columnName }
35
+ } = vuuUtils.queryClosest(e.target, "[data-column-name]", true);
36
+ if (columnName) {
37
+ onDeleteFilterClause?.(columnName);
38
+ }
39
+ },
40
+ [onDeleteFilterClause]
41
+ );
22
42
  const filterClauseList = filterUtils.getFilterClausesForDisplay(filter, columns);
23
43
  return /* @__PURE__ */ jsxRuntime.jsx(
24
44
  "div",
@@ -26,14 +46,29 @@ const FilterDisplay = react.forwardRef(function FilterDisplay2({ className, colu
26
46
  ...htmlAttributes,
27
47
  className: cx(classBase, className),
28
48
  ref: forwardedRef,
29
- children: filterClauseList.reduce(
30
- (list, [columnName, value]) => {
31
- list.push(
32
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-column`, children: getColumnLabel(columnName) }, list.length),
33
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-value`, children: value }, list.length + 1)
34
- );
35
- return list;
36
- },
49
+ children: filterClauseList.map(
50
+ ([columnName, value]) => /* @__PURE__ */ jsxRuntime.jsxs(
51
+ "div",
52
+ {
53
+ className: `${classBase}-filter-clause`,
54
+ "data-column-name": columnName,
55
+ children: [
56
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-column`, children: getColumnLabel(columnName) }),
57
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${classBase}-value`, children: value }),
58
+ allowDelete ? /* @__PURE__ */ jsxRuntime.jsx(
59
+ vuuUiControls.IconButton,
60
+ {
61
+ "data-embedded": true,
62
+ icon: "close",
63
+ appearance: "transparent",
64
+ sentiment: "neutral",
65
+ onClick: handleDelete
66
+ }
67
+ ) : null
68
+ ]
69
+ },
70
+ columnName
71
+ ),
37
72
  []
38
73
  )
39
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FilterDisplay.js","sources":["../../../../packages/vuu-filters/src/filter-display/FilterDisplay.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"clsx\";\nimport { ForwardedRef, forwardRef, HTMLAttributes, ReactElement } from \"react\";\nimport { getFilterClausesForDisplay } from \"../filter-utils\";\n\nimport filterDisplayCss from \"./FilterDisplay.css\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nconst classBase = \"vuuFilterDisplay\";\n\nexport interface FilterDisplayProps extends HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n filter: FilterContainerFilter | undefined;\n}\n\nconst getColumnLabel = (columnName: string, columns?: ColumnDescriptor[]) => {\n if (columns) {\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n return column.label ?? columnName;\n }\n }\n return columnName;\n};\n\nexport const FilterDisplay = forwardRef(function FilterDisplay(\n { className, columns, filter, ...htmlAttributes }: FilterDisplayProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-display\",\n css: filterDisplayCss,\n window: targetWindow,\n });\n\n const filterClauseList = getFilterClausesForDisplay(filter, columns);\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardedRef}\n >\n {filterClauseList.reduce<Array<ReactElement>>(\n (list, [columnName, value]) => {\n list.push(\n <span className={`${classBase}-column`} key={list.length}>\n {getColumnLabel(columnName)}\n </span>,\n <span className={`${classBase}-value`} key={list.length + 1}>\n {value}\n </span>,\n );\n return list;\n },\n [],\n )}\n </div>\n );\n});\n"],"names":["forwardRef","FilterDisplay","useWindow","useComponentCssInjection","filterDisplayCss","getFilterClausesForDisplay","jsx"],"mappings":";;;;;;;;;;AAUA,MAAM,SAAY,GAAA,kBAAA;AAOlB,MAAM,cAAA,GAAiB,CAAC,UAAA,EAAoB,OAAiC,KAAA;AAO3E,EAAO,OAAA,UAAA;AACT,CAAA;AAEa,MAAA,aAAA,GAAgBA,gBAAW,CAAA,SAASC,cAC/C,CAAA,EAAE,SAAW,EAAA,OAAA,EAAS,MAAQ,EAAA,GAAG,cAAe,EAAA,EAChD,YACA,EAAA;AACA,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,oBAAA;AAAA,IACR,GAAK,EAAAC,eAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,gBAAA,GAAmBC,sCAA2B,CAAA,MAAA,EAAQ,OAAO,CAAA;AACnE,EACE,uBAAAC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAiB,EAAA,gBAAA,CAAA,MAAA;AAAA,QAChB,CAAC,IAAA,EAAM,CAAC,UAAA,EAAY,KAAK,CAAM,KAAA;AAC7B,UAAK,IAAA,CAAA,IAAA;AAAA,4BACHA,cAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,WAC1B,QAAe,EAAA,cAAA,CAAA,UAAU,CADiB,EAAA,EAAA,IAAA,CAAK,MAElD,CAAA;AAAA,4BACAA,cAAA,CAAC,UAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,MAAA,CAAA,EAAA,QAAA,EAAA,KAAA,EAAA,EADyC,IAAK,CAAA,MAAA,GAAS,CAE1D;AAAA,WACF;AACA,UAAO,OAAA,IAAA;AAAA,SACT;AAAA,QACA;AAAC;AACH;AAAA,GACF;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"FilterDisplay.js","sources":["../../../../packages/vuu-filters/src/filter-display/FilterDisplay.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"clsx\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n MouseEventHandler,\n useCallback,\n} from \"react\";\nimport { getFilterClausesForDisplay } from \"../filter-utils\";\n\nimport filterDisplayCss from \"./FilterDisplay.css\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { IconButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { queryClosest } from \"@vuu-ui/vuu-utils\";\n\nconst classBase = \"vuuFilterDisplay\";\n\nexport interface FilterDisplayProps extends HTMLAttributes<HTMLDivElement> {\n allowDelete?: boolean;\n columns?: ColumnDescriptor[];\n filter: FilterContainerFilter | undefined;\n onDeleteFilterClause?: (columnName: string) => void;\n}\n\nconst getColumnLabel = (columnName: string, columns?: ColumnDescriptor[]) => {\n if (columns) {\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n return column.label ?? columnName;\n }\n }\n return columnName;\n};\n\nexport const FilterDisplay = forwardRef(function FilterDisplay(\n {\n allowDelete = false,\n className,\n columns,\n filter,\n onDeleteFilterClause,\n ...htmlAttributes\n }: FilterDisplayProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-display\",\n css: filterDisplayCss,\n window: targetWindow,\n });\n\n const handleDelete = useCallback<MouseEventHandler<HTMLButtonElement>>(\n (e) => {\n const {\n dataset: { columnName },\n } = queryClosest<HTMLDivElement>(e.target, \"[data-column-name]\", true);\n if (columnName) {\n onDeleteFilterClause?.(columnName);\n }\n },\n [onDeleteFilterClause],\n );\n\n const filterClauseList = getFilterClausesForDisplay(filter, columns);\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardedRef}\n >\n {filterClauseList.map(\n ([columnName, value]) => (\n <div\n className={`${classBase}-filter-clause`}\n key={columnName}\n data-column-name={columnName}\n >\n <span className={`${classBase}-column`}>\n {getColumnLabel(columnName)}\n </span>\n <span className={`${classBase}-value`}>{value}</span>\n {allowDelete ? (\n <IconButton\n data-embedded\n icon=\"close\"\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleDelete}\n />\n ) : null}\n </div>\n ),\n [],\n )}\n </div>\n );\n});\n"],"names":["forwardRef","FilterDisplay","useWindow","useComponentCssInjection","filterDisplayCss","useCallback","queryClosest","getFilterClausesForDisplay","jsx","jsxs","IconButton"],"mappings":";;;;;;;;;;;;AAkBA,MAAM,SAAY,GAAA,kBAAA;AASlB,MAAM,cAAA,GAAiB,CAAC,UAAA,EAAoB,OAAiC,KAAA;AAO3E,EAAO,OAAA,UAAA;AACT,CAAA;AAEa,MAAA,aAAA,GAAgBA,gBAAW,CAAA,SAASC,cAC/C,CAAA;AAAA,EACE,WAAc,GAAA,KAAA;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,oBAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,oBAAA;AAAA,IACR,GAAK,EAAAC,eAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,CAAM,KAAA;AACL,MAAM,MAAA;AAAA,QACJ,OAAA,EAAS,EAAE,UAAW;AAAA,OACpB,GAAAC,qBAAA,CAA6B,CAAE,CAAA,MAAA,EAAQ,sBAAsB,IAAI,CAAA;AACrE,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,oBAAA,GAAuB,UAAU,CAAA;AAAA;AACnC,KACF;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAM,MAAA,gBAAA,GAAmBC,sCAA2B,CAAA,MAAA,EAAQ,OAAO,CAAA;AACnE,EACE,uBAAAC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAiB,EAAA,gBAAA,CAAA,GAAA;AAAA,QAChB,CAAC,CAAC,UAAY,EAAA,KAAK,CACjB,qBAAAC,eAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,SAAS,CAAA,cAAA,CAAA;AAAA,YAEvB,kBAAkB,EAAA,UAAA;AAAA,YAElB,QAAA,EAAA;AAAA,8BAAAD,cAAA,CAAC,UAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,OAAA,CAAA,EAAA,QAAA,EAAA,cAAA,CAAe,UAAU,CAC5B,EAAA,CAAA;AAAA,6CACC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAW,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,cAC7C,WACC,mBAAAA,cAAA;AAAA,gBAACE,wBAAA;AAAA,gBAAA;AAAA,kBACC,eAAa,EAAA,IAAA;AAAA,kBACb,IAAK,EAAA,OAAA;AAAA,kBACL,UAAW,EAAA,aAAA;AAAA,kBACX,SAAU,EAAA,SAAA;AAAA,kBACV,OAAS,EAAA;AAAA;AAAA,eAET,GAAA;AAAA;AAAA,WAAA;AAAA,UAfC;AAAA,SAgBP;AAAA,QAEF;AAAC;AACH;AAAA,GACF;AAEJ,CAAC;;;;"}
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var styles = require('@salt-ds/styles');
5
+ var window = require('@salt-ds/window');
4
6
  var vuuPopups = require('@vuu-ui/vuu-popups');
5
7
  var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
6
8
  var vuuUtils = require('@vuu-ui/vuu-utils');
7
- var styles = require('@salt-ds/styles');
8
- var window = require('@salt-ds/window');
9
9
  var cx = require('clsx');
10
10
  var react = require('react');
11
- var filterAsReactNode = require('./filterAsReactNode.js');
12
11
  var FilterPillMenuOptions = require('../filter-pill-menu/FilterPillMenuOptions.js');
12
+ var filterAsReactNode = require('./filterAsReactNode.js');
13
13
  var getFilterLabel = require('./getFilterLabel.js');
14
14
  var getFilterTooltipText = require('./getFilterTooltipText.js');
15
15
  var FilterPill$1 = require('./FilterPill.css.js');
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPill.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterPill.tsx"],"sourcesContent":["import { ColumnDescriptorsByName, Filter } from \"@vuu-ui/vuu-filter-types\";\nimport {\n MenuCloseHandler,\n PopupMenuProps,\n Tooltip,\n useTooltip,\n} from \"@vuu-ui/vuu-popups\";\nimport {\n EditableLabel,\n EditableLabelProps,\n ExitEditModeHandler,\n SplitStateButton,\n SplitStateButtonProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { filterAsReactNode } from \"./filterAsReactNode\";\nimport {\n closeCommand,\n deleteCommand,\n editCommand,\n MenuOptions,\n renameCommand,\n} from \"../filter-pill-menu/FilterPillMenuOptions\";\nimport { getFilterLabel } from \"./getFilterLabel\";\nimport { getFilterAsFormattedText } from \"./getFilterTooltipText\";\n\nimport filterPillCss from \"./FilterPill.css\";\nimport { ButtonProps } from \"@salt-ds/core\";\nimport {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n} from \"@vuu-ui/vuu-context-menu\";\n\nconst classBase = \"vuuFilterPill\";\n\nexport interface FilterPillProps\n extends SplitStateButtonProps,\n Pick<\n Partial<EditableLabelProps>,\n \"editing\" | \"editLabelApiRef\" | \"onExitEditMode\"\n > {\n allowClose?: boolean;\n allowDelete?: boolean;\n allowEdit?: boolean;\n allowRename?: boolean;\n\n columnsByName?: ColumnDescriptorsByName;\n editable?: boolean;\n filter: Filter;\n index?: number;\n onBeginEdit?: (filter: Filter) => void;\n onMenuAction?: MenuActionHandler;\n}\n\nexport const FilterPill = ({\n allowClose = true,\n allowDelete = true,\n allowEdit = true,\n allowRename = true,\n className: classNameProp,\n columnsByName,\n editable = true,\n editing = false,\n editLabelApiRef,\n filter,\n id: idProp,\n onBeginEdit,\n onExitEditMode,\n onMenuAction,\n ...htmlAttributes\n}: FilterPillProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-pill\",\n css: filterPillCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const handleEnterEditMode: EditableLabelProps[\"onEnterEditMode\"] =\n useCallback(() => {\n onBeginEdit?.(filter);\n }, [filter, onBeginEdit]);\n\n const getLabel = getFilterLabel(columnsByName);\n const label = useMemo(\n () => filter.name ?? getLabel(filter),\n [getLabel, filter],\n );\n\n const getTooltipText = getFilterAsFormattedText(columnsByName);\n\n const id = useId(idProp);\n\n const handleMenuClose = useCallback<MenuCloseHandler>((reason) => {\n if (reason?.type === \"escape\") {\n requestAnimationFrame(() => {\n if (rootRef.current) {\n rootRef.current.focus();\n }\n });\n }\n }, []);\n\n const popupMenuProps = useMemo<\n Pick<\n PopupMenuProps,\n \"menuBuilder\" | \"menuActionHandler\" | \"menuOptions\" | \"onMenuClose\"\n >\n >(\n () => ({\n icon: \"more-vert\",\n menuBuilder: (_location, options) => {\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (allowRename) {\n menuItems.push(renameCommand(options as MenuOptions));\n }\n if (allowEdit) {\n menuItems.push(editCommand(options as MenuOptions));\n }\n if (allowClose) {\n menuItems.push(closeCommand(options as MenuOptions));\n }\n if (allowDelete) {\n menuItems.push(deleteCommand(options as MenuOptions));\n }\n return menuItems;\n },\n\n menuActionHandler: onMenuAction,\n menuLocation: \"filter-pill-menu\",\n menuOptions: {\n filter,\n },\n\n onMenuClose: handleMenuClose,\n }),\n [\n allowClose,\n allowDelete,\n allowEdit,\n allowRename,\n filter,\n handleMenuClose,\n onMenuAction,\n ],\n );\n\n const handleExitEditMode = useCallback<ExitEditModeHandler>(\n (originalValue, newValue) => {\n onExitEditMode?.(originalValue, newValue);\n requestAnimationFrame(() => {\n rootRef.current?.querySelector(\"button\")?.focus();\n });\n },\n [onExitEditMode],\n );\n\n const { anchorProps, hideTooltip, showTooltip, tooltipProps } = useTooltip({\n anchorQuery: \".vuuFilterPill\",\n id,\n placement: [\"above\", \"below\"],\n tooltipContent: filterAsReactNode(filter, getTooltipText),\n });\n\n const buttonProps: Partial<ButtonProps> = {\n onBlur: () => hideTooltip(),\n onFocus: useCallback<FocusEventHandler>(() => {\n showTooltip(rootRef);\n }, [showTooltip]),\n };\n\n return (\n <SplitStateButton\n {...anchorProps}\n {...htmlAttributes}\n ButtonProps={buttonProps}\n PopupMenuProps={popupMenuProps}\n className={cx(classBase, classNameProp)}\n data-text={label}\n ref={rootRef}\n >\n {editable && onExitEditMode ? (\n <EditableLabel\n defaultValue={label}\n editing={editing}\n editLabelApiRef={editLabelApiRef}\n key={label}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n />\n ) : (\n label\n )}\n {tooltipProps && (\n <Tooltip className={`${classBase}-tooltip`} {...tooltipProps} />\n )}\n </SplitStateButton>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","filterPillCss","useRef","useCallback","getFilterLabel","useMemo","getFilterAsFormattedText","useId","renameCommand","editCommand","closeCommand","deleteCommand","useTooltip","filterAsReactNode","jsxs","SplitStateButton","jsx","EditableLabel","Tooltip"],"mappings":";;;;;;;;;;;;;;;;AAqCA,MAAM,SAAY,GAAA,eAAA;AAqBX,MAAM,aAAa,CAAC;AAAA,EACzB,UAAa,GAAA,IAAA;AAAA,EACb,WAAc,GAAA,IAAA;AAAA,EACd,SAAY,GAAA,IAAA;AAAA,EACZ,WAAc,GAAA,IAAA;AAAA,EACd,SAAW,EAAA,aAAA;AAAA,EACX,aAAA;AAAA,EACA,QAAW,GAAA,IAAA;AAAA,EACX,OAAU,GAAA,KAAA;AAAA,EACV,eAAA;AAAA,EACA,MAAA;AAAA,EACA,EAAI,EAAA,MAAA;AAAA,EACJ,WAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAG;AACL,CAAuB,KAAA;AACrB,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,iBAAA;AAAA,IACR,GAAK,EAAAC,YAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,OAAA,GAAUC,aAAuB,IAAI,CAAA;AAC3C,EAAM,MAAA,mBAAA,GACJC,kBAAY,MAAM;AAChB,IAAA,WAAA,GAAc,MAAM,CAAA;AAAA,GACnB,EAAA,CAAC,MAAQ,EAAA,WAAW,CAAC,CAAA;AAE1B,EAAM,MAAA,QAAA,GAAWC,8BAAe,aAAa,CAAA;AAC7C,EAAA,MAAM,KAAQ,GAAAC,aAAA;AAAA,IACZ,MAAM,MAAA,CAAO,IAAQ,IAAA,QAAA,CAAS,MAAM,CAAA;AAAA,IACpC,CAAC,UAAU,MAAM;AAAA,GACnB;AAEA,EAAM,MAAA,cAAA,GAAiBC,8CAAyB,aAAa,CAAA;AAE7D,EAAM,MAAA,EAAA,GAAKC,eAAM,MAAM,CAAA;AAEvB,EAAM,MAAA,eAAA,GAAkBJ,iBAA8B,CAAA,CAAC,MAAW,KAAA;AAChE,IAAI,IAAA,MAAA,EAAQ,SAAS,QAAU,EAAA;AAC7B,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,UAAA,OAAA,CAAQ,QAAQ,KAAM,EAAA;AAAA;AACxB,OACD,CAAA;AAAA;AACH,GACF,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAiB,GAAAE,aAAA;AAAA,IAMrB,OAAO;AAAA,MACL,IAAM,EAAA,WAAA;AAAA,MACN,WAAA,EAAa,CAAC,SAAA,EAAW,OAAY,KAAA;AACnC,QAAA,MAAM,YAAyC,EAAC;AAChD,QAAA,IAAI,WAAa,EAAA;AACf,UAAU,SAAA,CAAA,IAAA,CAAKG,mCAAc,CAAA,OAAsB,CAAC,CAAA;AAAA;AAEtD,QAAA,IAAI,SAAW,EAAA;AACb,UAAU,SAAA,CAAA,IAAA,CAAKC,iCAAY,CAAA,OAAsB,CAAC,CAAA;AAAA;AAEpD,QAAA,IAAI,UAAY,EAAA;AACd,UAAU,SAAA,CAAA,IAAA,CAAKC,kCAAa,CAAA,OAAsB,CAAC,CAAA;AAAA;AAErD,QAAA,IAAI,WAAa,EAAA;AACf,UAAU,SAAA,CAAA,IAAA,CAAKC,mCAAc,CAAA,OAAsB,CAAC,CAAA;AAAA;AAEtD,QAAO,OAAA,SAAA;AAAA,OACT;AAAA,MAEA,iBAAmB,EAAA,YAAA;AAAA,MACnB,YAAc,EAAA,kBAAA;AAAA,MACd,WAAa,EAAA;AAAA,QACX;AAAA,OACF;AAAA,MAEA,WAAa,EAAA;AAAA,KACf,CAAA;AAAA,IACA;AAAA,MACE,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,MAAM,kBAAqB,GAAAR,iBAAA;AAAA,IACzB,CAAC,eAAe,QAAa,KAAA;AAC3B,MAAA,cAAA,GAAiB,eAAe,QAAQ,CAAA;AACxC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAA,OAAA,CAAQ,OAAS,EAAA,aAAA,CAAc,QAAQ,CAAA,EAAG,KAAM,EAAA;AAAA,OACjD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,cAAc;AAAA,GACjB;AAEA,EAAA,MAAM,EAAE,WAAa,EAAA,WAAA,EAAa,WAAa,EAAA,YAAA,KAAiBS,oBAAW,CAAA;AAAA,IACzE,WAAa,EAAA,gBAAA;AAAA,IACb,EAAA;AAAA,IACA,SAAA,EAAW,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IAC5B,cAAA,EAAgBC,mCAAkB,CAAA,MAAA,EAAQ,cAAc;AAAA,GACzD,CAAA;AAED,EAAA,MAAM,WAAoC,GAAA;AAAA,IACxC,MAAA,EAAQ,MAAM,WAAY,EAAA;AAAA,IAC1B,OAAA,EAASV,kBAA+B,MAAM;AAC5C,MAAA,WAAA,CAAY,OAAO,CAAA;AAAA,KACrB,EAAG,CAAC,WAAW,CAAC;AAAA,GAClB;AAEA,EACE,uBAAAW,eAAA;AAAA,IAACC,8BAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACH,GAAG,cAAA;AAAA,MACJ,WAAa,EAAA,WAAA;AAAA,MACb,cAAgB,EAAA,cAAA;AAAA,MAChB,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,aAAa,CAAA;AAAA,MACtC,WAAW,EAAA,KAAA;AAAA,MACX,GAAK,EAAA,OAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,QAAA,QAAA,IAAY,cACX,mBAAAC,cAAA;AAAA,UAACC,2BAAA;AAAA,UAAA;AAAA,YACC,YAAc,EAAA,KAAA;AAAA,YACd,OAAA;AAAA,YACA,eAAA;AAAA,YAEA,eAAiB,EAAA,mBAAA;AAAA,YACjB,cAAgB,EAAA;AAAA,WAAA;AAAA,UAFX;AAAA,SAKP,GAAA,KAAA;AAAA,QAED,YAAA,mCACEC,iBAAQ,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,QAAA,CAAA,EAAa,GAAG,YAAc,EAAA;AAAA;AAAA;AAAA,GAElE;AAEJ;;;;"}
1
+ {"version":3,"file":"FilterPill.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterPill.tsx"],"sourcesContent":["import { ButtonProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n} from \"@vuu-ui/vuu-context-menu\";\nimport { ColumnDescriptorsByName, Filter } from \"@vuu-ui/vuu-filter-types\";\nimport {\n MenuCloseHandler,\n PopupMenuProps,\n Tooltip,\n useTooltip,\n} from \"@vuu-ui/vuu-popups\";\nimport {\n EditableLabel,\n EditableLabelProps,\n ExitEditModeHandler,\n SplitStateButton,\n SplitStateButtonProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport {\n closeCommand,\n deleteCommand,\n editCommand,\n MenuOptions,\n renameCommand,\n} from \"../filter-pill-menu/FilterPillMenuOptions\";\nimport { filterAsReactNode } from \"./filterAsReactNode\";\nimport { getFilterLabel } from \"./getFilterLabel\";\nimport { getFilterAsFormattedText } from \"./getFilterTooltipText\";\n\nimport filterPillCss from \"./FilterPill.css\";\n\nconst classBase = \"vuuFilterPill\";\n\nexport interface FilterPillProps\n extends SplitStateButtonProps,\n Pick<\n Partial<EditableLabelProps>,\n \"editing\" | \"editLabelApiRef\" | \"onExitEditMode\"\n > {\n allowClose?: boolean;\n allowDelete?: boolean;\n allowEdit?: boolean;\n allowRename?: boolean;\n\n columnsByName?: ColumnDescriptorsByName;\n editable?: boolean;\n filter: Filter;\n index?: number;\n onBeginEdit?: (filter: Filter) => void;\n onMenuAction?: MenuActionHandler;\n}\n\nexport const FilterPill = ({\n allowClose = true,\n allowDelete = true,\n allowEdit = true,\n allowRename = true,\n className: classNameProp,\n columnsByName,\n editable = true,\n editing = false,\n editLabelApiRef,\n filter,\n id: idProp,\n onBeginEdit,\n onExitEditMode,\n onMenuAction,\n ...htmlAttributes\n}: FilterPillProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-pill\",\n css: filterPillCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const handleEnterEditMode: EditableLabelProps[\"onEnterEditMode\"] =\n useCallback(() => {\n onBeginEdit?.(filter);\n }, [filter, onBeginEdit]);\n\n const getLabel = getFilterLabel(columnsByName);\n const label = useMemo(\n () => filter.name ?? getLabel(filter),\n [getLabel, filter],\n );\n\n const getTooltipText = getFilterAsFormattedText(columnsByName);\n\n const id = useId(idProp);\n\n const handleMenuClose = useCallback<MenuCloseHandler>((reason) => {\n if (reason?.type === \"escape\") {\n requestAnimationFrame(() => {\n if (rootRef.current) {\n rootRef.current.focus();\n }\n });\n }\n }, []);\n\n const popupMenuProps = useMemo<\n Pick<\n PopupMenuProps,\n \"menuBuilder\" | \"menuActionHandler\" | \"menuOptions\" | \"onMenuClose\"\n >\n >(\n () => ({\n icon: \"more-vert\",\n menuBuilder: (_location, options) => {\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (allowRename) {\n menuItems.push(renameCommand(options as MenuOptions));\n }\n if (allowEdit) {\n menuItems.push(editCommand(options as MenuOptions));\n }\n if (allowClose) {\n menuItems.push(closeCommand(options as MenuOptions));\n }\n if (allowDelete) {\n menuItems.push(deleteCommand(options as MenuOptions));\n }\n return menuItems;\n },\n\n menuActionHandler: onMenuAction,\n menuLocation: \"filter-pill-menu\",\n menuOptions: {\n filter,\n },\n\n onMenuClose: handleMenuClose,\n }),\n [\n allowClose,\n allowDelete,\n allowEdit,\n allowRename,\n filter,\n handleMenuClose,\n onMenuAction,\n ],\n );\n\n const handleExitEditMode = useCallback<ExitEditModeHandler>(\n (originalValue, newValue) => {\n onExitEditMode?.(originalValue, newValue);\n requestAnimationFrame(() => {\n rootRef.current?.querySelector(\"button\")?.focus();\n });\n },\n [onExitEditMode],\n );\n\n const { anchorProps, hideTooltip, showTooltip, tooltipProps } = useTooltip({\n anchorQuery: \".vuuFilterPill\",\n id,\n placement: [\"above\", \"below\"],\n tooltipContent: filterAsReactNode(filter, getTooltipText),\n });\n\n const buttonProps: Partial<ButtonProps> = {\n onBlur: () => hideTooltip(),\n onFocus: useCallback<FocusEventHandler>(() => {\n showTooltip(rootRef);\n }, [showTooltip]),\n };\n\n return (\n <SplitStateButton\n {...anchorProps}\n {...htmlAttributes}\n ButtonProps={buttonProps}\n PopupMenuProps={popupMenuProps}\n className={cx(classBase, classNameProp)}\n data-text={label}\n ref={rootRef}\n >\n {editable && onExitEditMode ? (\n <EditableLabel\n defaultValue={label}\n editing={editing}\n editLabelApiRef={editLabelApiRef}\n key={label}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n />\n ) : (\n label\n )}\n {tooltipProps && (\n <Tooltip className={`${classBase}-tooltip`} {...tooltipProps} />\n )}\n </SplitStateButton>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","filterPillCss","useRef","useCallback","getFilterLabel","useMemo","getFilterAsFormattedText","useId","renameCommand","editCommand","closeCommand","deleteCommand","useTooltip","filterAsReactNode","jsxs","SplitStateButton","jsx","EditableLabel","Tooltip"],"mappings":"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"}
@@ -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 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":";;;;;;;;;;AAyBA,MAAM,gBAAA,GAAmB,CACvB,iBACG,KAAA,iBAAA,CAAkB,KAAK,CAAC,CAAA,KAAM,CAAE,CAAA,MAAM,CAAK,IAAAA,kCAAA;AAEhD,MAAM,gBAAA,GAAmB,CACvB,iBAAA,EACA,IACG,KAAA,iBAAA,CAAkB,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,MAAQ,EAAA,IAAA,KAAS,IAAI,CAAA;AAK1D,MAAM,WAAA,GAAc,CAAC,YAAiC,KAAA;AACpD,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,iBAAA,EAAmB,GAAQ,KAAA;AAC/C,IAAA,MAAA,CAAO,GAAG,CAAI,GAAA,iBAAA;AAAA,GACf,CAAA;AACD,EAAO,OAAA,MAAA;AACT,CAAA;AAQO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAc,EAAA;AAChB,CAA2B,KAAA;AACzB,EAAA,MAAM,GAAG,YAAY,CAAI,GAAAC,cAAA,CAAS,EAAE,CAAA;AACpC,EAAA,MAAM,YAAe,GAAAC,aAAA;AAAA,IACnB,MACE,gBAAmB,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,QAAQ,gBAAgB,CAAC,CAAI,mBAAA,IAAI,GAAI,EAAA;AAAA,IACzE,CAAC,gBAAgB;AAAA,GACnB;AAEA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAA8B,IAAI,CAAA;AAE9D,EAAA,MAAM,YAAe,GAAAE,iBAAA;AAAA,IACnB,CAAC,KAAa,QAAqB,KAAA;AACjC,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAA,MAAM,uBAAuB,iBAAkB,CAAA,MAAA;AAAA,UAC7C,CAAC,EAAE,EAAG,EAAA,KAAM,EAAO,KAAA;AAAA,SACrB;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAC1C,QAAA,IAAI,aAAaC,4BAAgB,EAAA;AAC/B,UAAiB,cAAA,GAAA,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA;AAC5C;AACF,KACF;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAEA,EAAA,MAAM,YAAe,GAAAD,iBAAA;AAAA,IACnB,CAAC,GAAa,EAAA,QAAA,EAAkB,IAAiB,KAAA;AAC/C,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAA,MAAM,oBAAuB,GAAAE,kCAAA;AAAA,UAC3B,iBAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAC1C,QAAiB,cAAA,GAAA,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA;AAC5C,KACF;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAEA,EAAA,MAAM,mBAAsB,GAAAF,iBAAA;AAAA,IAC1B,CAAC,GAAA,EAAa,EAAE,MAAA,EAAQ,IAA0C,KAAA;AAChE,MAAM,MAAA,kBAAA,GAAqB,QAAQ,IAAQ,IAAA,EAAA;AAC3C,MAAA,SAAA;AAAA,wBACEG,cAAA;AAAA,UAACC,iCAAA;AAAA,UAAA;AAAA,YACC,YAAY,MAAQ,EAAA,IAAA;AAAA,YACpB,KAAM,EAAA,eAAA;AAAA,YACN,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI,CAAA;AAAA,YAC7B,SAAA,EAAW,CAAC,IAAS,KAAA;AACnB,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAA,IAAI,uBAAuB,IAAM,EAAA;AAC/B,gBAAa,YAAA,CAAA,GAAA,EAAK,IAAI,IAAI,CAAA;AAAA;AAC5B;AACF;AAAA;AACF,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,6BAAgC,GAAAJ,iBAAA;AAAA,IACpC,CACE,GACA,EAAA,gBAAA,EACA,OACG,KAAA;AACH,MAAA,SAAA;AAAA,wBACEG,cAAA;AAAA,UAACE,qCAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,gBAAA;AAAA,YACA,WAAW,MAAM;AACf,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAa,YAAA,CAAA,GAAA,EAAK,iBAAiB,EAAE,CAAA;AAAA,aACvC;AAAA,YACA,OAAA,EAAS,MAAM,SAAA,CAAU,IAAI;AAAA;AAAA;AAC/B,OACF;AAAA,KACF;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,sBACJ,GAAAL,iBAAA;AAAA,IACE,CAAC,GAAA,EAAa,QAAU,EAAA,UAAA,EAAY,OAAY,KAAA;AAC9C,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAM,MAAA,YAAA,GAAeM,gCAAW,CAAA,iBAAA,EAAmB,QAAQ,CAAA;AAC3D,QAAA,QAAQ,UAAY;AAAA,UAClB,KAAK,OAAA;AACH,YAAQ,OAAA,CAAA,GAAA,CAAI,CAAgB,aAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACtC,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAQ,OAAA,CAAA,GAAA,CAAI,CAAe,YAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACrC,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,IAAI,aAAaL,4BAAgB,EAAA;AAC/B,cAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AAAA,aAC9B,MAAA;AACL,cAA8B,6BAAA,CAAA,GAAA,EAAK,cAAc,OAAO,CAAA;AAAA;AAE1D,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAO,OAAA,mBAAA,CAAoB,KAAK,YAAY,CAAA;AAAA;AAChD;AACF,KACF;AAAA,IACA,CAAC,6BAA+B,EAAA,mBAAA,EAAqB,YAAY;AAAA,GACnE;AAEF,EAAA,MAAM,gBAAmB,GAAAD,iBAAA;AAAA,IACvB,CAAC,KAAa,IAAiB,KAAA;AAC7B,MAAM,MAAA,iBAAA,GAAoB,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AAC9C,MAAA,IAAI,sBAAsB,KAAW,CAAA,EAAA;AACnC,QAAM,MAAA,KAAA,CAAM,CAAsC,mCAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA,OAC5D,MAAA;AACL,QAAM,MAAA,YAAA,GAAe,iBAAiB,iBAAiB,CAAA;AACvD,QAAI,IAAA,YAAA,CAAa,WAAW,IAAM,EAAA;AAChC,UAAA,MAAM,MAAM,8CAA8C,CAAA;AAAA;AAE5D,QAAM,MAAA,kBAAA,GAAqB,gBAAiB,CAAA,iBAAA,EAAmB,IAAI,CAAA;AAGnE,QAAA,IAAI,iBAAiB,kBAAoB,EAAA;AAEvC,UAAA;AAAA,SACF,MAAA,IAAW,uBAAuB,KAAW,CAAA,EAAA;AAG3C,UAAA,MAAM,oBAAuB,GAAA,iBAAA,CAAkB,MAE7C,CAAA,CAAC,MAAM,gBAAqB,KAAA;AAC5B,YAAA,IAAI,qBAAqB,YAAc,EAAA;AACrC,cAAA,IAAA,CAAK,IAAK,CAAA;AAAA,gBACR,MAAQ,EAAA,IAAA;AAAA,gBACR,MAAQ,EAAA,EAAE,GAAG,gBAAA,CAAiB,QAAQ,IAAK,EAAA;AAAA,gBAC3C,IAAIO,aAAK,EAAA;AAAA,gBACT;AAAA,eACkC,CAAA;AAAA,aAC3B,MAAA,IAAA,gBAAA,CAAiB,MAAQ,EAAA,IAAA,KAAS,IAAM,EAAA;AACjD,cAAA,IAAA,CAAK,KAAK,gBAAgB,CAAA;AAAA;AAE5B,YAAO,OAAA,IAAA;AAAA,WACT,EAAG,EAAE,CAAA;AACL,UAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,SACrC,MAAA;AACL,UAAA,MAAM,uBAAuB,iBAAkB,CAAA,GAAA;AAAA,YAC7C,CAAC,gBACC,KAAA,gBAAA,KAAqB,YAChB,GAAA;AAAA,cACC,MAAQ,EAAA,IAAA;AAAA,cACR,MAAQ,EAAA,EAAE,GAAG,gBAAA,CAAiB,QAAQ,IAAK,EAAA;AAAA,cAC3C,IAAIA,aAAK,EAAA;AAAA,cACT;AAAA,aAEF,GAAA;AAAA,WACR;AACA,UAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAC1C,UAAiB,cAAA,GAAA,WAAA,CAAY,YAAY,CAAC,CAAA;AAAA;AAC5C;AAEF,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,KACjB;AAAA,IACA,CAAC,gBAAgB,YAAY;AAAA,GAC/B;AAOA,EAAA,MAAM,gBAAmB,GAAAP,iBAAA;AAAA,IACvB,CAAC,KAAa,MAA2C,KAAA;AACvD,MAAA,MAAM,iBAAoB,GAAA,YAAA,CAAa,GAAI,CAAA,GAAG,KAAK,EAAC;AAEpD,MAAA,IAAI,WAAWQ,yBAAa,EAAA;AAC1B,QAAA,MAAM,oBAAuB,GAAAC,2CAAA;AAAA,UAC3B,iBAAA;AAAA,UACAZ;AAAA,SACF;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,OAC5C,MAAA,IAAW,WAAWa,0BAAc,EAAA;AAClC,QAAA,MAAM,oBAAuB,GAAAD,2CAAA;AAAA,UAC3B,iBAAA;AAAA,UACAE;AAAA,SACF;AACA,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,OAC5C,MAAA,IAAW,OAAO,MAAA,KAAW,QAAU,EAAA;AACrC,QAAM,MAAA,oBAAA,GAAuBC,oCAAe,CAAA,iBAAA,EAAmB,MAAM,CAAA;AACrE,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,iBACjC,MAAQ,EAAA;AACjB,QAAM,MAAA,oBAAA,GAAuBH,4CAAsB,iBAAmB,EAAA;AAAA,UACpE,MAAQ,EAAA,IAAA;AAAA,UACR,MAAA;AAAA,UACA,EAAI,EAAAR;AAAA,SACL,CAAA;AACD,QAAa,YAAA,CAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,OACrC,MAAA;AACL,QAAA,YAAA,CAAa,KAAKA,4BAAc,CAAA;AAAA;AAGlC,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,KACjB;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,GAC7B;AAEA,EAAA,MAAM,kBAAqB,GAAAD,iBAAA;AAAA,IACzB,CAAC,GAAgB,KAAA;AACf,MAAA,gBAAA,CAAiB,KAAKQ,yBAAW,CAAA;AAAA,KACnC;AAAA,IACA,CAAC,gBAAgB;AAAA,GACnB;AAEA,EACE,uBAAAK,eAAA;AAAA,IAACC,2BAAc,CAAA,QAAA;AAAA,IAAd;AAAA,MACC,KAAO,EAAA;AAAA,QACL,kBAAoB,EAAA,sBAAA;AAAA,QACpB,YAAA;AAAA,QACA,UAAY,EAAA,gBAAA;AAAA,QACZ,iBAAmB,EAAA,YAAA;AAAA,QACnB,kBAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH;AAEJ;;;;"}
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[]>;\nexport type SavedFilterRecord = Record<\n string,\n FilterContainerFilterDescriptor[]\n>;\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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"}
@@ -1,4 +1,4 @@
1
- import { isTextColumn, isNumericColumn } from '@vuu-ui/vuu-utils';
1
+ import { isTextColumn, isNumericColumn, isTimestampColumn } from '@vuu-ui/vuu-utils';
2
2
 
3
3
  const textOperators = [
4
4
  "=",
@@ -19,7 +19,7 @@ const numericOperators = [
19
19
  const getOperators = (column) => {
20
20
  if (isTextColumn(column)) {
21
21
  return textOperators;
22
- } else if (isNumericColumn(column)) {
22
+ } else if (isNumericColumn(column) || isTimestampColumn(column)) {
23
23
  return numericOperators;
24
24
  } else {
25
25
  throw Error("getOperators only supports text and numeric columns");
@@ -1 +1 @@
1
- {"version":3,"file":"operator-utils.js","sources":["../../../../packages/vuu-filters/src/filter-clause/operator-utils.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { isNumericColumn, isTextColumn } from \"@vuu-ui/vuu-utils\";\nimport type {\n FilterClauseOp,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nexport const textOperators: FilterClauseOp[] = [\n \"=\",\n \"in\",\n \"!=\",\n \"starts\",\n \"ends\",\n \"contains\",\n];\nexport const numericOperators: NumericFilterClauseOp[] = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n];\n\nexport const getOperators = (column: ColumnDescriptor): FilterClauseOp[] => {\n if (isTextColumn(column)) {\n return textOperators;\n } else if (isNumericColumn(column)) {\n return numericOperators;\n } else {\n throw Error(\"getOperators only supports text and numeric columns\");\n }\n};\n"],"names":[],"mappings":";;AAOO,MAAM,aAAkC,GAAA;AAAA,EAC7C,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AACO,MAAM,gBAA4C,GAAA;AAAA,EACvD,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF;AAEa,MAAA,YAAA,GAAe,CAAC,MAA+C,KAAA;AAC1E,EAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,IAAO,OAAA,aAAA;AAAA,GACT,MAAA,IAAW,eAAgB,CAAA,MAAM,CAAG,EAAA;AAClC,IAAO,OAAA,gBAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,qDAAqD,CAAA;AAAA;AAErE;;;;"}
1
+ {"version":3,"file":"operator-utils.js","sources":["../../../../packages/vuu-filters/src/filter-clause/operator-utils.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n isNumericColumn,\n isTextColumn,\n isTimestampColumn,\n} from \"@vuu-ui/vuu-utils\";\nimport type {\n FilterClauseOp,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nexport const textOperators: FilterClauseOp[] = [\n \"=\",\n \"in\",\n \"!=\",\n \"starts\",\n \"ends\",\n \"contains\",\n];\nexport const numericOperators: NumericFilterClauseOp[] = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n];\n\nexport const getOperators = (column: ColumnDescriptor): FilterClauseOp[] => {\n if (isTextColumn(column)) {\n return textOperators;\n } else if (isNumericColumn(column) || isTimestampColumn(column)) {\n return numericOperators;\n } else {\n throw Error(\"getOperators only supports text and numeric columns\");\n }\n};\n"],"names":[],"mappings":";;AAWO,MAAM,aAAkC,GAAA;AAAA,EAC7C,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AACO,MAAM,gBAA4C,GAAA;AAAA,EACvD,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF;AAEa,MAAA,YAAA,GAAe,CAAC,MAA+C,KAAA;AAC1E,EAAI,IAAA,YAAA,CAAa,MAAM,CAAG,EAAA;AACxB,IAAO,OAAA,aAAA;AAAA,aACE,eAAgB,CAAA,MAAM,CAAK,IAAA,iBAAA,CAAkB,MAAM,CAAG,EAAA;AAC/D,IAAO,OAAA,gBAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,qDAAqD,CAAA;AAAA;AAErE;;;;"}
@@ -1,4 +1,4 @@
1
- var filterDisplayCss = ".vuuFilterDisplay {\n display: grid;\n column-gap: 12px;\n grid-template-columns: auto auto;\n grid-template-rows: repeat(30px);\n padding: var(--salt-spacing-100);\n width: fit-content;\n\n .vuuFilterDisplay-column {\n white-space: no\n }\n .vuuFilterDisplay-value {\n white-space: nowrap;\n }\n}";
1
+ var filterDisplayCss = ".vuuFilterDisplay {\n display: flex;\n flex-direction: column;\n gap: var(--salt-spacing-50);\n padding: var(--vuuFilterDisplay-padding, var(--salt-spacing-200));\n width: fit-content;\n\n .vuuFilterDisplay-filter-clause {\n align-items: center;\n display: flex;\n gap: var(--salt-spacing-200);\n justify-content: space-between;\n white-space: no\n }\n\n .vuuFilterDisplay-column {\n flex: 1 1 auto;\n white-space: no\n }\n .vuuFilterDisplay-value {\n flex: 0 0 120px;\n text-align: right;\n white-space: nowrap;\n }\n}\n";
2
2
 
3
3
  export { filterDisplayCss as default };
4
4
  //# sourceMappingURL=FilterDisplay.css.js.map
@@ -1,22 +1,42 @@
1
- import { jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useComponentCssInjection } from '@salt-ds/styles';
3
3
  import { useWindow } from '@salt-ds/window';
4
4
  import cx from 'clsx';
5
- import { forwardRef } from 'react';
5
+ import { forwardRef, useCallback } from 'react';
6
6
  import { getFilterClausesForDisplay } from '../filter-utils.js';
7
7
  import filterDisplayCss from './FilterDisplay.css.js';
8
+ import { IconButton } from '@vuu-ui/vuu-ui-controls';
9
+ import { queryClosest } from '@vuu-ui/vuu-utils';
8
10
 
9
11
  const classBase = "vuuFilterDisplay";
10
12
  const getColumnLabel = (columnName, columns) => {
11
13
  return columnName;
12
14
  };
13
- const FilterDisplay = forwardRef(function FilterDisplay2({ className, columns, filter, ...htmlAttributes }, forwardedRef) {
15
+ const FilterDisplay = forwardRef(function FilterDisplay2({
16
+ allowDelete = false,
17
+ className,
18
+ columns,
19
+ filter,
20
+ onDeleteFilterClause,
21
+ ...htmlAttributes
22
+ }, forwardedRef) {
14
23
  const targetWindow = useWindow();
15
24
  useComponentCssInjection({
16
25
  testId: "vuu-filter-display",
17
26
  css: filterDisplayCss,
18
27
  window: targetWindow
19
28
  });
29
+ const handleDelete = useCallback(
30
+ (e) => {
31
+ const {
32
+ dataset: { columnName }
33
+ } = queryClosest(e.target, "[data-column-name]", true);
34
+ if (columnName) {
35
+ onDeleteFilterClause?.(columnName);
36
+ }
37
+ },
38
+ [onDeleteFilterClause]
39
+ );
20
40
  const filterClauseList = getFilterClausesForDisplay(filter, columns);
21
41
  return /* @__PURE__ */ jsx(
22
42
  "div",
@@ -24,14 +44,29 @@ const FilterDisplay = forwardRef(function FilterDisplay2({ className, columns, f
24
44
  ...htmlAttributes,
25
45
  className: cx(classBase, className),
26
46
  ref: forwardedRef,
27
- children: filterClauseList.reduce(
28
- (list, [columnName, value]) => {
29
- list.push(
30
- /* @__PURE__ */ jsx("span", { className: `${classBase}-column`, children: getColumnLabel(columnName) }, list.length),
31
- /* @__PURE__ */ jsx("span", { className: `${classBase}-value`, children: value }, list.length + 1)
32
- );
33
- return list;
34
- },
47
+ children: filterClauseList.map(
48
+ ([columnName, value]) => /* @__PURE__ */ jsxs(
49
+ "div",
50
+ {
51
+ className: `${classBase}-filter-clause`,
52
+ "data-column-name": columnName,
53
+ children: [
54
+ /* @__PURE__ */ jsx("span", { className: `${classBase}-column`, children: getColumnLabel(columnName) }),
55
+ /* @__PURE__ */ jsx("span", { className: `${classBase}-value`, children: value }),
56
+ allowDelete ? /* @__PURE__ */ jsx(
57
+ IconButton,
58
+ {
59
+ "data-embedded": true,
60
+ icon: "close",
61
+ appearance: "transparent",
62
+ sentiment: "neutral",
63
+ onClick: handleDelete
64
+ }
65
+ ) : null
66
+ ]
67
+ },
68
+ columnName
69
+ ),
35
70
  []
36
71
  )
37
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FilterDisplay.js","sources":["../../../../packages/vuu-filters/src/filter-display/FilterDisplay.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"clsx\";\nimport { ForwardedRef, forwardRef, HTMLAttributes, ReactElement } from \"react\";\nimport { getFilterClausesForDisplay } from \"../filter-utils\";\n\nimport filterDisplayCss from \"./FilterDisplay.css\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nconst classBase = \"vuuFilterDisplay\";\n\nexport interface FilterDisplayProps extends HTMLAttributes<HTMLDivElement> {\n columns?: ColumnDescriptor[];\n filter: FilterContainerFilter | undefined;\n}\n\nconst getColumnLabel = (columnName: string, columns?: ColumnDescriptor[]) => {\n if (columns) {\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n return column.label ?? columnName;\n }\n }\n return columnName;\n};\n\nexport const FilterDisplay = forwardRef(function FilterDisplay(\n { className, columns, filter, ...htmlAttributes }: FilterDisplayProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-display\",\n css: filterDisplayCss,\n window: targetWindow,\n });\n\n const filterClauseList = getFilterClausesForDisplay(filter, columns);\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardedRef}\n >\n {filterClauseList.reduce<Array<ReactElement>>(\n (list, [columnName, value]) => {\n list.push(\n <span className={`${classBase}-column`} key={list.length}>\n {getColumnLabel(columnName)}\n </span>,\n <span className={`${classBase}-value`} key={list.length + 1}>\n {value}\n </span>,\n );\n return list;\n },\n [],\n )}\n </div>\n );\n});\n"],"names":["FilterDisplay"],"mappings":";;;;;;;;AAUA,MAAM,SAAY,GAAA,kBAAA;AAOlB,MAAM,cAAA,GAAiB,CAAC,UAAA,EAAoB,OAAiC,KAAA;AAO3E,EAAO,OAAA,UAAA;AACT,CAAA;AAEa,MAAA,aAAA,GAAgB,UAAW,CAAA,SAASA,cAC/C,CAAA,EAAE,SAAW,EAAA,OAAA,EAAS,MAAQ,EAAA,GAAG,cAAe,EAAA,EAChD,YACA,EAAA;AACA,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,oBAAA;AAAA,IACR,GAAK,EAAA,gBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,gBAAA,GAAmB,0BAA2B,CAAA,MAAA,EAAQ,OAAO,CAAA;AACnE,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAiB,EAAA,gBAAA,CAAA,MAAA;AAAA,QAChB,CAAC,IAAA,EAAM,CAAC,UAAA,EAAY,KAAK,CAAM,KAAA;AAC7B,UAAK,IAAA,CAAA,IAAA;AAAA,4BACH,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,WAC1B,QAAe,EAAA,cAAA,CAAA,UAAU,CADiB,EAAA,EAAA,IAAA,CAAK,MAElD,CAAA;AAAA,4BACA,GAAA,CAAC,UAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,MAAA,CAAA,EAAA,QAAA,EAAA,KAAA,EAAA,EADyC,IAAK,CAAA,MAAA,GAAS,CAE1D;AAAA,WACF;AACA,UAAO,OAAA,IAAA;AAAA,SACT;AAAA,QACA;AAAC;AACH;AAAA,GACF;AAEJ,CAAC;;;;"}
1
+ {"version":3,"file":"FilterDisplay.js","sources":["../../../../packages/vuu-filters/src/filter-display/FilterDisplay.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { FilterContainerFilter } from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"clsx\";\nimport {\n ForwardedRef,\n forwardRef,\n HTMLAttributes,\n MouseEventHandler,\n useCallback,\n} from \"react\";\nimport { getFilterClausesForDisplay } from \"../filter-utils\";\n\nimport filterDisplayCss from \"./FilterDisplay.css\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { IconButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { queryClosest } from \"@vuu-ui/vuu-utils\";\n\nconst classBase = \"vuuFilterDisplay\";\n\nexport interface FilterDisplayProps extends HTMLAttributes<HTMLDivElement> {\n allowDelete?: boolean;\n columns?: ColumnDescriptor[];\n filter: FilterContainerFilter | undefined;\n onDeleteFilterClause?: (columnName: string) => void;\n}\n\nconst getColumnLabel = (columnName: string, columns?: ColumnDescriptor[]) => {\n if (columns) {\n const column = columns.find((c) => c.name === columnName);\n if (column) {\n return column.label ?? columnName;\n }\n }\n return columnName;\n};\n\nexport const FilterDisplay = forwardRef(function FilterDisplay(\n {\n allowDelete = false,\n className,\n columns,\n filter,\n onDeleteFilterClause,\n ...htmlAttributes\n }: FilterDisplayProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-display\",\n css: filterDisplayCss,\n window: targetWindow,\n });\n\n const handleDelete = useCallback<MouseEventHandler<HTMLButtonElement>>(\n (e) => {\n const {\n dataset: { columnName },\n } = queryClosest<HTMLDivElement>(e.target, \"[data-column-name]\", true);\n if (columnName) {\n onDeleteFilterClause?.(columnName);\n }\n },\n [onDeleteFilterClause],\n );\n\n const filterClauseList = getFilterClausesForDisplay(filter, columns);\n return (\n <div\n {...htmlAttributes}\n className={cx(classBase, className)}\n ref={forwardedRef}\n >\n {filterClauseList.map(\n ([columnName, value]) => (\n <div\n className={`${classBase}-filter-clause`}\n key={columnName}\n data-column-name={columnName}\n >\n <span className={`${classBase}-column`}>\n {getColumnLabel(columnName)}\n </span>\n <span className={`${classBase}-value`}>{value}</span>\n {allowDelete ? (\n <IconButton\n data-embedded\n icon=\"close\"\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleDelete}\n />\n ) : null}\n </div>\n ),\n [],\n )}\n </div>\n );\n});\n"],"names":["FilterDisplay"],"mappings":";;;;;;;;;;AAkBA,MAAM,SAAY,GAAA,kBAAA;AASlB,MAAM,cAAA,GAAiB,CAAC,UAAA,EAAoB,OAAiC,KAAA;AAO3E,EAAO,OAAA,UAAA;AACT,CAAA;AAEa,MAAA,aAAA,GAAgB,UAAW,CAAA,SAASA,cAC/C,CAAA;AAAA,EACE,WAAc,GAAA,KAAA;AAAA,EACd,SAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,oBAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,oBAAA;AAAA,IACR,GAAK,EAAA,gBAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,CAAM,KAAA;AACL,MAAM,MAAA;AAAA,QACJ,OAAA,EAAS,EAAE,UAAW;AAAA,OACpB,GAAA,YAAA,CAA6B,CAAE,CAAA,MAAA,EAAQ,sBAAsB,IAAI,CAAA;AACrE,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,oBAAA,GAAuB,UAAU,CAAA;AAAA;AACnC,KACF;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAM,MAAA,gBAAA,GAAmB,0BAA2B,CAAA,MAAA,EAAQ,OAAO,CAAA;AACnE,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,cAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAClC,GAAK,EAAA,YAAA;AAAA,MAEJ,QAAiB,EAAA,gBAAA,CAAA,GAAA;AAAA,QAChB,CAAC,CAAC,UAAY,EAAA,KAAK,CACjB,qBAAA,IAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,SAAS,CAAA,cAAA,CAAA;AAAA,YAEvB,kBAAkB,EAAA,UAAA;AAAA,YAElB,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,UAAK,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,OAAA,CAAA,EAAA,QAAA,EAAA,cAAA,CAAe,UAAU,CAC5B,EAAA,CAAA;AAAA,kCACC,MAAK,EAAA,EAAA,SAAA,EAAW,CAAG,EAAA,SAAS,UAAW,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,cAC7C,WACC,mBAAA,GAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,eAAa,EAAA,IAAA;AAAA,kBACb,IAAK,EAAA,OAAA;AAAA,kBACL,UAAW,EAAA,aAAA;AAAA,kBACX,SAAU,EAAA,SAAA;AAAA,kBACV,OAAS,EAAA;AAAA;AAAA,eAET,GAAA;AAAA;AAAA,WAAA;AAAA,UAfC;AAAA,SAgBP;AAAA,QAEF;AAAC;AACH;AAAA,GACF;AAEJ,CAAC;;;;"}
@@ -1,13 +1,13 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { useComponentCssInjection } from '@salt-ds/styles';
3
+ import { useWindow } from '@salt-ds/window';
2
4
  import { useTooltip, Tooltip } from '@vuu-ui/vuu-popups';
3
5
  import { SplitStateButton, EditableLabel } from '@vuu-ui/vuu-ui-controls';
4
6
  import { useId } from '@vuu-ui/vuu-utils';
5
- import { useComponentCssInjection } from '@salt-ds/styles';
6
- import { useWindow } from '@salt-ds/window';
7
7
  import cx from 'clsx';
8
8
  import { useRef, useCallback, useMemo } from 'react';
9
- import { filterAsReactNode } from './filterAsReactNode.js';
10
9
  import { renameCommand, editCommand, closeCommand, deleteCommand } from '../filter-pill-menu/FilterPillMenuOptions.js';
10
+ import { filterAsReactNode } from './filterAsReactNode.js';
11
11
  import { getFilterLabel } from './getFilterLabel.js';
12
12
  import { getFilterAsFormattedText } from './getFilterTooltipText.js';
13
13
  import filterPillCss from './FilterPill.css.js';
@@ -1 +1 @@
1
- {"version":3,"file":"FilterPill.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterPill.tsx"],"sourcesContent":["import { ColumnDescriptorsByName, Filter } from \"@vuu-ui/vuu-filter-types\";\nimport {\n MenuCloseHandler,\n PopupMenuProps,\n Tooltip,\n useTooltip,\n} from \"@vuu-ui/vuu-popups\";\nimport {\n EditableLabel,\n EditableLabelProps,\n ExitEditModeHandler,\n SplitStateButton,\n SplitStateButtonProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport { filterAsReactNode } from \"./filterAsReactNode\";\nimport {\n closeCommand,\n deleteCommand,\n editCommand,\n MenuOptions,\n renameCommand,\n} from \"../filter-pill-menu/FilterPillMenuOptions\";\nimport { getFilterLabel } from \"./getFilterLabel\";\nimport { getFilterAsFormattedText } from \"./getFilterTooltipText\";\n\nimport filterPillCss from \"./FilterPill.css\";\nimport { ButtonProps } from \"@salt-ds/core\";\nimport {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n} from \"@vuu-ui/vuu-context-menu\";\n\nconst classBase = \"vuuFilterPill\";\n\nexport interface FilterPillProps\n extends SplitStateButtonProps,\n Pick<\n Partial<EditableLabelProps>,\n \"editing\" | \"editLabelApiRef\" | \"onExitEditMode\"\n > {\n allowClose?: boolean;\n allowDelete?: boolean;\n allowEdit?: boolean;\n allowRename?: boolean;\n\n columnsByName?: ColumnDescriptorsByName;\n editable?: boolean;\n filter: Filter;\n index?: number;\n onBeginEdit?: (filter: Filter) => void;\n onMenuAction?: MenuActionHandler;\n}\n\nexport const FilterPill = ({\n allowClose = true,\n allowDelete = true,\n allowEdit = true,\n allowRename = true,\n className: classNameProp,\n columnsByName,\n editable = true,\n editing = false,\n editLabelApiRef,\n filter,\n id: idProp,\n onBeginEdit,\n onExitEditMode,\n onMenuAction,\n ...htmlAttributes\n}: FilterPillProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-pill\",\n css: filterPillCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const handleEnterEditMode: EditableLabelProps[\"onEnterEditMode\"] =\n useCallback(() => {\n onBeginEdit?.(filter);\n }, [filter, onBeginEdit]);\n\n const getLabel = getFilterLabel(columnsByName);\n const label = useMemo(\n () => filter.name ?? getLabel(filter),\n [getLabel, filter],\n );\n\n const getTooltipText = getFilterAsFormattedText(columnsByName);\n\n const id = useId(idProp);\n\n const handleMenuClose = useCallback<MenuCloseHandler>((reason) => {\n if (reason?.type === \"escape\") {\n requestAnimationFrame(() => {\n if (rootRef.current) {\n rootRef.current.focus();\n }\n });\n }\n }, []);\n\n const popupMenuProps = useMemo<\n Pick<\n PopupMenuProps,\n \"menuBuilder\" | \"menuActionHandler\" | \"menuOptions\" | \"onMenuClose\"\n >\n >(\n () => ({\n icon: \"more-vert\",\n menuBuilder: (_location, options) => {\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (allowRename) {\n menuItems.push(renameCommand(options as MenuOptions));\n }\n if (allowEdit) {\n menuItems.push(editCommand(options as MenuOptions));\n }\n if (allowClose) {\n menuItems.push(closeCommand(options as MenuOptions));\n }\n if (allowDelete) {\n menuItems.push(deleteCommand(options as MenuOptions));\n }\n return menuItems;\n },\n\n menuActionHandler: onMenuAction,\n menuLocation: \"filter-pill-menu\",\n menuOptions: {\n filter,\n },\n\n onMenuClose: handleMenuClose,\n }),\n [\n allowClose,\n allowDelete,\n allowEdit,\n allowRename,\n filter,\n handleMenuClose,\n onMenuAction,\n ],\n );\n\n const handleExitEditMode = useCallback<ExitEditModeHandler>(\n (originalValue, newValue) => {\n onExitEditMode?.(originalValue, newValue);\n requestAnimationFrame(() => {\n rootRef.current?.querySelector(\"button\")?.focus();\n });\n },\n [onExitEditMode],\n );\n\n const { anchorProps, hideTooltip, showTooltip, tooltipProps } = useTooltip({\n anchorQuery: \".vuuFilterPill\",\n id,\n placement: [\"above\", \"below\"],\n tooltipContent: filterAsReactNode(filter, getTooltipText),\n });\n\n const buttonProps: Partial<ButtonProps> = {\n onBlur: () => hideTooltip(),\n onFocus: useCallback<FocusEventHandler>(() => {\n showTooltip(rootRef);\n }, [showTooltip]),\n };\n\n return (\n <SplitStateButton\n {...anchorProps}\n {...htmlAttributes}\n ButtonProps={buttonProps}\n PopupMenuProps={popupMenuProps}\n className={cx(classBase, classNameProp)}\n data-text={label}\n ref={rootRef}\n >\n {editable && onExitEditMode ? (\n <EditableLabel\n defaultValue={label}\n editing={editing}\n editLabelApiRef={editLabelApiRef}\n key={label}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n />\n ) : (\n label\n )}\n {tooltipProps && (\n <Tooltip className={`${classBase}-tooltip`} {...tooltipProps} />\n )}\n </SplitStateButton>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FilterPill.js","sources":["../../../../packages/vuu-filters/src/filter-pill/FilterPill.tsx"],"sourcesContent":["import { ButtonProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n} from \"@vuu-ui/vuu-context-menu\";\nimport { ColumnDescriptorsByName, Filter } from \"@vuu-ui/vuu-filter-types\";\nimport {\n MenuCloseHandler,\n PopupMenuProps,\n Tooltip,\n useTooltip,\n} from \"@vuu-ui/vuu-popups\";\nimport {\n EditableLabel,\n EditableLabelProps,\n ExitEditModeHandler,\n SplitStateButton,\n SplitStateButtonProps,\n} from \"@vuu-ui/vuu-ui-controls\";\nimport { useId } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { FocusEventHandler, useCallback, useMemo, useRef } from \"react\";\nimport {\n closeCommand,\n deleteCommand,\n editCommand,\n MenuOptions,\n renameCommand,\n} from \"../filter-pill-menu/FilterPillMenuOptions\";\nimport { filterAsReactNode } from \"./filterAsReactNode\";\nimport { getFilterLabel } from \"./getFilterLabel\";\nimport { getFilterAsFormattedText } from \"./getFilterTooltipText\";\n\nimport filterPillCss from \"./FilterPill.css\";\n\nconst classBase = \"vuuFilterPill\";\n\nexport interface FilterPillProps\n extends SplitStateButtonProps,\n Pick<\n Partial<EditableLabelProps>,\n \"editing\" | \"editLabelApiRef\" | \"onExitEditMode\"\n > {\n allowClose?: boolean;\n allowDelete?: boolean;\n allowEdit?: boolean;\n allowRename?: boolean;\n\n columnsByName?: ColumnDescriptorsByName;\n editable?: boolean;\n filter: Filter;\n index?: number;\n onBeginEdit?: (filter: Filter) => void;\n onMenuAction?: MenuActionHandler;\n}\n\nexport const FilterPill = ({\n allowClose = true,\n allowDelete = true,\n allowEdit = true,\n allowRename = true,\n className: classNameProp,\n columnsByName,\n editable = true,\n editing = false,\n editLabelApiRef,\n filter,\n id: idProp,\n onBeginEdit,\n onExitEditMode,\n onMenuAction,\n ...htmlAttributes\n}: FilterPillProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-pill\",\n css: filterPillCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const handleEnterEditMode: EditableLabelProps[\"onEnterEditMode\"] =\n useCallback(() => {\n onBeginEdit?.(filter);\n }, [filter, onBeginEdit]);\n\n const getLabel = getFilterLabel(columnsByName);\n const label = useMemo(\n () => filter.name ?? getLabel(filter),\n [getLabel, filter],\n );\n\n const getTooltipText = getFilterAsFormattedText(columnsByName);\n\n const id = useId(idProp);\n\n const handleMenuClose = useCallback<MenuCloseHandler>((reason) => {\n if (reason?.type === \"escape\") {\n requestAnimationFrame(() => {\n if (rootRef.current) {\n rootRef.current.focus();\n }\n });\n }\n }, []);\n\n const popupMenuProps = useMemo<\n Pick<\n PopupMenuProps,\n \"menuBuilder\" | \"menuActionHandler\" | \"menuOptions\" | \"onMenuClose\"\n >\n >(\n () => ({\n icon: \"more-vert\",\n menuBuilder: (_location, options) => {\n const menuItems: ContextMenuItemDescriptor[] = [];\n if (allowRename) {\n menuItems.push(renameCommand(options as MenuOptions));\n }\n if (allowEdit) {\n menuItems.push(editCommand(options as MenuOptions));\n }\n if (allowClose) {\n menuItems.push(closeCommand(options as MenuOptions));\n }\n if (allowDelete) {\n menuItems.push(deleteCommand(options as MenuOptions));\n }\n return menuItems;\n },\n\n menuActionHandler: onMenuAction,\n menuLocation: \"filter-pill-menu\",\n menuOptions: {\n filter,\n },\n\n onMenuClose: handleMenuClose,\n }),\n [\n allowClose,\n allowDelete,\n allowEdit,\n allowRename,\n filter,\n handleMenuClose,\n onMenuAction,\n ],\n );\n\n const handleExitEditMode = useCallback<ExitEditModeHandler>(\n (originalValue, newValue) => {\n onExitEditMode?.(originalValue, newValue);\n requestAnimationFrame(() => {\n rootRef.current?.querySelector(\"button\")?.focus();\n });\n },\n [onExitEditMode],\n );\n\n const { anchorProps, hideTooltip, showTooltip, tooltipProps } = useTooltip({\n anchorQuery: \".vuuFilterPill\",\n id,\n placement: [\"above\", \"below\"],\n tooltipContent: filterAsReactNode(filter, getTooltipText),\n });\n\n const buttonProps: Partial<ButtonProps> = {\n onBlur: () => hideTooltip(),\n onFocus: useCallback<FocusEventHandler>(() => {\n showTooltip(rootRef);\n }, [showTooltip]),\n };\n\n return (\n <SplitStateButton\n {...anchorProps}\n {...htmlAttributes}\n ButtonProps={buttonProps}\n PopupMenuProps={popupMenuProps}\n className={cx(classBase, classNameProp)}\n data-text={label}\n ref={rootRef}\n >\n {editable && onExitEditMode ? (\n <EditableLabel\n defaultValue={label}\n editing={editing}\n editLabelApiRef={editLabelApiRef}\n key={label}\n onEnterEditMode={handleEnterEditMode}\n onExitEditMode={handleExitEditMode}\n />\n ) : (\n label\n )}\n {tooltipProps && (\n <Tooltip className={`${classBase}-tooltip`} {...tooltipProps} />\n )}\n </SplitStateButton>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -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 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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"}
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[]>;\nexport type SavedFilterRecord = Record<\n string,\n FilterContainerFilterDescriptor[]\n>;\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/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
- "version": "0.13.88",
2
+ "version": "0.13.89",
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.88",
8
- "@vuu-ui/vuu-protocol-types": "0.13.88",
9
- "@vuu-ui/vuu-table-types": "0.13.88",
10
- "@vuu-ui/vuu-filter-types": "0.13.88"
7
+ "@vuu-ui/vuu-data-types": "0.13.89",
8
+ "@vuu-ui/vuu-protocol-types": "0.13.89",
9
+ "@vuu-ui/vuu-table-types": "0.13.89",
10
+ "@vuu-ui/vuu-filter-types": "0.13.89"
11
11
  },
12
12
  "dependencies": {
13
- "@vuu-ui/vuu-context-menu": "0.13.88",
14
- "@vuu-ui/vuu-data-react": "0.13.88",
15
- "@vuu-ui/vuu-filter-parser": "0.13.88",
16
- "@vuu-ui/vuu-popups": "0.13.88",
17
- "@vuu-ui/vuu-ui-controls": "0.13.88",
18
- "@vuu-ui/vuu-table": "0.13.88",
19
- "@vuu-ui/vuu-utils": "0.13.88",
13
+ "@vuu-ui/vuu-context-menu": "0.13.89",
14
+ "@vuu-ui/vuu-data-react": "0.13.89",
15
+ "@vuu-ui/vuu-filter-parser": "0.13.89",
16
+ "@vuu-ui/vuu-popups": "0.13.89",
17
+ "@vuu-ui/vuu-ui-controls": "0.13.89",
18
+ "@vuu-ui/vuu-table": "0.13.89",
19
+ "@vuu-ui/vuu-utils": "0.13.89",
20
20
  "@salt-ds/core": "1.48.0",
21
21
  "@salt-ds/lab": "1.0.0-alpha.76",
22
22
  "@salt-ds/styles": "0.2.1",
@@ -2,7 +2,9 @@ import { FilterContainerFilter } from "@vuu-ui/vuu-filter-types";
2
2
  import { HTMLAttributes } from "react";
3
3
  import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
4
4
  export interface FilterDisplayProps extends HTMLAttributes<HTMLDivElement> {
5
+ allowDelete?: boolean;
5
6
  columns?: ColumnDescriptor[];
6
7
  filter: FilterContainerFilter | undefined;
8
+ onDeleteFilterClause?: (columnName: string) => void;
7
9
  }
8
10
  export declare const FilterDisplay: import("react").ForwardRefExoticComponent<FilterDisplayProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,6 +1,6 @@
1
+ import { MenuActionHandler } from "@vuu-ui/vuu-context-menu";
1
2
  import { ColumnDescriptorsByName, Filter } from "@vuu-ui/vuu-filter-types";
2
3
  import { EditableLabelProps, SplitStateButtonProps } from "@vuu-ui/vuu-ui-controls";
3
- import { MenuActionHandler } from "@vuu-ui/vuu-context-menu";
4
4
  export interface FilterPillProps extends SplitStateButtonProps, Pick<Partial<EditableLabelProps>, "editing" | "editLabelApiRef" | "onExitEditMode"> {
5
5
  allowClose?: boolean;
6
6
  allowDelete?: boolean;
@@ -1,10 +1,9 @@
1
1
  import { FilterContainerFilterDescriptor } from "@vuu-ui/vuu-filter-types";
2
2
  import { ReactNode } from "react";
3
- type SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;
3
+ export type SavedFilterRecord = Record<string, FilterContainerFilterDescriptor[]>;
4
4
  export interface FilterProviderProps {
5
5
  children: ReactNode;
6
6
  onFiltersSaved?: (savedFilters: SavedFilterRecord) => void;
7
7
  savedFilters?: SavedFilterRecord;
8
8
  }
9
9
  export declare const FilterProvider: ({ children, onFiltersSaved, savedFilters: savedFiltersProp, }: FilterProviderProps) => import("react/jsx-runtime").JSX.Element;
10
- export {};
@@ -0,0 +1,9 @@
1
+ import { FilterContainerFilterDescriptor } from "@vuu-ui/vuu-filter-types";
2
+ import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
3
+ export declare const countFilterClauses: ({ filter, }: FilterContainerFilterDescriptor) => number;
4
+ export interface FilterToggleButtonProps {
5
+ columns: ColumnDescriptor[];
6
+ filterProviderKey?: string;
7
+ onToggle: () => void;
8
+ }
9
+ export declare const FilterToggleButton: ({ columns, filterProviderKey, onToggle, }: FilterToggleButtonProps) => import("react/jsx-runtime").JSX.Element;