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:
@@ -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>
|
||||
|
||||
7
todo.md
7
todo.md
@@ -132,3 +132,10 @@
|
||||
- [x] Identifier les procédures tRPC qui causent les erreurs
|
||||
- [x] Corriger les erreurs côté serveur (emailBody, reduce)
|
||||
- [x] Tester la page admin pour vérifier que les erreurs sont résolues
|
||||
|
||||
## Rendre accessibles les pages d'historique et statistiques des rappels
|
||||
|
||||
- [x] Vérifier que les routes sont bien définies dans App.tsx
|
||||
- [x] Vérifier que les liens sont bien dans le menu DashboardLayout
|
||||
- [x] Ajouter la gestion des sous-menus dans DashboardLayout
|
||||
- [x] Tester l'accès aux pages /admin/rappels/historique et /admin/rappels/statistiques
|
||||
|
||||
Reference in New Issue
Block a user