import { useState, useCallback, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Table, BarChart3, Columns, Maximize2, Minimize2 } from "lucide-react"; import type { PivotConfig, PivotResult } from "../../shared/types"; import DynamicReportPanel from "./DynamicReportPanel"; import DynamicReportTable from "./DynamicReportTable"; import DynamicReportChart from "./DynamicReportChart"; type ViewMode = "table" | "chart" | "both"; interface DynamicReportProps { config: PivotConfig; result: PivotResult; onConfigChange: (config: PivotConfig) => void; } export default function DynamicReport({ config, result, onConfigChange }: DynamicReportProps) { const { t } = useTranslation(); const [viewMode, setViewMode] = useState("table"); const [fullscreen, setFullscreen] = useState(false); const toggleFullscreen = useCallback(() => setFullscreen((prev) => !prev), []); // Escape key exits fullscreen useEffect(() => { if (!fullscreen) return; const handler = (e: KeyboardEvent) => { if (e.key === "Escape") setFullscreen(false); }; document.addEventListener("keydown", handler); return () => document.removeEventListener("keydown", handler); }, [fullscreen]); const hasConfig = (config.rows.length > 0 || config.columns.length > 0) && config.values.length > 0; const viewButtons: { mode: ViewMode; icon: React.ReactNode; label: string }[] = [ { mode: "table", icon: , label: t("reports.pivot.viewTable") }, { mode: "chart", icon: , label: t("reports.pivot.viewChart") }, { mode: "both", icon: , label: t("reports.pivot.viewBoth") }, ]; return (
{/* Content area */}
{/* Toolbar */}
{hasConfig && viewButtons.map(({ mode, icon, label }) => ( ))}
{/* Empty state */} {!hasConfig && (
{t("reports.pivot.noConfig")}
)} {/* Table */} {hasConfig && (viewMode === "table" || viewMode === "both") && ( )} {/* Chart */} {hasConfig && (viewMode === "chart" || viewMode === "both") && ( )}
{/* Side panel */}
); }