@grafana/ui
Version:
Grafana Components Library
1 lines • 7.83 kB
Source Map (JSON)
{"version":3,"file":"EventBusPlugin.mjs","sources":["../../../../../src/components/uPlot/plugins/EventBusPlugin.tsx"],"sourcesContent":["import { throttle } from 'lodash';\nimport { useLayoutEffect, useRef } from 'react';\nimport { Subscription } from 'rxjs';\nimport { throttleTime } from 'rxjs/operators';\n\nimport {\n DataFrame,\n DataHoverClearEvent,\n DataHoverEvent,\n DataHoverPayload,\n EventBus,\n LegacyGraphHoverEvent,\n} from '@grafana/data';\n\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\ninterface EventBusPluginProps {\n config: UPlotConfigBuilder;\n eventBus: EventBus;\n frame?: DataFrame;\n}\n\n/**\n * @alpha\n */\nexport const EventBusPlugin = ({ config, eventBus, frame }: EventBusPluginProps) => {\n const frameRef = useRef<DataFrame | undefined>(frame);\n frameRef.current = frame;\n\n useLayoutEffect(() => {\n let u: uPlot | null = null;\n\n const payload: DataHoverPayload = {\n point: {\n time: null,\n },\n data: frameRef.current,\n };\n\n config.addHook('init', (_u) => {\n u = _u;\n });\n\n let closestSeriesIdx: number | null = null;\n\n config.addHook('setSeries', (u, seriesIdx) => {\n closestSeriesIdx = seriesIdx;\n });\n\n config.addHook('setLegend', () => {\n let viaSync = u!.cursor.event == null;\n\n if (!viaSync) {\n let dataIdx = u!.cursor.idxs!.find((v) => v != null);\n\n if (dataIdx == null) {\n throttledClear();\n } else {\n let rowIdx = dataIdx;\n let colIdx = closestSeriesIdx;\n\n let xData = u!.data[0] ?? u!.data[1][0];\n\n payload.point.time = xData[rowIdx];\n payload.rowIndex = rowIdx ?? undefined;\n payload.columnIndex = colIdx ?? undefined;\n payload.data = frameRef.current;\n\n // used by old graph panel to position tooltip\n let top = u!.cursor.top!;\n payload.point.panelRelY = top === 0 ? 0.001 : top > 0 ? top / u!.rect.height : 1;\n\n throttledHover();\n }\n }\n });\n\n function handleCursorUpdate(evt: DataHoverEvent | LegacyGraphHoverEvent) {\n const time = evt.payload?.point?.time;\n\n if (time) {\n // Try finding left position on time axis\n const left = u!.valToPos(time, 'x');\n\n // let top;\n\n // if (left) {\n // top = findMidPointYPosition(u!, u!.posToIdx(left));\n // }\n\n // if (!top || !left) {\n // return;\n // }\n\n u!.setCursor({\n left,\n top: u!.rect.height / 2,\n });\n }\n }\n\n const subscription = new Subscription();\n\n const hoverEvent = new DataHoverEvent(payload).setTags(['uplot']);\n const clearEvent = new DataHoverClearEvent().setTags(['uplot']);\n\n let throttledHover = throttle(() => {\n eventBus.publish(hoverEvent);\n }, 100);\n\n let throttledClear = throttle(() => {\n eventBus.publish(clearEvent);\n }, 100);\n\n subscription.add(\n eventBus.getStream(DataHoverEvent).subscribe({\n next: (evt) => {\n // ignore uplot-emitted events, since we already use uPlot's sync\n if (eventBus === evt.origin || evt.tags?.has('uplot')) {\n return;\n }\n\n handleCursorUpdate(evt);\n },\n })\n );\n\n // Legacy events (from flot graph)\n subscription.add(\n eventBus.getStream(LegacyGraphHoverEvent).subscribe({\n next: (evt) => handleCursorUpdate(evt),\n })\n );\n\n subscription.add(\n eventBus\n .getStream(DataHoverClearEvent)\n .pipe(throttleTime(50)) // dont throttle here, throttle on emission\n .subscribe({\n next: (evt) => {\n // ignore uplot-emitted events, since we already use uPlot's sync\n if (eventBus === evt.origin || evt.tags?.has('uplot')) {\n return;\n }\n\n // @ts-ignore\n if (!u!.cursor._lock) {\n u!.setCursor({\n left: -10,\n top: -10,\n });\n }\n },\n })\n );\n\n return () => {\n subscription.unsubscribe();\n };\n }, [config]);\n\n return null;\n};\n"],"names":["u"],"mappings":"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"}