@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.
- package/index.cjs.js +65 -133
- package/index.esm.js +68 -136
- package/package.json +2 -4
- package/src/lib/components/ResetFiltersButton.d.ts +3 -2
- package/src/lib/hooks/useFilterBar.d.ts +1 -1
- package/src/lib/hooks/useGroupFilters.d.ts +6 -2
- package/src/lib/types/FilterTypes.d.ts +5 -1
- package/src/translation.d.ts +2 -2
- package/translation.cjs.js +0 -3
- package/translation.cjs10.js +0 -3
- package/translation.cjs11.js +0 -3
- package/translation.cjs12.js +0 -3
- package/translation.cjs13.js +0 -3
- package/translation.cjs14.js +0 -3
- package/translation.cjs15.js +0 -3
- package/translation.cjs16.js +0 -3
- package/translation.cjs17.js +0 -3
- package/translation.cjs2.js +0 -3
- package/translation.cjs3.js +0 -3
- package/translation.cjs4.js +0 -3
- package/translation.cjs5.js +0 -3
- package/translation.cjs6.js +0 -3
- package/translation.cjs7.js +0 -3
- package/translation.cjs8.js +0 -3
- package/translation.cjs9.js +0 -3
- package/translation.esm.js +0 -3
- package/translation.esm10.js +0 -3
- package/translation.esm11.js +0 -3
- package/translation.esm12.js +0 -3
- package/translation.esm13.js +0 -3
- package/translation.esm14.js +0 -3
- package/translation.esm15.js +0 -3
- package/translation.esm16.js +0 -3
- package/translation.esm17.js +0 -3
- package/translation.esm2.js +0 -3
- package/translation.esm3.js +0 -3
- package/translation.esm4.js +0 -3
- package/translation.esm5.js +0 -3
- package/translation.esm6.js +0 -3
- package/translation.esm7.js +0 -3
- package/translation.esm8.js +0 -3
- package/translation.esm9.js +0 -3
- 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
|
|
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
|
|
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
|
-
|
|
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", {
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
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
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
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.
|
|
810
|
+
switch (filterBarConfig.appliedFilterKeys.length) {
|
|
879
811
|
case 0:
|
|
880
|
-
return t("filtersBar.
|
|
812
|
+
return t("filtersBar.appliedFiltersTooltip.none");
|
|
881
813
|
case 1:
|
|
882
|
-
return filterBarConfig.
|
|
814
|
+
return filterBarConfig.appliedFilterKeys[0]
|
|
883
815
|
? t("filtersBar.appliedFiltersTooltip.singular", {
|
|
884
|
-
filterName: filterBarConfig.getFilterTitle(filterBarConfig.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|