UNPKG

@grafana/ui

Version:
1 lines 16.2 kB
{"version":3,"file":"MenuItem.mjs","sources":["../../../../src/components/Menu/MenuItem.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { ReactElement, useCallback, useState, useRef, useImperativeHandle, CSSProperties, AriaRole } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2, LinkTarget } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { getFocusStyles, getInternalRadius } from '../../themes/mixins';\nimport { IconName } from '../../types/icon';\nimport { Icon } from '../Icon/Icon';\nimport { Stack } from '../Layout/Stack/Stack';\n\nimport { SubMenu } from './SubMenu';\n\n/** @internal */\nexport type MenuItemElement = HTMLAnchorElement & HTMLButtonElement & HTMLDivElement;\n\n/** @internal */\nexport interface MenuItemProps<T = unknown> {\n /** Label of the menu item */\n label: string;\n /** Description of item */\n description?: string;\n /** Aria label for accessibility support */\n ariaLabel?: string;\n /** Aria checked for accessibility support */\n ariaChecked?: boolean;\n /** Target of the menu item (i.e. new window) */\n target?: LinkTarget;\n /** Icon of the menu item */\n icon?: IconName;\n /** Role of the menu item */\n role?: AriaRole;\n /** Url of the menu item */\n url?: string;\n /** Handler for the click behaviour */\n onClick?: (event: React.MouseEvent<HTMLElement>, payload?: T) => void;\n /** Custom MenuItem styles*/\n className?: string;\n /** Active */\n active?: boolean;\n /** Disabled */\n disabled?: boolean;\n /** Show in destructive style (error color) */\n destructive?: boolean;\n tabIndex?: number;\n /** List of menu items for the subMenu */\n childItems?: Array<ReactElement<MenuItemProps>>;\n /** Custom style for SubMenu */\n customSubMenuContainerStyles?: CSSProperties;\n /** Shortcut key combination */\n shortcut?: string;\n /** Test id for e2e tests and fullstory*/\n testId?: string;\n /* Optional component that will be shown together with other options. Does not get passed any props. */\n component?: React.ComponentType;\n}\n\n/** @internal */\nexport const MenuItem = React.memo(\n React.forwardRef<MenuItemElement, MenuItemProps>((props, ref) => {\n const {\n url,\n icon,\n label,\n description,\n ariaLabel,\n ariaChecked,\n target,\n onClick,\n className,\n active,\n disabled,\n destructive,\n childItems,\n role,\n tabIndex = -1,\n customSubMenuContainerStyles,\n shortcut,\n testId,\n } = props;\n const styles = useStyles2(getStyles);\n const [isActive, setIsActive] = useState(active);\n const [isSubMenuOpen, setIsSubMenuOpen] = useState(false);\n const onMouseEnter = useCallback(() => {\n if (disabled) {\n return;\n }\n\n setIsSubMenuOpen(true);\n setIsActive(true);\n }, [disabled]);\n const onMouseLeave = useCallback(() => {\n if (disabled) {\n return;\n }\n\n setIsSubMenuOpen(false);\n setIsActive(false);\n }, [disabled]);\n\n const hasSubMenu = childItems && childItems.length > 0;\n const ItemElement = hasSubMenu ? 'div' : url === undefined ? 'button' : 'a';\n const itemStyle = cx(\n {\n [styles.item]: true,\n [styles.active]: isActive,\n [styles.disabled]: disabled,\n [styles.destructive]: destructive && !disabled,\n },\n className\n );\n\n const disabledProps = {\n [ItemElement === 'button' ? 'disabled' : 'aria-disabled']: disabled,\n ...(ItemElement === 'a' && disabled && { href: undefined, onClick: undefined }),\n ...(disabled && {\n tabIndex: -1,\n ['data-disabled']: disabled, // used to identify disabled items in Menu.tsx\n }),\n };\n\n const localRef = useRef<MenuItemElement>(null);\n useImperativeHandle(ref, () => localRef.current!);\n\n const handleKeys = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n event.stopPropagation();\n if (hasSubMenu) {\n setIsSubMenuOpen(true);\n setIsActive(true);\n }\n break;\n default:\n break;\n }\n };\n\n const closeSubMenu = () => {\n setIsSubMenuOpen(false);\n setIsActive(false);\n localRef?.current?.focus();\n };\n\n const hasShortcut = Boolean(shortcut && shortcut.length > 0);\n\n return (\n <ItemElement\n target={target}\n className={itemStyle}\n rel={target === '_blank' ? 'noopener noreferrer' : undefined}\n href={url}\n onClick={(event) => {\n if (hasSubMenu && !isSubMenuOpen) {\n event.preventDefault();\n event.stopPropagation();\n }\n onClick?.(event);\n }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onKeyDown={handleKeys}\n // If there's no URL, then set either the role from the props, or fallback to menuitem\n // If there IS a URL, then use the role from props - which will result in this either being a\n // link (default role of an anchor), or whatever the user of this component specified\n role={!url ? role || 'menuitem' : role}\n data-role=\"menuitem\" // used to identify menuitem in Menu.tsx\n ref={localRef}\n data-testid={testId}\n aria-label={ariaLabel}\n aria-checked={ariaChecked}\n tabIndex={tabIndex}\n {...disabledProps}\n >\n <Stack direction=\"row\" justifyContent=\"flex-start\" alignItems=\"center\">\n {icon && <Icon name={icon} className={styles.icon} aria-hidden />}\n <span className={styles.ellipsis}>{label}</span>\n <div className={cx(styles.rightWrapper, { [styles.withShortcut]: hasShortcut })}>\n {hasShortcut && (\n <div className={styles.shortcut}>\n <Icon name=\"keyboard\" title={t('grafana-ui.menu-item.keyboard-shortcut-label', 'Keyboard shortcut')} />\n {shortcut}\n </div>\n )}\n {hasSubMenu && (\n <SubMenu\n items={childItems}\n isOpen={isSubMenuOpen}\n close={closeSubMenu}\n customStyle={customSubMenuContainerStyles}\n />\n )}\n </div>\n </Stack>\n {description && (\n <div\n className={cx(styles.description, styles.ellipsis, {\n [styles.descriptionWithIcon]: icon !== undefined,\n })}\n >\n {description}\n </div>\n )}\n {props.component ? <props.component /> : null}\n </ItemElement>\n );\n })\n);\n\nMenuItem.displayName = 'MenuItem';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const menuPadding = theme.components.menu.padding * theme.spacing.gridSize;\n\n return {\n item: css({\n background: 'none',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n color: theme.colors.text.primary,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'stretch',\n justifyContent: 'center',\n padding: theme.spacing(0.5, 1.5),\n minHeight: theme.spacing(4),\n borderRadius: getInternalRadius(theme, menuPadding, { parentBorderWidth: 0 }),\n margin: 0,\n border: 'none',\n width: '100%',\n position: 'relative',\n\n '&:hover, &:focus-visible': {\n background: theme.colors.action.hover,\n color: theme.colors.text.primary,\n textDecoration: 'none',\n },\n\n '&:focus-visible': getFocusStyles(theme),\n }),\n active: css({\n background: theme.colors.action.hover,\n }),\n destructive: css({\n color: theme.colors.error.text,\n\n svg: {\n color: theme.colors.error.text,\n },\n\n '&:hover, &:focus, &:focus-visible': {\n background: theme.colors.error.main,\n color: theme.colors.error.contrastText,\n\n svg: {\n color: theme.colors.error.contrastText,\n },\n },\n }),\n disabled: css({\n color: theme.colors.action.disabledText,\n label: 'menu-item-disabled',\n '&:hover, &:focus, &:focus-visible': {\n cursor: 'not-allowed',\n background: 'none',\n color: theme.colors.action.disabledText,\n },\n }),\n icon: css({\n opacity: 0.7,\n color: theme.colors.text.secondary,\n }),\n rightWrapper: css({\n display: 'flex',\n alignItems: 'center',\n marginLeft: 'auto',\n }),\n withShortcut: css({\n minWidth: theme.spacing(10.5),\n }),\n shortcut: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n marginLeft: theme.spacing(2),\n color: theme.colors.text.secondary,\n }),\n description: css({\n ...theme.typography.bodySmall,\n color: theme.colors.text.secondary,\n textAlign: 'start',\n }),\n descriptionWithIcon: css({\n marginLeft: theme.spacing(3),\n }),\n ellipsis: css({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n };\n};\n"],"names":[],"mappings":"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"}