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 { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { trpc } from "@/lib/trpc"; import { Plus, Pencil, Trash2, Users as UsersIcon } from "lucide-react"; import { useState } from "react"; import { toast } from "sonner"; import { Skeleton } from "@/components/ui/skeleton"; import { format } from "date-fns"; import { fr } from "date-fns/locale"; import { useLocation } from "wouter"; export default function AdminSessions() { const [, setLocation] = useLocation(); const [open, setOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [formData, setFormData] = useState({ formationId: "", nom: "", dateDebut: "", dateFin: "", lieu: "", capaciteMax: "12", dateBlocage: "", statut: "ouverte" as "ouverte" | "bloquee" | "terminee", }); const utils = trpc.useUtils(); const { data: sessions, isLoading } = trpc.sessions.list.useQuery(); const { data: formations } = trpc.formations.list.useQuery(); const createMutation = trpc.sessions.create.useMutation({ onSuccess: () => { utils.sessions.list.invalidate(); toast.success("Session créée avec succès"); setOpen(false); resetForm(); }, onError: (error) => { toast.error("Erreur lors de la création : " + error.message); }, }); const updateMutation = trpc.sessions.update.useMutation({ onSuccess: () => { utils.sessions.list.invalidate(); toast.success("Session mise à jour avec succès"); setOpen(false); resetForm(); }, onError: (error) => { toast.error("Erreur lors de la mise à jour : " + error.message); }, }); const deleteMutation = trpc.sessions.delete.useMutation({ onSuccess: () => { utils.sessions.list.invalidate(); toast.success("Session supprimée avec succès"); }, onError: (error) => { toast.error("Erreur lors de la suppression : " + error.message); }, }); const resetForm = () => { setFormData({ formationId: "", nom: "", dateDebut: "", dateFin: "", lieu: "", capaciteMax: "12", dateBlocage: "", statut: "ouverte", }); setEditingId(null); }; const handleEdit = (session: any) => { setFormData({ formationId: session.formationId.toString(), nom: session.nom, dateDebut: format(new Date(session.dateDebut), "yyyy-MM-dd'T'HH:mm"), dateFin: format(new Date(session.dateFin), "yyyy-MM-dd'T'HH:mm"), lieu: session.lieu, capaciteMax: session.capaciteMax.toString(), dateBlocage: format(new Date(session.dateBlocage), "yyyy-MM-dd'T'HH:mm"), statut: session.statut, }); setEditingId(session.id); setOpen(true); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const data = { formationId: parseInt(formData.formationId), nom: formData.nom, dateDebut: formData.dateDebut, dateFin: formData.dateFin, lieu: formData.lieu, capaciteMax: parseInt(formData.capaciteMax), dateBlocage: formData.dateBlocage, statut: formData.statut, }; if (editingId) { updateMutation.mutate({ id: editingId, ...data }); } else { createMutation.mutate(data); } }; const handleDelete = (id: number) => { if (confirm("Êtes-vous sûr de vouloir supprimer cette session ?")) { deleteMutation.mutate({ id }); } }; const getFormationName = (formationId: number) => { return formations?.find(f => f.id === formationId)?.nom || "Formation inconnue"; }; const formatDate = (date: Date | string) => { return format(new Date(date), "dd/MM/yyyy HH:mm", { locale: fr }); }; const getStatutBadge = (statut: string) => { const styles = { ouverte: "bg-green-100 text-green-800", bloquee: "bg-orange-100 text-orange-800", terminee: "bg-gray-100 text-gray-800", }; const labels = { ouverte: "Ouverte", bloquee: "Bloquée", terminee: "Terminée", }; return ( {labels[statut as keyof typeof labels]} ); }; return (

Sessions

Gérez les sessions de formation et leurs inscriptions

{ setOpen(isOpen); if (!isOpen) resetForm(); }}>
{editingId ? "Modifier la session" : "Nouvelle session"} Créez une session avec dates, lieu et capacité
setFormData({ ...formData, nom: e.target.value })} placeholder="Session 1 - Février 2026" required />
setFormData({ ...formData, dateDebut: e.target.value })} required />
setFormData({ ...formData, dateFin: e.target.value })} required />
setFormData({ ...formData, lieu: e.target.value })} placeholder="Salle de formation A, Bâtiment principal" required />
setFormData({ ...formData, capaciteMax: e.target.value })} required />
setFormData({ ...formData, dateBlocage: e.target.value })} required />
Liste des sessions Gérez vos sessions et consultez les inscriptions {isLoading ? (
) : sessions && sessions.length > 0 ? (
Formation Nom Date début Date fin Lieu Capacité Statut Actions {sessions.map((session) => ( {getFormationName(session.formationId)} {session.nom} {formatDate(session.dateDebut)} {formatDate(session.dateFin)} {session.lieu} {session.capaciteMax} {getStatutBadge(session.statut)}
))}
) : (
Aucune session pour le moment. Créez-en une pour commencer.
)}
); }