{"version":3,"sources":["../components/form/searchable-select.tsx"],"sourcesContent":["\"use client\";\nimport React from 'react';\nimport _kebabCase from 'lodash-es/kebabCase';\nimport _isString from 'lodash-es/isString';\nimport { cn } from '../../utils/ui';\nimport { Label } from '../ui/label';\nimport { Button } from '../ui/button';\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '../ui/command';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { Check, ChevronsUpDown } from 'lucide-react';\n\nexport interface SelectOption {\n  label: string;\n  value: string;\n}\n\nfunction listToSelectOptions(items: string[]) {\n  return items.map((item) => {\n    return { label: item, value: item };\n  });\n}\n\nexport interface FormSearchableSelectProps {\n  id?: string;\n  name: string;\n  label?: string;\n  placeholder?: string;\n  data: SelectOption[] | string[];\n  defaultValue?: string;\n  value?: string;\n  onChange: (value?: string) => void;\n  classNames?: {\n    wrapper?: string;\n    label?: string;\n    input?: string;\n  };\n  required?: boolean;\n  disabled?: boolean;\n}\n\nexport function FormSearchableSelect({\n  id,\n  name,\n  label,\n  placeholder = '',\n  data,\n  defaultValue,\n  value,\n  onChange,\n  classNames,\n  required,\n  disabled,\n}: FormSearchableSelectProps) {\n  let _options: SelectOption[] = [];\n\n  if (data.length > 0) {\n    if (_isString(data[0])) {\n      _options = listToSelectOptions(data as string[]);\n    } else {\n      _options = data as SelectOption[];\n    }\n  }\n\n  if (!id) id = _kebabCase(name);\n\n  const [open, setOpen] = React.useState(false);\n  const [selectedValue, setSelectedValue] = React.useState(value ?? defaultValue ?? '');\n\n  React.useEffect(() => {\n    setSelectedValue(value ?? defaultValue ?? '');\n  }, [value, defaultValue]);\n\n  const handleSelect = (currentValue: string) => {\n    const newValue = currentValue === selectedValue ? '' : currentValue;\n    setSelectedValue(newValue);\n    onChange(newValue);\n    setOpen(false);\n  };\n\n  return (\n    <div className={cn('$form-searchable-select space-y-1', classNames?.wrapper)}>\n      {label && (\n        <Label htmlFor={id} className={classNames?.label} required={required}>\n          {label}\n        </Label>\n      )}\n\n      <Popover open={open} onOpenChange={setOpen}>\n        <PopoverTrigger asChild>\n          <Button\n            variant=\"secondary\"\n            appearance=\"outline\"\n            role=\"combobox\"\n            aria-expanded={open}\n            disabled={disabled}\n            className={cn('w-full justify-between border-input!', classNames?.input)}\n          >\n            {selectedValue ? _options.find((opt) => opt.value === selectedValue)?.label : placeholder || 'Select...'}\n            <ChevronsUpDown className=\"opacity-50\" />\n          </Button>\n        </PopoverTrigger>\n\n        <PopoverContent className=\"w-full p-0\">\n          <Command>\n            <CommandInput placeholder={`Search ${label ?? 'option'}...`} className=\"h-9\" />\n            <CommandList>\n              <CommandEmpty>No option found.</CommandEmpty>\n              <CommandGroup>\n                {_options.map((option) => (\n                  <CommandItem key={option.value} value={option.value} onSelect={handleSelect}>\n                    {option.label}\n                    <Check className={cn('ml-auto', selectedValue === option.value ? 'opacity-100' : 'opacity-0')} />\n                  </CommandItem>\n                ))}\n              </CommandGroup>\n            </CommandList>\n          </Command>\n        </PopoverContent>\n      </Popover>\n    </div>\n  );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,WAAW;AAClB,OAAO,gBAAgB;AACvB,OAAO,eAAe;AAMtB,SAAS,OAAO,sBAAsB;AAOtC,SAAS,oBAAoB,OAAiB;AAC5C,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,WAAO,EAAE,OAAO,MAAM,OAAO,KAAK;AAAA,EACpC,CAAC;AACH;AAoBO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AApD9B;AAqDE,MAAI,WAA2B,CAAC;AAEhC,MAAI,KAAK,SAAS,GAAG;AACnB,QAAI,UAAU,KAAK,CAAC,CAAC,GAAG;AACtB,iBAAW,oBAAoB,IAAgB;AAAA,IACjD,OAAO;AACL,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,MAAI,CAAC,GAAI,MAAK,WAAW,IAAI;AAE7B,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,KAAK;AAC5C,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,UAAS,6BAAS,iBAAT,YAAyB,EAAE;AAEpF,QAAM,UAAU,MAAM;AApExB,QAAAA;AAqEI,sBAAiBA,MAAA,wBAAS,iBAAT,OAAAA,MAAyB,EAAE;AAAA,EAC9C,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,QAAM,eAAe,CAAC,iBAAyB;AAC7C,UAAM,WAAW,iBAAiB,gBAAgB,KAAK;AACvD,qBAAiB,QAAQ;AACzB,aAAS,QAAQ;AACjB,YAAQ,KAAK;AAAA,EACf;AAEA,SACE,oCAAC,SAAI,WAAW,GAAG,qCAAqC,yCAAY,OAAO,KACxE,SACC,oCAAC,SAAM,SAAS,IAAI,WAAW,yCAAY,OAAO,YAC/C,KACH,GAGF,oCAAC,WAAQ,MAAY,cAAc,WACjC,oCAAC,kBAAe,SAAO,QACrB;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,YAAW;AAAA,MACX,MAAK;AAAA,MACL,iBAAe;AAAA,MACf;AAAA,MACA,WAAW,GAAG,wCAAwC,yCAAY,KAAK;AAAA;AAAA,IAEtE,iBAAgB,cAAS,KAAK,CAAC,QAAQ,IAAI,UAAU,aAAa,MAAlD,mBAAqD,QAAQ,eAAe;AAAA,IAC7F,oCAAC,kBAAe,WAAU,cAAa;AAAA,EACzC,CACF,GAEA,oCAAC,kBAAe,WAAU,gBACxB,oCAAC,eACC,oCAAC,gBAAa,aAAa,UAAU,wBAAS,QAAQ,OAAO,WAAU,OAAM,GAC7E,oCAAC,mBACC,oCAAC,oBAAa,kBAAgB,GAC9B,oCAAC,oBACE,SAAS,IAAI,CAAC,WACb,oCAAC,eAAY,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,UAAU,gBAC5D,OAAO,OACR,oCAAC,SAAM,WAAW,GAAG,WAAW,kBAAkB,OAAO,QAAQ,gBAAgB,WAAW,GAAG,CACjG,CACD,CACH,CACF,CACF,CACF,CACF,CACF;AAEJ;","names":["_a"]}