@vuu-ui/vuu-filters 0.13.32 → 0.13.34

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.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n border-radius: 6px;\n max-width: 200px;\n\n\n .vuuColumnFilter-rangeHigh {\n position: relative;\n }\n\n .vuuColumnFilter-rangeHigh::before {\n content: \"\";\n width: 1px;\n position: absolute;\n background: var(--salt-separable-primary-borderColor);\n /* Accomodate button border */\n left: 0;\n top: calc(-1 * var(--salt-spacing-100));\n bottom: calc(-1 * var(--salt-spacing-100));\n }\n\n}\n\n.vuuColumnFilter-trigger {\n --saltButton-borderRadius: 4px 0px 0px 4px;\n --saltButton-padding: var(--salt-spacing-200);\n}\n";
3
+ var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n width: var(--vuuColumnFilter-width, fit-content);\n\n\n .vuuColumnFilter-rangeHigh {\n position: relative;\n }\n\n .vuuColumnFilter-rangeHigh::before {\n content: \"\";\n width: 1px;\n position: absolute;\n background: var(--salt-separable-primary-borderColor);\n /* Accomodate button border */\n left: calc(-1 * var(--salt-spacing-100));\n top: -1px;\n bottom: -1px;\n }\n\n .vuuTimePicker {\n border-radius: 6px;\n }\n\n .vuuTimePicker + .vuuTimePicker {\n margin-left: var(--salt-spacing-100);\n }\n\n .vuuTimeInput {\n border: none;\n outline: none;\n }\n\n .vuuTimeInput:focus-visible {\n outline: none;\n }\n\n}\n\n.vuuColumnFilter-trigger {\n --saltButton-borderRadius: 4px 0px 0px 4px;\n --saltButton-padding: var(--salt-spacing-200);\n}\n";
4
4
 
5
5
  module.exports = columnFilterCss;
6
6
  //# sourceMappingURL=ColumnFilter.css.js.map
@@ -11,33 +11,51 @@ var react = require('react');
11
11
  var useColumnFilter = require('./useColumnFilter.js');
12
12
 
13
13
  const classBase = "vuuColumnFilter";
14
- const ColumnFilter = ({
14
+ const ColumnFilter = react.forwardRef(function ColumnFilter2({
15
15
  column,
16
16
  className,
17
17
  operator = "=",
18
18
  showOperatorPicker = false,
19
19
  table,
20
20
  value,
21
+ onFilterChange,
21
22
  ...buttonGroupProps
22
- }) => {
23
+ }, forwardRef2) {
23
24
  const targetWindow = window.useWindow();
24
25
  styles.useComponentCssInjection({
25
- testId: "vuu-filter-bar",
26
+ testId: "vuu-column-filter",
26
27
  css: ColumnFilter$1,
27
28
  window: targetWindow
28
29
  });
30
+ const {
31
+ op,
32
+ allowedOperators,
33
+ filterValue,
34
+ inputProps,
35
+ rangeInputProps,
36
+ handleOperatorChange,
37
+ handleCommit,
38
+ handleRangeCommit
39
+ } = useColumnFilter.useColumnFilter({
40
+ operator,
41
+ column,
42
+ value,
43
+ onFilterChange
44
+ });
45
+ react.useMemo(
46
+ () => useColumnFilter.assertValidOperator(allowedOperators, column, operator),
47
+ [column, operator, allowedOperators]
48
+ );
29
49
  react.useMemo(
30
- () => useColumnFilter.assertValidValue(column, operator, value),
31
- [column, operator, value]
50
+ () => useColumnFilter.assertValidValue(column, op, filterValue),
51
+ [column, op, filterValue]
32
52
  );
33
- const onCommit = react.useCallback((e, value2) => {
34
- console.log(`onCommit ${value2}`);
35
- }, []);
36
53
  return /* @__PURE__ */ jsxRuntime.jsxs(
37
54
  core.SegmentedButtonGroup,
38
55
  {
39
56
  ...buttonGroupProps,
40
57
  className: cx(classBase, className),
58
+ ref: forwardRef2,
41
59
  children: [
42
60
  showOperatorPicker ? /* @__PURE__ */ jsxRuntime.jsxs(core.Menu, { placement: "bottom-start", children: [
43
61
  /* @__PURE__ */ jsxRuntime.jsx(core.MenuTrigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -48,34 +66,35 @@ const ColumnFilter = ({
48
66
  className: `${classBase}-trigger`,
49
67
  "data-embedded": true,
50
68
  sentiment: "neutral",
51
- children: operator
69
+ children: op
52
70
  }
53
71
  ) }),
54
- /* @__PURE__ */ jsxRuntime.jsxs(core.MenuPanel, { children: [
55
- /* @__PURE__ */ jsxRuntime.jsx(core.MenuItem, { children: "=" }),
56
- /* @__PURE__ */ jsxRuntime.jsx(core.MenuItem, { children: "!=" }),
57
- /* @__PURE__ */ jsxRuntime.jsx(core.MenuItem, { children: "starts" }),
58
- /* @__PURE__ */ jsxRuntime.jsx(core.MenuItem, { children: "ends" }),
59
- /* @__PURE__ */ jsxRuntime.jsx(core.MenuItem, { children: "contains" })
60
- ] })
72
+ /* @__PURE__ */ jsxRuntime.jsx(core.MenuPanel, { children: allowedOperators.map((allowedOp) => /* @__PURE__ */ jsxRuntime.jsx(
73
+ core.MenuItem,
74
+ {
75
+ onClick: () => handleOperatorChange(allowedOp),
76
+ children: allowedOp
77
+ },
78
+ `allowedOp`
79
+ )) })
61
80
  ] }) : null,
62
81
  vuuDataReact.getDataItemEditControl({
82
+ InputProps: { inputProps },
63
83
  dataDescriptor: column,
64
- defaultValue: Array.isArray(value) ? value[0] : value,
65
- onCommit,
84
+ onCommit: handleCommit,
66
85
  table
67
86
  }),
68
- operator === "between" ? vuuDataReact.getDataItemEditControl({
87
+ op === "between" ? vuuDataReact.getDataItemEditControl({
69
88
  className: `${classBase}-rangeHigh`,
89
+ InputProps: { inputProps: rangeInputProps },
70
90
  dataDescriptor: column,
71
- defaultValue: Array.isArray(value) ? value[1] : void 0,
72
- onCommit,
91
+ onCommit: handleRangeCommit,
73
92
  table
74
93
  }) : null
75
94
  ]
76
95
  }
77
96
  );
78
- };
97
+ });
79
98
 
80
99
  exports.ColumnFilter = ColumnFilter;
81
100
  //# sourceMappingURL=ColumnFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { useCallback, useMemo } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n assertValidValue,\n ColumnFilterHookProps,\n FilterValue,\n} from \"./useColumnFilter\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends ColumnFilterHookProps,\n SegmentedButtonGroupProps {\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n\n /**\n * Initial filter value. Pair of values expewcted when operator is\n * 'between'\n */\n value?: FilterValue | [FilterValue, FilterValue];\n}\n\nexport const ColumnFilter = ({\n column,\n className,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n ...buttonGroupProps\n}: ColumnFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-bar\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n useMemo(\n () => assertValidValue(column, operator, value),\n [column, operator, value],\n );\n\n const onCommit = useCallback<CommitHandler<HTMLElement>>((e, value) => {\n console.log(`onCommit ${value}`);\n }, []);\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {operator}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n <MenuItem>=</MenuItem>\n <MenuItem>!=</MenuItem>\n <MenuItem>starts</MenuItem>\n <MenuItem>ends</MenuItem>\n <MenuItem>contains</MenuItem>\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n dataDescriptor: column,\n defaultValue: Array.isArray(value)\n ? (value[0] as string)\n : (value as string),\n onCommit,\n table,\n })}\n {operator === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n dataDescriptor: column,\n defaultValue: Array.isArray(value)\n ? (value[1] as string)\n : undefined,\n onCommit,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","columnFilterCss","useMemo","assertValidValue","useCallback","value","jsxs","SegmentedButtonGroup","Menu","jsx","MenuTrigger","Button","MenuPanel","MenuItem","getDataItemEditControl"],"mappings":";;;;;;;;;;;;AAwBA,MAAM,SAAY,GAAA,iBAAA;AAkBX,MAAM,eAAe,CAAC;AAAA,EAC3B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAW,GAAA,GAAA;AAAA,EACX,kBAAqB,GAAA,KAAA;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAyB,KAAA;AACvB,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAAC,cAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAAC,aAAA;AAAA,IACE,MAAMC,gCAAA,CAAiB,MAAQ,EAAA,QAAA,EAAU,KAAK,CAAA;AAAA,IAC9C,CAAC,MAAQ,EAAA,QAAA,EAAU,KAAK;AAAA,GAC1B;AAEA,EAAA,MAAM,QAAW,GAAAC,iBAAA,CAAwC,CAAC,CAAA,EAAGC,MAAU,KAAA;AACrE,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAYA,SAAAA,EAAAA,MAAK,CAAE,CAAA,CAAA;AAAA,GACjC,EAAG,EAAE,CAAA;AAEL,EACE,uBAAAC,eAAA;AAAA,IAACC,yBAAA;AAAA,IAAA;AAAA,MACE,GAAG,gBAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAEjC,QAAA,EAAA;AAAA,QACC,kBAAA,mBAAAD,eAAA,CAACE,SAAK,EAAA,EAAA,SAAA,EAAU,cACd,EAAA,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACC,gBACC,EAAA,EAAA,QAAA,kBAAAD,cAAA;AAAA,YAACE,WAAA;AAAA,YAAA;AAAA,cACC,UAAW,EAAA,OAAA;AAAA,cACX,YAAW,EAAA,WAAA;AAAA,cACX,SAAA,EAAW,GAAG,SAAS,CAAA,QAAA,CAAA;AAAA,cACvB,eAAa,EAAA,IAAA;AAAA,cACb,SAAU,EAAA,SAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WAEL,EAAA,CAAA;AAAA,0CACCC,cACC,EAAA,EAAA,QAAA,EAAA;AAAA,4BAAAH,cAAA,CAACI,iBAAS,QAAC,EAAA,GAAA,EAAA,CAAA;AAAA,4BACXJ,cAAA,CAACI,iBAAS,QAAE,EAAA,IAAA,EAAA,CAAA;AAAA,4BACZJ,cAAA,CAACI,iBAAS,QAAM,EAAA,QAAA,EAAA,CAAA;AAAA,4BAChBJ,cAAA,CAACI,iBAAS,QAAI,EAAA,MAAA,EAAA,CAAA;AAAA,4BACdJ,cAAA,CAACI,iBAAS,QAAQ,EAAA,UAAA,EAAA;AAAA,WACpB,EAAA;AAAA,SAAA,EACF,CACE,GAAA,IAAA;AAAA,QACHC,mCAAuB,CAAA;AAAA,UACtB,cAAgB,EAAA,MAAA;AAAA,UAChB,cAAc,KAAM,CAAA,OAAA,CAAQ,KAAK,CAC5B,GAAA,KAAA,CAAM,CAAC,CACP,GAAA,KAAA;AAAA,UACL,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACA,QAAA,KAAa,YACVA,mCAAuB,CAAA;AAAA,UACrB,SAAA,EAAW,GAAG,SAAS,CAAA,UAAA,CAAA;AAAA,UACvB,cAAgB,EAAA,MAAA;AAAA,UAChB,cAAc,KAAM,CAAA,OAAA,CAAQ,KAAK,CAC5B,GAAA,KAAA,CAAM,CAAC,CACR,GAAA,KAAA,CAAA;AAAA,UACJ,QAAA;AAAA,UACA;AAAA,SACD,CACD,GAAA;AAAA;AAAA;AAAA,GACN;AAEJ;;;;"}
1
+ {"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, ReactElement, useMemo } from \"react\";\nimport {\n assertValidOperator,\n assertValidValue,\n ColumnFilterHookProps,\n useColumnFilter,\n} from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n Pick<\n ColumnFilterHookProps,\n \"column\" | \"operator\" | \"value\" | \"onFilterChange\"\n > {\n /**\n * Display operator picker.\n */\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n}\n\nexport const ColumnFilter = forwardRef(function ColumnFilter(\n {\n column,\n className,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onFilterChange,\n ...buttonGroupProps\n }: ColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-column-filter\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n const {\n op,\n allowedOperators,\n filterValue,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n handleCommit,\n handleRangeCommit,\n } = useColumnFilter({\n operator,\n column,\n value,\n onFilterChange,\n });\n\n useMemo(\n () => assertValidOperator(allowedOperators, column, operator),\n [column, operator, allowedOperators],\n );\n\n useMemo(\n () => assertValidValue(column, op, filterValue),\n [column, op, filterValue],\n );\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {op}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n {allowedOperators.map((allowedOp) => (\n <MenuItem\n key={`allowedOp`}\n onClick={() => handleOperatorChange(allowedOp)}\n >\n {allowedOp}\n </MenuItem>\n ))}\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n InputProps: { inputProps },\n dataDescriptor: column,\n onCommit: handleCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: handleRangeCommit,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n}) as (\n props: ColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<ColumnFilterProps>;\n"],"names":["forwardRef","ColumnFilter","useWindow","useComponentCssInjection","columnFilterCss","useColumnFilter","useMemo","assertValidOperator","assertValidValue","jsxs","SegmentedButtonGroup","Menu","jsx","MenuTrigger","Button","MenuPanel","MenuItem","getDataItemEditControl"],"mappings":"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"}
@@ -1,5 +1,16 @@
1
1
  'use strict';
2
2
 
3
+ var react = require('react');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var operatorUtils = require('../filter-clause/operator-utils.js');
6
+
7
+ const assertValidOperator = (allowedOperators, column, op) => {
8
+ if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {
9
+ console.warn(
10
+ `[useColumnFilter] '${op} not supported for column ${column.name}'`
11
+ );
12
+ }
13
+ };
3
14
  const assertValidValue = ({ serverDataType: _ }, operator, value) => {
4
15
  if (value !== void 0) {
5
16
  if (operator === "between") {
@@ -9,9 +20,9 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
9
20
  );
10
21
  } else if (value.length !== 2) {
11
22
  throw Error(
12
- `[useColumnFilter] 'between operator requires two values, received ${value.length}'`
23
+ `[useColumnFilter] 'between operator requires two values, received ${value}'`
13
24
  );
14
- } else if (typeof value[0] !== typeof value[1]) {
25
+ } else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {
15
26
  throw Error(
16
27
  `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`
17
28
  );
@@ -19,6 +30,104 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
19
30
  }
20
31
  }
21
32
  };
33
+ const useColumnFilter = ({
34
+ operator = "=",
35
+ value,
36
+ column,
37
+ onFilterChange
38
+ }) => {
39
+ const getDefaultValue = (op2) => op2 === "between" ? ["", ""] : "";
40
+ const filterValue = react.useRef(value ?? getDefaultValue(operator));
41
+ const [op, setOp] = react.useState(operator);
42
+ const allowedOperators = react.useMemo(() => operatorUtils.getOperators(column), [column]);
43
+ react.useMemo(() => {
44
+ if (value && value !== filterValue.current) {
45
+ filterValue.current = value;
46
+ setTimeout(() => {
47
+ onFilterChange?.(value, column, op);
48
+ }, 100);
49
+ }
50
+ }, [value, column, op, onFilterChange]);
51
+ const handleOperatorChange = react.useCallback((changedOp) => {
52
+ setOp(changedOp);
53
+ }, []);
54
+ const handleCommit = react.useCallback(
55
+ (e, newValue) => {
56
+ console.log(`[useColumnFilter] handleCommit ${newValue}`);
57
+ if (Array.isArray(filterValue.current)) {
58
+ filterValue.current = [newValue, filterValue.current[1]];
59
+ if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
60
+ console.info(
61
+ "Range start or end value missing - ignoring onFilterChange"
62
+ );
63
+ }
64
+ } else {
65
+ filterValue.current = newValue;
66
+ }
67
+ onFilterChange?.(filterValue.current, column, op);
68
+ },
69
+ [op, column, onFilterChange]
70
+ );
71
+ const handleRangeCommit = react.useCallback(
72
+ (e, newValue) => {
73
+ if (Array.isArray(filterValue.current)) {
74
+ filterValue.current = [filterValue.current[0], newValue];
75
+ if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
76
+ console.info(
77
+ "Range start or end value missing - ignoring onFilterChange"
78
+ );
79
+ }
80
+ } else {
81
+ filterValue.current = newValue;
82
+ }
83
+ onFilterChange?.(filterValue.current, column, op);
84
+ },
85
+ [op, column, onFilterChange]
86
+ );
87
+ const handleInputChange = react.useCallback(
88
+ (e) => {
89
+ if (Array.isArray(filterValue.current)) {
90
+ const editControl = vuuUtils.queryClosest(e.target, "[data-edit-control]", true);
91
+ const updated = [
92
+ !editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[0],
93
+ editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[1]
94
+ ];
95
+ filterValue.current = updated;
96
+ onFilterChange?.(updated, column, op);
97
+ } else {
98
+ filterValue.current = e.target.value;
99
+ onFilterChange?.(e.target.value, column, op);
100
+ }
101
+ },
102
+ [op, column, onFilterChange]
103
+ );
104
+ const inputProps = react.useMemo(
105
+ () => ({
106
+ onChange: handleInputChange,
107
+ value: Array.isArray(filterValue.current) ? filterValue.current[0] : filterValue.current
108
+ }),
109
+ [handleInputChange]
110
+ );
111
+ const rangeInputProps = react.useMemo(
112
+ () => ({
113
+ onChange: handleInputChange,
114
+ value: Array.isArray(filterValue.current) ? filterValue.current[1] : filterValue.current
115
+ }),
116
+ [handleInputChange]
117
+ );
118
+ return {
119
+ op,
120
+ allowedOperators,
121
+ filterValue: filterValue.current,
122
+ inputProps,
123
+ rangeInputProps,
124
+ handleCommit,
125
+ handleRangeCommit,
126
+ handleOperatorChange
127
+ };
128
+ };
22
129
 
130
+ exports.assertValidOperator = assertValidOperator;
23
131
  exports.assertValidValue = assertValidValue;
132
+ exports.useColumnFilter = useColumnFilter;
24
133
  //# sourceMappingURL=useColumnFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterOp } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type FilterValue = string | number | [string, string] | [number, number];\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: FilterOp | \"between\",\n value?: FilterValue | FilterValue[],\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value)) {\n throw Error(\n \"[useColumnFilter] 'between operator requires array of two values'\",\n );\n } else if (value.length !== 2) {\n throw Error(\n `[useColumnFilter] 'between operator requires two values, received ${value.length}'`,\n );\n } else if (typeof value[0] !== typeof value[1]) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport interface ColumnFilterHookProps {\n column: ColumnDescriptor;\n operator?: FilterOp | \"between\";\n}\n\n// export const useColumnFilter = ({\n// column,\n// operator = \"=\",\n// }: ColumnFilterHookProps) => {};\n"],"names":[],"mappings":";;AAKO,MAAM,mBAAmB,CAC9B,EAAE,gBAAgB,CAAE,EAAA,EACpB,UACA,KACG,KAAA;AACH,EAAA,IAAI,UAAU,KAAW,CAAA,EAAA;AACvB,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ;AAAA,SACF;AAAA,OACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,kEAAA,EAAqE,MAAM,MAAM,CAAA,CAAA;AAAA,SACnF;AAAA,OACF,MAAA,IAAW,OAAO,KAAM,CAAA,CAAC,MAAM,OAAO,KAAA,CAAM,CAAC,CAAG,EAAA;AAC9C,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,0EAAA,EAA6E,OAAO,KAAM,CAAA,CAAC,CAAC,CAAQ,KAAA,EAAA,OAAO,KAAM,CAAA,CAAC,CAAC,CAAA;AAAA,SACrH;AAAA;AACF;AACF;AAGJ;;;;"}
1
+ {"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterClauseOp, FilterValue } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n ChangeEventHandler,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { CommitHandler, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { VuuTypeaheadInputProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { getOperators } from \"../filter-clause/operator-utils\";\n\nexport type Operator = FilterClauseOp | \"between\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: Operator,\n) => {\n if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: Operator,\n value?: FilterValue,\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value)) {\n throw Error(\n \"[useColumnFilter] 'between operator requires array of two values'\",\n );\n } else if (value.length !== 2) {\n throw Error(\n `[useColumnFilter] 'between operator requires two values, received ${value}'`,\n );\n } else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport type ColumnFilterHookProps = {\n column: ColumnDescriptor;\n operator?: Operator;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value?: FilterValue;\n /**\n * Filter change events.\n */\n onFilterChange?: (\n value: FilterValue,\n column: ColumnDescriptor,\n op: Operator,\n ) => void;\n};\n\nexport const useColumnFilter = ({\n operator = \"=\",\n value,\n column,\n onFilterChange,\n}: ColumnFilterHookProps) => {\n const getDefaultValue = (op: Operator) => (op === \"between\" ? [\"\", \"\"] : \"\");\n const filterValue = useRef(value ?? getDefaultValue(operator));\n const [op, setOp] = useState(operator);\n const allowedOperators = useMemo(() => getOperators(column), [column]);\n\n useMemo(() => {\n if (value && value !== filterValue.current) {\n filterValue.current = value;\n setTimeout(() => {\n onFilterChange?.(value, column, op);\n }, 100);\n }\n }, [value, column, op, onFilterChange]);\n\n const handleOperatorChange = useCallback((changedOp: Operator) => {\n setOp(changedOp);\n }, []);\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n console.log(`[useColumnFilter] handleCommit ${newValue}`);\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [newValue as FilterValue, filterValue.current[1]];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [filterValue.current[0], newValue as FilterValue];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\n );\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n if (Array.isArray(filterValue.current)) {\n const editControl = queryClosest(e.target, \"[data-edit-control]\", true);\n const updated: FilterValue = [\n !editControl?.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[0],\n editControl?.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[1],\n ];\n filterValue.current = updated;\n onFilterChange?.(updated, column, op);\n } else {\n filterValue.current = e.target.value;\n onFilterChange?.(e.target.value, column, op);\n }\n },\n [op, column, onFilterChange],\n );\n\n const inputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[0]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n const rangeInputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[1]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n return {\n op,\n allowedOperators,\n filterValue: filterValue.current,\n inputProps,\n rangeInputProps,\n handleCommit,\n handleRangeCommit,\n handleOperatorChange,\n };\n};\n"],"names":["op","useRef","useState","useMemo","getOperators","useCallback","queryClosest"],"mappings":";;;;;;AAeO,MAAM,mBAAsB,GAAA,CACjC,gBACA,EAAA,MAAA,EACA,EACG,KAAA;AACH,EAAA,IAAI,CAAC,gBAAiB,CAAA,IAAA,CAAK,CAAC,cAAmB,KAAA,cAAA,KAAmB,EAAE,CAAG,EAAA;AACrE,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAAsB,mBAAA,EAAA,EAAE,CAA6B,0BAAA,EAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAAA,KAClE;AAAA;AAEJ;AAEO,MAAM,mBAAmB,CAC9B,EAAE,gBAAgB,CAAE,EAAA,EACpB,UACA,KACG,KAAA;AACH,EAAA,IAAI,UAAU,KAAW,CAAA,EAAA;AACvB,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ;AAAA,SACF;AAAA,OACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,QAAM,MAAA,KAAA;AAAA,UACJ,qEAAqE,KAAK,CAAA,CAAA;AAAA,SAC5E;AAAA,OACS,MAAA,IAAA,KAAA,CAAM,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA,IAAK,OAAO,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,KAAA,CAAM,CAAC,CAAG,EAAA;AACtE,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,0EAAA,EAA6E,OAAO,KAAM,CAAA,CAAC,CAAC,CAAQ,KAAA,EAAA,OAAO,KAAM,CAAA,CAAC,CAAC,CAAA;AAAA,SACrH;AAAA;AACF;AACF;AAGJ;AAoBO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAW,GAAA,GAAA;AAAA,EACX,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAA6B,KAAA;AAC3B,EAAM,MAAA,eAAA,GAAkB,CAACA,GAAkBA,KAAAA,GAAAA,KAAO,YAAY,CAAC,EAAA,EAAI,EAAE,CAAI,GAAA,EAAA;AACzE,EAAA,MAAM,WAAc,GAAAC,YAAA,CAAO,KAAS,IAAA,eAAA,CAAgB,QAAQ,CAAC,CAAA;AAC7D,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAIC,eAAS,QAAQ,CAAA;AACrC,EAAM,MAAA,gBAAA,GAAmBC,cAAQ,MAAMC,0BAAA,CAAa,MAAM,CAAG,EAAA,CAAC,MAAM,CAAC,CAAA;AAErE,EAAAD,aAAA,CAAQ,MAAM;AACZ,IAAI,IAAA,KAAA,IAAS,KAAU,KAAA,WAAA,CAAY,OAAS,EAAA;AAC1C,MAAA,WAAA,CAAY,OAAU,GAAA,KAAA;AACtB,MAAA,UAAA,CAAW,MAAM;AACf,QAAiB,cAAA,GAAA,KAAA,EAAO,QAAQ,EAAE,CAAA;AAAA,SACjC,GAAG,CAAA;AAAA;AACR,KACC,CAAC,KAAA,EAAO,MAAQ,EAAA,EAAA,EAAI,cAAc,CAAC,CAAA;AAEtC,EAAM,MAAA,oBAAA,GAAuBE,iBAAY,CAAA,CAAC,SAAwB,KAAA;AAChE,IAAA,KAAA,CAAM,SAAS,CAAA;AAAA,GACjB,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAe,GAAAA,iBAAA;AAAA,IACnB,CAAC,GAAG,QAAa,KAAA;AACf,MAAQ,OAAA,CAAA,GAAA,CAAI,CAAkC,+BAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACxD,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,WAAY,CAAA,OAAO,CAAG,EAAA;AACtC,QAAA,WAAA,CAAY,UAAU,CAAC,QAAA,EAAyB,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAA;AACtE,QACE,IAAA,WAAA,CAAY,OACX,KAAA,WAAA,CAAY,OAAQ,CAAA,CAAC,CAAM,KAAA,KAAA,CAAA,IAC1B,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,KAC7B,CAAA,CAAA,EAAA;AACA,UAAQ,OAAA,CAAA,IAAA;AAAA,YACN;AAAA,WACF;AAAA;AACF,OACK,MAAA;AACL,QAAA,WAAA,CAAY,OAAU,GAAA,QAAA;AAAA;AAExB,MAAiB,cAAA,GAAA,WAAA,CAAY,OAAS,EAAA,MAAA,EAAQ,EAAE,CAAA;AAAA,KAClD;AAAA,IACA,CAAC,EAAI,EAAA,MAAA,EAAQ,cAAc;AAAA,GAC7B;AAEA,EAAA,MAAM,iBAAoB,GAAAA,iBAAA;AAAA,IACxB,CAAC,GAAG,QAAa,KAAA;AACf,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,WAAY,CAAA,OAAO,CAAG,EAAA;AACtC,QAAA,WAAA,CAAY,UAAU,CAAC,WAAA,CAAY,OAAQ,CAAA,CAAC,GAAG,QAAuB,CAAA;AACtE,QACE,IAAA,WAAA,CAAY,OACX,KAAA,WAAA,CAAY,OAAQ,CAAA,CAAC,CAAM,KAAA,KAAA,CAAA,IAC1B,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,KAC7B,CAAA,CAAA,EAAA;AACA,UAAQ,OAAA,CAAA,IAAA;AAAA,YACN;AAAA,WACF;AAAA;AACF,OACK,MAAA;AACL,QAAA,WAAA,CAAY,OAAU,GAAA,QAAA;AAAA;AAExB,MAAiB,cAAA,GAAA,WAAA,CAAY,OAAS,EAAA,MAAA,EAAQ,EAAE,CAAA;AAAA,KAClD;AAAA,IACA,CAAC,EAAI,EAAA,MAAA,EAAQ,cAAc;AAAA,GAC7B;AAEA,EAAA,MAAM,iBAAoB,GAAAA,iBAAA;AAAA,IACxB,CAAC,CAAM,KAAA;AACL,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,WAAY,CAAA,OAAO,CAAG,EAAA;AACtC,QAAA,MAAM,WAAc,GAAAC,qBAAA,CAAa,CAAE,CAAA,MAAA,EAAQ,uBAAuB,IAAI,CAAA;AACtE,QAAA,MAAM,OAAuB,GAAA;AAAA,UAC3B,CAAC,WAAa,EAAA,SAAA,EAAW,QAAS,CAAA,WAAW,CACzC,GAAA,CAAA,CAAE,MAAO,CAAA,KAAA,GACT,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,UACzB,WAAA,EAAa,SAAW,EAAA,QAAA,CAAS,WAAW,CAAA,GACxC,EAAE,MAAO,CAAA,KAAA,GACT,WAAY,CAAA,OAAA,CAAQ,CAAC;AAAA,SAC3B;AACA,QAAA,WAAA,CAAY,OAAU,GAAA,OAAA;AACtB,QAAiB,cAAA,GAAA,OAAA,EAAS,QAAQ,EAAE,CAAA;AAAA,OAC/B,MAAA;AACL,QAAY,WAAA,CAAA,OAAA,GAAU,EAAE,MAAO,CAAA,KAAA;AAC/B,QAAA,cAAA,GAAiB,CAAE,CAAA,MAAA,CAAO,KAAO,EAAA,MAAA,EAAQ,EAAE,CAAA;AAAA;AAC7C,KACF;AAAA,IACA,CAAC,EAAI,EAAA,MAAA,EAAQ,cAAc;AAAA,GAC7B;AAEA,EAAA,MAAM,UAAa,GAAAH,aAAA;AAAA,IACjB,OAAO;AAAA,MACL,QAAU,EAAA,iBAAA;AAAA,MACV,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,WAAY,CAAA,OAAO,IACpC,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA,GACrB,WAAY,CAAA;AAAA,KAClB,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAA,MAAM,eAAkB,GAAAA,aAAA;AAAA,IACtB,OAAO;AAAA,MACL,QAAU,EAAA,iBAAA;AAAA,MACV,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,WAAY,CAAA,OAAO,IACpC,WAAY,CAAA,OAAA,CAAQ,CAAC,CAAA,GACrB,WAAY,CAAA;AAAA,KAClB,CAAA;AAAA,IACA,CAAC,iBAAiB;AAAA,GACpB;AAEA,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAa,WAAY,CAAA,OAAA;AAAA,IACzB,UAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLElement, number>>(\n (e, selectedDateInputValue) => {\n console.log(\"change time\");\n if (selectedDateInputValue) {\n const dateValue = toCalendarDate(new Date(selectedDateInputValue));\n setDate(dateValue);\n if (selectedDateInputValue /* && source === \"calendar\"*/) {\n onChangeValue(toEpochMilliS(dateValue));\n }\n }\n },\n [onChangeValue, toEpochMilliS],\n );\n\n const onBlur = useCallback(() => {\n date && onChangeValue(toEpochMilliS(date));\n }, [date, onChangeValue, toEpochMilliS]);\n\n return (\n <VuuTimePicker\n data-field=\"value\"\n // inputProps={inputProps}\n className={className}\n onBlur={onBlur}\n onCommit={handleCommit}\n // selectedDate={date}\n />\n );\n};\n\nfunction getInitialState(value: FilterClauseValueEditorTimeProps[\"value\"]) {\n return value ? toCalendarDate(new Date(value)) : undefined;\n}\n\nconst getEpochMillisConverter =\n (op: NumericFilterClauseOp) =>\n (date: DateValue, timezone: string = getLocalTimeZone()): number => {\n const d = date.toDate(timezone);\n switch (op) {\n case \">\":\n case \"<=\":\n d.setHours(23, 59, 59, 999);\n return d.getTime();\n case \">=\":\n case \"<\":\n case \"=\": // converted to \"< `start of next day` and >= `start of this day`\" when query is created\n case \"!=\": // converted to \">= `start of next day` or < `start of this day`\" when query is created\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n };\n"],"names":["useState","useCallback","toCalendarDate","jsx","VuuTimePicker","date","getLocalTimeZone"],"mappings":";;;;;;;;AAca,MAAA,2BAAA,GAA8B,CACzC,KACG,KAAA;AACH,EAAA,MAAM,EAAE,SAAA,EAAW,aAAe,EAAA,QAAA,EAAU,OAAU,GAAA,KAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,wBAAwB,QAAQ,CAAA;AAEtD,EAAM,MAAA,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA;AAAA,IAAgC,MACtD,gBAAgB,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,GAAG,sBAA2B,KAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,IAAI,sBAAwB,EAAA;AAC1B,QAAA,MAAM,SAAY,GAAAC,uBAAA,CAAe,IAAI,IAAA,CAAK,sBAAsB,CAAC,CAAA;AACjE,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,IAAI,sBAAsD,EAAA;AACxD,UAAc,aAAA,CAAA,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA;AACxC;AACF,KACF;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,GAC/B;AAEA,EAAM,MAAA,MAAA,GAASD,kBAAY,MAAM;AAC/B,IAAQ,IAAA,IAAA,aAAA,CAAc,aAAc,CAAA,IAAI,CAAC,CAAA;AAAA,GACxC,EAAA,CAAC,IAAM,EAAA,aAAA,EAAe,aAAa,CAAC,CAAA;AAEvC,EACE,uBAAAE,cAAA;AAAA,IAACC,2BAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MAEX,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA;AAAA;AAAA,GAEZ;AAEJ;AAEA,SAAS,gBAAgB,KAAkD,EAAA;AACzE,EAAA,OAAO,QAAQF,uBAAe,CAAA,IAAI,IAAK,CAAA,KAAK,CAAC,CAAI,GAAA,KAAA,CAAA;AACnD;AAEA,MAAM,0BACJ,CAAC,EAAA,KACD,CAACG,MAAiB,EAAA,QAAA,GAAmBC,uBAA+B,KAAA;AAClE,EAAM,MAAA,CAAA,GAAID,MAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC9B,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,CAAA;AAC1B,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA,IACnB,KAAK,IAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AAEvB,CAAA;;;;"}
1
+ {"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLInputElement, string>>(\n (e, selectedDateInputValue) => {\n console.log(\"change time\");\n if (selectedDateInputValue) {\n const dateValue = toCalendarDate(new Date(selectedDateInputValue));\n setDate(dateValue);\n if (selectedDateInputValue /* && source === \"calendar\"*/) {\n onChangeValue(toEpochMilliS(dateValue));\n }\n }\n },\n [onChangeValue, toEpochMilliS],\n );\n\n const onBlur = useCallback(() => {\n date && onChangeValue(toEpochMilliS(date));\n }, [date, onChangeValue, toEpochMilliS]);\n\n return (\n <VuuTimePicker\n data-field=\"value\"\n // inputProps={inputProps}\n className={className}\n onBlur={onBlur}\n onCommit={handleCommit}\n // selectedDate={date}\n />\n );\n};\n\nfunction getInitialState(value: FilterClauseValueEditorTimeProps[\"value\"]) {\n return value ? toCalendarDate(new Date(value)) : undefined;\n}\n\nconst getEpochMillisConverter =\n (op: NumericFilterClauseOp) =>\n (date: DateValue, timezone: string = getLocalTimeZone()): number => {\n const d = date.toDate(timezone);\n switch (op) {\n case \">\":\n case \"<=\":\n d.setHours(23, 59, 59, 999);\n return d.getTime();\n case \">=\":\n case \"<\":\n case \"=\": // converted to \"< `start of next day` and >= `start of this day`\" when query is created\n case \"!=\": // converted to \">= `start of next day` or < `start of this day`\" when query is created\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n };\n"],"names":["useState","useCallback","toCalendarDate","jsx","VuuTimePicker","date","getLocalTimeZone"],"mappings":";;;;;;;;AAca,MAAA,2BAAA,GAA8B,CACzC,KACG,KAAA;AACH,EAAA,MAAM,EAAE,SAAA,EAAW,aAAe,EAAA,QAAA,EAAU,OAAU,GAAA,KAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,wBAAwB,QAAQ,CAAA;AAEtD,EAAM,MAAA,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA;AAAA,IAAgC,MACtD,gBAAgB,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IACnB,CAAC,GAAG,sBAA2B,KAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,IAAI,sBAAwB,EAAA;AAC1B,QAAA,MAAM,SAAY,GAAAC,uBAAA,CAAe,IAAI,IAAA,CAAK,sBAAsB,CAAC,CAAA;AACjE,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,IAAI,sBAAsD,EAAA;AACxD,UAAc,aAAA,CAAA,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA;AACxC;AACF,KACF;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,GAC/B;AAEA,EAAM,MAAA,MAAA,GAASD,kBAAY,MAAM;AAC/B,IAAQ,IAAA,IAAA,aAAA,CAAc,aAAc,CAAA,IAAI,CAAC,CAAA;AAAA,GACxC,EAAA,CAAC,IAAM,EAAA,aAAA,EAAe,aAAa,CAAC,CAAA;AAEvC,EACE,uBAAAE,cAAA;AAAA,IAACC,2BAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MAEX,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA;AAAA;AAAA,GAEZ;AAEJ;AAEA,SAAS,gBAAgB,KAAkD,EAAA;AACzE,EAAA,OAAO,QAAQF,uBAAe,CAAA,IAAI,IAAK,CAAA,KAAK,CAAC,CAAI,GAAA,KAAA,CAAA;AACnD;AAEA,MAAM,0BACJ,CAAC,EAAA,KACD,CAACG,MAAiB,EAAA,QAAA,GAAmBC,uBAA+B,KAAA;AAClE,EAAM,MAAA,CAAA,GAAID,MAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC9B,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,CAAA;AAC1B,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA,IACnB,KAAK,IAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AAEvB,CAAA;;;;"}
@@ -117,7 +117,9 @@ const merge = (f1, f2) => {
117
117
  ...f1,
118
118
  values: [
119
119
  ...f1.values,
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
120
121
  ...f2.values.filter(
122
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
123
  (v) => !f1.values.includes(v)
122
124
  )
123
125
  ]
@@ -246,7 +248,8 @@ const filterEquals = (f1, f2, strict = false) => {
246
248
  return true;
247
249
  }
248
250
  if (f1 && f2 && canMerge(f1, f2)) {
249
- return f1.op === f2.op && (vuuUtils.isSingleValueFilter(f1) && vuuUtils.isSingleValueFilter(f2) && f1.value === f2.value || vuuUtils.isMultiValueFilter(f1) && vuuUtils.isMultiValueFilter(f2) && sameValues(f1.values, f2.values));
251
+ return f1.op === f2.op && (vuuUtils.isSingleValueFilter(f1) && vuuUtils.isSingleValueFilter(f2) && f1.value === f2.value || vuuUtils.isMultiValueFilter(f1) && vuuUtils.isMultiValueFilter(f2) && // eslint-disable-next-line @typescript-eslint/no-explicit-any
252
+ sameValues(f1.values, f2.values));
250
253
  }
251
254
  return false;
252
255
  };
@@ -1 +1 @@
1
- {"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n AndFilter,\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n isAndFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n partition,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n mode?: any;\n value?: any;\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n ...(f2.values as any[]).filter(\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as AndFilter).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n"],"names":["isMultiClauseFilter","isInFilter","isAndFilter","partition","isOrFilter","isSingleValueFilter","isMultiValueFilter","extractFilterForColumn"],"mappings":"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"}
1
+ {"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n AndFilter,\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n isAndFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n partition,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mode?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(f2.values as any[]).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as AndFilter).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n"],"names":["isMultiClauseFilter","isInFilter","isAndFilter","partition","isOrFilter","isSingleValueFilter","isMultiValueFilter","extractFilterForColumn"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n border-radius: 6px;\n max-width: 200px;\n\n\n .vuuColumnFilter-rangeHigh {\n position: relative;\n }\n\n .vuuColumnFilter-rangeHigh::before {\n content: \"\";\n width: 1px;\n position: absolute;\n background: var(--salt-separable-primary-borderColor);\n /* Accomodate button border */\n left: 0;\n top: calc(-1 * var(--salt-spacing-100));\n bottom: calc(-1 * var(--salt-spacing-100));\n }\n\n}\n\n.vuuColumnFilter-trigger {\n --saltButton-borderRadius: 4px 0px 0px 4px;\n --saltButton-padding: var(--salt-spacing-200);\n}\n";
1
+ var columnFilterCss = ".vuuColumnFilter {\n border: solid 1px var(--salt-editable-borderColor);\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n width: var(--vuuColumnFilter-width, fit-content);\n\n\n .vuuColumnFilter-rangeHigh {\n position: relative;\n }\n\n .vuuColumnFilter-rangeHigh::before {\n content: \"\";\n width: 1px;\n position: absolute;\n background: var(--salt-separable-primary-borderColor);\n /* Accomodate button border */\n left: calc(-1 * var(--salt-spacing-100));\n top: -1px;\n bottom: -1px;\n }\n\n .vuuTimePicker {\n border-radius: 6px;\n }\n\n .vuuTimePicker + .vuuTimePicker {\n margin-left: var(--salt-spacing-100);\n }\n\n .vuuTimeInput {\n border: none;\n outline: none;\n }\n\n .vuuTimeInput:focus-visible {\n outline: none;\n }\n\n}\n\n.vuuColumnFilter-trigger {\n --saltButton-borderRadius: 4px 0px 0px 4px;\n --saltButton-padding: var(--salt-spacing-200);\n}\n";
2
2
 
3
3
  export { columnFilterCss as default };
4
4
  //# sourceMappingURL=ColumnFilter.css.js.map
@@ -5,37 +5,55 @@ import { useWindow } from '@salt-ds/window';
5
5
  import cx from 'clsx';
6
6
  import columnFilterCss from './ColumnFilter.css.js';
7
7
  import { getDataItemEditControl } from '@vuu-ui/vuu-data-react';
8
- import { useMemo, useCallback } from 'react';
9
- import { assertValidValue } from './useColumnFilter.js';
8
+ import { forwardRef, useMemo } from 'react';
9
+ import { useColumnFilter, assertValidOperator, assertValidValue } from './useColumnFilter.js';
10
10
 
11
11
  const classBase = "vuuColumnFilter";
12
- const ColumnFilter = ({
12
+ const ColumnFilter = forwardRef(function ColumnFilter2({
13
13
  column,
14
14
  className,
15
15
  operator = "=",
16
16
  showOperatorPicker = false,
17
17
  table,
18
18
  value,
19
+ onFilterChange,
19
20
  ...buttonGroupProps
20
- }) => {
21
+ }, forwardRef2) {
21
22
  const targetWindow = useWindow();
22
23
  useComponentCssInjection({
23
- testId: "vuu-filter-bar",
24
+ testId: "vuu-column-filter",
24
25
  css: columnFilterCss,
25
26
  window: targetWindow
26
27
  });
28
+ const {
29
+ op,
30
+ allowedOperators,
31
+ filterValue,
32
+ inputProps,
33
+ rangeInputProps,
34
+ handleOperatorChange,
35
+ handleCommit,
36
+ handleRangeCommit
37
+ } = useColumnFilter({
38
+ operator,
39
+ column,
40
+ value,
41
+ onFilterChange
42
+ });
43
+ useMemo(
44
+ () => assertValidOperator(allowedOperators, column, operator),
45
+ [column, operator, allowedOperators]
46
+ );
27
47
  useMemo(
28
- () => assertValidValue(column, operator, value),
29
- [column, operator, value]
48
+ () => assertValidValue(column, op, filterValue),
49
+ [column, op, filterValue]
30
50
  );
31
- const onCommit = useCallback((e, value2) => {
32
- console.log(`onCommit ${value2}`);
33
- }, []);
34
51
  return /* @__PURE__ */ jsxs(
35
52
  SegmentedButtonGroup,
36
53
  {
37
54
  ...buttonGroupProps,
38
55
  className: cx(classBase, className),
56
+ ref: forwardRef2,
39
57
  children: [
40
58
  showOperatorPicker ? /* @__PURE__ */ jsxs(Menu, { placement: "bottom-start", children: [
41
59
  /* @__PURE__ */ jsx(MenuTrigger, { children: /* @__PURE__ */ jsx(
@@ -46,34 +64,35 @@ const ColumnFilter = ({
46
64
  className: `${classBase}-trigger`,
47
65
  "data-embedded": true,
48
66
  sentiment: "neutral",
49
- children: operator
67
+ children: op
50
68
  }
51
69
  ) }),
52
- /* @__PURE__ */ jsxs(MenuPanel, { children: [
53
- /* @__PURE__ */ jsx(MenuItem, { children: "=" }),
54
- /* @__PURE__ */ jsx(MenuItem, { children: "!=" }),
55
- /* @__PURE__ */ jsx(MenuItem, { children: "starts" }),
56
- /* @__PURE__ */ jsx(MenuItem, { children: "ends" }),
57
- /* @__PURE__ */ jsx(MenuItem, { children: "contains" })
58
- ] })
70
+ /* @__PURE__ */ jsx(MenuPanel, { children: allowedOperators.map((allowedOp) => /* @__PURE__ */ jsx(
71
+ MenuItem,
72
+ {
73
+ onClick: () => handleOperatorChange(allowedOp),
74
+ children: allowedOp
75
+ },
76
+ `allowedOp`
77
+ )) })
59
78
  ] }) : null,
60
79
  getDataItemEditControl({
80
+ InputProps: { inputProps },
61
81
  dataDescriptor: column,
62
- defaultValue: Array.isArray(value) ? value[0] : value,
63
- onCommit,
82
+ onCommit: handleCommit,
64
83
  table
65
84
  }),
66
- operator === "between" ? getDataItemEditControl({
85
+ op === "between" ? getDataItemEditControl({
67
86
  className: `${classBase}-rangeHigh`,
87
+ InputProps: { inputProps: rangeInputProps },
68
88
  dataDescriptor: column,
69
- defaultValue: Array.isArray(value) ? value[1] : void 0,
70
- onCommit,
89
+ onCommit: handleRangeCommit,
71
90
  table
72
91
  }) : null
73
92
  ]
74
93
  }
75
94
  );
76
- };
95
+ });
77
96
 
78
97
  export { ColumnFilter };
79
98
  //# sourceMappingURL=ColumnFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { useCallback, useMemo } from \"react\";\nimport { CommitHandler } from \"@vuu-ui/vuu-utils\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n assertValidValue,\n ColumnFilterHookProps,\n FilterValue,\n} from \"./useColumnFilter\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends ColumnFilterHookProps,\n SegmentedButtonGroupProps {\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n\n /**\n * Initial filter value. Pair of values expewcted when operator is\n * 'between'\n */\n value?: FilterValue | [FilterValue, FilterValue];\n}\n\nexport const ColumnFilter = ({\n column,\n className,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n ...buttonGroupProps\n}: ColumnFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-bar\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n useMemo(\n () => assertValidValue(column, operator, value),\n [column, operator, value],\n );\n\n const onCommit = useCallback<CommitHandler<HTMLElement>>((e, value) => {\n console.log(`onCommit ${value}`);\n }, []);\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {operator}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n <MenuItem>=</MenuItem>\n <MenuItem>!=</MenuItem>\n <MenuItem>starts</MenuItem>\n <MenuItem>ends</MenuItem>\n <MenuItem>contains</MenuItem>\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n dataDescriptor: column,\n defaultValue: Array.isArray(value)\n ? (value[0] as string)\n : (value as string),\n onCommit,\n table,\n })}\n {operator === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n dataDescriptor: column,\n defaultValue: Array.isArray(value)\n ? (value[1] as string)\n : undefined,\n onCommit,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n};\n"],"names":["value"],"mappings":";;;;;;;;;;AAwBA,MAAM,SAAY,GAAA,iBAAA;AAkBX,MAAM,eAAe,CAAC;AAAA,EAC3B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAW,GAAA,GAAA;AAAA,EACX,kBAAqB,GAAA,KAAA;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAyB,KAAA;AACvB,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,eAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,OAAA;AAAA,IACE,MAAM,gBAAA,CAAiB,MAAQ,EAAA,QAAA,EAAU,KAAK,CAAA;AAAA,IAC9C,CAAC,MAAQ,EAAA,QAAA,EAAU,KAAK;AAAA,GAC1B;AAEA,EAAA,MAAM,QAAW,GAAA,WAAA,CAAwC,CAAC,CAAA,EAAGA,MAAU,KAAA;AACrE,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAYA,SAAAA,EAAAA,MAAK,CAAE,CAAA,CAAA;AAAA,GACjC,EAAG,EAAE,CAAA;AAEL,EACE,uBAAA,IAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACE,GAAG,gBAAA;AAAA,MACJ,SAAA,EAAW,EAAG,CAAA,SAAA,EAAW,SAAS,CAAA;AAAA,MAEjC,QAAA,EAAA;AAAA,QACC,kBAAA,mBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAU,cACd,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,WACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,UAAW,EAAA,OAAA;AAAA,cACX,YAAW,EAAA,WAAA;AAAA,cACX,SAAA,EAAW,GAAG,SAAS,CAAA,QAAA,CAAA;AAAA,cACvB,eAAa,EAAA,IAAA;AAAA,cACb,SAAU,EAAA,SAAA;AAAA,cAET,QAAA,EAAA;AAAA;AAAA,WAEL,EAAA,CAAA;AAAA,+BACC,SACC,EAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,YAAS,QAAC,EAAA,GAAA,EAAA,CAAA;AAAA,4BACX,GAAA,CAAC,YAAS,QAAE,EAAA,IAAA,EAAA,CAAA;AAAA,4BACZ,GAAA,CAAC,YAAS,QAAM,EAAA,QAAA,EAAA,CAAA;AAAA,4BAChB,GAAA,CAAC,YAAS,QAAI,EAAA,MAAA,EAAA,CAAA;AAAA,4BACd,GAAA,CAAC,YAAS,QAAQ,EAAA,UAAA,EAAA;AAAA,WACpB,EAAA;AAAA,SAAA,EACF,CACE,GAAA,IAAA;AAAA,QACH,sBAAuB,CAAA;AAAA,UACtB,cAAgB,EAAA,MAAA;AAAA,UAChB,cAAc,KAAM,CAAA,OAAA,CAAQ,KAAK,CAC5B,GAAA,KAAA,CAAM,CAAC,CACP,GAAA,KAAA;AAAA,UACL,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,QACA,QAAA,KAAa,YACV,sBAAuB,CAAA;AAAA,UACrB,SAAA,EAAW,GAAG,SAAS,CAAA,UAAA,CAAA;AAAA,UACvB,cAAgB,EAAA,MAAA;AAAA,UAChB,cAAc,KAAM,CAAA,OAAA,CAAQ,KAAK,CAC5B,GAAA,KAAA,CAAM,CAAC,CACR,GAAA,KAAA,CAAA;AAAA,UACJ,QAAA;AAAA,UACA;AAAA,SACD,CACD,GAAA;AAAA;AAAA;AAAA,GACN;AAEJ;;;;"}
1
+ {"version":3,"file":"ColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/ColumnFilter.tsx"],"sourcesContent":["import {\n Button,\n Menu,\n MenuItem,\n MenuPanel,\n MenuTrigger,\n SegmentedButtonGroup,\n SegmentedButtonGroupProps,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\n\nimport columnFilterCss from \"./ColumnFilter.css\";\nimport { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { ForwardedRef, forwardRef, ReactElement, useMemo } from \"react\";\nimport {\n assertValidOperator,\n assertValidValue,\n ColumnFilterHookProps,\n useColumnFilter,\n} from \"./useColumnFilter\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nconst classBase = \"vuuColumnFilter\";\n\nexport interface ColumnFilterProps\n extends SegmentedButtonGroupProps,\n Pick<\n ColumnFilterHookProps,\n \"column\" | \"operator\" | \"value\" | \"onFilterChange\"\n > {\n /**\n * Display operator picker.\n */\n showOperatorPicker?: boolean;\n /**\n * VuuTable is required if typeahead support is expected.\n */\n table?: VuuTable;\n}\n\nexport const ColumnFilter = forwardRef(function ColumnFilter(\n {\n column,\n className,\n operator = \"=\",\n showOperatorPicker = false,\n table,\n value,\n onFilterChange,\n ...buttonGroupProps\n }: ColumnFilterProps,\n forwardRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-column-filter\",\n css: columnFilterCss,\n window: targetWindow,\n });\n\n const {\n op,\n allowedOperators,\n filterValue,\n inputProps,\n rangeInputProps,\n handleOperatorChange,\n handleCommit,\n handleRangeCommit,\n } = useColumnFilter({\n operator,\n column,\n value,\n onFilterChange,\n });\n\n useMemo(\n () => assertValidOperator(allowedOperators, column, operator),\n [column, operator, allowedOperators],\n );\n\n useMemo(\n () => assertValidValue(column, op, filterValue),\n [column, op, filterValue],\n );\n\n return (\n <SegmentedButtonGroup\n {...buttonGroupProps}\n className={cx(classBase, className)}\n ref={forwardRef}\n >\n {showOperatorPicker ? (\n <Menu placement=\"bottom-start\">\n <MenuTrigger>\n <Button\n appearance=\"solid\"\n aria-label=\"Open Menu\"\n className={`${classBase}-trigger`}\n data-embedded\n sentiment=\"neutral\"\n >\n {op}\n </Button>\n </MenuTrigger>\n <MenuPanel>\n {allowedOperators.map((allowedOp) => (\n <MenuItem\n key={`allowedOp`}\n onClick={() => handleOperatorChange(allowedOp)}\n >\n {allowedOp}\n </MenuItem>\n ))}\n </MenuPanel>\n </Menu>\n ) : null}\n {getDataItemEditControl({\n InputProps: { inputProps },\n dataDescriptor: column,\n onCommit: handleCommit,\n table,\n })}\n {op === \"between\"\n ? getDataItemEditControl({\n className: `${classBase}-rangeHigh`,\n InputProps: { inputProps: rangeInputProps },\n dataDescriptor: column,\n onCommit: handleRangeCommit,\n table,\n })\n : null}\n </SegmentedButtonGroup>\n );\n}) as (\n props: ColumnFilterProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n },\n) => ReactElement<ColumnFilterProps>;\n"],"names":["ColumnFilter","forwardRef"],"mappings":"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"}
@@ -1,3 +1,14 @@
1
+ import { useRef, useState, useMemo, useCallback } from 'react';
2
+ import { queryClosest } from '@vuu-ui/vuu-utils';
3
+ import { getOperators } from '../filter-clause/operator-utils.js';
4
+
5
+ const assertValidOperator = (allowedOperators, column, op) => {
6
+ if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {
7
+ console.warn(
8
+ `[useColumnFilter] '${op} not supported for column ${column.name}'`
9
+ );
10
+ }
11
+ };
1
12
  const assertValidValue = ({ serverDataType: _ }, operator, value) => {
2
13
  if (value !== void 0) {
3
14
  if (operator === "between") {
@@ -7,9 +18,9 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
7
18
  );
8
19
  } else if (value.length !== 2) {
9
20
  throw Error(
10
- `[useColumnFilter] 'between operator requires two values, received ${value.length}'`
21
+ `[useColumnFilter] 'between operator requires two values, received ${value}'`
11
22
  );
12
- } else if (typeof value[0] !== typeof value[1]) {
23
+ } else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {
13
24
  throw Error(
14
25
  `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`
15
26
  );
@@ -17,6 +28,102 @@ const assertValidValue = ({ serverDataType: _ }, operator, value) => {
17
28
  }
18
29
  }
19
30
  };
31
+ const useColumnFilter = ({
32
+ operator = "=",
33
+ value,
34
+ column,
35
+ onFilterChange
36
+ }) => {
37
+ const getDefaultValue = (op2) => op2 === "between" ? ["", ""] : "";
38
+ const filterValue = useRef(value ?? getDefaultValue(operator));
39
+ const [op, setOp] = useState(operator);
40
+ const allowedOperators = useMemo(() => getOperators(column), [column]);
41
+ useMemo(() => {
42
+ if (value && value !== filterValue.current) {
43
+ filterValue.current = value;
44
+ setTimeout(() => {
45
+ onFilterChange?.(value, column, op);
46
+ }, 100);
47
+ }
48
+ }, [value, column, op, onFilterChange]);
49
+ const handleOperatorChange = useCallback((changedOp) => {
50
+ setOp(changedOp);
51
+ }, []);
52
+ const handleCommit = useCallback(
53
+ (e, newValue) => {
54
+ console.log(`[useColumnFilter] handleCommit ${newValue}`);
55
+ if (Array.isArray(filterValue.current)) {
56
+ filterValue.current = [newValue, filterValue.current[1]];
57
+ if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
58
+ console.info(
59
+ "Range start or end value missing - ignoring onFilterChange"
60
+ );
61
+ }
62
+ } else {
63
+ filterValue.current = newValue;
64
+ }
65
+ onFilterChange?.(filterValue.current, column, op);
66
+ },
67
+ [op, column, onFilterChange]
68
+ );
69
+ const handleRangeCommit = useCallback(
70
+ (e, newValue) => {
71
+ if (Array.isArray(filterValue.current)) {
72
+ filterValue.current = [filterValue.current[0], newValue];
73
+ if (filterValue.current && (filterValue.current[0] === void 0 || filterValue.current[1] === void 0)) {
74
+ console.info(
75
+ "Range start or end value missing - ignoring onFilterChange"
76
+ );
77
+ }
78
+ } else {
79
+ filterValue.current = newValue;
80
+ }
81
+ onFilterChange?.(filterValue.current, column, op);
82
+ },
83
+ [op, column, onFilterChange]
84
+ );
85
+ const handleInputChange = useCallback(
86
+ (e) => {
87
+ if (Array.isArray(filterValue.current)) {
88
+ const editControl = queryClosest(e.target, "[data-edit-control]", true);
89
+ const updated = [
90
+ !editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[0],
91
+ editControl?.className?.includes("rangeHigh") ? e.target.value : filterValue.current[1]
92
+ ];
93
+ filterValue.current = updated;
94
+ onFilterChange?.(updated, column, op);
95
+ } else {
96
+ filterValue.current = e.target.value;
97
+ onFilterChange?.(e.target.value, column, op);
98
+ }
99
+ },
100
+ [op, column, onFilterChange]
101
+ );
102
+ const inputProps = useMemo(
103
+ () => ({
104
+ onChange: handleInputChange,
105
+ value: Array.isArray(filterValue.current) ? filterValue.current[0] : filterValue.current
106
+ }),
107
+ [handleInputChange]
108
+ );
109
+ const rangeInputProps = useMemo(
110
+ () => ({
111
+ onChange: handleInputChange,
112
+ value: Array.isArray(filterValue.current) ? filterValue.current[1] : filterValue.current
113
+ }),
114
+ [handleInputChange]
115
+ );
116
+ return {
117
+ op,
118
+ allowedOperators,
119
+ filterValue: filterValue.current,
120
+ inputProps,
121
+ rangeInputProps,
122
+ handleCommit,
123
+ handleRangeCommit,
124
+ handleOperatorChange
125
+ };
126
+ };
20
127
 
21
- export { assertValidValue };
128
+ export { assertValidOperator, assertValidValue, useColumnFilter };
22
129
  //# sourceMappingURL=useColumnFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterOp } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\n\nexport type FilterValue = string | number | [string, string] | [number, number];\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: FilterOp | \"between\",\n value?: FilterValue | FilterValue[],\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value)) {\n throw Error(\n \"[useColumnFilter] 'between operator requires array of two values'\",\n );\n } else if (value.length !== 2) {\n throw Error(\n `[useColumnFilter] 'between operator requires two values, received ${value.length}'`,\n );\n } else if (typeof value[0] !== typeof value[1]) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport interface ColumnFilterHookProps {\n column: ColumnDescriptor;\n operator?: FilterOp | \"between\";\n}\n\n// export const useColumnFilter = ({\n// column,\n// operator = \"=\",\n// }: ColumnFilterHookProps) => {};\n"],"names":[],"mappings":"AAKO,MAAM,mBAAmB,CAC9B,EAAE,gBAAgB,CAAE,EAAA,EACpB,UACA,KACG,KAAA;AACH,EAAA,IAAI,UAAU,KAAW,CAAA,EAAA;AACvB,IAAA,IAAI,aAAa,SAAW,EAAA;AAC1B,MAAA,IAAI,CAAC,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ;AAAA,SACF;AAAA,OACF,MAAA,IAAW,KAAM,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,kEAAA,EAAqE,MAAM,MAAM,CAAA,CAAA;AAAA,SACnF;AAAA,OACF,MAAA,IAAW,OAAO,KAAM,CAAA,CAAC,MAAM,OAAO,KAAA,CAAM,CAAC,CAAG,EAAA;AAC9C,QAAM,MAAA,KAAA;AAAA,UACJ,CAAA,0EAAA,EAA6E,OAAO,KAAM,CAAA,CAAC,CAAC,CAAQ,KAAA,EAAA,OAAO,KAAM,CAAA,CAAC,CAAC,CAAA;AAAA,SACrH;AAAA;AACF;AACF;AAGJ;;;;"}
1
+ {"version":3,"file":"useColumnFilter.js","sources":["../../../../packages/vuu-filters/src/column-filter/useColumnFilter.ts"],"sourcesContent":["import { FilterClauseOp, FilterValue } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n ChangeEventHandler,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { CommitHandler, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { VuuTypeaheadInputProps } from \"@vuu-ui/vuu-ui-controls\";\nimport { getOperators } from \"../filter-clause/operator-utils\";\n\nexport type Operator = FilterClauseOp | \"between\";\n\nexport const assertValidOperator = (\n allowedOperators: FilterClauseOp[],\n column: ColumnDescriptor,\n op: Operator,\n) => {\n if (!allowedOperators.find((filterClauseOp) => filterClauseOp === op)) {\n console.warn(\n `[useColumnFilter] '${op} not supported for column ${column.name}'`,\n );\n }\n};\n\nexport const assertValidValue = (\n { serverDataType: _ }: ColumnDescriptor,\n operator: Operator,\n value?: FilterValue,\n) => {\n if (value !== undefined) {\n if (operator === \"between\") {\n if (!Array.isArray(value)) {\n throw Error(\n \"[useColumnFilter] 'between operator requires array of two values'\",\n );\n } else if (value.length !== 2) {\n throw Error(\n `[useColumnFilter] 'between operator requires two values, received ${value}'`,\n );\n } else if (value[0] && value[1] && typeof value[0] !== typeof value[1]) {\n throw Error(\n `[useColumnFilter] 'between operator values must be of same type, received ${typeof value[0]} and ${typeof value[1]}`,\n );\n }\n }\n // TODO validate value(s) against serverDataType\n }\n};\n\nexport type ColumnFilterHookProps = {\n column: ColumnDescriptor;\n operator?: Operator;\n /**\n * Filter value. Pair of values expected when operator is\n * 'between'\n */\n value?: FilterValue;\n /**\n * Filter change events.\n */\n onFilterChange?: (\n value: FilterValue,\n column: ColumnDescriptor,\n op: Operator,\n ) => void;\n};\n\nexport const useColumnFilter = ({\n operator = \"=\",\n value,\n column,\n onFilterChange,\n}: ColumnFilterHookProps) => {\n const getDefaultValue = (op: Operator) => (op === \"between\" ? [\"\", \"\"] : \"\");\n const filterValue = useRef(value ?? getDefaultValue(operator));\n const [op, setOp] = useState(operator);\n const allowedOperators = useMemo(() => getOperators(column), [column]);\n\n useMemo(() => {\n if (value && value !== filterValue.current) {\n filterValue.current = value;\n setTimeout(() => {\n onFilterChange?.(value, column, op);\n }, 100);\n }\n }, [value, column, op, onFilterChange]);\n\n const handleOperatorChange = useCallback((changedOp: Operator) => {\n setOp(changedOp);\n }, []);\n\n const handleCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n console.log(`[useColumnFilter] handleCommit ${newValue}`);\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [newValue as FilterValue, filterValue.current[1]];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\n );\n\n const handleRangeCommit = useCallback<CommitHandler<HTMLElement>>(\n (e, newValue) => {\n if (Array.isArray(filterValue.current)) {\n filterValue.current = [filterValue.current[0], newValue as FilterValue];\n if (\n filterValue.current &&\n (filterValue.current[0] === undefined ||\n filterValue.current[1] === undefined)\n ) {\n console.info(\n \"Range start or end value missing - ignoring onFilterChange\",\n );\n }\n } else {\n filterValue.current = newValue as FilterValue;\n }\n onFilterChange?.(filterValue.current, column, op);\n },\n [op, column, onFilterChange],\n );\n\n const handleInputChange = useCallback<ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n if (Array.isArray(filterValue.current)) {\n const editControl = queryClosest(e.target, \"[data-edit-control]\", true);\n const updated: FilterValue = [\n !editControl?.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[0],\n editControl?.className?.includes(\"rangeHigh\")\n ? e.target.value\n : filterValue.current[1],\n ];\n filterValue.current = updated;\n onFilterChange?.(updated, column, op);\n } else {\n filterValue.current = e.target.value;\n onFilterChange?.(e.target.value, column, op);\n }\n },\n [op, column, onFilterChange],\n );\n\n const inputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[0]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n const rangeInputProps = useMemo<VuuTypeaheadInputProps[\"inputProps\"]>(\n () => ({\n onChange: handleInputChange,\n value: Array.isArray(filterValue.current)\n ? filterValue.current[1]\n : filterValue.current,\n }),\n [handleInputChange],\n );\n\n return {\n op,\n allowedOperators,\n filterValue: filterValue.current,\n inputProps,\n rangeInputProps,\n handleCommit,\n handleRangeCommit,\n handleOperatorChange,\n };\n};\n"],"names":["op"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLElement, number>>(\n (e, selectedDateInputValue) => {\n console.log(\"change time\");\n if (selectedDateInputValue) {\n const dateValue = toCalendarDate(new Date(selectedDateInputValue));\n setDate(dateValue);\n if (selectedDateInputValue /* && source === \"calendar\"*/) {\n onChangeValue(toEpochMilliS(dateValue));\n }\n }\n },\n [onChangeValue, toEpochMilliS],\n );\n\n const onBlur = useCallback(() => {\n date && onChangeValue(toEpochMilliS(date));\n }, [date, onChangeValue, toEpochMilliS]);\n\n return (\n <VuuTimePicker\n data-field=\"value\"\n // inputProps={inputProps}\n className={className}\n onBlur={onBlur}\n onCommit={handleCommit}\n // selectedDate={date}\n />\n );\n};\n\nfunction getInitialState(value: FilterClauseValueEditorTimeProps[\"value\"]) {\n return value ? toCalendarDate(new Date(value)) : undefined;\n}\n\nconst getEpochMillisConverter =\n (op: NumericFilterClauseOp) =>\n (date: DateValue, timezone: string = getLocalTimeZone()): number => {\n const d = date.toDate(timezone);\n switch (op) {\n case \">\":\n case \"<=\":\n d.setHours(23, 59, 59, 999);\n return d.getTime();\n case \">=\":\n case \"<\":\n case \"=\": // converted to \"< `start of next day` and >= `start of this day`\" when query is created\n case \"!=\": // converted to \">= `start of next day` or < `start of this day`\" when query is created\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n };\n"],"names":[],"mappings":";;;;;;AAca,MAAA,2BAAA,GAA8B,CACzC,KACG,KAAA;AACH,EAAA,MAAM,EAAE,SAAA,EAAW,aAAe,EAAA,QAAA,EAAU,OAAU,GAAA,KAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,wBAAwB,QAAQ,CAAA;AAEtD,EAAM,MAAA,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,QAAA;AAAA,IAAgC,MACtD,gBAAgB,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,GAAG,sBAA2B,KAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,IAAI,sBAAwB,EAAA;AAC1B,QAAA,MAAM,SAAY,GAAA,cAAA,CAAe,IAAI,IAAA,CAAK,sBAAsB,CAAC,CAAA;AACjE,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,IAAI,sBAAsD,EAAA;AACxD,UAAc,aAAA,CAAA,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA;AACxC;AACF,KACF;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,GAC/B;AAEA,EAAM,MAAA,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAQ,IAAA,IAAA,aAAA,CAAc,aAAc,CAAA,IAAI,CAAC,CAAA;AAAA,GACxC,EAAA,CAAC,IAAM,EAAA,aAAA,EAAe,aAAa,CAAC,CAAA;AAEvC,EACE,uBAAA,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MAEX,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA;AAAA;AAAA,GAEZ;AAEJ;AAEA,SAAS,gBAAgB,KAAkD,EAAA;AACzE,EAAA,OAAO,QAAQ,cAAe,CAAA,IAAI,IAAK,CAAA,KAAK,CAAC,CAAI,GAAA,KAAA,CAAA;AACnD;AAEA,MAAM,0BACJ,CAAC,EAAA,KACD,CAAC,IAAiB,EAAA,QAAA,GAAmB,kBAA+B,KAAA;AAClE,EAAM,MAAA,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC9B,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,CAAA;AAC1B,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA,IACnB,KAAK,IAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AAEvB,CAAA;;;;"}
1
+ {"version":3,"file":"FilterClauseValueEditorTime.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/value-editors/FilterClauseValueEditorTime.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\nimport { getLocalTimeZone, DateValue } from \"@internationalized/date\";\nimport { CommitHandler, toCalendarDate } from \"@vuu-ui/vuu-utils\";\nimport { NumericFilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport { FilterClauseValueEditor } from \"../filterClauseTypes\";\nimport { VuuTimePicker } from \"@vuu-ui/vuu-ui-controls\";\n\ninterface FilterClauseValueEditorTimeProps\n extends Pick<FilterClauseValueEditor, \"onChangeValue\" | \"inputProps\"> {\n className?: string;\n value: number | undefined;\n operator: NumericFilterClauseOp;\n}\n\nexport const FilterClauseValueEditorTime = (\n props: FilterClauseValueEditorTimeProps,\n) => {\n const { className, onChangeValue, operator, value } = props;\n const toEpochMilliS = getEpochMillisConverter(operator);\n\n const [date, setDate] = useState<DateValue | undefined>(() =>\n getInitialState(value),\n );\n\n const handleCommit = useCallback<CommitHandler<HTMLInputElement, string>>(\n (e, selectedDateInputValue) => {\n console.log(\"change time\");\n if (selectedDateInputValue) {\n const dateValue = toCalendarDate(new Date(selectedDateInputValue));\n setDate(dateValue);\n if (selectedDateInputValue /* && source === \"calendar\"*/) {\n onChangeValue(toEpochMilliS(dateValue));\n }\n }\n },\n [onChangeValue, toEpochMilliS],\n );\n\n const onBlur = useCallback(() => {\n date && onChangeValue(toEpochMilliS(date));\n }, [date, onChangeValue, toEpochMilliS]);\n\n return (\n <VuuTimePicker\n data-field=\"value\"\n // inputProps={inputProps}\n className={className}\n onBlur={onBlur}\n onCommit={handleCommit}\n // selectedDate={date}\n />\n );\n};\n\nfunction getInitialState(value: FilterClauseValueEditorTimeProps[\"value\"]) {\n return value ? toCalendarDate(new Date(value)) : undefined;\n}\n\nconst getEpochMillisConverter =\n (op: NumericFilterClauseOp) =>\n (date: DateValue, timezone: string = getLocalTimeZone()): number => {\n const d = date.toDate(timezone);\n switch (op) {\n case \">\":\n case \"<=\":\n d.setHours(23, 59, 59, 999);\n return d.getTime();\n case \">=\":\n case \"<\":\n case \"=\": // converted to \"< `start of next day` and >= `start of this day`\" when query is created\n case \"!=\": // converted to \">= `start of next day` or < `start of this day`\" when query is created\n d.setHours(0, 0, 0, 0);\n return d.getTime();\n }\n };\n"],"names":[],"mappings":";;;;;;AAca,MAAA,2BAAA,GAA8B,CACzC,KACG,KAAA;AACH,EAAA,MAAM,EAAE,SAAA,EAAW,aAAe,EAAA,QAAA,EAAU,OAAU,GAAA,KAAA;AACtD,EAAM,MAAA,aAAA,GAAgB,wBAAwB,QAAQ,CAAA;AAEtD,EAAM,MAAA,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,QAAA;AAAA,IAAgC,MACtD,gBAAgB,KAAK;AAAA,GACvB;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,GAAG,sBAA2B,KAAA;AAC7B,MAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,MAAA,IAAI,sBAAwB,EAAA;AAC1B,QAAA,MAAM,SAAY,GAAA,cAAA,CAAe,IAAI,IAAA,CAAK,sBAAsB,CAAC,CAAA;AACjE,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,IAAI,sBAAsD,EAAA;AACxD,UAAc,aAAA,CAAA,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA;AACxC;AACF,KACF;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,GAC/B;AAEA,EAAM,MAAA,MAAA,GAAS,YAAY,MAAM;AAC/B,IAAQ,IAAA,IAAA,aAAA,CAAc,aAAc,CAAA,IAAI,CAAC,CAAA;AAAA,GACxC,EAAA,CAAC,IAAM,EAAA,aAAA,EAAe,aAAa,CAAC,CAAA;AAEvC,EACE,uBAAA,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,OAAA;AAAA,MAEX,SAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA;AAAA;AAAA,GAEZ;AAEJ;AAEA,SAAS,gBAAgB,KAAkD,EAAA;AACzE,EAAA,OAAO,QAAQ,cAAe,CAAA,IAAI,IAAK,CAAA,KAAK,CAAC,CAAI,GAAA,KAAA,CAAA;AACnD;AAEA,MAAM,0BACJ,CAAC,EAAA,KACD,CAAC,IAAiB,EAAA,QAAA,GAAmB,kBAA+B,KAAA;AAClE,EAAM,MAAA,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC9B,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,CAAA;AAC1B,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA,IACnB,KAAK,IAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AACrB,MAAA,OAAO,EAAE,OAAQ,EAAA;AAAA;AAEvB,CAAA;;;;"}
@@ -115,7 +115,9 @@ const merge = (f1, f2) => {
115
115
  ...f1,
116
116
  values: [
117
117
  ...f1.values,
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
118
119
  ...f2.values.filter(
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
121
  (v) => !f1.values.includes(v)
120
122
  )
121
123
  ]
@@ -244,7 +246,8 @@ const filterEquals = (f1, f2, strict = false) => {
244
246
  return true;
245
247
  }
246
248
  if (f1 && f2 && canMerge(f1, f2)) {
247
- return f1.op === f2.op && (isSingleValueFilter(f1) && isSingleValueFilter(f2) && f1.value === f2.value || isMultiValueFilter(f1) && isMultiValueFilter(f2) && sameValues(f1.values, f2.values));
249
+ return f1.op === f2.op && (isSingleValueFilter(f1) && isSingleValueFilter(f2) && f1.value === f2.value || isMultiValueFilter(f1) && isMultiValueFilter(f2) && // eslint-disable-next-line @typescript-eslint/no-explicit-any
250
+ sameValues(f1.values, f2.values));
248
251
  }
249
252
  return false;
250
253
  };
@@ -1 +1 @@
1
- {"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n AndFilter,\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n isAndFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n partition,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n mode?: any;\n value?: any;\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n ...(f2.values as any[]).filter(\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as AndFilter).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n"],"names":[],"mappings":";;AAqBO,MAAM,GAAM,GAAA;AACZ,MAAM,MAAS,GAAA;AACf,MAAM,YAAe,GAAA;AACrB,MAAM,SAAY,GAAA;AAClB,MAAM,EAAK,GAAA;AACX,MAAM,WAAc,GAAA;AACpB,MAAM,SAAY,GAAA;AAClB,MAAM,EAAK,GAAA;AAeX,MAAM,aAAgB,GAAA,CAC3B,MACA,EAAA,OAAA,GAAmC,EACP,KAAA;AAC5B,EAAA,IAAI,MAAQ,EAAA;AACV,IAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,MAAO,MAAA,CAAA,OAAA,CAAQ,OAAQ,CAAA,CAAC,CAAM,KAAA,OAAA,CAAQ,KAAK,GAAG,aAAA,CAAc,CAAC,CAAC,CAAC,CAAA;AAAA,KAC1D,MAAA;AACL,MAAA,OAAA,CAAQ,KAAK,MAA+B,CAAA;AAAA;AAC9C;AAEF,EAAO,OAAA,OAAA;AACT;AAMA,MAAM,uBAA4C,GAAA;AAAA,EAChD,WAAa,EAAA;AACf,CAAA;AAEa,MAAA,gBAAA,GAAmB,CAAC,MAA8B,KAAA;AAC7D,EAAM,MAAA,EAAE,SAAY,GAAA,MAAA;AACpB,EAAI,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACtB,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,OAAS,EAAA,MAAA,CAAO,OAAQ,CAAA,KAAA,CAAM,GAAG,CAAE,CAAA;AAAA,KACrC;AAAA,GACK,MAAA;AAEL,IAAO,OAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA;AAE3B;AAMa,MAAA,SAAA,GAAY,CACvB,cACA,EAAA,MAAA,EACA,EAAE,WAAc,GAAA,GAAA,KAA0B,uBACd,KAAA;AAC5B,EAAA,IACE,mBAAoB,CAAA,cAAc,CAClC,IAAA,cAAA,CAAe,OAAO,WACtB,EAAA;AAEA,IAAO,OAAA;AAAA,MACL,GAAG,cAAA;AAAA;AAAA;AAAA,MAGH,OAAS,EAAA,cAAA,CAAe,OAAQ,CAAA,MAAA,CAAO,MAAM;AAAA,KAC/C;AAAA,GAMK,MAAA;AACL,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,WAAA;AAAA,MACJ,OAAA,EAAS,CAAC,cAAA,EAAgB,MAAM;AAAA,KAClC;AAAA;AAEJ;AAEa,MAAA,SAAA,GAAY,CACvB,cACA,EAAA,MAAA,EACA,EAAE,WAAc,GAAA,GAAA,KAA0B,uBACnB,KAAA;AACvB,EAAI,IAAA,gBAAA,CAAiB,MAAM,CAAG,EAAA;AAC5B,IAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA,CAE1B,MAAA;AACL,MAAA,cAAA,GAAiB,sBAAsB,cAAgB,EAAA;AAAA,QACrD,MAAM,MAAO,CAAA;AAAA,OACd,CAAA;AAAA;AACH,GACF,MAAA,IAAW,iBAAkB,CAAA,MAAM,CAAG,EAAA;AACpC,IAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAGjC,IAAA,OAAO,sBAAsB,cAAgB,EAAA,EAAE,MAAM,MAAO,CAAA,MAAA,IAAU,IAAI,CAAA;AAAA;AAG5E,EAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,IAAO,OAAA,MAAA;AAAA;AAET,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,cAAA;AAAA;AAET,EAAA,IAAI,cAAe,CAAA,EAAA,KAAO,GAAO,IAAA,MAAA,CAAO,OAAO,GAAK,EAAA;AAClD,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,GAAA;AAAA,MACJ,OAAS,EAAA,OAAA,CAAQ,cAAe,CAAA,OAAA,EAAS,OAAO,OAAO;AAAA,KACzD;AAAA;AAEF,EAAI,IAAA,cAAA,CAAe,OAAO,GAAK,EAAA;AAC7B,IAAA,MAAM,OAAU,GAAA,eAAA,CAAgB,cAAe,CAAA,OAAA,EAAS,MAAM,CAAA;AAC9D,IAAO,OAAA,OAAA,CAAQ,SAAS,CAAI,GAAA,EAAE,IAAI,GAAK,EAAA,OAAA,EAAY,GAAA,OAAA,CAAQ,CAAC,CAAA;AAAA;AAE9D,EAAI,IAAA,MAAA,CAAO,OAAO,GAAK,EAAA;AACrB,IAAO,OAAA,EAAE,IAAI,GAAK,EAAA,OAAA,EAAS,OAAO,OAAQ,CAAA,MAAA,CAAO,cAAc,CAAE,EAAA;AAAA;AAGnE,EAAA,IAAI,YAAa,CAAA,cAAA,EAAgB,MAAQ,EAAA,IAAI,CAAG,EAAA;AAC9C,IAAO,OAAA,MAAA;AAAA;AAGT,EAAI,IAAA,QAAA,CAAS,cAAgB,EAAA,MAAM,CAAG,EAAA;AACpC,IAAO,OAAA,KAAA,CAAM,gBAAgB,MAAM,CAAA;AAAA;AAGrC,EAAA,OAAO,EAAE,EAAI,EAAA,WAAA,EAAa,SAAS,CAAC,cAAA,EAAgB,MAAM,CAAE,EAAA;AAC9D;AAEA,MAAM,gBAAA,GAAmB,CAAC,MAAoC,KAAA;AAC5D,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,IAAI,WAAW,MAAM,CAAA,IAAK,MAAO,CAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACpD,IAAO,OAAA,IAAA;AAAA;AAET,EAAO,OAAA,WAAA,CAAY,MAAM,CAAA,IAAK,MAAO,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,gBAAiB,CAAA,CAAC,CAAC,CAAA;AAC9E,CAAA;AAkBA,MAAM,iBAAA,GAAoB,CAAC,MAAoC,KAAA;AAC7D,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,IAAI,MAAO,CAAA,EAAA,KAAO,WAAe,IAAA,MAAA,CAAO,UAAU,EAAI,EAAA;AACpD,IAAO,OAAA,IAAA;AAAA;AAET,EAAA,OAAO,MAAO,CAAA,EAAA,KAAO,WAAe,IAAA,MAAA,CAAO,KAAU,KAAA,EAAA;AACvD,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,OAAA,EAAmB,MAAmB,KAAA;AAC7D,EAAO,OAAA,OAAA,CAAQ,OAAO,MAAM,CAAA;AAC9B,CAAA;AAEA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAmC,KAAA;AAC5D,EAAI,IAAA,gBAAA,CAAiB,EAAE,CAAG,EAAA;AACxB,IAAO,OAAA,EAAA;AAAA;AAET,EAAA,IAAI,UAAW,CAAA,EAAE,CAAK,IAAA,UAAA,CAAW,EAAE,CAAG,EAAA;AACpC,IAAO,OAAA;AAAA,MACL,GAAG,EAAA;AAAA,MACH,MAAQ,EAAA;AAAA,QACN,GAAG,EAAG,CAAA,MAAA;AAAA,QACN,GAAI,GAAG,MAAiB,CAAA,MAAA;AAAA,UACtB,CAAC,CAAuB,KAAA,CAAE,EAAG,CAAA,MAAA,CAAiB,SAAS,CAAC;AAAA;AAC1D;AACF,KACF;AAAA,aACS,UAAW,CAAA,EAAE,CAAK,IAAA,EAAA,CAAG,OAAO,MAAQ,EAAA;AAC7C,IAAO,OAAA;AAAA,MACL,GAAG,EAAA;AAAA;AAAA;AAAA,MAGH,QAAQ,EAAG,CAAA,MAAA,CAAO,OAAO,CAAC,EAAA,CAAG,KAAK,CAAC;AAAA,KACrC;AAAA,aACS,EAAG,CAAA,EAAA,KAAO,MAAU,IAAA,EAAA,CAAG,OAAO,MAAQ,EAAA;AAC/C,IAAO,OAAA;AAAA,MACL,QAAQ,EAAG,CAAA,MAAA;AAAA,MACX,EAAI,EAAA,EAAA;AAAA;AAAA;AAAA,MAGJ,MAAQ,EAAA,CAAC,EAAG,CAAA,KAAA,EAAO,GAAG,KAAK;AAAA,KAC7B;AAAA;AAEF,EAAO,OAAA,EAAA;AACT,CAAA;AAEA,MAAM,OAAA,GAAU,CAAC,eAAA,EAA2B,kBAAiC,KAAA;AAC3E,EAAM,MAAA,cAAA,GAAiB,CAAC,EAAE,EAAA,EAAI,KAAe,EAAA,EAAE,EAAI,EAAA,GAAA,EAAkB,KAAA;AACnE,IAAA,OACE,QAAQ,GACP,IAAA,GAAA,CAAI,CAAC,CAAA,KAAM,OAAO,GAAI,CAAA,CAAC,CAAM,KAAA,GAAA,IAC7B,IAAI,CAAC,CAAA,KAAM,GAAO,IAAA,GAAA,CAAI,CAAC,CAAM,KAAA,GAAA;AAAA,GAElC;AACA,EAAM,MAAA,QAAA,GAAW,CAAC,cAAA,EAAwB,iBAA8B,KAAA;AACtE,IAAA,OACE,eAAe,MAAW,KAAA,iBAAA,CAAkB,MAC5C,IAAA,cAAA,CAAe,gBAAgB,iBAAiB,CAAA;AAAA,GAEpD;AACA,EAAM,MAAA,eAAA,GAAkB,CAAC,cAAA,KACvB,kBAAmB,CAAA,IAAA;AAAA,IAAK,CAAC,iBAAA,KACvB,QAAS,CAAA,cAAA,EAAgB,iBAAiB;AAAA,GACtC,KAAA,KAAA;AACR,EAAA,OAAO,eAAgB,CAAA,MAAA,CAAO,eAAe,CAAA,CAAE,OAAO,kBAAkB,CAAA;AAC1E,CAAA;AAEa,MAAA,YAAA,GAAe,CAAC,YAAA,EAAsB,cAA2B,KAAA;AAC5E,EAAA,IAAI,YAAa,CAAA,YAAA,EAAc,cAAgB,EAAA,IAAI,CAAG,EAAA;AACpD,IAAO,OAAA,IAAA;AAAA;AAET,EAAI,IAAA,YAAA,CAAa,OAAO,GAAK,EAAA;AAC3B,IAAM,MAAA,KAAA;AAAA,MACJ,8BAA8B,IAAK,CAAA,SAAA;AAAA,QACjC;AAAA,OACD,CAAA,MAAA,EAAS,IAAK,CAAA,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,KACxC;AAAA;AAEF,EAAM,MAAA,OAAA,GAAU,aAAa,OAAQ,CAAA,MAAA;AAAA,IACnC,CAAC,CAAA,KAAM,CAAC,YAAA,CAAa,GAAG,cAAc;AAAA,GACxC;AACA,EAAA,OAAO,QAAQ,MAAS,GAAA,CAAA,GAAI,EAAE,IAAM,EAAA,GAAA,EAAK,SAAY,GAAA,IAAA;AACvD;AAEa,MAAA,mBAAA,GAAsB,CACjC,UAAA,EACA,MAC6C,KAAA;AAC7C,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,CAAC,QAAW,KAAS,CAAA,CAAA;AAAA;AAE9B,EAAI,IAAA,MAAA,CAAO,WAAW,UAAY,EAAA;AAChC,IAAO,OAAA,CAAC,QAAQ,KAAS,CAAA,CAAA;AAAA;AAE3B,EAAI,IAAA,MAAA,CAAO,OAAO,GAAK,EAAA;AACrB,IAAO,OAAA,CAAC,QAAW,MAAM,CAAA;AAAA;AAE3B,EAAA,MAAM,CAAC,CAAC,YAAA,GAAe,KAAS,CAAA,CAAA,EAAG,OAAO,CAAI,GAAA,SAAA;AAAA,IAC3C,MAAqB,CAAA,OAAA;AAAA,IACtB,CAAC,CAAM,KAAA,CAAA,CAAE,MAAW,KAAA;AAAA,GACtB;AACA,EAAA,OAAO,OAAQ,CAAA,MAAA,KAAW,CACtB,GAAA,CAAC,cAAc,OAAQ,CAAA,CAAC,CAAC,CAAA,GACzB,CAAC,YAAc,EAAA,EAAE,EAAI,EAAA,GAAA,EAAK,SAAS,CAAA;AACzC;AAEa,MAAA,eAAA,GAAkB,CAAC,MAAA,EAAgB,MAA2B,KAAA;AACzE,EAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,IAAO,OAAA;AAAA,MACL,IAAI,MAAO,CAAA,EAAA;AAAA,MACX,OAAA,EAAS,OAAO,OAAQ,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,eAAA,CAAgB,CAAG,EAAA,MAAM,CAAC;AAAA,KAC/D;AAAA;AAEF,EAAO,OAAA,EAAE,GAAG,MAAA,EAAQ,MAAO,EAAA;AAC7B;AAEa,MAAA,oBAAA,GAAuB,CAClC,MAAA,EACA,MACY,KAAA;AACZ,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,KAAA;AAAA;AAET,EAAA,MAAM,EAAE,EAAA,EAAI,MAAQ,EAAA,aAAA,EAAkB,GAAA,MAAA;AACtC,EAAA,QAAQ,EAAI;AAAA,IACV,KAAK,GAAA;AAAA,IACL,KAAK,EAAA;AACH,MACE,OAAA,MAAA,CAAO,OAAW,IAAA,IAAA,IAClB,MAAO,CAAA,OAAA,CAAQ,IAAK,CAAA,CAAC,CAAM,KAAA,oBAAA,CAAqB,CAAG,EAAA,MAAM,CAAC,CAAA;AAAA,IAE9D;AACE,MAAA,OAAO,kBAAkB,MAAO,CAAA,IAAA;AAAA;AAEtC;AAEA,MAAM,qBAAA,GAAwB,CAC5B,YAAA,EACA,MACuB,KAAA;AACvB,EAAA,MAAM,UAAU,MAAO,CAAA,IAAA;AACvB,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAO,OAAA,KAAA,CAAA;AAAA;AAET,EAAI,IAAA,YAAA,CAAa,WAAW,OAAS,EAAA;AACnC,IAAO,OAAA,KAAA,CAAA;AAAA;AAET,EAAA,IAAI,WAAY,CAAA,YAAY,CAAK,IAAA,UAAA,CAAW,YAAY,CAAG,EAAA;AACzD,IAAM,MAAA,EAAE,IAAO,GAAA,YAAA;AACf,IAAA,MAAM,UAAU,YAAa,CAAA,OAAA;AAC7B,IAAA,MAAM,kBAAkB,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,WAAW,OAAO,CAAA;AAClE,IAAA,QAAQ,gBAAgB,MAAQ;AAAA,MAC9B,KAAK,CAAA;AACH,QAAO,OAAA,KAAA,CAAA;AAAA,MACT,KAAK,CAAA;AACH,QAAA,OAAO,gBAAgB,CAAC,CAAA;AAAA,MAC1B;AACE,QAAO,OAAA,EAAE,EAAI,EAAA,OAAA,EAAS,eAAgB,EAAA;AAAA;AAC1C;AAEF,EAAO,OAAA,YAAA;AACT,CAAA;AAEA,MAAM,WAAW,CAAC,EAAA,EAAY,OAC5B,EAAG,CAAA,MAAA,KAAW,GAAG,MAChB,KAAA,EAAA,CAAG,EAAO,KAAA,GAAA,IAAO,GAAG,EAAO,KAAA,IAAA,CAAA,KAC3B,GAAG,EAAO,KAAA,GAAA,IAAO,GAAG,EAAO,KAAA,IAAA,CAAA;AAE9B,MAAM,UAAA,GAAa,CAAI,IAAA,EAAW,IAAc,KAAA;AAC9C,EAAA,IAAI,SAAS,IAAM,EAAA;AACjB,IAAO,OAAA,IAAA;AAAA;AAET,EAAI,IAAA,IAAA,CAAK,MAAW,KAAA,IAAA,CAAK,MAAQ,EAAA;AAC/B,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAC5B,IAAA,MAAM,CAAI,GAAA,IAAA,CAAK,KAAM,EAAA,CAAE,IAAK,EAAA;AAC5B,IAAA,OAAO,EAAE,IAAK,CAAA,GAAG,CAAM,KAAA,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA;AAEnC,EAAO,OAAA,KAAA;AACT,CAAA;AAEO,MAAM,YAAe,GAAA,CAAC,EAAa,EAAA,EAAA,EAAa,SAAS,KAAU,KAAA;AACxE,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,IAAA;AAAA;AAET,EAAA,IAAI,EAAM,IAAA,EAAA,IAAM,QAAS,CAAA,EAAA,EAAI,EAAE,CAAG,EAAA;AAChC,IACE,OAAA,EAAA,CAAG,EAAO,KAAA,EAAA,CAAG,EACX,KAAA,mBAAA,CAAoB,EAAE,CACtB,IAAA,mBAAA,CAAoB,EAAE,CAAA,IACtB,EAAG,CAAA,KAAA,KAAU,GAAG,KACf,IAAA,kBAAA,CAAmB,EAAE,CAAA,IACpB,kBAAmB,CAAA,EAAE,KACrB,UAAW,CAAA,EAAA,CAAG,MAAiB,EAAA,EAAA,CAAG,MAAM,CAAA,CAAA;AAAA;AAGhD,EAAO,OAAA,KAAA;AACT;AAEO,MAAM,YAAe,GAAA,CAC1B,MACA,EAAA,SAAA,EACA,IACuB,KAAA;AACvB,EAAA,IAAI,UAAU,SAAW,EAAA;AACvB,IAAA,IAAI,SAAS,SAAW,EAAA;AACtB,MAAO,OAAA,SAAA;AAAA;AAET,IAAI,IAAA,MAAA,CAAO,OAAO,KAAO,EAAA;AACvB,MAAO,OAAA;AAAA,QACL,GAAG,MAAA;AAAA,QACH,OAAS,EAAA,MAAA,CAAO,OAAQ,CAAA,MAAA,CAAO,SAAS;AAAA,OAC1C;AAAA;AAEF,IAAM,MAAA,EAAE,MAAQ,EAAA,UAAA,EAAe,GAAA,SAAA;AAC/B,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,MAAM,iBAAiB,SAAU,CAAA,MAAA,GAC7B,sBAAuB,CAAA,MAAA,EAAQ,UAAU,CACzC,GAAA,KAAA,CAAA;AACJ,MAAA,IAAI,kBAAkB,UAAY,EAAA;AAGhC,QAAA,MAAM,SAAS,qBAAsB,CAAA,MAAA,EAAQ,EAAE,IAAA,EAAM,YAAY,CAAA;AACjE,QAAO,OAAA,YAAA,CAAa,MAAQ,EAAA,SAAA,EAAW,KAAK,CAAA;AAAA;AAC9C;AAEF,IAAO,OAAA;AAAA,MACL,EAAI,EAAA,KAAA;AAAA,MACJ,OAAA,EAAS,CAAC,MAAA,EAAQ,SAAS;AAAA,KAC7B;AAAA;AAEF,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA;AAET,EAAO,OAAA,MAAA;AACT;AAEO,MAAM,kBAAqB,GAAA,CAChC,MACA,EAAA,YAAA,EACA,kBACuB,KAAA;AACvB,EAAI,IAAA,YAAA,CAAa,WAAW,CAAG,EAAA;AAC7B,IAAO,OAAA,KAAA,CAAA;AAAA;AAGT,EAAA,IAAI,kBAAoB,EAAA;AAEtB,IAAM,MAAA,UAAA,GAAa,YAAa,CAAA,CAAC,CAAE,CAAA,SAAA,CAAU,GAAG,YAAa,CAAA,CAAC,CAAE,CAAA,MAAA,GAAS,CAAC,CAAA;AAC1E,IAAO,OAAA;AAAA,MACL,MAAA;AAAA,MACA,EAAI,EAAA,QAAA;AAAA,MACJ,KAAA,EAAO,IAAI,UAAU,CAAA,CAAA;AAAA,KACvB;AAAA;AAGF,EAAO,OAAA;AAAA,IACL,MAAA;AAAA,IACA,EAAI,EAAA,IAAA;AAAA,IACJ,QAAQ,YAAa,CAAA,GAAA,CAAI,CAAC,KAAU,KAAA,CAAA,CAAA,EAAI,KAAK,CAAG,CAAA,CAAA;AAAA,GAClD;AACF;AAEO,MAAM,gBAAmB,GAAA,CAC9B,MACA,EAAA,EAAA,EACA,KAC6B,KAAA;AAC7B,EAAI,IAAA,EAAA,KAAO,QAAkB,OAAA,KAAA,CAAA;AAC7B,EAAA,IAAI,KAAU,KAAA,KAAA,CAAA,IAAa,KAAM,CAAA,KAAK,GAAU,OAAA,KAAA,CAAA;AAChD,EAAO,OAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,KAAM,EAAA;AAC7B;;;;"}
1
+ {"version":3,"file":"filter-utils.js","sources":["../../../packages/vuu-filters/src/filter-utils.ts"],"sourcesContent":["import { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n AndFilter,\n Filter,\n FilterClause,\n FilterCombinatorOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n extractFilterForColumn,\n isAndFilter,\n isInFilter,\n isMultiClauseFilter,\n isMultiValueFilter,\n isOrFilter,\n isSingleValueFilter,\n partition,\n} from \"@vuu-ui/vuu-utils\";\n\nexport const AND = \"and\";\nexport const EQUALS = \"=\";\nexport const GREATER_THAN = \">\";\nexport const LESS_THAN = \"<\";\nexport const OR = \"or\";\nexport const STARTS_WITH = \"starts\";\nexport const ENDS_WITH = \"ends\";\nexport const IN = \"in\";\n\nexport type FilterType =\n | \"and\"\n | \"=\"\n | \">\"\n | \">=\"\n | \"in\"\n | \"<=\"\n | \"<\"\n | \"NOT_IN\"\n | \"NOT_SW\"\n | \"or\"\n | \"SW\";\n\nexport const filterClauses = (\n filter: Partial<Filter> | FilterWithPartialClause | null,\n clauses: Partial<FilterClause>[] = [],\n): Partial<FilterClause>[] => {\n if (filter) {\n if (isMultiClauseFilter(filter)) {\n filter.filters.forEach((f) => clauses.push(...filterClauses(f)));\n } else {\n clauses.push(filter as Partial<FilterClause>);\n }\n }\n return clauses;\n};\n\ntype AddFilterOptions = {\n combineWith: FilterCombinatorOp;\n};\n\nconst DEFAULT_ADD_FILTER_OPTS: AddFilterOptions = {\n combineWith: \"and\",\n};\n\nexport const removeLastClause = (filter: MultiClauseFilter) => {\n const { filters } = filter;\n if (filters.length > 2) {\n return {\n ...filter,\n filters: filter.filters.slice(0, -1),\n };\n } else {\n // must be 2, we never have 1\n return filter.filters[0];\n }\n};\n\n/**\n Allows an empty FilterClause to be appended to an existing filter - for use\n in filter editing UI only.\n*/\nexport const addClause = (\n existingFilter: Filter,\n clause: Partial<Filter>,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): FilterWithPartialClause => {\n if (\n isMultiClauseFilter(existingFilter) &&\n existingFilter.op === combineWith\n ) {\n // if (isCompleteFilter(clause)) {\n return {\n ...existingFilter,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n filters: existingFilter.filters.concat(clause),\n };\n // } else {\n // throw Error(\n // \"filter-utils, replaceFilter, only a valid clause can be added to a filter\"\n // );\n // }\n } else {\n return {\n op: combineWith,\n filters: [existingFilter, clause],\n };\n }\n};\n\nexport const addFilter = (\n existingFilter: Filter | undefined,\n filter: Filter,\n { combineWith = AND }: AddFilterOptions = DEFAULT_ADD_FILTER_OPTS,\n): Filter | undefined => {\n if (includesNoValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the no-values filter\n } else {\n existingFilter = removeFilterForColumn(existingFilter, {\n name: filter.column,\n });\n }\n } else if (includesAllValues(filter)) {\n if (isMultiClauseFilter(filter)) {\n // TODO identify the column that is contributing the all-values filter\n }\n return removeFilterForColumn(existingFilter, { name: filter.column ?? \"\" });\n }\n\n if (!existingFilter) {\n return filter;\n }\n if (!filter) {\n return existingFilter;\n }\n if (existingFilter.op === AND && filter.op === AND) {\n return {\n op: AND,\n filters: combine(existingFilter.filters, filter.filters),\n };\n }\n if (existingFilter.op === AND) {\n const filters = replaceOrInsert(existingFilter.filters, filter);\n return filters.length > 1 ? { op: AND, filters } : filters[0];\n }\n if (filter.op === AND) {\n return { op: AND, filters: filter.filters.concat(existingFilter) };\n }\n\n if (filterEquals(existingFilter, filter, true)) {\n return filter;\n }\n\n if (canMerge(existingFilter, filter)) {\n return merge(existingFilter, filter);\n }\n\n return { op: combineWith, filters: [existingFilter, filter] };\n};\n\nconst includesNoValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (isInFilter(filter) && filter.values.length === 0) {\n return true;\n }\n return isAndFilter(filter) && filter.filters.some((f) => includesNoValues(f));\n};\n\ninterface CommonFilter {\n colName?: string;\n otherColFilters?: Filter[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n mode?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any;\n op?: \"or\" | \"and\";\n column?: string;\n filters?: Filter[];\n}\n\nexport interface OtherFilter extends CommonFilter {\n type: FilterType;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n values?: any[];\n}\n\nconst includesAllValues = (filter?: Filter | null): boolean => {\n if (!filter) {\n return false;\n }\n if (filter.op === STARTS_WITH && filter.value === \"\") {\n return true;\n }\n return filter.op === STARTS_WITH && filter.value === \"\";\n};\n\nconst replaceOrInsert = (filters: Filter[], filter: Filter) => {\n return filters.concat(filter);\n};\n\nconst merge = (f1: Filter, f2: Filter): Filter | undefined => {\n if (includesNoValues(f2)) {\n return f2;\n }\n if (isInFilter(f1) && isInFilter(f2)) {\n return {\n ...f1,\n values: [\n ...f1.values,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...(f2.values as any[]).filter(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (v: string | number) => !(f1.values as any[]).includes(v),\n ),\n ],\n };\n } else if (isInFilter(f1) && f2.op === EQUALS) {\n return {\n ...f1,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: f1.values.concat([f2.value]),\n };\n } else if (f1.op === EQUALS && f2.op === EQUALS) {\n return {\n column: f1.column,\n op: IN,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n values: [f1.value, f2.value],\n };\n }\n return f2;\n};\n\nconst combine = (existingFilters: Filter[], replacementFilters: Filter[]) => {\n const equivalentType = ({ op: op1 }: Filter, { op: op2 }: Filter) => {\n return (\n op1 === op2 ||\n (op1[0] === \">\" && op2[0] === \">\") ||\n (op1[0] === \"<\" && op2[0] === \"<\")\n );\n };\n const replaces = (existingFilter: Filter, replacementFilter: Filter) => {\n return (\n existingFilter.column === replacementFilter.column &&\n equivalentType(existingFilter, replacementFilter)\n );\n };\n const stillApplicable = (existingFilter: Filter) =>\n replacementFilters.some((replacementFilter) =>\n replaces(existingFilter, replacementFilter),\n ) === false;\n return existingFilters.filter(stillApplicable).concat(replacementFilters);\n};\n\nexport const removeFilter = (sourceFilter: Filter, filterToRemove: Filter) => {\n if (filterEquals(sourceFilter, filterToRemove, true)) {\n return null;\n }\n if (sourceFilter.op !== AND) {\n throw Error(\n `removeFilter cannot remove ${JSON.stringify(\n filterToRemove,\n )} from ${JSON.stringify(sourceFilter)}`,\n );\n }\n const filters = sourceFilter.filters.filter(\n (f) => !filterEquals(f, filterToRemove),\n );\n return filters.length > 0 ? { type: AND, filters } : null;\n};\n\nexport const splitFilterOnColumn = (\n columnName: string,\n filter?: Filter,\n): [Filter | undefined, Filter | undefined] => {\n if (!filter) {\n return [undefined, undefined];\n }\n if (filter.column === columnName) {\n return [filter, undefined];\n }\n if (filter.op !== AND) {\n return [undefined, filter];\n }\n const [[columnFilter = undefined], filters] = partition(\n (filter as AndFilter).filters,\n (f) => f.column === columnName,\n );\n return filters.length === 1\n ? [columnFilter, filters[0]]\n : [columnFilter, { op: AND, filters }];\n};\n\nexport const overrideColName = (filter: Filter, column: string): Filter => {\n if (isMultiClauseFilter(filter)) {\n return {\n op: filter.op,\n filters: filter.filters.map((f) => overrideColName(f, column)),\n };\n }\n return { ...filter, column };\n};\n\nexport const filterIncludesColumn = (\n filter: Filter,\n column: ColumnDescriptor,\n): boolean => {\n if (!filter) {\n return false;\n }\n const { op, column: filterColName } = filter;\n switch (op) {\n case AND:\n case OR:\n return (\n filter.filters != null &&\n filter.filters.some((f) => filterIncludesColumn(f, column))\n );\n default:\n return filterColName === column.name;\n }\n};\n\nconst removeFilterForColumn = (\n sourceFilter: Filter | undefined,\n column: ColumnDescriptor,\n): Filter | undefined => {\n const colName = column.name;\n if (!sourceFilter) {\n return undefined;\n }\n if (sourceFilter.column === colName) {\n return undefined;\n }\n if (isAndFilter(sourceFilter) || isOrFilter(sourceFilter)) {\n const { op } = sourceFilter;\n const filters = sourceFilter.filters;\n const otherColFilters = filters.filter((f) => f.column !== colName);\n switch (otherColFilters.length) {\n case 0:\n return undefined;\n case 1:\n return otherColFilters[0];\n default:\n return { op, filters: otherColFilters };\n }\n }\n return sourceFilter;\n};\n\nconst canMerge = (f1: Filter, f2: Filter) =>\n f1.column === f2.column &&\n (f1.op === \"=\" || f1.op === \"in\") &&\n (f2.op === \"=\" || f2.op === \"in\");\n\nconst sameValues = <T>(arr1: T[], arr2: T[]) => {\n if (arr1 === arr2) {\n return true;\n }\n if (arr1.length === arr2.length) {\n const a = arr1.slice().sort();\n const b = arr2.slice().sort();\n return a.join(\"|\") === b.join(\"|\");\n }\n return false;\n};\n\nexport const filterEquals = (f1?: Filter, f2?: Filter, strict = false) => {\n if (!strict) {\n return true;\n }\n if (f1 && f2 && canMerge(f1, f2)) {\n return (\n f1.op === f2.op &&\n ((isSingleValueFilter(f1) &&\n isSingleValueFilter(f2) &&\n f1.value === f2.value) ||\n (isMultiValueFilter(f1) &&\n isMultiValueFilter(f2) &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n sameValues(f1.values as any[], f2.values)))\n );\n }\n return false;\n};\n\nexport const updateFilter = (\n filter: Filter | undefined,\n newFilter: Filter | undefined,\n mode: \"add\" | \"replace\",\n): Filter | undefined => {\n if (filter && newFilter) {\n if (mode === \"replace\") {\n return newFilter;\n }\n if (filter.op === \"and\") {\n return {\n ...filter,\n filters: filter.filters.concat(newFilter),\n };\n }\n const { column: columnName } = newFilter;\n if (columnName) {\n const existingClause = newFilter.column\n ? extractFilterForColumn(filter, columnName)\n : undefined;\n if (existingClause && columnName) {\n // The filter already contains a clause for this column, replace\n // with the new clause\n const result = removeFilterForColumn(filter, { name: columnName });\n return updateFilter(result, newFilter, \"add\");\n }\n }\n return {\n op: \"and\",\n filters: [filter, newFilter],\n };\n }\n if (newFilter) {\n return newFilter;\n }\n return filter;\n};\n\nexport const getTypeaheadFilter = (\n column: string,\n filterValues: string[],\n isStartsWithFilter?: boolean,\n): Filter | undefined => {\n if (filterValues.length === 0) {\n return undefined;\n }\n\n if (isStartsWithFilter) {\n // multiple starts with filters not currently supported\n const startsWith = filterValues[0].substring(0, filterValues[0].length - 3);\n return {\n column,\n op: \"starts\",\n value: `\"${startsWith}\"`,\n };\n }\n\n return {\n column,\n op: \"in\",\n values: filterValues.map((value) => `\"${value}\"`),\n };\n};\n\nexport const getNumericFilter = (\n column: string,\n op?: NumericFilterClauseOp,\n value?: number,\n): FilterClause | undefined => {\n if (op === undefined) return undefined;\n if (value === undefined || isNaN(value)) return undefined;\n return { column, op, value };\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
- "version": "0.13.32",
2
+ "version": "0.13.34",
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.32",
8
- "@vuu-ui/vuu-protocol-types": "0.13.32",
9
- "@vuu-ui/vuu-table-types": "0.13.32",
10
- "@vuu-ui/vuu-filter-types": "0.13.32"
7
+ "@vuu-ui/vuu-data-types": "0.13.34",
8
+ "@vuu-ui/vuu-protocol-types": "0.13.34",
9
+ "@vuu-ui/vuu-table-types": "0.13.34",
10
+ "@vuu-ui/vuu-filter-types": "0.13.34"
11
11
  },
12
12
  "dependencies": {
13
- "@vuu-ui/vuu-data-react": "0.13.32",
14
- "@vuu-ui/vuu-filter-parser": "0.13.32",
15
- "@vuu-ui/vuu-popups": "0.13.32",
16
- "@vuu-ui/vuu-ui-controls": "0.13.32",
17
- "@vuu-ui/vuu-table": "0.13.32",
18
- "@vuu-ui/vuu-utils": "0.13.32",
13
+ "@vuu-ui/vuu-data-react": "0.13.34",
14
+ "@vuu-ui/vuu-filter-parser": "0.13.34",
15
+ "@vuu-ui/vuu-popups": "0.13.34",
16
+ "@vuu-ui/vuu-ui-controls": "0.13.34",
17
+ "@vuu-ui/vuu-table": "0.13.34",
18
+ "@vuu-ui/vuu-utils": "0.13.34",
19
19
  "@salt-ds/core": "1.43.0",
20
20
  "@salt-ds/styles": "0.2.1",
21
21
  "@salt-ds/window": "0.1.1"
@@ -1,16 +1,17 @@
1
1
  import { SegmentedButtonGroupProps } from "@salt-ds/core";
2
+ import { ForwardedRef, ReactElement } from "react";
3
+ import { ColumnFilterHookProps } from "./useColumnFilter";
2
4
  import { VuuTable } from "@vuu-ui/vuu-protocol-types";
3
- import { ColumnFilterHookProps, FilterValue } from "./useColumnFilter";
4
- export interface ColumnFilterProps extends ColumnFilterHookProps, SegmentedButtonGroupProps {
5
+ export interface ColumnFilterProps extends SegmentedButtonGroupProps, Pick<ColumnFilterHookProps, "column" | "operator" | "value" | "onFilterChange"> {
6
+ /**
7
+ * Display operator picker.
8
+ */
5
9
  showOperatorPicker?: boolean;
6
10
  /**
7
11
  * VuuTable is required if typeahead support is expected.
8
12
  */
9
13
  table?: VuuTable;
10
- /**
11
- * Initial filter value. Pair of values expewcted when operator is
12
- * 'between'
13
- */
14
- value?: FilterValue | [FilterValue, FilterValue];
15
14
  }
16
- export declare const ColumnFilter: ({ column, className, operator, showOperatorPicker, table, value, ...buttonGroupProps }: ColumnFilterProps) => import("react/jsx-runtime").JSX.Element;
15
+ export declare const ColumnFilter: (props: ColumnFilterProps & {
16
+ ref?: ForwardedRef<HTMLDivElement>;
17
+ }) => ReactElement<ColumnFilterProps>;
@@ -1,8 +1,29 @@
1
- import { FilterOp } from "@vuu-ui/vuu-filter-types";
1
+ import { FilterClauseOp, FilterValue } from "@vuu-ui/vuu-filter-types";
2
2
  import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
3
- export type FilterValue = string | number | [string, string] | [number, number];
4
- export declare const assertValidValue: ({ serverDataType: _ }: ColumnDescriptor, operator: FilterOp | "between", value?: FilterValue | FilterValue[]) => void;
5
- export interface ColumnFilterHookProps {
3
+ import { CommitHandler } from "@vuu-ui/vuu-utils";
4
+ export type Operator = FilterClauseOp | "between";
5
+ export declare const assertValidOperator: (allowedOperators: FilterClauseOp[], column: ColumnDescriptor, op: Operator) => void;
6
+ export declare const assertValidValue: ({ serverDataType: _ }: ColumnDescriptor, operator: Operator, value?: FilterValue) => void;
7
+ export type ColumnFilterHookProps = {
6
8
  column: ColumnDescriptor;
7
- operator?: FilterOp | "between";
8
- }
9
+ operator?: Operator;
10
+ /**
11
+ * Filter value. Pair of values expected when operator is
12
+ * 'between'
13
+ */
14
+ value?: FilterValue;
15
+ /**
16
+ * Filter change events.
17
+ */
18
+ onFilterChange?: (value: FilterValue, column: ColumnDescriptor, op: Operator) => void;
19
+ };
20
+ export declare const useColumnFilter: ({ operator, value, column, onFilterChange, }: ColumnFilterHookProps) => {
21
+ op: "contains" | "starts" | "=" | "!=" | ">" | ">=" | "<=" | "<" | "ends" | "in" | "between";
22
+ allowedOperators: FilterClauseOp[];
23
+ filterValue: FilterValue;
24
+ inputProps: (Partial<import("react").InputHTMLAttributes<HTMLInputElement>> & import("@salt-ds/core").DataAttributes) | undefined;
25
+ rangeInputProps: (Partial<import("react").InputHTMLAttributes<HTMLInputElement>> & import("@salt-ds/core").DataAttributes) | undefined;
26
+ handleCommit: CommitHandler<HTMLElement>;
27
+ handleRangeCommit: CommitHandler<HTMLElement>;
28
+ handleOperatorChange: (changedOp: Operator) => void;
29
+ };