import { trpc } from "@/lib/trpc"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Progress } from "@/components/ui/progress"; import { Calendar, Users, GraduationCap, Clock, MapPin, AlertCircle } from "lucide-react"; import { format } from "date-fns"; import { fr } from "date-fns/locale"; import { Skeleton } from "@/components/ui/skeleton"; import DashboardLayout from "@/components/DashboardLayout"; export default function FormateurDashboard() { const { data: stats, isLoading: statsLoading } = trpc.formateurs.dashboardStats.useQuery(); const { data: prochainesSequences, isLoading: sequencesLoading } = trpc.formateurs.prochainesSequences.useQuery({ limit: 10 }); if (statsLoading) { return ( ); } return ( {/* En-tête */} Tableau de bord formateur Vue d'ensemble de vos formations et prochaines interventions {/* Cartes de statistiques */} Total séquences {stats?.totalSequences || 0} Toutes vos séquences de formation Séquences à venir {stats?.sequencesAvenir || 0} Avec au moins une date future Total apprenants {stats?.totalInscrits || 0} Inscrits confirmés à vos séquences {/* Liste des prochaines séquences */} Prochaines séquences Vos interventions à venir triées par date {sequencesLoading ? ( {[1, 2, 3].map((i) => ( ))} ) : prochainesSequences && prochainesSequences.length > 0 ? ( {prochainesSequences.map((seq: any) => { const pourcentageRemplissage = seq.capaciteMax > 0 ? Math.round((seq.nbInscrits / seq.capaciteMax) * 100) : 0; const estComplete = pourcentageRemplissage >= 100; const estPresqueComplete = pourcentageRemplissage >= 80 && pourcentageRemplissage < 100; return ( {seq.nom} {seq.formation?.nom || "Formation inconnue"} {seq.statut === 'ouverte' ? 'Ouverte' : seq.statut === 'bloquee' ? 'Bloquée' : 'Terminée'} {/* Lieu */} {seq.lieu} {/* Dates */} Dates de formation {seq.dates.map((date: any) => { const dateDebut = new Date(date.dateDebut); const dateFin = new Date(date.dateFin); const estFuture = dateDebut >= new Date(); return ( {format(dateDebut, "dd MMM", { locale: fr })} {dateDebut.toDateString() !== dateFin.toDateString() && ` - ${format(dateFin, "dd MMM", { locale: fr })}` } ); })} {/* Capacité */} Inscriptions {seq.nbInscrits} / {seq.capaciteMax} {estComplete && ( Capacité maximale atteinte )} {estPresqueComplete && ( Presque complète ({pourcentageRemplissage}%) )} ); })} ) : ( Aucune séquence à venir pour le moment )} ); }
Vue d'ensemble de vos formations et prochaines interventions
Toutes vos séquences de formation
Avec au moins une date future
Inscrits confirmés à vos séquences
Aucune séquence à venir pour le moment