fix: keep applied search filters in the order they were added

This commit is contained in:
Philipinho
2026-08-24 21:25:22 +01:00
parent da58bb382e
commit 99288ff8ad
@@ -54,6 +54,7 @@ export function SearchSpotlightFilters({
); );
const [selectedLabelIds, setSelectedLabelIds] = useState<string[]>([]); const [selectedLabelIds, setSelectedLabelIds] = useState<string[]>([]);
const [openedFilter, setOpenedFilter] = useState<string | null>(null); const [openedFilter, setOpenedFilter] = useState<string | null>(null);
const [visibleFilters, setVisibleFilters] = useState<string[]>([]);
const [workspace] = useAtom(workspaceAtom); const [workspace] = useAtom(workspaceAtom);
const { data: spacesData } = useGetSpacesQuery({ limit: 100 }); const { data: spacesData } = useGetSpacesQuery({ limit: 100 });
@@ -106,23 +107,33 @@ export function SearchSpotlightFilters({
} }
}; };
const showCreatorFilter = !!selectedCreatorId || openedFilter === "creator"; const onDemandFilters = [
const showLabelFilter = { key: "creator", label: t("Created by"), icon: IconUser, available: true },
contentType !== "attachment" && {
(selectedLabelIds.length > 0 || openedFilter === "labels"); key: "labels",
label: t("Labels"),
icon: IconTag,
available: contentType !== "attachment",
},
];
const addableFilters: { key: string; label: string; icon: typeof IconUser }[] = const isFilterVisible = (key: string) => {
[]; if (openedFilter === key) return true;
if (!showCreatorFilter) { if (key === "creator") return !!selectedCreatorId;
addableFilters.push({ if (key === "labels")
key: "creator", return contentType !== "attachment" && selectedLabelIds.length > 0;
label: t("Created by"), return false;
icon: IconUser, };
});
} const orderedVisibleFilters = visibleFilters.filter(isFilterVisible);
if (contentType !== "attachment" && !showLabelFilter) { const addableFilters = onDemandFilters.filter(
addableFilters.push({ key: "labels", label: t("Labels"), icon: IconTag }); (filter) => filter.available && !isFilterVisible(filter.key),
} );
const revealFilter = (key: string) => {
setVisibleFilters((prev) => [...prev.filter((k) => k !== key), key]);
setOpenedFilter(key);
};
return ( return (
<div className={classes.filtersContainer}> <div className={classes.filtersContainer}>
@@ -239,15 +250,20 @@ export function SearchSpotlightFilters({
</Menu.Dropdown> </Menu.Dropdown>
</Menu> </Menu>
{showCreatorFilter && ( {orderedVisibleFilters.map((filterKey) => {
if (filterKey === "creator") {
return (
<CreatorFilterMenu <CreatorFilterMenu
key="creator"
value={selectedCreatorId} value={selectedCreatorId}
onChange={handleCreatorSelect} onChange={handleCreatorSelect}
position="bottom-start" position="bottom-start"
width={250} width={250}
zIndex={getDefaultZIndex("max")} zIndex={getDefaultZIndex("max")}
opened={openedFilter === "creator"} opened={openedFilter === "creator"}
onOpenChange={(opened) => setOpenedFilter(opened ? "creator" : null)} onOpenChange={(opened) =>
setOpenedFilter(opened ? "creator" : null)
}
> >
<Button <Button
variant="subtle" variant="subtle"
@@ -263,17 +279,22 @@ export function SearchSpotlightFilters({
: `${t("Created by")}: ${t("Anyone")}`} : `${t("Created by")}: ${t("Anyone")}`}
</Button> </Button>
</CreatorFilterMenu> </CreatorFilterMenu>
)} );
}
{showLabelFilter && ( if (filterKey === "labels") {
return (
<LabelFilterMenu <LabelFilterMenu
key="labels"
value={selectedLabelIds} value={selectedLabelIds}
onChange={handleLabelsSelect} onChange={handleLabelsSelect}
position="bottom-start" position="bottom-start"
width={250} width={250}
zIndex={getDefaultZIndex("max")} zIndex={getDefaultZIndex("max")}
opened={openedFilter === "labels"} opened={openedFilter === "labels"}
onOpenChange={(opened) => setOpenedFilter(opened ? "labels" : null)} onOpenChange={(opened) =>
setOpenedFilter(opened ? "labels" : null)
}
> >
<Button <Button
variant="subtle" variant="subtle"
@@ -289,7 +310,11 @@ export function SearchSpotlightFilters({
: t("Labels")} : t("Labels")}
</Button> </Button>
</LabelFilterMenu> </LabelFilterMenu>
)} );
}
return null;
})}
{addableFilters.length > 0 && ( {addableFilters.length > 0 && (
<Menu <Menu
@@ -316,7 +341,7 @@ export function SearchSpotlightFilters({
<Menu.Item <Menu.Item
key={filter.key} key={filter.key}
leftSection={<filter.icon size={16} />} leftSection={<filter.icon size={16} />}
onClick={() => setOpenedFilter(filter.key)} onClick={() => revealFilter(filter.key)}
> >
{filter.label} {filter.label}
</Menu.Item> </Menu.Item>