import { Group, Tabs, Center, Space, Box, SegmentedControl, Stack, Select, TextInput, } from "@mantine/core"; import { IconChartAreaFilled, IconChartGridDots, IconChartLine, IconGraph, IconTable, } from "@tabler/icons-react"; import { FC, useState } from "react"; import { useAppDispatch, useAppSelector } from "../../state/hooks"; import { GraphDisplayMode, GraphResolution, getEffectiveResolution, removePanel, setExpr, setVisualizer, } from "../../state/queryPageSlice"; import DataTable from "./DataTable"; import TimeInput from "./TimeInput"; import RangeInput from "./RangeInput"; import ExpressionInput from "./ExpressionInput"; import Graph from "./Graph"; import { formatPrometheusDuration, parsePrometheusDuration, } from "../../lib/formatTime"; export interface PanelProps { idx: number; metricNames: string[]; } // TODO: This is duplicated everywhere, unify it. const iconStyle = { width: "0.9rem", height: "0.9rem" }; const QueryPanel: FC = ({ idx, metricNames }) => { // Used to indicate to the selected display component that it should retrigger // the query, even if the expression has not changed (e.g. when the user presses // the "Execute" button or hits again). const [retriggerIdx, setRetriggerIdx] = useState(0); const panel = useAppSelector((state) => state.queryPage.panels[idx]); const resolution = panel.visualizer.resolution; const dispatch = useAppDispatch(); const [customResolutionInput, setCustomResolutionInput] = useState( formatPrometheusDuration( getEffectiveResolution(resolution, panel.visualizer.range) ) ); const setResolution = (res: GraphResolution) => { dispatch( setVisualizer({ idx, visualizer: { ...panel.visualizer, resolution: res, }, }) ); }; const onChangeCustomResolutionInput = (resText: string): void => { const newResolution = parsePrometheusDuration(resText); if (newResolution === null) { setCustomResolutionInput( formatPrometheusDuration( getEffectiveResolution(resolution, panel.visualizer.range) ) ); } else { setResolution({ type: "custom", value: newResolution }); } }; return ( { setRetriggerIdx((idx) => idx + 1); dispatch(setExpr({ idx, expr })); }} removePanel={() => { dispatch(removePanel(idx)); }} /> dispatch( setVisualizer({ idx, visualizer: { ...panel.visualizer, activeTab: v as "table" | "graph", }, }) ) } keepMounted={false} > }> Table }> Graph dispatch( setVisualizer({ idx, visualizer: { ...panel.visualizer, endTime: time }, }) ) } /> dispatch( setVisualizer({ idx, visualizer: { ...panel.visualizer, range }, }) ) } /> dispatch( setVisualizer({ idx, visualizer: { ...panel.visualizer, endTime: time }, }) ) } />