Observer dashboard extraction, PDF reports, jury UX overhaul, and miscellaneous improvements

- Extract observer dashboard to client component, add PDF export button
- Add PDF report generator with jsPDF for analytics reports
- Overhaul jury evaluation page with improved layout and UX
- Add new analytics endpoints for observer/admin reports
- Improve round creation/edit forms with better settings
- Fix filtering rules page, CSV export dialog, notification bell
- Update auth, prisma schema, and various type fixes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-10 23:08:00 +01:00
parent 5c8d22ac11
commit d787a24921
31 changed files with 2565 additions and 930 deletions

View File

@@ -38,9 +38,7 @@ import {
GitCompare,
UserCheck,
Globe,
Printer,
} from 'lucide-react'
import { Button } from '@/components/ui/button'
import { formatDateOnly } from '@/lib/utils'
import {
ScoreDistributionChart,
@@ -53,6 +51,7 @@ import {
JurorConsistencyChart,
DiversityMetricsChart,
} from '@/components/charts'
import { ExportPdfButton } from '@/components/shared/export-pdf-button'
function OverviewTab({ selectedRoundId }: { selectedRoundId: string | null }) {
const { data: programs, isLoading } = trpc.program.list.useQuery({ includeRounds: true })
@@ -608,14 +607,13 @@ export default function ObserverReportsPage() {
Diversity
</TabsTrigger>
</TabsList>
<Button
variant="outline"
size="sm"
onClick={() => window.print()}
>
<Printer className="mr-2 h-4 w-4" />
Export PDF
</Button>
{selectedRoundId && (
<ExportPdfButton
roundId={selectedRoundId}
roundName={rounds.find((r) => r.id === selectedRoundId)?.name}
programName={rounds.find((r) => r.id === selectedRoundId)?.programName}
/>
)}
</div>
<TabsContent value="overview">