feat: synchronisation mode deconnecte fin chat et stats
This commit is contained in:
164
app/docs/STATISTICS-REAL-DATA.md
Normal file
164
app/docs/STATISTICS-REAL-DATA.md
Normal file
@@ -0,0 +1,164 @@
|
||||
# 📊 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
|
||||
Reference in New Issue
Block a user