import { useState } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { useBatches, useCourses } from "@/hooks/queries"; import { lmsService } from "@/services/lms.service"; import { api } from "@/lib/api-client"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { Search, Plus, Trash2 } from "lucide-react"; import { Link } from "react-router-dom"; import { useToast } from "@/hooks/use-toast"; import AiBatchOptimizer from "@/components/ai/AiBatchOptimizer"; import AiCreationAssistant from "@/components/ai/AiCreationAssistant"; import AiTipBanner from "@/components/ai/AiTipBanner"; export default function AdminBatches() { const [search, setSearch] = useState(""); const [createOpen, setCreateOpen] = useState(false); const [form, setForm] = useState({ name: "", course_id: "", start_date: "", end_date: "", max_students: "30" }); const { toast } = useToast(); const qc = useQueryClient(); const { data: batchesData, isLoading } = useBatches(); const { data: coursesData } = useCourses({ size: 200 }); const batches = batchesData?.items ?? []; const courses = coursesData?.items ?? []; const createMutation = useMutation({ mutationFn: (data: Record) => lmsService.createBatch(data as never), onSuccess: () => { qc.invalidateQueries({ queryKey: ["lms", "batches"] }); setCreateOpen(false); toast({ title: "Batch created" }); setForm({ name: "", course_id: "", start_date: "", end_date: "", max_students: "30" }); }, onError: (err: Error) => toast({ title: "Error", description: err.message, variant: "destructive" }), }); async function handleDelete(id: number, name: string) { if (!window.confirm(`Delete batch "${name}"?`)) return; try { await api.delete(`/batches/${id}`); qc.invalidateQueries({ queryKey: ["lms", "batches"] }); toast({ title: "Batch deleted" }); } catch (e: unknown) { const msg = e instanceof Error ? e.message : String(e); toast({ title: "Delete failed", description: msg, variant: "destructive" }); } } if (isLoading) return
; const filtered = batches.filter(b => b.name.toLowerCase().includes(search.toLowerCase())); return (

Batches

Manage student batches and groups.

setSearch(e.target.value)} className="pl-9" />
BatchCourseTeacherStudentsScheduleStatus{filtered.map(b => ({b.name}{b.course_name}{b.teacher_name}{b.student_count}/{b.capacity}{b.schedule}{b.status}
))}
Create Batch
setForm(f => ({ ...f, name: e.target.value }))} />
setForm(f => ({ ...f, start_date: e.target.value }))} />
setForm(f => ({ ...f, end_date: e.target.value }))} />
setForm(f => ({ ...f, max_students: e.target.value }))} />
); }