@vuu-ui/vuu-filters 0.8.14-debug → 0.8.15-debug

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/cjs/index.js +521 -127
  2. package/cjs/index.js.map +4 -4
  3. package/esm/index.js +514 -109
  4. package/esm/index.js.map +4 -4
  5. package/index.css +16 -18
  6. package/index.css.map +2 -2
  7. package/package.json +10 -10
  8. package/types/vuu-data/src/array-data-source/aggregate-utils.d.ts +8 -0
  9. package/types/vuu-data/src/array-data-source/array-data-source.d.ts +84 -0
  10. package/types/vuu-data/src/array-data-source/array-data-utils.d.ts +5 -0
  11. package/types/vuu-data/src/array-data-source/group-utils.d.ts +10 -0
  12. package/types/vuu-data/src/array-data-source/sort-utils.d.ts +4 -0
  13. package/types/vuu-data/src/authenticate.d.ts +1 -0
  14. package/types/vuu-data/src/connection-manager.d.ts +50 -0
  15. package/types/vuu-data/src/connectionTypes.d.ts +5 -0
  16. package/types/vuu-data/src/constants.d.ts +41 -0
  17. package/types/vuu-data/src/data-source.d.ts +237 -0
  18. package/types/vuu-data/src/index.d.ts +10 -0
  19. package/types/vuu-data/src/inlined-worker.d.ts +1 -0
  20. package/types/vuu-data/src/json-data-source.d.ts +56 -0
  21. package/types/vuu-data/src/message-utils.d.ts +28 -0
  22. package/types/vuu-data/src/remote-data-source.d.ts +65 -0
  23. package/types/vuu-data/src/server-proxy/messages.d.ts +38 -0
  24. package/types/vuu-data/src/vuuUIMessageTypes.d.ts +228 -0
  25. package/types/vuu-data/src/websocket-connection.d.ts +25 -0
  26. package/types/vuu-filters/src/filter-bar/FilterBarMenu.d.ts +2 -0
  27. package/types/{filter-bar → vuu-filters/src/filter-bar}/useFilterBar.d.ts +10 -5
  28. package/types/vuu-filters/src/filter-bar/useFilterBarMenu.d.ts +5 -0
  29. package/types/{filter-bar → vuu-filters/src/filter-bar}/useFilters.d.ts +3 -1
  30. package/types/{filter-builder-menu → vuu-filters/src/filter-builder-menu}/FilterBuilderMenu.d.ts +3 -1
  31. package/types/{filter-clause → vuu-filters/src/filter-clause}/FilterClauseEditor.d.ts +6 -2
  32. package/types/{filter-clause → vuu-filters/src/filter-clause}/TextInput.d.ts +1 -0
  33. package/types/{filter-clause → vuu-filters/src/filter-clause}/filterClauseTypes.d.ts +4 -1
  34. package/types/{filter-clause → vuu-filters/src/filter-clause}/useFilterClauseEditor.d.ts +9 -3
  35. package/types/{filter-pill → vuu-filters/src/filter-pill}/FilterPill.d.ts +1 -1
  36. package/types/vuu-filters/src/filter-pill/filterAsReactNode.d.ts +3 -0
  37. package/types/{filter-utils.d.ts → vuu-filters/src/filter-utils.d.ts} +2 -1
  38. /package/types/{column-filter → vuu-filters/src/column-filter}/utils.d.ts +0 -0
  39. /package/types/{filter-bar → vuu-filters/src/filter-bar}/FilterBar.d.ts +0 -0
  40. /package/types/{filter-bar → vuu-filters/src/filter-bar}/index.d.ts +0 -0
  41. /package/types/{filter-builder-menu → vuu-filters/src/filter-builder-menu}/index.d.ts +0 -0
  42. /package/types/{filter-clause → vuu-filters/src/filter-clause}/ExpandoCombobox.d.ts +0 -0
  43. /package/types/{filter-clause → vuu-filters/src/filter-clause}/FilterMenu.d.ts +0 -0
  44. /package/types/{filter-clause → vuu-filters/src/filter-clause}/FilterMenuOptions.d.ts +0 -0
  45. /package/types/{filter-clause → vuu-filters/src/filter-clause}/NumericInput.d.ts +0 -0
  46. /package/types/{filter-clause → vuu-filters/src/filter-clause}/index.d.ts +0 -0
  47. /package/types/{filter-clause → vuu-filters/src/filter-clause}/operator-utils.d.ts +0 -0
  48. /package/types/{filter-input → vuu-filters/src/filter-input}/FilterInput.d.ts +0 -0
  49. /package/types/{filter-input → vuu-filters/src/filter-input}/FilterLanguage.d.ts +0 -0
  50. /package/types/{filter-input → vuu-filters/src/filter-input}/filterInfo.d.ts +0 -0
  51. /package/types/{filter-input → vuu-filters/src/filter-input}/highlighting.d.ts +0 -0
  52. /package/types/{filter-input → vuu-filters/src/filter-input}/index.d.ts +0 -0
  53. /package/types/{filter-input → vuu-filters/src/filter-input}/theme.d.ts +0 -0
  54. /package/types/{filter-input → vuu-filters/src/filter-input}/useCodeMirrorEditor.d.ts +0 -0
  55. /package/types/{filter-input → vuu-filters/src/filter-input}/useFilterAutoComplete.d.ts +0 -0
  56. /package/types/{filter-input → vuu-filters/src/filter-input}/useFilterSuggestionProvider.d.ts +0 -0
  57. /package/types/{filter-pill → vuu-filters/src/filter-pill}/index.d.ts +0 -0
  58. /package/types/{filter-pill-menu → vuu-filters/src/filter-pill-menu}/FilterPillMenu.d.ts +0 -0
  59. /package/types/{filter-pill-menu → vuu-filters/src/filter-pill-menu}/FilterPillMenuOptions.d.ts +0 -0
  60. /package/types/{filter-pill-menu → vuu-filters/src/filter-pill-menu}/index.d.ts +0 -0
  61. /package/types/{index.d.ts → vuu-filters/src/index.d.ts} +0 -0
  62. /package/types/{local-config.d.ts → vuu-filters/src/local-config.d.ts} +0 -0
  63. /package/types/{use-filter-config.d.ts → vuu-filters/src/use-filter-config.d.ts} +0 -0
  64. /package/types/{use-rest-config.d.ts → vuu-filters/src/use-rest-config.d.ts} +0 -0
package/cjs/index.js CHANGED
@@ -128,6 +128,7 @@ __export(src_exports, {
128
128
  getTypeaheadFilter: () => getTypeaheadFilter,
129
129
  overrideColName: () => overrideColName,
130
130
  removeFilter: () => removeFilter,
131
+ removeLastClause: () => removeLastClause,
131
132
  replaceClause: () => replaceClause,
132
133
  saveLocalEntity: () => saveLocalEntity,
133
134
  splitFilterOnColumn: () => splitFilterOnColumn,
@@ -2081,7 +2082,7 @@ var View = (0, import_react32.forwardRef)(function View2(props, forwardedRef) {
2081
2082
  title: titleProp,
2082
2083
  ...restProps
2083
2084
  } = props;
2084
- const id = (0, import_core5.useIdMemo)(idProp);
2085
+ const id = useId(idProp);
2085
2086
  const rootRef = (0, import_react32.useRef)(null);
2086
2087
  const mainRef = (0, import_react32.useRef)(null);
2087
2088
  const [componentProps, _setComponentProps] = (0, import_react32.useState)();
@@ -2352,7 +2353,7 @@ var LocalLayoutPersistenceManager = class {
2352
2353
  const newMetadata = {
2353
2354
  ...metadata,
2354
2355
  id,
2355
- created: (0, import_vuu_utils9.formatDate)(/* @__PURE__ */ new Date(), "dd.mm.yyyy")
2356
+ created: (0, import_vuu_utils9.formatDate)("dd.mm.yyyy")(/* @__PURE__ */ new Date())
2356
2357
  };
2357
2358
  this.saveLayoutsWithMetadata(
2358
2359
  [...existingLayouts, { id, json: layout }],
@@ -2618,6 +2619,7 @@ var import_react42 = __toESM(require("react"));
2618
2619
  var import_vuu_popups2 = require("@vuu-ui/vuu-popups");
2619
2620
  var import_jsx_runtime26 = require("react/jsx-runtime");
2620
2621
  var LayoutManagementContext = import_react42.default.createContext({
2622
+ getApplicationSettings: () => void 0,
2621
2623
  layoutMetadata: [],
2622
2624
  saveLayout: () => void 0,
2623
2625
  // The default Application JSON will be served if no LayoutManagementProvider
@@ -2626,6 +2628,7 @@ var LayoutManagementContext = import_react42.default.createContext({
2626
2628
  saveApplicationSettings: () => void 0,
2627
2629
  loadLayoutById: () => void 0
2628
2630
  });
2631
+ var useLayoutManager = () => (0, import_react42.useContext)(LayoutManagementContext);
2629
2632
 
2630
2633
  // ../vuu-shell/src/layout-management/LayoutList.tsx
2631
2634
  var import_jsx_runtime27 = require("react/jsx-runtime");
@@ -3712,7 +3715,7 @@ var PaletteItem = (0, import_react59.memo)(
3712
3715
  );
3713
3716
  PaletteItem.displayName = "PaletteItem";
3714
3717
  var Palette = ({
3715
- ListProps: ListProps2,
3718
+ ListProps: ListProps3,
3716
3719
  ViewProps: ViewProps4,
3717
3720
  children,
3718
3721
  className,
@@ -3771,7 +3774,7 @@ var Palette = ({
3771
3774
  return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
3772
3775
  import_vuu_ui_controls7.List,
3773
3776
  {
3774
- ...ListProps2,
3777
+ ...ListProps3,
3775
3778
  ...props,
3776
3779
  className: (0, import_classnames24.default)(classBase21, className, `${classBase21}-${orientation}`),
3777
3780
  itemHeight,
@@ -3792,7 +3795,7 @@ var import_vuu_ui_controls8 = require("@vuu-ui/vuu-ui-controls");
3792
3795
  var import_classnames25 = __toESM(require_classnames());
3793
3796
  var import_react60 = __toESM(require("react"));
3794
3797
  var import_jsx_runtime44 = require("react/jsx-runtime");
3795
- var classBase12 = "Tabs";
3798
+ var classBase12 = "vuuTabs";
3796
3799
  var getDefaultTabIcon = () => void 0;
3797
3800
  var getChildElements = (children) => {
3798
3801
  const elements = [];
@@ -4632,10 +4635,10 @@ var import_vuu_ui_controls11 = require("@vuu-ui/vuu-ui-controls");
4632
4635
  var import_jsx_runtime49 = require("react/jsx-runtime");
4633
4636
 
4634
4637
  // src/filter-bar/FilterBar.tsx
4635
- var import_vuu_popups7 = require("@vuu-ui/vuu-popups");
4638
+ var import_vuu_popups8 = require("@vuu-ui/vuu-popups");
4636
4639
  var import_core19 = require("@salt-ds/core");
4637
4640
  var import_classnames32 = __toESM(require_classnames(), 1);
4638
- var import_react78 = require("react");
4641
+ var import_react79 = require("react");
4639
4642
 
4640
4643
  // src/filter-builder-menu/FilterBuilderMenu.tsx
4641
4644
  var import_react68 = require("react");
@@ -4643,7 +4646,10 @@ var import_vuu_popups5 = require("@vuu-ui/vuu-popups");
4643
4646
  var import_vuu_ui_controls12 = require("@vuu-ui/vuu-ui-controls");
4644
4647
  var import_jsx_runtime50 = require("react/jsx-runtime");
4645
4648
  var classBase14 = "vuuFilterBuilderMenu";
4646
- var FilterBuilderMenu = ({ onMenuAction }) => {
4649
+ var FilterBuilderMenu = ({
4650
+ ListProps: ListProps3,
4651
+ onMenuAction
4652
+ }) => {
4647
4653
  const ref = (0, import_react68.useRef)(null);
4648
4654
  const listRef = (0, import_react68.useCallback)((el) => {
4649
4655
  if (el) {
@@ -4666,15 +4672,16 @@ var FilterBuilderMenu = ({ onMenuAction }) => {
4666
4672
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_vuu_popups5.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_vuu_popups5.PopupComponent, { anchorElement: ref, placement: "right", children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
4667
4673
  import_vuu_ui_controls12.List,
4668
4674
  {
4675
+ ...ListProps3,
4669
4676
  className: `${classBase14}List`,
4670
- defaultHighlightedIndex: 1,
4677
+ defaultHighlightedIndex: 0,
4671
4678
  itemHeight: 22,
4672
4679
  ref: listRef,
4673
4680
  onSelect: handleSelect,
4674
4681
  style: { position: "relative" },
4675
4682
  width: 100,
4676
4683
  children: [
4677
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_vuu_ui_controls12.ListItem, { "data-action": "apply-save", className: "vuuMenuButton", children: "APPLY AND SAVE" }),
4684
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_vuu_ui_controls12.ListItem, { "data-action": "apply-save", children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "vuuMenuButton", children: "APPLY AND SAVE" }) }),
4678
4685
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_vuu_ui_controls12.ListItem, { "data-action": "and-clause", children: "AND" }),
4679
4686
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_vuu_ui_controls12.ListItem, { "data-action": "or-clause", children: "OR" })
4680
4687
  ]
@@ -4702,7 +4709,6 @@ var ExpandoCombobox = (0, import_react69.forwardRef)(function ExpandoCombobox2({
4702
4709
  value = "",
4703
4710
  ...props
4704
4711
  }, forwardedRef) {
4705
- var _a;
4706
4712
  const [text, setText] = (0, import_react69.useState)(value);
4707
4713
  const { itemToString = import_vuu_utils23.itemToString } = props;
4708
4714
  const initialValue = (0, import_react69.useRef)(value);
@@ -4720,7 +4726,6 @@ var ExpandoCombobox = (0, import_react69.forwardRef)(function ExpandoCombobox2({
4720
4726
  const handleInputChange = (0, import_react69.useCallback)(
4721
4727
  (evt) => {
4722
4728
  const { value: value2 } = evt.target;
4723
- console.log(`onInputChange ${value2}`);
4724
4729
  setText(value2);
4725
4730
  onInputChange == null ? void 0 : onInputChange(evt);
4726
4731
  },
@@ -4729,7 +4734,7 @@ var ExpandoCombobox = (0, import_react69.forwardRef)(function ExpandoCombobox2({
4729
4734
  const handleSetSelectedText = (0, import_react69.useCallback)((text2) => {
4730
4735
  setText(text2);
4731
4736
  }, []);
4732
- const [InputProps, ListProps2] = (0, import_react69.useMemo)(() => {
4737
+ const [InputProps, ListProps3] = (0, import_react69.useMemo)(() => {
4733
4738
  const { inputProps, ...restInputProps } = InputPropsProp;
4734
4739
  return [
4735
4740
  {
@@ -4776,7 +4781,7 @@ var ExpandoCombobox = (0, import_react69.forwardRef)(function ExpandoCombobox2({
4776
4781
  const popupProps = {
4777
4782
  minWidth: "fit-content"
4778
4783
  };
4779
- return ((_a = props.source) == null ? void 0 : _a.length) === 0 ? null : /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
4784
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
4780
4785
  "div",
4781
4786
  {
4782
4787
  className: (0, import_classnames28.default)(classBase15, classNameProp),
@@ -4790,7 +4795,7 @@ var ExpandoCombobox = (0, import_react69.forwardRef)(function ExpandoCombobox2({
4790
4795
  PopupProps: popupProps,
4791
4796
  defaultValue: initialValue.current,
4792
4797
  fullWidth: true,
4793
- ListProps: ListProps2,
4798
+ ListProps: ListProps3,
4794
4799
  InputProps,
4795
4800
  itemsToString,
4796
4801
  onSelectionChange: handleSelectionChange,
@@ -4875,10 +4880,14 @@ var import_react71 = require("react");
4875
4880
  var import_vuu_data_react = require("@vuu-ui/vuu-data-react");
4876
4881
  var import_vuu_ui_controls15 = require("@vuu-ui/vuu-ui-controls");
4877
4882
  var import_jsx_runtime53 = require("react/jsx-runtime");
4883
+ var selectionKeys = ["Enter", " "];
4884
+ var NO_DATA_MATCH = ["No matching data"];
4878
4885
  var TextInput = (0, import_react71.forwardRef)(function TextInput2({
4879
4886
  InputProps: InputPropsProp = {},
4880
4887
  className,
4881
4888
  column,
4889
+ "data-field": dataField,
4890
+ onDeselect,
4882
4891
  onInputComplete,
4883
4892
  operator,
4884
4893
  suggestionProvider = import_vuu_data_react.useTypeaheadSuggestions,
@@ -4908,7 +4917,11 @@ var TextInput = (0, import_react71.forwardRef)(function TextInput2({
4908
4917
  if (table) {
4909
4918
  const params = valueInputValue ? [table, column.name, valueInputValue] : [table, column.name];
4910
4919
  getSuggestions(params).then((suggestions) => {
4911
- setTypeaheadValues(suggestions);
4920
+ if (suggestions.length === 0 && valueInputValue) {
4921
+ setTypeaheadValues(NO_DATA_MATCH);
4922
+ } else {
4923
+ setTypeaheadValues(suggestions);
4924
+ }
4912
4925
  }).catch((err) => {
4913
4926
  console.error("Error getting suggestions", err);
4914
4927
  });
@@ -4942,6 +4955,9 @@ var TextInput = (0, import_react71.forwardRef)(function TextInput2({
4942
4955
  }
4943
4956
  }, [InputPropsProp, onInputComplete, operator, valueInputValue]);
4944
4957
  const getValueInputField = (0, import_react71.useCallback)(() => {
4958
+ if (typeaheadValues.length === 0) {
4959
+ return null;
4960
+ }
4945
4961
  switch (operator) {
4946
4962
  case "in":
4947
4963
  return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
@@ -4949,16 +4965,18 @@ var TextInput = (0, import_react71.forwardRef)(function TextInput2({
4949
4965
  {
4950
4966
  InputProps,
4951
4967
  className,
4968
+ "data-field": dataField,
4952
4969
  initialHighlightedIndex: 0,
4953
4970
  source: typeaheadValues,
4954
4971
  onInputChange: handleInputChange,
4955
4972
  onSelectionChange: handleMultiValueSelectionChange,
4956
4973
  ref: forwardedRef,
4957
4974
  selectionStrategy: "multiple",
4975
+ selectionKeys,
4958
4976
  value
4959
4977
  }
4960
4978
  );
4961
- case "starts":
4979
+ case "starts": {
4962
4980
  return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
4963
4981
  ExpandoCombobox,
4964
4982
  {
@@ -4969,7 +4987,9 @@ var TextInput = (0, import_react71.forwardRef)(function TextInput2({
4969
4987
  },
4970
4988
  allowFreeText: true,
4971
4989
  className,
4990
+ "data-field": dataField,
4972
4991
  initialHighlightedIndex: 0,
4992
+ disableFilter: typeaheadValues === NO_DATA_MATCH && (valueInputValue == null ? void 0 : valueInputValue.length) > 0,
4973
4993
  source: typeaheadValues,
4974
4994
  onInputChange: handleInputChange,
4975
4995
  onSelectionChange: handleSingleValueSelectionChange,
@@ -4977,12 +4997,14 @@ var TextInput = (0, import_react71.forwardRef)(function TextInput2({
4977
4997
  value
4978
4998
  }
4979
4999
  );
5000
+ }
4980
5001
  case "ends":
4981
5002
  return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
4982
5003
  import_vuu_ui_controls15.ExpandoInput,
4983
5004
  {
4984
5005
  ...InputProps,
4985
5006
  className,
5007
+ "data-field": dataField,
4986
5008
  value: valueInputValue,
4987
5009
  ref: forwardedRef,
4988
5010
  onChange: handleInputChange
@@ -4993,11 +5015,14 @@ var TextInput = (0, import_react71.forwardRef)(function TextInput2({
4993
5015
  ExpandoCombobox,
4994
5016
  {
4995
5017
  InputProps,
5018
+ allowBackspaceClearsSelection: true,
4996
5019
  className,
5020
+ "data-field": dataField,
4997
5021
  initialHighlightedIndex: 0,
4998
5022
  source: typeaheadValues,
4999
5023
  title: "value",
5000
5024
  onInputChange: handleInputChange,
5025
+ onDeselect,
5001
5026
  onSelectionChange: handleSingleValueSelectionChange,
5002
5027
  ref: forwardedRef,
5003
5028
  value
@@ -5008,13 +5033,15 @@ var TextInput = (0, import_react71.forwardRef)(function TextInput2({
5008
5033
  operator,
5009
5034
  InputProps,
5010
5035
  className,
5036
+ dataField,
5011
5037
  typeaheadValues,
5012
5038
  handleInputChange,
5013
5039
  handleMultiValueSelectionChange,
5014
5040
  forwardedRef,
5015
5041
  value,
5016
- handleSingleValueSelectionChange,
5017
- valueInputValue
5042
+ valueInputValue,
5043
+ onDeselect,
5044
+ handleSingleValueSelectionChange
5018
5045
  ]);
5019
5046
  return getValueInputField();
5020
5047
  });
@@ -5027,29 +5054,44 @@ var cursorAtTextStart = (input) => input.selectionStart === 0;
5027
5054
  var cursorAtTextEnd = (input) => input.selectionStart === input.value.length;
5028
5055
  var getFieldName = (field) => (field == null ? void 0 : field.classList.contains("vuuFilterClauseColumn")) ? "column" : (field == null ? void 0 : field.classList.contains("vuuFilterClauseOperator")) ? "operator" : "value";
5029
5056
  var getFocusedField = () => {
5030
- var _a;
5031
- return (_a = document.activeElement) == null ? void 0 : _a.closest(".vuuFilterClauseField");
5057
+ const activeElement = document.activeElement;
5058
+ if (activeElement == null ? void 0 : activeElement.classList.contains("vuuFilterClause-clearButton")) {
5059
+ return activeElement;
5060
+ } else {
5061
+ return activeElement == null ? void 0 : activeElement.closest(".vuuFilterClauseField");
5062
+ }
5032
5063
  };
5033
5064
  var focusNextFocusableElement = (direction = "fwd") => {
5034
5065
  var _a;
5035
5066
  const activeField = getFocusedField();
5036
5067
  const filterClause = activeField == null ? void 0 : activeField.closest(".vuuFilterClause");
5037
- if ((filterClause == null ? void 0 : filterClause.lastChild) === activeField) {
5068
+ if (direction === "fwd" && (filterClause == null ? void 0 : filterClause.lastChild) === activeField) {
5038
5069
  requestAnimationFrame(() => {
5039
5070
  focusNextFocusableElement();
5040
5071
  });
5041
5072
  } else {
5042
- const nextField = direction === "fwd" ? activeField.nextElementSibling : activeField.previousElementSibling;
5073
+ const nextField = direction === "fwd" ? activeField == null ? void 0 : activeField.nextElementSibling : activeField == null ? void 0 : activeField.previousElementSibling;
5043
5074
  (_a = nextField == null ? void 0 : nextField.querySelector("input")) == null ? void 0 : _a.focus();
5044
5075
  }
5045
5076
  };
5077
+ var clauseIsNotFirst = (el) => {
5078
+ var _a;
5079
+ const clause = el.closest("[data-index]");
5080
+ if (clause) {
5081
+ const index = clause.dataset.index;
5082
+ const previousClause = (_a = clause == null ? void 0 : clause.parentElement) == null ? void 0 : _a.querySelector(
5083
+ `[data-index]:has(.vuuFilterClause):has(+[data-index="${index}"])`
5084
+ );
5085
+ return previousClause !== null;
5086
+ }
5087
+ };
5046
5088
  var focusNextElement = () => {
5047
5089
  const filterClauseField = getFocusedField();
5048
5090
  const filterClause = filterClauseField == null ? void 0 : filterClauseField.closest(".vuuFilterClause");
5049
5091
  if (filterClause && filterClauseField) {
5050
5092
  if (filterClauseField.classList.contains("vuuFilterClauseValue")) {
5051
5093
  const clearButton = filterClause.querySelector(
5052
- ".vuuFilterClause-closeButton"
5094
+ ".vuuFilterClause-clearButton"
5053
5095
  );
5054
5096
  clearButton == null ? void 0 : clearButton.focus();
5055
5097
  } else {
@@ -5108,6 +5150,7 @@ var getFilterClauseValue = (filterClause) => {
5108
5150
  };
5109
5151
  var useFilterClauseEditor = ({
5110
5152
  filterClause,
5153
+ onCancel,
5111
5154
  onChange,
5112
5155
  tableSchema
5113
5156
  }) => {
@@ -5118,6 +5161,10 @@ var useFilterClauseEditor = ({
5118
5161
  const [operator, _setOperator] = (0, import_react72.useState)(
5119
5162
  filterClause.op
5120
5163
  );
5164
+ const findColumn = (0, import_react72.useCallback)(
5165
+ (columnName) => tableSchema.columns.find((col) => col.name === columnName),
5166
+ [tableSchema.columns]
5167
+ );
5121
5168
  const setOperator = (0, import_react72.useCallback)((op) => {
5122
5169
  _setOperator(op);
5123
5170
  }, []);
@@ -5129,10 +5176,43 @@ var useFilterClauseEditor = ({
5129
5176
  setSelectedColumn(column != null ? column : void 0);
5130
5177
  setOperator(void 0);
5131
5178
  setValue(void 0);
5132
- focusNextElement();
5179
+ setTimeout(() => {
5180
+ focusNextElement();
5181
+ }, 100);
5133
5182
  },
5134
5183
  [setOperator]
5135
5184
  );
5185
+ const removeAndNavigateToNextInputIfAtBoundary = (0, import_react72.useCallback)(
5186
+ (evt) => {
5187
+ var _a;
5188
+ const input = evt.target;
5189
+ if (input.value === "") {
5190
+ const field = input.closest(
5191
+ ".vuuFilterClauseField,[data-field]"
5192
+ );
5193
+ switch ((_a = field == null ? void 0 : field.dataset) == null ? void 0 : _a.field) {
5194
+ case "operator": {
5195
+ setOperator(void 0);
5196
+ setSelectedColumn(void 0);
5197
+ focusNextFocusableElement("bwd");
5198
+ break;
5199
+ }
5200
+ case "value": {
5201
+ setOperator(void 0);
5202
+ focusNextFocusableElement("bwd");
5203
+ break;
5204
+ }
5205
+ case "column": {
5206
+ if (clauseIsNotFirst(input)) {
5207
+ console.log("This is NOT the first clause");
5208
+ onCancel == null ? void 0 : onCancel("Backspace");
5209
+ }
5210
+ }
5211
+ }
5212
+ }
5213
+ },
5214
+ [onCancel, setOperator]
5215
+ );
5136
5216
  const handleSelectionChangeOperator = (0, import_react72.useCallback)(
5137
5217
  (evt, selected) => {
5138
5218
  const op = selected;
@@ -5164,27 +5244,75 @@ var useFilterClauseEditor = ({
5164
5244
  value: value2
5165
5245
  });
5166
5246
  }
5167
- requestAnimationFrame(() => {
5168
- focusNextElement();
5169
- });
5170
5247
  }
5171
5248
  },
5172
5249
  [onChange, operator, selectedColumn == null ? void 0 : selectedColumn.name]
5173
5250
  );
5251
+ const handleDeselectValue = (0, import_react72.useCallback)(() => {
5252
+ setValue(void 0);
5253
+ }, []);
5174
5254
  const handleKeyDownInput = (0, import_react72.useCallback)(
5175
5255
  (evt) => {
5176
5256
  if (["ArrowLeft", "ArrowRight"].includes(evt.key)) {
5177
5257
  navigateToNextInputIfAtBoundary(evt);
5178
- } else if (operator && evt.key === "Enter" && ["starts", "ends"].includes(operator)) {
5179
- console.log("enter");
5258
+ } else if (evt.key === "Backspace") {
5259
+ removeAndNavigateToNextInputIfAtBoundary(evt);
5260
+ } else if (evt.key === "Enter") {
5261
+ const input = evt.target;
5262
+ const field = input.closest("[data-field]");
5263
+ if (field.dataset.field === "column") {
5264
+ const column = findColumn(input.value);
5265
+ if (column) {
5266
+ setSelectedColumn(column);
5267
+ focusNextElement();
5268
+ }
5269
+ } else if (field.dataset.field === "value") {
5270
+ if (operator === "starts") {
5271
+ evt.stopPropagation();
5272
+ const newValue = input.value;
5273
+ setValue(newValue);
5274
+ onChange({
5275
+ column: selectedColumn == null ? void 0 : selectedColumn.name,
5276
+ op: operator,
5277
+ value: newValue
5278
+ });
5279
+ }
5280
+ }
5180
5281
  }
5181
5282
  },
5182
- [operator]
5283
+ [
5284
+ findColumn,
5285
+ onChange,
5286
+ operator,
5287
+ removeAndNavigateToNextInputIfAtBoundary,
5288
+ selectedColumn == null ? void 0 : selectedColumn.name
5289
+ ]
5290
+ );
5291
+ const handleClear = (0, import_react72.useCallback)(
5292
+ (e) => {
5293
+ var _a;
5294
+ const button = e.target;
5295
+ const firstInput = (_a = button.closest(".vuuFilterClause")) == null ? void 0 : _a.querySelector("input");
5296
+ setSelectedColumn(void 0);
5297
+ setOperator(void 0);
5298
+ setValue(void 0);
5299
+ setTimeout(() => {
5300
+ firstInput.select();
5301
+ firstInput == null ? void 0 : firstInput.focus();
5302
+ }, 100);
5303
+ },
5304
+ [setOperator]
5183
5305
  );
5306
+ const handleClearKeyDown = (0, import_react72.useCallback)((e) => {
5307
+ e.stopPropagation();
5308
+ if (e.key === "Backspace") {
5309
+ focusNextFocusableElement("bwd");
5310
+ }
5311
+ }, []);
5184
5312
  const InputProps = (0, import_react72.useMemo)(
5185
5313
  () => ({
5186
5314
  inputProps: {
5187
- onKeyDown: handleKeyDownInput
5315
+ onKeyDownCapture: handleKeyDownInput
5188
5316
  }
5189
5317
  }),
5190
5318
  [handleKeyDownInput]
@@ -5198,6 +5326,9 @@ var useFilterClauseEditor = ({
5198
5326
  InputProps,
5199
5327
  columnRef,
5200
5328
  onChangeValue: handleChangeValue,
5329
+ onClear: handleClear,
5330
+ onClearKeyDown: handleClearKeyDown,
5331
+ onDeselectValue: handleDeselectValue,
5201
5332
  onSelectionChangeColumn: handleSelectionChangeColumn,
5202
5333
  onSelectionChangeOperator: handleSelectionChangeOperator,
5203
5334
  operator,
@@ -5214,8 +5345,10 @@ var import_jsx_runtime54 = require("react/jsx-runtime");
5214
5345
  var classBase16 = "vuuFilterClause";
5215
5346
  var FilterClauseEditor = ({
5216
5347
  className,
5348
+ onCancel,
5217
5349
  onChange,
5218
- onClose,
5350
+ onDropdownClose,
5351
+ onDropdownOpen,
5219
5352
  filterClause,
5220
5353
  suggestionProvider,
5221
5354
  tableSchema,
@@ -5227,6 +5360,9 @@ var FilterClauseEditor = ({
5227
5360
  InputProps,
5228
5361
  columnRef,
5229
5362
  onChangeValue,
5363
+ onClear,
5364
+ onClearKeyDown,
5365
+ onDeselectValue,
5230
5366
  onSelectionChangeColumn,
5231
5367
  onSelectionChangeOperator,
5232
5368
  operator,
@@ -5236,6 +5372,7 @@ var FilterClauseEditor = ({
5236
5372
  valueRef
5237
5373
  } = useFilterClauseEditor({
5238
5374
  filterClause,
5375
+ onCancel,
5239
5376
  onChange,
5240
5377
  tableSchema
5241
5378
  });
@@ -5252,7 +5389,9 @@ var FilterClauseEditor = ({
5252
5389
  InputProps,
5253
5390
  className: (0, import_classnames29.default)(`${classBase16}Field`, `${classBase16}Value`),
5254
5391
  column: selectedColumn,
5392
+ "data-field": "value",
5255
5393
  filterClause,
5394
+ onDeselect: onDeselectValue,
5256
5395
  onInputComplete: onChangeValue,
5257
5396
  operator,
5258
5397
  ref: valueRef,
@@ -5298,29 +5437,33 @@ var FilterClauseEditor = ({
5298
5437
  /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
5299
5438
  ExpandoCombobox,
5300
5439
  {
5301
- title: "column",
5302
5440
  InputProps,
5441
+ allowBackspaceClearsSelection: true,
5303
5442
  className: (0, import_classnames29.default)(`${classBase16}Field`, `${classBase16}Column`),
5443
+ "data-field": "column",
5304
5444
  initialHighlightedIndex: 0,
5305
5445
  itemToString: (column) => column.name,
5446
+ onSelectionChange: onSelectionChangeColumn,
5306
5447
  ref: columnRef,
5307
5448
  source: columns,
5308
- onSelectionChange: onSelectionChangeColumn,
5449
+ title: "column",
5309
5450
  value: (_a = selectedColumn == null ? void 0 : selectedColumn.name) != null ? _a : ""
5310
5451
  }
5311
5452
  ),
5312
5453
  (selectedColumn == null ? void 0 : selectedColumn.name) ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
5313
5454
  ExpandoCombobox,
5314
5455
  {
5315
- title: "operator",
5316
5456
  InputProps,
5457
+ allowBackspaceClearsSelection: true,
5317
5458
  className: (0, import_classnames29.default)(`${classBase16}Field`, `${classBase16}Operator`, {
5318
5459
  [`${classBase16}Operator-hidden`]: selectedColumn === null
5319
5460
  }),
5461
+ "data-field": "operator",
5320
5462
  initialHighlightedIndex: 0,
5463
+ onSelectionChange: onSelectionChangeOperator,
5321
5464
  ref: operatorRef,
5322
5465
  source: getOperators(selectedColumn),
5323
- onSelectionChange: onSelectionChangeOperator,
5466
+ title: "operator",
5324
5467
  value: operator != null ? operator : ""
5325
5468
  }
5326
5469
  ) : null,
@@ -5328,8 +5471,9 @@ var FilterClauseEditor = ({
5328
5471
  value !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
5329
5472
  import_core18.Button,
5330
5473
  {
5331
- className: `${classBase16}-closeButton`,
5332
- onClick: onClose,
5474
+ className: `${classBase16}-clearButton`,
5475
+ onClick: onClear,
5476
+ onKeyDown: onClearKeyDown,
5333
5477
  "data-icon": "close"
5334
5478
  }
5335
5479
  ) : null
@@ -5337,8 +5481,9 @@ var FilterClauseEditor = ({
5337
5481
  };
5338
5482
 
5339
5483
  // src/filter-pill/FilterPill.tsx
5484
+ var import_src = require("@vuu-ui/vuu-popups/src");
5340
5485
  var import_vuu_ui_controls16 = require("@vuu-ui/vuu-ui-controls");
5341
- var import_vuu_utils28 = require("@vuu-ui/vuu-utils");
5486
+ var import_vuu_utils29 = require("@vuu-ui/vuu-utils");
5342
5487
  var import_classnames31 = __toESM(require_classnames(), 1);
5343
5488
  var import_react75 = require("react");
5344
5489
 
@@ -5447,18 +5592,25 @@ var filterClauses = (filter, clauses = []) => {
5447
5592
  var DEFAULT_ADD_FILTER_OPTS = {
5448
5593
  combineWith: "and"
5449
5594
  };
5595
+ var removeLastClause = (filter) => {
5596
+ const { filters } = filter;
5597
+ if (filters.length > 2) {
5598
+ return {
5599
+ ...filter,
5600
+ filters: filter.filters.slice(0, -1)
5601
+ };
5602
+ } else {
5603
+ return filter.filters[0];
5604
+ }
5605
+ };
5450
5606
  var addClause = (existingFilter, clause, { combineWith = AND } = DEFAULT_ADD_FILTER_OPTS) => {
5451
5607
  if ((0, import_vuu_utils27.isMultiClauseFilter)(existingFilter) && existingFilter.op === combineWith) {
5452
- if ((0, import_vuu_utils27.isCompleteFilter)(clause)) {
5453
- return {
5454
- ...existingFilter,
5455
- filters: existingFilter.filters.concat(clause)
5456
- };
5457
- } else {
5458
- throw Error(
5459
- "filter-utils, replaceFilter, only a valid clause can be added to a filter"
5460
- );
5461
- }
5608
+ return {
5609
+ ...existingFilter,
5610
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
5611
+ // @ts-ignore
5612
+ filters: existingFilter.filters.concat(clause)
5613
+ };
5462
5614
  } else {
5463
5615
  return {
5464
5616
  op: combineWith,
@@ -5737,23 +5889,44 @@ var getNumericFilter = (column, op, value) => {
5737
5889
  return { column, op, value };
5738
5890
  };
5739
5891
 
5740
- // src/filter-pill/FilterPill.tsx
5892
+ // src/filter-pill/filterAsReactNode.tsx
5893
+ var import_vuu_utils28 = require("@vuu-ui/vuu-utils");
5741
5894
  var import_jsx_runtime56 = require("react/jsx-runtime");
5895
+ var filterAsReactNode = (f) => {
5896
+ if ((0, import_vuu_utils28.isMultiClauseFilter)(f)) {
5897
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { children: [
5898
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { children: "Match all ..." }),
5899
+ f.filters.map((f2, i) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("div", { children: filterAsReactNode(f2) }, i))
5900
+ ] });
5901
+ } else if ((0, import_vuu_utils28.isMultiValueFilter)(f)) {
5902
+ if (f.values.length > 3) {
5903
+ return `${f.column} ${f.op} [${f.values.slice(0, 3).map(import_vuu_utils28.quotedStrings).join(",")} ...]`;
5904
+ } else {
5905
+ return `${f.column} ${f.op} [${f.values.map(import_vuu_utils28.quotedStrings).join(",")}]`;
5906
+ }
5907
+ } else {
5908
+ return `${f.column} ${f.op} ${(0, import_vuu_utils28.filterValue)(f.value)}`;
5909
+ }
5910
+ };
5911
+
5912
+ // src/filter-pill/FilterPill.tsx
5913
+ var import_jsx_runtime57 = require("react/jsx-runtime");
5742
5914
  var classBase18 = "vuuFilterPill";
5743
5915
  var getFilterLabel = (filter) => {
5744
5916
  if (filter.name) {
5745
5917
  return filter.name;
5746
- } else if ((0, import_vuu_utils28.isMultiClauseFilter)(filter)) {
5918
+ } else if ((0, import_vuu_utils29.isMultiClauseFilter)(filter)) {
5747
5919
  const [firstClause] = filterClauses(filter);
5748
- return `${(0, import_vuu_utils28.filterAsQuery)(firstClause)} ${filter.op} ...`;
5920
+ return `${(0, import_vuu_utils29.filterAsQuery)(firstClause)} ${filter.op} ...`;
5749
5921
  } else {
5750
- return (0, import_vuu_utils28.filterAsQuery)(filter);
5922
+ return (0, import_vuu_utils29.filterAsQuery)(filter);
5751
5923
  }
5752
5924
  };
5753
5925
  var FilterPill = ({
5926
+ className: classNameProp,
5754
5927
  editable = true,
5755
5928
  filter,
5756
- className: classNameProp,
5929
+ id: idProp,
5757
5930
  onBeginEdit,
5758
5931
  onExitEditMode,
5759
5932
  onMenuAction,
@@ -5765,6 +5938,7 @@ var FilterPill = ({
5765
5938
  onBeginEdit == null ? void 0 : onBeginEdit(filter);
5766
5939
  }, [filter, onBeginEdit]);
5767
5940
  const label = getFilterLabel(filter);
5941
+ const id = useId(idProp);
5768
5942
  const handleMenuClose = (0, import_react75.useCallback)((reason) => {
5769
5943
  if ((reason == null ? void 0 : reason.type) === "escape") {
5770
5944
  requestAnimationFrame(() => {
@@ -5774,15 +5948,21 @@ var FilterPill = ({
5774
5948
  });
5775
5949
  }
5776
5950
  }, []);
5777
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
5951
+ const { anchorProps, tooltipProps } = (0, import_src.useTooltip)({
5952
+ id,
5953
+ placement: "below",
5954
+ tooltipContent: filterAsReactNode(filter)
5955
+ });
5956
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
5778
5957
  "div",
5779
5958
  {
5959
+ ...anchorProps,
5780
5960
  ...htmlAttributes,
5781
5961
  className: (0, import_classnames31.default)(classBase18, classNameProp),
5782
5962
  "data-text": label,
5783
5963
  ref: rootRef,
5784
5964
  children: [
5785
- editable && onExitEditMode ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
5965
+ editable && onExitEditMode ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
5786
5966
  import_vuu_ui_controls16.EditableLabel,
5787
5967
  {
5788
5968
  defaultValue: label,
@@ -5790,14 +5970,20 @@ var FilterPill = ({
5790
5970
  onExitEditMode
5791
5971
  },
5792
5972
  label
5793
- ) : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: `${classBase18}-label`, children: label }),
5794
- showMenu && onMenuAction ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
5973
+ ) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: `${classBase18}-label`, children: label }),
5974
+ showMenu && onMenuAction ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
5795
5975
  FilterPillMenu,
5796
5976
  {
5797
5977
  filter,
5798
5978
  onMenuAction,
5799
5979
  onMenuClose: handleMenuClose
5800
5980
  }
5981
+ ) : null,
5982
+ tooltipProps ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
5983
+ import_src.Tooltip,
5984
+ {
5985
+ ...tooltipProps
5986
+ }
5801
5987
  ) : null
5802
5988
  ]
5803
5989
  }
@@ -5805,7 +5991,7 @@ var FilterPill = ({
5805
5991
  };
5806
5992
 
5807
5993
  // src/filter-bar/useFilterBar.ts
5808
- var import_vuu_utils29 = require("@vuu-ui/vuu-utils");
5994
+ var import_vuu_utils30 = require("@vuu-ui/vuu-utils");
5809
5995
  var import_react77 = require("react");
5810
5996
 
5811
5997
  // src/filter-bar/useFilters.ts
@@ -5814,7 +6000,8 @@ var import_react76 = require("react");
5814
6000
  var useFilters = ({
5815
6001
  defaultFilters,
5816
6002
  filters: filtersProp,
5817
- onFiltersChanged
6003
+ onFiltersChanged,
6004
+ tableSchema
5818
6005
  }) => {
5819
6006
  const [filters, setFilters] = (0, import_vuu_ui_controls17.useControlled)({
5820
6007
  controlled: filtersProp,
@@ -5822,6 +6009,77 @@ var useFilters = ({
5822
6009
  name: "useFilters",
5823
6010
  state: "Filters"
5824
6011
  });
6012
+ const { getApplicationSettings, saveApplicationSettings } = useLayoutManager();
6013
+ const hasFilter = (filters2, name) => filters2.findIndex((f) => f.name === name) !== -1;
6014
+ const saveFilterToSettings = (0, import_react76.useCallback)(
6015
+ (filter, name) => {
6016
+ if (tableSchema && name) {
6017
+ const savedFilters = getApplicationSettings(
6018
+ "filters"
6019
+ );
6020
+ let newFilters = savedFilters;
6021
+ const { module: module2, table } = tableSchema.table;
6022
+ const key = `${module2}:${table}`;
6023
+ if (savedFilters) {
6024
+ if (savedFilters[key]) {
6025
+ if (hasFilter(savedFilters[key], name)) {
6026
+ newFilters = {
6027
+ ...savedFilters,
6028
+ [key]: savedFilters[key].map(
6029
+ (f) => f.name === name ? { ...filter, name } : f
6030
+ )
6031
+ };
6032
+ } else if ((filter == null ? void 0 : filter.name) && (filter == null ? void 0 : filter.name) !== name && hasFilter(savedFilters[key], filter.name)) {
6033
+ newFilters = {
6034
+ ...savedFilters,
6035
+ [key]: savedFilters[key].map(
6036
+ (f) => f.name === filter.name ? { ...filter, name } : f
6037
+ )
6038
+ };
6039
+ } else {
6040
+ newFilters = {
6041
+ ...savedFilters,
6042
+ [key]: savedFilters[key].concat({ ...filter, name })
6043
+ };
6044
+ }
6045
+ } else {
6046
+ newFilters = {
6047
+ ...savedFilters,
6048
+ [key]: [{ ...filter, name }]
6049
+ };
6050
+ }
6051
+ } else {
6052
+ newFilters = {
6053
+ [key]: [{ ...filter, name }]
6054
+ };
6055
+ }
6056
+ if (newFilters !== savedFilters) {
6057
+ saveApplicationSettings(newFilters, "filters");
6058
+ }
6059
+ }
6060
+ },
6061
+ [getApplicationSettings, saveApplicationSettings, tableSchema]
6062
+ );
6063
+ const removeFilterFromSettings = (0, import_react76.useCallback)(
6064
+ (filter) => {
6065
+ var _a;
6066
+ if (tableSchema && filter.name) {
6067
+ const savedFilters = getApplicationSettings(
6068
+ "filters"
6069
+ );
6070
+ const { module: module2, table } = tableSchema.table;
6071
+ const key = `${module2}:${table}`;
6072
+ if (((_a = savedFilters[key]) == null ? void 0 : _a.findIndex((f) => f.name === filter.name)) !== -1) {
6073
+ const newSavedFilters = {
6074
+ ...savedFilters,
6075
+ [key]: savedFilters[key].filter((f) => f.name !== filter.name)
6076
+ };
6077
+ saveApplicationSettings(newSavedFilters, "filters");
6078
+ }
6079
+ }
6080
+ },
6081
+ [getApplicationSettings, saveApplicationSettings, tableSchema]
6082
+ );
5825
6083
  const handleAddFilter = (0, import_react76.useCallback)(
5826
6084
  (filter) => {
5827
6085
  const index = filters.length;
@@ -5834,6 +6092,9 @@ var useFilters = ({
5834
6092
  );
5835
6093
  const handleDeleteFilter = (0, import_react76.useCallback)(
5836
6094
  (filter) => {
6095
+ console.log(`handleDeleteFilter`, {
6096
+ filter
6097
+ });
5837
6098
  let index = -1;
5838
6099
  const newFilters = filters.filter((f, i) => {
5839
6100
  if (f !== filter) {
@@ -5845,9 +6106,10 @@ var useFilters = ({
5845
6106
  });
5846
6107
  setFilters(newFilters);
5847
6108
  onFiltersChanged == null ? void 0 : onFiltersChanged(newFilters);
6109
+ removeFilterFromSettings(filter);
5848
6110
  return index;
5849
6111
  },
5850
- [filters, onFiltersChanged, setFilters]
6112
+ [filters, onFiltersChanged, removeFilterFromSettings, setFilters]
5851
6113
  );
5852
6114
  const handleRenameFilter = (0, import_react76.useCallback)(
5853
6115
  (filter, name) => {
@@ -5862,9 +6124,10 @@ var useFilters = ({
5862
6124
  });
5863
6125
  setFilters(newFilters);
5864
6126
  onFiltersChanged == null ? void 0 : onFiltersChanged(newFilters);
6127
+ saveFilterToSettings(filter, name);
5865
6128
  return index;
5866
6129
  },
5867
- [filters, onFiltersChanged, setFilters]
6130
+ [filters, onFiltersChanged, saveFilterToSettings, setFilters]
5868
6131
  );
5869
6132
  const handleChangeFilter = (0, import_react76.useCallback)(
5870
6133
  (filter) => {
@@ -5901,7 +6164,8 @@ var useFilterBar = ({
5901
6164
  onApplyFilter,
5902
6165
  onChangeActiveFilterIndex: onChangeActiveFilterIndexProp,
5903
6166
  onFiltersChanged,
5904
- showMenu: showMenuProp
6167
+ showMenu: showMenuProp,
6168
+ tableSchema
5905
6169
  }) => {
5906
6170
  const addButtonRef = (0, import_react77.useRef)(null);
5907
6171
  const editingFilter = (0, import_react77.useRef)();
@@ -5917,7 +6181,8 @@ var useFilterBar = ({
5917
6181
  onRenameFilter
5918
6182
  } = useFilters({
5919
6183
  filters: filtersProp,
5920
- onFiltersChanged
6184
+ onFiltersChanged,
6185
+ tableSchema
5921
6186
  });
5922
6187
  const editPillLabel = (0, import_react77.useCallback)(
5923
6188
  (index) => {
@@ -5931,7 +6196,7 @@ var useFilterBar = ({
5931
6196
  ".vuuEditableLabel"
5932
6197
  );
5933
6198
  if (editableLabel) {
5934
- (0, import_vuu_utils29.dispatchMouseEvent)(editableLabel, "dblclick");
6199
+ (0, import_vuu_utils30.dispatchMouseEvent)(editableLabel, "dblclick");
5935
6200
  }
5936
6201
  }
5937
6202
  });
@@ -5970,7 +6235,7 @@ var useFilterBar = ({
5970
6235
  );
5971
6236
  const applyFilter = (0, import_react77.useCallback)(
5972
6237
  (filter) => {
5973
- const filterQuery = filter ? (0, import_vuu_utils29.filterAsQuery)(filter) : "";
6238
+ const filterQuery = filter ? (0, import_vuu_utils30.filterAsQuery)(filter) : "";
5974
6239
  onApplyFilter({
5975
6240
  filter: filterQuery,
5976
6241
  filterStruct: filter
@@ -6093,12 +6358,16 @@ var useFilterBar = ({
6093
6358
  setShowMenu(false);
6094
6359
  return true;
6095
6360
  }
6096
- case "and-clause":
6097
- setEditFilter(
6098
- (filter) => addClause(filter, EMPTY_FILTER_CLAUSE)
6361
+ case "and-clause": {
6362
+ const newFilter = addClause(
6363
+ editFilter,
6364
+ EMPTY_FILTER_CLAUSE
6099
6365
  );
6366
+ console.log({ newFilter });
6367
+ setEditFilter(newFilter);
6100
6368
  setShowMenu(false);
6101
6369
  return true;
6370
+ }
6102
6371
  case "or-clause":
6103
6372
  setEditFilter(
6104
6373
  (filter) => addClause(filter, {}, { combineWith: "or" })
@@ -6138,7 +6407,7 @@ var useFilterBar = ({
6138
6407
  );
6139
6408
  const handleClickAddFilter = (0, import_react77.useCallback)(() => {
6140
6409
  setEditFilter({});
6141
- }, []);
6410
+ }, [setEditFilter]);
6142
6411
  const handleClickRemoveFilter = (0, import_react77.useCallback)(() => {
6143
6412
  setEditFilter(void 0);
6144
6413
  }, []);
@@ -6147,13 +6416,43 @@ var useFilterBar = ({
6147
6416
  onMenuAction: handlePillMenuAction,
6148
6417
  onExitEditMode: handleExitEditFilterName
6149
6418
  };
6150
- const handleChangeFilterClause = (filterClause) => {
6151
- if (filterClause !== void 0) {
6152
- setEditFilter((filter) => replaceClause(filter, filterClause));
6153
- setShowMenu(true);
6419
+ const handleChangeFilterClause = (0, import_react77.useCallback)(
6420
+ (filterClause) => {
6421
+ console.log(`handleCHangeFilterClause ${JSON.stringify(filterClause)}`);
6422
+ if (filterClause !== void 0) {
6423
+ const newFilter = replaceClause(editFilter, filterClause);
6424
+ setEditFilter(newFilter);
6425
+ setShowMenu(true);
6426
+ }
6427
+ },
6428
+ [editFilter]
6429
+ );
6430
+ const handleCancelFilterClause = (0, import_react77.useCallback)(
6431
+ (reason) => {
6432
+ if (reason === "Backspace" && (0, import_vuu_utils30.isMultiClauseFilter)(editFilter)) {
6433
+ setEditFilter(removeLastClause(editFilter));
6434
+ }
6435
+ },
6436
+ [editFilter]
6437
+ );
6438
+ const handleBlurFilterClause = (0, import_react77.useCallback)((e) => {
6439
+ const target = e.target;
6440
+ const relatedTarget = e.relatedTarget;
6441
+ const filterClause = target.closest(".vuuFilterClause");
6442
+ if (filterClause == null ? void 0 : filterClause.contains(relatedTarget)) {
6443
+ } else {
6444
+ const dropdownId = target.getAttribute("aria-owns");
6445
+ const dropDown = dropdownId ? document.getElementById(dropdownId) : null;
6446
+ if (dropDown == null ? void 0 : dropDown.contains(relatedTarget)) {
6447
+ } else {
6448
+ setShowMenu(true);
6449
+ }
6154
6450
  }
6155
- };
6156
- const onKeyDown = (0, import_react77.useCallback)(
6451
+ }, []);
6452
+ const handleFocusFilterClause = (0, import_react77.useCallback)(() => {
6453
+ setShowMenu(false);
6454
+ }, []);
6455
+ const handleKeyDownFilterbar = (0, import_react77.useCallback)(
6157
6456
  (evt) => {
6158
6457
  if (evt.key === "Escape" && editFilter !== void 0) {
6159
6458
  setEditFilter(void 0);
@@ -6163,6 +6462,39 @@ var useFilterBar = ({
6163
6462
  },
6164
6463
  [editFilter]
6165
6464
  );
6465
+ const handleKeyDownMenu = (0, import_react77.useCallback)(
6466
+ (evt) => {
6467
+ var _a;
6468
+ console.log(`keydown from List ${evt.key}`);
6469
+ const { current: container } = containerRef;
6470
+ if (evt.key === "Backspace" && container) {
6471
+ evt.preventDefault();
6472
+ const fields = Array.from(
6473
+ container.querySelectorAll(".vuuFilterClauseField")
6474
+ );
6475
+ if (fields.length > 0) {
6476
+ const field = fields.at(-1);
6477
+ (_a = field == null ? void 0 : field.querySelector("input")) == null ? void 0 : _a.focus();
6478
+ }
6479
+ setShowMenu(false);
6480
+ } else if (evt.key === "Tab") {
6481
+ if (evt.shiftKey && container) {
6482
+ const clearButtons = Array.from(
6483
+ container.querySelectorAll(".vuuFilterClause-clearButton")
6484
+ );
6485
+ if (clearButtons.length > 0) {
6486
+ const clearButton = clearButtons.at(-1);
6487
+ setTimeout(() => {
6488
+ clearButton.focus();
6489
+ }, 100);
6490
+ }
6491
+ } else {
6492
+ console.log("apply current selection");
6493
+ }
6494
+ }
6495
+ },
6496
+ [containerRef]
6497
+ );
6166
6498
  const handleAddButtonKeyDown = (0, import_react77.useCallback)((evt) => {
6167
6499
  if (evt.key === "ArrowLeft") {
6168
6500
  console.log("navgiate to the Toolbar");
@@ -6183,11 +6515,15 @@ var useFilterBar = ({
6183
6515
  addButtonProps,
6184
6516
  editFilter,
6185
6517
  filters,
6518
+ onBlurFilterClause: handleBlurFilterClause,
6519
+ onCancelFilterClause: handleCancelFilterClause,
6186
6520
  onChangeActiveFilterIndex: handleChangeActiveFilterIndex,
6187
6521
  onClickAddFilter: handleClickAddFilter,
6188
6522
  onClickRemoveFilter: handleClickRemoveFilter,
6189
6523
  onChangeFilterClause: handleChangeFilterClause,
6190
- onKeyDown,
6524
+ onFocusFilterClause: handleFocusFilterClause,
6525
+ onKeyDownFilterbar: handleKeyDownFilterbar,
6526
+ onKeyDownMenu: handleKeyDownMenu,
6191
6527
  onMenuAction: handleMenuAction,
6192
6528
  onNavigateOutOfBounds: handlePillNavigationOutOfBounds,
6193
6529
  pillProps,
@@ -6196,9 +6532,54 @@ var useFilterBar = ({
6196
6532
  };
6197
6533
  };
6198
6534
 
6535
+ // src/filter-bar/FilterBarMenu.tsx
6536
+ var import_vuu_popups7 = require("@vuu-ui/vuu-popups");
6537
+
6538
+ // src/filter-bar/useFilterBarMenu.ts
6539
+ var import_react78 = require("react");
6540
+ var useFilterBarMenu = () => {
6541
+ const menuBuilder = (0, import_react78.useCallback)(() => {
6542
+ return [
6543
+ {
6544
+ label: `You have no saved filters for this table`,
6545
+ action: `no-action`
6546
+ }
6547
+ ];
6548
+ }, []);
6549
+ const menuActionHandler = (0, import_react78.useMemo)(
6550
+ () => (action) => {
6551
+ console.log(`invoke menuId `, {
6552
+ action
6553
+ });
6554
+ return false;
6555
+ },
6556
+ []
6557
+ );
6558
+ return {
6559
+ menuBuilder,
6560
+ menuActionHandler
6561
+ };
6562
+ };
6563
+
6564
+ // src/filter-bar/FilterBarMenu.tsx
6565
+ var import_jsx_runtime58 = require("react/jsx-runtime");
6566
+ var FilterBarMenu = () => {
6567
+ const classBase21 = "vuuFilterBarMenu";
6568
+ const { menuBuilder, menuActionHandler } = useFilterBarMenu();
6569
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: classBase21, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
6570
+ import_vuu_popups7.PopupMenu,
6571
+ {
6572
+ icon: "tune",
6573
+ menuBuilder,
6574
+ menuActionHandler,
6575
+ tabIndex: -1
6576
+ }
6577
+ ) });
6578
+ };
6579
+
6199
6580
  // src/filter-bar/FilterBar.tsx
6200
- var import_jsx_runtime57 = require("react/jsx-runtime");
6201
- var import_react79 = require("react");
6581
+ var import_jsx_runtime59 = require("react/jsx-runtime");
6582
+ var import_react80 = require("react");
6202
6583
  var classBase19 = "vuuFilterBar";
6203
6584
  var FilterBar = ({
6204
6585
  activeFilterIndex: activeFilterIndexProp = [],
@@ -6212,18 +6593,22 @@ var FilterBar = ({
6212
6593
  tableSchema,
6213
6594
  ...htmlAttributes
6214
6595
  }) => {
6215
- const rootRef = (0, import_react78.useRef)(null);
6596
+ const rootRef = (0, import_react79.useRef)(null);
6216
6597
  const {
6217
6598
  activeFilterIndex,
6218
6599
  addButtonProps,
6219
6600
  editFilter,
6220
6601
  filters,
6602
+ onBlurFilterClause,
6603
+ onCancelFilterClause,
6221
6604
  onClickAddFilter,
6222
6605
  onClickRemoveFilter,
6223
6606
  onChangeFilterClause,
6224
6607
  onChangeActiveFilterIndex,
6608
+ onFocusFilterClause,
6225
6609
  onNavigateOutOfBounds,
6226
- onKeyDown,
6610
+ onKeyDownFilterbar,
6611
+ onKeyDownMenu,
6227
6612
  onMenuAction,
6228
6613
  pillProps,
6229
6614
  promptProps,
@@ -6235,19 +6620,19 @@ var FilterBar = ({
6235
6620
  onApplyFilter,
6236
6621
  onChangeActiveFilterIndex: onChangeActiveFilterIndexProp,
6237
6622
  onFiltersChanged,
6238
- showMenu: showMenuProp
6623
+ showMenu: showMenuProp,
6624
+ tableSchema
6239
6625
  });
6240
6626
  const className = (0, import_classnames32.default)(classBase19, classNameProp, {
6241
6627
  [`${classBase19}-display`]: editFilter === void 0,
6242
6628
  [`${classBase19}-edit`]: editFilter !== void 0
6243
6629
  });
6244
- const onClose = () => console.log("Closing filter component");
6245
6630
  const getChildren2 = () => {
6246
6631
  const items = [];
6247
6632
  if (editFilter === void 0) {
6248
6633
  filters.forEach((filter, i) => {
6249
6634
  items.push(
6250
- /* @__PURE__ */ (0, import_react79.createElement)(FilterPill, { ...pillProps, filter, key: `filter-${i}` })
6635
+ /* @__PURE__ */ (0, import_react80.createElement)(FilterPill, { ...pillProps, filter, key: `filter-${i}` })
6251
6636
  );
6252
6637
  });
6253
6638
  return items;
@@ -6255,14 +6640,16 @@ var FilterBar = ({
6255
6640
  const filterClauses2 = filterClauses(editFilter);
6256
6641
  filterClauses2.forEach((filterClause, i) => {
6257
6642
  items.push(
6258
- /* @__PURE__ */ (0, import_react79.createElement)(
6643
+ /* @__PURE__ */ (0, import_react80.createElement)(
6259
6644
  FilterClauseEditor,
6260
6645
  {
6261
6646
  ...FilterClauseEditorProps2,
6262
6647
  filterClause,
6263
6648
  key: `editor-${i}`,
6649
+ onCancel: onCancelFilterClause,
6264
6650
  onChange: onChangeFilterClause,
6265
- onClose,
6651
+ onBlur: onBlurFilterClause,
6652
+ onFocus: onFocusFilterClause,
6266
6653
  tableSchema
6267
6654
  }
6268
6655
  )
@@ -6270,11 +6657,18 @@ var FilterBar = ({
6270
6657
  });
6271
6658
  if (showMenu) {
6272
6659
  items.push(
6273
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(FilterBuilderMenu, { onMenuAction }, "menu")
6660
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
6661
+ FilterBuilderMenu,
6662
+ {
6663
+ onMenuAction,
6664
+ ListProps: { onKeyDownCapture: onKeyDownMenu }
6665
+ },
6666
+ "menu"
6667
+ )
6274
6668
  );
6275
6669
  }
6276
6670
  items.push(
6277
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6671
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
6278
6672
  import_core19.Button,
6279
6673
  {
6280
6674
  className: `${classBase19}-remove`,
@@ -6289,16 +6683,16 @@ var FilterBar = ({
6289
6683
  return items;
6290
6684
  }
6291
6685
  };
6292
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
6686
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(
6293
6687
  "div",
6294
6688
  {
6295
6689
  ...htmlAttributes,
6296
6690
  className,
6297
- onKeyDown,
6691
+ onKeyDown: onKeyDownFilterbar,
6298
6692
  ref: rootRef,
6299
6693
  children: [
6300
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: `${classBase19}-icon`, "data-icon": "tune" }),
6301
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6694
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(FilterBarMenu, {}),
6695
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
6302
6696
  Toolbar,
6303
6697
  {
6304
6698
  activeItemIndex: activeFilterIndex,
@@ -6309,7 +6703,7 @@ var FilterBar = ({
6309
6703
  children: getChildren2()
6310
6704
  }
6311
6705
  ),
6312
- editFilter === void 0 ? /* @__PURE__ */ (0, import_react79.createElement)(
6706
+ editFilter === void 0 ? /* @__PURE__ */ (0, import_react80.createElement)(
6313
6707
  import_core19.Button,
6314
6708
  {
6315
6709
  ...addButtonProps,
@@ -6322,8 +6716,8 @@ var FilterBar = ({
6322
6716
  variant: "primary"
6323
6717
  }
6324
6718
  ) : null,
6325
- promptProps ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
6326
- import_vuu_popups7.Prompt,
6719
+ promptProps ? /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
6720
+ import_vuu_popups8.Prompt,
6327
6721
  {
6328
6722
  ...promptProps,
6329
6723
  PopupProps: {
@@ -9329,14 +9723,14 @@ var parser = LRParser.deserialize({
9329
9723
  });
9330
9724
 
9331
9725
  // ../vuu-filter-parser/src/FilterTreeWalker.ts
9332
- var import_vuu_utils30 = require("@vuu-ui/vuu-utils");
9726
+ var import_vuu_utils31 = require("@vuu-ui/vuu-utils");
9333
9727
  var _filter;
9334
9728
  var FilterExpression = class {
9335
9729
  constructor() {
9336
9730
  __privateAdd(this, _filter, void 0);
9337
9731
  }
9338
9732
  setFilterCombinatorOp(op, filter = __privateGet(this, _filter)) {
9339
- if ((0, import_vuu_utils30.isMultiClauseFilter)(filter) && filter.op === op) {
9733
+ if ((0, import_vuu_utils31.isMultiClauseFilter)(filter) && filter.op === op) {
9340
9734
  return;
9341
9735
  } else {
9342
9736
  __privateSet(this, _filter, {
@@ -9348,14 +9742,14 @@ var FilterExpression = class {
9348
9742
  add(filter) {
9349
9743
  if (__privateGet(this, _filter) === void 0) {
9350
9744
  __privateSet(this, _filter, filter);
9351
- } else if ((0, import_vuu_utils30.isMultiClauseFilter)(__privateGet(this, _filter))) {
9745
+ } else if ((0, import_vuu_utils31.isMultiClauseFilter)(__privateGet(this, _filter))) {
9352
9746
  __privateGet(this, _filter).filters.push(filter);
9353
9747
  } else {
9354
9748
  throw Error(`Invalid filter passed to FilterExpression`);
9355
9749
  }
9356
9750
  }
9357
9751
  setColumn(column, filter = __privateGet(this, _filter)) {
9358
- if ((0, import_vuu_utils30.isMultiClauseFilter)(filter)) {
9752
+ if ((0, import_vuu_utils31.isMultiClauseFilter)(filter)) {
9359
9753
  const target = filter.filters.at(-1);
9360
9754
  if (target) {
9361
9755
  this.setColumn(column, target);
@@ -9365,7 +9759,7 @@ var FilterExpression = class {
9365
9759
  }
9366
9760
  }
9367
9761
  setOp(value, filter = __privateGet(this, _filter)) {
9368
- if ((0, import_vuu_utils30.isMultiClauseFilter)(filter)) {
9762
+ if ((0, import_vuu_utils31.isMultiClauseFilter)(filter)) {
9369
9763
  const target = filter.filters.at(-1);
9370
9764
  if (target) {
9371
9765
  this.setOp(value, target);
@@ -9376,15 +9770,15 @@ var FilterExpression = class {
9376
9770
  }
9377
9771
  setValue(value, filter = __privateGet(this, _filter)) {
9378
9772
  var _a;
9379
- if ((0, import_vuu_utils30.isMultiClauseFilter)(filter)) {
9773
+ if ((0, import_vuu_utils31.isMultiClauseFilter)(filter)) {
9380
9774
  const target = filter.filters.at(-1);
9381
9775
  if (target) {
9382
9776
  this.setValue(value, target);
9383
9777
  }
9384
- } else if ((0, import_vuu_utils30.isMultiValueFilter)(filter)) {
9778
+ } else if ((0, import_vuu_utils31.isMultiValueFilter)(filter)) {
9385
9779
  (_a = filter.values) != null ? _a : filter.values = [];
9386
9780
  filter.values.push(value);
9387
- } else if ((0, import_vuu_utils30.isSingleValueFilter)(filter)) {
9781
+ } else if ((0, import_vuu_utils31.isSingleValueFilter)(filter)) {
9388
9782
  filter.value = value;
9389
9783
  }
9390
9784
  }
@@ -9448,7 +9842,7 @@ var strictParser = parser.configure({ strict: true });
9448
9842
 
9449
9843
  // src/filter-input/useCodeMirrorEditor.ts
9450
9844
  var import_classnames33 = __toESM(require_classnames(), 1);
9451
- var import_react81 = require("react");
9845
+ var import_react82 = require("react");
9452
9846
 
9453
9847
  // src/filter-input/FilterLanguage.ts
9454
9848
  var import_vuu_codemirror = require("@vuu-ui/vuu-codemirror");
@@ -9554,7 +9948,7 @@ var vuuTheme = import_vuu_codemirror3.EditorView.theme(
9554
9948
 
9555
9949
  // src/filter-input/useFilterAutoComplete.ts
9556
9950
  var import_vuu_codemirror4 = require("@vuu-ui/vuu-codemirror");
9557
- var import_react80 = require("react");
9951
+ var import_react81 = require("react");
9558
9952
  var getOperator = (node, state) => {
9559
9953
  let maybeColumnNode = node.prevSibling || node.parent;
9560
9954
  while (maybeColumnNode && !["Column", "Operator", "In"].includes(maybeColumnNode.name)) {
@@ -9624,7 +10018,7 @@ var getSetValues = (node, state) => {
9624
10018
  return values;
9625
10019
  };
9626
10020
  var useAutoComplete = (suggestionProvider, onSubmit, existingFilter) => {
9627
- const makeSuggestions = (0, import_react80.useCallback)(
10021
+ const makeSuggestions = (0, import_react81.useCallback)(
9628
10022
  async (context, suggestionType, optionalArgs = {}) => {
9629
10023
  const { startsWith = "" } = optionalArgs;
9630
10024
  const options = await suggestionProvider.getSuggestions(
@@ -9635,7 +10029,7 @@ var useAutoComplete = (suggestionProvider, onSubmit, existingFilter) => {
9635
10029
  },
9636
10030
  [suggestionProvider]
9637
10031
  );
9638
- return (0, import_react80.useCallback)(
10032
+ return (0, import_react81.useCallback)(
9639
10033
  async (context) => {
9640
10034
  var _a, _b;
9641
10035
  const { state, pos } = context;
@@ -9819,15 +10213,15 @@ var useCodeMirrorEditor = ({
9819
10213
  onSubmitFilter,
9820
10214
  suggestionProvider
9821
10215
  }) => {
9822
- const editorRef = (0, import_react81.useRef)(null);
9823
- const onSubmit = (0, import_react81.useRef)(noop);
9824
- const viewRef = (0, import_react81.useRef)();
10216
+ const editorRef = (0, import_react82.useRef)(null);
10217
+ const onSubmit = (0, import_react82.useRef)(noop);
10218
+ const viewRef = (0, import_react82.useRef)();
9825
10219
  const completionFn = useAutoComplete(
9826
10220
  suggestionProvider,
9827
10221
  onSubmit,
9828
10222
  existingFilter
9829
10223
  );
9830
- const [createState, clearInput] = (0, import_react81.useMemo)(() => {
10224
+ const [createState, clearInput] = (0, import_react82.useMemo)(() => {
9831
10225
  const parseFilter2 = () => {
9832
10226
  const view = getView(viewRef);
9833
10227
  const source = view.state.doc.toString();
@@ -9902,7 +10296,7 @@ var useCodeMirrorEditor = ({
9902
10296
  };
9903
10297
  return [createState2, clearInput2];
9904
10298
  }, [completionFn, onSubmitFilter]);
9905
- (0, import_react81.useEffect)(() => {
10299
+ (0, import_react82.useEffect)(() => {
9906
10300
  if (!editorRef.current) {
9907
10301
  throw Error("editor not in dom");
9908
10302
  }
@@ -9919,7 +10313,7 @@ var useCodeMirrorEditor = ({
9919
10313
  };
9920
10314
 
9921
10315
  // src/filter-input/FilterInput.tsx
9922
- var import_jsx_runtime58 = require("react/jsx-runtime");
10316
+ var import_jsx_runtime60 = require("react/jsx-runtime");
9923
10317
  var classBase20 = "vuuFilterInput";
9924
10318
  var FilterInput = ({
9925
10319
  existingFilter,
@@ -9934,8 +10328,8 @@ var FilterInput = ({
9934
10328
  onSubmitFilter,
9935
10329
  suggestionProvider
9936
10330
  });
9937
- return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { ...props, className: classBase20, children: [
9938
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
10331
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)("div", { ...props, className: classBase20, children: [
10332
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
9939
10333
  import_core20.Button,
9940
10334
  {
9941
10335
  className: `${classBase20}-FilterButton`,
@@ -9943,8 +10337,8 @@ var FilterInput = ({
9943
10337
  tabIndex: -1
9944
10338
  }
9945
10339
  ),
9946
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: `${classBase20}-Editor`, ref: editorRef }),
9947
- /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
10340
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: `${classBase20}-Editor`, ref: editorRef }),
10341
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
9948
10342
  import_core20.Button,
9949
10343
  {
9950
10344
  className: `${classBase20}-ClearButton`,
@@ -9958,16 +10352,16 @@ var FilterInput = ({
9958
10352
  // src/filter-input/useFilterSuggestionProvider.ts
9959
10353
  var import_vuu_codemirror6 = require("@vuu-ui/vuu-codemirror");
9960
10354
  var import_vuu_data_react2 = require("@vuu-ui/vuu-data-react");
9961
- var import_react82 = require("react");
10355
+ var import_react83 = require("react");
9962
10356
 
9963
10357
  // src/filter-input/filterInfo.ts
9964
- var import_vuu_utils31 = require("@vuu-ui/vuu-utils");
10358
+ var import_vuu_utils32 = require("@vuu-ui/vuu-utils");
9965
10359
  var filterInfo = (filterName, filterQuery) => {
9966
- const rootElement = (0, import_vuu_utils31.createEl)("div", "vuuFunctionDoc");
9967
- const headingElement = (0, import_vuu_utils31.createEl)("div", "function-heading");
9968
- const nameElement = (0, import_vuu_utils31.createEl)("span", "function-name", filterName);
10360
+ const rootElement = (0, import_vuu_utils32.createEl)("div", "vuuFunctionDoc");
10361
+ const headingElement = (0, import_vuu_utils32.createEl)("div", "function-heading");
10362
+ const nameElement = (0, import_vuu_utils32.createEl)("span", "function-name", filterName);
9969
10363
  headingElement.appendChild(nameElement);
9970
- const child2 = (0, import_vuu_utils31.createEl)("p", void 0, filterQuery);
10364
+ const child2 = (0, import_vuu_utils32.createEl)("p", void 0, filterQuery);
9971
10365
  rootElement.appendChild(headingElement);
9972
10366
  rootElement.appendChild(child2);
9973
10367
  return rootElement;
@@ -10054,9 +10448,9 @@ var useFilterSuggestionProvider = ({
10054
10448
  table,
10055
10449
  typeaheadHook: useTypeahead = import_vuu_data_react2.useTypeaheadSuggestions
10056
10450
  }) => {
10057
- const latestSuggestionsRef = (0, import_react82.useRef)();
10451
+ const latestSuggestionsRef = (0, import_react83.useRef)();
10058
10452
  const getTypeaheadSuggestions = useTypeahead();
10059
- const getSuggestions = (0, import_react82.useCallback)(
10453
+ const getSuggestions = (0, import_react83.useCallback)(
10060
10454
  async (suggestionType, options = NONE) => {
10061
10455
  const {
10062
10456
  columnName,
@@ -10146,7 +10540,7 @@ var useFilterSuggestionProvider = ({
10146
10540
  },
10147
10541
  [columns, getTypeaheadSuggestions, namedFilters, saveOptions, table]
10148
10542
  );
10149
- const isPartialMatch = (0, import_react82.useCallback)(
10543
+ const isPartialMatch = (0, import_react83.useCallback)(
10150
10544
  async (valueType, columnName, pattern) => {
10151
10545
  const suggestions = (
10152
10546
  // latestSuggestions && latestSuggestions.length > 0