UNPKG

@grafana/ui

Version:
1 lines • 44.7 kB
{"version":3,"file":"TooltipPlugin2.cjs","sources":["../../../../../src/components/uPlot/plugins/TooltipPlugin2.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useLayoutEffect, useRef, useReducer, type CSSProperties } from 'react';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport type uPlot from 'uplot';\n\nimport { type GrafanaTheme2, type LinkModel } from '@grafana/data';\nimport { DashboardCursorSync } from '@grafana/schema';\n\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { type RangeSelection1D, type RangeSelection2D, type OnSelectRangeCallback } from '../../PanelChrome';\nimport { getPortalContainer } from '../../Portal/Portal';\nimport { type AdHocFilterModel } from '../../VizTooltip';\nimport { type UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\nimport { CloseButton } from './CloseButton';\n\nexport const TOOLTIP_OFFSET = 10;\n\n// todo: barchart? histogram?\nexport const enum TooltipHoverMode {\n // Single mode in TimeSeries, Candlestick, Trend, StateTimeline, Heatmap?\n xOne,\n // All mode in TimeSeries, Candlestick, Trend, StateTimeline, Heatmap?\n xAll,\n // Single mode in XYChart, Heatmap?\n xyOne,\n}\n\ntype GetDataLinksCallback = (seriesIdx: number, dataIdx: number) => LinkModel[];\ntype GetAdHocFiltersCallback = (seriesIdx: number, dataIdx: number) => AdHocFilterModel[];\n\ninterface TooltipPlugin2Props {\n config: UPlotConfigBuilder;\n hoverMode: TooltipHoverMode;\n\n syncMode?: DashboardCursorSync;\n syncScope?: string;\n\n // x only\n queryZoom?: (range: { from: number; to: number }) => void;\n // y-only, via shiftKey\n clientZoom?: boolean;\n\n onSelectRange?: OnSelectRangeCallback;\n getDataLinks?: GetDataLinksCallback;\n getAdHocFilters?: GetAdHocFiltersCallback;\n\n render: (\n u: uPlot,\n dataIdxs: Array<number | null>,\n seriesIdx: number | null,\n isPinned: boolean,\n dismiss: () => void,\n // selected time range (for annotation triggering)\n timeRange: TimeRange2 | null,\n viaSync: boolean,\n dataLinks: LinkModel[],\n adHocFilters: AdHocFilterModel[]\n ) => React.ReactNode;\n\n maxWidth?: number;\n}\n\ninterface TooltipContainerState {\n style: Partial<CSSProperties>;\n isHovering: boolean;\n isPinned: boolean;\n dismiss: () => void;\n contents?: React.ReactNode;\n}\n\ninterface TooltipContainerSize {\n observer: ResizeObserver;\n width: number;\n height: number;\n}\n\nexport interface TimeRange2 {\n from: number;\n to: number;\n}\n\nfunction mergeState(prevState: TooltipContainerState, nextState: Partial<TooltipContainerState>) {\n return {\n ...prevState,\n ...nextState,\n style: {\n ...prevState.style,\n ...nextState.style,\n },\n };\n}\n\nfunction initState(): TooltipContainerState {\n return {\n style: { transform: '', pointerEvents: 'none' },\n isHovering: false,\n isPinned: false,\n contents: null,\n dismiss: () => {},\n };\n}\n\n// min px width that triggers zoom\nconst MIN_ZOOM_DIST = 5;\n\nconst maybeZoomAction = (e?: MouseEvent | null) => e != null && !e.ctrlKey && !e.metaKey;\n\nconst getDataLinksFallback: GetDataLinksCallback = () => [];\nconst getAdHocFiltersFallback: GetAdHocFiltersCallback = () => [];\n\nconst userAgentIsMobile = /Android|iPhone|iPad/i.test(navigator.userAgent);\n\nexport const TooltipPlugin2 = ({\n config,\n hoverMode,\n render,\n clientZoom = false,\n queryZoom,\n onSelectRange,\n maxWidth,\n syncMode = DashboardCursorSync.Off,\n syncScope = 'global', // eventsScope\n getDataLinks = getDataLinksFallback,\n getAdHocFilters = getAdHocFiltersFallback,\n}: TooltipPlugin2Props) => {\n const domRef = useRef<HTMLDivElement>(null);\n const portalRoot = useRef<HTMLElement | null>(null);\n const plotRef = useRef<uPlot | null>(null);\n\n if (portalRoot.current == null) {\n portalRoot.current = getPortalContainer();\n }\n\n const [{ isHovering, isPinned, contents, style, dismiss }, setState] = useReducer(mergeState, null, initState);\n\n const sizeRef = useRef<TooltipContainerSize | undefined>(undefined);\n const styles = useStyles2(getStyles, maxWidth);\n\n const renderRef = useRef(render);\n renderRef.current = render;\n\n const getLinksRef = useRef(getDataLinks);\n getLinksRef.current = getDataLinks;\n\n const getAdHocFiltersRef = useRef(getAdHocFilters);\n getAdHocFiltersRef.current = getAdHocFilters;\n\n useLayoutEffect(() => {\n sizeRef.current?.observer.disconnect();\n\n sizeRef.current = {\n width: 0,\n height: 0,\n observer: new ResizeObserver((entries) => {\n let size = sizeRef.current!;\n\n for (const entry of entries) {\n if (entry.borderBoxSize?.length > 0) {\n size.width = entry.borderBoxSize[0].inlineSize;\n size.height = entry.borderBoxSize[0].blockSize;\n } else {\n size.width = entry.contentRect.width;\n size.height = entry.contentRect.height;\n }\n }\n }),\n };\n\n let yZoomed = false;\n let yDrag = false;\n\n let _plot = plotRef.current;\n let _isHovering = isHovering;\n let _someSeriesIdx = false;\n let _isPinned = isPinned;\n let _style = style;\n\n let plotVisible = false;\n\n const syncTooltip = syncMode === DashboardCursorSync.Tooltip;\n\n if (syncMode !== DashboardCursorSync.Off && config.scales[0].props.isTime) {\n config.setCursor({\n sync: {\n key: syncScope,\n scales: ['x', null],\n },\n });\n }\n\n const updateHovering = () => {\n if (viaSync) {\n _isHovering = plotVisible && _someSeriesIdx && syncTooltip;\n } else {\n _isHovering = closestSeriesIdx != null || (hoverMode === TooltipHoverMode.xAll && _someSeriesIdx);\n }\n };\n\n let offsetX = 0;\n let offsetY = 0;\n\n let selectedRange: TimeRange2 | null = null;\n let seriesIdxs: Array<number | null> = [];\n let closestSeriesIdx: number | null = null;\n let viaSync = false;\n let dataLinks: LinkModel[] = [];\n let adHocFilters: AdHocFilterModel[] = [];\n\n // for onceClick link rendering during mousemoves we use these pre-generated first links or actions\n // these will be wrong if the titles have interpolation using the hovered *value*\n // but this should be quite rare. we'll fix it if someone actually encounters this\n let persistentLinks: LinkModel[][] = [];\n\n let pendingRender = false;\n let pendingPinned = false;\n\n const scheduleRender = (setPinned = false) => {\n if (!pendingRender) {\n // defer unrender for 100ms to reduce flickering in small gaps\n if (!_isHovering) {\n setTimeout(_render, 100);\n } else {\n queueMicrotask(_render);\n }\n\n pendingRender = true;\n }\n\n if (setPinned) {\n pendingPinned = true;\n }\n };\n\n // in some ways this is similar to ClickOutsideWrapper.tsx\n const downEventOutside = (e: Event) => {\n if (e instanceof KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n dismiss();\n }\n return;\n }\n\n // this tooltip is Portaled, but actions inside it create forms in Modals\n const isModalOrPortaled = '[role=\"dialog\"], #grafana-portal-container';\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n if ((e.target as HTMLElement).closest(isModalOrPortaled) == null) {\n dismiss();\n }\n };\n\n const _render = () => {\n pendingRender = false;\n\n if (pendingPinned) {\n _style = { pointerEvents: _isPinned ? 'all' : 'none' };\n\n // @ts-ignore\n _plot!.cursor._lock = _isPinned;\n\n if (_isPinned) {\n document.addEventListener('mousedown', downEventOutside, true);\n document.addEventListener('keydown', downEventOutside, true);\n } else {\n document.removeEventListener('mousedown', downEventOutside, true);\n document.removeEventListener('keydown', downEventOutside, true);\n }\n\n pendingPinned = false;\n }\n\n let state: TooltipContainerState = {\n style: _style,\n isPinned: _isPinned,\n isHovering: _isHovering,\n contents:\n _isHovering || selectedRange != null\n ? renderRef.current(\n _plot!,\n seriesIdxs,\n closestSeriesIdx,\n _isPinned,\n dismiss,\n selectedRange,\n viaSync,\n _isPinned ? dataLinks : closestSeriesIdx != null ? persistentLinks[closestSeriesIdx] : [],\n _isPinned ? adHocFilters : []\n )\n : null,\n dismiss,\n };\n\n setState(state);\n\n // TODO: set u.over.style.cursor = 'pointer' if we hovered a oneClick point\n // else revert to default...but only when the new pointer is different from prev\n\n selectedRange = null;\n };\n\n const dismiss = () => {\n let prevIsPinned = _isPinned;\n _isPinned = false;\n _isHovering = false;\n _plot!.setCursor({ left: -10, top: -10 });\n dataLinks = [];\n adHocFilters = [];\n\n scheduleRender(prevIsPinned);\n };\n\n config.addHook('init', (u) => {\n plotRef.current = _plot = u;\n\n // detect shiftKey and mutate drag mode from x-only to y-only\n if (clientZoom) {\n u.over.addEventListener(\n 'mousedown',\n (e) => {\n if (!maybeZoomAction(e)) {\n return;\n }\n\n if (e.button === 0 && e.shiftKey) {\n yDrag = true;\n\n u.cursor.drag!.x = false;\n u.cursor.drag!.y = true;\n\n let onUp = (e: MouseEvent) => {\n u.cursor.drag!.x = true;\n u.cursor.drag!.y = false;\n document.removeEventListener('mouseup', onUp, true);\n };\n\n document.addEventListener('mouseup', onUp, true);\n }\n },\n true\n );\n }\n\n // add zoom-in cursor during drag-to-zoom interaction\n if (queryZoom != null || clientZoom) {\n u.over.addEventListener(\n 'mousedown',\n (e) => {\n if (!maybeZoomAction(e)) {\n return;\n }\n\n if (e.button === 0) {\n u.over.classList.add('zoom-drag');\n\n let onUp = () => {\n u.over.classList.remove('zoom-drag');\n document.removeEventListener('mouseup', onUp, true);\n };\n\n document.addEventListener('mouseup', onUp, true);\n }\n },\n true\n );\n }\n\n // this handles pinning, 0-width range selection, and one-click\n u.over.addEventListener('click', (e) => {\n if (e.target === u.over) {\n if (e.ctrlKey || e.metaKey) {\n let xVal;\n\n const isXAxisHorizontal = u.scales.x.ori === 0;\n if (isXAxisHorizontal) {\n xVal = u.posToVal(u.cursor.left!, 'x');\n } else {\n xVal = u.posToVal(u.select.top + u.select.height, 'x');\n }\n\n selectedRange = {\n from: xVal,\n to: xVal,\n };\n\n scheduleRender(false);\n }\n // if tooltip visible, not pinned, and within proximity to a series/point\n else if (_isHovering && !_isPinned && closestSeriesIdx != null) {\n dataLinks = getLinksRef.current(closestSeriesIdx, seriesIdxs[closestSeriesIdx]!);\n adHocFilters = getAdHocFiltersRef.current(closestSeriesIdx, seriesIdxs[closestSeriesIdx]!);\n const oneClickLink = dataLinks.find((dataLink) => dataLink.oneClick === true);\n\n if (oneClickLink != null) {\n window.open(oneClickLink.href, oneClickLink.target ?? '_self');\n } else {\n setTimeout(() => {\n _isPinned = true;\n scheduleRender(true);\n }, 0);\n }\n }\n }\n });\n });\n\n config.addHook('setSelect', (u) => {\n const isXAxisHorizontal = u.scales.x.ori === 0;\n\n if (!viaSync && (clientZoom || queryZoom != null)) {\n if (maybeZoomAction(u.cursor!.event)) {\n if (onSelectRange != null) {\n let selections: RangeSelection2D[] = [];\n\n const yDrag = Boolean(u.cursor!.drag!.y);\n const xDrag = Boolean(u.cursor!.drag!.x);\n\n let xSel = null;\n let ySels: RangeSelection1D[] = [];\n\n // get x selection\n if (xDrag) {\n xSel = {\n from: isXAxisHorizontal\n ? u.posToVal(u.select.left!, 'x')\n : u.posToVal(u.select.top + u.select.height, 'x'),\n to: isXAxisHorizontal\n ? u.posToVal(u.select.left! + u.select.width, 'x')\n : u.posToVal(u.select.top, 'x'),\n };\n }\n\n // get y selections\n if (yDrag) {\n config.scales.forEach((scale) => {\n const key = scale.props.scaleKey;\n\n if (key !== 'x') {\n let ySel = {\n from: isXAxisHorizontal\n ? u.posToVal(u.select.top + u.select.height, key)\n : u.posToVal(u.select.left + u.select.width, key),\n to: isXAxisHorizontal ? u.posToVal(u.select.top, key) : u.posToVal(u.select.left, key),\n };\n\n ySels.push(ySel);\n }\n });\n }\n\n if (xDrag) {\n if (yDrag) {\n // x + y\n selections = ySels.map((ySel) => ({ x: xSel!, y: ySel }));\n } else {\n // x only\n selections = [{ x: xSel! }];\n }\n } else {\n if (yDrag) {\n // y only\n selections = ySels.map((ySel) => ({ y: ySel }));\n }\n }\n\n onSelectRange(selections);\n } else if (clientZoom && yDrag) {\n if (u.select.height >= MIN_ZOOM_DIST) {\n for (let key in u.scales!) {\n if (key !== 'x') {\n const maxY = isXAxisHorizontal\n ? u.posToVal(u.select.top, key)\n : u.posToVal(u.select.left + u.select.width, key);\n const minY = isXAxisHorizontal\n ? u.posToVal(u.select.top + u.select.height, key)\n : u.posToVal(u.select.left, key);\n\n u.setScale(key, { min: minY, max: maxY });\n }\n }\n\n yZoomed = true;\n }\n\n yDrag = false;\n } else if (queryZoom != null) {\n if (u.select.width >= MIN_ZOOM_DIST) {\n const minX = isXAxisHorizontal\n ? u.posToVal(u.select.left, 'x')\n : u.posToVal(u.select.top + u.select.height, 'x');\n const maxX = isXAxisHorizontal\n ? u.posToVal(u.select.left + u.select.width, 'x')\n : u.posToVal(u.select.top, 'x');\n\n queryZoom({ from: minX, to: maxX });\n\n yZoomed = false;\n }\n }\n } else {\n selectedRange = {\n from: isXAxisHorizontal ? u.posToVal(u.select.left!, 'x') : u.posToVal(u.select.top + u.select.height, 'x'),\n to: isXAxisHorizontal ? u.posToVal(u.select.left! + u.select.width, 'x') : u.posToVal(u.select.top, 'x'),\n };\n\n scheduleRender(true);\n }\n }\n\n // manually hide selected region (since cursor.drag.setScale = false)\n u.setSelect({ left: 0, width: 0, top: 0, height: 0 }, false);\n });\n\n if (clientZoom || queryZoom != null) {\n config.setCursor({\n bind: {\n dblclick: (u) => () => {\n if (!maybeZoomAction(u.cursor!.event)) {\n return null;\n }\n\n if (clientZoom && yZoomed) {\n for (let key in u.scales!) {\n if (key !== 'x') {\n // @ts-ignore (this is not typed correctly in uPlot, assigning nulls means auto-scale / reset)\n u.setScale(key, { min: null, max: null });\n }\n }\n\n yZoomed = false;\n } else if (queryZoom != null) {\n let xScale = u.scales.x;\n\n const frTs = xScale.min!;\n const toTs = xScale.max!;\n const pad = (toTs - frTs) / 2;\n\n queryZoom({ from: frTs - pad, to: toTs + pad });\n }\n\n return null;\n },\n },\n });\n }\n\n config.addHook('setData', (u) => {\n yZoomed = false;\n yDrag = false;\n\n if (_isPinned) {\n dismiss();\n }\n });\n\n // fires on series focus/proximity changes\n // e.g. to highlight the hovered/closest series\n // TODO: we only need this for multi/all mode?\n config.addHook('setSeries', (u, seriesIdx) => {\n closestSeriesIdx = seriesIdx;\n\n viaSync = u.cursor.event == null;\n updateHovering();\n scheduleRender();\n });\n\n // fires on data value hovers/unhovers\n config.addHook('setLegend', (u) => {\n seriesIdxs = _plot?.cursor!.idxs!.slice()!;\n _someSeriesIdx = seriesIdxs.some((v, i) => i > 0 && v != null);\n\n if (persistentLinks.length === 0) {\n persistentLinks = seriesIdxs.map((v, seriesIdx) => {\n if (seriesIdx > 0) {\n const links = getDataLinks(seriesIdx, seriesIdxs[seriesIdx]!);\n const oneClickLink = links.find((dataLink) => dataLink.oneClick === true);\n\n if (oneClickLink) {\n return [oneClickLink];\n }\n }\n\n return [];\n });\n }\n\n viaSync = u.cursor.event == null;\n let prevIsHovering = _isHovering;\n updateHovering();\n\n if (_isHovering || _isHovering !== prevIsHovering) {\n scheduleRender();\n }\n });\n\n const scrollbarWidth = 16;\n let winWid = 0;\n let winHgt = 0;\n\n const updateWinSize = () => {\n _isHovering && !_isPinned && dismiss();\n\n winWid = window.innerWidth - scrollbarWidth;\n winHgt = window.innerHeight - scrollbarWidth;\n };\n\n const updatePlotVisible = () => {\n plotVisible =\n _plot!.rect.bottom <= winHgt && _plot!.rect.top >= 0 && _plot!.rect.left >= 0 && _plot!.rect.right <= winWid;\n };\n\n updateWinSize();\n config.addHook('ready', updatePlotVisible);\n\n // fires on mousemoves\n config.addHook('setCursor', (u) => {\n viaSync = u.cursor.event == null;\n\n if (!_isHovering) {\n return;\n }\n\n let { left = -10, top = -10 } = u.cursor;\n\n if (left >= 0 || top >= 0) {\n let clientX = u.rect.left + left;\n let clientY = u.rect.top + top;\n\n let transform = '';\n\n let { width, height } = sizeRef.current!;\n\n width += TOOLTIP_OFFSET;\n height += TOOLTIP_OFFSET;\n\n if (offsetY !== 0) {\n if (clientY + height < winHgt || clientY - height < 0) {\n offsetY = 0;\n } else if (offsetY !== -height) {\n offsetY = -height;\n }\n } else {\n if (clientY + height > winHgt && clientY - height >= 0) {\n offsetY = -height;\n }\n }\n\n if (offsetX !== 0) {\n if (clientX + width < winWid || clientX - width < 0) {\n offsetX = 0;\n } else if (offsetX !== -width) {\n offsetX = -width;\n }\n } else {\n if (clientX + width > winWid && clientX - width >= 0) {\n offsetX = -width;\n }\n }\n\n const shiftX = clientX + (offsetX === 0 ? TOOLTIP_OFFSET : -TOOLTIP_OFFSET);\n const shiftY = clientY + (offsetY === 0 ? TOOLTIP_OFFSET : -TOOLTIP_OFFSET);\n\n const reflectX = offsetX === 0 ? '' : 'translateX(-100%)';\n const reflectY = offsetY === 0 ? '' : 'translateY(-100%)';\n\n // TODO: to a transition only when switching sides\n // transition: transform 100ms;\n\n transform = `translateX(${shiftX}px) ${reflectX} translateY(${shiftY}px) ${reflectY}`;\n\n if (domRef.current != null) {\n domRef.current.style.transform = transform;\n } else {\n _style.transform = transform;\n scheduleRender();\n }\n }\n });\n\n const onscroll = (e: Event) => {\n updatePlotVisible();\n _isHovering && e.target instanceof Node && e.target.contains(_plot!.root) && dismiss();\n };\n\n window.addEventListener('resize', updateWinSize);\n window.addEventListener('scroll', onscroll, true);\n\n return () => {\n sizeRef.current?.observer.disconnect();\n\n window.removeEventListener('resize', updateWinSize);\n window.removeEventListener('scroll', onscroll, true);\n\n // in case this component unmounts while anchored (due to data auto-refresh + re-config)\n document.removeEventListener('mousedown', downEventOutside, true);\n document.removeEventListener('keydown', downEventOutside, true);\n };\n }, [config]);\n\n useLayoutEffect(() => {\n const size = sizeRef.current!;\n const _plot = plotRef.current;\n\n if (domRef.current != null) {\n size.observer.disconnect();\n size.observer.observe(domRef.current);\n\n // since the above observer is attached after container is in DOM, we need to manually update sizeRef\n // and re-trigger a cursor move to do initial positioning math\n const { width, height } = domRef.current.getBoundingClientRect();\n size.width = width;\n size.height = height;\n\n let event = _plot?.cursor.event;\n\n // if not viaSync, re-dispatch real event\n if (event != null) {\n // we expect to re-dispatch mousemove, but may have a different event type, so create a mousemove event and fire that instead\n // this doesn't work for every mobile device, so fall back to checking the useragent as well\n const isMobile = event.type !== 'mousemove' || userAgentIsMobile;\n\n if (isMobile) {\n event = new MouseEvent('mousemove', {\n view: window,\n bubbles: true,\n cancelable: true,\n clientX: event.clientX,\n clientY: event.clientY,\n screenX: event.screenX,\n screenY: event.screenY,\n });\n }\n\n // this works around the fact that uPlot does not unset cursor.event (for perf reasons)\n // so if the last real mouse event was mouseleave and you manually trigger u.setCursor()\n // it would end up re-dispatching mouseleave\n const isStaleEvent = isMobile ? false : performance.now() - event.timeStamp > 16;\n\n !isStaleEvent && _plot?.over.dispatchEvent(event);\n } else {\n _plot?.setCursor(\n {\n left: _plot.cursor.left!,\n top: _plot.cursor.top!,\n },\n true\n );\n }\n } else {\n size.width = 0;\n size.height = 0;\n }\n }, [isHovering]);\n\n if (plotRef.current && isHovering) {\n return createPortal(\n <div\n className={cx(styles.tooltipWrapper, isPinned && styles.pinned)}\n style={style}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n ref={domRef}\n >\n {isPinned && <CloseButton onClick={dismiss} />}\n {contents}\n </div>,\n portalRoot.current\n );\n }\n\n return null;\n};\n\nconst getStyles = (theme: GrafanaTheme2, maxWidth?: number) => ({\n tooltipWrapper: css({\n top: 0,\n left: 0,\n zIndex: theme.zIndex.tooltip,\n whiteSpace: 'pre',\n borderRadius: theme.shape.radius.default,\n position: 'fixed',\n background: theme.colors.background.elevated,\n border: `1px solid ${theme.colors.border.weak}`,\n boxShadow: theme.shadows.z2,\n userSelect: 'text',\n maxWidth: maxWidth ?? 'none',\n }),\n pinned: css({\n boxShadow: theme.shadows.z3,\n }),\n});\n"],"names":["TooltipHoverMode","DashboardCursorSync","useRef","getPortalContainer","useReducer","useStyles2","useLayoutEffect","_a","dismiss","e","yDrag","createPortal","jsxs","cx","jsx","CloseButton","css"],"mappings":"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"}