import { useState } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; 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, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Plus, Trash2, ChevronRight, RefreshCw, Loader2 } from "lucide-react"; import { useAcademicYears, useCreateAcademicYear, useDeleteAcademicYear, useGenerateTerms, useAcademicTerms, } from "@/hooks/queries/useAcademic"; import { useToast } from "@/hooks/use-toast"; import type { AcademicYear, AcademicYearCreateRequest } from "@/types/academic"; const TERM_STRUCTURES: { value: AcademicYear["term_structure"]; label: string }[] = [ { value: "two_sem", label: "Two Semesters" }, { value: "two_sem_qua", label: "Two Semesters + Quarter" }, { value: "three_sem", label: "Three Semesters" }, { value: "four_Quarter", label: "Four Quarters" }, { value: "final_year", label: "Final Year" }, { value: "others", label: "Others" }, ]; export default function AcademicYearManager() { const { toast } = useToast(); const { data: yearsData, isLoading } = useAcademicYears(); const years = yearsData?.items ?? []; const createYear = useCreateAcademicYear(); const deleteYear = useDeleteAcademicYear(); const generateTerms = useGenerateTerms(); const [showCreate, setShowCreate] = useState(false); const [expandedId, setExpandedId] = useState(null); const [form, setForm] = useState({ name: "", start_date: "", end_date: "", term_structure: "two_sem", }); const { data: termsData } = useAcademicTerms(expandedId ?? undefined); const terms = termsData?.items ?? []; const handleCreate = () => { createYear.mutate(form, { onSuccess: () => { toast({ title: "Academic year created" }); setShowCreate(false); setForm({ name: "", start_date: "", end_date: "", term_structure: "two_sem" }); }, onError: () => toast({ title: "Error", description: "Failed to create academic year", variant: "destructive" }), }); }; const handleDelete = (id: number) => { if (!window.confirm("Delete this academic year?")) return; deleteYear.mutate(id, { onSuccess: () => toast({ title: "Academic year deleted" }), onError: () => toast({ title: "Error", description: "Failed to delete", variant: "destructive" }), }); }; const handleGenerateTerms = (yearId: number) => { generateTerms.mutate(yearId, { onSuccess: () => toast({ title: "Terms generated" }), onError: () => toast({ title: "Error", description: "Failed to generate terms", variant: "destructive" }), }); }; if (isLoading) return
; return (

Academic Years

Manage academic years and their terms.

Create Academic Year Define the academic year range and term structure.
setForm({ ...form, name: e.target.value })} />
setForm({ ...form, start_date: e.target.value })} />
setForm({ ...form, end_date: e.target.value })} />
Name Start Date End Date Term Structure Terms Actions {years.map((year: AcademicYear) => ( setExpandedId(open ? year.id : null)}> <> {year.name} {year.start_date} {year.end_date} {TERM_STRUCTURES.find(t => t.value === year.term_structure)?.label ?? year.term_structure} {year.terms?.length ?? 0}
{expandedId === year.id && (

Terms

{terms.length > 0 ? (
{terms.map(term => (
{term.name} {term.term_start_date} — {term.term_end_date}
))}
) : (

No terms yet. Click "Generate Terms" to auto-create.

)}
)}
))} {years.length === 0 && ( No academic years found. )}
); }