mirror of
https://github.com/docmost/docmost.git
synced 2026-08-25 15:57:11 +08:00
fix: keep applied search filters in the order they were added
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user