import DashboardLayout from "@/components/DashboardLayout"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { trpc } from "@/lib/trpc"; import { Plus, Pencil, Trash2, Search, SlidersHorizontal, Eye } from "lucide-react"; import { useState, useMemo } from "react"; import { useLocation } from "wouter"; import { toast } from "sonner"; import { Skeleton } from "@/components/ui/skeleton"; export default function AdminApprenants() { const [, setLocation] = useLocation(); const [open, setOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [searchTerm, setSearchTerm] = useState(""); const [filterFonction, setFilterFonction] = useState("all"); const [formData, setFormData] = useState({ nom: "", prenom: "", email: "", codeEtablissement: "", fonction: "autre" as "directeur" | "chef_service" | "autre", }); const utils = trpc.useUtils(); const { data: apprenants, isLoading } = trpc.apprenants.list.useQuery(); const createMutation = trpc.apprenants.create.useMutation({ onSuccess: () => { utils.apprenants.list.invalidate(); toast.success("Apprenant créé avec succès"); setOpen(false); resetForm(); }, onError: (error) => { toast.error("Erreur lors de la création : " + error.message); }, }); const updateMutation = trpc.apprenants.update.useMutation({ onSuccess: () => { utils.apprenants.list.invalidate(); toast.success("Apprenant mis à jour avec succès"); setOpen(false); resetForm(); }, onError: (error) => { toast.error("Erreur lors de la mise à jour : " + error.message); }, }); const deleteMutation = trpc.apprenants.delete.useMutation({ onSuccess: () => { utils.apprenants.list.invalidate(); toast.success("Apprenant supprimé avec succès"); }, onError: (error) => { toast.error("Erreur lors de la suppression : " + error.message); }, }); const resetForm = () => { setFormData({ nom: "", prenom: "", email: "", codeEtablissement: "", fonction: "autre" }); setEditingId(null); }; const handleEdit = (apprenant: any) => { setFormData({ nom: apprenant.nom, prenom: apprenant.prenom, email: apprenant.email, codeEtablissement: apprenant.codeEtablissement, fonction: apprenant.fonction || "autre", }); setEditingId(apprenant.id); setOpen(true); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (editingId) { updateMutation.mutate({ id: editingId, ...formData }); } else { createMutation.mutate(formData); } }; const handleDelete = (id: number) => { if (confirm("Êtes-vous sûr de vouloir supprimer cet apprenant ?")) { deleteMutation.mutate({ id }); } }; // Filtrer les apprenants const filteredApprenants = useMemo(() => { if (!apprenants) return []; return apprenants.filter(apprenant => { const matchesSearch = searchTerm === "" || apprenant.nom.toLowerCase().includes(searchTerm.toLowerCase()) || apprenant.prenom.toLowerCase().includes(searchTerm.toLowerCase()) || apprenant.email.toLowerCase().includes(searchTerm.toLowerCase()) || apprenant.codeEtablissement.toLowerCase().includes(searchTerm.toLowerCase()); const matchesFonction = filterFonction === "all" || apprenant.fonction === filterFonction; return matchesSearch && matchesFonction; }); }, [apprenants, searchTerm, filterFonction]); return (

Apprenants

Gérez les apprenants et leurs informations

{ setOpen(isOpen); if (!isOpen) resetForm(); }}>
{editingId ? "Modifier l'apprenant" : "Nouvel apprenant"} Ajoutez les informations de l'apprenant
setFormData({ ...formData, nom: e.target.value })} placeholder="Dupont" required />
setFormData({ ...formData, prenom: e.target.value })} placeholder="Jean" required />
setFormData({ ...formData, email: e.target.value })} placeholder="jean.dupont@example.com" required />
setFormData({ ...formData, codeEtablissement: e.target.value })} placeholder="ETB001" required />
{/* Filtres et recherche */} Recherche
setSearchTerm(e.target.value)} className="pl-8" />
{/* Compteur de résultats */}
{filteredApprenants.length} apprenant(s) trouvé(s)
Liste des apprenants Gérez les apprenants inscrits aux formations {isLoading ? (
) : filteredApprenants && filteredApprenants.length > 0 ? ( Nom Prénom Email Code établissement Fonction Statut Actions {filteredApprenants.map((apprenant) => ( {apprenant.nom} {apprenant.prenom} {apprenant.email} {apprenant.codeEtablissement} {apprenant.fonction === "directeur" ? "Directeur" : apprenant.fonction === "chef_service" ? "Chef de service" : "Autre"} 0 ? "bg-green-100 text-green-800" : "bg-gray-100 text-gray-800" }`}> {apprenant.inscriptions && apprenant.inscriptions.length > 0 ? "Actif" : "Inactif"}
))}
) : (
Aucun apprenant pour le moment. Créez-en un pour commencer.
)}
); }