UNPKG

@grafana/ui

Version:
1 lines • 25.8 kB
{"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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"}