'use client'; import * as SelectPrimitive from '@radix-ui/react-select'; import { CheckIcon, ChevronDownIcon } from 'lucide-react'; import * as React from 'react'; import { cn } from '@repo/shadcn/lib/utils'; function SelectSearchable({ options, onValueChange, placeholder, defaultValue, disabled, enableNoneOption = false, // New prop to enable or disable "Ninguno" }: { options: { value: string; label: string }[]; onValueChange: (value: string | null) => void; placeholder?: string; defaultValue?: string; disabled?: boolean; enableNoneOption?: boolean; }) { const [searchTerm, setSearchTerm] = React.useState(''); const filteredOptions = [ ...(enableNoneOption ? [{ value: 'null', label: 'Ninguno' }] : []), // Conditionally add "Ninguno" ...options, ].filter((option) => option.label.toLowerCase().includes(searchTerm.toLowerCase()), ); return ( onValueChange(value === 'null' ? null : value)} defaultValue={defaultValue} disabled={disabled} >
setSearchTerm(e.target.value)} className="border-input file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground aria-invalid:outline-destructive/60 aria-invalid:ring-destructive/20 dark:aria-invalid:outline-destructive dark:aria-invalid:ring-destructive/50 ring-ring/10 dark:ring-ring/20 dark:outline-ring/40 outline-ring/50 aria-invalid:border-destructive/60 dark:aria-invalid:border-destructive flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-4 focus-visible:outline-1 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:focus-visible:ring-[3px] aria-invalid:focus-visible:outline-none md:text-sm dark:aria-invalid:focus-visible:ring-4" />
{filteredOptions.map((option) => ( {option.label} ))}
); } export { SelectSearchable };