@trackunit/filters-filter-bar 0.0.504 → 0.0.508

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 (43) hide show
  1. package/index.cjs.js +65 -133
  2. package/index.esm.js +68 -136
  3. package/package.json +2 -4
  4. package/src/lib/components/ResetFiltersButton.d.ts +3 -2
  5. package/src/lib/hooks/useFilterBar.d.ts +1 -1
  6. package/src/lib/hooks/useGroupFilters.d.ts +6 -2
  7. package/src/lib/types/FilterTypes.d.ts +5 -1
  8. package/src/translation.d.ts +2 -2
  9. package/translation.cjs.js +0 -3
  10. package/translation.cjs10.js +0 -3
  11. package/translation.cjs11.js +0 -3
  12. package/translation.cjs12.js +0 -3
  13. package/translation.cjs13.js +0 -3
  14. package/translation.cjs14.js +0 -3
  15. package/translation.cjs15.js +0 -3
  16. package/translation.cjs16.js +0 -3
  17. package/translation.cjs17.js +0 -3
  18. package/translation.cjs2.js +0 -3
  19. package/translation.cjs3.js +0 -3
  20. package/translation.cjs4.js +0 -3
  21. package/translation.cjs5.js +0 -3
  22. package/translation.cjs6.js +0 -3
  23. package/translation.cjs7.js +0 -3
  24. package/translation.cjs8.js +0 -3
  25. package/translation.cjs9.js +0 -3
  26. package/translation.esm.js +0 -3
  27. package/translation.esm10.js +0 -3
  28. package/translation.esm11.js +0 -3
  29. package/translation.esm12.js +0 -3
  30. package/translation.esm13.js +0 -3
  31. package/translation.esm14.js +0 -3
  32. package/translation.esm15.js +0 -3
  33. package/translation.esm16.js +0 -3
  34. package/translation.esm17.js +0 -3
  35. package/translation.esm2.js +0 -3
  36. package/translation.esm3.js +0 -3
  37. package/translation.esm4.js +0 -3
  38. package/translation.esm5.js +0 -3
  39. package/translation.esm6.js +0 -3
  40. package/translation.esm7.js +0 -3
  41. package/translation.esm8.js +0 -3
  42. package/translation.esm9.js +0 -3
  43. package/src/lib/components/SearchFilterInline.d.ts +0 -21
package/index.cjs.js CHANGED
@@ -10,9 +10,7 @@ var reactCoreContextsApi = require('@trackunit/react-core-contexts-api');
10
10
  var reactComponents = require('@trackunit/react-components');
11
11
  var reactFormComponents = require('@trackunit/react-form-components');
12
12
  var reactDateAndTimeComponents = require('@trackunit/react-date-and-time-components');
13
- var cssClassVarianceUtilities = require('@trackunit/css-class-variance-utilities');
14
13
  var tailwindMerge = require('tailwind-merge');
15
- var zod = require('zod');
16
14
  var dequal = require('dequal');
17
15
  var isEqual = require('lodash/isEqual');
18
16
  var reduce = require('lodash/reduce');
@@ -107,12 +105,9 @@ var defaultTranslations = {
107
105
  "auditlog.filter.users": "Users",
108
106
  "filter.more.options.if.you.search.description": "Use search to refine results.",
109
107
  "filter.more.options.if.you.search.title": "Over {{count}} items found.",
110
- "filters.shared.clear": "clear",
111
- "filters.shared.clearAll": "clear all",
112
- "filters.shared.recentSearches": "Recent searches",
113
108
  "filtersBar.appliedFiltersTooltip.none": "No filters applied",
114
109
  "filtersBar.appliedFiltersTooltip.plural": "{{count}} filters applied:",
115
- "filtersBar.appliedFiltersTooltip.singular": "{{filterName}} filter applied",
110
+ "filtersBar.appliedFiltersTooltip.singular": "{{filterName}} filter",
116
111
  "filtersBar.closeFilter": "Close",
117
112
  "filtersBar.defaultAssetFilters.followedFilter.ALL": "All Assets",
118
113
  "filtersBar.defaultAssetFilters.followedFilter.allLabel": "All Assets",
@@ -143,6 +138,9 @@ var defaultTranslations = {
143
138
  "filtersBar.groups.SERVICE": "Service",
144
139
  "filtersBar.groups.SITES": "Sites",
145
140
  "filtersBar.groups.STATUS": "Status",
141
+ "filtersBar.hiddenFilters.plural": "{{count}} hidden filters",
142
+ "filtersBar.hiddenFilters.singular": "One hidden filter",
143
+ "filtersBar.hiddenFilters.toggleFilters": "Toggle filters visibility",
146
144
  "filtersBar.loading": "Loading...",
147
145
  "filtersBar.myNetworkGroup": "My Network",
148
146
  "filtersBar.resetFilter": "Reset",
@@ -602,7 +600,8 @@ const useStarredGroupFilters = (filterDefinitions, hiddenFilters) => {
602
600
  const keys = uniqueKeysFromGroups(filterDefinitions);
603
601
  return keys
604
602
  .map(key => ({
605
- key: t(`filtersBar.groups.${key}`),
603
+ key,
604
+ title: t(`filtersBar.groups.${key}`),
606
605
  filters: filterDefinitions.filter(rawFilter => rawFilter.group === key && hiddenFilters.includes(rawFilter.filterKey) === false),
607
606
  }))
608
607
  .filter(filter => filter.filters.length > 0);
@@ -686,7 +685,7 @@ const Filter = ({ filter, filterBarActions, filterState, }) => {
686
685
  setValue,
687
686
  filterBarActions,
688
687
  filterState,
689
- }) })) : (jsxRuntime.jsx(reactFilterComponents.Filter, { activeLabel: activeFilterText, dataTestId: `${filter.filterKey}-filter-button`, isActive: filterText().length > 0, title: filter.title, withStickyHeader: true, children: filter.component({
688
+ }) })) : (jsxRuntime.jsx(reactFilterComponents.Filter, { activeLabel: activeFilterText, dataTestId: `${filter.filterKey}-filter-button`, isActive: filterText().length > 0, popoverProps: { placement: "right-start" }, title: filter.title, withStickyHeader: true, children: filter.component({
690
689
  filterDefinition: filter,
691
690
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
692
691
  value: values,
@@ -701,88 +700,16 @@ const Filter = ({ filter, filterBarActions, filterState, }) => {
701
700
  *
702
701
  * @returns {ReactElement | null} The rendered ResetFiltersButton component, or null if no filters have been applied.
703
702
  */
704
- const ResetFiltersButton = ({ filtersHaveBeenApplied, resetFiltersToInitialState, }) => {
703
+ const ResetFiltersButton = ({ filtersHaveBeenApplied, resetFiltersToInitialState, dataTestId, className, }) => {
705
704
  const [t] = useTranslation();
706
705
  if (!filtersHaveBeenApplied) {
707
706
  return null;
708
707
  }
709
- return (jsxRuntime.jsx(reactComponents.Button, { dataTestId: "reset-filters-button", onClick: () => {
708
+ return (jsxRuntime.jsx(reactComponents.Button, { className: className, dataTestId: dataTestId !== null && dataTestId !== void 0 ? dataTestId : "reset-filters-button", onClick: () => {
710
709
  resetFiltersToInitialState();
711
710
  }, size: "small", variant: "ghost-neutral", children: t("filtersBar.resetFilters") }));
712
711
  };
713
712
 
714
- const MAX_RECENT_SEARCHES = 20;
715
- /**
716
- *
717
- */
718
- const SearchFilterInline = ({ filterBarActions, filterState, filter, className, dataTestId, }) => {
719
- const { logEvent } = reactCoreHooks.useAnalytics(FilterEvents);
720
- const searchElementRef = react.useRef(null);
721
- const geometry = reactComponents.useGeometry(searchElementRef);
722
- const filterValue = (filter === null || filter === void 0 ? void 0 : filter.filterKey) ? String(filterState.values[filter.filterKey]) : undefined;
723
- const [searchString, setSearchString] = react.useState(filterValue !== null && filterValue !== void 0 ? filterValue : "");
724
- const previousFilterValue = reactComponents.usePrevious(filterValue);
725
- reactComponents.useDebounce(searchString, 500, "both", debouncedSearchString => {
726
- if (filterValue === debouncedSearchString) {
727
- return;
728
- }
729
- apply({ value: debouncedSearchString, setRecent: false });
730
- });
731
- react.useEffect(() => {
732
- // Catch a change in filter value from outside the component and update the search string to match
733
- if (filterValue === searchString || previousFilterValue === filterValue) {
734
- return;
735
- }
736
- filterValue !== undefined && setSearchString(filterValue);
737
- }, [filterValue, previousFilterValue, searchString]);
738
- const [t] = useTranslation();
739
- const [recentSearches, setRecentSearches] = reactComponents.useLocalStorage({
740
- defaultState: [],
741
- key: "free-text-filter-recent-searches",
742
- schema: zod.z.array(zod.z.string()),
743
- });
744
- const apply = react.useCallback(({ value, wasPreviousSearch = false, setRecent = true, }) => {
745
- if (setRecent !== false) {
746
- setRecentSearches(prev => {
747
- const noDuplicatesRecent = prev.filter(r => r !== value);
748
- const cappedLengthRecent = noDuplicatesRecent.slice(0, MAX_RECENT_SEARCHES - 1);
749
- return [value, ...cappedLengthRecent];
750
- });
751
- }
752
- logEvent("Filters Applied - V2", {
753
- type: "free-text-search",
754
- value,
755
- additionalProperties: {
756
- wasPreviousSearch: Boolean(wasPreviousSearch),
757
- },
758
- });
759
- (filter === null || filter === void 0 ? void 0 : filter.filterKey) && filterBarActions.setStringValue(filter.filterKey, value);
760
- }, [filter === null || filter === void 0 ? void 0 : filter.filterKey, filterBarActions, logEvent, setRecentSearches]);
761
- return (jsxRuntime.jsxs(reactComponents.Popover, { activation: defaultActivation => ({ ...defaultActivation, keyboardHandlers: false }), dataTestId: dataTestId ? `${dataTestId}-popover` : undefined, placement: "bottom-start", children: [jsxRuntime.jsx(reactComponents.PopoverTrigger, { children: jsxRuntime.jsx(reactFormComponents.Search
762
- //TODO: [Buss] remove height restruction once baseinput sixes matches buttons
763
- , {
764
- //TODO: [Buss] remove height restruction once baseinput sixes matches buttons
765
- className: tailwindMerge.twMerge(className, "h-7"), fieldSize: "small", onChange: e => {
766
- const parsedValue = zod.z.string().safeParse(e.target.value);
767
- parsedValue.success ? setSearchString(parsedValue.data) : setSearchString("");
768
- }, onClear: () => setSearchString(""), onKeyDown: e => {
769
- if (e.key === "Enter") {
770
- apply({ value: searchString });
771
- }
772
- }, ref: searchElementRef, value: searchString }) }), recentSearches.length > 0 ? (jsxRuntime.jsx(reactComponents.PopoverContent, { children: jsxRuntime.jsx("div", { style: { minWidth: geometry.width }, children: jsxRuntime.jsxs(reactComponents.MenuList, { className: "overflow-hidden", children: [jsxRuntime.jsx(reactFilterComponents.FilterBody, { className: "max-w-none p-1", limitSize: true, children: jsxRuntime.jsx("ul", { className: "grid h-full gap-0.5", children: recentSearches.map((option, index) => (jsxRuntime.jsx(reactComponents.MenuItem, { className: "max-h-fit overflow-hidden", id: "free-text-search-filter-inline", label: option, onClick: () => {
773
- apply({ value: option, wasPreviousSearch: true });
774
- setRecentSearches(prev => {
775
- const noDuplicatesRecent = prev.filter(r => r !== option);
776
- const cappedLengthRecent = noDuplicatesRecent.slice(0, MAX_RECENT_SEARCHES - 1);
777
- return [option, ...cappedLengthRecent];
778
- });
779
- setSearchString(option);
780
- }, selected: option === filterValue, size: "small", suffix: jsxRuntime.jsx(reactComponents.Tooltip, { label: t("filters.shared.clear"), children: jsxRuntime.jsx(reactComponents.IconButton, { circular: true, icon: jsxRuntime.jsx(reactComponents.Icon, { name: "Trash", size: "small" }), onClick: e => {
781
- e.stopPropagation();
782
- setRecentSearches(prev => prev.filter(r => r !== option));
783
- }, size: "small", variant: "ghost-neutral" }) }) }, `${option}-${index}`))) }) }), jsxRuntime.jsxs("div", { className: "flex items-baseline justify-between gap-x-2 border-t-2 border-slate-300 px-2 py-0.5", children: [jsxRuntime.jsx(reactComponents.Text, { className: "py-0.5", size: "small", subtle: true, children: t("filters.shared.recentSearches") }), recentSearches.length > 1 ? (jsxRuntime.jsx(reactComponents.Button, { onClick: () => setRecentSearches([]), size: "small", variant: "ghost", children: t("filters.shared.clearAll") })) : null] })] }) }) })) : null] }));
784
- };
785
-
786
713
  /**
787
714
  * StarredFiltersMenu is a React component that displays a menu of starred filters within a filter bar.
788
715
  *
@@ -791,12 +718,13 @@ const SearchFilterInline = ({ filterBarActions, filterState, filter, className,
791
718
  const StarredFiltersMenu = ({ filterBarDefinition, updateStarredFilters, starredFilterKeys, hiddenFilters = [], className, dataTestId, }) => {
792
719
  const [t] = useTranslation();
793
720
  const { logEvent } = reactCoreHooks.useAnalytics(FilterEvents);
721
+ const numberOfShowDirectlyFilters = sharedUtils.objectValues(filterBarDefinition).filter(filter => filter.showDirectly).length; //TODO: this is a bit of a silly workaround to get the count to match without changing any other logic as I am pressed for time...but it works for now.🙈
794
722
  const hideInStarredMenu = react.useMemo(() => {
795
723
  return sharedUtils.objectValues(filterBarDefinition)
796
724
  .map(filter => {
797
725
  const showInStarredMenu = filter.showInStarredMenu ? filter.showInStarredMenu() : true;
798
726
  const showInFilterBar = filter.showInFilterBar ? filter.showInFilterBar() : true;
799
- return !showInStarredMenu || !showInFilterBar ? filter.filterKey : null;
727
+ return filter.showDirectly || !showInStarredMenu || !showInFilterBar ? filter.filterKey : null;
800
728
  })
801
729
  .filter(sharedUtils.truthy);
802
730
  }, [filterBarDefinition]);
@@ -804,23 +732,32 @@ const StarredFiltersMenu = ({ filterBarDefinition, updateStarredFilters, starred
804
732
  ...hideInStarredMenu,
805
733
  ...hiddenFilters,
806
734
  ]);
807
- return (jsxRuntime.jsxs(reactComponents.Popover, { placement: "bottom-start", children: [jsxRuntime.jsx(reactComponents.PopoverTrigger, { children: jsxRuntime.jsx(reactComponents.IconButton, { className: className, dataTestId: dataTestId !== null && dataTestId !== void 0 ? dataTestId : "starred-filters-menu", icon: jsxRuntime.jsx(reactComponents.Icon, { name: "Star", size: "small" }), size: "small", title: t("filtersBar.starredFiltersTitle"), variant: "secondary" }) }), jsxRuntime.jsx(reactComponents.PopoverContent, { children: jsxRuntime.jsx(reactComponents.MenuList, { className: "overflow-hidden", dataTestId: "starred-filters-menu-popover", children: jsxRuntime.jsx("div", { className: "max-h-[55vh] w-72 overflow-y-auto", children: filtersGrouped.map((group, idx) => {
735
+ const hiddenFiltersCount = filtersGrouped.map(group => group.filters).flat().length - starredFilterKeys.length + numberOfShowDirectlyFilters;
736
+ const getHiddenFiltersLabel = () => {
737
+ switch (hiddenFiltersCount) {
738
+ case 0:
739
+ return t("filtersBar.hiddenFilters.toggleFilters");
740
+ case 1:
741
+ return t("filtersBar.hiddenFilters.singular");
742
+ default:
743
+ return t("filtersBar.hiddenFilters.plural", { count: hiddenFiltersCount });
744
+ }
745
+ };
746
+ return (jsxRuntime.jsxs(reactComponents.Popover, { placement: "bottom-start", children: [jsxRuntime.jsx(reactComponents.PopoverTrigger, { children: jsxRuntime.jsx(reactComponents.Button, { className: className, dataTestId: dataTestId !== null && dataTestId !== void 0 ? dataTestId : "starred-filters-menu", size: "small", variant: "ghost", children: getHiddenFiltersLabel() }) }), jsxRuntime.jsx(reactComponents.PopoverContent, { children: jsxRuntime.jsx(reactComponents.MenuList, { className: "overflow-hidden", dataTestId: "starred-filters-menu-popover", children: jsxRuntime.jsx("div", { className: "max-h-[55dvh] w-72 overflow-y-auto px-3 pb-2", children: filtersGrouped.map((group, idx) => {
808
747
  const isLast = idx === filtersGrouped.length - 1;
809
- return (jsxRuntime.jsxs("div", { className: "mb-2", children: [jsxRuntime.jsx("div", { className: "mb-1 mt-2 flex px-2", children: jsxRuntime.jsx(reactComponents.Text, { dataTestId: "starred-filters-group-title", size: "small", subtle: true, uppercase: true, weight: "bold", children: group.key }) }), group.filters.map(filter => {
810
- return (jsxRuntime.jsxs("div", { className: "flex w-full cursor-pointer items-center justify-between rounded-sm px-2 py-0 transition hover:bg-neutral-50", "data-testid": `${filter.filterKey}-star-filter`, onClick: () => {
811
- updateStarredFilters(filter.filterKey);
812
- logEvent("Starring Filter - Toggled", {
813
- type: filter.filterKey,
814
- });
815
- }, children: [jsxRuntime.jsx(reactComponents.Text, { weight: "thick", children: filter.title }), jsxRuntime.jsx(reactComponents.StarButton, { onClick: e => {
816
- e.preventDefault();
817
- e.stopPropagation();
818
- updateStarredFilters(filter.filterKey);
819
- logEvent("Starring Filter - Toggled", {
820
- type: filter.filterKey,
821
- });
822
- }, starred: starredFilterKeys.includes(filter.filterKey) })] }, filter.filterKey));
823
- }), !isLast && jsxRuntime.jsx("div", { className: "mt-2 h-[1px] w-full bg-neutral-300" })] }, group.key));
748
+ return (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx(reactComponents.Text, { className: "pb-1 pt-2", dataTestId: "starred-filters-group-title", size: "small", subtle: true, uppercase: true, children: group.title }), jsxRuntime.jsx("div", { className: "grid gap-2", children: group.filters.map(filter => {
749
+ return !filter.isHidden ? (jsxRuntime.jsxs("div", { className: "grid-cols-min-fr grid cursor-pointer items-center gap-2 rounded-sm transition hover:bg-neutral-50", "data-testid": `${filter.filterKey}-star-filter`, onClick: () => {
750
+ updateStarredFilters(filter.filterKey);
751
+ logEvent("Starring Filter - Toggled", {
752
+ type: filter.filterKey,
753
+ });
754
+ }, children: [jsxRuntime.jsx(reactFormComponents.Toggle, { id: "visible-filters-toggle", onChange: () => {
755
+ updateStarredFilters(filter.filterKey);
756
+ logEvent("Starring Filter - Toggled", {
757
+ type: filter.filterKey,
758
+ });
759
+ }, size: "medium", toggled: starredFilterKeys.includes(filter.filterKey) }), jsxRuntime.jsx(reactComponents.Text, { children: filter.title })] }, filter.filterKey)) : null;
760
+ }) }), !isLast && jsxRuntime.jsx("div", { className: "mt-2 h-[1px] w-full bg-neutral-300" })] }, group.key));
824
761
  }) }) }) })] }));
825
762
  };
826
763
 
@@ -833,9 +770,6 @@ const StarredFiltersMenu = ({ filterBarDefinition, updateStarredFilters, starred
833
770
  const StarredFilters = ({ filterBarDefinition, filterBarConfig, disableCollapse, hiddenFilters = [], }) => {
834
771
  const [t] = useTranslation();
835
772
  const { isLg } = reactComponents.useViewportSize();
836
- return (jsxRuntime.jsxs("div", { className: cvaFiltersAndSearchContainer({ collapsed: !(isLg || disableCollapse) }), children: [isLg || disableCollapse ? (jsxRuntime.jsx(FilterSelection, { filterBarConfig: filterBarConfig, filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters })) : (jsxRuntime.jsxs(reactComponents.Popover, { placement: "bottom-start", children: [jsxRuntime.jsx(reactComponents.PopoverTrigger, { children: jsxRuntime.jsx("div", { children: jsxRuntime.jsxs(reactComponents.Tooltip, { label: jsxRuntime.jsx(FilterButtonTooltipLabel, { filterBarConfig: filterBarConfig }), children: [jsxRuntime.jsx(reactComponents.Button, { className: "@xs:flex hidden", prefix: jsxRuntime.jsx(reactComponents.Icon, { color: filterBarConfig.appliedFilters.length > 0 ? "primary" : undefined, name: "Funnel", size: "small" }), size: "small", variant: "secondary", children: t("filtersBar.filtersHeading") }), jsxRuntime.jsx(reactComponents.IconButton, { className: "@xs:hidden", icon: jsxRuntime.jsx(reactComponents.Icon, { color: filterBarConfig.appliedFilters.length > 0 ? "primary" : undefined, name: "Funnel", size: "small" }), size: "small", variant: "secondary" })] }) }) }), jsxRuntime.jsx(reactComponents.PopoverContent, { cellPadding: 100, children: jsxRuntime.jsx(reactComponents.Card, { children: jsxRuntime.jsx(reactComponents.CardBody, { children: jsxRuntime.jsx(FilterSelection, { filterBarConfig: filterBarConfig, filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters }) }) }) })] })), filterBarDefinition.search ? (jsxRuntime.jsx("div", { className: "flex w-full", children: jsxRuntime.jsx(SearchFilterInline, { className: "w-full max-w-80", filter: filterBarDefinition.search, filterBarActions: filterBarConfig, filterState: { values: filterBarConfig.values, setters: filterBarConfig.setters } }, "filter-search") })) : null] }));
837
- };
838
- const FilterSelection = ({ filterBarDefinition, filterBarConfig, hiddenFilters = [], className, }) => {
839
773
  const hideInFilterBar = react.useMemo(() => {
840
774
  return sharedUtils.objectValues(filterBarDefinition)
841
775
  .map(filter => {
@@ -848,44 +782,42 @@ const FilterSelection = ({ filterBarDefinition, filterBarConfig, hiddenFilters =
848
782
  ...hideInFilterBar,
849
783
  ...hiddenFilters,
850
784
  ]);
851
- return (jsxRuntime.jsxs("div", { className: tailwindMerge.twMerge([className, "flex-wrap", "items-center", "gap-3", "flex"]), "data-testid": "starred-filters", children: [jsxRuntime.jsx(StarredFiltersMenu, { filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters, starredFilterKeys: filterBarConfig.starredFilterKeys, updateStarredFilters: filterBarConfig.updateStarredFilters }), filterBarConfig.starredFilterKeys.length > 0 ? jsxRuntime.jsx("div", { className: "h-4 w-[1px] bg-slate-300" }) : null, filtersGrouped.map(group => group.filters
852
- .filter(filter => !hiddenFilters.includes(filter.filterKey))
853
- .map(filter => {
854
- const showMenuAnyway = filterBarConfig.filterHasChanged(filter.filterKey) &&
855
- filter.showInStarredMenu &&
856
- !filter.showInStarredMenu();
857
- if (filter.filterKey !== "search" &&
858
- (filterBarConfig.starredFilterKeys.includes(filter.filterKey) ||
859
- showMenuAnyway)) {
860
- return (jsxRuntime.jsx(react.Fragment, { children: jsxRuntime.jsx(Filter, { filter: filter, filterBarActions: filterBarConfig, filterState: { values: filterBarConfig.values, setters: filterBarConfig.setters } }, `filter-${filter.filterKey}`) }, filter.filterKey));
861
- }
862
- return null;
863
- })), jsxRuntime.jsx(ResetFiltersButton, { filtersHaveBeenApplied: filterBarConfig.appliedFilters.length > 0, resetFiltersToInitialState: filterBarConfig.resetFiltersToInitialState })] }));
785
+ const allFilters = filtersGrouped.map(group => group.filters).flat();
786
+ const starredFilters = allFilters.filter(filter => {
787
+ const showMenuAnyway = filterBarConfig.filterHasChanged(filter.filterKey) && filter.showInStarredMenu && !filter.showInStarredMenu();
788
+ return (filterBarConfig.starredFilterKeys.includes(filter.filterKey) &&
789
+ (showMenuAnyway || !filter.showDirectly));
790
+ });
791
+ const nonAppliedFilters = starredFilters.filter(filter => !filterBarConfig.appliedFilterKeys.includes(filter.filterKey));
792
+ const appliedFilters = starredFilters.filter(filter => filterBarConfig.appliedFilterKeys.includes(filter.filterKey));
793
+ const filtersInPopover = isLg
794
+ ? nonAppliedFilters.filter(filter => !filter.showDirectly)
795
+ : starredFilters.filter(filter => !filter.showDirectly);
796
+ const showDirectlyFilters = allFilters.filter(filter => filter.showDirectly);
797
+ return (jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [jsxRuntime.jsx(reactComponents.Popover, { placement: "bottom-start", children: modalState => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(reactComponents.PopoverTrigger, { children: jsxRuntime.jsx("div", { "data-testid": "starred-filters-menu-trigger", children: jsxRuntime.jsxs(reactComponents.Tooltip, { disabled: isLg || modalState.isOpen, label: jsxRuntime.jsx(FilterButtonTooltipLabel, { filterBarConfig: filterBarConfig }), children: [jsxRuntime.jsx(reactComponents.Button, { className: "@xs:flex hidden", prefix: jsxRuntime.jsx(reactComponents.Icon, { color: filterBarConfig.appliedFilterKeys.length > 0 ? "primary" : undefined, name: "Funnel", size: "small" }), size: "small", suffix: !isLg && filterBarConfig.appliedFilterKeys.length > 0
798
+ ? `(${filterBarConfig.appliedFilterKeys.length})`
799
+ : undefined, variant: "secondary", children: t("filtersBar.filtersHeading") }), jsxRuntime.jsx(reactComponents.IconButton, { className: "@xs:hidden", icon: jsxRuntime.jsx(reactComponents.Icon, { color: filterBarConfig.appliedFilterKeys.length > 0 ? "primary" : undefined, name: "Funnel", size: "small" }), size: "small", variant: "secondary" })] }) }) }), jsxRuntime.jsx(reactComponents.PopoverContent, { cellPadding: 100, children: jsxRuntime.jsxs(reactComponents.Card, { className: "max-h-[min(600px,_calc(100dvh-32px))] overflow-hidden", children: [filtersInPopover.length > 0 ? (jsxRuntime.jsx(reactComponents.CardBody, { density: "dense", children: jsxRuntime.jsx("div", { className: "flex h-full min-w-min flex-col gap-2", children: jsxRuntime.jsx(FiltersList, { filterBarConfig: filterBarConfig, filters: filtersInPopover }) }) })) : null, jsxRuntime.jsxs(reactComponents.CardFooter, { className: filtersInPopover.length === 0 ? "border-none" : undefined, density: "dense", children: [jsxRuntime.jsx(StarredFiltersMenu, { className: "mr-auto", filterBarDefinition: filterBarDefinition, hiddenFilters: hiddenFilters, starredFilterKeys: filterBarConfig.starredFilterKeys, updateStarredFilters: filterBarConfig.updateStarredFilters }), isLg ? null : (jsxRuntime.jsx(ResetFiltersButton, { filtersHaveBeenApplied: filterBarConfig.appliedFilterKeys.length > 0, resetFiltersToInitialState: filterBarConfig.resetFiltersToInitialState }))] })] }) })] })) }), showDirectlyFilters.length > 0 ? (jsxRuntime.jsx(FiltersList, { filterBarConfig: filterBarConfig, filters: showDirectlyFilters })) : null, isLg ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [appliedFilters.filter(filter => !filter.showDirectly).length > 0 ? (jsxRuntime.jsx("div", { className: "h-4 w-[1px] bg-slate-300" })) : null, jsxRuntime.jsx(FiltersList, { filterBarConfig: filterBarConfig, filters: appliedFilters }), jsxRuntime.jsx(ResetFiltersButton, { filtersHaveBeenApplied: filterBarConfig.appliedFilterKeys.length > 0, resetFiltersToInitialState: filterBarConfig.resetFiltersToInitialState })] })) : null] }));
800
+ };
801
+ const FiltersList = ({ filters, filterBarConfig }) => {
802
+ return filters.length === 0
803
+ ? null
804
+ : filters.map(filter => {
805
+ return (jsxRuntime.jsx(Filter, { filter: filter, filterBarActions: filterBarConfig, filterState: { values: filterBarConfig.values, setters: filterBarConfig.setters } }, `filter-${filter.filterKey}`));
806
+ });
864
807
  };
865
- const cvaFiltersAndSearchContainer = cssClassVarianceUtilities.cvaMerge(["grid", "gap-2", "w-full"], {
866
- variants: {
867
- collapsed: {
868
- true: ["grid-cols-min-fr"],
869
- false: ["grid-cols-[minmax(0,1fr)_300px]"],
870
- },
871
- },
872
- defaultVariants: {
873
- collapsed: false,
874
- },
875
- });
876
808
  const FilterButtonTooltipLabel = ({ filterBarConfig, }) => {
877
809
  const [t] = useTranslation();
878
- switch (filterBarConfig.appliedFilters.length) {
810
+ switch (filterBarConfig.appliedFilterKeys.length) {
879
811
  case 0:
880
- return t("filtersBar.filtersHeading");
812
+ return t("filtersBar.appliedFiltersTooltip.none");
881
813
  case 1:
882
- return filterBarConfig.appliedFilters[0]
814
+ return filterBarConfig.appliedFilterKeys[0]
883
815
  ? t("filtersBar.appliedFiltersTooltip.singular", {
884
- filterName: filterBarConfig.getFilterTitle(filterBarConfig.appliedFilters[0]),
816
+ filterName: filterBarConfig.getFilterTitle(filterBarConfig.appliedFilterKeys[0]),
885
817
  })
886
818
  : null; // should never happen though
887
819
  default:
888
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [t("filtersBar.appliedFiltersTooltip.plural", { count: filterBarConfig.appliedFilters.length }), jsxRuntime.jsx("ul", { className: "list-inside", children: filterBarConfig.appliedFilters.map((appliedFilterKey, index) => (jsxRuntime.jsx("li", { className: "list-disc", children: filterBarConfig.getFilterTitle(appliedFilterKey) }, index))) })] }));
820
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [t("filtersBar.appliedFiltersTooltip.plural", { count: filterBarConfig.appliedFilterKeys.length }), jsxRuntime.jsx("ul", { className: "list-inside", children: filterBarConfig.appliedFilterKeys.map((appliedFilterKey, index) => (jsxRuntime.jsx("li", { className: "list-disc", children: filterBarConfig.getFilterTitle(appliedFilterKey) }, index))) })] }));
889
821
  }
890
822
  };
891
823
 
@@ -902,7 +834,7 @@ const doNothing = (args) => { };
902
834
  const mockFilterBar = {
903
835
  filterBarConfig: {
904
836
  isFilterIncludedByKey: doNothing,
905
- appliedFilters: [],
837
+ appliedFilterKeys: [],
906
838
  arrayIncludesValue: doNothing,
907
839
  getFilterTitle: doNothing,
908
840
  getFilterBarName: doNothing,
@@ -1200,7 +1132,7 @@ const useFilterBar = ({ name, onValuesChange, filterBarDefinition, initialState,
1200
1132
  const values = filterBarConfig.values[key];
1201
1133
  return Boolean(values);
1202
1134
  },
1203
- get appliedFilters() {
1135
+ get appliedFilterKeys() {
1204
1136
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1205
1137
  const initialStateValues = filterBarConfig.initialState || {};
1206
1138
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition