import { useMemo, useState } from "react"; import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; import { cn } from "@app/lib/cn"; import { dataTableFilterPopoverContentClassName } from "@app/lib/dataTableFilterPopover"; import { CheckIcon, Funnel } from "lucide-react"; import { SiteOnlineStatus, type Selectedsite } from "./site-selector"; import { Button } from "./ui/button"; import { useTranslations } from "next-intl"; import { Badge } from "./ui/badge"; import { orgQueries } from "@app/lib/queries"; import { useQuery } from "@tanstack/react-query"; import { useDebounce } from "use-debounce"; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "./ui/command"; export type SitesColumnFilterButtonProps = { selectedSiteId: number | null; onValueChange: (value: number | undefined) => void; orgId: string; }; export function SitesColumnFilterButton({ selectedSiteId, onValueChange, orgId }: SitesColumnFilterButtonProps) { const [open, setOpen] = useState(false); const t = useTranslations(); const [siteSearchQuery, setSiteSearchQuery] = useState(""); const [debouncedQuery] = useDebounce(siteSearchQuery, 150); const { data: sites = [] } = useQuery( orgQueries.sites({ orgId, query: debouncedQuery, perPage: 500 }) ); const selectedSite = useMemo(() => { let selected = undefined; if (selectedSiteId) { selected = sites.find((site) => site.siteId === selectedSiteId) ?? { siteId: Number(selectedSiteId), name: t("standaloneHcFilterSiteIdFallback", { id: Number(selectedSiteId) }), type: "newt" }; } return selected; }, [selectedSiteId, sites]); // always include the selected site in the list of sites shown const sitesShown = useMemo(() => { const allSites: Array = [...sites]; if ( debouncedQuery.trim().length === 0 && selectedSite && !allSites.find((site) => site.siteId === selectedSite?.siteId) ) { allSites.unshift(selectedSite); } return allSites; }, [debouncedQuery, sites, selectedSite]); return ( setSiteSearchQuery(v)} /> {t("siteNotFound")} {selectedSite && ( { onValueChange(undefined); }} className="text-muted-foreground" > {t("accessFilterClear")} )} {sitesShown.map((site) => ( { onValueChange(site.siteId); }} >
{site.name} {site.online != null && ( )}
))}
); }