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

@ -16,6 +16,7 @@ final class HistoryListScreen extends StatefulWidget {
this.mediaUseCases,
this.stepUseCases,
this.performanceReferenceUseCase,
this.onOpenProgression,
super.key,
});
@ -26,6 +27,7 @@ final class HistoryListScreen extends StatefulWidget {
final ExercisePerformanceReferenceUseCase? performanceReferenceUseCase;
final CloseWorkoutSessionUseCase closeUseCase;
final MediaUseCases? mediaUseCases;
final VoidCallback? onOpenProgression;
@override
State<HistoryListScreen> createState() => _HistoryListScreenState();
@ -43,7 +45,16 @@ final class _HistoryListScreenState extends State<HistoryListScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Historique')),
appBar: AppBar(
title: const Text('Historique'),
actions: [
if (widget.onOpenProgression != null)
TextButton(
onPressed: widget.onOpenProgression,
child: const Text('Progression'),
),
],
),
body: FutureBuilder<List<WorkoutHistory>>(
future: _histories,
builder: (context, snapshot) {

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(

View File

@ -5,6 +5,7 @@ export 'exercise_library_screen.dart';
export 'history_screen.dart';
export 'home_screen.dart';
export 'profile_screen.dart';
export 'progression_screen.dart';
export 'program_screen.dart';
export 'share_inbox_screen.dart';
export 'share_screen.dart';

File diff suppressed because it is too large Load Diff