import * as React from 'react'; import { Checkbox } from '@/components/ui/checkbox'; import { useFormatDateInterval } from '@/hooks/useFormatDateInterval'; import { useMappings } from '@/hooks/useMappings'; import { useSelector } from '@/redux'; import type { IChartData } from '@/types'; import { cn } from '@/utils/cn'; import { getChartColor } from '@/utils/theme'; interface ReportTableProps { data: IChartData; visibleSeries: string[]; setVisibleSeries: React.Dispatch>; } export function ReportTable({ data, visibleSeries, setVisibleSeries, }: ReportTableProps) { const interval = useSelector((state) => state.report.interval); const formatDate = useFormatDateInterval(interval); const getLabel = useMappings(); 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-medium border-r border-border'; return ( <>
{/* Labels */}
Name
{/*
Summary
*/} {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} />
{getLabel(serie.name)}
); })}
{/* ScrollView for all values */}
{/* Header */}
Total
Average
{data.series[0]?.data.map((serie) => (
{formatDate(serie.date)}
))}
{/* Values */} {data.series.map((serie) => { return (
{serie.metrics.total}
{serie.metrics.average}
{serie.data.map((item) => { return (
{item.count}
); })}
); })}
Total
{data.series.reduce((acc, serie) => serie.metrics.total + acc, 0)}
Average
{data.series.reduce((acc, serie) => serie.metrics.average + acc, 0)}
); }