import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Search, Plus, FileText, Clock } from "lucide-react"; import { useInstitutionalExamSessions } from "@/hooks/queries"; import { api } from "@/lib/api-client"; import { Link } from "react-router-dom"; interface CustomExam { id: number; title: string; status: string; total_time_min: number; sections: { id: number; title: string; skill: string }[]; teacher_id: number | null; template_id: number | null; description: string; } const statusColors: Record = { published: "default", draft: "secondary", archived: "outline", }; export default function ExamsListPage() { const [search, setSearch] = useState(""); const [tab, setTab] = useState<"custom" | "sessions">("custom"); const customQ = useQuery({ queryKey: ["custom-exams", search], queryFn: () => api.get<{ items: CustomExam[]; total: number }>(`/exam/custom/list?search=${encodeURIComponent(search)}&per_page=50`), }); const sessionsQ = useInstitutionalExamSessions(); const sessionItems = sessionsQ.data?.data ?? sessionsQ.data?.items ?? []; const sessions = Array.isArray(sessionItems) ? sessionItems : []; const customExams = customQ.data?.items ?? []; const q = search.toLowerCase(); const filteredSessions = sessions.filter((s: Record) => s.name?.toLowerCase().includes(q) || s.course_name?.toLowerCase().includes(q), ); return (

Exams List

Browse and manage all exams and exam sessions.

setSearch(e.target.value)} />
{tab === "custom" && ( customQ.isLoading ? (
) : ( # Title Modules Duration Status {customExams.length === 0 && ( No custom exams found. Submit one from the Generation page. )} {customExams.map((exam, i) => ( {exam.id} {exam.title}
{exam.sections.length > 0 ? exam.sections.map((s) => ( {s.skill || s.title} )) : }
{exam.total_time_min ? `${exam.total_time_min} min` : "—"} {exam.status}
))}
) )} {tab === "sessions" && ( sessionsQ.isLoading ? (
) : ( # Name Course Batch Start End State {filteredSessions.length === 0 && ( No exam sessions found. )} {filteredSessions.map((s: Record, i: number) => ( {i + 1} {s.name} {s.course_name || "—"} {s.batch_name || "—"} {s.start_date || "—"} {s.end_date || "—"} {s.state} ))}
) )}
); }