Autorise un score par défaut à 0 (#44) et corrige l'affichage des répétitions à 0 pendant l'exécution au lieu de la vraie cible (#45), sur exercise_library_screen.dart et workout_execution_screen.dart, avec les ajustements domain/use cases associés. flutter analyze propre (mêmes 8 infos préexistantes), 79/79 tests verts, build APK debug validé. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -1646,8 +1646,8 @@ void _validateExerciseDefaultTargets({
|
||||
}
|
||||
if (hasScoreMeasure &&
|
||||
scoreInputMode == ScoreInputMode.manual &&
|
||||
(defaultTargetScore == null || defaultTargetScore <= 0)) {
|
||||
throw const DomainException('Default target score must be positive.');
|
||||
(defaultTargetScore == null || defaultTargetScore < 0)) {
|
||||
throw const DomainException('Default target score must not be negative.');
|
||||
}
|
||||
if (defaultTargetScore != null &&
|
||||
(!hasScoreMeasure || scoreInputMode != ScoreInputMode.manual)) {
|
||||
|
||||
@ -167,7 +167,10 @@ final class Exercise {
|
||||
'Default target time seconds',
|
||||
);
|
||||
_requireNullablePositive(defaultTargetReps, 'Default target reps');
|
||||
_requireNullablePositiveDouble(defaultTargetScore, 'Default target score');
|
||||
_requireNullableNonNegativeDouble(
|
||||
defaultTargetScore,
|
||||
'Default target score',
|
||||
);
|
||||
_requireNullablePositive(
|
||||
defaultTargetScoreTimeMs,
|
||||
'Default target score time ms',
|
||||
@ -1035,12 +1038,6 @@ void _requireNullableNonNegativeDouble(double? value, String label) {
|
||||
}
|
||||
}
|
||||
|
||||
void _requireNullablePositiveDouble(double? value, String label) {
|
||||
if (value != null && value <= 0) {
|
||||
throw DomainException('$label must be positive.');
|
||||
}
|
||||
}
|
||||
|
||||
void _requireScoreTargetShape({
|
||||
required bool scoreEnabled,
|
||||
required ScoreInputMode scoreInputMode,
|
||||
|
||||
@ -635,9 +635,9 @@ final class _ExerciseFormScreenState extends State<ExerciseFormScreen> {
|
||||
_scoreInputMode != ScoreInputMode.manual) {
|
||||
return null;
|
||||
}
|
||||
return _positiveDoubleValidator(
|
||||
return _nonNegativeDoubleValidator(
|
||||
value,
|
||||
'Saisis un score supérieur à 0.',
|
||||
'Saisis un score positif ou nul.',
|
||||
);
|
||||
},
|
||||
),
|
||||
@ -914,6 +914,14 @@ final class _ExerciseFormScreenState extends State<ExerciseFormScreen> {
|
||||
return null;
|
||||
}
|
||||
|
||||
String? _nonNegativeDoubleValidator(String? value, String message) {
|
||||
final number = double.tryParse(value?.trim() ?? '');
|
||||
if (number == null || number < 0) {
|
||||
return message;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
String _optionalIntText(int? value) {
|
||||
return value == null ? '' : '$value';
|
||||
}
|
||||
|
||||
@ -72,6 +72,7 @@ final class _WorkoutExecutionScreenState extends State<WorkoutExecutionScreen> {
|
||||
_mode = _session.status == ActiveWorkoutStatus.running
|
||||
? WorkoutExecutionMode.active
|
||||
: WorkoutExecutionMode.paused;
|
||||
_reps = _initialRepsFor(_exercise);
|
||||
_seriesStartedAt = DateTime.now().toUtc();
|
||||
_ticker = Timer.periodic(const Duration(seconds: 1), (_) {
|
||||
if (mounted) setState(() {});
|
||||
@ -808,7 +809,7 @@ final class _WorkoutExecutionScreenState extends State<WorkoutExecutionScreen> {
|
||||
|
||||
Future<void> _moveTo(ExecutionPosition position) async {
|
||||
_scoreController.clear();
|
||||
_reps = 0;
|
||||
_reps = _initialRepsFor(_plan.exerciseAt(position));
|
||||
_activeRestStateId = null;
|
||||
_scoreStopwatch = null;
|
||||
_manualScoreTimeMs = null;
|
||||
@ -889,6 +890,11 @@ final class _WorkoutExecutionScreenState extends State<WorkoutExecutionScreen> {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
int _initialRepsFor(ExecutionExercise exercise) {
|
||||
if (!exercise.repsEnabled) return 0;
|
||||
return exercise.targetReps ?? 0;
|
||||
}
|
||||
}
|
||||
|
||||
final class SetMeasureInput extends StatelessWidget {
|
||||
|
||||
Reference in New Issue
Block a user