diff --git a/client/src/pages/AdminSequences.tsx b/client/src/pages/AdminSequences.tsx index 11d6ed8..4febfd5 100644 --- a/client/src/pages/AdminSequences.tsx +++ b/client/src/pages/AdminSequences.tsx @@ -7,8 +7,9 @@ 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 { Badge } from "@/components/ui/badge"; import { trpc } from "@/lib/trpc"; -import { Calendar, Edit, Eye, Plus, Trash2, X } from "lucide-react"; +import { Calendar, Edit, Eye, Plus, Trash2, X, Bell } from "lucide-react"; import FormateurCombobox from "@/components/FormateurCombobox"; import CapacityProgressBar from "@/components/CapacityProgressBar"; import { toast } from "sonner"; @@ -675,6 +676,7 @@ export default function AdminSequences() { Formation Nom Dates + Rappels configurés Lieu Formateur Public cible @@ -698,6 +700,31 @@ export default function AdminSequences() { ))} + +
+ {sequence.dates.map((date: any) => ( +
+
Date {date.ordre}:
+
+ {date.rappels && date.rappels.length > 0 ? ( + date.rappels.map((rappel: any) => ( + + + {rappel.nom} + + )) + ) : ( + Aucun rappel + )} +
+
+ ))} +
+
{sequence.lieu} {sequence.formateur?.nom || "-"} diff --git a/server/db.ts b/server/db.ts index 075738f..324147e 100644 --- a/server/db.ts +++ b/server/db.ts @@ -1113,6 +1113,41 @@ export async function updateRappelExecution(id: number) { }).where(eq(rappels.id, id)); } +export async function getRappelsByDateFormation(dateFormationId: number) { + const db = await getDb(); + if (!db) return []; + + // Récupérer les IDs des rappels associés à cette date + const rappelDatesResults = await db.select().from(rappelDates).where(eq(rappelDates.dateFormationId, dateFormationId)); + const rappelIds = rappelDatesResults.map(rd => rd.rappelId); + + if (rappelIds.length === 0) { + // Retourner tous les rappels actifs qui n'ont pas de dates spécifiques (rappels globaux) + const allRappels = await db.select().from(rappels).where(eq(rappels.actif, true)); + const globalRappels = []; + + for (const rappel of allRappels) { + const dates = await getRappelDates(rappel.id); + if (dates.length === 0) { + globalRappels.push(rappel); + } + } + + return globalRappels; + } + + // Récupérer les détails des rappels + const rappelsResults = await Promise.all( + rappelIds.map(async (id) => { + const rappelResult = await db.select().from(rappels).where(eq(rappels.id, id)).limit(1); + return rappelResult.length > 0 ? rappelResult[0] : null; + }) + ); + + // Filtrer les null et retourner + return rappelsResults.filter((r): r is Rappel => r !== null); +} + // ==================== UTILISATEURS ADMIN ==================== diff --git a/server/routers.ts b/server/routers.ts index bde77f4..ecd8d5f 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -258,7 +258,16 @@ export const appRouter = router({ seqs.map(async (seq) => { const dates = await db.getDatesBySequence(seq.id); const nbInscrits = await db.countInscriptionsBySequence(seq.id, 'confirmee'); - return { ...seq, dates, nbInscrits }; + + // Récupérer les rappels associés à chaque date + const datesAvecRappels = await Promise.all( + dates.map(async (date) => { + const rappels = await db.getRappelsByDateFormation(date.id); + return { ...date, rappels }; + }) + ); + + return { ...seq, dates: datesAvecRappels, nbInscrits }; }) ); return sequencesAvecDates; diff --git a/todo.md b/todo.md index 00b8f10..5643610 100644 --- a/todo.md +++ b/todo.md @@ -585,3 +585,8 @@ - [x] Ajouter des badges colorés pour distinguer formations, séquences et dates - [x] Utiliser des icônes pour identifier chaque type d'élément - [x] Améliorer la hiérarchie typographique pour faciliter la lecture + +## Colonne Rappels configurés dans la gestion des séquences +- [x] Modifier le backend pour récupérer les rappels associés à chaque date +- [x] Ajouter la colonne "Rappels configurés" dans le tableau des séquences +- [x] Afficher les rappels avec badges visuels similaires à la page des rappels