import { useState } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { useStudentProgressList, useStudentProgressDetail } from "@/hooks/queries"; import { Search, TrendingUp, Loader2 } from "lucide-react"; import type { StudentProgression } from "@/types/student-progress"; function rateColor(rate: number | null | undefined): string { if (rate == null) return "bg-muted text-muted-foreground"; if (rate >= 85) return "bg-emerald-100 text-emerald-700 border-emerald-200"; if (rate >= 60) return "bg-amber-100 text-amber-700 border-amber-200"; return "bg-red-100 text-red-700 border-red-200"; } export default function AdminStudentProgress() { const [search, setSearch] = useState(""); const [drillId, setDrillId] = useState(null); const { data, isLoading } = useStudentProgressList({ q: search || undefined, size: 200 }); const items = (data?.data ?? data?.items ?? []) as StudentProgression[]; const { data: detail, isLoading: loadingDetail } = useStudentProgressDetail(drillId); if (isLoading) { return (
); } return (

Student progress

Per-student attendance, assignments and marksheet activity across the institution. Click a row for the breakdown.

setSearch(e.target.value)} className="pl-9" />
# Student GR No. Attendance Assignments Marksheet lines Avg marks {items.length === 0 && ( No students match your search. )} {items.map((r, i) => ( setDrillId(r.id)} > {i + 1} {r.student_name || "—"} {r.gr_no || "—"}
{r.total_attendance_present ?? 0}/{r.total_attendance ?? 0} {r.attendance_rate != null && ( {r.attendance_rate}% )}
{r.total_assignment ?? 0} {r.total_marksheet_line ?? 0} {r.avg_marks != null ? r.avg_marks : "—"}
))}
!open && setDrillId(null)}> {detail?.student_name || "Student breakdown"} {detail?.gr_no ? ( GR {detail.gr_no} ) : null} {loadingDetail && (
)} {detail && !loadingDetail && (

Recent attendance ({detail.attendance.length})

Sheet Present {detail.attendance.length === 0 && ( No attendance records. )} {detail.attendance.map((a) => ( {a.sheet || "—"} {a.present == null ? "—" : a.present ? ( Present ) : ( Absent )} ))}

Recent assignments ({detail.assignments.length})

Assignment Marks State {detail.assignments.length === 0 && ( No assignment submissions. )} {detail.assignments.map((a) => ( {a.assignment || "—"} {a.marks ?? 0} {a.state || "—"} ))}

Marksheet lines ({detail.marksheets.length})

Marksheet Marks Grade {detail.marksheets.length === 0 && ( No marksheet lines. )} {detail.marksheets.map((m) => ( {m.marksheet || "—"} {m.marks ?? 0} {m.grade || "—"} ))}
)}
); }