import { css } from '@emotion/css'; import { groupBy } from 'lodash'; import React, { useMemo } from 'react'; import { AbsoluteTimeRange, DataFrame, DataQueryResponse, EventBus, GrafanaTheme2, isLogsVolumeLimited, LoadingState, SplitOpen, TimeZone, } from '@grafana/data'; import { Button, InlineField, useStyles2 } from '@grafana/ui'; import { LogsVolumePanel } from './LogsVolumePanel'; import { SupplementaryResultError } from './SupplementaryResultError'; type Props = { logsVolumeData: DataQueryResponse | undefined; absoluteRange: AbsoluteTimeRange; timeZone: TimeZone; splitOpen: SplitOpen; width: number; onUpdateTimeRange: (timeRange: AbsoluteTimeRange) => void; onLoadLogsVolume: () => void; onHiddenSeriesChanged: (hiddenSeries: string[]) => void; eventBus: EventBus; }; export const LogsVolumePanelList = ({ logsVolumeData, absoluteRange, onUpdateTimeRange, width, onLoadLogsVolume, onHiddenSeriesChanged, eventBus, splitOpen, timeZone, }: Props) => { const logVolumes = useMemo( () => groupBy(logsVolumeData?.data || [], 'meta.custom.sourceQuery.refId'), [logsVolumeData] ); const styles = useStyles2(getStyles); const numberOfLogVolumes = Object.keys(logVolumes).length; const containsZoomed = Object.values(logVolumes).some((data: DataFrame[]) => { const zoomRatio = logsLevelZoomRatio(data, absoluteRange); return !isLogsVolumeLimited(data) && zoomRatio && zoomRatio < 1; }); if (logsVolumeData?.state === LoadingState.Loading) { return Loading...; } if (logsVolumeData?.error !== undefined) { return ; } return (
{Object.keys(logVolumes).map((name, index) => { const logsVolumeData = { data: logVolumes[name] }; return ( 1 ? () => {} : onHiddenSeriesChanged} eventBus={eventBus} /> ); })} {containsZoomed && (
)}
); }; const getStyles = (theme: GrafanaTheme2) => { return { listContainer: css` padding-top: 10px; `, extraInfoContainer: css` display: flex; justify-content: end; position: absolute; right: 5px; top: 5px; `, oldInfoText: css` font-size: ${theme.typography.bodySmall.fontSize}; color: ${theme.colors.text.secondary}; `, }; }; function logsLevelZoomRatio( logsVolumeData: DataFrame[] | undefined, selectedTimeRange: AbsoluteTimeRange ): number | undefined { const dataRange = logsVolumeData && logsVolumeData[0] && logsVolumeData[0].meta?.custom?.absoluteRange; return dataRange ? (selectedTimeRange.from - selectedTimeRange.to) / (dataRange.from - dataRange.to) : undefined; }