fix: Amélioration de l'expérience utilisateur lors de la génération de QR codes
Cette mise à jour améliore la génération de QR codes pour les équipements et les containers en ajoutant un retour visuel à l'utilisateur et une gestion des erreurs plus robuste. **Changements :** - **Ajout d'un indicateur de chargement :** Un `CircularProgressIndicator` est désormais affiché pendant que les données des équipements ou des containers sélectionnés sont récupérées, informant l'utilisateur qu'une opération est en cours. - **Gestion des erreurs :** Un bloc `try...catch` a été ajouté autour de la logique de génération dans les pages de gestion des équipements (`EquipmentManagementPage`) et des containers (`ContainerManagementPage`). - **Affichage des erreurs :** En cas d'échec, le chargement est stoppé et une `SnackBar` rouge apparaît pour notifier l'utilisateur de l'erreur, améliorant ainsi la robustesse de la fonctionnalité.
This commit is contained in:
337
em2rp/SYSTEME_MISE_A_JOUR.md
Normal file
337
em2rp/SYSTEME_MISE_A_JOUR.md
Normal file
@@ -0,0 +1,337 @@
|
||||
# Système de Gestion des Mises à Jour - EM2RP
|
||||
|
||||
## 📋 Vue d'ensemble
|
||||
|
||||
Ce système permet de gérer automatiquement les mises à jour de l'application web Flutter, en notifiant les utilisateurs et en forçant le rechargement du cache si nécessaire.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Architecture
|
||||
|
||||
### Fichiers impliqués
|
||||
|
||||
#### Configuration
|
||||
- **`lib/config/app_version.dart`** : Fichier source de vérité pour la version
|
||||
- **`web/version.json`** : Fichier déployé avec l'app pour vérification côté serveur
|
||||
|
||||
#### Services
|
||||
- **`lib/services/update_service.dart`** : Service de vérification des mises à jour
|
||||
- **`lib/views/widgets/common/update_dialog.dart`** : Widget d'affichage du dialog de mise à jour
|
||||
|
||||
#### Scripts
|
||||
- **`scripts/increment_version.js`** : Incrémente automatiquement la version
|
||||
- **`scripts/update_version_json.js`** : Génère version.json depuis app_version.dart
|
||||
- **`deploy.bat`** : Script de déploiement complet
|
||||
|
||||
#### Documentation
|
||||
- **`CHANGELOG.md`** : Notes de version (utilisées dans le dialog)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Workflow de déploiement
|
||||
|
||||
### 1. Développement normal
|
||||
Travaillez normalement sur votre code en mode développement.
|
||||
|
||||
### 2. Déploiement d'une nouvelle version
|
||||
```bash
|
||||
deploy.bat
|
||||
```
|
||||
|
||||
Ce script exécute automatiquement :
|
||||
1. ✅ Bascule en mode PRODUCTION
|
||||
2. ✅ **Incrémente la version** (0.3.8 → 0.3.9)
|
||||
3. ✅ **Incrémente le buildNumber** (1 → 2)
|
||||
4. ✅ **Génère version.json** depuis app_version.dart
|
||||
5. ✅ Build Flutter Web
|
||||
6. ✅ Déploie sur Firebase Hosting
|
||||
7. ✅ Retour en mode DÉVELOPPEMENT
|
||||
|
||||
### 3. Mise à jour côté utilisateur
|
||||
Au prochain chargement de l'app (ou après 2 secondes) :
|
||||
- L'app vérifie `https://em2rp.web.app/version.json`
|
||||
- Compare avec la version locale dans `app_version.dart`
|
||||
- Si `buildNumber serveur > buildNumber local` → Affiche le dialog
|
||||
|
||||
---
|
||||
|
||||
## 📝 Format de version
|
||||
|
||||
### app_version.dart
|
||||
```dart
|
||||
class AppVersion {
|
||||
static const String version = '0.3.8'; // Version sémantique
|
||||
static const int buildNumber = 1; // Numéro de build (incrémenté automatiquement)
|
||||
|
||||
static String get fullVersion => 'v$version';
|
||||
static String get fullVersionWithBuild => 'v$version+$buildNumber';
|
||||
}
|
||||
```
|
||||
|
||||
### version.json (déployé)
|
||||
```json
|
||||
{
|
||||
"version": "0.3.8",
|
||||
"buildNumber": 1,
|
||||
"updateUrl": "https://em2rp.web.app",
|
||||
"forceUpdate": false,
|
||||
"releaseNotes": "• Scanner QR Code\n• Génération QR conteneurs\n• Performance améliorée"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Comparaison des versions
|
||||
|
||||
Le système compare uniquement le **buildNumber** :
|
||||
- `buildNumber serveur > buildNumber local` → Mise à jour disponible
|
||||
- Ignore les versions identiques même si la version sémantique change
|
||||
|
||||
**Exemple** :
|
||||
- Local : `0.3.8+1`
|
||||
- Serveur : `0.3.9+2`
|
||||
- Résultat : Mise à jour proposée (2 > 1) ✅
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Expérience utilisateur
|
||||
|
||||
### Mise à jour normale (forceUpdate: false)
|
||||
```
|
||||
┌────────────────────────────────────┐
|
||||
│ 🔄 Mise à jour disponible │
|
||||
├────────────────────────────────────┤
|
||||
│ Version actuelle : 0.3.8 (1) │
|
||||
│ Nouvelle version : 0.3.9 (2) │
|
||||
│ │
|
||||
│ Nouveautés : │
|
||||
│ • Scanner QR Code │
|
||||
│ • Performance améliorée │
|
||||
│ │
|
||||
│ [Plus tard] [Mettre à jour] 🔄 │
|
||||
└────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Mise à jour forcée (forceUpdate: true)
|
||||
```
|
||||
┌────────────────────────────────────┐
|
||||
│ ⚠️ Mise à jour requise │
|
||||
├────────────────────────────────────┤
|
||||
│ Version actuelle : 0.3.8 (1) │
|
||||
│ Nouvelle version : 0.3.9 (2) │
|
||||
│ │
|
||||
│ ⚠️ Cette mise à jour est │
|
||||
│ obligatoire pour continuer │
|
||||
│ │
|
||||
│ [Mettre à jour] 🔄 │
|
||||
└────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Utilisation avancée
|
||||
|
||||
### Forcer une mise à jour critique
|
||||
Si vous déployez un correctif critique :
|
||||
|
||||
1. Modifiez `web/version.json` **après le déploiement** :
|
||||
```json
|
||||
{
|
||||
"version": "0.3.9",
|
||||
"buildNumber": 2,
|
||||
"forceUpdate": true, // ← Changer à true
|
||||
"releaseNotes": "🔴 Correctif de sécurité important"
|
||||
}
|
||||
```
|
||||
|
||||
2. Les utilisateurs ne pourront plus fermer le dialog jusqu'à la mise à jour
|
||||
|
||||
### Personnaliser les notes de version
|
||||
Éditez `CHANGELOG.md` avant le déploiement :
|
||||
|
||||
```markdown
|
||||
## [0.3.9] - 2026-01-16
|
||||
|
||||
### Ajouté
|
||||
- Scanner QR Code pour équipements
|
||||
- Génération QR pour conteneurs
|
||||
|
||||
### Amélioré
|
||||
- Performance du dialog de sélection
|
||||
- Gestion du cache
|
||||
|
||||
### Corrigé
|
||||
- Bug de cache des équipements
|
||||
```
|
||||
|
||||
Les 5 premières lignes de la section seront utilisées dans le dialog.
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Tests
|
||||
|
||||
### Test 1 : Vérification de version locale
|
||||
```dart
|
||||
// Dans n'importe quel fichier
|
||||
import 'package:em2rp/config/app_version.dart';
|
||||
|
||||
print('Version: ${AppVersion.version}');
|
||||
print('Build: ${AppVersion.buildNumber}');
|
||||
print('Full: ${AppVersion.fullVersionWithBuild}');
|
||||
```
|
||||
|
||||
### Test 2 : Forcer l'affichage du dialog
|
||||
Modifiez temporairement `web/version.json` :
|
||||
```json
|
||||
{
|
||||
"buildNumber": 999 // Très grand nombre
|
||||
}
|
||||
```
|
||||
|
||||
Rechargez l'app → Le dialog s'affiche immédiatement
|
||||
|
||||
### Test 3 : Tester le rechargement
|
||||
1. Cliquez sur "Mettre à jour"
|
||||
2. Vérifiez que la page se recharge
|
||||
3. Vérifiez que le cache est vidé (nouvelles ressources chargées)
|
||||
|
||||
---
|
||||
|
||||
## 📊 Logs de debug
|
||||
|
||||
En mode debug, des logs sont affichés dans la console :
|
||||
|
||||
```
|
||||
[UpdateService] Current version: 0.3.8+1
|
||||
[UpdateService] Server version: 0.3.9+2
|
||||
```
|
||||
|
||||
Si pas de mise à jour disponible, rien ne s'affiche.
|
||||
|
||||
---
|
||||
|
||||
## 🔐 Sécurité
|
||||
|
||||
### Headers HTTP pour forcer le non-cache
|
||||
Le fichier `web/index.html` contient :
|
||||
```html
|
||||
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
|
||||
<meta http-equiv="Pragma" content="no-cache">
|
||||
<meta http-equiv="Expires" content="0">
|
||||
```
|
||||
|
||||
### Cache-busting sur version.json
|
||||
Chaque requête ajoute un timestamp :
|
||||
```dart
|
||||
final timestamp = DateTime.now().millisecondsSinceEpoch;
|
||||
Uri.parse('$versionUrl?t=$timestamp')
|
||||
```
|
||||
|
||||
Garantit que la version la plus récente est toujours récupérée.
|
||||
|
||||
---
|
||||
|
||||
## 🚨 Résolution de problèmes
|
||||
|
||||
### Problème : Le dialog ne s'affiche pas
|
||||
**Causes possibles :**
|
||||
1. Le `buildNumber` serveur n'est pas supérieur au local
|
||||
2. Erreur réseau (timeout 10s)
|
||||
3. Le fichier `version.json` n'existe pas sur le serveur
|
||||
|
||||
**Solution :**
|
||||
```bash
|
||||
# Vérifier la version déployée
|
||||
curl https://em2rp.web.app/version.json
|
||||
|
||||
# Forcer un nouveau déploiement
|
||||
deploy.bat
|
||||
```
|
||||
|
||||
### Problème : Le cache ne se vide pas
|
||||
**Causes possibles :**
|
||||
1. Service Worker actif (ancienne version)
|
||||
2. Cache navigateur très persistant
|
||||
|
||||
**Solution :**
|
||||
```javascript
|
||||
// Dans les DevTools du navigateur
|
||||
navigator.serviceWorker.getRegistrations().then(registrations => {
|
||||
registrations.forEach(r => r.unregister());
|
||||
});
|
||||
|
||||
// Puis CTRL+SHIFT+R (rechargement forcé)
|
||||
```
|
||||
|
||||
### Problème : Le script increment_version.js échoue
|
||||
**Solution :**
|
||||
```bash
|
||||
# Vérifier la syntaxe du fichier app_version.dart
|
||||
# Doit contenir exactement :
|
||||
static const String version = '0.3.8';
|
||||
static const int buildNumber = 1;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 Évolution future
|
||||
|
||||
### Fonctionnalités possibles
|
||||
- [ ] Afficher un changelog complet dans le dialog
|
||||
- [ ] Permettre de sauter une version (skip this version)
|
||||
- [ ] Notifications push pour les mises à jour critiques
|
||||
- [ ] Analytics sur le taux d'adoption des mises à jour
|
||||
- [ ] Support des mises à jour en arrière-plan
|
||||
|
||||
### Améliorations techniques
|
||||
- [ ] Utiliser un CDN pour version.json
|
||||
- [ ] Implémenter un rollback automatique si erreur
|
||||
- [ ] Ajouter une vérification de santé post-déploiement
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Commandes rapides
|
||||
|
||||
```bash
|
||||
# Déployer une nouvelle version
|
||||
deploy.bat
|
||||
|
||||
# Incrémenter manuellement la version
|
||||
node scripts\increment_version.js
|
||||
|
||||
# Générer version.json manuellement
|
||||
node scripts\update_version_json.js
|
||||
|
||||
# Vérifier la version actuelle
|
||||
type lib\config\app_version.dart
|
||||
|
||||
# Vérifier la version déployée
|
||||
curl https://em2rp.web.app/version.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ Checklist de déploiement
|
||||
|
||||
Avant chaque déploiement :
|
||||
|
||||
- [ ] Tester l'application en local
|
||||
- [ ] Mettre à jour `CHANGELOG.md` avec les nouveautés
|
||||
- [ ] Vérifier que tous les tests passent
|
||||
- [ ] Exécuter `deploy.bat`
|
||||
- [ ] Vérifier le déploiement sur https://em2rp.web.app
|
||||
- [ ] Tester la mise à jour sur un navigateur propre
|
||||
- [ ] Informer l'équipe de la nouvelle version
|
||||
|
||||
---
|
||||
|
||||
## 📞 Support
|
||||
|
||||
En cas de problème avec le système de mise à jour, vérifier :
|
||||
1. Les logs dans la console du navigateur
|
||||
2. Le fichier `version.json` déployé
|
||||
3. Le fichier `app_version.dart` local
|
||||
4. La connexion réseau de l'utilisateur
|
||||
|
||||
**Le système est conçu pour échouer silencieusement** : Si une erreur se produit, l'utilisateur peut continuer à utiliser l'app normalement sans être bloqué.
|
||||
|
||||
Reference in New Issue
Block a user