@grafana/ui
Version:
Grafana Components Library
1 lines • 32.2 kB
Source Map (JSON)
{"version":3,"file":"PanelChrome.mjs","sources":["../../../../src/components/PanelChrome/PanelChrome.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { CSSProperties, PropsWithChildren, 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';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2, useTheme2 } from '../../themes/ThemeContext';\nimport { getFocusStyles } from '../../themes/mixins';\nimport { DelayRender } from '../../utils/DelayRender';\nimport { getFeatureToggle } from '../../utils/featureToggle';\nimport { usePointerDistance } from '../../utils/usePointerDistance';\nimport { useElementSelection } from '../ElementSelectionContext/ElementSelectionContext';\nimport { Icon } from '../Icon/Icon';\nimport { LoadingBar } from '../LoadingBar/LoadingBar';\nimport { Text } from '../Text/Text';\nimport { Tooltip } from '../Tooltip/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\nconst MaybeWrap = ({ children }: PropsWithChildren<{}>) => {\n const styles = useStyles2(getStyles);\n return getFeatureToggle('preventPanelChromeOverflow') ? <div className={styles.container}>{children}</div> : children;\n};\n\n/**\n * @internal\n */\nexport type PanelPadding = 'none' | 'md';\n\n/**\n * Component used for rendering content wrapped in the same style as grafana panels.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/plugins-panelchrome--docs\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={\n !title ? t('grafana-ui.panel-chrome.aria-label-toggle-collapse', 'toggle collapse panel') : undefined\n }\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\n content={\n onCancelQuery\n ? t('grafana-ui.panel-chrome.tooltip-stop-streaming', 'Stop streaming')\n : t('grafana-ui.panel-chrome.tooltip-streaming', 'Streaming')\n }\n >\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={t('grafana-ui.panel-chrome.tooltip-cancel', '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 <MaybeWrap>\n {/* tabIndex={0} is needed for keyboard accessibility in the plot area */}\n <section\n className={cx(\n styles.panel,\n isPanelTransparent && styles.panelTransparent,\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\n width={loadingBarWidth}\n ariaLabel={t('grafana-ui.panel-chrome.ariaLabel-panel-loading', 'Panel loading bar')}\n />\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\n message={statusMessage}\n onClick={statusMessageOnClick}\n ariaLabel={t('grafana-ui.panel-chrome.ariaLabel-panel-status', 'Panel status')}\n />\n </div>\n )}\n </>\n )}\n\n {hasHeader && (\n <div\n className={cx(styles.headerContainer, dragClass)}\n style={headerStyles}\n data-testid={selectors.components.Panels.Panel.headerContainer}\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\n message={statusMessage}\n onClick={statusMessageOnClick}\n ariaLabel={t('grafana-ui.panel-chrome.ariaLabel-panel-status', 'Panel status')}\n />\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 </MaybeWrap>\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 height: '100%',\n position: 'relative',\n }),\n panel: css({\n label: 'panel-container',\n backgroundColor: background,\n border: `1px solid ${borderColor}`,\n position: getFeatureToggle('preventPanelChromeOverflow') ? 'unset' : 'relative',\n borderRadius: theme.shape.radius.default,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n overflow: getFeatureToggle('preventPanelChromeOverflow') ? 'hidden' : 'initial',\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 panelTransparent: 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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"}