UNPKG

@grafana/ui

Version:
1 lines 17 kB
{"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';\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(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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"}