@grafana/ui
Version:
Grafana Components Library
1 lines • 25.6 kB
Source Map (JSON)
{"version":3,"file":"SelectBase.mjs","sources":["../../../../src/components/Select/SelectBase.tsx"],"sourcesContent":["import { isArray, negate } from 'lodash';\nimport { ComponentProps, useCallback, useEffect, useRef, useState, useImperativeHandle } from 'react';\nimport * as React from 'react';\nimport {\n default as ReactSelect,\n IndicatorsContainerProps,\n Props as ReactSelectProps,\n ClearIndicatorProps,\n} from 'react-select';\nimport { default as ReactAsyncSelect } from 'react-select/async';\nimport { default as AsyncCreatable } from 'react-select/async-creatable';\nimport Creatable from 'react-select/creatable';\n\nimport { SelectableValue, toOption } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\n\nimport { CustomInput } from './CustomInput';\nimport { DropdownIndicator } from './DropdownIndicator';\nimport { IndicatorsContainer } from './IndicatorsContainer';\nimport { InputControl } from './InputControl';\nimport { MultiValueContainer, MultiValueRemove } from './MultiValue';\nimport { SelectContainer } from './SelectContainer';\nimport { SelectMenu, SelectMenuOptions, VirtualizedSelectMenu } from './SelectMenu';\nimport { SelectOptionGroup } from './SelectOptionGroup';\nimport { SelectOptionGroupHeader } from './SelectOptionGroupHeader';\nimport { Props, SingleValue } from './SingleValue';\nimport { ValueContainer } from './ValueContainer';\nimport { getSelectStyles } from './getSelectStyles';\nimport { useCustomSelectStyles } from './resetSelectStyles';\nimport { ActionMeta, InputActionMeta, SelectBaseProps, ToggleAllState } from './types';\nimport { cleanValue, findSelectedValue, omitDescriptions } from './utils';\n\nconst CustomControl = (props: any) => {\n const {\n children,\n innerProps,\n selectProps: { menuIsOpen, onMenuClose, onMenuOpen },\n isFocused,\n isMulti,\n getValue,\n innerRef,\n } = props;\n const selectProps = props.selectProps as SelectBaseProps<any>;\n\n if (selectProps.renderControl) {\n return React.createElement(selectProps.renderControl, {\n isOpen: menuIsOpen,\n value: isMulti ? getValue() : getValue()[0],\n ref: innerRef,\n onClick: menuIsOpen ? onMenuClose : onMenuOpen,\n onBlur: onMenuClose,\n disabled: !!selectProps.disabled,\n invalid: !!selectProps.invalid,\n });\n }\n\n return (\n <InputControl\n ref={innerRef}\n innerProps={innerProps}\n prefix={selectProps.prefix}\n focused={isFocused}\n invalid={!!selectProps.invalid}\n disabled={!!selectProps.disabled}\n >\n {children}\n </InputControl>\n );\n};\n\ninterface SelectPropsWithExtras extends ReactSelectProps {\n maxVisibleValues?: number | undefined;\n showAllSelectedWhenOpen: boolean;\n noMultiValueWrap?: boolean;\n}\n\nfunction determineToggleAllState(selectedValue: SelectableValue[], options: SelectableValue[]) {\n if (options.length === selectedValue.length) {\n return ToggleAllState.allSelected;\n } else if (selectedValue.length === 0) {\n return ToggleAllState.noneSelected;\n } else {\n return ToggleAllState.indeterminate;\n }\n}\n\nexport function SelectBase<T, Rest = {}>({\n allowCustomValue = false,\n allowCreateWhileLoading = false,\n 'aria-label': ariaLabel,\n 'data-testid': dataTestid,\n autoFocus = false,\n backspaceRemovesValue = true,\n blurInputOnSelect,\n cacheOptions,\n className,\n closeMenuOnSelect = true,\n components,\n createOptionPosition = 'last',\n defaultOptions,\n defaultValue,\n disabled = false,\n filterOption,\n formatCreateLabel,\n getOptionLabel,\n getOptionValue,\n inputValue,\n invalid,\n isClearable = false,\n id,\n isLoading = false,\n isMulti = false,\n inputId,\n isOpen,\n isOptionDisabled,\n isSearchable = true,\n loadOptions,\n loadingMessage = 'Loading options...',\n maxMenuHeight = 300,\n minMenuHeight,\n maxVisibleValues,\n menuPlacement = 'auto',\n menuPosition,\n menuShouldPortal = true,\n noOptionsMessage = t('grafana-ui.select.no-options-label', 'No options found'),\n onBlur,\n onChange,\n onCloseMenu,\n onCreateOption,\n onInputChange,\n onKeyDown,\n onMenuScrollToBottom,\n onMenuScrollToTop,\n onOpenMenu,\n onFocus,\n toggleAllOptions,\n openMenuOnFocus = false,\n options = [],\n placeholder = t('grafana-ui.select.placeholder', 'Choose'),\n prefix,\n renderControl,\n showAllSelectedWhenOpen = true,\n tabSelectsValue = true,\n value,\n virtualized = false,\n noMultiValueWrap,\n width,\n isValidNewOption,\n formatOptionLabel,\n hideSelectedOptions,\n selectRef,\n ...rest\n}: SelectBaseProps<T> & Rest) {\n const theme = useTheme2();\n const styles = getSelectStyles(theme);\n\n const reactSelectRef = useRef<HTMLElement & { controlRef: HTMLElement }>(null);\n const [closeToBottom, setCloseToBottom] = useState<boolean>(false);\n const selectStyles = useCustomSelectStyles(theme, width);\n const [hasInputValue, setHasInputValue] = useState<boolean>(!!inputValue);\n\n useImperativeHandle(selectRef, () => reactSelectRef.current!, []);\n\n // Infer the menu position for asynchronously loaded options. menuPlacement=\"auto\" doesn't work when the menu is\n // automatically opened when the component is created (it happens in SegmentSelect by setting menuIsOpen={true}).\n // We can remove this workaround when the bug in react-select is fixed: https://github.com/JedWatson/react-select/issues/4936\n // Note: we use useEffect instead of hooking into onMenuOpen due to another bug: https://github.com/JedWatson/react-select/issues/3375\n useEffect(() => {\n if (\n loadOptions &&\n isOpen &&\n reactSelectRef.current &&\n reactSelectRef.current.controlRef &&\n menuPlacement === 'auto'\n ) {\n const distance = window.innerHeight - reactSelectRef.current.controlRef.getBoundingClientRect().bottom;\n setCloseToBottom(distance < maxMenuHeight);\n }\n }, [maxMenuHeight, menuPlacement, loadOptions, isOpen]);\n\n const onChangeWithEmpty = useCallback(\n (value: SelectableValue<T>, action: ActionMeta) => {\n if (isMulti && (value === undefined || value === null)) {\n return onChange([], action);\n }\n onChange(value, action);\n },\n [isMulti, onChange]\n );\n\n let ReactSelectComponent = ReactSelect;\n\n const creatableProps: ComponentProps<typeof Creatable<SelectableValue<T>>> = {};\n let asyncSelectProps: any = {};\n let selectedValue;\n if (isMulti && loadOptions) {\n selectedValue = value as any;\n } else {\n // If option is passed as a plain value (value property from SelectableValue property)\n // we are selecting the corresponding value from the options\n if (isMulti && value && Array.isArray(value) && !loadOptions) {\n selectedValue = value.map((v) => {\n // @ts-ignore\n const selectableValue = findSelectedValue(v.value ?? v, options);\n // If the select allows custom values there likely won't be a selectableValue in options\n // so we must return a new selectableValue\n if (selectableValue) {\n return selectableValue;\n }\n return typeof v === 'string' ? toOption(v) : v;\n });\n } else if (loadOptions) {\n const hasValue = defaultValue || value;\n selectedValue = hasValue ? [hasValue] : [];\n } else {\n selectedValue = cleanValue(value, options);\n }\n }\n\n const commonSelectProps = {\n 'aria-label': ariaLabel,\n 'data-testid': dataTestid,\n autoFocus,\n backspaceRemovesValue,\n blurInputOnSelect,\n captureMenuScroll: onMenuScrollToBottom || onMenuScrollToTop,\n closeMenuOnSelect,\n // We don't want to close if we're actually scrolling the menu\n // So only close if none of the parents are the select menu itself\n defaultValue,\n // Also passing disabled, as this is the new Select API, and I want to use this prop instead of react-select's one\n disabled,\n // react-select always tries to filter the options even at first menu open, which is a problem for performance\n // in large lists. So we set it to not try to filter the options if there is no input value.\n filterOption: hasInputValue ? filterOption : null,\n getOptionLabel,\n getOptionValue,\n hideSelectedOptions,\n inputValue,\n invalid,\n isClearable,\n id,\n // Passing isDisabled as react-select accepts this prop\n isDisabled: disabled,\n isLoading,\n isMulti,\n inputId,\n isOptionDisabled,\n isSearchable,\n maxMenuHeight,\n minMenuHeight,\n maxVisibleValues,\n menuIsOpen: isOpen,\n menuPlacement: menuPlacement === 'auto' && closeToBottom ? 'top' : menuPlacement,\n menuPosition,\n menuShouldBlockScroll: true,\n menuPortalTarget: menuShouldPortal && typeof document !== 'undefined' ? document.body : undefined,\n menuShouldScrollIntoView: false,\n onBlur,\n onChange: onChangeWithEmpty,\n onInputChange: (val: string, actionMeta: InputActionMeta) => {\n const newValue = onInputChange?.(val, actionMeta) ?? val;\n const newHasValue = !!newValue;\n if (newHasValue !== hasInputValue) {\n setHasInputValue(newHasValue);\n }\n\n return newValue;\n },\n onKeyDown,\n onMenuClose: onCloseMenu,\n onMenuOpen: onOpenMenu,\n onMenuScrollToBottom: onMenuScrollToBottom,\n onMenuScrollToTop: onMenuScrollToTop,\n onFocus,\n formatOptionLabel,\n openMenuOnFocus,\n options: virtualized ? omitDescriptions(options) : options,\n placeholder,\n prefix,\n renderControl,\n showAllSelectedWhenOpen,\n tabSelectsValue,\n value: isMulti ? selectedValue : selectedValue?.[0],\n noMultiValueWrap,\n };\n\n if (allowCustomValue) {\n ReactSelectComponent = Creatable;\n creatableProps.allowCreateWhileLoading = allowCreateWhileLoading;\n creatableProps.formatCreateLabel = formatCreateLabel ?? defaultFormatCreateLabel;\n creatableProps.onCreateOption = onCreateOption;\n creatableProps.createOptionPosition = createOptionPosition;\n creatableProps.isValidNewOption = isValidNewOption;\n }\n\n // Instead of having AsyncSelect, as a separate component we render ReactAsyncSelect\n if (loadOptions) {\n ReactSelectComponent = allowCustomValue ? AsyncCreatable : ReactAsyncSelect;\n asyncSelectProps = {\n loadOptions,\n cacheOptions,\n defaultOptions,\n };\n }\n\n const SelectMenuComponent = virtualized ? VirtualizedSelectMenu : SelectMenu;\n\n let toggleAllState = ToggleAllState.noneSelected;\n if (toggleAllOptions?.enabled && isArray(selectedValue)) {\n if (toggleAllOptions?.determineToggleAllState) {\n toggleAllState = toggleAllOptions.determineToggleAllState(selectedValue, options);\n } else {\n toggleAllState = determineToggleAllState(selectedValue, options);\n }\n }\n\n const toggleAll = useCallback(() => {\n let toSelect = toggleAllState === ToggleAllState.noneSelected ? options : [];\n if (toggleAllOptions?.optionsFilter) {\n toSelect =\n toggleAllState === ToggleAllState.noneSelected\n ? options.filter(toggleAllOptions.optionsFilter)\n : options.filter(negate(toggleAllOptions.optionsFilter));\n }\n\n onChange(toSelect, {\n action: 'select-option',\n option: {},\n });\n }, [options, toggleAllOptions, onChange, toggleAllState]);\n\n return (\n <>\n <ReactSelectComponent\n ref={reactSelectRef}\n components={{\n MenuList: SelectMenuComponent,\n Group: SelectOptionGroup,\n GroupHeading: SelectOptionGroupHeader,\n ValueContainer,\n IndicatorsContainer: CustomIndicatorsContainer,\n IndicatorSeparator: IndicatorSeparator,\n Control: CustomControl,\n Option: SelectMenuOptions,\n ClearIndicator(props: ClearIndicatorProps) {\n const { clearValue } = props;\n return (\n <Icon\n name=\"times\"\n role=\"button\"\n aria-label={t('grafana-ui.select.clear-value', 'Clear value')}\n className={styles.singleValueRemove}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n clearValue();\n }}\n />\n );\n },\n LoadingIndicator() {\n // Handled with DropdownIndicator, to avoid resize flickering with auto width\n return null;\n },\n LoadingMessage() {\n return <div className={styles.loadingMessage}>{loadingMessage}</div>;\n },\n NoOptionsMessage() {\n return (\n <div\n className={styles.loadingMessage}\n aria-label={t('grafana-ui.select.empty-options', 'No options provided')}\n >\n {noOptionsMessage}\n </div>\n );\n },\n DropdownIndicator: DropdownIndicator,\n SingleValue(props: Props<T>) {\n return <SingleValue {...props} isDisabled={disabled} />;\n },\n SelectContainer,\n MultiValueContainer: MultiValueContainer,\n MultiValueRemove: !disabled ? MultiValueRemove : () => null,\n Input: CustomInput,\n ...components,\n }}\n toggleAllOptions={\n toggleAllOptions?.enabled && {\n state: toggleAllState,\n selectAllClicked: toggleAll,\n selectedCount: isArray(selectedValue) ? selectedValue.length : undefined,\n }\n }\n styles={selectStyles}\n className={className}\n autoWidth={width === 'auto'}\n {...commonSelectProps}\n {...creatableProps}\n {...asyncSelectProps}\n {...rest}\n />\n </>\n );\n}\n\nfunction defaultFormatCreateLabel(input: string) {\n return (\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <div>{input}</div>\n <div style={{ flexGrow: 1 }} />\n <div className=\"muted small\" style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <Trans i18nKey=\"grafana-ui.select.default-create-label\">Hit enter to add</Trans>\n </div>\n </div>\n );\n}\n\ntype CustomIndicatorsContainerProps = IndicatorsContainerProps & {\n selectProps: SelectPropsWithExtras;\n children: React.ReactNode;\n};\n\nfunction CustomIndicatorsContainer(props: CustomIndicatorsContainerProps) {\n const { showAllSelectedWhenOpen, maxVisibleValues, menuIsOpen } = props.selectProps;\n\n const value = props.getValue();\n\n if (maxVisibleValues !== undefined && Array.isArray(props.children)) {\n const selectedValuesCount = value.length;\n\n if (selectedValuesCount > maxVisibleValues && !(showAllSelectedWhenOpen && menuIsOpen)) {\n const indicatorChildren = [...props.children];\n indicatorChildren.splice(\n -1,\n 0,\n <span key=\"excess-values\" id=\"excess-values\">\n {`(+${selectedValuesCount - maxVisibleValues})`}\n </span>\n );\n\n return <IndicatorsContainer {...props}>{indicatorChildren}</IndicatorsContainer>;\n }\n }\n\n return <IndicatorsContainer {...props} />;\n}\n\nfunction IndicatorSeparator() {\n return <></>;\n}\n"],"names":["value"],"mappings":"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"}