feat(statistiques): implémentation frontend statistiques de progression (ticket #82)

Lots F1+F2 : écran progression_screen.dart, intégration home/history/navigation, tests associés (193 tests suite complète, 4 échecs préexistants sans rapport confirmés).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 08:58:16 +02:00
parent a8baa3169c
commit 3b7d904953
7 changed files with 1745 additions and 1 deletions

View File

@ -5,6 +5,7 @@ import '../domain/domain.dart';
import 'exercise_library_screen.dart';
import 'history_screen.dart';
import 'profile_screen.dart';
import 'progression_screen.dart';
import 'program_screen.dart';
import 'theme.dart';
import 'workout_execution_screen.dart';
@ -185,10 +186,20 @@ final class _HomeScreenState extends State<HomeScreen> with RouteAware {
widget.bootstrap.exercisePerformanceReferenceUseCase,
closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase,
mediaUseCases: widget.bootstrap.mediaUseCases,
onOpenProgression: () => _openProgression(context),
),
),
),
),
ListTile(
leading: const Icon(Icons.show_chart),
title: const Text('Progression'),
subtitle: const Text(
'Volume, régularité et évolution par exercice',
),
trailing: const Icon(Icons.chevron_right),
onTap: () => _openProgression(context),
),
ListTile(
leading: FutureBuilder<UserAccountSession?>(
future: widget.bootstrap.authUseCases.currentSession(),
@ -225,6 +236,24 @@ final class _HomeScreenState extends State<HomeScreen> with RouteAware {
);
}
Future<void> _openProgression(BuildContext context) {
return Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ProgressionScreen(
progressionStatsUseCase: widget.bootstrap.progressionStatsUseCase,
historyUseCases: widget.bootstrap.workoutHistoryUseCases,
workoutTemplateUseCases: widget.bootstrap.workoutTemplateUseCases,
activeUseCases: widget.bootstrap.activeWorkoutSessionUseCases,
stepUseCases: widget.bootstrap.activeExerciseStepUseCases,
performanceReferenceUseCase:
widget.bootstrap.exercisePerformanceReferenceUseCase,
closeUseCase: widget.bootstrap.closeWorkoutSessionUseCase,
mediaUseCases: widget.bootstrap.mediaUseCases,
),
),
);
}
Future<void> _resume(ActiveWorkoutSession session) async {
await Navigator.of(context).push(
MaterialPageRoute(