@grafana/ui
Version:
Grafana Components Library
1 lines • 25.7 kB
Source Map (JSON)
{"version":3,"file":"Combobox.cjs","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, { type ComponentProps, useCallback, useId, useMemo } 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 { AutoSizeInput } from '../Input/AutoSizeInput';\nimport { Input, type 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 { type 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 * Custom description text for the \"create custom value\" option.\n * Defaults to \"Use custom value\".\n */\n customValueDescription?: string;\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 /**\n * Icon to display at the start of the ComboBox input\n */\n prefixIcon?: ComponentProps<typeof Icon>['name'];\n\n /**\n * Message to display when there are no options found. Defaults to \"No options found.\"\n */\n noOptionsMessage?: string;\n\n /**\n * When set, the dropdown open state is fully controlled by the parent. Use with {@link onIsOpenChange}\n * (e.g. open the list after a tab click or other user action). Omit for normal uncontrolled behavior.\n */\n isOpen?: boolean;\n\n /**\n * Called whenever the menu opens or closes. Use with {@link isOpen} for controlled mode, or alone to\n * observe open state.\n */\n onIsOpenChange?: (isOpen: boolean) => 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\nconst VIRTUAL_OVERSCAN_ITEMS = 4;\n\n/**\n * A performant and accessible combobox component that supports both synchronous and asynchronous options loading. It provides type-ahead filtering, keyboard navigation, and virtual scrolling for handling large datasets efficiently.\n * Replaces the Select component, and has better performance.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/inputs-combobox--docs\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 customValueDescription,\n id: idProp,\n width,\n minWidth,\n maxWidth,\n 'aria-labelledby': ariaLabelledBy,\n 'data-testid': dataTestId,\n autoFocus,\n onBlur,\n disabled: disabledProp,\n invalid: invalidProp,\n prefixIcon,\n noOptionsMessage,\n isOpen: isOpenProp,\n onIsOpenChange: onIsOpenChangeProp,\n loading: loadingProp,\n } = props;\n const fieldContext = useFieldContext();\n const id = idProp ?? fieldContext.id;\n const disabled = disabledProp ?? fieldContext.disabled;\n const invalid = invalidProp ?? fieldContext.invalid;\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 resetSearch,\n } = useOptions(allOptions, createCustomValue, customValueDescription);\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 const onIsOpenChangeHandler = useCallback(\n (changes: { isOpen: boolean; inputValue?: string }) => {\n onIsOpenChangeProp?.(changes.isOpen);\n\n if (changes.isOpen && (changes.inputValue ?? '') === '') {\n updateOptions('');\n }\n\n if (!changes.isOpen) {\n resetSearch();\n }\n },\n [onIsOpenChangeProp, updateOptions, resetSearch]\n );\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 getItemKey: (index: number) => filteredOptions[index]?.value ?? index,\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 isItemDisabled: (item) => !!item?.infoOption,\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 ...(isOpenProp !== undefined ? { isOpen: isOpenProp } : {}),\n\n onIsOpenChange: onIsOpenChangeHandler,\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 = loadingProp || fieldContext.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 const icon = selectedItem?.icon ?? prefixIcon;\n return (\n <Wrapper {...wrapperProps}>\n <InputComponent\n width={isAutoSize ? undefined : width}\n {...(isAutoSize ? { minWidth, maxWidth } : {})}\n autoFocus={autoFocus}\n prefix={icon && <Icon name={icon} />}\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 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 onBlur,\n })}\n />\n <Portal>\n <div\n className={cx(styles.menu, !isOpen && styles.menuClosed)}\n style={{\n ...floatStyles,\n pointerEvents: 'auto', // Override container's pointer-events: none\n }}\n {...getMenuProps({\n ref: floatingRef,\n 'aria-labelledby': ariaLabelledBy,\n })}\n >\n {isOpen && (\n <ComboboxList\n loading={loading}\n options={filteredOptions}\n highlightedIndex={highlightedIndex}\n selectedItems={selectedItem ? [selectedItem] : []}\n scrollRef={scrollRef}\n getItemProps={getItemProps}\n error={asyncError}\n noOptionsMessage={noOptionsMessage}\n />\n )}\n </div>\n </Portal>\n </Wrapper>\n );\n};\n"],"names":["useFieldContext","useId","useOptions","useMemo","useStyles2","getComboboxStyles","useCallback","_a","useVirtualizer","isNewGroup","MENU_OPTION_HEIGHT","MENU_OPTION_HEIGHT_DESCRIPTION","useCombobox","itemToString","selectedItem","highlightedIndex","useComboboxFloat","AutoSizeInput","Input","jsxs","Fragment","jsx","Icon","t","SuffixIcon","React","Portal","cx","ComboboxList"],"mappings":"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"}