import Link from "next/link" import { notFound } from "next/navigation" import { getClassHomeworkInsights, getClassSchedule, getClassStudents } from "@/modules/classes/data-access" import { ScheduleView } from "@/modules/classes/components/schedule-view" import { Badge } from "@/shared/components/ui/badge" import { Button } from "@/shared/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/shared/components/ui/card" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/shared/components/ui/table" 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] return Array.isArray(v) ? v[0] : v } const formatNumber = (v: number | null, digits = 1) => { if (typeof v !== "number" || Number.isNaN(v)) return "-" return v.toFixed(digits) } export default async function ClassDetailPage({ params, searchParams, }: { params: Promise<{ id: string }> searchParams: Promise }) { const { id } = await params const sp = await searchParams const hw = getParam(sp, "hw") const hwFilter = hw === "active" || hw === "overdue" ? hw : "all" const [insights, students, schedule] = await Promise.all([ getClassHomeworkInsights({ classId: id, limit: 50 }), getClassStudents({ classId: id }), getClassSchedule({ classId: id }), ]) if (!insights) return notFound() const latest = insights.latest const filteredAssignments = insights.assignments.filter((a) => { if (hwFilter === "all") return true if (hwFilter === "overdue") return a.isOverdue if (hwFilter === "active") return a.isActive return true }) const hasAssignments = filteredAssignments.length > 0 const scheduleBuilderClasses = [ { id: insights.class.id, name: insights.class.name, grade: insights.class.grade, homeroom: insights.class.homeroom ?? null, room: insights.class.room ?? null, studentCount: insights.studentCounts.total, }, ] return (
{insights.class.grade} {insights.studentCounts.total} students

{insights.class.name}

{insights.class.room ? `Room: ${insights.class.room}` : "Room: Not set"} {insights.class.homeroom ? ` · Homeroom: ${insights.class.homeroom}` : null}
Students
{insights.studentCounts.total}
Active {insights.studentCounts.active} · Inactive {insights.studentCounts.inactive}
Schedule items
{schedule.length}
Weekly timetable entries
Assignments
{insights.assignments.length}
{latest ? `Latest ${formatDate(latest.createdAt)}` : "No homework yet"}
Overall avg
{formatNumber(insights.overallScores.avg, 1)}
Median {formatNumber(insights.overallScores.median, 1)} · Count {insights.overallScores.count}
{latest ? (
Latest homework
{latest.title} {latest.status} · {formatDate(latest.createdAt)} {latest.dueAt ? ( <> · Due {formatDate(latest.dueAt)} ) : null}
Targeted
{latest.targetCount}
Submitted
{latest.submittedCount}
Graded
{latest.gradedCount}
Average
{formatNumber(latest.scoreStats.avg, 1)}
Median
{formatNumber(latest.scoreStats.median, 1)}
) : null}
Students (preview) {students.length === 0 ? (
No students enrolled.
) : (
Name Email Status {students.slice(0, 8).map((s) => ( {s.name} {s.email} {s.status} ))}
)}
Schedule
Homework history
{!hasAssignments ? (
No homework assignments yet.
) : (
Assignment Status Due Targeted Submitted Graded Avg Median {filteredAssignments.map((a) => ( {a.title}
Created {formatDate(a.createdAt)}
{a.status} {a.dueAt ? formatDate(a.dueAt) : "-"} {a.targetCount} {a.submittedCount} {a.gradedCount} {formatNumber(a.scoreStats.avg, 1)} {formatNumber(a.scoreStats.median, 1)}
))}
)}
) }