import { Button } from "@/shared/components/ds/button"; import Link from "next/link"; import { CirclePlusIcon, ListFilter, UnlinkIcon, X } from "lucide-react"; import { SearchInput } from "./search-input"; import { Popover, PopoverContent, PopoverTrigger } from "@/shared/components/ui/popover"; import { useRouter, useSearchParams } from "next/navigation"; import { useState, useEffect } from "react"; import { Badge } from "@/shared/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/shared/components/ui/select"; import { useAuthSession } from "@/shared/hooks/use-session"; interface FilterOption { label: string; value: string; group: string; groupLabel: string; } interface SearchAndActionBarProps { searchValue: string; onChange: (e: React.ChangeEvent) => void; buttonLabel: string; buttonLink: string; placeholder?: string; selectedCount?: number; onBulkAction?: () => void; bulkLabel?: string; showBulkAction?: boolean; filterOptions?: FilterOption[]; } const SearchAndActionBar = ({ searchValue, onChange, buttonLabel, buttonLink, placeholder = "Masukkan kata kunci", selectedCount = 0, onBulkAction, bulkLabel = "Nonaktifkan", showBulkAction = false, filterOptions = [], }: SearchAndActionBarProps) => { const router = useRouter(); const searchParams = useSearchParams(); const [isFilterOpen, setIsFilterOpen] = useState(false); const [selectedFilters, setSelectedFilters] = useState([]); const { session } = useAuthSession(); const userRole = session?.user?.role; // Initialize filters from URL params useEffect(() => { const filterParam = searchParams.get("filter"); if (filterParam) { try { const filters = JSON.parse(filterParam); // Convert nested array format to flat array for internal state const flatFilters = Array.isArray(filters) ? filters.flatMap((f) => (Array.isArray(f) ? f : [f])) : []; setSelectedFilters(flatFilters); } catch { setSelectedFilters([]); } } }, [searchParams]); const handleFilterChange = (option: FilterOption) => { const filterValue = `${option.group}=${option.value}`; // If the filter is already selected, remove it if (selectedFilters.includes(filterValue)) { const newFilters = selectedFilters.filter((f) => f !== filterValue); setSelectedFilters(newFilters); updateUrlFilters(newFilters); } else { // If the filter is not selected, add it const newFilters = [...selectedFilters, filterValue]; setSelectedFilters(newFilters); updateUrlFilters(newFilters); } }; const removeFilter = (value: string) => { const newFilters = selectedFilters.filter((f) => f !== value); setSelectedFilters(newFilters); updateUrlFilters(newFilters); }; const updateUrlFilters = (filters: string[]) => { const newParams = new URLSearchParams(searchParams.toString()); if (filters.length > 0) { // Group filters by their group property const groupedFilters = filters.reduce((acc, filter) => { const [group] = filter.split("="); if (!acc[group]) { acc[group] = []; } acc[group].push(filter); return acc; }, {} as Record); // Convert grouped filters to array format const filterString = JSON.stringify(Object.values(groupedFilters)); newParams.set("filter", filterString); } else { newParams.delete("filter"); } router.push(`?${newParams.toString()}`); }; // Group filter options by their group property const groupedOptions = filterOptions.reduce((acc, option) => { const group = option.group; if (!acc[group]) { acc[group] = { label: option.groupLabel, options: [], }; } acc[group].options.push(option); return acc; }, {} as Record); return (
{filterOptions.length > 0 && (

Filter

{Object.entries(groupedOptions).map(([group, { label, options }]) => (
{label}
))}
)}
{showBulkAction && ( )} {userRole.name !== "data_viewer" && ( )}
{/* Active Filters */} {selectedFilters.length > 0 && (
{selectedFilters .filter((filter) => { const [key, value] = filter.split("="); return filterOptions.some((opt) => opt.group === key && opt.value === value); }) .map((filter) => { const [key, value] = filter.split("="); const option = filterOptions.find((opt) => opt.group === key && opt.value === value); return ( {option?.label || filter} ); })}
)}
); }; export default SearchAndActionBar;