Checkpoint: Ajout d'un bouton pour vider la table des logs d'historique des rappels avec boîte de dialogue de confirmation

**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)
This commit is contained in:
Manus
2026-01-16 09:36:30 -05:00
parent c3c07e5022
commit 512b989be7
3 changed files with 76 additions and 2 deletions

View File

@@ -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
</p>
</div>
<History className="h-8 w-8 text-muted-foreground" />
<div className="flex items-center gap-3">
<AlertDialog>
<AlertDialogTrigger asChild>
<Button variant="destructive" size="sm">
<Trash2 className="h-4 w-4 mr-2" />
Vider l'historique
</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>Êtes-vous absolument sûr ?</AlertDialogTitle>
<AlertDialogDescription>
Cette action est irréversible. Tous les logs d'historique des rappels seront définitivement supprimés de la base de données.
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>Annuler</AlertDialogCancel>
<AlertDialogAction
onClick={() => viderHistorique.mutate()}
className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
>
Oui, vider l'historique
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
<History className="h-8 w-8 text-muted-foreground" />
</div>
</div>
{/* Filtres */}

View File

@@ -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 };
}),
}),
});

View File

@@ -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