UNPKG

@grafana/ui

Version:
1 lines • 29.8 kB
{"version":3,"file":"PanelChrome.mjs","sources":["../../../../src/components/PanelChrome/PanelChrome.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { CSSProperties, ReactElement, ReactNode, useId, useState } from 'react';\nimport * as React from 'react';\nimport { useMeasure, useToggle } from 'react-use';\n\nimport { GrafanaTheme2, LoadingState } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport { useStyles2, useTheme2 } from '../../themes';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { usePointerDistance } from '../../utils';\nimport { DelayRender } from '../../utils/DelayRender';\nimport { useElementSelection } from '../ElementSelectionContext/ElementSelectionContext';\nimport { Icon } from '../Icon/Icon';\nimport { LoadingBar } from '../LoadingBar/LoadingBar';\nimport { Text } from '../Text/Text';\nimport { Tooltip } from '../Tooltip';\n\nimport { HoverWidget } from './HoverWidget';\nimport { PanelDescription } from './PanelDescription';\nimport { PanelMenu } from './PanelMenu';\nimport { PanelStatus } from './PanelStatus';\nimport { TitleItem } from './TitleItem';\n\n/**\n * @internal\n */\nexport type PanelChromeProps = (AutoSize | FixedDimensions) & (Collapsible | HoverHeader);\n\ninterface BaseProps {\n padding?: PanelPadding;\n title?: string | React.ReactElement;\n description?: string | (() => string);\n titleItems?: ReactNode;\n menu?: ReactElement | (() => ReactElement);\n dragClass?: string;\n dragClassCancel?: string;\n onDragStart?: (e: React.PointerEvent) => void;\n selectionId?: string;\n /**\n * Use only to indicate loading or streaming data in the panel.\n * Any other values of loadingState are ignored.\n */\n loadingState?: LoadingState;\n /**\n * Used to display status message (used for panel errors currently)\n */\n statusMessage?: string;\n /**\n * Handle opening error details view (like inspect / error tab)\n */\n statusMessageOnClick?: (e: React.SyntheticEvent) => void;\n /**\n * @deprecated use `actions' instead\n **/\n leftItems?: ReactNode[];\n actions?: ReactNode;\n displayMode?: 'default' | 'transparent';\n onCancelQuery?: () => void;\n /**\n * callback when opening the panel menu\n */\n onOpenMenu?: () => void;\n /**\n * Used for setting panel attention\n */\n onFocus?: () => void;\n /**\n * Debounce the event handler, if possible\n */\n onMouseMove?: () => void;\n onMouseEnter?: () => void;\n /**\n * If true, the VizPanelMenu will always be visible in the panel header. Defaults to false.\n */\n showMenuAlways?: boolean;\n}\n\ninterface FixedDimensions extends BaseProps {\n width: number;\n height: number;\n children: (innerWidth: number, innerHeight: number) => ReactNode;\n}\n\ninterface AutoSize extends BaseProps {\n width?: never;\n height?: never;\n children: ReactNode;\n}\n\ninterface Collapsible {\n collapsible: boolean;\n collapsed?: boolean;\n /**\n * callback when collapsing or expanding the panel\n */\n onToggleCollapse?: (collapsed: boolean) => void;\n hoverHeader?: never;\n hoverHeaderOffset?: never;\n}\n\ninterface HoverHeader {\n collapsible?: never;\n collapsed?: never;\n showMenuAlways?: never;\n onToggleCollapse?: never;\n hoverHeader?: boolean;\n hoverHeaderOffset?: number;\n}\n\n/**\n * @internal\n */\nexport type PanelPadding = 'none' | 'md';\n\n/**\n * @internal\n */\nexport function PanelChrome({\n width,\n height,\n children,\n padding = 'md',\n title = '',\n description = '',\n displayMode = 'default',\n titleItems,\n menu,\n dragClass,\n dragClassCancel,\n hoverHeader = false,\n hoverHeaderOffset,\n loadingState,\n statusMessage,\n statusMessageOnClick,\n leftItems,\n actions,\n selectionId,\n onCancelQuery,\n onOpenMenu,\n collapsible = false,\n collapsed,\n onToggleCollapse,\n onFocus,\n onMouseMove,\n onMouseEnter,\n onDragStart,\n showMenuAlways = false,\n}: PanelChromeProps) {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n const panelContentId = useId();\n const panelTitleId = useId().replace(/:/g, '_');\n const { isSelected, onSelect, isSelectable } = useElementSelection(selectionId);\n const pointerDistance = usePointerDistance();\n\n const hasHeader = !hoverHeader;\n\n const [isOpen, toggleOpen] = useToggle(true);\n\n // Highlight the full panel when hovering over header\n const [selectableHighlight, setSelectableHighlight] = useState(false);\n const onHeaderEnter = React.useCallback(() => setSelectableHighlight(true), []);\n const onHeaderLeave = React.useCallback(() => setSelectableHighlight(false), []);\n\n // if collapsed is not defined, then component is uncontrolled and state is managed internally\n if (collapsed === undefined) {\n collapsed = !isOpen;\n }\n\n // hover menu is only shown on hover when not on touch devices\n const showOnHoverClass = showMenuAlways ? 'always-show' : 'show-on-hover';\n const isPanelTransparent = displayMode === 'transparent';\n\n const headerHeight = getHeaderHeight(theme, hasHeader);\n const { contentStyle, innerWidth, innerHeight } = getContentStyle(\n padding,\n theme,\n headerHeight,\n collapsed,\n height,\n width\n );\n\n const headerStyles: CSSProperties = {\n height: headerHeight,\n cursor: dragClass ? 'move' : 'auto',\n };\n\n const containerStyles: CSSProperties = { width, height: collapsed ? undefined : height };\n const [ref, { width: loadingBarWidth }] = useMeasure<HTMLDivElement>();\n\n /** Old property name now maps to actions */\n if (leftItems) {\n actions = leftItems;\n }\n\n const testid = typeof title === 'string' ? selectors.components.Panels.Panel.title(title) : 'Panel';\n\n // Handle drag & selection events\n // Mainly the tricky bit of differentiating between dragging and selecting\n const onPointerUp = React.useCallback(\n (evt: React.PointerEvent) => {\n if (\n pointerDistance.check(evt) ||\n (dragClassCancel && evt.target instanceof Element && evt.target.closest(`.${dragClassCancel}`))\n ) {\n return;\n }\n\n // setTimeout is needed here because onSelect stops the event propagation\n // By doing so, the event won't get to the document and drag will never be stopped\n setTimeout(() => onSelect?.(evt));\n },\n [dragClassCancel, onSelect, pointerDistance]\n );\n\n const onPointerDown = React.useCallback(\n (evt: React.PointerEvent) => {\n evt.stopPropagation();\n\n pointerDistance.set(evt);\n\n onDragStart?.(evt);\n },\n [pointerDistance, onDragStart]\n );\n\n const onContentPointerDown = React.useCallback(\n (evt: React.PointerEvent) => {\n // Ignore clicks inside buttons, links, canvas and svg elments\n // This does prevent a clicks inside a graphs from selecting panel as there is normal div above the canvas element that intercepts the click\n if (evt.target instanceof Element && evt.target.closest('button,a,canvas,svg')) {\n return;\n }\n\n onSelect?.(evt);\n },\n [onSelect]\n );\n\n const headerContent = (\n <>\n {/* Non collapsible title */}\n {!collapsible && title && (\n <div className={styles.title}>\n <Text\n element=\"h2\"\n variant=\"h6\"\n truncate\n title={typeof title === 'string' ? title : undefined}\n id={panelTitleId}\n >\n {title}\n </Text>\n </div>\n )}\n\n {/* Collapsible title */}\n {collapsible && (\n <div className={styles.title}>\n <Text element=\"h2\" variant=\"h6\">\n <button\n type=\"button\"\n className={styles.clearButtonStyles}\n onClick={() => {\n toggleOpen();\n if (onToggleCollapse) {\n onToggleCollapse(!collapsed);\n }\n }}\n aria-expanded={!collapsed}\n aria-controls={!collapsed ? panelContentId : undefined}\n >\n <Icon\n name={!collapsed ? 'angle-down' : 'angle-right'}\n aria-hidden={!!title}\n aria-label={!title ? 'toggle collapse panel' : undefined}\n />\n <Text variant=\"h6\" truncate id={panelTitleId}>\n {title}\n </Text>\n </button>\n </Text>\n </div>\n )}\n\n <div className={cx(styles.titleItems, dragClassCancel)} data-testid=\"title-items-container\">\n <PanelDescription description={description} className={dragClassCancel} />\n {titleItems}\n </div>\n {loadingState === LoadingState.Streaming && (\n <Tooltip content={onCancelQuery ? 'Stop streaming' : 'Streaming'}>\n <TitleItem className={dragClassCancel} data-testid=\"panel-streaming\" onClick={onCancelQuery}>\n <Icon name=\"circle-mono\" size=\"md\" className={styles.streaming} />\n </TitleItem>\n </Tooltip>\n )}\n {loadingState === LoadingState.Loading && onCancelQuery && (\n <DelayRender delay={2000}>\n <Tooltip content=\"Cancel query\">\n <TitleItem\n className={cx(dragClassCancel, styles.pointer)}\n data-testid=\"panel-cancel-query\"\n onClick={onCancelQuery}\n >\n <Icon name=\"sync-slash\" size=\"md\" />\n </TitleItem>\n </Tooltip>\n </DelayRender>\n )}\n <div className={styles.rightAligned}>\n {actions && <div className={styles.rightActions}>{itemsRenderer(actions, (item) => item)}</div>}\n </div>\n </>\n );\n\n return (\n // tabIndex={0} is needed for keyboard accessibility in the plot area\n <section\n className={cx(\n styles.container,\n isPanelTransparent && styles.transparentContainer,\n isSelected && 'dashboard-selected-element',\n !isSelected && isSelectable && selectableHighlight && 'dashboard-selectable-element'\n )}\n style={containerStyles}\n aria-labelledby={!!title ? panelTitleId : undefined}\n data-testid={testid}\n tabIndex={0} // eslint-disable-line jsx-a11y/no-noninteractive-tabindex\n onFocus={onFocus}\n onMouseMove={onMouseMove}\n onMouseEnter={onMouseEnter}\n ref={ref}\n >\n <div className={styles.loadingBarContainer}>\n {loadingState === LoadingState.Loading ? (\n <LoadingBar width={loadingBarWidth} ariaLabel=\"Panel loading bar\" />\n ) : null}\n </div>\n\n {hoverHeader && (\n <>\n <HoverWidget\n menu={menu}\n title={typeof title === 'string' ? title : undefined}\n offset={hoverHeaderOffset}\n dragClass={dragClass}\n onOpenMenu={onOpenMenu}\n >\n {headerContent}\n </HoverWidget>\n\n {statusMessage && (\n <div className={styles.errorContainerFloating}>\n <PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel=\"Panel status\" />\n </div>\n )}\n </>\n )}\n\n {hasHeader && (\n <div\n className={cx(styles.headerContainer, dragClass)}\n style={headerStyles}\n data-testid=\"header-container\"\n onPointerDown={onPointerDown}\n onMouseEnter={isSelectable ? onHeaderEnter : undefined}\n onMouseLeave={isSelectable ? onHeaderLeave : undefined}\n onPointerUp={onPointerUp}\n >\n {statusMessage && (\n <div className={dragClassCancel}>\n <PanelStatus message={statusMessage} onClick={statusMessageOnClick} ariaLabel=\"Panel status\" />\n </div>\n )}\n\n {headerContent}\n\n {menu && (\n <PanelMenu\n menu={menu}\n title={typeof title === 'string' ? title : undefined}\n placement=\"bottom-end\"\n menuButtonClass={cx(styles.menuItem, dragClassCancel, showOnHoverClass)}\n onOpenMenu={onOpenMenu}\n />\n )}\n </div>\n )}\n\n {!collapsed && (\n <div\n id={panelContentId}\n data-testid={selectors.components.Panels.Panel.content}\n className={cx(styles.content, height === undefined && styles.containNone)}\n style={contentStyle}\n onPointerDown={onContentPointerDown}\n >\n {typeof children === 'function' ? children(innerWidth, innerHeight) : children}\n </div>\n )}\n </section>\n );\n}\n\nconst itemsRenderer = (items: ReactNode[] | ReactNode, renderer: (items: ReactNode[]) => ReactNode): ReactNode => {\n const toRender = React.Children.toArray(items).filter(Boolean);\n return toRender.length > 0 ? renderer(toRender) : null;\n};\n\nconst getHeaderHeight = (theme: GrafanaTheme2, hasHeader: boolean) => {\n if (hasHeader) {\n return theme.spacing.gridSize * theme.components.panel.headerHeight;\n }\n\n return 0;\n};\n\nconst getContentStyle = (\n padding: string,\n theme: GrafanaTheme2,\n headerHeight: number,\n collapsed: boolean,\n height?: number,\n width?: number\n) => {\n const chromePadding = (padding === 'md' ? theme.components.panel.padding : 0) * theme.spacing.gridSize;\n\n const panelPadding = chromePadding * 2;\n const panelBorder = 1 * 2;\n\n let innerWidth = 0;\n if (width) {\n innerWidth = width - panelPadding - panelBorder;\n }\n\n let innerHeight = 0;\n if (height) {\n innerHeight = height - headerHeight - panelPadding - panelBorder;\n }\n\n if (collapsed) {\n innerHeight = headerHeight;\n }\n\n const contentStyle: CSSProperties = {\n padding: chromePadding,\n };\n\n return { contentStyle, innerWidth, innerHeight };\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const { background, borderColor, padding } = theme.components.panel;\n\n return {\n container: css({\n label: 'panel-container',\n backgroundColor: background,\n border: `1px solid ${borderColor}`,\n position: 'relative',\n borderRadius: theme.shape.radius.default,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n\n '.always-show': {\n background: 'none',\n '&:focus-visible, &:hover': {\n background: theme.colors.secondary.shade,\n },\n },\n\n '.show-on-hover': {\n opacity: '0',\n visibility: 'hidden',\n },\n\n '&:focus-visible, &:hover': {\n // only show menu icon on hover or focused panel\n '.show-on-hover': {\n opacity: '1',\n visibility: 'visible',\n },\n },\n\n '&:focus-visible': getFocusStyles(theme),\n\n // The not:(:focus) clause is so that this rule is only applied when decendants are focused (important otherwise the hover header is visible when panel is clicked).\n '&:focus-within:not(:focus)': {\n '.show-on-hover': {\n visibility: 'visible',\n opacity: '1',\n },\n },\n }),\n transparentContainer: css({\n label: 'panel-transparent-container',\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n boxSizing: 'border-box',\n '&:hover': {\n border: `1px solid ${borderColor}`,\n },\n }),\n loadingBarContainer: css({\n label: 'panel-loading-bar-container',\n position: 'absolute',\n top: 0,\n width: '100%',\n // this is to force the loading bar container to create a new stacking context\n // otherwise, in webkit browsers on windows/linux, the aliasing of panel text changes when the loading bar is shown\n // see https://github.com/grafana/grafana/issues/88104\n zIndex: 1,\n }),\n containNone: css({\n contain: 'none',\n }),\n content: css({\n label: 'panel-content',\n flexGrow: 1,\n contain: 'size layout',\n }),\n headerContainer: css({\n label: 'panel-header',\n display: 'flex',\n alignItems: 'center',\n }),\n pointer: css({\n cursor: 'pointer',\n }),\n streaming: css({\n label: 'panel-streaming',\n marginRight: 0,\n color: theme.colors.success.text,\n\n '&:hover': {\n color: theme.colors.success.text,\n },\n }),\n title: css({\n label: 'panel-title',\n display: 'flex',\n padding: theme.spacing(0, padding),\n minWidth: 0,\n '& > h2': {\n minWidth: 0,\n },\n }),\n items: css({\n display: 'flex',\n }),\n item: css({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n }),\n hiddenMenu: css({\n visibility: 'hidden',\n }),\n menuItem: css({\n label: 'panel-menu',\n border: 'none',\n background: theme.colors.secondary.main,\n '&:hover': {\n background: theme.colors.secondary.shade,\n },\n }),\n errorContainerFloating: css({\n label: 'error-container',\n position: 'absolute',\n left: 0,\n top: 0,\n zIndex: 1,\n }),\n rightActions: css({\n display: 'flex',\n padding: theme.spacing(0, padding),\n gap: theme.spacing(1),\n }),\n rightAligned: css({\n label: 'right-aligned-container',\n marginLeft: 'auto',\n display: 'flex',\n alignItems: 'center',\n }),\n titleItems: css({\n display: 'flex',\n height: '100%',\n }),\n clearButtonStyles: css({\n alignItems: 'center',\n display: 'flex',\n gap: theme.spacing(0.5),\n background: 'transparent',\n border: 'none',\n padding: 0,\n maxWidth: '100%',\n }),\n };\n};\n"],"names":[],"mappings":"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"}