Replace window.confirm() with Modal dialogs for class deletion and grade
reset. Add unsaved-changes guards to AssessmentFormView. Warn before
deleting exercises/elements with existing grades. Surface invalid grades
in a detailed Modal after save. Replace GradingView local toasts with
global notification store. Fix missing French accents across CouncilView,
CouncilStudentDetail, and ConfigView. Make dashboard "À corriger" card
and student list rows clickable. Add visual hierarchy to assessment
detail actions. Add loading overlay to trimester switch. Simplify email
sending workflow by removing mode-switch pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Backend: create api/helpers.py with eligible_enrollment_filter,
count_eligible_students, get_active_enrollment, ensure_unique_name,
upsert_app_configs, and build_heatmap. Add full_name properties to
Student model. Apply across all route files (-481/+184 lines).
Frontend: create stores/helpers.js with withLoading composable,
apply to assessments and classes Pinia stores.
96/96 tests pass.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
✨ Fichiers Docker ajoutés:
- backend/Dockerfile: Image Python 3.11 avec uv et FastAPI
- frontend/Dockerfile: Build multi-stage avec Nginx
- docker-compose.yml: Orchestration complète des services
- frontend/nginx.conf: Configuration Nginx avec proxy API
📝 Documentation:
- DOCKER.md: Guide complet de déploiement Docker (monitoring, backup, prod)
- README.md: Section Docker ajoutée
- .env.docker: Template mis à jour pour v2
🔧 Configuration:
- .dockerignore pour backend et frontend
- Volume data/ pour la base de données
- Healthchecks pour les deux services
- Réseau bridge dédié
🚀 Démarrage simplifié:
cp .env.docker .env
docker-compose up -d
Accès: http://localhost (frontend) + http://localhost:8000 (API)