Checkpoint: Pages d'historique et statistiques des rappels accessibles

**Problème résolu** :
Les pages AdminRappelsHistorique et AdminRappelsStats étaient créées mais non accessibles car le menu de navigation ne gérait pas les sous-menus (subItems).

**Modifications apportées** :

1. **Gestion des sous-menus dans DashboardLayout.tsx**
   - Ajout de la logique pour détecter et afficher les sous-menus (subItems)
   - Détection automatique des sous-items actifs pour mettre en surbrillance le menu parent
   - Affichage des sous-menus avec indentation (ml-6) et taille réduite (h-9 text-sm)
   - Les sous-menus s'affichent automatiquement sous leur item parent

2. **Structure du menu**
   - Menu principal "Rappels" → `/admin/rappels` (configuration)
   - Sous-menu "Historique" → `/admin/rappels/historique`
   - Sous-menu "Statistiques" → `/admin/rappels/statistiques`

**Pages maintenant accessibles** :

1. **Page Historique des Rappels** (`/admin/rappels/historique`)
   - Filtres avancés : date début/fin, séquence, statut, email
   - Tableau complet avec colonnes : Date envoi, Email, Type, Statut, Tentatives, Erreur
   - Badge de statut coloré : vert pour succès, rouge pour échec
   - Pagination (50 résultats par page)
   - Affichage du nombre de résultats trouvés

2. **Page Statistiques des Rappels** (`/admin/rappels/statistiques`)
   - 4 cartes de statistiques : Total envoyés, Succès, Échecs, Taux de succès
   - Graphique "Évolution des envois" : ligne temporelle avec succès/échecs
   - Graphique "Taux de succès par jour" : barres de pourcentage
   - Section "Emails problématiques" : Top 10 des emails avec le plus d'échecs
   - Message "Aucun email problématique détecté" quand tout va bien

**Tests effectués** :
-  Navigation vers Historique fonctionne
-  Navigation vers Statistiques fonctionne
-  Affichage des données réelles (1 rappel J-7 envoyé avec succès)
-  Filtres et graphiques s'affichent correctement
-  Mise en surbrillance du menu actif

**Fichier modifié** :
- `client/src/components/DashboardLayout.tsx` : Ajout de la gestion des sous-menus
This commit is contained in:
Manus Sandbox
2025-12-08 15:01:48 -05:00
parent 15e30a1e32
commit e484f45467
2 changed files with 43 additions and 13 deletions

View File

@@ -257,20 +257,43 @@ function DashboardLayoutContent({
<SidebarMenu className="px-2 py-1">
{section.items.map(item => {
const isActive = location === item.path;
const hasSubItems = 'subItems' in item && item.subItems && item.subItems.length > 0;
const isSubItemActive = hasSubItems && item.subItems.some((sub: any) => location === sub.path);
return (
<SidebarMenuItem key={item.path}>
<SidebarMenuButton
isActive={isActive}
onClick={() => setLocation(item.path)}
tooltip={item.label}
className={`h-10 transition-all font-normal`}
>
<item.icon
className={`h-4 w-4 ${isActive ? "text-primary" : ""}`}
/>
<span>{item.label}</span>
</SidebarMenuButton>
</SidebarMenuItem>
<div key={item.path}>
<SidebarMenuItem>
<SidebarMenuButton
isActive={isActive || isSubItemActive}
onClick={() => setLocation(item.path)}
tooltip={item.label}
className={`h-10 transition-all font-normal`}
>
<item.icon
className={`h-4 w-4 ${isActive || isSubItemActive ? "text-primary" : ""}`}
/>
<span>{item.label}</span>
</SidebarMenuButton>
</SidebarMenuItem>
{hasSubItems && (
<div className="ml-6 mt-1 space-y-1">
{item.subItems.map((subItem: any) => {
const isSubActive = location === subItem.path;
return (
<SidebarMenuItem key={subItem.path}>
<SidebarMenuButton
isActive={isSubActive}
onClick={() => setLocation(subItem.path)}
tooltip={subItem.label}
className="h-9 text-sm font-normal"
>
<span className="ml-2">{subItem.label}</span>
</SidebarMenuButton>
</SidebarMenuItem>
);
})}
</div>
)}
</div>
);
})}
</SidebarMenu>