UNPKG

@grafana/ui

Version:
1 lines • 29.1 kB
{"version":3,"file":"MultiCombobox.cjs","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 { useFieldContext } from '../Forms/FieldContext';\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 { type ComboboxBaseProps, type 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, type 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\n/**\n * The behavior of the MultiCombobox is similar to that of the Combobox, but it allows you to select multiple options. For all non-multi behaviors, see the Combobox documentation.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/inputs-multicombobox--docs\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: invalidProp,\n disabled: disabledProp,\n loading: loadingProp,\n minWidth,\n maxWidth,\n isClearable,\n createCustomValue = false,\n customValueDescription,\n 'aria-labelledby': ariaLabelledBy,\n 'data-testid': dataTestId,\n prefixIcon,\n id: idProp,\n options: optionsProp,\n } = props;\n\n const styles = useStyles2(getComboboxStyles);\n const [inputValue, setInputValue] = useState('');\n\n const fieldContext = useFieldContext();\n const id = idProp ?? fieldContext.id;\n const disabled = disabledProp ?? fieldContext.disabled;\n const invalid = invalidProp ?? fieldContext.invalid;\n const ariaDescribedBy = fieldContext['aria-describedby'];\n\n // Handle async options and the 'All' option\n const {\n options: baseOptions,\n updateOptions,\n asyncLoading,\n asyncError,\n } = useOptions(optionsProp, createCustomValue, customValueDescription);\n const loading = loadingProp || fieldContext.loading || asyncLoading;\n\n const selectedItems = useMemo(() => {\n if (!value) {\n return [];\n }\n\n return getSelectedItemsFromValue<T>(value, typeof optionsProp !== 'function' ? optionsProp : baseOptions);\n }, [value, optionsProp, baseOptions]);\n\n const allOptionItem = useMemo(() => {\n const isFiltered = inputValue !== '';\n const realBaseOptions = baseOptions.filter((opt) => !opt.infoOption);\n\n let label: string;\n if (isFiltered) {\n const anyFilteredSelected = realBaseOptions.some((opt) => selectedItems.some((s) => s.value === opt.value));\n label = anyFilteredSelected\n ? t('multicombobox.all.title-deselect-filtered', 'Deselect all (filtered)')\n : t('multicombobox.all.title-select-filtered', 'Select all (filtered)');\n } else {\n label =\n selectedItems.length > 0\n ? t('multicombobox.all.title-deselect', 'Deselect all')\n : t('multicombobox.all.title-select', 'Select all');\n }\n\n // Type casting needed to make this work when T is a number\n return { label, value: ALL_OPTION_VALUE } as ComboboxOption<T>;\n }, [inputValue, selectedItems, baseOptions]);\n\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\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 handleInputChange = useCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n // Synchronously update inputValue so it is batched with downshift's dispatch\n // in a single React render. See onStateChange InputChange case for details.\n setInputValue(event.target.value);\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 { isOpen, highlightedIndex, getMenuProps, getInputProps, getItemProps, getToggleButtonProps } = useCombobox({\n items: options,\n itemToString,\n inputId: id,\n inputValue,\n selectedItem: null,\n isItemDisabled: (item) => !!item?.infoOption,\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 // Don't allow selection of info options\n if (newSelectedItem?.infoOption) {\n break;\n }\n\n // Handle All functionality\n if (newSelectedItem?.value === ALL_OPTION_VALUE) {\n const isFiltered = inputValue !== '';\n const realOptions = options.slice(1).filter((option) => !option.infoOption);\n\n if (isFiltered) {\n const filteredSet = new Set(realOptions.map((item) => item.value));\n const anyFilteredSelected = selectedItems.some((item) => filteredSet.has(item.value));\n if (anyFilteredSelected) {\n setSelectedItems(selectedItems.filter((item) => !filteredSet.has(item.value)));\n } else {\n setSelectedItems([...new Set([...selectedItems, ...realOptions])]);\n }\n } else {\n setSelectedItems(selectedItems.length > 0 ? [] : realOptions);\n }\n } else if (newSelectedItem && isOptionSelected(newSelectedItem)) {\n // Find the actual selected item object that matches the clicked item by value\n // This is necessary because the clicked item (from async options) may be a different\n // object reference than the selected item, and useMultipleSelection uses object equality\n const itemToRemove = selectedItems.find((item) => item.value === newSelectedItem.value);\n if (itemToRemove) {\n removeSelectedItem(itemToRemove);\n }\n } else if (newSelectedItem) {\n addSelectedItem(newSelectedItem);\n }\n break;\n case useCombobox.stateChangeTypes.InputChange:\n // setInputValue is intentionally NOT called here. It is called synchronously in the\n // input's onChange handler instead, so that it is batched with downshift's dispatch\n // in a single React render.\n updateOptions(newInputValue ?? '');\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 {prefixIcon && (\n <Box marginLeft={0.5}>\n <Text color=\"secondary\">\n <Icon name={prefixIcon} />\n </Text>\n </Box>\n )}\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 - visibleItems.length}</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 'aria-describedby': ariaDescribedBy, // Description should be handled with the Field component\n 'aria-labelledby': ariaLabelledBy, // Label should be handled with the Field component\n 'data-testid': dataTestId,\n onChange: handleInputChange,\n onKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => {\n // Stop Escape from propagating to parent overlays (e.g. Modals, Drawers)\n // so that only the dropdown menu closes, not the parent.\n if (event.key === 'Escape' && isOpen) {\n event.stopPropagation();\n }\n },\n })}\n />\n\n <div className={multiStyles.suffix} ref={suffixMeasureRef}>\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\n isLoading={loading || false}\n isOpen={isOpen}\n {...getToggleButtonProps({ disabled, role: 'button' })}\n />\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 pointerEvents: 'auto', // Override container's pointer-events: none\n }}\n {...getMenuProps({ ref: floatingRef })}\n >\n {isOpen && (\n <ComboboxList\n loading={loading}\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 // Deduplicate values before building the map. Without dedup, duplicate keys\n // cause Map to keep the last index, leaving earlier indices as undefined holes\n // in resultingItems (sparse array), which crashes when label is accessed.\n const valueMap = new Map<T, number>();\n let index = 0;\n for (const val of value) {\n if (!valueMap.has(val)) {\n valueMap.set(val, index);\n index++;\n }\n }\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":["useStyles2","getComboboxStyles","useState","useFieldContext","useOptions","useMemo","t","ALL_OPTION_VALUE","useMeasureMulti","useCallback","useMultipleSelection","useCombobox","itemToString","isOpen","inputValue","useComboboxFloat","getMultiComboboxStyles","MAX_SHOWN_ITEMS","useMultiInputAutoSize","jsxs","cx","jsx","Box","Text","Icon","ValuePill","Tooltip","Fragment","SuffixIcon","Portal","ComboboxList","index"],"mappings":"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"}