From f523a5a8b5ef158e9585d826bf1a25779190f246 Mon Sep 17 00:00:00 2001 From: Blomios Date: Wed, 29 Jul 2026 11:59:15 +0200 Subject: [PATCH] chore(ideai): synchronise etat de suivi (tickets, agents) --- .ideai/tickets/136/carnet.md | 4 +- .ideai/tickets/136/issue.md | 4 +- .ideai/tickets/164/carnet.md | 4 +- .ideai/tickets/164/issue.md | 6 +-- .ideai/tickets/174/carnet.md | 6 +-- .ideai/tickets/174/issue.md | 8 ++-- .ideai/tickets/176/carnet.md | 73 ++++++++++++++++++++++++++++++++++++ .ideai/tickets/176/issue.md | 16 ++++++++ .ideai/tickets/177/carnet.md | 62 ++++++++++++++++++++++++++++++ .ideai/tickets/177/issue.md | 16 ++++++++ .ideai/tickets/178/carnet.md | 6 +++ .ideai/tickets/178/issue.md | 16 ++++++++ .ideai/tickets/counter.json | 2 +- .ideai/tickets/index.json | 49 +++++++++++++++++++++--- 14 files changed, 250 insertions(+), 22 deletions(-) create mode 100644 .ideai/tickets/176/carnet.md create mode 100644 .ideai/tickets/176/issue.md create mode 100644 .ideai/tickets/177/carnet.md create mode 100644 .ideai/tickets/177/issue.md create mode 100644 .ideai/tickets/178/carnet.md create mode 100644 .ideai/tickets/178/issue.md diff --git a/.ideai/tickets/136/carnet.md b/.ideai/tickets/136/carnet.md index f0695b0..47f2ae5 100644 --- a/.ideai/tickets/136/carnet.md +++ b/.ideai/tickets/136/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#136" -version: 9 +version: 11 updatedBy: {"kind":"user"} -updatedAt: 1785252649210 +updatedAt: 1785318540643 --- ## #136 — Cadrage UX (2026-07-28) diff --git a/.ideai/tickets/136/issue.md b/.ideai/tickets/136/issue.md index 13e4cab..c276f35 100644 --- a/.ideai/tickets/136/issue.md +++ b/.ideai/tickets/136/issue.md @@ -10,7 +10,7 @@ agentRefs: [] createdBy: {"kind":"user"} updatedBy: {"kind":"user"} createdAt: 1785141207792 -updatedAt: 1785252649210 -version: 9 +updatedAt: 1785318540643 +version: 11 --- Le bouton "passer le repos" sur la montre ne fonctionne pas, il me renvoie sur l'écran de la séance sur la montre mais ne passe pas le repos sur le téléphone \ No newline at end of file diff --git a/.ideai/tickets/164/carnet.md b/.ideai/tickets/164/carnet.md index 4a82ae1..1653b93 100644 --- a/.ideai/tickets/164/carnet.md +++ b/.ideai/tickets/164/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#164" -version: 8 +version: 9 updatedBy: {"kind":"user"} -updatedAt: 1785315994240 +updatedAt: 1785318038269 --- ## #164 — Cadrage UX (2026-07-28) diff --git a/.ideai/tickets/164/issue.md b/.ideai/tickets/164/issue.md index 2691141..dc2c161 100644 --- a/.ideai/tickets/164/issue.md +++ b/.ideai/tickets/164/issue.md @@ -2,7 +2,7 @@ id: "879caaa3-2658-4ad8-bfa0-a7444cffc1b0" number: 164 title: "[Bug] Plus de son en fin de chrono" -status: "qa" +status: "open" priority: "medium" sprint: "abc4f969-b169-45f7-988c-daeeab762201" links: [] @@ -10,7 +10,7 @@ agentRefs: [] createdBy: {"kind":"user"} updatedBy: {"kind":"user"} createdAt: 1785243194849 -updatedAt: 1785315994240 -version: 8 +updatedAt: 1785318038269 +version: 9 --- 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 \ No newline at end of file diff --git a/.ideai/tickets/174/carnet.md b/.ideai/tickets/174/carnet.md index 5abdf81..2757789 100644 --- a/.ideai/tickets/174/carnet.md +++ b/.ideai/tickets/174/carnet.md @@ -1,8 +1,8 @@ --- issueRef: "#174" -version: 2 -updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedAt: 1785311597948 +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1785318038485 --- ## #174 — Cadrage Main (2026-07-28) diff --git a/.ideai/tickets/174/issue.md b/.ideai/tickets/174/issue.md index 1a42b4d..3793a62 100644 --- a/.ideai/tickets/174/issue.md +++ b/.ideai/tickets/174/issue.md @@ -2,15 +2,15 @@ id: "f2db430b-48cf-4626-beae-611ffb352043" number: 174 title: "[Bug] La montre quitte l'application ou revient à l'accueil pendant une séance/au lancement d'un chrono" -status: "qa" +status: "open" priority: "high" sprint: "abc4f969-b169-45f7-988c-daeeab762201" links: [{"target":"#127","kind":"relatesTo"},{"target":"#165","kind":"relatesTo"}] agentRefs: [] createdBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} -updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"} +updatedBy: {"kind":"user"} createdAt: 1785257860730 -updatedAt: 1785311597948 -version: 2 +updatedAt: 1785318038485 +version: 3 --- 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. diff --git a/.ideai/tickets/176/carnet.md b/.ideai/tickets/176/carnet.md new file mode 100644 index 0000000..fa2ff52 --- /dev/null +++ b/.ideai/tickets/176/carnet.md @@ -0,0 +1,73 @@ +--- +issueRef: "#176" +version: 4 +updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} +updatedAt: 1785318771867 +--- + +## #176 — Cadrage UX (2026-07-29) + +Statut : **cadrage exploitable, nouveau lot**, app téléphone, `lib/presentation/workout_execution_screen.dart`, widget `_TimedStepBody` (L2907-2963), rendu dans `_CurrentStepPane` (branche générale, L2811-2838, `Expanded(child: step.type == time ? _TimedStepBody(...) : ...)`). + +### Constat, vérifié en lecture directe +`_TimedStepBody` est placé dans un `Expanded` par son parent (toute la hauteur disponible lui est allouée), mais **à l'intérieur** de ce widget rien n'exploite cet espace : + +```dart +Column( // pas de mainAxisAlignment.center, pas de Expanded interne, pas de FittedBox + children: [ + Text('Objectif : Xs'), + Center(child: Text(remainingLabel, style: displayMedium)), // taille fixe, non scalable + if (!running) [...'Chrono prêt'..., FilledButton 'Lancer'], + ], +) +``` + +Le `Text(remainingLabel)` a une taille de police fixe (`displayMedium`), la `Column` s'aligne en haut (comportement par défaut) : tout l'espace du `Expanded` non consommé par le contenu à taille naturelle reste vide en bas. Résultat : le chrono reste petit que le bouton `Lancer` soit visible ou non, et une fois le chrono démarré (`running == true`, le bloc `Lancer`/`Chrono prêt` disparaît), l'espace libéré n'est récupéré par personne — comportement exactement décrit par le ticket. + +À comparer avec `_RepsWithStopwatchScoreStepBody` (L2965+) et le bloc `Expanded → LayoutBuilder → FittedBox(scaleDown) → SizedBox(hauteur de référence fixe)` déjà utilisé en L2740-2772 pour dimensionner un contenu à une zone variable : ce pattern existe déjà dans ce fichier, `_TimedStepBody` ne le reprend pas. + +### Comportement attendu +Le chrono (et le bouton `Lancer` quand il est visible) doivent occuper **tout** l'espace vertical disponible dans le `Expanded` parent, dans les deux états : + +- **Avant démarrage** (`!running`) : chrono + `Chrono prêt` (si prêt) + bouton `Lancer`, empilés et **centrés**, mis à l'échelle ensemble pour remplir la zone disponible (largeur et hauteur). +- **Après démarrage** (`running`) : le bloc `Chrono prêt`/`Lancer` disparaît (inchangé), et le chrono seul se remet à l'échelle pour **regrandir** et occuper tout l'espace libéré — pas de saut brutal de layout, juste une nouvelle mise à l'échelle du même mécanisme. + +### Implémentation recommandée +Réutiliser le mécanisme `FittedBox(fit: BoxFit.contain)` déjà présent dans ce fichier (au lieu de `BoxFit.scaleDown` utilisé ailleurs, qui ne permet que de rétrécir — ici on veut aussi agrandir) : + +```dart +Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text('Objectif : ${_formatShortSeconds(step.defaultTargetValue)}'), // inchangé, taille fixe + const SizedBox(height: 4), + Expanded( // NOUVEAU : réclame tout l'espace restant + child: LayoutBuilder( + builder: (context, c) => FittedBox( + fit: BoxFit.contain, // scale up ET down, contrairement à scaleDown + child: SizedBox( + width: c.maxWidth, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text(remainingLabel, style: /* displayMedium, référence */), + if (!running) ...[ + const SizedBox(height: 8), + if (readyToStart) Text('Chrono prêt', ...), + const SizedBox(height: 4), + FilledButton.icon(onPressed: onStartTimer, icon: Icons.play_arrow, label: 'Lancer'), + ], + ], + ), + ), + ), + ), + ), + ], +) +``` + +- Le `FittedBox(BoxFit.contain)` prend le bloc de référence (chrono seul, ou chrono + libellé + bouton selon l'état) et le met à l'échelle pour remplir exactement la largeur ET la hauteur du `Expanded` — c'est ce même mécanisme qui fait automatiquement grandir le chrono quand le bouton disparaît : le bloc de référence devient plus petit (moins d'enfants), donc le facteur d'échelle appliqué par `FittedBox` augmente pour combler le même espace disponible. +- Le bouton `Lancer` grandit avec le reste (proportionnellement) tant qu'il est visible — cohérent avec la demande explicite du ticket (« chrono + bouton commencer prennent la place disponible »). +- Point de vigilance dev : choisir une taille de référence (police du `Text(remainingLabel)`, hauteur du bouton) qui donne un **rendu correct au repos** (échelle ≈ 1) sur la taille d'écran de référence du projet, quitte à ajuster ces valeurs empiriquement — le `FittedBox` absorbe l'écart, mais des proportions de référence déséquilibrées donneraient un mauvais rendu même mis à l'échelle. Ne pas plafonner l'échelle maximale (pas de `scaleDown`) : la demande explicite est que ça puisse grandir au-delà de la taille actuelle. +- Ne touche pas au cas `hasTimedWithManualScore` (L2725-2809, `_TimedStepWithManualScoreBody`) : ce lot ne concerne que le chrono seul, sans score manuel, branche générale de `_CurrentStepPane`. diff --git a/.ideai/tickets/176/issue.md b/.ideai/tickets/176/issue.md new file mode 100644 index 0000000..0331777 --- /dev/null +++ b/.ideai/tickets/176/issue.md @@ -0,0 +1,16 @@ +--- +id: "3da05d4c-9a2c-4371-95d2-7a00a157bccc" +number: 176 +title: "[UI] Mauvais scaling chrono seul d'une etape" +status: "open" +priority: "medium" +sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea" +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} +createdAt: 1785318071566 +updatedAt: 1785318771867 +version: 4 +--- +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 \ No newline at end of file diff --git a/.ideai/tickets/177/carnet.md b/.ideai/tickets/177/carnet.md new file mode 100644 index 0000000..dcdb6e7 --- /dev/null +++ b/.ideai/tickets/177/carnet.md @@ -0,0 +1,62 @@ +--- +issueRef: "#177" +version: 4 +updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} +updatedAt: 1785318789682 +--- + +## #177 — Cadrage UX (2026-07-29) + +Statut : **cadrage exploitable, révision du lot #171 déjà livré** — même fichier/zone (`_CurrentStepPane`, branche générale reps-only, workout_execution_screen.dart L2851-2899). Le retour utilisateur porte sur le **résultat visuel** de la correction apportée pour #171 (suppression du scroll), pas sur une régression fonctionnelle : la rangée `[Passer l'étape] [···] [Étape suivante]` tient sur une ligne mais rend mal (trois éléments hétérogènes — deux boutons pleine largeur + un bouton icône carré — écrasés côte à côte). + +### Diagnostic +Le défaut n'est pas l'absence de place, c'est la **hiérarchie plate** : `Passer l'étape` (contournement, cas rare) et `Étape suivante` (action attendue, cas fréquent) ont exactement le même poids visuel, et le menu `···` (encore plus secondaire : passer le passage/la séquence) est coincé entre les deux au lieu d'être clairement rattaché à l'action secondaire. Cette rangée plate contredit le principe déjà appliqué ailleurs dans ce lot UI (montre, #166) : *une seule action principale, mise en avant ; les actions de contournement reléguées, jamais au même niveau visuel*. + +### Comportement attendu +Séparer en deux rangées, primaire au-dessus / secondaire en dessous — reprend la hiérarchie déjà utilisée par la montre (#166) : action attendue mise en avant, contournement discret en dessous. + +```text +Pompes tempo + + 10 + RÉPÉTITIONS + +[ ✓ Étape suivante ] ← rangée 1 : pleine largeur, action principale + +[ Passer l'étape ] [···] ← rangée 2 : secondaire, inchangée +``` + +- **Rangée 1** (nouvelle) : `Étape suivante` seul, `FilledButton.icon`, **pleine largeur** (`Size.fromHeight(48)`), pas de partage de ligne avec un autre bouton. C'est l'action que l'utilisateur va faire dans l'immense majorité des cas (terminer ses répétitions) — elle mérite tout l'espace et toute l'attention. +- **Rangée 2** (existante, inchangée) : `Passer l'étape` (`Expanded`) + menu `···` (`Passer ce passage` / `Passer la séquence`), exactement le layout déjà en place pour les étapes **sans** reps (cas général sans le bouton `Étape suivante`, L2851-2884) — donc pas de nouveau composant, juste la suppression du 3ᵉ élément qui polluait cette rangée. +- Écart vertical entre les deux rangées : `SizedBox(height: 8)`, cohérent avec les autres espacements de ce fichier (cf. L2774, L2840). +- **Mutualisation** : ce becomes le layout standard des boutons de bas d'écran pour **toute** étape ayant une action de complétion explicite (reps sans chrono aujourd'hui ; potentiellement d'autres cas futurs) — une rangée pleine largeur pour l'action principale, une rangée dédiée aux actions de contournement en dessous. Le cas `hasRepsWithStopwatchScore` (L2775-2799, deux boutons `Expanded` côte à côte) reste **inchangé** : ce cas a déjà validé son propre layout à deux boutons de poids égal (pas de `···`), pas concerné par cette révision. + +### Implémentation +Dans la branche générale (L2851-2899), remplacer le `Row` unique conditionnel par : + +```dart +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( + children: [ + Expanded( + child: OutlinedButton( + onPressed: onSkipStep, + style: OutlinedButton.styleFrom(minimumSize: const Size.fromHeight(44)), + child: const Text('Passer l’étape'), + ), + ), + const SizedBox(width: 8), + PopupMenuButton<_StepSkipAction>(/* inchangé */), + ], +), +``` + +Aucune nouvelle donnée, aucun nouveau contrat — pur remaniement de présentation, réutilisation de composants et de styles déjà en place dans le fichier. diff --git a/.ideai/tickets/177/issue.md b/.ideai/tickets/177/issue.md new file mode 100644 index 0000000..3cbc645 --- /dev/null +++ b/.ideai/tickets/177/issue.md @@ -0,0 +1,16 @@ +--- +id: "9f2dcd00-5b90-41ad-9215-9c2fa405048c" +number: 177 +title: "[UI] Boutons lors d'une étape avec uniquement un nombre de répétition a revoir" +status: "open" +priority: "medium" +sprint: "d5c18b44-0eec-46db-b8ab-506cfee0bfea" +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"agent","agent_id":"f3408f5d-469c-4f64-9485-d8b218f3ff26"} +createdAt: 1785318287363 +updatedAt: 1785318789682 +version: 4 +--- +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 \ No newline at end of file diff --git a/.ideai/tickets/178/carnet.md b/.ideai/tickets/178/carnet.md new file mode 100644 index 0000000..5a6dad3 --- /dev/null +++ b/.ideai/tickets/178/carnet.md @@ -0,0 +1,6 @@ +--- +issueRef: "#178" +version: 3 +updatedBy: {"kind":"user"} +updatedAt: 1785318628907 +--- diff --git a/.ideai/tickets/178/issue.md b/.ideai/tickets/178/issue.md new file mode 100644 index 0000000..3549712 --- /dev/null +++ b/.ideai/tickets/178/issue.md @@ -0,0 +1,16 @@ +--- +id: "86c6a104-f509-4fd9-91f0-0898c3d2414a" +number: 178 +title: "[Bug] les boutons actions ne sont pas toujours fonctionnels" +status: "open" +priority: "medium" +sprint: "abc4f969-b169-45f7-988c-daeeab762201" +links: [] +agentRefs: [] +createdBy: {"kind":"user"} +updatedBy: {"kind":"user"} +createdAt: 1785318553666 +updatedAt: 1785318628907 +version: 3 +--- +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 \ No newline at end of file diff --git a/.ideai/tickets/counter.json b/.ideai/tickets/counter.json index be9f2a8..8fed469 100644 --- a/.ideai/tickets/counter.json +++ b/.ideai/tickets/counter.json @@ -1,3 +1,3 @@ { - "nextNumber": 172 + "nextNumber": 179 } \ No newline at end of file diff --git a/.ideai/tickets/index.json b/.ideai/tickets/index.json index 0298eb5..93728ce 100644 --- a/.ideai/tickets/index.json +++ b/.ideai/tickets/index.json @@ -1922,7 +1922,7 @@ "createdBy": { "kind": "user" }, - "updatedAt": 1785252649210 + "updatedAt": 1785318540643 }, { "issueRef": "#137", @@ -2316,14 +2316,14 @@ "issueRef": "#164", "path": "164", "title": "[Bug] Plus de son en fin de chrono", - "status": "qa", + "status": "open", "priority": "medium", "sprint": "abc4f969-b169-45f7-988c-daeeab762201", "assignedAgentIds": [], "createdBy": { "kind": "user" }, - "updatedAt": 1785315994240 + "updatedAt": 1785318038269 }, { "issueRef": "#165", @@ -2447,7 +2447,7 @@ "issueRef": "#174", "path": "174", "title": "[Bug] La montre quitte l'application ou revient à l'accueil pendant une séance/au lancement d'un chrono", - "status": "qa", + "status": "open", "priority": "high", "sprint": "abc4f969-b169-45f7-988c-daeeab762201", "assignedAgentIds": [], @@ -2455,7 +2455,7 @@ "kind": "agent", "agent_id": "57695b92-24d0-4876-837c-76116e70a6ae" }, - "updatedAt": 1785311597948 + "updatedAt": 1785318038485 }, { "issueRef": "#175", @@ -2470,6 +2470,45 @@ "agent_id": "57695b92-24d0-4876-837c-76116e70a6ae" }, "updatedAt": 1785315994252 + }, + { + "issueRef": "#176", + "path": "176", + "title": "[UI] Mauvais scaling chrono seul d'une etape", + "status": "open", + "priority": "medium", + "sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea", + "assignedAgentIds": [], + "createdBy": { + "kind": "user" + }, + "updatedAt": 1785318771867 + }, + { + "issueRef": "#177", + "path": "177", + "title": "[UI] Boutons lors d'une étape avec uniquement un nombre de répétition a revoir", + "status": "open", + "priority": "medium", + "sprint": "d5c18b44-0eec-46db-b8ab-506cfee0bfea", + "assignedAgentIds": [], + "createdBy": { + "kind": "user" + }, + "updatedAt": 1785318789682 + }, + { + "issueRef": "#178", + "path": "178", + "title": "[Bug] les boutons actions ne sont pas toujours fonctionnels", + "status": "open", + "priority": "medium", + "sprint": "abc4f969-b169-45f7-988c-daeeab762201", + "assignedAgentIds": [], + "createdBy": { + "kind": "user" + }, + "updatedAt": 1785318628907 } ] } \ No newline at end of file