{"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 } 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';\n\nimport { useTheme2 } from '../../themes/ThemeContext';\nimport { t, Trans } from '../../utils/i18n';\nimport { clearButtonStyles } from '../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(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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"}