import { useAuth } from "@/_core/hooks/useAuth"; import DashboardLayout from "@/components/DashboardLayout"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Checkbox } from "@/components/ui/checkbox"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { trpc } from "@/lib/trpc"; import { Calendar, FileText, MapPin, Upload, Users, Award } from "lucide-react"; import { useParams } from "wouter"; import { toast } from "sonner"; import { useState } from "react"; function AttestationButton({ inscriptionId, present }: { inscriptionId: number; present: boolean }) { const [isGenerating, setIsGenerating] = useState(false); const genererAttestation = trpc.attestations.generer.useMutation(); const handleGenerer = async () => { if (!present) { toast.error("L'apprenant doit être marqué comme présent pour générer une attestation"); return; } setIsGenerating(true); try { const result = await genererAttestation.mutateAsync({ inscriptionId }); if (result.success && result.attestation) { toast.success(result.message || "Attestation générée avec succès"); // Ouvrir le PDF dans un nouvel onglet window.open(result.attestation.pdfUrl, "_blank"); } } catch (error: any) { toast.error(error.message || "Erreur lors de la génération de l'attestation"); } finally { setIsGenerating(false); } }; return ( ); } export default function FormateurSequence() { const { id } = useParams(); const sequenceId = parseInt(id || "0"); const formateurId = 1; // TODO: Récupérer depuis la base de données const { data: sequence, isLoading: loadingSequence } = trpc.formateur.detailSequence.useQuery({ sequenceId, formateurId, }); const { data: apprenants, isLoading: loadingApprenants } = trpc.formateur.apprenants.useQuery({ sequenceId, }); const { data: supports, isLoading: loadingSupports, refetch: refetchSupports } = trpc.formateur.supports.useQuery({ sequenceId, }); const validerPresenceMutation = trpc.formateur.validerPresence.useMutation({ onSuccess: () => { toast.success("Présence mise à jour"); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); const handlePresenceChange = (inscriptionId: number, present: boolean) => { validerPresenceMutation.mutate({ inscriptionId, present, }); }; const formatDate = (date: Date) => { return new Date(date).toLocaleDateString("fr-FR", { weekday: "long", day: "numeric", month: "long", year: "numeric", }); }; const formatTime = (date: Date) => { return new Date(date).toLocaleTimeString("fr-FR", { hour: "2-digit", minute: "2-digit", }); }; const formatFileSize = (bytes: number) => { if (bytes < 1024) return bytes + " B"; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB"; return (bytes / (1024 * 1024)).toFixed(1) + " MB"; }; if (loadingSequence) { return (
); } if (!sequence) { return (

Séquence non trouvée ou accès non autorisé

); } return (
{/* En-tête */}

{sequence.nom}

{sequence.formationNom}

{/* Informations générales */} Informations {sequence.lieu && (
{sequence.lieu}
)}
Capacité maximale: {sequence.capaciteMax} apprenants
{/* Dates de formation */} Dates de formation
{sequence.dates?.map((date, index) => (
Jour {index + 1}: {formatDate(date.dateDebut)} ({formatTime(date.dateDebut)} - {formatTime(date.dateFin)})
))}
{/* Onglets */} Apprenants Supports Liste des apprenants inscrits {apprenants?.length || 0} apprenant(s) inscrit(s) {loadingApprenants ? (
) : !apprenants || apprenants.length === 0 ? (
Aucun apprenant inscrit
) : ( Nom Prénom Email Fonction Établissement Statut Présent Attestation {apprenants.map((apprenant) => ( {apprenant.nom} {apprenant.prenom} {apprenant.email} {apprenant.fonction.replace("_", " ")} {apprenant.codeEtablissement} {apprenant.statut === "confirmee" ? "Confirmée" : apprenant.statut === "liste_attente" ? "Liste d'attente" : "Annulée"} handlePresenceChange(apprenant.inscriptionId, checked as boolean) } /> ))}
)}
Supports de formation Documents et ressources pour cette séquence
{loadingSupports ? (
) : !supports || supports.length === 0 ? (
Aucun support ajouté
) : (
{supports.map((support) => (

{support.nomFichier}

{support.typeFichier} • {formatFileSize(support.tailleFichier)} {support.description && ` • ${support.description}`}

))}
)}
); }