UNPKG

@grafana/ui

Version:
1 lines • 40.9 kB
{"version":3,"file":"TooltipPlugin2.mjs","sources":["../../../../../src/components/uPlot/plugins/TooltipPlugin2.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useLayoutEffect, useRef, useReducer, CSSProperties } from 'react';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport uPlot from 'uplot';\n\nimport { GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { DashboardCursorSync } from '@grafana/schema';\n\nimport { useStyles2 } from '../../../themes/ThemeContext';\nimport { RangeSelection1D, RangeSelection2D, OnSelectRangeCallback } from '../../PanelChrome';\nimport { getPortalContainer } from '../../Portal/Portal';\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\nimport { CloseButton } from './CloseButton';\n\nexport const DEFAULT_TOOLTIP_WIDTH = undefined;\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[];\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\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 ) => React.ReactNode;\n\n maxWidth?: number;\n}\n\ninterface TooltipContainerState {\n plot?: uPlot | null;\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 plot: 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 = () => [];\n\nconst userAgentIsMobile = /Android|iPhone|iPad/i.test(navigator.userAgent);\n\n/**\n * @alpha\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}: TooltipPlugin2Props) => {\n const domRef = useRef<HTMLDivElement>(null);\n const portalRoot = useRef<HTMLElement | null>(null);\n\n if (portalRoot.current == null) {\n portalRoot.current = getPortalContainer();\n }\n\n const [{ plot, isHovering, isPinned, contents, style, dismiss }, setState] = useReducer(mergeState, null, initState);\n\n const sizeRef = useRef<TooltipContainerSize>();\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 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 = plot;\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\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 // 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 )\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\n scheduleRender(prevIsPinned);\n };\n\n config.addHook('init', (u) => {\n setState({ plot: (_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 // 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 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\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 (plot && 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.portal,\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":["_a","dismiss","e","yDrag"],"mappings":"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"}