feat(exécution): refonte des chronos de séance et carte exercice actif (ticket #90)
Réorganise l'écran d'exécution autour d'une carte "Exercice actif" sous le compteur SÉRIE X/Y (nom, médias, temps de série, action "Démarrer l'exercice"). Le timer de série devient un état persistant dédié (plus un DateTime UI volatile), pause-aware, et "Démarrer l'exercice" lance en une action tous les chronos qui doivent démarrer en début de série (série, première étape temps, score chrono si stopwatch). Implémentation restée non commitée depuis sa réalisation ; QA a validé les vérifications statiques exécutables en sandbox (dart analyze, git diff --check). flutter analyze / flutter test restent à relancer dans un environnement avec cache Flutter SDK accessible. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -513,11 +513,40 @@ class ActiveScoreStopwatchStates extends SyncableTable {
|
||||
'CHECK (program_index >= 0)',
|
||||
'CHECK (exercise_index >= 0)',
|
||||
'CHECK (set_index >= 0)',
|
||||
"CHECK (status IN ('running', 'stopped'))",
|
||||
"CHECK (status IN ('running', 'paused', 'stopped'))",
|
||||
'CHECK (accumulated_ms >= 0)',
|
||||
];
|
||||
}
|
||||
|
||||
class ActiveSetTimerStates extends SyncableTable {
|
||||
@override
|
||||
String get tableName => 'active_set_timer_states';
|
||||
|
||||
TextColumn get activeWorkoutSessionId =>
|
||||
text().references(ActiveWorkoutSessions, #id)();
|
||||
IntColumn get programIndex => integer()();
|
||||
IntColumn get exerciseIndex => integer()();
|
||||
IntColumn get setIndex => integer()();
|
||||
TextColumn get status => text()();
|
||||
DateTimeColumn get startedAt => dateTime().nullable()();
|
||||
IntColumn get accumulatedMs => integer()();
|
||||
DateTimeColumn get stoppedAt => dateTime().nullable()();
|
||||
DateTimeColumn get skippedAt => dateTime().nullable()();
|
||||
|
||||
@override
|
||||
List<String> get customConstraints => [
|
||||
'UNIQUE (active_workout_session_id, program_index, exercise_index, '
|
||||
'set_index)',
|
||||
'CHECK (program_index >= 0)',
|
||||
'CHECK (exercise_index >= 0)',
|
||||
'CHECK (set_index >= 0)',
|
||||
"CHECK (status IN ('running', 'paused', 'stopped', 'skipped'))",
|
||||
'CHECK (status != \'running\' OR started_at IS NOT NULL)',
|
||||
'CHECK (accumulated_ms >= 0)',
|
||||
'CHECK (stopped_at IS NULL OR skipped_at IS NULL)',
|
||||
];
|
||||
}
|
||||
|
||||
class ActiveRestStates extends SyncableTable {
|
||||
@override
|
||||
String get tableName => 'active_rest_states';
|
||||
@ -532,6 +561,9 @@ class ActiveRestStates extends SyncableTable {
|
||||
DateTimeColumn get startedAt => dateTime()();
|
||||
DateTimeColumn get endedAt => dateTime().nullable()();
|
||||
DateTimeColumn get skippedAt => dateTime().nullable()();
|
||||
DateTimeColumn get pausedAt => dateTime().nullable()();
|
||||
IntColumn get accumulatedPausedMs =>
|
||||
integer().withDefault(const Constant(0))();
|
||||
|
||||
@override
|
||||
List<String> get customConstraints => [
|
||||
@ -540,6 +572,7 @@ class ActiveRestStates extends SyncableTable {
|
||||
'CHECK (after_set_index >= 0)',
|
||||
'CHECK (planned_rest_seconds >= 0)',
|
||||
'CHECK (adjusted_rest_seconds >= 0)',
|
||||
'CHECK (accumulated_paused_ms >= 0)',
|
||||
'CHECK (ended_at IS NULL OR skipped_at IS NULL)',
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user