{"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';\nimport { getPortalContainer } from '../Portal/Portal';\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 = 'fixed',\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: any;\n  if (isMulti && loadOptions) {\n    selectedValue = value;\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: menuShouldPortal ? 'fixed' : menuPosition,\n    menuShouldBlockScroll: true,\n    menuPortalTarget: menuShouldPortal && getPortalContainer(),\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                tabIndex={0}\n                onMouseDown={(e) => {\n                  e.preventDefault();\n                  e.stopPropagation();\n                  clearValue();\n                }}\n                onKeyDown={(e) => {\n                  if (e.key === 'Enter' || e.key === ' ') {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    clearValue();\n                  }\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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"}