import { FC, useEffect, useId } from "react"; import { Table, Alert, Skeleton, Box, LoadingOverlay } from "@mantine/core"; import { IconAlertTriangle, IconInfoCircle } from "@tabler/icons-react"; import { InstantQueryResult, InstantSample, RangeSamples, } from "../../api/responseTypes/query"; import SeriesName from "./SeriesName"; import { useAPIQuery } from "../../api/api"; const maxFormattableSeries = 1000; const maxDisplayableSeries = 10000; const limitSeries = ( series: S[] ): S[] => { if (series.length > maxDisplayableSeries) { return series.slice(0, maxDisplayableSeries); } return series; }; export interface TableProps { expr: string; evalTime: number | null; retriggerIdx: number; } const DataTable: FC = ({ expr, evalTime, retriggerIdx }) => { // const now = useMemo(() => Date.now() / 1000, [retriggerIdx]); // const { data, error, isFetching, isLoading } = useInstantQueryQuery( // { // query: expr, // time: evalTime !== null ? evalTime / 1000 : now, // }, // { skip: !expr } // ); // const now = useMemo(() => Date.now() / 1000, [retriggerIdx]); const { data, error, isFetching, isLoading, refetch } = useAPIQuery({ key: useId(), path: "/query", params: { query: expr, time: `${(evalTime !== null ? evalTime : Date.now()) / 1000}`, }, enabled: expr !== "", }); useEffect(() => { expr !== "" && refetch(); }, [retriggerIdx, refetch, expr, evalTime]); // Show a skeleton only on the first load, not on subsequent ones. if (isLoading) { return ( {Array.from(Array(5), (_, i) => ( ))} ); } if (error) { return ( } > {error.message} ); } if (data === undefined) { return No data queried yet; } if (data.status !== "success") { // TODO: Remove this case and handle it in useAPIQuery instead! return null; } const { result, resultType } = data.data; if (result.length === 0) { return ( } > This query returned no data. ); } const doFormat = result.length <= maxFormattableSeries; return ( , }} styles={{ loader: { width: "100%", height: "100%" } }} /> {resultType === "vector" ? ( limitSeries(result).map((s, idx) => ( {s.value && s.value[1]} {s.histogram && "TODO HISTOGRAM DISPLAY"} )) ) : resultType === "matrix" ? ( limitSeries(result).map((s, idx) => ( {s.values && s.values.map((v, idx) => (
{v[1]} @ {v[0]}
))}
)) ) : resultType === "scalar" ? ( Scalar value {result[1]} ) : resultType === "string" ? ( String value {result[1]} ) : ( } maw={500} mx="auto" mt="lg" > Invalid result value type )}
); }; export default DataTable;