UNPKG

@grafana/ui

Version:
1 lines 4.17 kB
{"version":3,"file":"EventsCanvas.mjs","sources":["../../../../../src/components/uPlot/geometries/EventsCanvas.tsx"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef, useState, ReactNode } from 'react';\nimport * as React from 'react';\nimport { useMountedState } from 'react-use';\nimport uPlot from 'uplot';\n\nimport { DataFrame } from '@grafana/data';\n\nimport { UPlotConfigBuilder } from '../config/UPlotConfigBuilder';\n\nimport { Marker } from './Marker';\nimport { XYCanvas } from './XYCanvas';\n\ninterface EventsCanvasProps {\n id: string;\n config: UPlotConfigBuilder;\n events: DataFrame[];\n renderEventMarker: (dataFrame: DataFrame, rowIndex: number) => ReactNode;\n mapEventToXYCoords: (dataFrame: DataFrame, rowIndex: number) => { x: number; y: number } | undefined;\n}\n\nexport function EventsCanvas({ id, events, renderEventMarker, mapEventToXYCoords, config }: EventsCanvasProps) {\n const plotInstance = useRef<uPlot>();\n // render token required to re-render annotation markers. Rendering lines happens in uPlot and the props do not change\n // so we need to force the re-render when the draw hook was performed by uPlot\n const [renderToken, setRenderToken] = useState(0);\n const isMounted = useMountedState();\n\n useLayoutEffect(() => {\n config.addHook('init', (u) => {\n plotInstance.current = u;\n });\n\n config.addHook('draw', () => {\n if (!isMounted()) {\n return;\n }\n setRenderToken((s) => s + 1);\n });\n }, [config, setRenderToken]);\n\n const eventMarkers = useMemo(() => {\n const markers: React.ReactNode[] = [];\n\n if (!plotInstance.current || events.length === 0) {\n return markers;\n }\n\n for (let i = 0; i < events.length; i++) {\n const frame = events[i];\n\n for (let j = 0; j < frame.length; j++) {\n const coords = mapEventToXYCoords(frame, j);\n if (!coords) {\n continue;\n }\n markers.push(\n <Marker {...coords} key={`${id}-marker-${i}-${j}`}>\n {renderEventMarker(frame, j)}\n </Marker>\n );\n }\n }\n\n return <>{markers}</>;\n }, [events, renderEventMarker, renderToken]);\n\n if (!plotInstance.current) {\n return null;\n }\n\n return (\n <XYCanvas\n left={plotInstance.current.bbox.left / window.devicePixelRatio}\n top={plotInstance.current.bbox.top / window.devicePixelRatio}\n >\n {eventMarkers}\n </XYCanvas>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAoBO,SAAS,aAAa,EAAE,EAAA,EAAI,QAAQ,iBAAA,EAAmB,kBAAA,EAAoB,QAAO,EAAsB;AAC7G,EAAA,MAAM,eAAe,MAAA,EAAc;AAGnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,YAAY,eAAA,EAAgB;AAElC,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA,KAAM;AAC5B,MAAA,YAAA,CAAa,OAAA,GAAU,CAAA;AAAA,IACzB,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,MAAM;AAC3B,MAAA,IAAI,CAAC,WAAU,EAAG;AAChB,QAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,IAC7B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,MAAA,EAAQ,cAAc,CAAC,CAAA;AAE3B,EAAA,MAAM,YAAA,GAAe,QAAQ,MAAM;AACjC,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,IAAI,CAAC,YAAA,CAAa,OAAA,IAAW,MAAA,CAAO,WAAW,CAAA,EAAG;AAChD,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AAEtB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,EAAO,CAAC,CAAA;AAC1C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,IAAA;AAAA,0BACN,aAAA,CAAC,MAAA,EAAA,EAAQ,GAAG,MAAA,EAAQ,KAAK,CAAA,EAAG,EAAE,CAAA,QAAA,EAAW,CAAC,IAAI,CAAC,CAAA,CAAA,EAAA,EAC5C,iBAAA,CAAkB,KAAA,EAAO,CAAC,CAC7B;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,uCAAU,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAA,EAAmB,WAAW,CAAC,CAAA;AAE3C,EAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,OAAO,MAAA,CAAO,gBAAA;AAAA,MAC9C,GAAA,EAAK,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,MAAM,MAAA,CAAO,gBAAA;AAAA,MAE3C,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;;;;"}