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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"}