import * as React from "react"; import { type RouterOutputs } from "@/utils/api"; import { useFormatDateInterval } from "@/hooks/useFormatDateInterval"; import { useSelector } from "@/redux"; import { Checkbox } from "@/components/ui/checkbox"; import { getChartColor } from "@/utils/theme"; import { cn } from "@/utils/cn"; type ReportTableProps = { data: RouterOutputs["chartMeta"]["chart"]; visibleSeries: string[]; setVisibleSeries: React.Dispatch>; }; export function ReportTable({ data, visibleSeries, setVisibleSeries, }: ReportTableProps) { const interval = useSelector((state) => state.report.interval); const formatDate = useFormatDateInterval(interval); function handleChange(name: string, checked: boolean) { setVisibleSeries((prev) => { if (checked) { return [...prev, name]; } else { return prev.filter((item) => item !== name); } }); } const row = "flex border-b border-border last:border-b-0 flex-1"; const cell = "p-2 last:pr-8 last:w-[8rem]"; const value = "min-w-[6rem] text-right"; const header = "text-sm font-medium"; const total = 'bg-gray-50 text-emerald-600 font-bold border-r border-border' return (
{/* Labels */}
Name
{data.series.map((serie, index) => { const checked = visibleSeries.includes(serie.name); return (
handleChange(serie.name, !!checked) } style={ checked ? { background: getChartColor(index), borderColor: getChartColor(index), } : undefined } checked={checked} />
{serie.name}
); })}
{/* ScrollView for all values */}
{/* Header */}
Total
{data.series[0]?.data.map((serie) => (
{formatDate(serie.date)}
))}
{/* Values */} {data.series.map((serie) => { return (
{serie.totalCount}
{serie.data.map((item) => { return (
{item.count}
); })}
); })}
); }