{"version":3,"file":"SelectMenu.mjs","sources":["../../../../src/components/Select/SelectMenu.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { max } from 'lodash';\nimport { RefCallback, useLayoutEffect, useMemo, useRef, type JSX } from 'react';\nimport * as React from 'react';\nimport { FixedSizeList as List } from 'react-window';\n\nimport { SelectableValue, toIconName } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { clearButtonStyles } from '../Button/Button';\nimport { Icon } from '../Icon/Icon';\nimport { ScrollContainer } from '../ScrollContainer/ScrollContainer';\n\nimport { getSelectStyles } from './getSelectStyles';\nimport { ToggleAllState } from './types';\n\nexport interface ToggleAllOptions {\n  state: ToggleAllState;\n  selectAllClicked: () => void;\n  selectedCount?: number;\n}\n\ninterface SelectMenuProps {\n  maxHeight: number;\n  innerRef: RefCallback<HTMLDivElement>;\n  innerProps: {};\n  selectProps: {\n    toggleAllOptions?: ToggleAllOptions;\n    components?: { Option?: (props: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => JSX.Element };\n  };\n}\n\nexport const SelectMenu = ({\n  children,\n  maxHeight,\n  innerRef,\n  innerProps,\n  selectProps,\n}: React.PropsWithChildren<SelectMenuProps>) => {\n  const theme = useTheme2();\n  const styles = getSelectStyles(theme);\n\n  const { toggleAllOptions, components } = selectProps;\n\n  const optionsElement = components?.Option ?? SelectMenuOptions;\n\n  return (\n    <div\n      {...innerProps}\n      data-testid={selectors.components.Select.menu}\n      className={styles.menu}\n      style={{ maxHeight }}\n      aria-label={t('grafana-ui.select.menu-label', 'Select options menu')}\n    >\n      <ScrollContainer ref={innerRef} maxHeight=\"inherit\" overflowX=\"hidden\" showScrollIndicators padding={0.5}>\n        {toggleAllOptions && (\n          <ToggleAllOption\n            state={toggleAllOptions.state}\n            optionComponent={optionsElement}\n            selectedCount={toggleAllOptions.selectedCount}\n            onClick={toggleAllOptions.selectAllClicked}\n          ></ToggleAllOption>\n        )}\n        {children}\n      </ScrollContainer>\n    </div>\n  );\n};\n\nSelectMenu.displayName = 'SelectMenu';\n\nconst VIRTUAL_LIST_ITEM_HEIGHT = 37;\nconst VIRTUAL_LIST_WIDTH_ESTIMATE_MULTIPLIER = 8;\nconst VIRTUAL_LIST_PADDING = 8;\n// Some list items have icons or checkboxes so we need some extra width\nconst VIRTUAL_LIST_WIDTH_EXTRA = 58;\n\n// A virtualized version of the SelectMenu, descriptions for SelectableValue options not supported since those are of a variable height.\n//\n// To support the virtualized list we have to \"guess\" the width of the menu container based on the longest available option.\n// the reason for this is because all of the options will be positioned absolute, this takes them out of the document and no space\n// is created for them, thus the container can't grow to accomodate.\n//\n// VIRTUAL_LIST_ITEM_HEIGHT and WIDTH_ESTIMATE_MULTIPLIER are both magic numbers.\n// Some characters (such as emojis and other unicode characters) may consist of multiple code points in which case the width would be inaccurate (but larger than needed).\ninterface VirtualSelectMenuProps<T> {\n  children: React.ReactNode;\n  innerRef: React.Ref<HTMLDivElement>;\n  focusedOption: T;\n  innerProps: JSX.IntrinsicElements['div'];\n  options: T[];\n  maxHeight: number;\n  selectProps: {\n    toggleAllOptions?: ToggleAllOptions;\n    components?: { Option?: (props: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => JSX.Element };\n  };\n}\n\nexport const VirtualizedSelectMenu = ({\n  children,\n  maxHeight,\n  innerRef: scrollRef,\n  options,\n  selectProps,\n  focusedOption,\n}: VirtualSelectMenuProps<SelectableValue>) => {\n  const theme = useTheme2();\n  const styles = getSelectStyles(theme);\n  const listRef = useRef<List>(null);\n  const { toggleAllOptions, components } = selectProps;\n\n  const optionComponent = components?.Option ?? SelectMenuOptions;\n\n  // we need to check for option groups (categories)\n  // these are top level options with child options\n  // if they exist, flatten the list of options\n  const flattenedOptions = useMemo(\n    () => options.flatMap((option) => (option.options ? [option, ...option.options] : [option])),\n    [options]\n  );\n\n  // scroll the focused option into view when navigating with keyboard\n  const focusedIndex = flattenedOptions.findIndex(\n    (option: SelectableValue<unknown>) => option.value === focusedOption?.value\n  );\n  useLayoutEffect(() => {\n    listRef.current?.scrollToItem(focusedIndex);\n  }, [focusedIndex]);\n\n  if (!Array.isArray(children)) {\n    return null;\n  }\n\n  // flatten the children to account for any categories\n  // these will have array children that are the individual options\n  const flattenedChildren = children.flatMap((child, index) => {\n    if (hasArrayChildren(child)) {\n      // need to remove the children from the category else they end up in the DOM twice\n      const childWithoutChildren = React.cloneElement(child, {\n        children: null,\n      });\n      return [\n        childWithoutChildren,\n        ...child.props.children.slice(0, -1),\n        // add a bottom divider to the last item in the category\n        React.cloneElement(child.props.children.at(-1), {\n          innerProps: {\n            ...child.props.children.at(-1).props.innerProps,\n            style: {\n              borderBottom: `1px solid ${theme.colors.border.weak}`,\n              height: VIRTUAL_LIST_ITEM_HEIGHT,\n            },\n          },\n        }),\n      ];\n    }\n    return [child];\n  });\n\n  if (toggleAllOptions) {\n    flattenedChildren.unshift(\n      <ToggleAllOption\n        optionComponent={optionComponent}\n        state={toggleAllOptions.state}\n        selectedCount={toggleAllOptions.selectedCount}\n        onClick={toggleAllOptions.selectAllClicked}\n      ></ToggleAllOption>\n    );\n  }\n\n  let longestOption = max(flattenedOptions.map((option) => option.label?.length)) ?? 0;\n  if (toggleAllOptions && longestOption < 12) {\n    longestOption = 12;\n  }\n  const widthEstimate =\n    longestOption * VIRTUAL_LIST_WIDTH_ESTIMATE_MULTIPLIER + VIRTUAL_LIST_PADDING * 2 + VIRTUAL_LIST_WIDTH_EXTRA;\n  const heightEstimate = Math.min(flattenedChildren.length * VIRTUAL_LIST_ITEM_HEIGHT, maxHeight);\n\n  return (\n    <List\n      outerRef={scrollRef}\n      ref={listRef}\n      className={styles.menu}\n      height={heightEstimate}\n      width={widthEstimate}\n      aria-label={t('grafana-ui.select.menu-label', 'Select options menu')}\n      itemCount={flattenedChildren.length}\n      itemSize={VIRTUAL_LIST_ITEM_HEIGHT}\n    >\n      {({ index, style }) => <div style={{ ...style, overflow: 'hidden' }}>{flattenedChildren[index]}</div>}\n    </List>\n  );\n};\n\n// check if a child has array children (and is therefore a react-select group)\n// we need to flatten these so the correct count and elements are passed to the virtualized list\nconst hasArrayChildren = (child: React.ReactNode) => {\n  return React.isValidElement<Record<string, unknown>>(child) && Array.isArray(child.props.children);\n};\n\nVirtualizedSelectMenu.displayName = 'VirtualizedSelectMenu';\n\ninterface SelectMenuOptionProps<T> {\n  isDisabled: boolean;\n  isFocused: boolean;\n  isSelected: boolean;\n  indeterminate?: boolean;\n  innerProps: JSX.IntrinsicElements['div'];\n  innerRef: RefCallback<HTMLDivElement>;\n  renderOptionLabel?: (value: SelectableValue<T>) => JSX.Element;\n  data: SelectableValue<T>;\n}\n\nconst ToggleAllOption = ({\n  state,\n  onClick,\n  selectedCount,\n  optionComponent,\n}: {\n  state: ToggleAllState;\n  onClick: () => void;\n  selectedCount?: number;\n  optionComponent: (props: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => JSX.Element;\n}) => {\n  const theme = useTheme2();\n  const styles = getSelectStyles(theme);\n\n  return (\n    <button\n      data-testid={selectors.components.Select.toggleAllOptions}\n      className={css(clearButtonStyles(theme), styles.toggleAllButton, {\n        height: VIRTUAL_LIST_ITEM_HEIGHT,\n      })}\n      onClick={onClick}\n    >\n      {optionComponent({\n        isDisabled: false,\n        isSelected: state === ToggleAllState.allSelected,\n        isFocused: false,\n        data: {},\n        indeterminate: state === ToggleAllState.indeterminate,\n        innerRef: () => {},\n        innerProps: {},\n        children: (\n          <>\n            <Trans i18nKey=\"select.select-menu.selected-count\">Selected</Trans>\n            {` (${selectedCount ?? 0})`}\n          </>\n        ),\n      })}\n    </button>\n  );\n};\n\nexport const SelectMenuOptions = ({\n  children,\n  data,\n  innerProps,\n  innerRef,\n  isFocused,\n  isSelected,\n  renderOptionLabel,\n}: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => {\n  const theme = useTheme2();\n  const styles = getSelectStyles(theme);\n  const icon = data.icon ? toIconName(data.icon) : undefined;\n  // We are removing onMouseMove and onMouseOver from innerProps because they cause the whole\n  // list to re-render everytime the user hovers over an option. This is a performance issue.\n  // See https://github.com/JedWatson/react-select/issues/3128#issuecomment-451936743\n  const { onMouseMove, onMouseOver, ...rest } = innerProps;\n\n  return (\n    <div\n      ref={innerRef}\n      className={cx(\n        styles.option,\n        isFocused && styles.optionFocused,\n        isSelected && styles.optionSelected,\n        data.isDisabled && styles.optionDisabled\n      )}\n      {...rest}\n      data-testid={selectors.components.Select.option}\n      title={data.title}\n    >\n      {icon && <Icon name={icon} className={styles.optionIcon} />}\n      {data.imgUrl && <img className={styles.optionImage} src={data.imgUrl} alt={data.label || String(data.value)} />}\n      <div className={styles.optionBody}>\n        <span>{renderOptionLabel ? renderOptionLabel(data) : children}</span>\n        {data.description && <div className={styles.optionDescription}>{data.description}</div>}\n        {data.component && <data.component />}\n      </div>\n    </div>\n  );\n};\n\nSelectMenuOptions.displayName = 'SelectMenuOptions';\n"],"names":["_a","List"],"mappings":"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"}