{"version":3,"file":"Combobox.mjs","sources":["../../../../src/components/Combobox/Combobox.tsx"],"sourcesContent":["import { cx } from '@emotion/css';\nimport { useVirtualizer, type Range } from '@tanstack/react-virtual';\nimport { useCombobox } from 'downshift';\nimport { useCallback, useId, useMemo } from 'react';\n\nimport { useStyles2 } from '../../themes';\nimport { t } from '../../utils/i18n';\nimport { Icon } from '../Icon/Icon';\nimport { AutoSizeInput } from '../Input/AutoSizeInput';\nimport { Input, Props as InputProps } from '../Input/Input';\nimport { Portal } from '../Portal/Portal';\n\nimport { ComboboxList } from './ComboboxList';\nimport { itemToString } from './filter';\nimport { getComboboxStyles, MENU_OPTION_HEIGHT, MENU_OPTION_HEIGHT_DESCRIPTION } from './getComboboxStyles';\nimport { ComboboxOption } from './types';\nimport { useComboboxFloat } from './useComboboxFloat';\nimport { useOptions } from './useOptions';\nimport { isNewGroup } from './utils';\n\n// TODO: It would be great if ComboboxOption[\"label\"] was more generic so that if consumers do pass it in (for async),\n// then the onChange handler emits ComboboxOption with the label as non-undefined.\nexport interface ComboboxBaseProps<T extends string | number>\n  extends Pick<\n    InputProps,\n    'placeholder' | 'autoFocus' | 'id' | 'aria-labelledby' | 'disabled' | 'loading' | 'invalid'\n  > {\n  /**\n   * An `X` appears in the UI, which clears the input and sets the value to `null`. Do not use if you have no `null` case.\n   */\n  isClearable?: boolean;\n  /**\n   * Allows the user to set a value which is not in the list of options.\n   */\n  createCustomValue?: boolean;\n\n  /**\n   * An array of options, or a function that returns a promise resolving to an array of options.\n   * If a function, it will be called when the menu is opened and on keypress with the current search query.\n   */\n  options: Array<ComboboxOption<T>> | ((inputValue: string) => Promise<Array<ComboboxOption<T>>>);\n\n  /**\n   * onChange handler is called with the newly selected option.\n   */\n  onChange: (option: ComboboxOption<T>) => void;\n\n  /**\n   * Current selected value. Most consumers should pass a scalar value (string | number). However, sometimes with Async\n   * it may be better to pass in an Option with a label to display.\n   */\n  value?: T | ComboboxOption<T> | null;\n\n  /**\n   * Defaults to full width of container. Number is a multiple of the spacing unit. 'auto' will size the input to the content.\n   * */\n  width?: number | 'auto';\n\n  ['data-testid']?: string;\n\n  /**\n   * Called when the input loses focus.\n   */\n  onBlur?: () => void;\n}\n\ntype ClearableConditionals<T extends number | string> =\n  | {\n      /**\n       * Allow the user to clear the selected value. `null` is emitted from the onChange handler\n       */\n      isClearable: true;\n      /**\n       * The onChange handler is called with `null` when clearing the Combobox.\n       */\n      onChange: (option: ComboboxOption<T> | null) => void;\n    }\n  | { isClearable?: false; onChange: (option: ComboboxOption<T>) => void };\n\nexport type AutoSizeConditionals =\n  | {\n      width: 'auto';\n      /**\n       * Needs to be set when width is 'auto' to prevent the input from shrinking too much\n       */\n      minWidth: number;\n      /**\n       * Recommended to set when width is 'auto' to prevent the input from growing too much.\n       */\n      maxWidth?: number;\n    }\n  | {\n      width?: number;\n      minWidth?: never;\n      maxWidth?: never;\n    };\n\nexport type ComboboxProps<T extends string | number> = ComboboxBaseProps<T> &\n  AutoSizeConditionals &\n  ClearableConditionals<T>;\n\nconst noop = () => {};\n\nexport const VIRTUAL_OVERSCAN_ITEMS = 4;\n\n/**\n * A performant Select replacement.\n *\n * @alpha\n */\nexport const Combobox = <T extends string | number>(props: ComboboxProps<T>) => {\n  const {\n    options: allOptions,\n    onChange,\n    value: valueProp,\n    placeholder: placeholderProp,\n    isClearable = false,\n    createCustomValue = false,\n    id,\n    width,\n    minWidth,\n    maxWidth,\n    'aria-labelledby': ariaLabelledBy,\n    'data-testid': dataTestId,\n    autoFocus,\n    onBlur,\n    disabled,\n    loading,\n    invalid,\n  } = props;\n\n  // Value can be an actual scalar Value (string or number), or an Option (value + label), so\n  // get a consistent Value from it\n  const value = typeof valueProp === 'object' ? valueProp?.value : valueProp;\n  const baseId = useId().replace(/:/g, '--');\n\n  const {\n    options: filteredOptions,\n    groupStartIndices,\n    updateOptions,\n    asyncLoading,\n    asyncError,\n  } = useOptions(props.options, createCustomValue);\n  const isAsync = typeof allOptions === 'function';\n\n  const selectedItemIndex = useMemo(() => {\n    if (isAsync) {\n      return null;\n    }\n\n    if (valueProp === undefined || valueProp === null) {\n      return null;\n    }\n\n    const index = allOptions.findIndex((option) => option.value === value);\n    if (index === -1) {\n      return null;\n    }\n\n    return index;\n  }, [valueProp, allOptions, value, isAsync]);\n\n  const selectedItem = useMemo(() => {\n    if (valueProp === undefined || valueProp === null) {\n      return null;\n    }\n\n    if (selectedItemIndex !== null && !isAsync) {\n      return allOptions[selectedItemIndex];\n    }\n\n    return typeof valueProp === 'object' ? valueProp : { value: valueProp, label: valueProp.toString() };\n  }, [selectedItemIndex, isAsync, valueProp, allOptions]);\n\n  const menuId = `${baseId}-downshift-menu`;\n  const labelId = `${baseId}-downshift-label`;\n\n  const styles = useStyles2(getComboboxStyles);\n\n  // Injects the group header for the first rendered item into the range to render.\n  // Accepts the range that useVirtualizer wants to render, and then returns indexes\n  // to actually render.\n  const rangeExtractor = useCallback(\n    (range: Range) => {\n      const startIndex = Math.max(0, range.startIndex - range.overscan);\n      const endIndex = Math.min(filteredOptions.length - 1, range.endIndex + range.overscan);\n      const rangeToReturn = Array.from({ length: endIndex - startIndex + 1 }, (_, i) => startIndex + i);\n\n      // If the first item doesn't have a group, no need to find a header for it\n      const firstDisplayedOption = filteredOptions[rangeToReturn[0]];\n      if (firstDisplayedOption?.group) {\n        const groupStartIndex = groupStartIndices.get(firstDisplayedOption.group);\n        if (groupStartIndex !== undefined && groupStartIndex < rangeToReturn[0]) {\n          rangeToReturn.unshift(groupStartIndex);\n        }\n      }\n\n      return rangeToReturn;\n    },\n    [filteredOptions, groupStartIndices]\n  );\n\n  const rowVirtualizer = useVirtualizer({\n    count: filteredOptions.length,\n    getScrollElement: () => scrollRef.current,\n    estimateSize: (index: number) => {\n      const firstGroupItem = isNewGroup(filteredOptions[index], index > 0 ? filteredOptions[index - 1] : undefined);\n      const hasDescription = 'description' in filteredOptions[index];\n      const hasGroup = 'group' in filteredOptions[index];\n\n      let itemHeight = MENU_OPTION_HEIGHT;\n      if (hasDescription) {\n        itemHeight = MENU_OPTION_HEIGHT_DESCRIPTION;\n      }\n      if (firstGroupItem && hasGroup) {\n        itemHeight += MENU_OPTION_HEIGHT;\n      }\n      return itemHeight;\n    },\n    overscan: VIRTUAL_OVERSCAN_ITEMS,\n    rangeExtractor,\n  });\n\n  const {\n    isOpen,\n    highlightedIndex,\n\n    getInputProps,\n    getMenuProps,\n    getItemProps,\n\n    selectItem,\n  } = useCombobox({\n    menuId,\n    labelId,\n    inputId: id,\n    items: filteredOptions,\n    itemToString,\n    selectedItem,\n\n    // Don't change downshift state in the onBlahChange handlers. Instead, use the stateReducer to make changes.\n    // Downshift calls change handlers on the render after so you can get sync/flickering issues if you change its state\n    // in them.\n    // Instead, stateReducer is called in the same tick as state changes, before that state is committed and rendered.\n\n    onSelectedItemChange: ({ selectedItem }) => {\n      onChange(selectedItem);\n    },\n\n    defaultHighlightedIndex: selectedItemIndex ?? 0,\n\n    scrollIntoView: () => {},\n\n    onIsOpenChange: ({ isOpen, inputValue }) => {\n      if (isOpen && inputValue === '') {\n        updateOptions(inputValue);\n      }\n    },\n\n    onHighlightedIndexChange: ({ highlightedIndex, type }) => {\n      if (type !== useCombobox.stateChangeTypes.MenuMouseLeave) {\n        rowVirtualizer.scrollToIndex(highlightedIndex);\n      }\n    },\n    onStateChange: ({ inputValue: newInputValue, type, selectedItem: newSelectedItem }) => {\n      switch (type) {\n        case useCombobox.stateChangeTypes.InputChange:\n          updateOptions(newInputValue ?? '');\n\n          break;\n        default:\n          break;\n      }\n    },\n    stateReducer(state, actionAndChanges) {\n      let { changes } = actionAndChanges;\n      const menuBeingOpened = state.isOpen === false && changes.isOpen === true;\n      const menuBeingClosed = state.isOpen === true && changes.isOpen === false;\n\n      // Reset the input value when the menu is opened. If the menu is opened due to an input change\n      // then make sure we keep that.\n      // This will trigger onInputValueChange to load async options\n      if (menuBeingOpened && changes.inputValue === state.inputValue) {\n        changes = {\n          ...changes,\n          inputValue: '',\n        };\n      }\n\n      if (menuBeingClosed) {\n        // Flush the selected item to the input when the menu is closed\n        if (changes.selectedItem) {\n          changes = {\n            ...changes,\n            inputValue: itemToString(changes.selectedItem),\n          };\n        } else if (changes.inputValue !== '') {\n          // Otherwise if no selected value, clear any search from the input\n          changes = {\n            ...changes,\n            inputValue: '',\n          };\n        }\n      }\n\n      return changes;\n    },\n  });\n\n  const { inputRef, floatingRef, floatStyles, scrollRef } = useComboboxFloat(filteredOptions, isOpen);\n\n  const isAutoSize = width === 'auto';\n  const InputComponent = isAutoSize ? AutoSizeInput : Input;\n  const placeholder = (isOpen ? itemToString(selectedItem) : null) || placeholderProp;\n\n  const suffixIcon = asyncLoading\n    ? 'spinner'\n    : // If it's loading, show loading icon. Otherwise, icon indicating menu state\n      isOpen\n      ? 'search'\n      : 'angle-down';\n\n  const inputSuffix = (\n    <>\n      {value && value === selectedItem?.value && isClearable && (\n        <Icon\n          name=\"times\"\n          className={styles.clear}\n          title={t('combobox.clear.title', 'Clear value')}\n          tabIndex={0}\n          role=\"button\"\n          onClick={() => {\n            selectItem(null);\n          }}\n          onKeyDown={(e) => {\n            if (e.key === 'Enter' || e.key === ' ') {\n              selectItem(null);\n            }\n          }}\n        />\n      )}\n\n      <Icon name={suffixIcon} />\n    </>\n  );\n\n  return (\n    <div className={isAutoSize ? styles.addaptToParent : undefined}>\n      <InputComponent\n        width={isAutoSize ? undefined : width}\n        {...(isAutoSize ? { minWidth, maxWidth } : {})}\n        autoFocus={autoFocus}\n        onBlur={onBlur}\n        disabled={disabled}\n        loading={loading}\n        invalid={invalid}\n        className={styles.input}\n        suffix={inputSuffix}\n        {...getInputProps({\n          ref: inputRef,\n          onChange: noop, // Empty onCall to avoid TS error https://github.com/downshift-js/downshift/issues/718\n          'aria-labelledby': ariaLabelledBy, // Label should be handled with the Field component\n          placeholder,\n          'data-testid': dataTestId,\n        })}\n      />\n      <Portal>\n        <div\n          className={cx(styles.menu, !isOpen && styles.menuClosed)}\n          style={floatStyles}\n          {...getMenuProps({\n            ref: floatingRef,\n            'aria-labelledby': ariaLabelledBy,\n          })}\n        >\n          {isOpen && (\n            <ComboboxList\n              options={filteredOptions}\n              highlightedIndex={highlightedIndex}\n              selectedItems={selectedItem ? [selectedItem] : []}\n              scrollRef={scrollRef}\n              getItemProps={getItemProps}\n              error={asyncError}\n            />\n          )}\n        </div>\n      </Portal>\n    </div>\n  );\n};\n"],"names":["selectedItem","isOpen","highlightedIndex"],"mappings":"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"}