feat(train): a workout keeps its plan's steps as laps, shown on its page (ADR 0030, D43)

As a recording with a plan is saved, each step run becomes a lap in the
workout's sealed payload: the step, its round, when it started and ended,
its moving time and distance, with the highest heart rate the zones ran
with. The page lists the steps with their pace, speed or split, stroke
rate, watts and heart rate, marks whether each held its target, and the
charts shade the work steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-28 23:12:34 +01:00
commit e1304975d6
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
5 changed files with 840 additions and 38 deletions

View file

@ -83,6 +83,9 @@
"workoutClimb": "Aufstieg",
"workoutClimbValue": "{metres} m",
"workoutSplits": "Abschnitte",
"workoutSteps": "Schritte aus {plan}",
"workoutOnTarget": "Im Ziel",
"workoutOffTarget": "Neben dem Ziel",
"workoutSplitKm": "km {number}",
"workoutSplitFiveKm": "{from}–{to} km",
"workoutPaceChart": "Tempo",

View file

@ -103,6 +103,10 @@
"workoutClimbValue": "{metres} m",
"@workoutClimbValue": {"placeholders": {"metres": {"type": "int"}}},
"workoutSplits": "Splits",
"workoutSteps": "Steps of {plan}",
"@workoutSteps": {"placeholders": {"plan": {"type": "String"}}},
"workoutOnTarget": "On target",
"workoutOffTarget": "Off target",
"workoutSplitKm": "km {number}",
"@workoutSplitKm": {"description": "A kilometre's split, its number.", "placeholders": {"number": {"type": "int"}}},
"workoutSplitFiveKm": "{from}–{to} km",

View file

@ -556,6 +556,24 @@ abstract class AppLocalizations {
/// **'Splits'**
String get workoutSplits;
/// No description provided for @workoutSteps.
///
/// In en, this message translates to:
/// **'Steps of {plan}'**
String workoutSteps(String plan);
/// No description provided for @workoutOnTarget.
///
/// In en, this message translates to:
/// **'On target'**
String get workoutOnTarget;
/// No description provided for @workoutOffTarget.
///
/// In en, this message translates to:
/// **'Off target'**
String get workoutOffTarget;
/// A kilometre's split, its number.
///
/// In en, this message translates to:

View file

@ -294,6 +294,17 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get workoutSplits => 'Abschnitte';
@override
String workoutSteps(String plan) {
return 'Schritte aus $plan';
}
@override
String get workoutOnTarget => 'Im Ziel';
@override
String get workoutOffTarget => 'Neben dem Ziel';
@override
String workoutSplitKm(int number) {
return 'km $number';

View file

@ -292,6 +292,17 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get workoutSplits => 'Splits';
@override
String workoutSteps(String plan) {
return 'Steps of $plan';
}
@override
String get workoutOnTarget => 'On target';
@override
String get workoutOffTarget => 'Off target';
@override
String workoutSplitKm(int number) {
return 'km $number';