@vuu-ui/vuu-filters 0.13.106 → 0.13.108

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 (90) hide show
  1. package/cjs/filter-bar/FilterBar.css.js +1 -1
  2. package/cjs/filter-bar/FilterBar.js +1 -1
  3. package/cjs/filter-bar/FilterBar.js.map +1 -1
  4. package/cjs/filter-clause/ExpandoCombobox.css.js +1 -1
  5. package/cjs/filter-clause/ExpandoCombobox.js +6 -1
  6. package/cjs/filter-clause/ExpandoCombobox.js.map +1 -1
  7. package/cjs/filter-clause/FilterClause.css.js +1 -1
  8. package/cjs/filter-clause/FilterClause.js +8 -8
  9. package/cjs/filter-clause/FilterClause.js.map +1 -1
  10. package/cjs/filter-clause/{ColumnPicker.js → column-picker/ColumnPicker.js} +8 -8
  11. package/cjs/filter-clause/column-picker/ColumnPicker.js.map +1 -0
  12. package/cjs/filter-clause/column-picker/useColumnPicker.js +61 -0
  13. package/cjs/filter-clause/column-picker/useColumnPicker.js.map +1 -0
  14. package/cjs/filter-clause/filterClauseFocusManagement.js +0 -1
  15. package/cjs/filter-clause/filterClauseFocusManagement.js.map +1 -1
  16. package/cjs/filter-clause/operator-picker/OperatorPicker.js +40 -0
  17. package/cjs/filter-clause/operator-picker/OperatorPicker.js.map +1 -0
  18. package/cjs/filter-clause/operator-picker/operator-utils.js.map +1 -0
  19. package/cjs/filter-clause/operator-picker/useOperatorPicker.js +61 -0
  20. package/cjs/filter-clause/operator-picker/useOperatorPicker.js.map +1 -0
  21. package/cjs/filter-clause/useFilterClause.js +9 -5
  22. package/cjs/filter-clause/useFilterClause.js.map +1 -1
  23. package/cjs/filter-clause/value-editors/FilterClauseValueEditor.js +2 -2
  24. package/cjs/filter-clause/value-editors/FilterClauseValueEditor.js.map +1 -1
  25. package/cjs/filter-clause/value-editors/FilterClauseValueEditorText.js +32 -7
  26. package/cjs/filter-clause/value-editors/FilterClauseValueEditorText.js.map +1 -1
  27. package/cjs/filter-editor/FilterEditor.js +2 -1
  28. package/cjs/filter-editor/FilterEditor.js.map +1 -1
  29. package/cjs/index.js +3 -1
  30. package/cjs/index.js.map +1 -1
  31. package/cjs/inline-filter/InlineFilter.js.map +1 -1
  32. package/esm/filter-bar/FilterBar.css.js +1 -1
  33. package/esm/filter-bar/FilterBar.js +1 -1
  34. package/esm/filter-bar/FilterBar.js.map +1 -1
  35. package/esm/filter-clause/ExpandoCombobox.css.js +1 -1
  36. package/esm/filter-clause/ExpandoCombobox.js +6 -1
  37. package/esm/filter-clause/ExpandoCombobox.js.map +1 -1
  38. package/esm/filter-clause/FilterClause.css.js +1 -1
  39. package/esm/filter-clause/FilterClause.js +8 -8
  40. package/esm/filter-clause/FilterClause.js.map +1 -1
  41. package/esm/filter-clause/{ColumnPicker.js → column-picker/ColumnPicker.js} +9 -9
  42. package/esm/filter-clause/column-picker/ColumnPicker.js.map +1 -0
  43. package/esm/filter-clause/column-picker/useColumnPicker.js +59 -0
  44. package/esm/filter-clause/column-picker/useColumnPicker.js.map +1 -0
  45. package/esm/filter-clause/filterClauseFocusManagement.js +0 -1
  46. package/esm/filter-clause/filterClauseFocusManagement.js.map +1 -1
  47. package/esm/filter-clause/operator-picker/OperatorPicker.js +38 -0
  48. package/esm/filter-clause/operator-picker/OperatorPicker.js.map +1 -0
  49. package/esm/filter-clause/operator-picker/operator-utils.js.map +1 -0
  50. package/esm/filter-clause/operator-picker/useOperatorPicker.js +59 -0
  51. package/esm/filter-clause/operator-picker/useOperatorPicker.js.map +1 -0
  52. package/esm/filter-clause/useFilterClause.js +9 -5
  53. package/esm/filter-clause/useFilterClause.js.map +1 -1
  54. package/esm/filter-clause/value-editors/FilterClauseValueEditor.js +2 -2
  55. package/esm/filter-clause/value-editors/FilterClauseValueEditor.js.map +1 -1
  56. package/esm/filter-clause/value-editors/FilterClauseValueEditorText.js +35 -10
  57. package/esm/filter-clause/value-editors/FilterClauseValueEditorText.js.map +1 -1
  58. package/esm/filter-editor/FilterEditor.js +2 -1
  59. package/esm/filter-editor/FilterEditor.js.map +1 -1
  60. package/esm/index.js +2 -1
  61. package/esm/index.js.map +1 -1
  62. package/esm/inline-filter/InlineFilter.js.map +1 -1
  63. package/package.json +14 -14
  64. package/types/filter-clause/ExpandoCombobox.d.ts +2 -2
  65. package/types/filter-clause/column-picker/useColumnPicker.d.ts +11 -0
  66. package/types/filter-clause/filterClauseTypes.d.ts +1 -2
  67. package/types/filter-clause/index.d.ts +2 -1
  68. package/types/filter-clause/operator-picker/useOperatorPicker.d.ts +12 -0
  69. package/types/filter-clause/useFilterClause.d.ts +2 -3
  70. package/types/filter-clause/value-editors/FilterClauseValueEditor.d.ts +1 -1
  71. package/cjs/filter-clause/ColumnPicker.js.map +0 -1
  72. package/cjs/filter-clause/OperatorPicker.js +0 -34
  73. package/cjs/filter-clause/OperatorPicker.js.map +0 -1
  74. package/cjs/filter-clause/operator-utils.js.map +0 -1
  75. package/cjs/filter-clause/useExpandoCombobox.js +0 -25
  76. package/cjs/filter-clause/useExpandoCombobox.js.map +0 -1
  77. package/esm/filter-clause/ColumnPicker.js.map +0 -1
  78. package/esm/filter-clause/OperatorPicker.js +0 -32
  79. package/esm/filter-clause/OperatorPicker.js.map +0 -1
  80. package/esm/filter-clause/operator-utils.js.map +0 -1
  81. package/esm/filter-clause/useExpandoCombobox.js +0 -23
  82. package/esm/filter-clause/useExpandoCombobox.js.map +0 -1
  83. package/types/filter-clause/FilterMenu.d.ts +0 -9
  84. package/types/filter-clause/FilterMenuOptions.d.ts +0 -6
  85. package/types/filter-clause/useExpandoCombobox.d.ts +0 -9
  86. /package/cjs/filter-clause/{operator-utils.js → operator-picker/operator-utils.js} +0 -0
  87. /package/esm/filter-clause/{operator-utils.js → operator-picker/operator-utils.js} +0 -0
  88. /package/types/filter-clause/{ColumnPicker.d.ts → column-picker/ColumnPicker.d.ts} +0 -0
  89. /package/types/filter-clause/{OperatorPicker.d.ts → operator-picker/OperatorPicker.d.ts} +0 -0
  90. /package/types/filter-clause/{operator-utils.d.ts → operator-picker/operator-utils.d.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var filterBarCss = ".vuuFilterBar {\n --vuu-svg-grid: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M2 6.00004H4.66667V3.33337H3.33333C2.6 3.33337 2 3.93337 2 4.66671V6.00004ZM2 9.33337H4.66667V6.66671H2V9.33337ZM5.33333 9.33337H8V6.66671H5.33333V9.33337ZM8.66667 9.33337H11.3333V6.66671H8.66667V9.33337ZM5.33333 6.00004H8V3.33337H5.33333V6.00004ZM8.66667 3.33337V6.00004H11.3333V3.33337H8.66667ZM12 9.33337H14.6667V6.66671H12V9.33337ZM3.33333 12.6667H4.66667V10H2V11.3334C2 12.0667 2.6 12.6667 3.33333 12.6667ZM5.33333 12.6667H8V10H5.33333V12.6667ZM8.66667 12.6667H11.3333V10H8.66667V12.6667ZM12 12.6667H13.3333C14.0667 12.6667 14.6667 12.0667 14.6667 11.3334V10H12V12.6667ZM12 3.33337V6.00004H14.6667V4.66671C14.6667 3.93337 14.0667 3.33337 13.3333 3.33337H12Z\"/></svg>');\n --vuu-svg-tune: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M3 18C3 18.55 3.45 19 4 19H9V17H4C3.45 17 3 17.45 3 18ZM3 6C3 6.55 3.45 7 4 7H13V5H4C3.45 5 3 5.45 3 6ZM13 20V19H20C20.55 19 21 18.55 21 18C21 17.45 20.55 17 20 17H13V16C13 15.45 12.55 15 12 15C11.45 15 11 15.45 11 16V20C11 20.55 11.45 21 12 21C12.55 21 13 20.55 13 20ZM7 10V11H4C3.45 11 3 11.45 3 12C3 12.55 3.45 13 4 13H7V14C7 14.55 7.45 15 8 15C8.55 15 9 14.55 9 14V10C9 9.45 8.55 9 8 9C7.45 9 7 9.45 7 10ZM21 12C21 11.45 20.55 11 20 11H11V13H20C20.55 13 21 12.55 21 12ZM16 9C16.55 9 17 8.55 17 8V7H20C20.55 7 21 6.55 21 6C21 5.45 20.55 5 20 5H17V4C17 3.45 16.55 3 16 3C15.45 3 15 3.45 15 4V8C15 8.55 15.45 9 16 9Z\" /></svg>');\n --vuuOverflowContainer-minWidth: 0;\n --filterbar-height: var(\n --vuuFilterBar-height,\n calc(var(--salt-size-base) + var(--salt-spacing-100))\n );\n --vuuFilterEditor-height: var(--filterbar-height);\n --icon-container-height: auto;\n --flexbar-gap: var(--salt-spacing-100);\n --icon-marginTop: 0;\n\n align-items: center;\n background-color: var(--salt-container-secondary-background);\n border-color: var(--salt-container-primary-borderColor);\n border-style: var(--vuuFilterBar-borderStyle, none none solid none);\n border-width: 1px;\n display: inline-flex;\n flex: var(--vuuFilterBar-flex);\n flex-wrap: wrap;\n gap: var(--flexbar-gap);\n grid-template-columns: 70px 1fr 28px;\n grid-auto-rows: 28px 0px;\n height: calc(var(--salt-spacing-100) + var(--filterbar-height));\n overflow: hidden;\n padding: var(--salt-spacing-100) var(--salt-spacing-200);\n}\n\n.vuuFilterBar-quick-filter-mode {\n --icon-container-height: 100%;\n --icon-marginTop: 20px;\n --filterbar-height: var(\n --vuuFilterBar-height,\n calc(2 * var(--salt-size-base))\n );\n align-items: flex-end;\n padding: var(--salt-spacing-100) var(--salt-spacing-200);\n}\n\n.vuuFilterBar:has(.vuuFilterEditor) {\n grid-template-rows: 28px 28px;\n height: calc(1px + var(--flexbar-gap) + (2 * var(--filterbar-height)));\n}\n\n.vuuFilterBar-iconContainer {\n height: var(--icon-container-height);\n\n .saltToggleButtonGroup {\n margin-top: var(--icon-marginTop);\n transition: margin-top 0.1s ease-in;\n }\n}\n\n.vuuFilterbar-icon {\n display: inline-block;\n height: 16px;\n width: 16px;\n}\n\n.vuuFilterBar [data-icon=\"grid\"] {\n --vuu-icon-size: 16px;\n --vuu-icon-svg: var(--vuu-svg-grid);\n}\n.vuuFilterBar [data-icon=\"tune\"] {\n --vuu-icon-size: 16px;\n --vuu-icon-svg: var(--vuu-svg-tune);\n}\n\n.vuuFilterBar [data-icon=\"plus\"] {\n --vuu-icon-size: 16px;\n}\n\n.vuuFilterBar .vuuToolbar {\n flex: 0 1 auto;\n}\n\n.vuuFilterBar-Editor {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--salt-spacing-100);\n}\n\n.vuuCustomFilters {\n display: flex;\n gap: var(--salt-spacing-100);\n}\n.vuuCustomFilters-filters {\n display: flex;\n gap: var(--salt-spacing-100);\n}\n";
3
+ var filterBarCss = ".vuuFilterBar {\n --vuu-svg-grid: url('data:image/svg+xml;utf8,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\"><path d=\"M2 6.00004H4.66667V3.33337H3.33333C2.6 3.33337 2 3.93337 2 4.66671V6.00004ZM2 9.33337H4.66667V6.66671H2V9.33337ZM5.33333 9.33337H8V6.66671H5.33333V9.33337ZM8.66667 9.33337H11.3333V6.66671H8.66667V9.33337ZM5.33333 6.00004H8V3.33337H5.33333V6.00004ZM8.66667 3.33337V6.00004H11.3333V3.33337H8.66667ZM12 9.33337H14.6667V6.66671H12V9.33337ZM3.33333 12.6667H4.66667V10H2V11.3334C2 12.0667 2.6 12.6667 3.33333 12.6667ZM5.33333 12.6667H8V10H5.33333V12.6667ZM8.66667 12.6667H11.3333V10H8.66667V12.6667ZM12 12.6667H13.3333C14.0667 12.6667 14.6667 12.0667 14.6667 11.3334V10H12V12.6667ZM12 3.33337V6.00004H14.6667V4.66671C14.6667 3.93337 14.0667 3.33337 13.3333 3.33337H12Z\"/></svg>');\n --vuuOverflowContainer-minWidth: 0;\n --filterbar-height: var(\n --vuuFilterBar-height,\n calc(var(--salt-size-base) + var(--salt-spacing-300))\n );\n --vuuFilterEditor-height: var(--filterbar-height);\n --icon-container-height: auto;\n --flexbar-gap: var(--salt-spacing-100);\n --icon-marginTop: 0;\n\n align-items: center;\n background-color: var(--salt-container-secondary-background);\n border-color: var(--salt-separable-secondary-borderColor);\n border-style: var(--vuuFilterBar-borderStyle, none none solid none);\n border-width: 1px;\n display: inline-flex;\n flex: var(--vuuFilterBar-flex);\n flex-wrap: wrap;\n gap: var(--flexbar-gap);\n grid-template-columns: 70px 1fr 28px;\n grid-auto-rows: 28px 0px;\n height: var(--filterbar-height);\n overflow: hidden;\n padding: var(--salt-spacing-100) var(--salt-spacing-200);\n}\n\n.vuuFilterBar-quick-filter-mode {\n --icon-container-height: 100%;\n --icon-marginTop: 20px;\n --filterbar-height: var(\n --vuuFilterBar-height,\n calc(2 * var(--salt-size-base))\n );\n align-items: flex-end;\n padding: var(--salt-spacing-100) var(--salt-spacing-200);\n}\n\n.vuuFilterBar:has(.vuuFilterEditor) {\n grid-template-rows: 28px 28px;\n height: calc(1px + var(--flexbar-gap) + (2 * var(--filterbar-height)));\n}\n\n.vuuFilterBar-iconContainer {\n height: var(--icon-container-height);\n\n .saltToggleButtonGroup {\n margin-top: var(--icon-marginTop);\n transition: margin-top 0.1s ease-in;\n }\n}\n\n.vuuFilterbar-icon {\n display: inline-block;\n height: 16px;\n width: 16px;\n}\n\n.vuuFilterBar [data-icon=\"grid\"] {\n --vuu-icon-size: 16px;\n --vuu-icon-svg: var(--vuu-svg-grid);\n}\n\n.vuuFilterBar [data-icon=\"plus\"] {\n --vuu-icon-size: 16px;\n}\n\n.vuuFilterBar .vuuToolbar {\n flex: 0 1 auto;\n}\n\n.vuuFilterBar-Editor {\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: var(--salt-spacing-100);\n}\n\n.vuuCustomFilters {\n display: flex;\n gap: var(--salt-spacing-100);\n}\n.vuuCustomFilters-filters {\n display: flex;\n gap: var(--salt-spacing-100);\n}\n";
4
4
 
5
5
  module.exports = filterBarCss;
6
6
  //# sourceMappingURL=FilterBar.css.js.map
@@ -48,7 +48,7 @@ const FilterBar = ({
48
48
  const className = cx(classBase, classNameProp);
49
49
  const startAdornment = react.useMemo(() => {
50
50
  if (!allowQuickFilters) {
51
- return /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: "filter", size: 16, style: { top: 4 } });
51
+ return /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.Icon, { name: "sliders", size: 16, style: { top: 2 } });
52
52
  } else {
53
53
  return /* @__PURE__ */ jsxRuntime.jsxs(
54
54
  core.ToggleButtonGroup,
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBar.js","sources":["../../../../packages/vuu-filters/src/filter-bar/FilterBar.tsx"],"sourcesContent":["import { Filter, FilterHandler, FilterState } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport { ToggleButton, ToggleButtonGroup } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { CustomFilters } from \"../custom-filters\";\nimport { QuickFilterProps, QuickFilters } from \"../quick-filters\";\nimport { FilterMode, useFilterBar } from \"./useFilterBar\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nimport filterBarCss from \"./FilterBar.css\";\n\nexport type FilterBarVariant =\n | \"custom-filters-only\"\n | \"quick-filters-only\"\n | \"full-filters\";\n\nexport interface FilterBarProps extends HTMLAttributes<HTMLDivElement> {\n QuickFilterProps?: Pick<\n QuickFilterProps,\n \"quickFilterColumns\" | \"onChangeQuickFilterColumns\"\n >;\n /**\n * Used to ensure we present filter editors appropriate to the data type of column.\n * NOTE: Always make sure that these are passed with proper re-render optimization (i.e make\n * sure its a stable reference, in React terminology), otherwise might end up with infinite\n * state updates.\n */\n columnDescriptors: ColumnDescriptor[];\n defaultFilterMode?: FilterMode;\n defaultFilterState?: FilterState;\n filterMode?: FilterMode;\n filterState?: FilterState;\n onApplyFilter: FilterHandler;\n onChangeFilterMode?: (filterMode: FilterMode) => void;\n onClearFilter: () => void;\n onFilterDeleted?: FilterHandler;\n onFilterRenamed?: (filter: Filter, name: string) => void;\n onFilterStateChanged?: (state: FilterState) => void;\n /**\n * Defines table used in call to Vuu Typeahead service\n */\n vuuTable?: VuuTable;\n variant?: FilterBarVariant;\n}\n\nconst classBase = \"vuuFilterBar\";\n\nexport const FilterBar = ({\n QuickFilterProps,\n className: classNameProp,\n columnDescriptors,\n defaultFilterMode,\n defaultFilterState,\n filterMode: filterModeProp,\n filterState,\n onApplyFilter,\n onChangeFilterMode: onChangeFilterModeProp,\n onClearFilter,\n onFilterDeleted,\n onFilterRenamed,\n onFilterStateChanged,\n vuuTable,\n variant = \"custom-filters-only\",\n ...htmlAttributes\n}: FilterBarProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-bar\",\n css: filterBarCss,\n window: targetWindow,\n });\n\n const allowCustomFilters = variant !== \"quick-filters-only\";\n const allowQuickFilters = variant !== \"custom-filters-only\";\n\n const controlledFilterMode: FilterMode | undefined = !allowCustomFilters\n ? \"quick-filter\"\n : !allowQuickFilters\n ? \"custom-filter\"\n : filterModeProp;\n\n const { filterMode, onChangeFilterMode } = useFilterBar({\n defaultFilterMode,\n filterMode: controlledFilterMode,\n onChangeFilterMode: onChangeFilterModeProp,\n });\n\n const className = cx(classBase, classNameProp);\n\n const startAdornment = useMemo(() => {\n if (!allowQuickFilters) {\n return <Icon name=\"filter\" size={16} style={{ top: 4 }} />;\n } else {\n return (\n <ToggleButtonGroup\n data-variant=\"secondary\"\n onChange={onChangeFilterMode}\n value={filterMode}\n >\n <ToggleButton\n className=\"vuuIconToggleButton\"\n key=\"custom-filter\"\n value=\"custom-filter\"\n aria-label=\"Custom filters\"\n tabIndex={-1}\n >\n <Icon name=\"grid\" size={16} />\n </ToggleButton>\n <ToggleButton\n className=\"vuuIconToggleButton\"\n key=\"quick-filter\"\n value=\"quick-filter\"\n aria-label=\"Quick filters\"\n tabIndex={-1}\n >\n <Icon name=\"tune\" size={16} />\n </ToggleButton>\n </ToggleButtonGroup>\n );\n }\n }, [allowQuickFilters, filterMode, onChangeFilterMode]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(className, `${classBase}-${filterMode}-mode`)}\n >\n {variant === \"quick-filters-only\" ? null : (\n <div className={`${classBase}-iconContainer`}>{startAdornment}</div>\n )}\n {filterMode === \"custom-filter\" ? (\n <CustomFilters\n columnDescriptors={columnDescriptors}\n defaultFilterState={defaultFilterState}\n filterState={filterState}\n onApplyFilter={onApplyFilter}\n onClearFilter={onClearFilter}\n onFilterDeleted={onFilterDeleted}\n onFilterRenamed={onFilterRenamed}\n onFilterStateChanged={onFilterStateChanged}\n vuuTable={vuuTable}\n />\n ) : (\n <QuickFilters\n {...QuickFilterProps}\n availableColumns={columnDescriptors}\n onApplyFilter={onApplyFilter}\n onClearFilter={onClearFilter}\n vuuTable={vuuTable}\n />\n )}\n </div>\n );\n};\n"],"names":["QuickFilterProps","useWindow","useComponentCssInjection","filterBarCss","useFilterBar","useMemo","jsx","Icon","jsxs","ToggleButtonGroup","ToggleButton","CustomFilters","QuickFilters"],"mappings":"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"}
1
+ {"version":3,"file":"FilterBar.js","sources":["../../../../packages/vuu-filters/src/filter-bar/FilterBar.tsx"],"sourcesContent":["import { Filter, FilterHandler, FilterState } from \"@vuu-ui/vuu-filter-types\";\nimport { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { Icon } from \"@vuu-ui/vuu-ui-controls\";\nimport { ToggleButton, ToggleButtonGroup } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { CustomFilters } from \"../custom-filters\";\nimport { QuickFilterProps, QuickFilters } from \"../quick-filters\";\nimport { FilterMode, useFilterBar } from \"./useFilterBar\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\n\nimport filterBarCss from \"./FilterBar.css\";\n\nexport type FilterBarVariant =\n | \"custom-filters-only\"\n | \"quick-filters-only\"\n | \"full-filters\";\n\nexport interface FilterBarProps extends HTMLAttributes<HTMLDivElement> {\n QuickFilterProps?: Pick<\n QuickFilterProps,\n \"quickFilterColumns\" | \"onChangeQuickFilterColumns\"\n >;\n /**\n * Used to ensure we present filter editors appropriate to the data type of column.\n * NOTE: Always make sure that these are passed with proper re-render optimization (i.e make\n * sure its a stable reference, in React terminology), otherwise might end up with infinite\n * state updates.\n */\n columnDescriptors: ColumnDescriptor[];\n defaultFilterMode?: FilterMode;\n defaultFilterState?: FilterState;\n filterMode?: FilterMode;\n filterState?: FilterState;\n onApplyFilter: FilterHandler;\n onChangeFilterMode?: (filterMode: FilterMode) => void;\n onClearFilter: () => void;\n onFilterDeleted?: FilterHandler;\n onFilterRenamed?: (filter: Filter, name: string) => void;\n onFilterStateChanged?: (state: FilterState) => void;\n /**\n * Defines table used in call to Vuu Typeahead service\n */\n vuuTable?: VuuTable;\n variant?: FilterBarVariant;\n}\n\nconst classBase = \"vuuFilterBar\";\n\nexport const FilterBar = ({\n QuickFilterProps,\n className: classNameProp,\n columnDescriptors,\n defaultFilterMode,\n defaultFilterState,\n filterMode: filterModeProp,\n filterState,\n onApplyFilter,\n onChangeFilterMode: onChangeFilterModeProp,\n onClearFilter,\n onFilterDeleted,\n onFilterRenamed,\n onFilterStateChanged,\n vuuTable,\n variant = \"custom-filters-only\",\n ...htmlAttributes\n}: FilterBarProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-bar\",\n css: filterBarCss,\n window: targetWindow,\n });\n\n const allowCustomFilters = variant !== \"quick-filters-only\";\n const allowQuickFilters = variant !== \"custom-filters-only\";\n\n const controlledFilterMode: FilterMode | undefined = !allowCustomFilters\n ? \"quick-filter\"\n : !allowQuickFilters\n ? \"custom-filter\"\n : filterModeProp;\n\n const { filterMode, onChangeFilterMode } = useFilterBar({\n defaultFilterMode,\n filterMode: controlledFilterMode,\n onChangeFilterMode: onChangeFilterModeProp,\n });\n\n const className = cx(classBase, classNameProp);\n\n const startAdornment = useMemo(() => {\n if (!allowQuickFilters) {\n return <Icon name=\"sliders\" size={16} style={{ top: 2 }} />;\n } else {\n return (\n <ToggleButtonGroup\n data-variant=\"secondary\"\n onChange={onChangeFilterMode}\n value={filterMode}\n >\n <ToggleButton\n className=\"vuuIconToggleButton\"\n key=\"custom-filter\"\n value=\"custom-filter\"\n aria-label=\"Custom filters\"\n tabIndex={-1}\n >\n <Icon name=\"grid\" size={16} />\n </ToggleButton>\n <ToggleButton\n className=\"vuuIconToggleButton\"\n key=\"quick-filter\"\n value=\"quick-filter\"\n aria-label=\"Quick filters\"\n tabIndex={-1}\n >\n <Icon name=\"tune\" size={16} />\n </ToggleButton>\n </ToggleButtonGroup>\n );\n }\n }, [allowQuickFilters, filterMode, onChangeFilterMode]);\n\n return (\n <div\n {...htmlAttributes}\n className={cx(className, `${classBase}-${filterMode}-mode`)}\n >\n {variant === \"quick-filters-only\" ? null : (\n <div className={`${classBase}-iconContainer`}>{startAdornment}</div>\n )}\n {filterMode === \"custom-filter\" ? (\n <CustomFilters\n columnDescriptors={columnDescriptors}\n defaultFilterState={defaultFilterState}\n filterState={filterState}\n onApplyFilter={onApplyFilter}\n onClearFilter={onClearFilter}\n onFilterDeleted={onFilterDeleted}\n onFilterRenamed={onFilterRenamed}\n onFilterStateChanged={onFilterStateChanged}\n vuuTable={vuuTable}\n />\n ) : (\n <QuickFilters\n {...QuickFilterProps}\n availableColumns={columnDescriptors}\n onApplyFilter={onApplyFilter}\n onClearFilter={onClearFilter}\n vuuTable={vuuTable}\n />\n )}\n </div>\n );\n};\n"],"names":["QuickFilterProps","useWindow","useComponentCssInjection","filterBarCss","useFilterBar","useMemo","jsx","Icon","jsxs","ToggleButtonGroup","ToggleButton","CustomFilters","QuickFilters"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var expandoComboboxCss = ".vuuExpandoCombobox {\n --expando-combobox-height: var(--vuuExpandoCombobox-height, var(--salt-size-base));\n --expando-combobox-fontSize: var(--vuuExpandoCombobox-fontSize, 12px);\n --saltPillInput-paddingLeft: 0px;\n --saltPillInput-paddingRight: 0px;\n\n display: inline-flex;\n flex-direction: column;\n height: var(--expando-combobox-height);\n min-width: 4px;\n padding: 0;\n\n .saltPill {\n height: 100%;\n padding-block: 0px;\n }\n\n .saltPillInput {\n min-height: var(--expando-combobox-height);\n min-width: 0px;\n }\n\n\n .saltPillInput-inputWrapper {\n height: 100%;\n min-width: max(var(--salt-spacing-800), 100%);\n padding: 0;\n }\n .saltPillInput-input {\n width: 0;\n }\n\n .saltPillInput-endAdornmentContainer {\n display: none;\n }\n .saltPillInput-activationIndicator {\n display: none;\n }\n\n}\n\n.vuuExpandoOption {\n min-width: calc(var(--salt-size-base) * 2);\n padding-left: var(--salt-spacing-200);\n padding-right: var(--salt-spacing-200);\n}\n\n\n.vuuExpandoCombobox:before {\n content: attr(data-text);\n display: block;\n font-size: var(--expando-combobox-fontSize);\n height: 0px;\n overflow: hidden;\n white-space: pre-wrap;\n}\n";
3
+ var expandoComboboxCss = ".vuuExpandoCombobox {\n --expando-combobox-height: var(--vuuExpandoCombobox-height, var(--salt-size-base));\n --expando-combobox-fontSize: var(--vuuExpandoCombobox-fontSize, 12px);\n --saltPillInput-paddingLeft: 0px;\n --saltPillInput-paddingRight: 0px;\n\n display: inline-flex;\n flex-direction: column;\n height: var(--expando-combobox-height);\n min-width: 4px;\n padding: 0;\n\n .saltPill {\n height: 100%;\n padding-block: 0px;\n }\n\n .saltPillInput {\n min-height: var(--expando-combobox-height);\n min-width: 0px;\n }\n\n\n .saltPillInput-inputWrapper {\n height: 100%;\n padding: 0;\n }\n .saltPillInput-input {\n width: 0;\n }\n\n .saltPillInput-endAdornmentContainer {\n display: none;\n }\n .saltPillInput-activationIndicator {\n display: none;\n }\n\n}\n\n.vuuExpandoOption {\n min-width: calc(var(--salt-size-base) * 2);\n padding-left: var(--salt-spacing-200);\n padding-right: var(--salt-spacing-200);\n}\n\n\n.vuuExpandoCombobox:before {\n content: attr(data-text);\n display: block;\n font-size: var(--expando-combobox-fontSize);\n height: 0px;\n overflow: hidden;\n white-space: pre-wrap;\n}\n";
4
4
 
5
5
  module.exports = expandoComboboxCss;
6
6
  //# sourceMappingURL=ExpandoCombobox.css.js.map
@@ -36,6 +36,7 @@ const ExpandoCombobox = react.forwardRef(function ExpandoCombobox2({
36
36
  window: targetWindow
37
37
  });
38
38
  const [open, setOpen] = react.useState(false);
39
+ const [selected, setSelected] = react.useState([]);
39
40
  const [value, setValue] = react.useState(
40
41
  valueProp === void 0 ? "" : valueProp.toString()
41
42
  );
@@ -44,6 +45,7 @@ const ExpandoCombobox = react.forwardRef(function ExpandoCombobox2({
44
45
  const value2 = evt.target.value;
45
46
  onChange?.(evt);
46
47
  setValue(value2);
48
+ setSelected([]);
47
49
  },
48
50
  [onChange]
49
51
  );
@@ -52,6 +54,7 @@ const ExpandoCombobox = react.forwardRef(function ExpandoCombobox2({
52
54
  if (multiselect) {
53
55
  onSelectionChange?.(evt, newSelected);
54
56
  } else {
57
+ setSelected(newSelected);
55
58
  const [selectedValue] = newSelected;
56
59
  setTimeout(() => {
57
60
  onSelectionChange?.(evt, newSelected);
@@ -77,10 +80,11 @@ const ExpandoCombobox = react.forwardRef(function ExpandoCombobox2({
77
80
  if (!dropdownOnAutofocus) return;
78
81
  setTimeout(() => {
79
82
  setOpen(true);
83
+ onOpenChange?.(true, "focus");
80
84
  }, 100);
81
85
  }
82
86
  };
83
- }, [inputPropsProp, dropdownOnAutofocus]);
87
+ }, [inputPropsProp, dropdownOnAutofocus, onOpenChange]);
84
88
  return /* @__PURE__ */ jsxRuntime.jsx(
85
89
  "div",
86
90
  {
@@ -97,6 +101,7 @@ const ExpandoCombobox = react.forwardRef(function ExpandoCombobox2({
97
101
  onOpenChange: handleOpenChange,
98
102
  onSelectionChange: handleSelectionChange,
99
103
  open,
104
+ selected,
100
105
  value,
101
106
  children
102
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ExpandoCombobox.js","sources":["../../../../packages/vuu-filters/src/filter-clause/ExpandoCombobox.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport { ComboBox, ComboBoxProps } from \"@salt-ds/core\";\nimport {\n ChangeEvent,\n ForwardedRef,\n ReactElement,\n Ref,\n SyntheticEvent,\n forwardRef,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport expandoComboboxCss from \"./ExpandoCombobox.css\";\n\nconst classBase = \"vuuExpandoCombobox\";\n\nexport interface ExpandoComboboxProps<Item = string>\n extends ComboBoxProps<Item> {\n itemToString?: (item: Item) => string;\n dropdownOnAutofocus?: boolean;\n}\n\nexport type ComboBoxOpenChangeHandler = Exclude<\n ComboBoxProps[\"onOpenChange\"],\n undefined\n>;\n\nconst defaultItemToString = (item: unknown) => {\n if (typeof item === \"string\") {\n return item;\n } else {\n return item?.toString() ?? \"\";\n }\n};\nexport const ExpandoCombobox = forwardRef(function ExpandoCombobox<\n Item = string,\n>(\n {\n children,\n className,\n inputProps: inputPropsProp,\n itemToString = defaultItemToString,\n multiselect,\n onChange,\n onSelectionChange,\n onOpenChange,\n value: valueProp,\n dropdownOnAutofocus = true,\n ...props\n }: ExpandoComboboxProps<Item>,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-expando-combobox\",\n css: expandoComboboxCss,\n window: targetWindow,\n });\n\n const [open, setOpen] = useState(false);\n const [value, setValue] = useState(\n valueProp === undefined ? \"\" : valueProp.toString(),\n );\n\n const handleChange = useCallback(\n (evt: ChangeEvent<HTMLInputElement>) => {\n const value = evt.target.value;\n onChange?.(evt);\n setValue(value);\n },\n [onChange],\n );\n\n const handleSelectionChange = useCallback(\n (evt: SyntheticEvent, newSelected: Item[]) => {\n if (multiselect) {\n onSelectionChange?.(evt, newSelected);\n } else {\n const [selectedValue] = newSelected;\n setTimeout(() => {\n onSelectionChange?.(evt, newSelected);\n setValue(itemToString(selectedValue));\n }, 100);\n }\n },\n [onSelectionChange, itemToString, multiselect],\n );\n\n const handleOpenChange = useCallback<ComboBoxOpenChangeHandler>(\n (open, reason) => {\n onOpenChange?.(open, reason);\n setOpen(open);\n },\n [onOpenChange],\n );\n\n const inputProps = useMemo<ComboBoxProps<Item>[\"inputProps\"]>(() => {\n return {\n autoComplete: \"off\",\n ...inputPropsProp,\n onFocus: (evt) => {\n inputPropsProp?.onFocus?.(evt);\n if (!dropdownOnAutofocus) return;\n\n setTimeout(() => {\n setOpen(true);\n }, 100);\n },\n };\n }, [inputPropsProp, dropdownOnAutofocus]);\n\n return (\n <div\n className={cx(classBase, className)}\n data-text={value}\n ref={forwardedRef}\n >\n <ComboBox<Item>\n {...props}\n inputProps={inputProps}\n multiselect={multiselect}\n onChange={handleChange}\n onOpenChange={handleOpenChange}\n onSelectionChange={handleSelectionChange}\n open={open}\n value={value}\n >\n {children}\n </ComboBox>\n </div>\n );\n}) as <Item = string>(\n props: ExpandoComboboxProps<Item> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement;\n"],"names":["forwardRef","ExpandoCombobox","useWindow","useComponentCssInjection","expandoComboboxCss","useState","useCallback","value","open","useMemo","jsx","ComboBox"],"mappings":"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"}
1
+ {"version":3,"file":"ExpandoCombobox.js","sources":["../../../../packages/vuu-filters/src/filter-clause/ExpandoCombobox.tsx"],"sourcesContent":["import cx from \"clsx\";\nimport { ComboBox, ComboBoxProps } from \"@salt-ds/core\";\nimport {\n ChangeEvent,\n ForwardedRef,\n ReactElement,\n Ref,\n SyntheticEvent,\n forwardRef,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\n\nimport expandoComboboxCss from \"./ExpandoCombobox.css\";\n\nconst classBase = \"vuuExpandoCombobox\";\n\nexport interface ExpandoComboboxProps<Item = string>\n extends Omit<ComboBoxProps<Item>, \"onOpenChange\"> {\n itemToString?: (item: Item) => string;\n dropdownOnAutofocus?: boolean;\n onOpenChange?: (open: boolean, reason?: \"manual\" | \"input\" | \"focus\") => void;\n}\n\nconst defaultItemToString = (item: unknown) => {\n if (typeof item === \"string\") {\n return item;\n } else {\n return item?.toString() ?? \"\";\n }\n};\nexport const ExpandoCombobox = forwardRef(function ExpandoCombobox<\n Item = string,\n>(\n {\n children,\n className,\n inputProps: inputPropsProp,\n itemToString = defaultItemToString,\n multiselect,\n onChange,\n onSelectionChange,\n onOpenChange,\n value: valueProp,\n dropdownOnAutofocus = true,\n ...props\n }: ExpandoComboboxProps<Item>,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-expando-combobox\",\n css: expandoComboboxCss,\n window: targetWindow,\n });\n\n const [open, setOpen] = useState(false);\n const [selected, setSelected] = useState<Item[]>([]);\n const [value, setValue] = useState(\n valueProp === undefined ? \"\" : valueProp.toString(),\n );\n\n const handleChange = useCallback(\n (evt: ChangeEvent<HTMLInputElement>) => {\n const value = evt.target.value;\n onChange?.(evt);\n setValue(value);\n setSelected([]);\n },\n [onChange],\n );\n\n const handleSelectionChange = useCallback(\n (evt: SyntheticEvent, newSelected: Item[]) => {\n if (multiselect) {\n onSelectionChange?.(evt, newSelected);\n } else {\n setSelected(newSelected);\n const [selectedValue] = newSelected;\n setTimeout(() => {\n onSelectionChange?.(evt, newSelected);\n setValue(itemToString(selectedValue));\n }, 100);\n }\n },\n [onSelectionChange, itemToString, multiselect],\n );\n\n const handleOpenChange = useCallback(\n (open: boolean, reason?: \"manual\" | \"input\") => {\n onOpenChange?.(open, reason);\n setOpen(open);\n },\n [onOpenChange],\n );\n\n const inputProps = useMemo<ComboBoxProps<Item>[\"inputProps\"]>(() => {\n return {\n autoComplete: \"off\",\n ...inputPropsProp,\n onFocus: (evt) => {\n inputPropsProp?.onFocus?.(evt);\n if (!dropdownOnAutofocus) return;\n\n setTimeout(() => {\n setOpen(true);\n onOpenChange?.(true, \"focus\");\n }, 100);\n },\n };\n }, [inputPropsProp, dropdownOnAutofocus, onOpenChange]);\n\n return (\n <div\n className={cx(classBase, className)}\n data-text={value}\n ref={forwardedRef}\n >\n <ComboBox<Item>\n {...props}\n inputProps={inputProps}\n multiselect={multiselect}\n onChange={handleChange}\n onOpenChange={handleOpenChange}\n onSelectionChange={handleSelectionChange}\n open={open}\n selected={selected}\n value={value}\n >\n {children}\n </ComboBox>\n </div>\n );\n}) as <Item = string>(\n props: ExpandoComboboxProps<Item> & { ref?: Ref<HTMLDivElement> },\n) => ReactElement;\n"],"names":["forwardRef","ExpandoCombobox","useWindow","useComponentCssInjection","expandoComboboxCss","useState","useCallback","value","open","useMemo","jsx","ComboBox"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var filterClauseCss = ".vuuFilterClause {\n --vuuExpandoInput-top: 0;\n --content-height: calc(var(--salt-size-base) - var(--salt-spacing-150));\n --vuuExpandoInput-height: var(--content-height);\n --vuuExpandoCombobox-height: var(--content-height);\n --saltButton-height: 16px;\n --saltButton-width: 16px;\n --salt-focused-outlineStyle: dotted;\n\n align-items: center;\n background: var(--salt-container-primary-background);\n border-color: var(--vuu-color-gray-45);\n border-radius: var(--saltButton-borderRadius);\n border-width: 1px;\n border-style: solid;\n display: flex;\n flex-direction: row;\n gap: var(--salt-spacing-50);\n height: var(--salt-size-base);\n min-width: calc(var(--salt-size-base) * 4);\n padding: 0 var(--salt-spacing-100);\n width: fit-content;\n\n .vuuFilterClauseField {\n flex: 0 0 auto;\n }\n .vuuFilterClauseField:last-child {\n flex: 1 0 auto;\n }\n\n .vuuFilterClauseField.vuuExpandoInput {\n align-items: flex-end;\n display: inline-flex;\n }\n\n .vuuExpandoCombobox {\n flex-basis: auto;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n &:focus-within {\n border-color: var(--vuu-color-purple-10);\n }\n\n .saltComboBox-focused {\n outline: none;\n }\n\n .saltTokenizedInput {\n height: 16px;\n min-height: 16px;\n }\n\n .saltTokenizedInput .saltInputPill {\n --pill-fontSize: 12px;\n --saltButton-borderStyle: none;\n --pill-background: none;\n height: 16px;\n margin: 0;\n }\n\n .saltTokenizedInput-pillGroup {\n padding: 0;\n height: 16px;\n }\n\n .saltDateInput {\n width: auto;\n }\n}\n\n.salt-density-high .vuuFilterClause {\n padding: 4px 8px;\n gap: 4px;\n --salt-text-lineHeight: 12px;\n --saltInputLegacy-fontSize: 12px;\n --saltInputLegacy-minWidth: 12px;\n}\n\n.salt-density-high .vuuFilterClause .saltInput {\n padding: 0;\n min-height: 16px;\n height: 16px;\n}\n\n.vuuFilterClauseOperator-hidden {\n display: none;\n}\n\n.vuuFilterClause .saltInput-focused,\n.vuuFilterClause .saltTokenizedInput-focused {\n outline: none;\n color: var(--salt-content-primary-foreground);\n}\n\n.vuuFilterClause-DatePicker {\n border: none;\n}\n";
3
+ var filterClauseCss = ".vuuFilterClause {\n --vuuExpandoInput-top: 0;\n --content-height: calc(var(--salt-size-base) - var(--salt-spacing-150));\n --vuuExpandoInput-height: var(--content-height);\n --vuuExpandoCombobox-height: var(--content-height);\n --saltButton-height: 16px;\n --saltButton-width: 16px;\n --salt-focused-outlineStyle: dotted;\n\n align-items: center;\n background: var(--salt-container-primary-background);\n border-color: var(--salt-editable-borderColor);\n border-radius: var(--saltButton-borderRadius);\n border-width: 1px;\n border-style: solid;\n display: flex;\n flex-direction: row;\n gap: var(--salt-spacing-50);\n height: calc(var(--salt-size-base) + var(--salt-size-spacing-100));\n min-width: calc(var(--salt-size-base) * 4);\n padding: 0 var(--salt-spacing-100);\n width: fit-content;\n\n .vuuFilterClauseField {\n flex: 0 0 auto;\n }\n .vuuFilterClauseField:last-child {\n flex: 1 0 auto;\n }\n\n .vuuFilterClauseField.vuuExpandoInput {\n align-items: flex-end;\n display: inline-flex;\n }\n\n .vuuExpandoCombobox {\n flex-basis: auto;\n flex-shrink: 0;\n flex-grow: 0;\n }\n\n &:focus-within {\n border-color: var(--salt-editable-borderColor-active);\n }\n\n .saltComboBox-focused,.saltComboBox-focused:hover {\n outline: none;\n }\n\n .saltTokenizedInput {\n height: 16px;\n min-height: 16px;\n }\n\n .saltTokenizedInput .saltInputPill {\n --pill-fontSize: 12px;\n --saltButton-borderStyle: none;\n --pill-background: none;\n height: 16px;\n margin: 0;\n }\n\n .saltTokenizedInput-pillGroup {\n padding: 0;\n height: 16px;\n }\n\n .saltDateInput {\n width: auto;\n }\n}\n\n.salt-density-high .vuuFilterClause {\n padding: 4px 8px;\n gap: 4px;\n --salt-text-lineHeight: 12px;\n --saltInputLegacy-fontSize: 12px;\n --saltInputLegacy-minWidth: 12px;\n}\n\n.salt-density-high .vuuFilterClause .saltInput {\n padding: 0;\n min-height: 16px;\n height: 16px;\n}\n\n.vuuFilterClauseOperator-hidden {\n display: none;\n}\n\n.vuuFilterClause .saltInput-focused,\n.vuuFilterClause .saltTokenizedInput-focused {\n outline: none;\n color: var(--salt-content-primary-foreground);\n}\n\n.vuuFilterClause-DatePicker {\n border: none;\n}\n";
4
4
 
5
5
  module.exports = filterClauseCss;
6
6
  //# sourceMappingURL=FilterClause.css.js.map
@@ -5,11 +5,11 @@ var styles = require('@salt-ds/styles');
5
5
  var window = require('@salt-ds/window');
6
6
  var cx = require('clsx');
7
7
  var react = require('react');
8
- var ColumnPicker = require('./ColumnPicker.js');
8
+ var ColumnPicker = require('./column-picker/ColumnPicker.js');
9
9
  var useFilterClause = require('./useFilterClause.js');
10
10
  var FilterClauseValueEditor = require('./value-editors/FilterClauseValueEditor.js');
11
11
  var FilterClause$1 = require('./FilterClause.css.js');
12
- var OperatorPicker = require('./OperatorPicker.js');
12
+ var OperatorPicker = require('./operator-picker/OperatorPicker.js');
13
13
 
14
14
  const classBase = "vuuFilterClause";
15
15
  const FilterClause = ({
@@ -57,10 +57,10 @@ const FilterClause = ({
57
57
  inputProps,
58
58
  className: cx(`${classBase}Field`, `${classBase}Column`),
59
59
  columns,
60
+ dropdownOnAutofocus: showDropdownOnAutoFocus,
60
61
  onSelect: onSelectColumn,
61
62
  ref: columnRef,
62
- value: filterClauseModel.column ?? "",
63
- dropdownOnAutofocus: showDropdownOnAutoFocus
63
+ value: filterClauseModel.column ?? ""
64
64
  },
65
65
  "column-field"
66
66
  ),
@@ -72,16 +72,17 @@ const FilterClause = ({
72
72
  className: cx(`${classBase}Field`, `${classBase}Operator`, {
73
73
  [`${classBase}Operator-hidden`]: selectedColumn === null
74
74
  }),
75
+ dropdownOnAutofocus: showDropdownOnAutoFocus,
75
76
  onSelect: onSelectOperator,
76
77
  ref: operatorRef,
77
- value: filterClauseModel.op ?? "",
78
- dropdownOnAutofocus: showDropdownOnAutoFocus
78
+ value: filterClauseModel.op ?? ""
79
79
  },
80
80
  "operator-field"
81
81
  ) : null,
82
82
  filterClauseModel.op ? /* @__PURE__ */ jsxRuntime.jsx(
83
83
  FilterClauseValueEditor.FilterClauseValueEditor,
84
84
  {
85
+ dropdownOnAutofocus: showDropdownOnAutoFocus,
85
86
  inputProps,
86
87
  onChangeValue,
87
88
  onOpenChange,
@@ -90,8 +91,7 @@ const FilterClause = ({
90
91
  ref: valueRef,
91
92
  selectedColumn,
92
93
  table: vuuTable,
93
- value: filterClause?.values ?? filterClause?.value,
94
- dropdownOnAutofocus: showDropdownOnAutoFocus
94
+ value: filterClause?.values ?? filterClause?.value
95
95
  },
96
96
  "value-field"
97
97
  ) : null
@@ -1 +1 @@
1
- {"version":3,"file":"FilterClause.js","sources":["../../../../packages/vuu-filters/src/filter-clause/FilterClause.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n ColumnDescriptorsByName,\n MultiValueFilterClause,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { FilterClauseModel } from \"../FilterModel\";\nimport { ColumnPicker } from \"./ColumnPicker\";\nimport { useFilterClause } from \"./useFilterClause\";\nimport { FilterClauseValueEditor } from \"./value-editors/FilterClauseValueEditor\";\n\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport filterClauseCss from \"./FilterClause.css\";\nimport { OperatorPicker } from \"./OperatorPicker\";\n\nexport type FilterClauseCancelType = \"Backspace\" | \"Escape\";\nexport type FilterClauseCancelHandler = (\n filterClause: FilterClauseModel,\n reason: FilterClauseCancelType,\n) => void;\n\nexport interface FilterClauseProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n columnsByName: ColumnDescriptorsByName;\n filterClauseModel: FilterClauseModel;\n onCancel?: FilterClauseCancelHandler;\n onDropdownOpen?: () => void;\n onFocusSave?: () => void;\n dropdownOnAutofocus?: boolean;\n vuuTable: VuuTable;\n}\n\nconst classBase = \"vuuFilterClause\";\n\nexport const FilterClause = ({\n className,\n columnsByName,\n onCancel,\n onDropdownOpen,\n onFocusSave,\n filterClauseModel,\n vuuTable,\n dropdownOnAutofocus = true,\n ...htmlAttributes\n}: FilterClauseProps) => {\n const {\n inputProps,\n columnRef,\n filterClause,\n onChangeValue,\n onSelectColumn,\n onSelectOperator,\n onDeselectValue,\n onOpenChange,\n operatorRef,\n selectedColumn,\n valueRef,\n showDropdownOnAutoFocus,\n } = useFilterClause({\n filterClauseModel,\n onCancel,\n onFocusSave,\n columnsByName,\n dropdownOnAutofocus,\n });\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-clause\",\n css: filterClauseCss,\n window: targetWindow,\n });\n\n const columns = useMemo(() => Object.values(columnsByName), [columnsByName]);\n\n return (\n <div className={cx(classBase, className)} {...htmlAttributes} tabIndex={0}>\n <ColumnPicker\n inputProps={inputProps}\n className={cx(`${classBase}Field`, `${classBase}Column`)}\n columns={columns}\n key=\"column-field\"\n onSelect={onSelectColumn}\n ref={columnRef}\n value={filterClauseModel.column ?? \"\"}\n dropdownOnAutofocus={showDropdownOnAutoFocus}\n />\n {selectedColumn?.name ? (\n <OperatorPicker\n column={selectedColumn}\n inputProps={inputProps}\n className={cx(`${classBase}Field`, `${classBase}Operator`, {\n [`${classBase}Operator-hidden`]: selectedColumn === null,\n })}\n key=\"operator-field\"\n onSelect={onSelectOperator}\n ref={operatorRef}\n value={filterClauseModel.op ?? \"\"}\n dropdownOnAutofocus={showDropdownOnAutoFocus}\n />\n ) : null}\n {filterClauseModel.op ? (\n <FilterClauseValueEditor\n inputProps={inputProps}\n key=\"value-field\"\n onChangeValue={onChangeValue}\n onOpenChange={onOpenChange}\n onDeselectValue={onDeselectValue}\n operator={filterClauseModel.op}\n ref={valueRef}\n selectedColumn={selectedColumn}\n table={vuuTable}\n value={\n (filterClause as MultiValueFilterClause)?.values ??\n (filterClause as SingleValueFilterClause)?.value\n }\n dropdownOnAutofocus={showDropdownOnAutoFocus}\n />\n ) : null}\n </div>\n );\n};\n"],"names":["useFilterClause","useWindow","useComponentCssInjection","filterClauseCss","useMemo","jsxs","jsx","ColumnPicker","OperatorPicker","FilterClauseValueEditor"],"mappings":"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"}
1
+ {"version":3,"file":"FilterClause.js","sources":["../../../../packages/vuu-filters/src/filter-clause/FilterClause.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n ColumnDescriptorsByName,\n MultiValueFilterClause,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useMemo } from \"react\";\nimport { FilterClauseModel } from \"../FilterModel\";\nimport { ColumnPicker } from \"./column-picker/ColumnPicker\";\nimport { useFilterClause } from \"./useFilterClause\";\nimport { FilterClauseValueEditor } from \"./value-editors/FilterClauseValueEditor\";\n\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport filterClauseCss from \"./FilterClause.css\";\nimport { OperatorPicker } from \"./operator-picker/OperatorPicker\";\n\nexport type FilterClauseCancelType = \"Backspace\" | \"Escape\";\nexport type FilterClauseCancelHandler = (\n filterClause: FilterClauseModel,\n reason: FilterClauseCancelType,\n) => void;\n\nexport interface FilterClauseProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n columnsByName: ColumnDescriptorsByName;\n filterClauseModel: FilterClauseModel;\n onCancel?: FilterClauseCancelHandler;\n onDropdownOpen?: () => void;\n onFocusSave?: () => void;\n dropdownOnAutofocus?: boolean;\n vuuTable: VuuTable;\n}\n\nconst classBase = \"vuuFilterClause\";\n\nexport const FilterClause = ({\n className,\n columnsByName,\n onCancel,\n onDropdownOpen,\n onFocusSave,\n filterClauseModel,\n vuuTable,\n dropdownOnAutofocus = true,\n ...htmlAttributes\n}: FilterClauseProps) => {\n const {\n inputProps,\n columnRef,\n filterClause,\n onChangeValue,\n onSelectColumn,\n onSelectOperator,\n onDeselectValue,\n onOpenChange,\n operatorRef,\n selectedColumn,\n valueRef,\n showDropdownOnAutoFocus,\n } = useFilterClause({\n filterClauseModel,\n onCancel,\n onFocusSave,\n columnsByName,\n dropdownOnAutofocus,\n });\n\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-filter-clause\",\n css: filterClauseCss,\n window: targetWindow,\n });\n\n const columns = useMemo(() => Object.values(columnsByName), [columnsByName]);\n\n return (\n <div className={cx(classBase, className)} {...htmlAttributes} tabIndex={0}>\n <ColumnPicker\n inputProps={inputProps}\n className={cx(`${classBase}Field`, `${classBase}Column`)}\n columns={columns}\n dropdownOnAutofocus={showDropdownOnAutoFocus}\n key=\"column-field\"\n onSelect={onSelectColumn}\n ref={columnRef}\n value={filterClauseModel.column ?? \"\"}\n />\n {selectedColumn?.name ? (\n <OperatorPicker\n column={selectedColumn}\n inputProps={inputProps}\n className={cx(`${classBase}Field`, `${classBase}Operator`, {\n [`${classBase}Operator-hidden`]: selectedColumn === null,\n })}\n dropdownOnAutofocus={showDropdownOnAutoFocus}\n key=\"operator-field\"\n onSelect={onSelectOperator}\n ref={operatorRef}\n value={filterClauseModel.op ?? \"\"}\n />\n ) : null}\n {filterClauseModel.op ? (\n <FilterClauseValueEditor\n dropdownOnAutofocus={showDropdownOnAutoFocus}\n inputProps={inputProps}\n key=\"value-field\"\n onChangeValue={onChangeValue}\n onOpenChange={onOpenChange}\n onDeselectValue={onDeselectValue}\n operator={filterClauseModel.op}\n ref={valueRef}\n selectedColumn={selectedColumn}\n table={vuuTable}\n value={\n (filterClause as MultiValueFilterClause)?.values ??\n (filterClause as SingleValueFilterClause)?.value\n }\n />\n ) : null}\n </div>\n );\n};\n"],"names":["useFilterClause","useWindow","useComponentCssInjection","filterClauseCss","useMemo","jsxs","jsx","ColumnPicker","OperatorPicker","FilterClauseValueEditor"],"mappings":"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"}
@@ -1,20 +1,20 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var ExpandoCombobox = require('./ExpandoCombobox.js');
4
+ var ExpandoCombobox = require('../ExpandoCombobox.js');
5
5
  var core = require('@salt-ds/core');
6
6
  var react = require('react');
7
- var useExpandoCombobox = require('./useExpandoCombobox.js');
7
+ var useColumnPicker = require('./useColumnPicker.js');
8
8
 
9
9
  const ColumnPicker = react.forwardRef(function ColumnPicker2({
10
10
  className,
11
11
  columns,
12
+ dropdownOnAutofocus = true,
12
13
  inputProps,
13
14
  onSelect,
14
- value: valueProp,
15
- dropdownOnAutofocus = true
15
+ value: valueProp
16
16
  }, forwardedRef) {
17
- const comboProps = useExpandoCombobox.useExpandoComboBox({
17
+ const { ref, ...comboProps } = useColumnPicker.useColumnPicker({
18
18
  onSelect,
19
19
  value: valueProp?.toString() ?? ""
20
20
  });
@@ -22,12 +22,12 @@ const ColumnPicker = react.forwardRef(function ColumnPicker2({
22
22
  ExpandoCombobox.ExpandoCombobox,
23
23
  {
24
24
  ...comboProps,
25
- inputProps,
26
25
  className,
27
26
  "data-field": "column",
28
- ref: forwardedRef,
29
- title: "column",
30
27
  dropdownOnAutofocus,
28
+ inputProps,
29
+ ref: core.useForkRef(forwardedRef, ref),
30
+ title: "column",
31
31
  children: columns.filter(
32
32
  ({ name }) => name.toLowerCase().includes(comboProps.value.toLowerCase())
33
33
  ).map(({ name, label = name }) => /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value: name, children: label }, name))
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnPicker.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/column-picker/ColumnPicker.tsx"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ExpandoCombobox } from \"../ExpandoCombobox\";\nimport { ComboBoxProps, Option, useForkRef } from \"@salt-ds/core\";\nimport { ForwardedRef, SyntheticEvent, forwardRef } from \"react\";\nimport { useColumnPicker } from \"./useColumnPicker\";\n\nexport type ColumnPickerProps = Pick<\n ComboBoxProps,\n \"className\" | \"inputProps\" | \"value\"\n> & {\n columns: ColumnDescriptor[];\n onSelect: (evt: SyntheticEvent, columnName: string) => void;\n dropdownOnAutofocus?: boolean;\n};\n\nexport const ColumnPicker = forwardRef(function ColumnPicker(\n {\n className,\n columns,\n dropdownOnAutofocus = true,\n inputProps,\n onSelect,\n value: valueProp,\n }: ColumnPickerProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const { ref, ...comboProps } = useColumnPicker({\n onSelect,\n value: valueProp?.toString() ?? \"\",\n });\n\n return (\n <ExpandoCombobox\n {...comboProps}\n className={className}\n data-field=\"column\"\n dropdownOnAutofocus={dropdownOnAutofocus}\n inputProps={inputProps}\n ref={useForkRef(forwardedRef, ref)}\n title=\"column\"\n >\n {columns\n .filter(({ name }) =>\n name.toLowerCase().includes(comboProps.value.toLowerCase()),\n )\n .map(({ name, label = name }) => (\n <Option value={name} key={name}>\n {label}\n </Option>\n ))}\n </ExpandoCombobox>\n );\n});\n"],"names":["forwardRef","ColumnPicker","useColumnPicker","jsx","ExpandoCombobox","useForkRef","Option"],"mappings":";;;;;;;;AAea,MAAA,YAAA,GAAeA,gBAAW,CAAA,SAASC,aAC9C,CAAA;AAAA,EACE,SAAA;AAAA,EACA,OAAA;AAAA,EACA,mBAAsB,GAAA,IAAA;AAAA,EACtB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAO,EAAA;AACT,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,UAAA,KAAeC,+BAAgB,CAAA;AAAA,IAC7C,QAAA;AAAA,IACA,KAAA,EAAO,SAAW,EAAA,QAAA,EAAc,IAAA;AAAA,GACjC,CAAA;AAED,EACE,uBAAAC,cAAA;AAAA,IAACC,+BAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAW,EAAA,QAAA;AAAA,MACX,mBAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA,EAAKC,eAAW,CAAA,YAAA,EAAc,GAAG,CAAA;AAAA,MACjC,KAAM,EAAA,QAAA;AAAA,MAEL,QACE,EAAA,OAAA,CAAA,MAAA;AAAA,QAAO,CAAC,EAAE,IAAA,EACT,KAAA,IAAA,CAAK,WAAY,EAAA,CAAE,QAAS,CAAA,UAAA,CAAW,KAAM,CAAA,WAAA,EAAa;AAAA,OAE3D,CAAA,GAAA,CAAI,CAAC,EAAE,MAAM,KAAQ,GAAA,IAAA,EACpB,qBAAAF,cAAA,CAACG,WAAO,EAAA,EAAA,KAAA,EAAO,IACZ,EAAA,QAAA,EAAA,KAAA,EAAA,EADuB,IAE1B,CACD;AAAA;AAAA,GACL;AAEJ,CAAC;;;;"}
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+
6
+ const useColumnPicker = ({
7
+ onSelect,
8
+ value: valueProp
9
+ }) => {
10
+ const ref = react.useRef(null);
11
+ const openRef = react.useRef(false);
12
+ const [value, setValue] = react.useState(valueProp);
13
+ const highlightFirstOption = react.useCallback(() => {
14
+ if (ref.current) {
15
+ const input = ref.current?.querySelector(
16
+ 'input[role="combobox"]'
17
+ );
18
+ if (input) {
19
+ requestAnimationFrame(() => {
20
+ vuuUtils.dispatchKeyboardEvent(input, "keydown", "ArrowDown");
21
+ });
22
+ }
23
+ }
24
+ }, []);
25
+ const handleChange = react.useCallback(
26
+ (event) => {
27
+ const value2 = event.target.value;
28
+ setValue(value2);
29
+ if (openRef.current && value2 === "") {
30
+ highlightFirstOption();
31
+ }
32
+ },
33
+ [highlightFirstOption]
34
+ );
35
+ const handleSelectionChange = react.useCallback(
36
+ (evt, [newSelected]) => {
37
+ onSelect?.(evt, newSelected);
38
+ setValue(newSelected ?? "");
39
+ },
40
+ [onSelect]
41
+ );
42
+ const handleOpenChange = react.useCallback(
43
+ (isOpen, reason) => {
44
+ openRef.current = isOpen;
45
+ if (isOpen && reason === "focus") {
46
+ highlightFirstOption();
47
+ }
48
+ },
49
+ [highlightFirstOption]
50
+ );
51
+ return {
52
+ onChange: handleChange,
53
+ onOpenChange: handleOpenChange,
54
+ onSelectionChange: handleSelectionChange,
55
+ ref,
56
+ value: value.toString().trim()
57
+ };
58
+ };
59
+
60
+ exports.useColumnPicker = useColumnPicker;
61
+ //# sourceMappingURL=useColumnPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useColumnPicker.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/column-picker/useColumnPicker.ts"],"sourcesContent":["import {\n ChangeEvent,\n SyntheticEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { dispatchKeyboardEvent } from \"@vuu-ui/vuu-utils\";\n\nexport const useColumnPicker = ({\n onSelect,\n value: valueProp,\n}: {\n onSelect: (evt: SyntheticEvent, columnName: string) => void;\n value: string;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const openRef = useRef(false);\n const [value, setValue] = useState(valueProp);\n\n const highlightFirstOption = useCallback(() => {\n if (ref.current) {\n const input = ref.current?.querySelector<HTMLInputElement>(\n 'input[role=\"combobox\"]',\n );\n if (input) {\n requestAnimationFrame(() => {\n dispatchKeyboardEvent(input, \"keydown\", \"ArrowDown\");\n });\n }\n }\n }, []);\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setValue(value);\n if (openRef.current && value === \"\") {\n highlightFirstOption();\n }\n },\n [highlightFirstOption],\n );\n\n const handleSelectionChange = useCallback(\n (evt: SyntheticEvent, [newSelected]: string[]) => {\n onSelect?.(evt, newSelected);\n setValue(newSelected ?? \"\");\n },\n [onSelect],\n );\n\n const handleOpenChange = useCallback(\n (isOpen: boolean, reason?: \"manual\" | \"input\" | \"focus\") => {\n openRef.current = isOpen;\n if (isOpen && reason === \"focus\") {\n highlightFirstOption();\n }\n },\n [highlightFirstOption],\n );\n\n return {\n onChange: handleChange,\n onOpenChange: handleOpenChange,\n onSelectionChange: handleSelectionChange,\n ref,\n value: value.toString().trim(),\n };\n};\n"],"names":["useRef","useState","useCallback","dispatchKeyboardEvent","value"],"mappings":";;;;;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AAAA,EACA,KAAO,EAAA;AACT,CAGM,KAAA;AACJ,EAAM,MAAA,GAAA,GAAMA,aAAuB,IAAI,CAAA;AACvC,EAAM,MAAA,OAAA,GAAUA,aAAO,KAAK,CAAA;AAC5B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAS,SAAS,CAAA;AAE5C,EAAM,MAAA,oBAAA,GAAuBC,kBAAY,MAAM;AAC7C,IAAA,IAAI,IAAI,OAAS,EAAA;AACf,MAAM,MAAA,KAAA,GAAQ,IAAI,OAAS,EAAA,aAAA;AAAA,QACzB;AAAA,OACF;AACA,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAsBC,8BAAA,CAAA,KAAA,EAAO,WAAW,WAAW,CAAA;AAAA,SACpD,CAAA;AAAA;AACH;AACF,GACF,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAe,GAAAD,iBAAA;AAAA,IACnB,CAAC,KAAyC,KAAA;AACxC,MAAME,MAAAA,MAAAA,GAAQ,MAAM,MAAO,CAAA,KAAA;AAC3B,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAI,IAAA,OAAA,CAAQ,OAAWA,IAAAA,MAAAA,KAAU,EAAI,EAAA;AACnC,QAAqB,oBAAA,EAAA;AAAA;AACvB,KACF;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,qBAAwB,GAAAF,iBAAA;AAAA,IAC5B,CAAC,GAAA,EAAqB,CAAC,WAAW,CAAgB,KAAA;AAChD,MAAA,QAAA,GAAW,KAAK,WAAW,CAAA;AAC3B,MAAA,QAAA,CAAS,eAAe,EAAE,CAAA;AAAA,KAC5B;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAAmB,GAAAA,iBAAA;AAAA,IACvB,CAAC,QAAiB,MAA0C,KAAA;AAC1D,MAAA,OAAA,CAAQ,OAAU,GAAA,MAAA;AAClB,MAAI,IAAA,MAAA,IAAU,WAAW,OAAS,EAAA;AAChC,QAAqB,oBAAA,EAAA;AAAA;AACvB,KACF;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAO,OAAA;AAAA,IACL,QAAU,EAAA,YAAA;AAAA,IACV,YAAc,EAAA,gBAAA;AAAA,IACd,iBAAmB,EAAA,qBAAA;AAAA,IACnB,GAAA;AAAA,IACA,KAAO,EAAA,KAAA,CAAM,QAAS,EAAA,CAAE,IAAK;AAAA,GAC/B;AACF;;;;"}
@@ -56,7 +56,6 @@ const focusFilterClauseField = (filterEditor, filterClauseIndex, fieldName = "va
56
56
  }
57
57
  };
58
58
  const focusLastClauseValue = (filterEditor) => {
59
- console.log("focusLastClauseValue");
60
59
  const field = Array.from(
61
60
  filterEditor?.querySelectorAll(".vuuFilterClauseField")
62
61
  ).at(-1);
@@ -1 +1 @@
1
- {"version":3,"file":"filterClauseFocusManagement.js","sources":["../../../../packages/vuu-filters/src/filter-clause/filterClauseFocusManagement.ts"],"sourcesContent":["import { getElementDataIndex, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { KeyboardEvent } from \"react\";\n\nconst getFilterClauseElement = (possiblyDescendant?: HTMLElement) =>\n possiblyDescendant?.closest(\".vuuFilterClause\") as HTMLElement;\n\nconst getFilterClauseFieldElement = (possiblyDescendant?: HTMLElement) =>\n possiblyDescendant?.closest(\".vuuFilterClauseField\") as HTMLElement;\n\ntype FilterClauseFieldName = \"column\" | \"operator\" | \"value\";\nconst mapFilterFieldToClassName: Record<FilterClauseFieldName, string> = {\n column: \"vuuFilterClauseColumn\",\n operator: \"vuuFilterClauseOperator\",\n value: \"vuuFilterClauseValue\",\n};\n\nconst getFilterClauseDetails = ({ classList }: HTMLElement) => {\n if (classList.contains(\"vuuFilterClauseColumn\")) {\n return \"column\";\n } else if (classList.contains(\"vuuFilterClauseOperator\")) {\n return \"operator\";\n } else if (classList.contains(\"vuuFilterClauseValue\")) {\n return \"value\";\n } else {\n throw Error(\n \"getFilterClauseField, filterClauseElemnent is missing required class name\",\n );\n }\n};\n\nexport const getFocusedFieldDetails = (): [number, string] | [] => {\n const el = document.activeElement as HTMLElement;\n const field = queryClosest(el, \".vuuFilterClauseField,.saltCalendar\");\n if (field?.matches(\".vuuFilterClauseField\")) {\n const filterClause = queryClosest(field, \".vuuFilterClause\");\n if (filterClause && field) {\n return [getElementDataIndex(filterClause), getFilterClauseDetails(field)];\n }\n } else if (field?.matches(\".saltCalendar\")) {\n console.log(\"its in a calendar\");\n }\n // const filterClause = queryClosest(field, \".vuuFilterClause\");\n // if (filterClause && field) {\n // return [getElementDataIndex(filterClause), getFilterClauseDetails(field)];\n // } else {\n return [];\n // }\n};\n\n// Focus the input control within field. If clause passed, will\n// focus first field within clause\nconst focusField = (fieldOrClause: HTMLElement | null) => {\n const input = fieldOrClause?.querySelector(\"input\");\n if (input) {\n input.focus();\n requestAnimationFrame(() => {\n input?.select();\n });\n }\n};\n\nexport const elementIsFilterCombinator = (\n element: Element | null,\n): element is HTMLElement =>\n element !== null && element.classList.contains(\"vuuFilterClauseCombinator\");\n\nexport const elementIsFilterClause = (\n element: Element | null,\n): element is HTMLElement =>\n element !== null && element.classList.contains(\"vuuFilterClause\");\n\nexport const focusFilterClauseField = (\n filterEditor: HTMLElement,\n filterClauseIndex: number,\n fieldName: FilterClauseFieldName = \"value\",\n) => {\n if (filterEditor) {\n const fieldClassName = mapFilterFieldToClassName[fieldName];\n const field = filterEditor.querySelector(\n `.vuuFilterClause[data-index=\"${filterClauseIndex}\"] .${fieldClassName}`,\n ) as HTMLElement;\n focusField(field);\n }\n};\n\nexport const focusLastClauseValue = (filterEditor: HTMLElement) => {\n console.log(\"focusLastClauseValue\");\n const field = Array.from(\n filterEditor?.querySelectorAll(\".vuuFilterClauseField\"),\n ).at(-1) as HTMLElement;\n focusField(field);\n};\n\nexport const focusNextFocusableElement = (direction: \"fwd\" | \"bwd\" = \"fwd\") => {\n const activeField = getFocusedField() as HTMLElement;\n const filterClause = getFilterClauseElement(activeField);\n if (direction === \"fwd\" && filterClause?.lastChild === activeField) {\n requestAnimationFrame(() => {\n focusNextFocusableElement();\n });\n } else {\n const nextField =\n direction === \"fwd\"\n ? (activeField?.nextElementSibling as HTMLElement)\n : (activeField?.previousElementSibling as HTMLElement);\n\n nextField?.querySelector(\"input\")?.focus();\n }\n};\n\nconst getFocusedField = () => {\n const activeElement = document.activeElement as HTMLElement;\n if (activeElement?.classList.contains(\"vuuFilterClause-clearButton\")) {\n return activeElement as HTMLElement;\n } else {\n return getFilterClauseFieldElement(activeElement);\n }\n};\n\nexport const focusNextElement = () => {\n const filterClauseField = getFocusedField();\n const filterClause = getFilterClauseElement(filterClauseField);\n if (filterClause && filterClauseField) {\n if (filterClauseField.classList.contains(\"vuuFilterClauseValue\")) {\n const clearButton = filterClause.querySelector(\n \".vuuFilterClause-clearButton\",\n ) as HTMLButtonElement;\n clearButton?.focus();\n } else {\n focusNextFocusableElement();\n }\n }\n};\n\nconst cursorAtTextStart = (input: HTMLInputElement) =>\n input.selectionStart === 0;\n\nconst cursorAtTextEnd = (input: HTMLInputElement) =>\n input.selectionStart === input.value.length;\n\nconst getFieldName = (field: HTMLElement) =>\n field?.classList.contains(\"vuuFilterClauseColumn\")\n ? \"column\"\n : field?.classList.contains(\"vuuFilterClauseOperator\")\n ? \"operator\"\n : \"value\";\n\nexport const clauseIsNotFirst = (el: HTMLElement) => {\n const clause = getFilterClauseElement(el);\n if (clause) {\n const index = getElementDataIndex(clause);\n return index > 0;\n }\n};\n\nconst clauseIsNotLast = (el: HTMLElement) => {\n const clause = getFilterClauseElement(el);\n const nextClause = clause?.nextElementSibling as HTMLElement;\n return nextClause?.classList.contains(\"vuuFilterClauseCombinator\");\n};\n\nexport const tabToPreviousFilterCombinator = (currentElement: HTMLElement) => {\n const filterClause = getFilterClauseElement(currentElement);\n const nextItem = filterClause.previousSibling as HTMLElement;\n console.log(`tab to previous combinator`);\n nextItem?.focus();\n};\n\nexport const navigateToNextFilterClause = (\n currentElement: HTMLElement,\n direction: \"bwd\" | \"fwd\" = \"fwd\",\n) => {\n if (direction === \"bwd\") {\n if (elementIsFilterCombinator(currentElement)) {\n const nextClause = currentElement.previousElementSibling;\n if (elementIsFilterClause(nextClause)) {\n const nextField = nextClause.querySelector(\n \".vuuFilterClauseValue\",\n ) as HTMLElement;\n console.log(`focus field Value ${nextField?.classList}`);\n focusField(nextField);\n }\n } else {\n const filterClause = getFilterClauseElement(currentElement);\n const nextClause = filterClause.previousSibling as HTMLElement;\n const nextField = nextClause.querySelector(\n \".vuuFilterClauseValue\",\n ) as HTMLElement;\n focusField(nextField);\n }\n } else {\n const nextClause = currentElement.nextSibling as HTMLElement;\n focusField(nextClause);\n }\n};\n\n// The logic around preventDefault/stopPropagation is important\n// in this function\nexport const navigateToNextItemIfAtBoundary = (\n evt: KeyboardEvent<HTMLInputElement>,\n) => {\n const input = evt.target as HTMLInputElement;\n const field = getFilterClauseFieldElement(input);\n if (evt.key === \"ArrowLeft\") {\n if (cursorAtTextStart(input)) {\n const fieldName = getFieldName(field);\n if (fieldName === \"column\") {\n if (clauseIsNotFirst(input)) {\n const filterClause = getFilterClauseElement(field);\n const combinator = filterClause.previousElementSibling as HTMLElement;\n combinator?.focus();\n }\n } else {\n evt.preventDefault();\n focusField(field.previousSibling as HTMLElement);\n }\n }\n // stopPropagation, even if cursor is not at start. We want the arrowLeft to move the cursor\n evt.stopPropagation();\n } else if (evt.key === \"ArrowRight\") {\n if (cursorAtTextEnd(input as HTMLInputElement)) {\n const fieldName = getFieldName(field);\n if (fieldName === \"value\") {\n if (clauseIsNotLast(input)) {\n const filterClause = getFilterClauseElement(field);\n const combinator = filterClause.nextElementSibling as HTMLElement;\n combinator?.focus();\n }\n // Do not preventDefault, stopPropagation\n return;\n } else {\n evt.preventDefault();\n focusField(field.nextSibling as HTMLElement);\n }\n }\n // stopPropagation, even if cursor is not at end. We want the arrowRight to move the cursor\n evt.stopPropagation();\n }\n};\n\nexport const focusFirstClauseIfAllClausesValid = (\n filterEditor: HTMLElement,\n) => {\n const columInput = Array.from(\n filterEditor.querySelectorAll(\".vuuFilterClauseColumn input\"),\n ) as HTMLInputElement[];\n if (columInput.every((input) => input.value.length > 0)) {\n setTimeout(() => {\n const input = columInput.at(0);\n input?.select();\n input?.focus();\n }, 100);\n }\n};\n"],"names":["queryClosest","getElementDataIndex"],"mappings":"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"}
1
+ {"version":3,"file":"filterClauseFocusManagement.js","sources":["../../../../packages/vuu-filters/src/filter-clause/filterClauseFocusManagement.ts"],"sourcesContent":["import { getElementDataIndex, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { KeyboardEvent } from \"react\";\n\nconst getFilterClauseElement = (possiblyDescendant?: HTMLElement) =>\n possiblyDescendant?.closest(\".vuuFilterClause\") as HTMLElement;\n\nconst getFilterClauseFieldElement = (possiblyDescendant?: HTMLElement) =>\n possiblyDescendant?.closest(\".vuuFilterClauseField\") as HTMLElement;\n\ntype FilterClauseFieldName = \"column\" | \"operator\" | \"value\";\nconst mapFilterFieldToClassName: Record<FilterClauseFieldName, string> = {\n column: \"vuuFilterClauseColumn\",\n operator: \"vuuFilterClauseOperator\",\n value: \"vuuFilterClauseValue\",\n};\n\nconst getFilterClauseDetails = ({ classList }: HTMLElement) => {\n if (classList.contains(\"vuuFilterClauseColumn\")) {\n return \"column\";\n } else if (classList.contains(\"vuuFilterClauseOperator\")) {\n return \"operator\";\n } else if (classList.contains(\"vuuFilterClauseValue\")) {\n return \"value\";\n } else {\n throw Error(\n \"getFilterClauseField, filterClauseElemnent is missing required class name\",\n );\n }\n};\n\nexport const getFocusedFieldDetails = (): [number, string] | [] => {\n const el = document.activeElement as HTMLElement;\n const field = queryClosest(el, \".vuuFilterClauseField,.saltCalendar\");\n if (field?.matches(\".vuuFilterClauseField\")) {\n const filterClause = queryClosest(field, \".vuuFilterClause\");\n if (filterClause && field) {\n return [getElementDataIndex(filterClause), getFilterClauseDetails(field)];\n }\n } else if (field?.matches(\".saltCalendar\")) {\n console.log(\"its in a calendar\");\n }\n // const filterClause = queryClosest(field, \".vuuFilterClause\");\n // if (filterClause && field) {\n // return [getElementDataIndex(filterClause), getFilterClauseDetails(field)];\n // } else {\n return [];\n // }\n};\n\n// Focus the input control within field. If clause passed, will\n// focus first field within clause\nconst focusField = (fieldOrClause: HTMLElement | null) => {\n const input = fieldOrClause?.querySelector(\"input\");\n if (input) {\n input.focus();\n requestAnimationFrame(() => {\n input?.select();\n });\n }\n};\n\nexport const elementIsFilterCombinator = (\n element: Element | null,\n): element is HTMLElement =>\n element !== null && element.classList.contains(\"vuuFilterClauseCombinator\");\n\nexport const elementIsFilterClause = (\n element: Element | null,\n): element is HTMLElement =>\n element !== null && element.classList.contains(\"vuuFilterClause\");\n\nexport const focusFilterClauseField = (\n filterEditor: HTMLElement,\n filterClauseIndex: number,\n fieldName: FilterClauseFieldName = \"value\",\n) => {\n if (filterEditor) {\n const fieldClassName = mapFilterFieldToClassName[fieldName];\n const field = filterEditor.querySelector(\n `.vuuFilterClause[data-index=\"${filterClauseIndex}\"] .${fieldClassName}`,\n ) as HTMLElement;\n focusField(field);\n }\n};\n\nexport const focusLastClauseValue = (filterEditor: HTMLElement) => {\n const field = Array.from(\n filterEditor?.querySelectorAll(\".vuuFilterClauseField\"),\n ).at(-1) as HTMLElement;\n focusField(field);\n};\n\nexport const focusNextFocusableElement = (direction: \"fwd\" | \"bwd\" = \"fwd\") => {\n const activeField = getFocusedField() as HTMLElement;\n const filterClause = getFilterClauseElement(activeField);\n if (direction === \"fwd\" && filterClause?.lastChild === activeField) {\n requestAnimationFrame(() => {\n focusNextFocusableElement();\n });\n } else {\n const nextField =\n direction === \"fwd\"\n ? (activeField?.nextElementSibling as HTMLElement)\n : (activeField?.previousElementSibling as HTMLElement);\n\n nextField?.querySelector(\"input\")?.focus();\n }\n};\n\nconst getFocusedField = () => {\n const activeElement = document.activeElement as HTMLElement;\n if (activeElement?.classList.contains(\"vuuFilterClause-clearButton\")) {\n return activeElement as HTMLElement;\n } else {\n return getFilterClauseFieldElement(activeElement);\n }\n};\n\nexport const focusNextElement = () => {\n const filterClauseField = getFocusedField();\n const filterClause = getFilterClauseElement(filterClauseField);\n if (filterClause && filterClauseField) {\n if (filterClauseField.classList.contains(\"vuuFilterClauseValue\")) {\n const clearButton = filterClause.querySelector(\n \".vuuFilterClause-clearButton\",\n ) as HTMLButtonElement;\n clearButton?.focus();\n } else {\n focusNextFocusableElement();\n }\n }\n};\n\nconst cursorAtTextStart = (input: HTMLInputElement) =>\n input.selectionStart === 0;\n\nconst cursorAtTextEnd = (input: HTMLInputElement) =>\n input.selectionStart === input.value.length;\n\nconst getFieldName = (field: HTMLElement) =>\n field?.classList.contains(\"vuuFilterClauseColumn\")\n ? \"column\"\n : field?.classList.contains(\"vuuFilterClauseOperator\")\n ? \"operator\"\n : \"value\";\n\nexport const clauseIsNotFirst = (el: HTMLElement) => {\n const clause = getFilterClauseElement(el);\n if (clause) {\n const index = getElementDataIndex(clause);\n return index > 0;\n }\n};\n\nconst clauseIsNotLast = (el: HTMLElement) => {\n const clause = getFilterClauseElement(el);\n const nextClause = clause?.nextElementSibling as HTMLElement;\n return nextClause?.classList.contains(\"vuuFilterClauseCombinator\");\n};\n\nexport const tabToPreviousFilterCombinator = (currentElement: HTMLElement) => {\n const filterClause = getFilterClauseElement(currentElement);\n const nextItem = filterClause.previousSibling as HTMLElement;\n console.log(`tab to previous combinator`);\n nextItem?.focus();\n};\n\nexport const navigateToNextFilterClause = (\n currentElement: HTMLElement,\n direction: \"bwd\" | \"fwd\" = \"fwd\",\n) => {\n if (direction === \"bwd\") {\n if (elementIsFilterCombinator(currentElement)) {\n const nextClause = currentElement.previousElementSibling;\n if (elementIsFilterClause(nextClause)) {\n const nextField = nextClause.querySelector(\n \".vuuFilterClauseValue\",\n ) as HTMLElement;\n console.log(`focus field Value ${nextField?.classList}`);\n focusField(nextField);\n }\n } else {\n const filterClause = getFilterClauseElement(currentElement);\n const nextClause = filterClause.previousSibling as HTMLElement;\n const nextField = nextClause.querySelector(\n \".vuuFilterClauseValue\",\n ) as HTMLElement;\n focusField(nextField);\n }\n } else {\n const nextClause = currentElement.nextSibling as HTMLElement;\n focusField(nextClause);\n }\n};\n\n// The logic around preventDefault/stopPropagation is important\n// in this function\nexport const navigateToNextItemIfAtBoundary = (\n evt: KeyboardEvent<HTMLInputElement>,\n) => {\n const input = evt.target as HTMLInputElement;\n const field = getFilterClauseFieldElement(input);\n if (evt.key === \"ArrowLeft\") {\n if (cursorAtTextStart(input)) {\n const fieldName = getFieldName(field);\n if (fieldName === \"column\") {\n if (clauseIsNotFirst(input)) {\n const filterClause = getFilterClauseElement(field);\n const combinator = filterClause.previousElementSibling as HTMLElement;\n combinator?.focus();\n }\n } else {\n evt.preventDefault();\n focusField(field.previousSibling as HTMLElement);\n }\n }\n // stopPropagation, even if cursor is not at start. We want the arrowLeft to move the cursor\n evt.stopPropagation();\n } else if (evt.key === \"ArrowRight\") {\n if (cursorAtTextEnd(input as HTMLInputElement)) {\n const fieldName = getFieldName(field);\n if (fieldName === \"value\") {\n if (clauseIsNotLast(input)) {\n const filterClause = getFilterClauseElement(field);\n const combinator = filterClause.nextElementSibling as HTMLElement;\n combinator?.focus();\n }\n // Do not preventDefault, stopPropagation\n return;\n } else {\n evt.preventDefault();\n focusField(field.nextSibling as HTMLElement);\n }\n }\n // stopPropagation, even if cursor is not at end. We want the arrowRight to move the cursor\n evt.stopPropagation();\n }\n};\n\nexport const focusFirstClauseIfAllClausesValid = (\n filterEditor: HTMLElement,\n) => {\n const columInput = Array.from(\n filterEditor.querySelectorAll(\".vuuFilterClauseColumn input\"),\n ) as HTMLInputElement[];\n if (columInput.every((input) => input.value.length > 0)) {\n setTimeout(() => {\n const input = columInput.at(0);\n input?.select();\n input?.focus();\n }, 100);\n }\n};\n"],"names":["queryClosest","getElementDataIndex"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@salt-ds/core');
5
+ var react = require('react');
6
+ var ExpandoCombobox = require('../ExpandoCombobox.js');
7
+ var operatorUtils = require('./operator-utils.js');
8
+ var useOperatorPicker = require('./useOperatorPicker.js');
9
+
10
+ const OperatorPicker = react.forwardRef(function OperatorPicker2({
11
+ className,
12
+ column,
13
+ dropdownOnAutofocus = true,
14
+ inputProps,
15
+ onSelect,
16
+ value: valueProp
17
+ }, forwardedRef) {
18
+ const { ref, ...comboProps } = useOperatorPicker.useOperatorPicker({
19
+ onSelect,
20
+ value: valueProp?.toString() ?? ""
21
+ });
22
+ return /* @__PURE__ */ jsxRuntime.jsx(
23
+ ExpandoCombobox.ExpandoCombobox,
24
+ {
25
+ ...comboProps,
26
+ className,
27
+ "data-field": "operator",
28
+ dropdownOnAutofocus,
29
+ inputProps,
30
+ ref: core.useForkRef(forwardedRef, ref),
31
+ title: "operator",
32
+ children: operatorUtils.getOperators(column).filter(
33
+ (op) => op.toLowerCase().includes(comboProps.value.toLowerCase())
34
+ ).map((op) => /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value: op }, op))
35
+ }
36
+ );
37
+ });
38
+
39
+ exports.OperatorPicker = OperatorPicker;
40
+ //# sourceMappingURL=OperatorPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperatorPicker.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/operator-picker/OperatorPicker.tsx"],"sourcesContent":["import type { FilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\nimport type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { ComboBoxProps, Option, useForkRef } from \"@salt-ds/core\";\nimport { ForwardedRef, SyntheticEvent, forwardRef } from \"react\";\nimport { ExpandoCombobox } from \"../ExpandoCombobox\";\nimport { getOperators } from \"./operator-utils\";\nimport { useOperatorPicker } from \"./useOperatorPicker\";\n\nexport type OperatorPickerProps = Pick<\n ComboBoxProps,\n \"className\" | \"inputProps\" | \"value\"\n> & {\n column: ColumnDescriptor;\n onSelect: (evt: SyntheticEvent, operator: FilterClauseOp) => void;\n dropdownOnAutofocus?: boolean;\n};\n\nexport const OperatorPicker = forwardRef(function OperatorPicker(\n {\n className,\n column,\n dropdownOnAutofocus = true,\n inputProps,\n onSelect,\n value: valueProp,\n }: OperatorPickerProps,\n forwardedRef: ForwardedRef<HTMLDivElement>,\n) {\n const { ref, ...comboProps } = useOperatorPicker({\n onSelect,\n value: valueProp?.toString() ?? \"\",\n });\n\n return (\n <ExpandoCombobox<FilterClauseOp>\n {...comboProps}\n className={className}\n data-field=\"operator\"\n dropdownOnAutofocus={dropdownOnAutofocus}\n inputProps={inputProps}\n ref={useForkRef(forwardedRef, ref)}\n title=\"operator\"\n >\n {getOperators(column)\n .filter((op) =>\n op.toLowerCase().includes(comboProps.value.toLowerCase()),\n )\n .map((op) => (\n <Option value={op} key={op} />\n ))}\n </ExpandoCombobox>\n );\n});\n"],"names":["forwardRef","OperatorPicker","useOperatorPicker","jsx","ExpandoCombobox","useForkRef","getOperators","Option"],"mappings":";;;;;;;;;AAiBa,MAAA,cAAA,GAAiBA,gBAAW,CAAA,SAASC,eAChD,CAAA;AAAA,EACE,SAAA;AAAA,EACA,MAAA;AAAA,EACA,mBAAsB,GAAA,IAAA;AAAA,EACtB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAO,EAAA;AACT,CAAA,EACA,YACA,EAAA;AACA,EAAA,MAAM,EAAE,GAAA,EAAK,GAAG,UAAA,KAAeC,mCAAkB,CAAA;AAAA,IAC/C,QAAA;AAAA,IACA,KAAA,EAAO,SAAW,EAAA,QAAA,EAAc,IAAA;AAAA,GACjC,CAAA;AAED,EACE,uBAAAC,cAAA;AAAA,IAACC,+BAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,MACJ,SAAA;AAAA,MACA,YAAW,EAAA,UAAA;AAAA,MACX,mBAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA,EAAKC,eAAW,CAAA,YAAA,EAAc,GAAG,CAAA;AAAA,MACjC,KAAM,EAAA,UAAA;AAAA,MAEL,QAAA,EAAAC,0BAAA,CAAa,MAAM,CACjB,CAAA,MAAA;AAAA,QAAO,CAAC,OACP,EAAG,CAAA,WAAA,GAAc,QAAS,CAAA,UAAA,CAAW,KAAM,CAAA,WAAA,EAAa;AAAA,OAC1D,CACC,IAAI,CAAC,EAAA,oCACHC,WAAO,EAAA,EAAA,KAAA,EAAO,EAAS,EAAA,EAAA,EAAI,CAC7B;AAAA;AAAA,GACL;AAEJ,CAAC;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-utils.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/operator-picker/operator-utils.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n isNumericColumn,\n isTextColumn,\n isTimestampColumn,\n} from \"@vuu-ui/vuu-utils\";\nimport type {\n FilterClauseOp,\n NumericFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\n\nexport const textOperators: FilterClauseOp[] = [\n \"=\",\n \"in\",\n \"!=\",\n \"starts\",\n \"ends\",\n \"contains\",\n];\nexport const numericOperators: NumericFilterClauseOp[] = [\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n];\n\nexport const getOperators = (column: ColumnDescriptor): FilterClauseOp[] => {\n if (isTextColumn(column)) {\n return textOperators;\n } else if (isNumericColumn(column) || isTimestampColumn(column)) {\n return numericOperators;\n } else {\n throw Error(\"getOperators only supports text and numeric columns\");\n }\n};\n"],"names":["isTextColumn","isNumericColumn","isTimestampColumn"],"mappings":";;;;AAWO,MAAM,aAAkC,GAAA;AAAA,EAC7C,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AACO,MAAM,gBAA4C,GAAA;AAAA,EACvD,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA;AACF;AAEa,MAAA,YAAA,GAAe,CAAC,MAA+C,KAAA;AAC1E,EAAI,IAAAA,qBAAA,CAAa,MAAM,CAAG,EAAA;AACxB,IAAO,OAAA,aAAA;AAAA,aACEC,wBAAgB,CAAA,MAAM,CAAK,IAAAC,0BAAA,CAAkB,MAAM,CAAG,EAAA;AAC/D,IAAO,OAAA,gBAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,qDAAqD,CAAA;AAAA;AAErE;;;;;;"}
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+
6
+ const useOperatorPicker = ({
7
+ onSelect,
8
+ value: valueProp
9
+ }) => {
10
+ const ref = react.useRef(null);
11
+ const openRef = react.useRef(false);
12
+ const [value, setValue] = react.useState(valueProp);
13
+ const highlightFirstOption = react.useCallback(() => {
14
+ if (ref.current) {
15
+ const input = ref.current?.querySelector(
16
+ 'input[role="combobox"]'
17
+ );
18
+ if (input) {
19
+ requestAnimationFrame(() => {
20
+ vuuUtils.dispatchKeyboardEvent(input, "keydown", "ArrowDown");
21
+ });
22
+ }
23
+ }
24
+ }, []);
25
+ const handleChange = react.useCallback(
26
+ (event) => {
27
+ const value2 = event.target.value;
28
+ setValue(value2);
29
+ if (openRef.current && value2 === "") {
30
+ highlightFirstOption();
31
+ }
32
+ },
33
+ [highlightFirstOption]
34
+ );
35
+ const handleSelectionChange = react.useCallback(
36
+ (evt, [newSelected]) => {
37
+ onSelect?.(evt, newSelected);
38
+ setValue(newSelected ?? "");
39
+ },
40
+ [onSelect]
41
+ );
42
+ const handleOpenChange = react.useCallback(
43
+ (isOpen, reason) => {
44
+ openRef.current = isOpen;
45
+ if (isOpen && reason === "focus") {
46
+ highlightFirstOption();
47
+ }
48
+ },
49
+ [highlightFirstOption]
50
+ );
51
+ return {
52
+ onChange: handleChange,
53
+ onOpenChange: handleOpenChange,
54
+ onSelectionChange: handleSelectionChange,
55
+ ref,
56
+ value: value.toString().trim()
57
+ };
58
+ };
59
+
60
+ exports.useOperatorPicker = useOperatorPicker;
61
+ //# sourceMappingURL=useOperatorPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOperatorPicker.js","sources":["../../../../../packages/vuu-filters/src/filter-clause/operator-picker/useOperatorPicker.ts"],"sourcesContent":["import {\n ChangeEvent,\n SyntheticEvent,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { dispatchKeyboardEvent } from \"@vuu-ui/vuu-utils\";\nimport { FilterClauseOp } from \"@vuu-ui/vuu-filter-types\";\n\nexport const useOperatorPicker = ({\n onSelect,\n value: valueProp,\n}: {\n onSelect: (evt: SyntheticEvent, op: FilterClauseOp) => void;\n value: string;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const openRef = useRef(false);\n const [value, setValue] = useState(valueProp);\n\n const highlightFirstOption = useCallback(() => {\n if (ref.current) {\n const input = ref.current?.querySelector<HTMLInputElement>(\n 'input[role=\"combobox\"]',\n );\n if (input) {\n requestAnimationFrame(() => {\n dispatchKeyboardEvent(input, \"keydown\", \"ArrowDown\");\n });\n }\n }\n }, []);\n\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setValue(value);\n if (openRef.current && value === \"\") {\n highlightFirstOption();\n }\n },\n [highlightFirstOption],\n );\n\n const handleSelectionChange = useCallback(\n (evt: SyntheticEvent, [newSelected]: FilterClauseOp[]) => {\n onSelect?.(evt, newSelected);\n setValue(newSelected ?? \"\");\n },\n [onSelect],\n );\n\n const handleOpenChange = useCallback(\n (isOpen: boolean, reason?: \"manual\" | \"input\" | \"focus\") => {\n openRef.current = isOpen;\n if (isOpen && reason === \"focus\") {\n highlightFirstOption();\n }\n },\n [highlightFirstOption],\n );\n\n return {\n onChange: handleChange,\n onOpenChange: handleOpenChange,\n onSelectionChange: handleSelectionChange,\n ref,\n value: value.toString().trim(),\n };\n};\n"],"names":["useRef","useState","useCallback","dispatchKeyboardEvent","value"],"mappings":";;;;;AAUO,MAAM,oBAAoB,CAAC;AAAA,EAChC,QAAA;AAAA,EACA,KAAO,EAAA;AACT,CAGM,KAAA;AACJ,EAAM,MAAA,GAAA,GAAMA,aAAuB,IAAI,CAAA;AACvC,EAAM,MAAA,OAAA,GAAUA,aAAO,KAAK,CAAA;AAC5B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAS,SAAS,CAAA;AAE5C,EAAM,MAAA,oBAAA,GAAuBC,kBAAY,MAAM;AAC7C,IAAA,IAAI,IAAI,OAAS,EAAA;AACf,MAAM,MAAA,KAAA,GAAQ,IAAI,OAAS,EAAA,aAAA;AAAA,QACzB;AAAA,OACF;AACA,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,qBAAA,CAAsB,MAAM;AAC1B,UAAsBC,8BAAA,CAAA,KAAA,EAAO,WAAW,WAAW,CAAA;AAAA,SACpD,CAAA;AAAA;AACH;AACF,GACF,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAe,GAAAD,iBAAA;AAAA,IACnB,CAAC,KAAyC,KAAA;AACxC,MAAME,MAAAA,MAAAA,GAAQ,MAAM,MAAO,CAAA,KAAA;AAC3B,MAAA,QAAA,CAASA,MAAK,CAAA;AACd,MAAI,IAAA,OAAA,CAAQ,OAAWA,IAAAA,MAAAA,KAAU,EAAI,EAAA;AACnC,QAAqB,oBAAA,EAAA;AAAA;AACvB,KACF;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,qBAAwB,GAAAF,iBAAA;AAAA,IAC5B,CAAC,GAAA,EAAqB,CAAC,WAAW,CAAwB,KAAA;AACxD,MAAA,QAAA,GAAW,KAAK,WAAW,CAAA;AAC3B,MAAA,QAAA,CAAS,eAAe,EAAE,CAAA;AAAA,KAC5B;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,MAAM,gBAAmB,GAAAA,iBAAA;AAAA,IACvB,CAAC,QAAiB,MAA0C,KAAA;AAC1D,MAAA,OAAA,CAAQ,OAAU,GAAA,MAAA;AAClB,MAAI,IAAA,MAAA,IAAU,WAAW,OAAS,EAAA;AAChC,QAAqB,oBAAA,EAAA;AAAA;AACvB,KACF;AAAA,IACA,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAO,OAAA;AAAA,IACL,QAAU,EAAA,YAAA;AAAA,IACV,YAAc,EAAA,gBAAA;AAAA,IACd,iBAAmB,EAAA,qBAAA;AAAA,IACnB,GAAA;AAAA,IACA,KAAO,EAAA,KAAA,CAAM,QAAS,EAAA,CAAE,IAAK;AAAA,GAC/B;AACF;;;;"}