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 */}