merge(develop): integre lot UI WIP sans validation QA, sur demande explicite (#176 #177)

This commit is contained in:
2026-07-29 12:41:59 +02:00
15 changed files with 136 additions and 97 deletions

View File

@ -1,8 +1,8 @@
--- ---
issueRef: "#157" issueRef: "#157"
version: 7 version: 8
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1785256180427 updatedAt: 1785321673274
--- ---
## Cadrage UX — agent UX (2026-07-28) ## Cadrage UX — agent UX (2026-07-28)

View File

@ -2,15 +2,15 @@
id: "4ba5c5bc-c575-4afc-bb55-93feb7e7ad9c" id: "4ba5c5bc-c575-4afc-bb55-93feb7e7ad9c"
number: 157 number: 157
title: "[DevFrontend] Distance live montre sur séance en cours" title: "[DevFrontend] Distance live montre sur séance en cours"
status: "open" status: "qa"
priority: "medium" priority: "medium"
sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea" sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea"
links: [{"target":"#142","kind":"blocks"},{"target":"#106","kind":"relatesTo"},{"target":"#145","kind":"dependsOn"}] links: [{"target":"#142","kind":"blocks"},{"target":"#106","kind":"relatesTo"},{"target":"#145","kind":"dependsOn"}]
agentRefs: [] agentRefs: []
createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1785180656723 createdAt: 1785180656723
updatedAt: 1785256180427 updatedAt: 1785321673274
version: 7 version: 8
--- ---
Ajouter la distance parcourue live remontée par la montre compatible, avec affichage léger côté téléphone pendant la séance et réutilisation côté montre dans le panneau secondaire. Dégradation silencieuse si donnée indisponible. Ajouter la distance parcourue live remontée par la montre compatible, avec affichage léger côté téléphone pendant la séance et réutilisation côté montre dans le panneau secondaire. Dégradation silencieuse si donnée indisponible.

View File

@ -1,8 +1,8 @@
--- ---
issueRef: "#164" issueRef: "#164"
version: 9 version: 10
updatedBy: {"kind":"user"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1785318038269 updatedAt: 1785321673362
--- ---
## #164 — Cadrage UX (2026-07-28) ## #164 — Cadrage UX (2026-07-28)

View File

@ -2,15 +2,15 @@
id: "879caaa3-2658-4ad8-bfa0-a7444cffc1b0" id: "879caaa3-2658-4ad8-bfa0-a7444cffc1b0"
number: 164 number: 164
title: "[Bug] Plus de son en fin de chrono" title: "[Bug] Plus de son en fin de chrono"
status: "open" status: "qa"
priority: "medium" priority: "medium"
sprint: "abc4f969-b169-45f7-988c-daeeab762201" sprint: "abc4f969-b169-45f7-988c-daeeab762201"
links: [] links: []
agentRefs: [] agentRefs: []
createdBy: {"kind":"user"} createdBy: {"kind":"user"}
updatedBy: {"kind":"user"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1785243194849 createdAt: 1785243194849
updatedAt: 1785318038269 updatedAt: 1785321673362
version: 9 version: 10
--- ---
Il n'y a plus de bips en fin de chrono. Sur les 3 derniere seconde il doit y avoir un big court et un bip plus long à 0. J'aiemrais que la montre vibre quand le chrono arrive à 0 Il n'y a plus de bips en fin de chrono. Sur les 3 derniere seconde il doit y avoir un big court et un bip plus long à 0. J'aiemrais que la montre vibre quand le chrono arrive à 0

View File

@ -1,8 +1,8 @@
--- ---
issueRef: "#174" issueRef: "#174"
version: 3 version: 4
updatedBy: {"kind":"user"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1785318038485 updatedAt: 1785321673382
--- ---
## #174 — Cadrage Main (2026-07-28) ## #174 — Cadrage Main (2026-07-28)

View File

@ -2,15 +2,15 @@
id: "f2db430b-48cf-4626-beae-611ffb352043" id: "f2db430b-48cf-4626-beae-611ffb352043"
number: 174 number: 174
title: "[Bug] La montre quitte l'application ou revient à l'accueil pendant une séance/au lancement d'un chrono" title: "[Bug] La montre quitte l'application ou revient à l'accueil pendant une séance/au lancement d'un chrono"
status: "open" status: "qa"
priority: "high" priority: "high"
sprint: "abc4f969-b169-45f7-988c-daeeab762201" sprint: "abc4f969-b169-45f7-988c-daeeab762201"
links: [{"target":"#127","kind":"relatesTo"},{"target":"#165","kind":"relatesTo"}] links: [{"target":"#127","kind":"relatesTo"},{"target":"#165","kind":"relatesTo"}]
agentRefs: [] agentRefs: []
createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedBy: {"kind":"user"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1785257860730 createdAt: 1785257860730
updatedAt: 1785318038485 updatedAt: 1785321673382
version: 3 version: 4
--- ---
Corriger le cas où, pendant une séance, le lancement d'un chrono ou certains changements d'état renvoient la montre vers l'écran d'accueil système au lieu de rester sur l'application GameTime. Le comportement attendu est que la montre reste ancrée sur la séance active tant qu'une séance est en cours. Corriger le cas où, pendant une séance, le lancement d'un chrono ou certains changements d'état renvoient la montre vers l'écran d'accueil système au lieu de rester sur l'application GameTime. Le comportement attendu est que la montre reste ancrée sur la séance active tant qu'une séance est en cours.

View File

@ -1,8 +1,8 @@
--- ---
issueRef: "#176" issueRef: "#176"
version: 4 version: 5
updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1785318771867 updatedAt: 1785321673401
--- ---
## #176 — Cadrage UX (2026-07-29) ## #176 — Cadrage UX (2026-07-29)

View File

@ -2,15 +2,15 @@
id: "3da05d4c-9a2c-4371-95d2-7a00a157bccc" id: "3da05d4c-9a2c-4371-95d2-7a00a157bccc"
number: 176 number: 176
title: "[UI] Mauvais scaling chrono seul d'une etape" title: "[UI] Mauvais scaling chrono seul d'une etape"
status: "open" status: "qa"
priority: "medium" priority: "medium"
sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea" sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea"
links: [] links: []
agentRefs: [] agentRefs: []
createdBy: {"kind":"user"} createdBy: {"kind":"user"}
updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1785318071566 createdAt: 1785318071566
updatedAt: 1785318771867 updatedAt: 1785321673401
version: 4 version: 5
--- ---
Lorsqu'une étape ne possède qu'un chrono seul, le chrono garde une taille assez petite. Il garde la meme taille que quand il y a le bouton "Commencer" en dessous de lui et même avec ce bouton, il ne prend pas toute la place qu'il pourrait. Je pense qu'il faudrait agrandire le chrono de façon a ce que le chrono + le bouton commencer prenne la place disponible, et une fois qu'on clique sur le bouton commencer, et que le bouton disparait, il faudrait que le chrono s'agrandisse pour prendre la place disponible Lorsqu'une étape ne possède qu'un chrono seul, le chrono garde une taille assez petite. Il garde la meme taille que quand il y a le bouton "Commencer" en dessous de lui et même avec ce bouton, il ne prend pas toute la place qu'il pourrait. Je pense qu'il faudrait agrandire le chrono de façon a ce que le chrono + le bouton commencer prenne la place disponible, et une fois qu'on clique sur le bouton commencer, et que le bouton disparait, il faudrait que le chrono s'agrandisse pour prendre la place disponible

View File

@ -1,8 +1,8 @@
--- ---
issueRef: "#177" issueRef: "#177"
version: 4 version: 5
updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1785318789682 updatedAt: 1785321673419
--- ---
## #177 — Cadrage UX (2026-07-29) ## #177 — Cadrage UX (2026-07-29)

View File

@ -2,15 +2,15 @@
id: "9f2dcd00-5b90-41ad-9215-9c2fa405048c" id: "9f2dcd00-5b90-41ad-9215-9c2fa405048c"
number: 177 number: 177
title: "[UI] Boutons lors d'une étape avec uniquement un nombre de répétition a revoir" title: "[UI] Boutons lors d'une étape avec uniquement un nombre de répétition a revoir"
status: "open" status: "closed"
priority: "medium" priority: "medium"
sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea" sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea"
links: [] links: []
agentRefs: [] agentRefs: []
createdBy: {"kind":"user"} createdBy: {"kind":"user"}
updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1785318287363 createdAt: 1785318287363
updatedAt: 1785318789682 updatedAt: 1785321673419
version: 4 version: 5
--- ---
Quand on a une étape avec uniquement un nombre de répétitions, on a 3 boutons au total qui s'affiche en dessous du nombre de répétitions à faire qui sont, de gauche a droite, "Passer l'étape", trois petit point de menu, "Etape Suivante". Ca rend très mal. J'aimerais que UX voit ce qu'il peut faire sachant qu'il faut garder de la place et de la cohérence avec les autres cas ou il y aurait plus d'informations à afficher Quand on a une étape avec uniquement un nombre de répétitions, on a 3 boutons au total qui s'affiche en dessous du nombre de répétitions à faire qui sont, de gauche a droite, "Passer l'étape", trois petit point de menu, "Etape Suivante". Ca rend très mal. J'aimerais que UX voit ce qu'il peut faire sachant qu'il faut garder de la place et de la cohérence avec les autres cas ou il y aurait plus d'informations à afficher

View File

@ -1,6 +1,6 @@
--- ---
issueRef: "#178" issueRef: "#178"
version: 3 version: 4
updatedBy: {"kind":"user"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
updatedAt: 1785318628907 updatedAt: 1785321673439
--- ---

View File

@ -2,15 +2,15 @@
id: "86c6a104-f509-4fd9-91f0-0898c3d2414a" id: "86c6a104-f509-4fd9-91f0-0898c3d2414a"
number: 178 number: 178
title: "[Bug] les boutons actions ne sont pas toujours fonctionnels" title: "[Bug] les boutons actions ne sont pas toujours fonctionnels"
status: "open" status: "qa"
priority: "medium" priority: "medium"
sprint: "abc4f969-b169-45f7-988c-daeeab762201" sprint: "abc4f969-b169-45f7-988c-daeeab762201"
links: [] links: []
agentRefs: [] agentRefs: []
createdBy: {"kind":"user"} createdBy: {"kind":"user"}
updatedBy: {"kind":"user"} updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
createdAt: 1785318553666 createdAt: 1785318553666
updatedAt: 1785318628907 updatedAt: 1785321673439
version: 3 version: 4
--- ---
Il y a encore pas mal de cas ou les boutons actions pour passer les series ou passer les repos ou les etapes qui ne fonctionnent pas sur la montre Il y a encore pas mal de cas ou les boutons actions pour passer les series ou passer les repos ou les etapes qui ne fonctionnent pas sur la montre

View File

@ -2215,7 +2215,7 @@
"issueRef": "#157", "issueRef": "#157",
"path": "157", "path": "157",
"title": "[DevFrontend] Distance live montre sur séance en cours", "title": "[DevFrontend] Distance live montre sur séance en cours",
"status": "open", "status": "qa",
"priority": "medium", "priority": "medium",
"sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea", "sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea",
"assignedAgentIds": [], "assignedAgentIds": [],
@ -2223,7 +2223,7 @@
"kind": "agent", "kind": "agent",
"agent_id": "57695b92-24d0-4876-837c-76116e70a6ae" "agent_id": "57695b92-24d0-4876-837c-76116e70a6ae"
}, },
"updatedAt": 1785256180427 "updatedAt": 1785321673274
}, },
{ {
"issueRef": "#158", "issueRef": "#158",
@ -2316,14 +2316,14 @@
"issueRef": "#164", "issueRef": "#164",
"path": "164", "path": "164",
"title": "[Bug] Plus de son en fin de chrono", "title": "[Bug] Plus de son en fin de chrono",
"status": "open", "status": "qa",
"priority": "medium", "priority": "medium",
"sprint": "abc4f969-b169-45f7-988c-daeeab762201", "sprint": "abc4f969-b169-45f7-988c-daeeab762201",
"assignedAgentIds": [], "assignedAgentIds": [],
"createdBy": { "createdBy": {
"kind": "user" "kind": "user"
}, },
"updatedAt": 1785318038269 "updatedAt": 1785321673362
}, },
{ {
"issueRef": "#165", "issueRef": "#165",
@ -2447,7 +2447,7 @@
"issueRef": "#174", "issueRef": "#174",
"path": "174", "path": "174",
"title": "[Bug] La montre quitte l'application ou revient à l'accueil pendant une séance/au lancement d'un chrono", "title": "[Bug] La montre quitte l'application ou revient à l'accueil pendant une séance/au lancement d'un chrono",
"status": "open", "status": "qa",
"priority": "high", "priority": "high",
"sprint": "abc4f969-b169-45f7-988c-daeeab762201", "sprint": "abc4f969-b169-45f7-988c-daeeab762201",
"assignedAgentIds": [], "assignedAgentIds": [],
@ -2455,7 +2455,7 @@
"kind": "agent", "kind": "agent",
"agent_id": "57695b92-24d0-4876-837c-76116e70a6ae" "agent_id": "57695b92-24d0-4876-837c-76116e70a6ae"
}, },
"updatedAt": 1785318038485 "updatedAt": 1785321673382
}, },
{ {
"issueRef": "#175", "issueRef": "#175",
@ -2475,40 +2475,40 @@
"issueRef": "#176", "issueRef": "#176",
"path": "176", "path": "176",
"title": "[UI] Mauvais scaling chrono seul d'une etape", "title": "[UI] Mauvais scaling chrono seul d'une etape",
"status": "open", "status": "qa",
"priority": "medium", "priority": "medium",
"sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea", "sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea",
"assignedAgentIds": [], "assignedAgentIds": [],
"createdBy": { "createdBy": {
"kind": "user" "kind": "user"
}, },
"updatedAt": 1785318771867 "updatedAt": 1785321673401
}, },
{ {
"issueRef": "#177", "issueRef": "#177",
"path": "177", "path": "177",
"title": "[UI] Boutons lors d'une étape avec uniquement un nombre de répétition a revoir", "title": "[UI] Boutons lors d'une étape avec uniquement un nombre de répétition a revoir",
"status": "open", "status": "closed",
"priority": "medium", "priority": "medium",
"sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea", "sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea",
"assignedAgentIds": [], "assignedAgentIds": [],
"createdBy": { "createdBy": {
"kind": "user" "kind": "user"
}, },
"updatedAt": 1785318789682 "updatedAt": 1785321673419
}, },
{ {
"issueRef": "#178", "issueRef": "#178",
"path": "178", "path": "178",
"title": "[Bug] les boutons actions ne sont pas toujours fonctionnels", "title": "[Bug] les boutons actions ne sont pas toujours fonctionnels",
"status": "open", "status": "qa",
"priority": "medium", "priority": "medium",
"sprint": "abc4f969-b169-45f7-988c-daeeab762201", "sprint": "abc4f969-b169-45f7-988c-daeeab762201",
"assignedAgentIds": [], "assignedAgentIds": [],
"createdBy": { "createdBy": {
"kind": "user" "kind": "user"
}, },
"updatedAt": 1785318628907 "updatedAt": 1785321673439
} }
] ]
} }

View File

@ -2900,6 +2900,17 @@ final class _CurrentStepPane extends StatelessWidget {
), ),
], ],
const SizedBox(height: 4), const SizedBox(height: 4),
if (step.type == ExerciseStepType.reps) ...[
FilledButton.icon(
onPressed: onCompleteStep,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(48),
),
icon: const Icon(Icons.check),
label: const Text('Étape suivante'),
),
const SizedBox(height: 8),
],
Row( Row(
children: [ children: [
Expanded( Expanded(
@ -2933,19 +2944,6 @@ final class _CurrentStepPane extends StatelessWidget {
), ),
], ],
), ),
if (step.type == ExerciseStepType.reps) ...[
const SizedBox(width: 8),
Expanded(
child: FilledButton.icon(
onPressed: onCompleteStep,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(44),
),
icon: const Icon(Icons.check),
label: const Text('Étape suivante'),
),
),
],
], ],
), ),
], ],
@ -2977,37 +2975,59 @@ final class _TimedStepBody extends StatelessWidget {
children: [ children: [
Text('Objectif : ${_formatShortSeconds(step.defaultTargetValue)}'), Text('Objectif : ${_formatShortSeconds(step.defaultTargetValue)}'),
const SizedBox(height: 4), const SizedBox(height: 4),
Center( Expanded(
child: Text( child: LayoutBuilder(
remainingLabel, builder: (context, constraints) {
style: Theme.of(context).textTheme.displayMedium?.copyWith( return FittedBox(
fontFamily: 'Anton', fit: BoxFit.contain,
fontFeatures: AppTextStyles.timer(context).fontFeatures, alignment: Alignment.center,
color: Theme.of(context).colorScheme.primary, child: SizedBox(
), width: constraints.maxWidth,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
remainingLabel,
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.displayMedium
?.copyWith(
fontFamily: 'Anton',
fontFeatures: AppTextStyles.timer(
context,
).fontFeatures,
color: Theme.of(context).colorScheme.primary,
),
),
if (!running) ...[
const SizedBox(height: 8),
if (readyToStart) ...[
Text(
'Chrono prêt',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleSmall
?.copyWith(
color: Theme.of(context).colorScheme.primary,
),
),
const SizedBox(height: 4),
],
FilledButton.icon(
onPressed: onStartTimer,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(48),
),
icon: const Icon(Icons.play_arrow),
label: const Text('Lancer'),
),
],
],
),
),
);
},
), ),
), ),
if (!running) ...[
const SizedBox(height: 8),
if (readyToStart) ...[
Text(
'Chrono prêt',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleSmall?.copyWith(
color: Theme.of(context).colorScheme.primary,
),
),
const SizedBox(height: 4),
],
FilledButton.icon(
onPressed: onStartTimer,
style: FilledButton.styleFrom(
minimumSize: const Size.fromHeight(48),
),
icon: const Icon(Icons.play_arrow),
label: const Text('Lancer'),
),
],
], ],
); );
} }

View File

@ -1947,7 +1947,20 @@ void main() {
find.widgetWithText(OutlinedButton, 'Passer létape'), find.widgetWithText(OutlinedButton, 'Passer létape'),
findsOneWidget, findsOneWidget,
); );
expect(find.widgetWithText(FilledButton, 'Étape suivante'), findsOneWidget); final nextStepButton = find.widgetWithText(FilledButton, 'Étape suivante');
final skipStepButton = find.widgetWithText(
OutlinedButton,
'Passer létape',
);
expect(nextStepButton, findsOneWidget);
expect(
tester.getTopLeft(nextStepButton).dy,
lessThan(tester.getTopLeft(skipStepButton).dy),
);
expect(
tester.getSize(nextStepButton).width,
greaterThan(tester.getSize(skipStepButton).width),
);
await tester.tap(find.text('Étape suivante')); await tester.tap(find.text('Étape suivante'));
await tester.pump(); await tester.pump();
@ -1999,6 +2012,12 @@ void main() {
await tester.pump(); await tester.pump();
expect(find.text('00:05'), findsOneWidget); expect(find.text('00:05'), findsOneWidget);
expect(
find.byWidgetPredicate(
(widget) => widget is FittedBox && widget.fit == BoxFit.contain,
),
findsWidgets,
);
await tester.tap(find.widgetWithText(FilledButton, 'Lancer')); await tester.tap(find.widgetWithText(FilledButton, 'Lancer'));
await tester.pump(); await tester.pump();
clock.value = DateTime.utc(2026, 7, 17, 12, 0, 2); clock.value = DateTime.utc(2026, 7, 17, 12, 0, 2);