UNPKG

@grafana/ui

Version:
1 lines • 20.7 kB
{"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 React, { useCallback, useId, useMemo } from 'react';\n\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\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 { SuffixIcon } from './SuffixIcon';\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.\n\ninterface ComboboxStaticProps<T extends string | number>\n extends Pick<\n InputProps,\n 'placeholder' | 'autoFocus' | 'id' | 'aria-labelledby' | 'disabled' | 'loading' | 'invalid'\n > {\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 * 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\ninterface ClearableProps<T extends string | number> {\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: true;\n\n /**\n * onChange handler is called with the newly selected option.\n */\n onChange: (option: ComboboxOption<T> | null) => void;\n}\n\ninterface NotClearableProps<T extends string | number> {\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?: false;\n\n /**\n * onChange handler is called with the newly selected option.\n */\n onChange: (option: ComboboxOption<T>) => void;\n}\n\nexport type ComboboxBaseProps<T extends string | number> = (ClearableProps<T> | NotClearableProps<T>) &\n ComboboxStaticProps<T>;\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> & AutoSizeConditionals;\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, // this should be default false, but TS can't infer the conditional type if you do\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 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 // `selectedItem` type is `ComboboxOption<T> | null`\n // It can be null when `selectItem()` is called with null, and we never do that unless `isClearable` is true.\n // So, when `isClearable` is false, `selectedItem` is always non-null. However, the types don't reflect that,\n // which is why the conditions are needed.\n //\n // this is an else if because TS can't infer the correct onChange types from\n // (isClearable || selectedItem !== null)\n if (isClearable) {\n // onChange argument type allows null\n onChange(selectedItem);\n } else if (selectedItem !== null) {\n // onChange argument type *does not* allow null\n onChange(selectedItem);\n }\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 loading = props.loading || asyncLoading;\n\n const inputSuffix = (\n <>\n {value !== undefined && 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 <SuffixIcon isLoading={loading || false} isOpen={isOpen} />\n </>\n );\n\n const { Wrapper, wrapperProps } = isAutoSize\n ? {\n Wrapper: 'div',\n wrapperProps: { className: styles.adaptToParent },\n }\n : { Wrapper: React.Fragment };\n\n return (\n <Wrapper {...wrapperProps}>\n <InputComponent\n width={isAutoSize ? undefined : width}\n {...(isAutoSize ? { minWidth, maxWidth } : {})}\n autoFocus={autoFocus}\n onBlur={onBlur}\n disabled={disabled}\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 </Wrapper>\n );\n};\n"],"names":["selectedItem","isOpen","highlightedIndex","React"],"mappings":"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"}