{"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';\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 = {\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      // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n      if (!domRef.current!.contains(e.target as Node)) {\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      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.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":["dismiss","e","yDrag"],"mappings":"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"}