{"version":3,"file":"MultiCombobox.mjs","sources":["../../../../src/components/Combobox/MultiCombobox.tsx"],"sourcesContent":["import { cx } from '@emotion/css';\nimport { useCombobox, useMultipleSelection } from 'downshift';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { useStyles2 } from '../../themes';\nimport { t } from '../../utils/i18n';\nimport { Icon } from '../Icon/Icon';\nimport { Box } from '../Layout/Box/Box';\nimport { Portal } from '../Portal/Portal';\nimport { Text } from '../Text/Text';\nimport { Tooltip } from '../Tooltip';\n\nimport { ComboboxBaseProps, AutoSizeConditionals } from './Combobox';\nimport { ComboboxList } from './ComboboxList';\nimport { SuffixIcon } from './SuffixIcon';\nimport { ValuePill } from './ValuePill';\nimport { itemToString } from './filter';\nimport { getComboboxStyles } from './getComboboxStyles';\nimport { getMultiComboboxStyles } from './getMultiComboboxStyles';\nimport { ALL_OPTION_VALUE, ComboboxOption } from './types';\nimport { useComboboxFloat } from './useComboboxFloat';\nimport { MAX_SHOWN_ITEMS, useMeasureMulti } from './useMeasureMulti';\nimport { useMultiInputAutoSize } from './useMultiInputAutoSize';\nimport { useOptions } from './useOptions';\n\ninterface MultiComboboxBaseProps<T extends string | number> extends Omit<ComboboxBaseProps<T>, 'value' | 'onChange'> {\n  value?: T[] | Array<ComboboxOption<T>>;\n  onChange: (option: Array<ComboboxOption<T>>) => void;\n  enableAllOption?: boolean;\n}\n\nexport type MultiComboboxProps<T extends string | number> = MultiComboboxBaseProps<T> & AutoSizeConditionals;\n\nexport const MultiCombobox = <T extends string | number>(props: MultiComboboxProps<T>) => {\n  const {\n    placeholder,\n    onChange,\n    value,\n    width,\n    enableAllOption,\n    invalid,\n    disabled,\n    minWidth,\n    maxWidth,\n    isClearable,\n    createCustomValue = false,\n  } = props;\n\n  const styles = useStyles2(getComboboxStyles);\n  const [inputValue, setInputValue] = useState('');\n\n  const allOptionItem = useMemo(() => {\n    return {\n      label:\n        inputValue === ''\n          ? t('multicombobox.all.title', 'All')\n          : t('multicombobox.all.title-filtered', 'All (filtered)'),\n      // Type casting needed to make this work when T is a number\n      value: ALL_OPTION_VALUE,\n    } as ComboboxOption<T>;\n  }, [inputValue]);\n\n  // Handle async options and the 'All' option\n  const {\n    options: baseOptions,\n    updateOptions,\n    asyncLoading,\n    asyncError,\n  } = useOptions(props.options, createCustomValue);\n  const options = useMemo(() => {\n    // Only add the 'All' option if there's more than 1 option\n    const addAllOption = enableAllOption && baseOptions.length > 1;\n    return addAllOption ? [allOptionItem, ...baseOptions] : baseOptions;\n  }, [baseOptions, enableAllOption, allOptionItem]);\n  const loading = props.loading || asyncLoading;\n\n  const selectedItems = useMemo(() => {\n    if (!value) {\n      return [];\n    }\n\n    return getSelectedItemsFromValue<T>(value, typeof props.options !== 'function' ? props.options : baseOptions);\n  }, [value, props.options, baseOptions]);\n\n  const { measureRef, counterMeasureRef, suffixMeasureRef, shownItems } = useMeasureMulti(\n    selectedItems,\n    width,\n    disabled\n  );\n\n  const isOptionSelected = useCallback(\n    (item: ComboboxOption<T>) => selectedItems.some((opt) => opt.value === item.value),\n    [selectedItems]\n  );\n\n  const { getSelectedItemProps, getDropdownProps, setSelectedItems, addSelectedItem, removeSelectedItem, reset } =\n    useMultipleSelection({\n      selectedItems, // initially selected items,\n      onStateChange: ({ type, selectedItems: newSelectedItems }) => {\n        switch (type) {\n          case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownBackspace:\n          case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownDelete:\n          case useMultipleSelection.stateChangeTypes.DropdownKeyDownBackspace:\n          case useMultipleSelection.stateChangeTypes.FunctionRemoveSelectedItem:\n          case useMultipleSelection.stateChangeTypes.FunctionAddSelectedItem:\n          case useMultipleSelection.stateChangeTypes.FunctionSetSelectedItems:\n          case useMultipleSelection.stateChangeTypes.FunctionReset:\n            // Unclear why newSelectedItems would be undefined, but this seems logical\n            onChange(newSelectedItems ?? []);\n            break;\n\n          default:\n            break;\n        }\n      },\n      stateReducer: (state, actionAndChanges) => {\n        const { changes } = actionAndChanges;\n        return {\n          ...changes,\n\n          /**\n           * TODO: Fix Hack!\n           * This prevents the menu from closing when the user unselects an item in the dropdown at the expense\n           * of breaking keyboard navigation.\n           *\n           * Downshift isn't really designed to keep selected items in the dropdown menu, so when you unselect an item\n           * in a multiselect, the stateReducer tries to move focus onto another item which causes the menu to be closed.\n           * This only seems to happen when you deselect the last item in the selectedItems list.\n           *\n           * Check out:\n           *  - FunctionRemoveSelectedItem in the useMultipleSelection reducer https://github.com/downshift-js/downshift/blob/master/src/hooks/useMultipleSelection/reducer.js#L75\n           *  - The activeIndex useEffect in useMultipleSelection https://github.com/downshift-js/downshift/blob/master/src/hooks/useMultipleSelection/index.js#L68-L72\n           *\n           * Forcing the activeIndex to -999 both prevents the useEffect that changes the focus from triggering (value never changes)\n           * and prevents the if statement in useMultipleSelection from focusing anything.\n           */\n          activeIndex: -999,\n        };\n      },\n    });\n\n  const {\n    getToggleButtonProps,\n    //getLabelProps,\n    isOpen,\n    highlightedIndex,\n    getMenuProps,\n    getInputProps,\n    getItemProps,\n  } = useCombobox({\n    items: options,\n    itemToString,\n    inputValue,\n    selectedItem: null,\n    stateReducer: (state, actionAndChanges) => {\n      const { type } = actionAndChanges;\n      let { changes } = actionAndChanges;\n      const menuBeingOpened = state.isOpen === false && changes.isOpen === true;\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      switch (type) {\n        case useCombobox.stateChangeTypes.InputKeyDownEnter:\n        case useCombobox.stateChangeTypes.ItemClick:\n          return {\n            ...changes,\n            isOpen: true,\n            highlightedIndex: state.highlightedIndex,\n          };\n        case useCombobox.stateChangeTypes.InputBlur:\n          setInputValue('');\n        default:\n          return changes;\n      }\n    },\n\n    onIsOpenChange: ({ isOpen, inputValue }) => {\n      if (isOpen && inputValue === '') {\n        updateOptions(inputValue);\n      }\n    },\n\n    onStateChange: ({ inputValue: newInputValue, type, selectedItem: newSelectedItem }) => {\n      switch (type) {\n        case useCombobox.stateChangeTypes.InputKeyDownEnter:\n        case useCombobox.stateChangeTypes.ItemClick:\n          // Handle All functionality\n          if (newSelectedItem?.value === ALL_OPTION_VALUE) {\n            // TODO: fix bug where if the search filtered items list is the\n            // same length, but different, than the selected items (ask tobias)\n            const isAllFilteredSelected = selectedItems.length === options.length - 1;\n\n            // if every option is already selected, clear the selection.\n            // otherwise, select all the options (excluding the first ALL_OTION)\n            const realOptions = options.slice(1);\n            let newSelectedItems = isAllFilteredSelected && inputValue === '' ? [] : realOptions;\n\n            if (!isAllFilteredSelected && inputValue !== '') {\n              // Select all currently filtered items and deduplicate\n              newSelectedItems = [...new Set([...selectedItems, ...realOptions])];\n            }\n\n            if (isAllFilteredSelected && inputValue !== '') {\n              // Deselect all currently filtered items\n              const filteredSet = new Set(realOptions.map((item) => item.value));\n              newSelectedItems = selectedItems.filter((item) => !filteredSet.has(item.value));\n            }\n            setSelectedItems(newSelectedItems);\n          } else if (newSelectedItem && isOptionSelected(newSelectedItem)) {\n            removeSelectedItem(newSelectedItem);\n          } else if (newSelectedItem) {\n            addSelectedItem(newSelectedItem);\n          }\n          break;\n        case useCombobox.stateChangeTypes.InputChange:\n          setInputValue(newInputValue ?? '');\n          updateOptions(newInputValue ?? '');\n\n          break;\n        default:\n          break;\n      }\n    },\n  });\n\n  const { inputRef: containerRef, floatingRef, floatStyles, scrollRef } = useComboboxFloat(options, isOpen);\n  const multiStyles = useStyles2(\n    getMultiComboboxStyles,\n    isOpen,\n    invalid,\n    disabled,\n    width,\n    minWidth,\n    maxWidth,\n    isClearable\n  );\n\n  // Selected items that show up in the input field\n  const visibleItems = isOpen ? selectedItems.slice(0, MAX_SHOWN_ITEMS) : selectedItems.slice(0, shownItems);\n\n  const { inputRef, inputWidth } = useMultiInputAutoSize(inputValue);\n  return (\n    <div className={multiStyles.container} ref={containerRef}>\n      <div className={cx(multiStyles.wrapper, { [multiStyles.disabled]: disabled })} ref={measureRef}>\n        <span className={multiStyles.pillWrapper}>\n          {visibleItems.map((item, index) => (\n            <ValuePill\n              disabled={disabled}\n              onRemove={() => {\n                removeSelectedItem(item);\n              }}\n              key={`${item.value}${index}`}\n              {...getSelectedItemProps({ selectedItem: item, index })}\n            >\n              {itemToString(item)}\n            </ValuePill>\n          ))}\n          {selectedItems.length > visibleItems.length && (\n            <Box display=\"flex\" direction=\"row\" marginLeft={0.5} gap={1} ref={counterMeasureRef}>\n              {/* eslint-disable-next-line @grafana/no-untranslated-strings */}\n              <Text>...</Text>\n              <Tooltip\n                interactive\n                content={\n                  <>\n                    {selectedItems.slice(visibleItems.length).map((item) => (\n                      <div key={item.value}>{itemToString(item)}</div>\n                    ))}\n                  </>\n                }\n              >\n                <div className={multiStyles.restNumber}>{selectedItems.length - shownItems}</div>\n              </Tooltip>\n            </Box>\n          )}\n          <input\n            className={multiStyles.input}\n            {...getInputProps(\n              getDropdownProps({\n                disabled,\n                preventKeyAction: isOpen,\n                placeholder: visibleItems.length === 0 ? placeholder : '',\n                ref: inputRef,\n                style: { width: inputWidth },\n              })\n            )}\n          />\n\n          <div className={multiStyles.suffix} ref={suffixMeasureRef} {...getToggleButtonProps()}>\n            {isClearable && selectedItems.length > 0 && (\n              <Icon\n                name=\"times\"\n                className={styles.clear}\n                title={t('multicombobox.clear.title', 'Clear all')}\n                tabIndex={0}\n                role=\"button\"\n                onClick={(e) => {\n                  e.stopPropagation();\n                  reset();\n                }}\n                onKeyDown={(e) => {\n                  if (e.key === 'Enter' || e.key === ' ') {\n                    reset();\n                  }\n                }}\n              />\n            )}\n            <SuffixIcon isLoading={loading || false} isOpen={isOpen} />\n          </div>\n        </span>\n      </div>\n      <Portal>\n        <div\n          className={cx(styles.menu, !isOpen && styles.menuClosed)}\n          style={{\n            ...floatStyles,\n            width: floatStyles.width + 24, // account for checkbox\n          }}\n          {...getMenuProps({ ref: floatingRef })}\n        >\n          {isOpen && (\n            <ComboboxList\n              options={options}\n              highlightedIndex={highlightedIndex}\n              selectedItems={selectedItems}\n              scrollRef={scrollRef}\n              getItemProps={getItemProps}\n              enableAllOption={enableAllOption}\n              isMultiSelect={true}\n              error={asyncError}\n            />\n          )}\n        </div>\n      </Portal>\n    </div>\n  );\n};\n\nfunction getSelectedItemsFromValue<T extends string | number>(\n  value: T[] | Array<ComboboxOption<T>>,\n  options: Array<ComboboxOption<T>>\n) {\n  if (isComboboxOptions(value)) {\n    return value;\n  }\n  const valueMap = new Map(value.map((val, index) => [val, index]));\n  const resultingItems: Array<ComboboxOption<T>> = [];\n\n  for (const option of options) {\n    const index = valueMap.get(option.value);\n    if (index !== undefined) {\n      resultingItems[index] = option;\n      valueMap.delete(option.value);\n    }\n    if (valueMap.size === 0) {\n      // We found all values\n      break;\n    }\n  }\n\n  // Handle items that are not in options\n  for (const [val, index] of valueMap) {\n    resultingItems[index] = { value: val };\n  }\n  return resultingItems;\n}\n\nfunction isComboboxOptions<T extends string | number>(\n  value: T[] | Array<ComboboxOption<T>>\n): value is Array<ComboboxOption<T>> {\n  return typeof value[0] === 'object';\n}\n"],"names":["isOpen","inputValue"],"mappings":"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"}