164 lines
5.2 KiB
Markdown
164 lines
5.2 KiB
Markdown
# 📊 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** : `_sectorIds` et `_memberIds`
|
|
- **Association nom ↔ ID** : Pour retrouver l'ID à partir du nom sélectionné
|
|
- **Gestion du "Tous"** : Retourne `null` pour afficher toutes les données
|
|
|
|
### 3. 📝 Corrections apportées
|
|
- **SectorModel** : Utilisation du champ `libelle` (pas `name`)
|
|
- **MembreModel** : Concaténation `firstName + name` pour 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
|
|
```dart
|
|
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
|
|
```dart
|
|
// 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
|
|
```dart
|
|
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
|
|
```dart
|
|
// 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 :
|
|
|
|
```dart
|
|
// 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 :
|
|
1. Ajouter le paramètre `sectorId` aux widgets de graphiques
|
|
2. Modifier les requêtes de données pour filtrer par secteur
|
|
3. 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 :
|
|
|
|
```dart
|
|
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 :
|
|
1. Accepter un paramètre `int? sectorId`
|
|
2. Filtrer les passages par secteur dans les requêtes
|
|
3. Afficher uniquement les données du secteur sélectionné
|
|
|
|
## 📊 Utilisation
|
|
|
|
1. **Sélectionner "Filtrer par"** : Choisir entre Secteur ou Membre
|
|
2. **Choisir l'élément** : La liste affiche maintenant les vrais secteurs/membres
|
|
3. **Les graphiques se mettent à jour** : Actuellement uniquement pour les membres
|
|
4. **"Tous"** : Affiche toutes les données sans filtre |