5.2 KiB
5.2 KiB
📊 Intégration des données réelles dans la page Statistiques
📋 Problème résolu
La page de statistiques (AdminStatisticsPage) utilisait des données de test statiques pour les filtres secteurs et membres au lieu des vraies données stockées dans les boxes Hive.
✨ Solutions implémentées
1. 🔄 Chargement dynamique des données
- Secteurs : Chargés depuis la box
sectors(Hive) - Membres : Chargés depuis la box
membres(Hive) - Méthode
_loadData(): Charge les données au démarrage - Listes dynamiques : Remplacent les données statiques
2. 🗺️ Mapping des IDs
- Maps de correspondance :
_sectorIdset_memberIds - Association nom ↔ ID : Pour retrouver l'ID à partir du nom sélectionné
- Gestion du "Tous" : Retourne
nullpour afficher toutes les données
3. 📝 Corrections apportées
- SectorModel : Utilisation du champ
libelle(pasname) - MembreModel : Concaténation
firstName + namepour l'affichage - Suppression du ValueListenableBuilder : Temporairement retiré (nécessite plus de travail)
📂 Fichiers modifiés
lib/presentation/admin/admin_statistics_page.dart
Imports ajoutés
import 'package:hive_flutter/hive_flutter.dart';
import 'package:geosector_app/core/constants/app_keys.dart';
import 'package:geosector_app/core/data/models/sector_model.dart';
import 'package:geosector_app/core/data/models/membre_model.dart';
Variables modifiées
// Avant (données statiques)
final List<String> _sectors = [
'Tous',
'Secteur Nord',
'Secteur Sud',
// ...
];
// Après (données dynamiques)
List<String> _sectors = ['Tous'];
List<String> _members = ['Tous'];
final Map<String, int> _sectorIds = {};
final Map<String, int> _memberIds = {};
Nouvelle méthode de chargement
void _loadData() {
// Charger les secteurs depuis Hive
if (Hive.isBoxOpen(AppKeys.sectorsBoxName)) {
final sectorsBox = Hive.box<SectorModel>(AppKeys.sectorsBoxName);
final sectors = sectorsBox.values.toList();
setState(() {
_sectors = ['Tous'];
_sectorIds.clear();
for (final sector in sectors) {
_sectors.add(sector.libelle);
_sectorIds[sector.libelle] = sector.id;
}
});
}
// Charger les membres depuis Hive
if (Hive.isBoxOpen(AppKeys.membresBoxName)) {
final membresBox = Hive.box<MembreModel>(AppKeys.membresBoxName);
final membres = membresBox.values.toList();
setState(() {
_members = ['Tous'];
_memberIds.clear();
for (final membre in membres) {
final fullName = '${membre.firstName} ${membre.name}'.trim();
_members.add(fullName);
_memberIds[fullName] = membre.id;
}
});
}
}
Méthodes utilitaires mises à jour
// Avant
int? _getUserIdFromName(String name) {
if (name == 'Jean Dupont') return 1;
if (name == 'Marie Martin') return 2;
// ...
}
// Après
int? _getUserIdFromName(String name) {
if (name == 'Tous') return null;
return _memberIds[name];
}
int? _getSectorIdFromName(String name) {
if (name == 'Tous') return null;
return _sectorIds[name];
}
🎯 Bénéfices
- ✅ Données réelles : Les filtres affichent maintenant les vrais secteurs et membres
- ✅ Synchronisation automatique : Les listes se mettent à jour avec les données Hive
- ✅ Filtrage fonctionnel : Possibilité de filtrer par secteur ou membre réel
- ✅ IDs corrects : Les graphiques reçoivent les bons IDs pour filtrer les données
⚠️ Limitations actuelles
Filtre par secteur non supporté dans les graphiques
Les widgets ActivityChart et PassageSummaryCard ne supportent pas encore le paramètre sectorId. J'ai ajouté des commentaires TODO pour indiquer où cette fonctionnalité devrait être ajoutée :
// TODO: Ajouter le support du filtre par secteur dans ActivityChart
// TODO: Ajouter le support du filtre par secteur dans PassageSummaryCard
Pour implémenter complètement le filtrage par secteur, il faudrait :
- Ajouter le paramètre
sectorIdaux widgets de graphiques - Modifier les requêtes de données pour filtrer par secteur
- Joindre les tables passages/secteurs pour le filtrage
🔄 Évolution future
Pour un rechargement automatique complet
Si vous souhaitez que la page se mette à jour automatiquement quand de nouveaux secteurs/membres sont ajoutés :
return ValueListenableBuilder(
valueListenable: Listenable.merge([
Hive.box<SectorModel>(AppKeys.sectorsBoxName).listenable(),
Hive.box<MembreModel>(AppKeys.membresBoxName).listenable(),
]),
builder: (context, _, __) {
_loadData();
return _buildContent();
},
);
Pour le filtrage par secteur
Il faudrait modifier les widgets de graphiques pour :
- Accepter un paramètre
int? sectorId - Filtrer les passages par secteur dans les requêtes
- Afficher uniquement les données du secteur sélectionné
📊 Utilisation
- Sélectionner "Filtrer par" : Choisir entre Secteur ou Membre
- Choisir l'élément : La liste affiche maintenant les vrais secteurs/membres
- Les graphiques se mettent à jour : Actuellement uniquement pour les membres
- "Tous" : Affiche toutes les données sans filtre