{"version":3,"file":"OptionsDropdown.mjs","sources":["../../../../src/components/Combobox/OptionsDropdown/OptionsDropdown.tsx"],"sourcesContent":["import cx from 'clsx';\nimport { CheckIcon } from '../../Checkbox';\nimport { ScrollArea, ScrollAreaProps } from '../../ScrollArea/ScrollArea';\nimport { Combobox } from '../Combobox';\nimport { ComboboxItem, ComboboxLikeRenderOptionInput, ComboboxParsedItem } from '../Combobox.types';\nimport { defaultOptionsFilter, FilterOptionsInput } from './default-options-filter';\nimport { isEmptyComboboxData } from './is-empty-combobox-data';\nimport { isOptionsGroup } from './is-options-group';\nimport { validateOptions } from './validate-options';\nimport {\n  ComboboxDropdownOptionsDropdownCheckIconStyle,\n  ComboboxOptionsDropdownOptionStyle,\n} from '../Combobox.css';\n\nexport type OptionsFilter = (input: FilterOptionsInput) => ComboboxParsedItem[];\n\nexport interface OptionsGroup {\n  group: string;\n  items: ComboboxItem[];\n}\n\nexport type OptionsData = (ComboboxItem | OptionsGroup)[];\n\ninterface OptionProps {\n  data: ComboboxItem | OptionsGroup;\n  withCheckIcon?: boolean;\n  value?: string | string[] | null;\n  checkIconPosition?: 'left' | 'right';\n  unstyled: boolean | undefined;\n  renderOption?: (input: ComboboxLikeRenderOptionInput<any>) => React.ReactNode;\n}\n\nfunction isValueChecked(value: string | string[] | undefined | null, optionValue: string) {\n  return Array.isArray(value) ? value.includes(optionValue) : value === optionValue;\n}\n\nfunction Option({\n  data,\n  withCheckIcon,\n  value,\n  checkIconPosition,\n  unstyled,\n  renderOption,\n}: OptionProps) {\n  if (!isOptionsGroup(data)) {\n    const checked = isValueChecked(value, data.value);\n    const check = withCheckIcon && checked && (\n      <CheckIcon className={ComboboxDropdownOptionsDropdownCheckIconStyle} />\n    );\n\n    const defaultContent = (\n      <>\n        {checkIconPosition === 'left' && check}\n        <span>{data.label}</span>\n        {checkIconPosition === 'right' && check}\n      </>\n    );\n\n    return (\n      <Combobox.Option\n        value={data.value}\n        disabled={data.disabled}\n        className={cx({ [ComboboxOptionsDropdownOptionStyle]: !unstyled })}\n        data-reverse={checkIconPosition === 'right' || undefined}\n        data-checked={checked || undefined}\n        aria-selected={checked}\n        active={checked}\n      >\n        {typeof renderOption === 'function'\n          ? renderOption({ option: data, checked })\n          : defaultContent}\n      </Combobox.Option>\n    );\n  }\n\n  const options = data.items.map((item) => (\n    <Option\n      data={item}\n      value={value}\n      key={item.value}\n      unstyled={unstyled}\n      withCheckIcon={withCheckIcon}\n      checkIconPosition={checkIconPosition}\n      renderOption={renderOption}\n    />\n  ));\n\n  return <Combobox.Group label={data.group}>{options}</Combobox.Group>;\n}\n\nexport interface OptionsDropdownProps {\n  data: OptionsData;\n  filter: OptionsFilter | undefined;\n  search: string | undefined;\n  limit: number | undefined;\n  withScrollArea: boolean | undefined;\n  maxDropdownHeight: number | string | undefined;\n  hidden?: boolean;\n  hiddenWhenEmpty?: boolean;\n  filterOptions?: boolean;\n  withCheckIcon?: boolean;\n  value?: string | string[] | null;\n  checkIconPosition?: 'left' | 'right';\n  nothingFoundMessage?: React.ReactNode;\n  unstyled: boolean | undefined;\n  labelId: string | undefined;\n  'aria-label': string | undefined;\n  renderOption?: (input: ComboboxLikeRenderOptionInput<any>) => React.ReactNode;\n  scrollAreaProps: ScrollAreaProps | undefined;\n}\n\nexport function OptionsDropdown({\n  data,\n  hidden,\n  hiddenWhenEmpty,\n  filter,\n  search,\n  limit,\n  maxDropdownHeight,\n  withScrollArea = true,\n  filterOptions = true,\n  withCheckIcon = false,\n  value,\n  checkIconPosition,\n  nothingFoundMessage,\n  unstyled,\n  labelId,\n  renderOption,\n  scrollAreaProps,\n  'aria-label': ariaLabel,\n}: OptionsDropdownProps) {\n  validateOptions(data);\n\n  const shouldFilter = typeof search === 'string';\n  const filteredData = shouldFilter\n    ? (filter || defaultOptionsFilter)({\n        options: data,\n        search: filterOptions ? search : '',\n        limit: limit ?? Infinity,\n      })\n    : data;\n  const isEmpty = isEmptyComboboxData(filteredData);\n\n  const options = filteredData.map((item) => (\n    <Option\n      data={item}\n      key={isOptionsGroup(item) ? item.group : item.value}\n      withCheckIcon={withCheckIcon}\n      value={value}\n      checkIconPosition={checkIconPosition}\n      unstyled={unstyled}\n      renderOption={renderOption}\n    />\n  ));\n\n  return (\n    <Combobox.Dropdown hidden={hidden || (hiddenWhenEmpty && isEmpty)}>\n      <Combobox.Options labelledBy={labelId} aria-label={ariaLabel}>\n        {withScrollArea ? (\n          <ScrollArea.Autosize\n            mah={maxDropdownHeight ?? 220}\n            type=\"scroll\"\n            scrollbarSize=\"var(--combobox-padding)\"\n            offsetScrollbars=\"y\"\n            {...scrollAreaProps}\n          >\n            {options}\n          </ScrollArea.Autosize>\n        ) : (\n          options\n        )}\n        {isEmpty && nothingFoundMessage && <Combobox.Empty>{nothingFoundMessage}</Combobox.Empty>}\n      </Combobox.Options>\n    </Combobox.Dropdown>\n  );\n}\n"],"names":[],"mappings":"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"}