import { useMemo } from 'react'; import { DataFrameType, PanelProps, buildHistogram, cacheFieldDisplayNames, getHistogramFields } from '@grafana/data'; import { histogramFieldsToFrame, joinHistograms } from '@grafana/data/src/transformations/transformers/histogram'; import { TooltipDisplayMode, TooltipPlugin2, useTheme2 } from '@grafana/ui'; import { TooltipHoverMode } from '@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2'; import { Histogram, getBucketSize } from './Histogram'; import { HistogramTooltip } from './HistogramTooltip'; import { Options } from './panelcfg.gen'; type Props = PanelProps; export const HistogramPanel = ({ data, options, width, height }: Props) => { const theme = useTheme2(); const histogram = useMemo(() => { if (!data.series.length) { return undefined; } // stamp origins for legend's calcs (from raw values) data.series.forEach((frame, frameIndex) => { frame.fields.forEach((field, fieldIndex) => { field.state = { ...field.state, origin: { frameIndex, fieldIndex, }, }; }); }); cacheFieldDisplayNames(data.series); if ( data.series.length === 1 || data.series.every( (frame) => frame.meta?.type === DataFrameType.HeatmapCells || frame.meta?.type === DataFrameType.HeatmapRows ) ) { const histograms = data.series.map((frame) => getHistogramFields(frame)).filter((hist) => hist != null); if (histograms.length) { return histogramFieldsToFrame(joinHistograms(histograms), theme); } } const hist = buildHistogram(data.series, options, theme); if (!hist) { return undefined; } return histogramFieldsToFrame(hist, theme); }, [data.series, options, theme]); if (!histogram || !histogram.fields.length) { return (

No histogram found in response

); } const bucketSize = getBucketSize(histogram); return ( {(builder, alignedFrame, xMinOnlyFrame) => { return ( <> {options.tooltip.mode !== TooltipDisplayMode.None && ( { return ( ); }} maxWidth={options.tooltip.maxWidth} /> )} ); }} ); };