From 512b989be73819436d9adb6727666e6383a4af96 Mon Sep 17 00:00:00 2001 From: Manus Date: Fri, 16 Jan 2026 09:36:30 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Ajout=20d'un=20bouton=20pour=20vi?= =?UTF-8?q?der=20la=20table=20des=20logs=20d'historique=20des=20rappels=20?= =?UTF-8?q?avec=20bo=C3=AEte=20de=20dialogue=20de=20confirmation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Fonctionnalités ajoutées :** 1. **Procédure tRPC `viderHistoriqueRappels`** (server/routers.ts) : - Mutation admin protégée pour supprimer tous les logs de la table logsRappels - Retourne le nombre de logs supprimés - Utilise une requête SQL directe pour optimiser les performances 2. **Bouton de vidage dans l'interface** (client/src/pages/admin/AdminRappelsHistorique.tsx) : - Bouton rouge "Vider l'historique" avec icône de corbeille - Dialogue de confirmation AlertDialog avec message d'avertissement - Invalidation automatique de la requête historique après suppression - Toast de succès avec le nombre de logs supprimés 3. **Correction d'une erreur TypeScript** : - Ajout d'une parenthèse fermante manquante dans le router gestionAttestations - Correction de l'erreur TS1135: Argument expression expected **Fichiers modifiés :** - server/routers.ts : Ajout de la procédure viderHistoriqueRappels - client/src/pages/admin/AdminRappelsHistorique.tsx : Ajout du bouton avec dialogue Déployé sur le VPS de production (https://formations.itinova.org) --- .../pages/admin/AdminRappelsHistorique.tsx | 54 ++++++++++++++++++- server/routers.ts | 21 ++++++++ todo.md | 3 ++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/client/src/pages/admin/AdminRappelsHistorique.tsx b/client/src/pages/admin/AdminRappelsHistorique.tsx index b22e11b..4997a93 100644 --- a/client/src/pages/admin/AdminRappelsHistorique.tsx +++ b/client/src/pages/admin/AdminRappelsHistorique.tsx @@ -13,8 +13,20 @@ import { } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from "@/components/ui/alert-dialog"; import { trpc } from "@/lib/trpc"; -import { History, Search, Filter, ChevronLeft, ChevronRight } from "lucide-react"; +import { History, Search, Filter, ChevronLeft, ChevronRight, Trash2 } from "lucide-react"; +import { toast } from "sonner"; import { format } from "date-fns"; import { fr } from "date-fns/locale"; @@ -31,6 +43,17 @@ export default function AdminRappelsHistorique() { const { data: logs, isLoading } = trpc.rappels.historique.useQuery(filtres); const { data: sequences } = trpc.sequences.list.useQuery(); + const utils = trpc.useUtils(); + + const viderHistorique = trpc.rappels.viderHistoriqueRappels.useMutation({ + onSuccess: (data) => { + toast.success(data.message); + utils.rappels.historique.invalidate(); + }, + onError: (error) => { + toast.error(`Erreur: ${error.message}`); + }, + }); const handleFilterChange = (key: string, value: any) => { setFiltres(prev => ({ @@ -69,7 +92,34 @@ export default function AdminRappelsHistorique() { Consultez tous les rappels envoyés avec filtres avancés

- +
+ + + + + + + Êtes-vous absolument sûr ? + + Cette action est irréversible. Tous les logs d'historique des rappels seront définitivement supprimés de la base de données. + + + + Annuler + viderHistorique.mutate()} + className="bg-destructive text-destructive-foreground hover:bg-destructive/90" + > + Oui, vider l'historique + + + + + +
{/* Filtres */} diff --git a/server/routers.ts b/server/routers.ts index aff78ca..b348578 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -1568,6 +1568,26 @@ export const appRouter = router({ message: `${nbSupprimes} log(s) erroné(s) supprimé(s)`, }; }), + + // Vider complètement la table des logs de rappels + viderHistoriqueRappels: adminProcedure + .mutation(async () => { + const database = await db.getDb(); + if (!database) throw new Error("Database not available"); + + // Supprimer tous les logs de rappels + const result = await database.execute(sql` + DELETE FROM logsRappels + `); + + const nbSupprimes = Array.isArray(result) ? 0 : (result as any).affectedRows || 0; + + return { + success: true, + nbSupprimes, + message: `${nbSupprimes} log(s) supprimé(s) de l'historique`, + }; + }), }), emailConfig: router({ @@ -2530,6 +2550,7 @@ export const appRouter = router({ return { success: true }; }), + }), }); diff --git a/todo.md b/todo.md index f87d4b4..ccbef30 100644 --- a/todo.md +++ b/todo.md @@ -836,3 +836,6 @@ - [x] Ajouter une colonne "Type d'envoi" avec badge coloré dans l'interface d'historique des rappels - [x] Nettoyer les anciens logs erronés de la base de données - [x] Corriger les erreurs TypeScript critiques liées aux types null/undefined (réduction de 115 à 88 erreurs) +- [x] Diagnostiquer pourquoi le rappel J+2 pour la séquence Test3 n'a pas été envoyé à opareige@gmail.com (déjà envoyé automatiquement) +- [x] Corriger l'erreur de connexion à la base de données qui empêche adminServFormation de se connecter (PM2 ne chargeait pas le fichier .env) +- [x] Ajouter un bouton pour vider la table des logs d'historique des rappels avec une boîte de dialogue de confirmation