'use client'; import { Check, ChevronsUpDown, X } from 'lucide-react'; import * as React from 'react'; import { Button } from '@/components/ui/button'; import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from '@/components/ui/command'; import { Popover, PopoverContent, PopoverTrigger, } from '@/components/ui/popover'; import { cn } from '@/lib/utils'; export interface MultiSelectOption { value: string; label: string; } interface MultiSelectProps { options: MultiSelectOption[]; selected: string[]; onChange: (selected: string[]) => void; placeholder?: string; emptyText?: string; searchPlaceholder?: string; className?: string; } export function MultiSelect({ options, selected, onChange, placeholder = 'Select items...', emptyText = 'No results found.', searchPlaceholder = 'Search...', className, }: MultiSelectProps) { const [open, setOpen] = React.useState(false); const handleSelect = (value: string) => { const newSelected = selected.includes(value) ? selected.filter((item) => item !== value) : [...selected, value]; onChange(newSelected); }; const handleRemove = (value: string, e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); onChange(selected.filter((item) => item !== value)); }; const selectedLabels = options .filter((option) => selected.includes(option.value)) .map((option) => option.label); return ( {emptyText} {options.map((option) => { const isSelected = selected.includes(option.value); return ( handleSelect(option.value)} className="cursor-pointer dark:hover:bg-[#383838]" >
{isSelected && }
{option.label}
); })}
); }