dont close label filter after select

This commit is contained in:
miloschwartz
2026-05-26 22:30:55 -07:00
parent 938e9b0d49
commit ae8599c723

View File

@@ -28,6 +28,14 @@ import { LABEL_COLORS } from "./labels-selector";
const MAX_VISIBLE_SUMMARY_LABELS = 3; const MAX_VISIBLE_SUMMARY_LABELS = 3;
function areSelectionsEqual(a: string[], b: string[]) {
if (a.length !== b.length) {
return false;
}
const setB = new Set(b);
return a.every((value) => setB.has(value));
}
type LabelColumnFilterButtonProps = { type LabelColumnFilterButtonProps = {
selectedValues: string[]; selectedValues: string[];
onSelectedValuesChange: (values: string[]) => void; onSelectedValuesChange: (values: string[]) => void;
@@ -44,6 +52,7 @@ export function LabelColumnFilterButton({
orgId orgId
}: LabelColumnFilterButtonProps) { }: LabelColumnFilterButtonProps) {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [draftValues, setDraftValues] = useState<string[]>(selectedValues);
const t = useTranslations(); const t = useTranslations();
const [labelSearchQuery, setlabelsSearchQuery] = useState(""); const [labelSearchQuery, setlabelsSearchQuery] = useState("");
@@ -57,10 +66,7 @@ export function LabelColumnFilterButton({
}) })
); );
const selectedSet = useMemo( const draftSet = useMemo(() => new Set(draftValues), [draftValues]);
() => new Set(selectedValues),
[selectedValues]
);
const selectedLabels = useMemo( const selectedLabels = useMemo(
() => () =>
@@ -105,15 +111,29 @@ export function LabelColumnFilterButton({
}, [selectedLabels]); }, [selectedLabels]);
function toggle(value: string) { function toggle(value: string) {
const next = selectedSet.has(value) setDraftValues((current) =>
? selectedValues.filter((v) => v !== value) current.includes(value)
: [...selectedValues, value]; ? current.filter((v) => v !== value)
onSelectedValuesChange(next); : [...current, value]
);
}
function handleOpenChange(nextOpen: boolean) {
if (nextOpen) {
setDraftValues(selectedValues);
setOpen(true);
return;
}
setOpen(false);
if (!areSelectionsEqual(draftValues, selectedValues)) {
onSelectedValuesChange(draftValues);
}
} }
return ( return (
<div className="flex items-center"> <div className="flex items-center">
<Popover open={open} onOpenChange={setOpen}> <Popover open={open} onOpenChange={handleOpenChange}>
<PopoverTrigger asChild> <PopoverTrigger asChild>
<Button <Button
variant="ghost" variant="ghost"
@@ -146,11 +166,10 @@ export function LabelColumnFilterButton({
<CommandList> <CommandList>
<CommandEmpty>{t("labelsNotFound")}</CommandEmpty> <CommandEmpty>{t("labelsNotFound")}</CommandEmpty>
<CommandGroup> <CommandGroup>
{selectedValues.length > 0 && ( {draftValues.length > 0 && (
<CommandItem <CommandItem
onSelect={() => { onSelect={() => {
onSelectedValuesChange([]); setDraftValues([]);
setOpen(false);
}} }}
className="text-muted-foreground" className="text-muted-foreground"
> >
@@ -169,7 +188,7 @@ export function LabelColumnFilterButton({
<CheckIcon <CheckIcon
className={cn( className={cn(
"mr-2 h-4 w-4", "mr-2 h-4 w-4",
selectedSet.has(label.name) draftSet.has(label.name)
? "opacity-100" ? "opacity-100"
: "opacity-0" : "opacity-0"
)} )}