@grafana/ui
Version:
Grafana Components Library
1 lines • 22.8 kB
Source Map (JSON)
{"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 { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\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/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>\n extends Omit<ComboboxBaseProps<T>, 'value' | 'onChange' | 'isClearable'> {\n value?: T[] | Array<ComboboxOption<T>>;\n onChange: (option: Array<ComboboxOption<T>>) => void;\n isClearable?: boolean;\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 <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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"}