@vuu-ui/vuu-filters 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var 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 {\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 --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";
4
4
 
5
5
  module.exports = filterBarCss;
6
6
  //# sourceMappingURL=FilterBar.css.js.map
@@ -28,7 +28,7 @@ const FilterBar = ({
28
28
  onFilterStateChanged,
29
29
  suggestionProvider,
30
30
  tableSchema,
31
- variant = "custom-filters",
31
+ variant = "custom-filters-only",
32
32
  ...htmlAttributes
33
33
  }) => {
34
34
  const targetWindow = window.useWindow();
@@ -37,8 +37,8 @@ const FilterBar = ({
37
37
  css: FilterBar$1,
38
38
  window: targetWindow
39
39
  });
40
- const allowCustomFilters = variant !== "quick-filters";
41
- const allowQuickFilters = variant !== "custom-filters";
40
+ const allowCustomFilters = variant !== "quick-filters-only";
41
+ const allowQuickFilters = variant !== "custom-filters-only";
42
42
  const controlledFilterMode = !allowCustomFilters ? "quick-filter" : !allowQuickFilters ? "custom-filter" : filterModeProp;
43
43
  const { filterMode, onChangeFilterMode } = useFilterBar.useFilterBar({
44
44
  defaultFilterMode,
@@ -88,13 +88,9 @@ const FilterBar = ({
88
88
  "div",
89
89
  {
90
90
  ...htmlAttributes,
91
- className: cx(
92
- className,
93
- `${classBase}-${variant}`,
94
- `${classBase}-${filterMode}`
95
- ),
91
+ className: cx(className, `${classBase}-${filterMode}-mode`),
96
92
  children: [
97
- variant === "quick-filters" ? null : /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-iconContainer`, children: startAdornment }),
93
+ variant === "quick-filters-only" ? null : /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-iconContainer`, children: startAdornment }),
98
94
  filterMode === "custom-filter" ? /* @__PURE__ */ jsxRuntime.jsx(
99
95
  CustomFilters.CustomFilters,
100
96
  {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBar.js","sources":["../../src/filter-bar/FilterBar.tsx"],"sourcesContent":["import {\n DataSourceFilter,\n SuggestionProvider,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { Filter, 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\";\n\nimport filterBarCss from \"./FilterBar.css\";\n\nexport type FilterBarVariant =\n | \"custom-filters\"\n | \"quick-filters\"\n | \"full-filters\";\n\nexport interface FilterBarProps extends HTMLAttributes<HTMLDivElement> {\n QuickFilterProps?: Pick<\n QuickFilterProps,\n \"quickFilterColumns\" | \"onChangeQuickFilterColumns\"\n >;\n /**\n * This is used to apply tailored filters based on column types and other attributes.\n * NOTE: Always make sure that these are passed with proper re-render optimization, otherwise,\n * might end up with infinite state updates.\n */\n columnDescriptors: ColumnDescriptor[];\n defaultFilterMode?: FilterMode;\n defaultFilterState?: FilterState;\n filterMode?: FilterMode;\n filterState?: FilterState;\n onApplyFilter: (filter: DataSourceFilter) => void;\n onChangeFilterMode?: (filterMode: FilterMode) => void;\n onFilterDeleted?: (filter: Filter) => void;\n onFilterRenamed?: (filter: Filter, name: string) => void;\n onFilterStateChanged?: (state: FilterState) => void;\n suggestionProvider?: SuggestionProvider;\n /**\n * TableSchema is used both to populate list of available columns and to\n * provide table in call to Typeahead service\n */\n tableSchema?: TableSchema;\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 onFilterDeleted,\n onFilterRenamed,\n onFilterStateChanged,\n suggestionProvider,\n tableSchema,\n variant = \"custom-filters\",\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\";\n const allowQuickFilters = variant !== \"custom-filters\";\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(\n className,\n `${classBase}-${variant}`,\n `${classBase}-${filterMode}`,\n )}\n >\n {variant === \"quick-filters\" ? 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 onFilterDeleted={onFilterDeleted}\n onFilterRenamed={onFilterRenamed}\n onFilterStateChanged={onFilterStateChanged}\n tableSchema={tableSchema}\n />\n ) : (\n <QuickFilters\n {...QuickFilterProps}\n availableColumns={columnDescriptors}\n onApplyFilter={onApplyFilter}\n tableSchema={tableSchema}\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":["../../src/filter-bar/FilterBar.tsx"],"sourcesContent":["import {\n DataSourceFilter,\n SuggestionProvider,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { Filter, 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\";\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 * This is used to apply tailored filters based on column types and other attributes.\n * NOTE: Always make sure that these are passed with proper re-render optimization, otherwise,\n * might end up with infinite state updates.\n */\n columnDescriptors: ColumnDescriptor[];\n defaultFilterMode?: FilterMode;\n defaultFilterState?: FilterState;\n filterMode?: FilterMode;\n filterState?: FilterState;\n onApplyFilter: (filter: DataSourceFilter) => void;\n onChangeFilterMode?: (filterMode: FilterMode) => void;\n onFilterDeleted?: (filter: Filter) => void;\n onFilterRenamed?: (filter: Filter, name: string) => void;\n onFilterStateChanged?: (state: FilterState) => void;\n suggestionProvider?: SuggestionProvider;\n /**\n * TableSchema is used both to populate list of available columns and to\n * provide table in call to Typeahead service\n */\n tableSchema?: TableSchema;\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 onFilterDeleted,\n onFilterRenamed,\n onFilterStateChanged,\n suggestionProvider,\n tableSchema,\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 onFilterDeleted={onFilterDeleted}\n onFilterRenamed={onFilterRenamed}\n onFilterStateChanged={onFilterStateChanged}\n tableSchema={tableSchema}\n />\n ) : (\n <QuickFilters\n {...QuickFilterProps}\n availableColumns={columnDescriptors}\n onApplyFilter={onApplyFilter}\n tableSchema={tableSchema}\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 inlineFilteCss = ".vuuInlineFilter {\n --filter-borderColor: var(--salt-separable-secondary-borderColor);\n --filter-color: var(--salt-content-primary-foreground-disabled);\n --filter-padding: 1px 1px 1px 0;\n --filter-content-height: 22px;\n height: var(--salt-size-base);\n\n .vuuInlineFilter-filter:has(input:focus) {\n --filter-borderColor: transparent;\n --filter-content-height: 20px;\n\n outline-width: 2px;\n outline-offset: -2px;\n outline-style: dotted;\n outline-color: var(--salt-focused-outlineColor);\n\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n\n .saltInput-input {\n outline: none;\n }\n .saltInput-focused {\n border: none;\n outline: none;\n }\n\n .saltComboBox-focused {\n outline: none;\n }\n }\n\n .vuuInlineFilter-filter:focus {\n --filter-borderColor: transparent;\n --filter-content-height: 20px;\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n }\n\n .vuuInlineFilter-filter {\n --saltInput-minHeight: var(--filter-content-height);\n align-items: center;\n display: inline-flex;\n height: 100%;\n padding: var(--filter-padding);\n\n .vuuTypeaheadInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n }\n\n .vuuTypeaheadInput {\n height: var(--filter-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n\n .saltInput-primary.vuuInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--filter-content-height);\n min-height: var(--filter-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n }\n\n .vuuInlineFilter-virtualColSpan {\n display: inline-block;\n }\n}\n\n.vuuInlineFilter:focus-within {\n --filter-borderColor: var(--salt-separable-primary-borderColor);\n --filter-color: var(--salt-content-primary-foreground);\n}\n";
3
+ var inlineFilteCss = ".vuuInlineFilter {\n --filter-borderColor: var(--salt-separable-secondary-borderColor);\n --filter-color: var(--salt-content-primary-foreground-disabled);\n --filter-padding: 1px 1px 1px 0;\n --item-content-height: 22px;\n height: var(--salt-size-base);\n\n .vuuInlineFilterCell:has(input:focus) {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n\n outline-width: 2px;\n outline-offset: -2px;\n outline-style: dotted;\n outline-color: var(--salt-focused-outlineColor);\n\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n\n .saltInput-input {\n outline: none;\n }\n .saltInput-focused {\n border: none;\n outline: none;\n }\n\n .saltComboBox-focused {\n outline: none;\n }\n }\n\n .vuuInlineFilterCell:focus {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n }\n\n .vuuInlineFilterCell {\n --saltInput-minHeight: var(--item-content-height);\n --saltPillInput-minHeight: var(--item-content-height);\n align-items: center;\n display: inline-flex;\n height: 100%;\n padding: var(--filter-padding);\n\n .vuuTypeaheadInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n\n\n .saltInput-primary.vuuInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n min-height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n }\n\n .vuuInlineFilter-virtualColSpan {\n display: inline-block;\n }\n}\n\n.vuuInlineFilter:focus-within {\n --filter-borderColor: var(--salt-separable-primary-borderColor);\n --filter-color: var(--salt-content-primary-foreground);\n}\n";
4
4
 
5
5
  module.exports = inlineFilteCss;
6
6
  //# sourceMappingURL=InlineFilter.css.js.map
@@ -3,12 +3,11 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var vuuDataReact = require('@vuu-ui/vuu-data-react');
5
5
  var vuuTable = require('@vuu-ui/vuu-table');
6
- var vuuUtils = require('@vuu-ui/vuu-utils');
7
6
  var styles = require('@salt-ds/styles');
8
7
  var window = require('@salt-ds/window');
9
- var react = require('react');
10
8
  var cx = require('clsx');
11
9
  var InlineFilter$1 = require('./InlineFilter.css.js');
10
+ var useInlineFilter = require('./useInlineFilter.js');
12
11
 
13
12
  const classBase = "vuuInlineFilter";
14
13
  const InputProps = {
@@ -32,44 +31,21 @@ const InlineFilter = ({
32
31
  css: InlineFilter$1,
33
32
  window: targetWindow
34
33
  });
35
- const filterAggregator = react.useMemo(() => new vuuUtils.FilterAggregator(), []);
36
- const { columns = [], virtualColSpan = 0 } = vuuTable.useHeaderProps();
37
- const onCommit = react.useCallback(
38
- (evt, value = "") => {
39
- const fieldName = vuuUtils.getFieldName(evt.target);
40
- const column = columns.find((c) => c.name === fieldName);
41
- if (column) {
42
- if (value === "") {
43
- if (filterAggregator.removeFilter(column)) {
44
- onChange(filterAggregator.filter);
45
- }
46
- } else {
47
- filterAggregator.addFilter(column, value);
48
- onChange(filterAggregator.filter);
49
- }
50
- }
51
- },
52
- [columns, filterAggregator, onChange]
53
- );
54
- const handleKeyDown = react.useCallback(
55
- (evt) => {
56
- if (evt.key === "Enter") {
57
- const el = evt.target;
58
- const inputElement = el.querySelector("input");
59
- inputElement?.focus();
60
- }
61
- },
62
- []
63
- );
34
+ const { columns, onCommit, onKeyDown, virtualColSpan } = useInlineFilter.useInlineFilter({
35
+ onChange
36
+ });
64
37
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { ...htmlAttributes, className: classBase, role: ariaRole, children: [
65
38
  /* @__PURE__ */ jsxRuntime.jsx(vuuTable.VirtualColSpan, { width: virtualColSpan }),
66
39
  columns.map((column, i) => /* @__PURE__ */ jsxRuntime.jsx(
67
40
  "div",
68
41
  {
69
42
  "aria-colindex": i + 1,
70
- className: cx(`${classBase}-filter`, "vuuTableCell"),
43
+ className: cx(`${classBase}Cell`, "vuuTableCell", {
44
+ "vuuTableCell-right": column.align === "right"
45
+ }),
71
46
  "data-field": column.name,
72
- onKeyDown: handleKeyDown,
47
+ onKeyDown,
48
+ role: "cell",
73
49
  style: { width: column.width },
74
50
  children: vuuDataReact.getDataItemEditControl({
75
51
  InputProps,
@@ -1 +1 @@
1
- {"version":3,"file":"InlineFilter.js","sources":["../../src/inline-filter/InlineFilter.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { VirtualColSpan, useHeaderProps } from \"@vuu-ui/vuu-table\";\nimport {\n CommitHandler,\n FilterAggregator,\n getFieldName,\n} from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n HTMLAttributes,\n KeyboardEventHandler,\n useCallback,\n useMemo,\n} from \"react\";\nimport cx from \"clsx\";\n\nimport inlineFilteCss from \"./InlineFilter.css\";\nimport { InputProps } from \"@salt-ds/core\";\nimport { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport { BaseRowProps } from \"@vuu-ui/vuu-table-types\";\n\nconst classBase = \"vuuInlineFilter\";\n\nexport type FilterValueChangeHandler = (filter: VuuFilter) => void;\nexport interface InlineFilterProps\n extends Partial<BaseRowProps>,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange: FilterValueChangeHandler;\n table: TableSchemaTable;\n}\n\nconst InputProps: Partial<InputProps> = {\n inputProps: {\n placeholder: \"Filter value\",\n },\n variant: \"primary\",\n};\n\nconst TypeaheadProps = {\n highlightFirstSuggestion: false,\n};\n\nexport const InlineFilter = ({\n ariaRole,\n onChange,\n table,\n ...htmlAttributes\n}: InlineFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-inline-filter\",\n css: inlineFilteCss,\n window: targetWindow,\n });\n\n const filterAggregator = useMemo(() => new FilterAggregator(), []);\n const { columns = [], virtualColSpan = 0 } = useHeaderProps();\n\n const onCommit = useCallback<\n CommitHandler<HTMLElement, string | number | undefined>\n >(\n (evt, value = \"\") => {\n const fieldName = getFieldName(evt.target);\n const column = columns.find((c) => c.name === fieldName);\n if (column) {\n if (value === \"\") {\n if (filterAggregator.removeFilter(column)) {\n onChange(filterAggregator.filter);\n }\n } else {\n filterAggregator.addFilter(column, value);\n onChange(filterAggregator.filter);\n }\n }\n },\n [columns, filterAggregator, onChange],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (evt) => {\n if (evt.key === \"Enter\") {\n const el = evt.target as HTMLElement;\n const inputElement = el.querySelector(\"input\");\n inputElement?.focus();\n }\n },\n [],\n );\n\n return (\n <div {...htmlAttributes} className={classBase} role={ariaRole}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column, i) => (\n <div\n aria-colindex={i + 1}\n className={cx(`${classBase}-filter`, \"vuuTableCell\")}\n data-field={column.name}\n onKeyDown={handleKeyDown}\n key={column.name}\n style={{ width: column.width }}\n >\n {getDataItemEditControl({\n InputProps,\n TypeaheadProps,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","inlineFilteCss","useMemo","FilterAggregator","useHeaderProps","useCallback","getFieldName","jsx","VirtualColSpan","getDataItemEditControl"],"mappings":"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"}
1
+ {"version":3,"file":"InlineFilter.js","sources":["../../src/inline-filter/InlineFilter.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { VirtualColSpan } from \"@vuu-ui/vuu-table\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes } from \"react\";\nimport cx from \"clsx\";\n\nimport inlineFilteCss from \"./InlineFilter.css\";\nimport { InputProps } from \"@salt-ds/core\";\nimport { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport { BaseRowProps } from \"@vuu-ui/vuu-table-types\";\nimport { useInlineFilter } from \"./useInlineFilter\";\n\nconst classBase = \"vuuInlineFilter\";\n\nexport type FilterValueChangeHandler = (filter: VuuFilter) => void;\nexport interface InlineFilterProps\n extends Partial<BaseRowProps>,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange: FilterValueChangeHandler;\n table: TableSchemaTable;\n}\n\nconst InputProps: Partial<InputProps> = {\n inputProps: {\n placeholder: \"Filter value\",\n },\n variant: \"primary\",\n};\n\nconst TypeaheadProps = {\n highlightFirstSuggestion: false,\n};\n\nexport const InlineFilter = ({\n ariaRole,\n onChange,\n table,\n ...htmlAttributes\n}: InlineFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-inline-filter\",\n css: inlineFilteCss,\n window: targetWindow,\n });\n\n const { columns, onCommit, onKeyDown, virtualColSpan } = useInlineFilter({\n onChange,\n });\n\n return (\n <div {...htmlAttributes} className={classBase} role={ariaRole}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column, i) => (\n <div\n aria-colindex={i + 1}\n className={cx(`${classBase}Cell`, \"vuuTableCell\", {\n \"vuuTableCell-right\": column.align === \"right\",\n })}\n data-field={column.name}\n onKeyDown={onKeyDown}\n key={column.name}\n role=\"cell\"\n style={{ width: column.width }}\n >\n {getDataItemEditControl({\n InputProps,\n TypeaheadProps,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","inlineFilteCss","useInlineFilter","jsx","VirtualColSpan","getDataItemEditControl"],"mappings":";;;;;;;;;;;AAcA,MAAM,SAAY,GAAA,iBAAA,CAAA;AAUlB,MAAM,UAAkC,GAAA;AAAA,EACtC,UAAY,EAAA;AAAA,IACV,WAAa,EAAA,cAAA;AAAA,GACf;AAAA,EACA,OAAS,EAAA,SAAA;AACX,CAAA,CAAA;AAEA,MAAM,cAAiB,GAAA;AAAA,EACrB,wBAA0B,EAAA,KAAA;AAC5B,CAAA,CAAA;AAEO,MAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAyB,KAAA;AACvB,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAC,cAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,OAAS,EAAA,QAAA,EAAU,SAAW,EAAA,cAAA,KAAmBC,+BAAgB,CAAA;AAAA,IACvE,QAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,uCACG,KAAK,EAAA,EAAA,GAAG,gBAAgB,SAAW,EAAA,SAAA,EAAW,MAAM,QACnD,EAAA,QAAA,EAAA;AAAA,oBAACC,cAAA,CAAAC,uBAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,IACtC,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,CACpB,qBAAAD,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,iBAAe,CAAI,GAAA,CAAA;AAAA,QACnB,SAAW,EAAA,EAAA,CAAG,CAAG,EAAA,SAAS,QAAQ,cAAgB,EAAA;AAAA,UAChD,oBAAA,EAAsB,OAAO,KAAU,KAAA,OAAA;AAAA,SACxC,CAAA;AAAA,QACD,cAAY,MAAO,CAAA,IAAA;AAAA,QACnB,SAAA;AAAA,QAEA,IAAK,EAAA,MAAA;AAAA,QACL,KAAO,EAAA,EAAE,KAAO,EAAA,MAAA,CAAO,KAAM,EAAA;AAAA,QAE5B,QAAuB,EAAAE,mCAAA,CAAA;AAAA,UACtB,UAAA;AAAA,UACA,cAAA;AAAA,UACA,iBAAmB,EAAA,IAAA;AAAA,UACnB,cAAgB,EAAA,MAAA;AAAA,UAChB,QAAA;AAAA,UACA,KAAA;AAAA,SACD,CAAA;AAAA,OAAA;AAAA,MAXI,MAAO,CAAA,IAAA;AAAA,KAaf,CAAA;AAAA,GACH,EAAA,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ var vuuTable = require('@vuu-ui/vuu-table');
4
+ var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var react = require('react');
6
+
7
+ const useInlineFilter = ({
8
+ onChange
9
+ }) => {
10
+ const filterAggregator = react.useMemo(() => new vuuUtils.FilterAggregator(), []);
11
+ const { columns = [], virtualColSpan = 0 } = vuuTable.useHeaderProps();
12
+ const handleCommit = react.useCallback(
13
+ (evt, value = "") => {
14
+ const fieldName = vuuUtils.getFieldName(evt.target);
15
+ const column = columns.find((c) => c.name === fieldName);
16
+ if (column) {
17
+ if (value === "") {
18
+ if (filterAggregator.removeFilter(column)) {
19
+ onChange(filterAggregator.filter);
20
+ }
21
+ } else {
22
+ filterAggregator.addFilter(column, value);
23
+ onChange(filterAggregator.filter);
24
+ }
25
+ }
26
+ },
27
+ [columns, filterAggregator, onChange]
28
+ );
29
+ const { onKeyDown } = vuuTable.useEditableCell();
30
+ return {
31
+ columns,
32
+ onCommit: handleCommit,
33
+ onKeyDown,
34
+ virtualColSpan
35
+ };
36
+ };
37
+
38
+ exports.useInlineFilter = useInlineFilter;
39
+ //# sourceMappingURL=useInlineFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInlineFilter.js","sources":["../../src/inline-filter/useInlineFilter.ts"],"sourcesContent":["import { useEditableCell, useHeaderProps } from \"@vuu-ui/vuu-table\";\nimport {\n CommitHandler,\n FilterAggregator,\n getFieldName,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo } from \"react\";\nimport { FilterValueChangeHandler } from \"./InlineFilter\";\n\nexport const useInlineFilter = ({\n onChange,\n}: {\n onChange: FilterValueChangeHandler;\n}) => {\n const filterAggregator = useMemo(() => new FilterAggregator(), []);\n const { columns = [], virtualColSpan = 0 } = useHeaderProps();\n\n const handleCommit = useCallback<\n CommitHandler<HTMLElement, string | number | undefined>\n >(\n (evt, value = \"\") => {\n const fieldName = getFieldName(evt.target);\n const column = columns.find((c) => c.name === fieldName);\n if (column) {\n if (value === \"\") {\n if (filterAggregator.removeFilter(column)) {\n onChange(filterAggregator.filter);\n }\n } else {\n filterAggregator.addFilter(column, value);\n onChange(filterAggregator.filter);\n }\n }\n },\n [columns, filterAggregator, onChange],\n );\n\n const { onKeyDown } = useEditableCell();\n\n return {\n columns,\n onCommit: handleCommit,\n onKeyDown,\n virtualColSpan,\n };\n};\n"],"names":["useMemo","FilterAggregator","useHeaderProps","useCallback","getFieldName","useEditableCell"],"mappings":";;;;;;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,mBAAmBA,aAAQ,CAAA,MAAM,IAAIC,yBAAiB,EAAA,EAAG,EAAE,CAAA,CAAA;AACjE,EAAA,MAAM,EAAE,OAAU,GAAA,IAAI,cAAiB,GAAA,CAAA,KAAMC,uBAAe,EAAA,CAAA;AAE5D,EAAA,MAAM,YAAe,GAAAC,iBAAA;AAAA,IAGnB,CAAC,GAAK,EAAA,KAAA,GAAQ,EAAO,KAAA;AACnB,MAAM,MAAA,SAAA,GAAYC,qBAAa,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACzC,MAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,SAAS,CAAA,CAAA;AACvD,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,IAAI,UAAU,EAAI,EAAA;AAChB,UAAI,IAAA,gBAAA,CAAiB,YAAa,CAAA,MAAM,CAAG,EAAA;AACzC,YAAA,QAAA,CAAS,iBAAiB,MAAM,CAAA,CAAA;AAAA,WAClC;AAAA,SACK,MAAA;AACL,UAAiB,gBAAA,CAAA,SAAA,CAAU,QAAQ,KAAK,CAAA,CAAA;AACxC,UAAA,QAAA,CAAS,iBAAiB,MAAM,CAAA,CAAA;AAAA,SAClC;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,OAAS,EAAA,gBAAA,EAAkB,QAAQ,CAAA;AAAA,GACtC,CAAA;AAEA,EAAM,MAAA,EAAE,SAAU,EAAA,GAAIC,wBAAgB,EAAA,CAAA;AAEtC,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,SAAA;AAAA,IACA,cAAA;AAAA,GACF,CAAA;AACF;;;;"}
@@ -1,4 +1,4 @@
1
- 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 {\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";
1
+ 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";
2
2
 
3
3
  export { filterBarCss as default };
4
4
  //# sourceMappingURL=FilterBar.css.js.map
@@ -26,7 +26,7 @@ const FilterBar = ({
26
26
  onFilterStateChanged,
27
27
  suggestionProvider,
28
28
  tableSchema,
29
- variant = "custom-filters",
29
+ variant = "custom-filters-only",
30
30
  ...htmlAttributes
31
31
  }) => {
32
32
  const targetWindow = useWindow();
@@ -35,8 +35,8 @@ const FilterBar = ({
35
35
  css: filterBarCss,
36
36
  window: targetWindow
37
37
  });
38
- const allowCustomFilters = variant !== "quick-filters";
39
- const allowQuickFilters = variant !== "custom-filters";
38
+ const allowCustomFilters = variant !== "quick-filters-only";
39
+ const allowQuickFilters = variant !== "custom-filters-only";
40
40
  const controlledFilterMode = !allowCustomFilters ? "quick-filter" : !allowQuickFilters ? "custom-filter" : filterModeProp;
41
41
  const { filterMode, onChangeFilterMode } = useFilterBar({
42
42
  defaultFilterMode,
@@ -86,13 +86,9 @@ const FilterBar = ({
86
86
  "div",
87
87
  {
88
88
  ...htmlAttributes,
89
- className: cx(
90
- className,
91
- `${classBase}-${variant}`,
92
- `${classBase}-${filterMode}`
93
- ),
89
+ className: cx(className, `${classBase}-${filterMode}-mode`),
94
90
  children: [
95
- variant === "quick-filters" ? null : /* @__PURE__ */ jsx("div", { className: `${classBase}-iconContainer`, children: startAdornment }),
91
+ variant === "quick-filters-only" ? null : /* @__PURE__ */ jsx("div", { className: `${classBase}-iconContainer`, children: startAdornment }),
96
92
  filterMode === "custom-filter" ? /* @__PURE__ */ jsx(
97
93
  CustomFilters,
98
94
  {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBar.js","sources":["../../src/filter-bar/FilterBar.tsx"],"sourcesContent":["import {\n DataSourceFilter,\n SuggestionProvider,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { Filter, 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\";\n\nimport filterBarCss from \"./FilterBar.css\";\n\nexport type FilterBarVariant =\n | \"custom-filters\"\n | \"quick-filters\"\n | \"full-filters\";\n\nexport interface FilterBarProps extends HTMLAttributes<HTMLDivElement> {\n QuickFilterProps?: Pick<\n QuickFilterProps,\n \"quickFilterColumns\" | \"onChangeQuickFilterColumns\"\n >;\n /**\n * This is used to apply tailored filters based on column types and other attributes.\n * NOTE: Always make sure that these are passed with proper re-render optimization, otherwise,\n * might end up with infinite state updates.\n */\n columnDescriptors: ColumnDescriptor[];\n defaultFilterMode?: FilterMode;\n defaultFilterState?: FilterState;\n filterMode?: FilterMode;\n filterState?: FilterState;\n onApplyFilter: (filter: DataSourceFilter) => void;\n onChangeFilterMode?: (filterMode: FilterMode) => void;\n onFilterDeleted?: (filter: Filter) => void;\n onFilterRenamed?: (filter: Filter, name: string) => void;\n onFilterStateChanged?: (state: FilterState) => void;\n suggestionProvider?: SuggestionProvider;\n /**\n * TableSchema is used both to populate list of available columns and to\n * provide table in call to Typeahead service\n */\n tableSchema?: TableSchema;\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 onFilterDeleted,\n onFilterRenamed,\n onFilterStateChanged,\n suggestionProvider,\n tableSchema,\n variant = \"custom-filters\",\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\";\n const allowQuickFilters = variant !== \"custom-filters\";\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(\n className,\n `${classBase}-${variant}`,\n `${classBase}-${filterMode}`,\n )}\n >\n {variant === \"quick-filters\" ? 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 onFilterDeleted={onFilterDeleted}\n onFilterRenamed={onFilterRenamed}\n onFilterStateChanged={onFilterStateChanged}\n tableSchema={tableSchema}\n />\n ) : (\n <QuickFilters\n {...QuickFilterProps}\n availableColumns={columnDescriptors}\n onApplyFilter={onApplyFilter}\n tableSchema={tableSchema}\n />\n )}\n </div>\n );\n};\n"],"names":["QuickFilterProps"],"mappings":"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"}
1
+ {"version":3,"file":"FilterBar.js","sources":["../../src/filter-bar/FilterBar.tsx"],"sourcesContent":["import {\n DataSourceFilter,\n SuggestionProvider,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { Filter, 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\";\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 * This is used to apply tailored filters based on column types and other attributes.\n * NOTE: Always make sure that these are passed with proper re-render optimization, otherwise,\n * might end up with infinite state updates.\n */\n columnDescriptors: ColumnDescriptor[];\n defaultFilterMode?: FilterMode;\n defaultFilterState?: FilterState;\n filterMode?: FilterMode;\n filterState?: FilterState;\n onApplyFilter: (filter: DataSourceFilter) => void;\n onChangeFilterMode?: (filterMode: FilterMode) => void;\n onFilterDeleted?: (filter: Filter) => void;\n onFilterRenamed?: (filter: Filter, name: string) => void;\n onFilterStateChanged?: (state: FilterState) => void;\n suggestionProvider?: SuggestionProvider;\n /**\n * TableSchema is used both to populate list of available columns and to\n * provide table in call to Typeahead service\n */\n tableSchema?: TableSchema;\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 onFilterDeleted,\n onFilterRenamed,\n onFilterStateChanged,\n suggestionProvider,\n tableSchema,\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 onFilterDeleted={onFilterDeleted}\n onFilterRenamed={onFilterRenamed}\n onFilterStateChanged={onFilterStateChanged}\n tableSchema={tableSchema}\n />\n ) : (\n <QuickFilters\n {...QuickFilterProps}\n availableColumns={columnDescriptors}\n onApplyFilter={onApplyFilter}\n tableSchema={tableSchema}\n />\n )}\n </div>\n );\n};\n"],"names":["QuickFilterProps"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- var inlineFilteCss = ".vuuInlineFilter {\n --filter-borderColor: var(--salt-separable-secondary-borderColor);\n --filter-color: var(--salt-content-primary-foreground-disabled);\n --filter-padding: 1px 1px 1px 0;\n --filter-content-height: 22px;\n height: var(--salt-size-base);\n\n .vuuInlineFilter-filter:has(input:focus) {\n --filter-borderColor: transparent;\n --filter-content-height: 20px;\n\n outline-width: 2px;\n outline-offset: -2px;\n outline-style: dotted;\n outline-color: var(--salt-focused-outlineColor);\n\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n\n .saltInput-input {\n outline: none;\n }\n .saltInput-focused {\n border: none;\n outline: none;\n }\n\n .saltComboBox-focused {\n outline: none;\n }\n }\n\n .vuuInlineFilter-filter:focus {\n --filter-borderColor: transparent;\n --filter-content-height: 20px;\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n }\n\n .vuuInlineFilter-filter {\n --saltInput-minHeight: var(--filter-content-height);\n align-items: center;\n display: inline-flex;\n height: 100%;\n padding: var(--filter-padding);\n\n .vuuTypeaheadInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n }\n\n .vuuTypeaheadInput {\n height: var(--filter-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n\n .saltInput-primary.vuuInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--filter-content-height);\n min-height: var(--filter-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n }\n\n .vuuInlineFilter-virtualColSpan {\n display: inline-block;\n }\n}\n\n.vuuInlineFilter:focus-within {\n --filter-borderColor: var(--salt-separable-primary-borderColor);\n --filter-color: var(--salt-content-primary-foreground);\n}\n";
1
+ var inlineFilteCss = ".vuuInlineFilter {\n --filter-borderColor: var(--salt-separable-secondary-borderColor);\n --filter-color: var(--salt-content-primary-foreground-disabled);\n --filter-padding: 1px 1px 1px 0;\n --item-content-height: 22px;\n height: var(--salt-size-base);\n\n .vuuInlineFilterCell:has(input:focus) {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n\n outline-width: 2px;\n outline-offset: -2px;\n outline-style: dotted;\n outline-color: var(--salt-focused-outlineColor);\n\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n\n .saltInput-input {\n outline: none;\n }\n .saltInput-focused {\n border: none;\n outline: none;\n }\n\n .saltComboBox-focused {\n outline: none;\n }\n }\n\n .vuuInlineFilterCell:focus {\n --filter-borderColor: transparent;\n --item-content-height: 20px;\n /* the padding ensures the outline is not clipped */\n --filter-padding: 0 2px;\n /* prevents shift when we apply the padding */\n --saltInput-paddingLeft: 2px;\n }\n\n .vuuInlineFilterCell {\n --saltInput-minHeight: var(--item-content-height);\n --saltPillInput-minHeight: var(--item-content-height);\n align-items: center;\n display: inline-flex;\n height: 100%;\n padding: var(--filter-padding);\n\n .vuuTypeaheadInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n\n\n .saltInput-primary.vuuInput {\n border-style: solid;\n border-color: var(--filter-borderColor);\n border-width: 1px;\n border-radius: 0;\n height: var(--item-content-height);\n min-height: var(--item-content-height);\n input::placeholder {\n color: var(--filter-color);\n }\n }\n }\n\n .vuuInlineFilter-virtualColSpan {\n display: inline-block;\n }\n}\n\n.vuuInlineFilter:focus-within {\n --filter-borderColor: var(--salt-separable-primary-borderColor);\n --filter-color: var(--salt-content-primary-foreground);\n}\n";
2
2
 
3
3
  export { inlineFilteCss as default };
4
4
  //# sourceMappingURL=InlineFilter.css.js.map
@@ -1,12 +1,11 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { getDataItemEditControl } from '@vuu-ui/vuu-data-react';
3
- import { useHeaderProps, VirtualColSpan } from '@vuu-ui/vuu-table';
4
- import { FilterAggregator, getFieldName } from '@vuu-ui/vuu-utils';
3
+ import { VirtualColSpan } from '@vuu-ui/vuu-table';
5
4
  import { useComponentCssInjection } from '@salt-ds/styles';
6
5
  import { useWindow } from '@salt-ds/window';
7
- import { useMemo, useCallback } from 'react';
8
6
  import cx from 'clsx';
9
7
  import inlineFilteCss from './InlineFilter.css.js';
8
+ import { useInlineFilter } from './useInlineFilter.js';
10
9
 
11
10
  const classBase = "vuuInlineFilter";
12
11
  const InputProps = {
@@ -30,44 +29,21 @@ const InlineFilter = ({
30
29
  css: inlineFilteCss,
31
30
  window: targetWindow
32
31
  });
33
- const filterAggregator = useMemo(() => new FilterAggregator(), []);
34
- const { columns = [], virtualColSpan = 0 } = useHeaderProps();
35
- const onCommit = useCallback(
36
- (evt, value = "") => {
37
- const fieldName = getFieldName(evt.target);
38
- const column = columns.find((c) => c.name === fieldName);
39
- if (column) {
40
- if (value === "") {
41
- if (filterAggregator.removeFilter(column)) {
42
- onChange(filterAggregator.filter);
43
- }
44
- } else {
45
- filterAggregator.addFilter(column, value);
46
- onChange(filterAggregator.filter);
47
- }
48
- }
49
- },
50
- [columns, filterAggregator, onChange]
51
- );
52
- const handleKeyDown = useCallback(
53
- (evt) => {
54
- if (evt.key === "Enter") {
55
- const el = evt.target;
56
- const inputElement = el.querySelector("input");
57
- inputElement?.focus();
58
- }
59
- },
60
- []
61
- );
32
+ const { columns, onCommit, onKeyDown, virtualColSpan } = useInlineFilter({
33
+ onChange
34
+ });
62
35
  return /* @__PURE__ */ jsxs("div", { ...htmlAttributes, className: classBase, role: ariaRole, children: [
63
36
  /* @__PURE__ */ jsx(VirtualColSpan, { width: virtualColSpan }),
64
37
  columns.map((column, i) => /* @__PURE__ */ jsx(
65
38
  "div",
66
39
  {
67
40
  "aria-colindex": i + 1,
68
- className: cx(`${classBase}-filter`, "vuuTableCell"),
41
+ className: cx(`${classBase}Cell`, "vuuTableCell", {
42
+ "vuuTableCell-right": column.align === "right"
43
+ }),
69
44
  "data-field": column.name,
70
- onKeyDown: handleKeyDown,
45
+ onKeyDown,
46
+ role: "cell",
71
47
  style: { width: column.width },
72
48
  children: getDataItemEditControl({
73
49
  InputProps,
@@ -1 +1 @@
1
- {"version":3,"file":"InlineFilter.js","sources":["../../src/inline-filter/InlineFilter.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { VirtualColSpan, useHeaderProps } from \"@vuu-ui/vuu-table\";\nimport {\n CommitHandler,\n FilterAggregator,\n getFieldName,\n} from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n HTMLAttributes,\n KeyboardEventHandler,\n useCallback,\n useMemo,\n} from \"react\";\nimport cx from \"clsx\";\n\nimport inlineFilteCss from \"./InlineFilter.css\";\nimport { InputProps } from \"@salt-ds/core\";\nimport { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport { BaseRowProps } from \"@vuu-ui/vuu-table-types\";\n\nconst classBase = \"vuuInlineFilter\";\n\nexport type FilterValueChangeHandler = (filter: VuuFilter) => void;\nexport interface InlineFilterProps\n extends Partial<BaseRowProps>,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange: FilterValueChangeHandler;\n table: TableSchemaTable;\n}\n\nconst InputProps: Partial<InputProps> = {\n inputProps: {\n placeholder: \"Filter value\",\n },\n variant: \"primary\",\n};\n\nconst TypeaheadProps = {\n highlightFirstSuggestion: false,\n};\n\nexport const InlineFilter = ({\n ariaRole,\n onChange,\n table,\n ...htmlAttributes\n}: InlineFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-inline-filter\",\n css: inlineFilteCss,\n window: targetWindow,\n });\n\n const filterAggregator = useMemo(() => new FilterAggregator(), []);\n const { columns = [], virtualColSpan = 0 } = useHeaderProps();\n\n const onCommit = useCallback<\n CommitHandler<HTMLElement, string | number | undefined>\n >(\n (evt, value = \"\") => {\n const fieldName = getFieldName(evt.target);\n const column = columns.find((c) => c.name === fieldName);\n if (column) {\n if (value === \"\") {\n if (filterAggregator.removeFilter(column)) {\n onChange(filterAggregator.filter);\n }\n } else {\n filterAggregator.addFilter(column, value);\n onChange(filterAggregator.filter);\n }\n }\n },\n [columns, filterAggregator, onChange],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLDivElement>>(\n (evt) => {\n if (evt.key === \"Enter\") {\n const el = evt.target as HTMLElement;\n const inputElement = el.querySelector(\"input\");\n inputElement?.focus();\n }\n },\n [],\n );\n\n return (\n <div {...htmlAttributes} className={classBase} role={ariaRole}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column, i) => (\n <div\n aria-colindex={i + 1}\n className={cx(`${classBase}-filter`, \"vuuTableCell\")}\n data-field={column.name}\n onKeyDown={handleKeyDown}\n key={column.name}\n style={{ width: column.width }}\n >\n {getDataItemEditControl({\n InputProps,\n TypeaheadProps,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InlineFilter.js","sources":["../../src/inline-filter/InlineFilter.tsx"],"sourcesContent":["import { getDataItemEditControl } from \"@vuu-ui/vuu-data-react\";\nimport { VirtualColSpan } from \"@vuu-ui/vuu-table\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { HTMLAttributes } from \"react\";\nimport cx from \"clsx\";\n\nimport inlineFilteCss from \"./InlineFilter.css\";\nimport { InputProps } from \"@salt-ds/core\";\nimport { TableSchemaTable } from \"@vuu-ui/vuu-data-types\";\nimport { VuuFilter } from \"@vuu-ui/vuu-protocol-types\";\nimport { BaseRowProps } from \"@vuu-ui/vuu-table-types\";\nimport { useInlineFilter } from \"./useInlineFilter\";\n\nconst classBase = \"vuuInlineFilter\";\n\nexport type FilterValueChangeHandler = (filter: VuuFilter) => void;\nexport interface InlineFilterProps\n extends Partial<BaseRowProps>,\n Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n onChange: FilterValueChangeHandler;\n table: TableSchemaTable;\n}\n\nconst InputProps: Partial<InputProps> = {\n inputProps: {\n placeholder: \"Filter value\",\n },\n variant: \"primary\",\n};\n\nconst TypeaheadProps = {\n highlightFirstSuggestion: false,\n};\n\nexport const InlineFilter = ({\n ariaRole,\n onChange,\n table,\n ...htmlAttributes\n}: InlineFilterProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-inline-filter\",\n css: inlineFilteCss,\n window: targetWindow,\n });\n\n const { columns, onCommit, onKeyDown, virtualColSpan } = useInlineFilter({\n onChange,\n });\n\n return (\n <div {...htmlAttributes} className={classBase} role={ariaRole}>\n <VirtualColSpan width={virtualColSpan} />\n {columns.map((column, i) => (\n <div\n aria-colindex={i + 1}\n className={cx(`${classBase}Cell`, \"vuuTableCell\", {\n \"vuuTableCell-right\": column.align === \"right\",\n })}\n data-field={column.name}\n onKeyDown={onKeyDown}\n key={column.name}\n role=\"cell\"\n style={{ width: column.width }}\n >\n {getDataItemEditControl({\n InputProps,\n TypeaheadProps,\n commitWhenCleared: true,\n dataDescriptor: column,\n onCommit,\n table,\n })}\n </div>\n ))}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAcA,MAAM,SAAY,GAAA,iBAAA,CAAA;AAUlB,MAAM,UAAkC,GAAA;AAAA,EACtC,UAAY,EAAA;AAAA,IACV,WAAa,EAAA,cAAA;AAAA,GACf;AAAA,EACA,OAAS,EAAA,SAAA;AACX,CAAA,CAAA;AAEA,MAAM,cAAiB,GAAA;AAAA,EACrB,wBAA0B,EAAA,KAAA;AAC5B,CAAA,CAAA;AAEO,MAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAyB,KAAA;AACvB,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAA,cAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,OAAS,EAAA,QAAA,EAAU,SAAW,EAAA,cAAA,KAAmB,eAAgB,CAAA;AAAA,IACvE,QAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,4BACG,KAAK,EAAA,EAAA,GAAG,gBAAgB,SAAW,EAAA,SAAA,EAAW,MAAM,QACnD,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,cAAA,EAAA,EAAe,OAAO,cAAgB,EAAA,CAAA;AAAA,IACtC,OAAQ,CAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,CACpB,qBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,iBAAe,CAAI,GAAA,CAAA;AAAA,QACnB,SAAW,EAAA,EAAA,CAAG,CAAG,EAAA,SAAS,QAAQ,cAAgB,EAAA;AAAA,UAChD,oBAAA,EAAsB,OAAO,KAAU,KAAA,OAAA;AAAA,SACxC,CAAA;AAAA,QACD,cAAY,MAAO,CAAA,IAAA;AAAA,QACnB,SAAA;AAAA,QAEA,IAAK,EAAA,MAAA;AAAA,QACL,KAAO,EAAA,EAAE,KAAO,EAAA,MAAA,CAAO,KAAM,EAAA;AAAA,QAE5B,QAAuB,EAAA,sBAAA,CAAA;AAAA,UACtB,UAAA;AAAA,UACA,cAAA;AAAA,UACA,iBAAmB,EAAA,IAAA;AAAA,UACnB,cAAgB,EAAA,MAAA;AAAA,UAChB,QAAA;AAAA,UACA,KAAA;AAAA,SACD,CAAA;AAAA,OAAA;AAAA,MAXI,MAAO,CAAA,IAAA;AAAA,KAaf,CAAA;AAAA,GACH,EAAA,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,37 @@
1
+ import { useHeaderProps, useEditableCell } from '@vuu-ui/vuu-table';
2
+ import { FilterAggregator, getFieldName } from '@vuu-ui/vuu-utils';
3
+ import { useMemo, useCallback } from 'react';
4
+
5
+ const useInlineFilter = ({
6
+ onChange
7
+ }) => {
8
+ const filterAggregator = useMemo(() => new FilterAggregator(), []);
9
+ const { columns = [], virtualColSpan = 0 } = useHeaderProps();
10
+ const handleCommit = useCallback(
11
+ (evt, value = "") => {
12
+ const fieldName = getFieldName(evt.target);
13
+ const column = columns.find((c) => c.name === fieldName);
14
+ if (column) {
15
+ if (value === "") {
16
+ if (filterAggregator.removeFilter(column)) {
17
+ onChange(filterAggregator.filter);
18
+ }
19
+ } else {
20
+ filterAggregator.addFilter(column, value);
21
+ onChange(filterAggregator.filter);
22
+ }
23
+ }
24
+ },
25
+ [columns, filterAggregator, onChange]
26
+ );
27
+ const { onKeyDown } = useEditableCell();
28
+ return {
29
+ columns,
30
+ onCommit: handleCommit,
31
+ onKeyDown,
32
+ virtualColSpan
33
+ };
34
+ };
35
+
36
+ export { useInlineFilter };
37
+ //# sourceMappingURL=useInlineFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInlineFilter.js","sources":["../../src/inline-filter/useInlineFilter.ts"],"sourcesContent":["import { useEditableCell, useHeaderProps } from \"@vuu-ui/vuu-table\";\nimport {\n CommitHandler,\n FilterAggregator,\n getFieldName,\n} from \"@vuu-ui/vuu-utils\";\nimport { useCallback, useMemo } from \"react\";\nimport { FilterValueChangeHandler } from \"./InlineFilter\";\n\nexport const useInlineFilter = ({\n onChange,\n}: {\n onChange: FilterValueChangeHandler;\n}) => {\n const filterAggregator = useMemo(() => new FilterAggregator(), []);\n const { columns = [], virtualColSpan = 0 } = useHeaderProps();\n\n const handleCommit = useCallback<\n CommitHandler<HTMLElement, string | number | undefined>\n >(\n (evt, value = \"\") => {\n const fieldName = getFieldName(evt.target);\n const column = columns.find((c) => c.name === fieldName);\n if (column) {\n if (value === \"\") {\n if (filterAggregator.removeFilter(column)) {\n onChange(filterAggregator.filter);\n }\n } else {\n filterAggregator.addFilter(column, value);\n onChange(filterAggregator.filter);\n }\n }\n },\n [columns, filterAggregator, onChange],\n );\n\n const { onKeyDown } = useEditableCell();\n\n return {\n columns,\n onCommit: handleCommit,\n onKeyDown,\n virtualColSpan,\n };\n};\n"],"names":[],"mappings":";;;;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,mBAAmB,OAAQ,CAAA,MAAM,IAAI,gBAAiB,EAAA,EAAG,EAAE,CAAA,CAAA;AACjE,EAAA,MAAM,EAAE,OAAU,GAAA,IAAI,cAAiB,GAAA,CAAA,KAAM,cAAe,EAAA,CAAA;AAE5D,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IAGnB,CAAC,GAAK,EAAA,KAAA,GAAQ,EAAO,KAAA;AACnB,MAAM,MAAA,SAAA,GAAY,YAAa,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACzC,MAAA,MAAM,SAAS,OAAQ,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,SAAS,CAAA,CAAA;AACvD,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,IAAI,UAAU,EAAI,EAAA;AAChB,UAAI,IAAA,gBAAA,CAAiB,YAAa,CAAA,MAAM,CAAG,EAAA;AACzC,YAAA,QAAA,CAAS,iBAAiB,MAAM,CAAA,CAAA;AAAA,WAClC;AAAA,SACK,MAAA;AACL,UAAiB,gBAAA,CAAA,SAAA,CAAU,QAAQ,KAAK,CAAA,CAAA;AACxC,UAAA,QAAA,CAAS,iBAAiB,MAAM,CAAA,CAAA;AAAA,SAClC;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,OAAS,EAAA,gBAAA,EAAkB,QAAQ,CAAA;AAAA,GACtC,CAAA;AAEA,EAAM,MAAA,EAAE,SAAU,EAAA,GAAI,eAAgB,EAAA,CAAA;AAEtC,EAAO,OAAA;AAAA,IACL,OAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,SAAA;AAAA,IACA,cAAA;AAAA,GACF,CAAA;AACF;;;;"}
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
- "version": "0.9.0",
2
+ "version": "0.9.2",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "devDependencies": {
7
- "@vuu-ui/vuu-data-types": "0.9.0",
8
- "@vuu-ui/vuu-protocol-types": "0.9.0",
9
- "@vuu-ui/vuu-table-types": "0.9.0",
10
- "@vuu-ui/vuu-filter-types": "0.9.0",
7
+ "@vuu-ui/vuu-data-types": "0.9.2",
8
+ "@vuu-ui/vuu-protocol-types": "0.9.2",
9
+ "@vuu-ui/vuu-table-types": "0.9.2",
10
+ "@vuu-ui/vuu-filter-types": "0.9.2",
11
11
  "@types/uuid": "^9.0.2"
12
12
  },
13
13
  "dependencies": {
14
- "@vuu-ui/vuu-data-react": "0.9.0",
15
- "@vuu-ui/vuu-filter-parser": "0.9.0",
16
- "@vuu-ui/vuu-popups": "0.9.0",
17
- "@vuu-ui/vuu-ui-controls": "0.9.0",
18
- "@vuu-ui/vuu-table": "0.9.0",
19
- "@vuu-ui/vuu-utils": "0.9.0",
14
+ "@vuu-ui/vuu-data-react": "0.9.2",
15
+ "@vuu-ui/vuu-filter-parser": "0.9.2",
16
+ "@vuu-ui/vuu-popups": "0.9.2",
17
+ "@vuu-ui/vuu-ui-controls": "0.9.2",
18
+ "@vuu-ui/vuu-table": "0.9.2",
19
+ "@vuu-ui/vuu-utils": "0.9.2",
20
20
  "@salt-ds/core": "1.34.0",
21
21
  "@salt-ds/styles": "0.2.1",
22
22
  "@salt-ds/window": "0.1.1",
@@ -4,7 +4,7 @@ import { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
4
4
  import { HTMLAttributes } from "react";
5
5
  import { QuickFilterProps } from "../quick-filters";
6
6
  import { FilterMode } from "./useFilterBar";
7
- export type FilterBarVariant = "custom-filters" | "quick-filters" | "full-filters";
7
+ export type FilterBarVariant = "custom-filters-only" | "quick-filters-only" | "full-filters";
8
8
  export interface FilterBarProps extends HTMLAttributes<HTMLDivElement> {
9
9
  QuickFilterProps?: Pick<QuickFilterProps, "quickFilterColumns" | "onChangeQuickFilterColumns">;
10
10
  /**
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ import { CommitHandler } from "@vuu-ui/vuu-utils";
3
+ import { FilterValueChangeHandler } from "./InlineFilter";
4
+ export declare const useInlineFilter: ({ onChange, }: {
5
+ onChange: FilterValueChangeHandler;
6
+ }) => {
7
+ columns: import("@vuu-ui/vuu-table-types").RuntimeColumnDescriptor[];
8
+ onCommit: CommitHandler<HTMLElement, string | number | undefined>;
9
+ onKeyDown: import("react").KeyboardEventHandler<HTMLDivElement>;
10
+ virtualColSpan: number;
11
+ };