|
|
@ -84,6 +84,20 @@ const Graph: FC<GraphProps> = ({ |
|
|
|
range: UPlotChartRange; |
|
|
|
range: UPlotChartRange; |
|
|
|
} | null>(null); |
|
|
|
} | null>(null); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Helper function to render warnings.
|
|
|
|
|
|
|
|
const renderWarnings = (warnings?: string[]) => { |
|
|
|
|
|
|
|
return warnings?.map((w, idx) => ( |
|
|
|
|
|
|
|
<Alert |
|
|
|
|
|
|
|
key={idx} |
|
|
|
|
|
|
|
color="red" |
|
|
|
|
|
|
|
title="Query warning" |
|
|
|
|
|
|
|
icon={<IconAlertTriangle />} |
|
|
|
|
|
|
|
> |
|
|
|
|
|
|
|
{w} |
|
|
|
|
|
|
|
</Alert> |
|
|
|
|
|
|
|
)); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
useEffect(() => { |
|
|
|
if (data !== undefined) { |
|
|
|
if (data !== undefined) { |
|
|
|
setDataAndRange({ |
|
|
|
setDataAndRange({ |
|
|
@ -148,9 +162,12 @@ const Graph: FC<GraphProps> = ({ |
|
|
|
|
|
|
|
|
|
|
|
if (result.length === 0) { |
|
|
|
if (result.length === 0) { |
|
|
|
return ( |
|
|
|
return ( |
|
|
|
|
|
|
|
<Stack> |
|
|
|
<Alert title="Empty query result" icon={<IconInfoCircle />}> |
|
|
|
<Alert title="Empty query result" icon={<IconInfoCircle />}> |
|
|
|
This query returned no data. |
|
|
|
This query returned no data. |
|
|
|
</Alert> |
|
|
|
</Alert> |
|
|
|
|
|
|
|
{renderWarnings(dataAndRange.data.warnings)} |
|
|
|
|
|
|
|
</Stack> |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -166,6 +183,7 @@ const Graph: FC<GraphProps> = ({ |
|
|
|
graphing the equivalent instant vector selector instead. |
|
|
|
graphing the equivalent instant vector selector instead. |
|
|
|
</Alert> |
|
|
|
</Alert> |
|
|
|
)} |
|
|
|
)} |
|
|
|
|
|
|
|
{renderWarnings(dataAndRange.data.warnings)} |
|
|
|
<Box pos="relative" ref={ref} className={classes.chartWrapper}> |
|
|
|
<Box pos="relative" ref={ref} className={classes.chartWrapper}> |
|
|
|
<LoadingOverlay |
|
|
|
<LoadingOverlay |
|
|
|
visible={isFetching} |
|
|
|
visible={isFetching} |
|
|
|