import { requirePermission } from "@/shared/lib/auth-guard" import { Permissions } from "@/shared/types/permissions" import { getTeacherIdForMutations } from "@/modules/classes/data-access" import { getGradeHomeworkInsights } from "@/modules/classes/data-access" import { getGradesForStaff } from "@/modules/school/data-access" import { EmptyState } from "@/shared/components/ui/empty-state" import { StatCard } from "@/shared/components/ui/stat-card" import { Card, CardContent, CardHeader, CardTitle } from "@/shared/components/ui/card" import { Badge } from "@/shared/components/ui/badge" import { Button } from "@/shared/components/ui/button" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/shared/components/ui/table" import { BarChart3 } from "lucide-react" import { formatDate } from "@/shared/lib/utils" export const dynamic = "force-dynamic" type SearchParams = { [key: string]: string | string[] | undefined } const getParam = (params: SearchParams, key: string) => { const v = params[key] if (typeof v === "string") return v if (Array.isArray(v)) return v[0] return undefined } const formatScore = (v: number | null, digits = 1) => (typeof v === "number" && Number.isFinite(v) ? v.toFixed(digits) : "-") export default async function TeacherGradeInsightsPage({ searchParams }: { searchParams: Promise }) { await requirePermission(Permissions.GRADE_RECORD_READ) const params = await searchParams const gradeId = getParam(params, "gradeId") const teacherId = await getTeacherIdForMutations() const grades = await getGradesForStaff(teacherId) const allowedIds = new Set(grades.map((g) => g.id)) const selected = gradeId && gradeId !== "all" && allowedIds.has(gradeId) ? gradeId : "" const insights = selected ? await getGradeHomeworkInsights({ gradeId: selected, limit: 50 }) : null if (grades.length === 0) { return (

Grade Insights

View grade-level homework statistics for grades you lead.

) } return (

Grade Insights

Homework statistics aggregated across all classes in a grade.

Filters {grades.length}
{!selected ? ( ) : !insights ? ( ) : insights.assignments.length === 0 ? ( ) : (
Homework timeline {insights.assignments.length}
Assignment Status Created Targeted Submitted Graded Avg Median {insights.assignments.map((a) => ( {a.title} {a.status} {formatDate(a.createdAt)} {a.targetCount} {a.submittedCount} {a.gradedCount} {formatScore(a.scoreStats.avg)} {formatScore(a.scoreStats.median)} ))}
Class ranking {insights.classes.length}
Class Students Latest Avg Prev Avg Δ Overall Avg {insights.classes.map((c) => ( {c.class.name} {c.class.homeroom ? • {c.class.homeroom} : null} {c.studentCounts.total} {formatScore(c.latestAvg)} {formatScore(c.prevAvg)} {formatScore(c.deltaAvg)} {formatScore(c.overallScores.avg)} ))}
)}
) }