import { useMemo, useState } from 'react'; import { DashboardCursorSync, PanelProps } from '@grafana/data'; import { AxisPlacement, EventBusPlugin, TooltipDisplayMode, TooltipPlugin2, usePanelContext, useTheme2, } from '@grafana/ui'; import { TimeRange2, TooltipHoverMode } from '@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2'; import { TimelineChart } from 'app/core/components/TimelineChart/TimelineChart'; import { prepareTimelineFields, prepareTimelineLegendItems, TimelineMode, } from 'app/core/components/TimelineChart/utils'; import { AnnotationsPlugin2 } from '../timeseries/plugins/AnnotationsPlugin2'; import { OutsideRangePlugin } from '../timeseries/plugins/OutsideRangePlugin'; import { getTimezones } from '../timeseries/utils'; import { StateTimelineTooltip2 } from './StateTimelineTooltip2'; import { Options } from './panelcfg.gen'; import { containerStyles, usePagination } from './utils'; interface TimelinePanelProps extends PanelProps {} /** * @alpha */ export const StateTimelinePanel = ({ data, timeRange, timeZone, options, width, height, replaceVariables, onChangeTimeRange, }: TimelinePanelProps) => { const theme = useTheme2(); // temp range set for adding new annotation set by TooltipPlugin2, consumed by AnnotationPlugin2 const [newAnnotationRange, setNewAnnotationRange] = useState(null); const { sync, eventsScope, canAddAnnotations, dataLinkPostProcessor, eventBus } = usePanelContext(); const cursorSync = sync?.() ?? DashboardCursorSync.Off; const { frames, warn } = useMemo( () => prepareTimelineFields(data.series, options.mergeValues ?? true, timeRange, theme), [data.series, options.mergeValues, timeRange, theme] ); const { paginatedFrames, paginationRev, paginationElement, paginationHeight } = usePagination( frames, options.perPage ); const legendItems = useMemo( () => prepareTimelineLegendItems(paginatedFrames, options.legend, theme), [paginatedFrames, options.legend, theme] ); const timezones = useMemo(() => getTimezones(options.timezone, timeZone), [options.timezone, timeZone]); if (!paginatedFrames || warn) { return (

{warn ?? 'No data found in response'}

); } const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations()); return (
{(builder, alignedFrame) => { return ( <> {cursorSync !== DashboardCursorSync.Off && ( )} {options.tooltip.mode !== TooltipDisplayMode.None && ( alignedFrame.fields[seriesIdx].getLinks?.({ valueRowIndex: dataIdx }) ?? [] } render={(u, dataIdxs, seriesIdx, isPinned, dismiss, timeRange2, viaSync, dataLinks) => { if (enableAnnotationCreation && timeRange2 != null) { setNewAnnotationRange(timeRange2); dismiss(); return; } const annotate = () => { let xVal = u.posToVal(u.cursor.left!, 'x'); setNewAnnotationRange({ from: xVal, to: xVal }); dismiss(); }; return ( ); }} maxWidth={options.tooltip.maxWidth} /> )} {alignedFrame.fields[0].config.custom?.axisPlacement !== AxisPlacement.Hidden && ( )} ); }} {paginationElement}
); };