"use client"; import React, { useMemo, useState } from "react"; import { ArrowLeft, HelpCircle, Search } from "lucide-react"; import { REPORTS, REPORT_CATEGORIES, type ReportKey, type ReportCategory } from "./ReportCatalog"; import EventsDropdown from "./EventsDropdown"; type EventLite = { id: string; title: string }; type DatePreset = "all_time" | "this_month" | "last_month" | "this_year" | "custom"; export default function ReportsShell({ events, isAdmin, showPastEvents, setShowPastEvents, showInactiveEvents, setShowInactiveEvents, showClosedEvents, setShowClosedEvents, selectedEventIds, setSelectedEventIds, dateFrom, setDateFrom, dateTo, setDateTo, report, setReport, onViewReport, busy, onOpenGuide, onBack, }: { events: EventLite[]; isAdmin: boolean; showPastEvents: boolean; setShowPastEvents: (v: boolean) => void; showInactiveEvents: boolean; setShowInactiveEvents: (v: boolean) => void; showClosedEvents: boolean; setShowClosedEvents: (v: boolean) => void; selectedEventIds: string[]; setSelectedEventIds: (v: string[]) => void; dateFrom: string; setDateFrom: (v: string) => void; dateTo: string; setDateTo: (v: string) => void; report: ReportKey; setReport: (r: ReportKey) => void; onViewReport: () => void; busy: boolean; onOpenGuide: () => void; onBack?: () => void; }) { const [search, setSearch] = useState(""); const [category, setCategory] = useState<"All" | ReportCategory>("All"); const [datePreset, setDatePreset] = useState("all_time"); const iso = (d: Date) => d.toISOString().slice(0, 10); const applyPreset = (preset: DatePreset) => { setDatePreset(preset); const now = new Date(); if (preset === "this_month") { setDateFrom(iso(new Date(now.getFullYear(), now.getMonth(), 1))); setDateTo(iso(new Date(now.getFullYear(), now.getMonth() + 1, 0))); } else if (preset === "last_month") { setDateFrom(iso(new Date(now.getFullYear(), now.getMonth() - 1, 1))); setDateTo(iso(new Date(now.getFullYear(), now.getMonth(), 0))); } else if (preset === "this_year") { setDateFrom(iso(new Date(now.getFullYear(), 0, 1))); setDateTo(iso(new Date(now.getFullYear(), 11, 31))); } else if (preset === "all_time") { setDateFrom(""); setDateTo(""); } // 'custom' leaves dateFrom/dateTo as whatever's typed in the fields below }; const filteredReports = useMemo(() => { return REPORTS.filter(r => { if (category !== "All" && r.category !== category) return false; if (search.trim()) { const q = search.trim().toLowerCase(); if (!r.label.toLowerCase().includes(q) && !r.description.toLowerCase().includes(q)) return false; } return true; }); }, [search, category]); return (

Reports

View, export, or email operational reports for events.

setSearch(e.target.value)} />
{onBack && ( )}
{/* Sidebar: universal filters */} {/* Main: categories, report grid */}
{(["All", ...REPORT_CATEGORIES] as const).map(c => ( ))}
{filteredReports.map(r => { const Icon = r.icon; const selected = report === r.key; return ( ); })} {filteredReports.length === 0 && (
No reports match your search.
)}
Filters will be applied to the selected report where relevant.
); }