{"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":";;;;;;AAyBO,MAAM,iBAAiB,CAAC,EAAE,MAAQ,EAAA,QAAA,EAAU,OAAiC,KAAA;AAClF,EAAM,MAAA,QAAA,GAAW,OAA8B,KAAK,CAAA;AACpD,EAAA,QAAA,CAAS,OAAU,GAAA,KAAA;AAEnB,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,CAAkB,GAAA,IAAA;AAEtB,IAAA,MAAM,OAA4B,GAAA;AAAA,MAChC,KAAO,EAAA;AAAA,QACL,IAAM,EAAA;AAAA,OACR;AAAA,MACA,MAAM,QAAS,CAAA;AAAA,KACjB;AAEA,IAAO,MAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,CAAC,EAAO,KAAA;AAC7B,MAAI,CAAA,GAAA,EAAA;AAAA,KACL,CAAA;AAED,IAAA,IAAI,gBAAkC,GAAA,IAAA;AAEtC,IAAA,MAAA,CAAO,OAAQ,CAAA,WAAA,EAAa,CAACA,EAAAA,EAAG,SAAc,KAAA;AAC5C,MAAmB,gBAAA,GAAA,SAAA;AAAA,KACpB,CAAA;AAED,IAAO,MAAA,CAAA,OAAA,CAAQ,aAAa,MAAM;AAjDtC,MAAA,IAAA,EAAA;AAkDM,MAAI,IAAA,OAAA,GAAU,CAAG,CAAA,MAAA,CAAO,KAAS,IAAA,IAAA;AAEjC,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAI,IAAA,OAAA,GAAU,EAAG,MAAO,CAAA,IAAA,CAAM,KAAK,CAAC,CAAA,KAAM,KAAK,IAAI,CAAA;AAEnD,QAAA,IAAI,WAAW,IAAM,EAAA;AACnB,UAAe,cAAA,EAAA;AAAA,SACV,MAAA;AACL,UAAA,IAAI,MAAS,GAAA,OAAA;AACb,UAAA,IAAI,MAAS,GAAA,gBAAA;AAEb,UAAI,IAAA,KAAA,GAAA,CAAQ,EAAG,GAAA,CAAA,CAAA,IAAA,CAAK,CAAC,CAAA,KAAT,YAAc,CAAG,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAEtC,UAAQ,OAAA,CAAA,KAAA,CAAM,IAAO,GAAA,KAAA,CAAM,MAAM,CAAA;AACjC,UAAA,OAAA,CAAQ,WAAW,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA;AAC7B,UAAA,OAAA,CAAQ,cAAc,MAAU,IAAA,IAAA,GAAA,MAAA,GAAA,KAAA,CAAA;AAChC,UAAA,OAAA,CAAQ,OAAO,QAAS,CAAA,OAAA;AAGxB,UAAI,IAAA,GAAA,GAAM,EAAG,MAAO,CAAA,GAAA;AACpB,UAAQ,OAAA,CAAA,KAAA,CAAM,SAAY,GAAA,GAAA,KAAQ,CAAI,GAAA,IAAA,GAAQ,MAAM,CAAI,GAAA,GAAA,GAAM,CAAG,CAAA,IAAA,CAAK,MAAS,GAAA,CAAA;AAE/E,UAAe,cAAA,EAAA;AAAA;AACjB;AACF,KACD,CAAA;AAED,IAAA,SAAS,mBAAmB,GAA6C,EAAA;AA7E7E,MAAA,IAAA,EAAA,EAAA,EAAA;AA8EM,MAAA,MAAM,IAAO,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,GAAA,CAAI,OAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAa,UAAb,IAAoB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA;AAEjC,MAAA,IAAI,IAAM,EAAA;AAER,QAAA,MAAM,IAAO,GAAA,CAAA,CAAG,QAAS,CAAA,IAAA,EAAM,GAAG,CAAA;AAYlC,QAAA,CAAA,CAAG,SAAU,CAAA;AAAA,UACX,IAAA;AAAA,UACA,GAAA,EAAK,CAAG,CAAA,IAAA,CAAK,MAAS,GAAA;AAAA,SACvB,CAAA;AAAA;AACH;AAGF,IAAM,MAAA,YAAA,GAAe,IAAI,YAAa,EAAA;AAEtC,IAAM,MAAA,UAAA,GAAa,IAAI,cAAe,CAAA,OAAO,EAAE,OAAQ,CAAA,CAAC,OAAO,CAAC,CAAA;AAChE,IAAA,MAAM,aAAa,IAAI,mBAAA,GAAsB,OAAQ,CAAA,CAAC,OAAO,CAAC,CAAA;AAE9D,IAAI,IAAA,cAAA,GAAiB,SAAS,MAAM;AAClC,MAAA,QAAA,CAAS,QAAQ,UAAU,CAAA;AAAA,OAC1B,GAAG,CAAA;AAEN,IAAI,IAAA,cAAA,GAAiB,SAAS,MAAM;AAClC,MAAA,QAAA,CAAS,QAAQ,UAAU,CAAA;AAAA,OAC1B,GAAG,CAAA;AAEN,IAAa,YAAA,CAAA,GAAA;AAAA,MACX,QAAS,CAAA,SAAA,CAAU,cAAc,CAAA,CAAE,SAAU,CAAA;AAAA,QAC3C,IAAA,EAAM,CAAC,GAAQ,KAAA;AApHvB,UAAA,IAAA,EAAA;AAsHU,UAAA,IAAI,aAAa,GAAI,CAAA,MAAA,KAAA,CAAU,SAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,IAAI,OAAU,CAAA,CAAA,EAAA;AACrD,YAAA;AAAA;AAGF,UAAA,kBAAA,CAAmB,GAAG,CAAA;AAAA;AACxB,OACD;AAAA,KACH;AAGA,IAAa,YAAA,CAAA,GAAA;AAAA,MACX,QAAS,CAAA,SAAA,CAAU,qBAAqB,CAAA,CAAE,SAAU,CAAA;AAAA,QAClD,IAAM,EAAA,CAAC,GAAQ,KAAA,kBAAA,CAAmB,GAAG;AAAA,OACtC;AAAA,KACH;AAEA,IAAa,YAAA,CAAA,GAAA;AAAA,MACX,QAAA,CACG,UAAU,mBAAmB,CAAA,CAC7B,KAAK,YAAa,CAAA,EAAE,CAAC,CAAA,CACrB,SAAU,CAAA;AAAA,QACT,IAAA,EAAM,CAAC,GAAQ,KAAA;AA3IzB,UAAA,IAAA,EAAA;AA6IY,UAAA,IAAI,aAAa,GAAI,CAAA,MAAA,KAAA,CAAU,SAAI,IAAJ,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAU,IAAI,OAAU,CAAA,CAAA,EAAA;AACrD,YAAA;AAAA;AAIF,UAAI,IAAA,CAAC,CAAG,CAAA,MAAA,CAAO,KAAO,EAAA;AACpB,YAAA,CAAA,CAAG,SAAU,CAAA;AAAA,cACX,IAAM,EAAA,CAAA,EAAA;AAAA,cACN,GAAK,EAAA,CAAA;AAAA,aACN,CAAA;AAAA;AACH;AACF,OACD;AAAA,KACL;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,WAAY,EAAA;AAAA,KAC3B;AAAA,GACF,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAO,OAAA,IAAA;AACT;;;;"}