Ajoute les notes mémoire d'architecture et UX pour l'auto-enchaînement des chronos d'étapes, clôture le ticket #75, reflète les tickets #63/#70, ajoute le cadrage des tickets #76 à #79. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
271 lines
8.3 KiB
Markdown
271 lines
8.3 KiB
Markdown
---
|
|
name: gametime-ux-step-chaining-override
|
|
description: memory note gametime-ux-step-chaining-override
|
|
metadata:
|
|
type: project
|
|
---
|
|
# GameTime — Enchaînement configurable des chronos d'étapes (ticket #73, UX 2026-07-20)
|
|
|
|
Conception UX pour rendre configurable le comportement d'enchaînement automatique entre deux étapes chronométrées consécutives dans un exercice à séquence.
|
|
|
|
Mémoire de référence : `gametime-ux-exercise-steps`.
|
|
|
|
## Décision structurante
|
|
|
|
Le comportement historiquement fixe devient un réglage hiérarchique :
|
|
|
|
```text
|
|
séance-modèle > programme > exercice
|
|
```
|
|
|
|
La valeur effective pendant l'exécution est la valeur la plus spécifique renseignée :
|
|
|
|
- override séance si présent ;
|
|
- sinon override/config programme si présent ;
|
|
- sinon valeur par défaut de l'exercice.
|
|
|
|
Valeur par défaut recommandée pour les exercices existants et nouveaux : **activé**, afin de préserver le comportement livré aux tickets #54/#60.
|
|
|
|
Libellé commun :
|
|
|
|
```text
|
|
Enchaîner automatiquement les chronos consécutifs
|
|
```
|
|
|
|
Aide commune :
|
|
|
|
```text
|
|
Quand une étape Temps est suivie d'une autre étape Temps, le chrono suivant démarre dès que le précédent arrive à 0.
|
|
```
|
|
|
|
Si désactivé, aide complémentaire :
|
|
|
|
```text
|
|
L'app attendra ton démarrage avant de lancer le chrono suivant.
|
|
```
|
|
|
|
## 1. Niveau Exercice
|
|
|
|
Surface : `ExerciseFormScreen`, section `Séquence d'étapes`.
|
|
|
|
Afficher le réglage uniquement si `Rythmer cet exercice avec des étapes` est activé.
|
|
|
|
Placement recommandé : juste sous le switch `Rythmer cet exercice avec des étapes`, avant la liste des étapes.
|
|
|
|
UI :
|
|
|
|
```text
|
|
Séquence d'étapes
|
|
[ON] Rythmer cet exercice avec des étapes
|
|
|
|
[ON] Enchaîner automatiquement les chronos consécutifs
|
|
Quand une étape Temps est suivie d'une autre étape Temps, le chrono suivant démarre dès que le précédent arrive à 0.
|
|
```
|
|
|
|
Si désactivé :
|
|
|
|
```text
|
|
[OFF] Enchaîner automatiquement les chronos consécutifs
|
|
L'app attendra ton démarrage avant de lancer le chrono suivant.
|
|
```
|
|
|
|
Ne pas masquer le réglage s'il n'y a pas encore deux étapes Temps consécutives : l'utilisateur peut encore ajouter/réordonner des étapes. Le réglage est simplement sans effet tant qu'aucun enchaînement Temps -> Temps n'existe.
|
|
|
|
## 2. Niveau Programme
|
|
|
|
Surface : écran `Personnaliser l'exercice` dans un programme (`ProgramExerciseCustomizationScreen`).
|
|
|
|
Afficher une nouvelle section `Séquence` seulement si l'exercice possède des étapes.
|
|
|
|
Placement recommandé : après `Objectifs`, avant `Repos`, car le réglage concerne le déroulé interne de l'exercice, pas les mesures de série.
|
|
|
|
UI recommandée : switch + indication d'héritage.
|
|
|
|
État sans override programme :
|
|
|
|
```text
|
|
Séquence
|
|
[ON] Enchaîner automatiquement les chronos consécutifs
|
|
Réglage de l'exercice
|
|
```
|
|
|
|
Si l'utilisateur change le switch, cela crée une personnalisation programme :
|
|
|
|
```text
|
|
Séquence
|
|
[OFF] Enchaîner automatiquement les chronos consécutifs
|
|
Personnalisé pour ce programme
|
|
|
|
[Revenir au réglage de l'exercice]
|
|
```
|
|
|
|
Règle UX : il doit toujours être possible de supprimer l'override programme via `Revenir au réglage de l'exercice`. Sans ce retour, un simple switch force une valeur locale permanente et ne respecte pas le modèle hiérarchique.
|
|
|
|
Résumé compact de l'exercice dans le programme : ne pas ajouter ce détail dans la ligne compacte par défaut. Le réglage reste dans `Personnaliser` pour éviter de surcharger la liste.
|
|
|
|
## 3. Niveau Séance-modèle
|
|
|
|
Surface : détail d'un programme intégré dans une séance-modèle (`WorkoutTemplateProgramDetailScreen`), là où l'utilisateur surcharge déjà le nombre de séries et les cibles numériques.
|
|
|
|
Afficher la section `Séquence` dans chaque carte exercice seulement si l'exercice possède des étapes.
|
|
|
|
Placement recommandé : après les champs numériques de l'exercice, dans la même carte.
|
|
|
|
UI :
|
|
|
|
État sans override séance :
|
|
|
|
```text
|
|
Séquence
|
|
[ON] Enchaîner automatiquement les chronos consécutifs
|
|
Réglage du programme
|
|
```
|
|
|
|
État avec override séance :
|
|
|
|
```text
|
|
Séquence
|
|
[OFF] Enchaîner automatiquement les chronos consécutifs
|
|
Personnalisé pour cette séance
|
|
|
|
[Revenir au réglage du programme]
|
|
```
|
|
|
|
Règle UX : la séance doit pouvoir revenir au réglage du programme. C'est nécessaire pour conserver une vraie résolution `séance > programme > exercice`.
|
|
|
|
Point d'attention Architect : `WorkoutTemplateExerciseOverride` ne porte aujourd'hui que des overrides numériques. Il faudra un override booléen nullable, par exemple `autoStartNextTimedStepOverride`, pour représenter `non renseigné / activé / désactivé`.
|
|
|
|
## 4. Exécution quand le réglage est activé
|
|
|
|
Comportement inchangé :
|
|
|
|
- une étape Temps arrive à `0` ;
|
|
- bip long ;
|
|
- si l'étape suivante est aussi Temps, son chrono démarre immédiatement ;
|
|
- pas de pause ni bouton intermédiaire.
|
|
|
|
C'est aussi le comportement à conserver pour les exercices existants après migration.
|
|
|
|
## 5. Exécution quand le réglage est désactivé
|
|
|
|
Cas ciblé : étape `Temps` suivie directement d'une autre étape `Temps`.
|
|
|
|
Quand le premier chrono arrive à `0` :
|
|
|
|
- bips des 3 dernières secondes inchangés ;
|
|
- bip long à `0` inchangé ;
|
|
- l'app passe à l'étape suivante ;
|
|
- le chrono suivant **ne démarre pas** ;
|
|
- l'écran attend une action explicite.
|
|
|
|
État visuel attendu dans le module `SÉQUENCE` :
|
|
|
|
```text
|
|
ÉTAPE 2 / 4
|
|
Dribble main gauche
|
|
Objectif : 10 s
|
|
|
|
00:10
|
|
Chrono suivant prêt
|
|
|
|
[Démarrer le chrono]
|
|
[Passer l'étape]
|
|
```
|
|
|
|
Différence de libellé :
|
|
|
|
- première étape chronométrée de la séquence : bouton `Démarrer la séquence` ;
|
|
- étape chronométrée mise en attente après une autre étape Temps : bouton `Démarrer le chrono`.
|
|
|
|
Style Court Blazer :
|
|
|
|
- timer `00:10` en Anton, primaire or ;
|
|
- label `Chrono suivant prêt` en Archivo, texte secondaire ;
|
|
- optionnel : petit badge contour primaire `PRÊT` ;
|
|
- panneau avec surface habituelle + liseré crimson 2 px ;
|
|
- pas de rouge/alerte : c'est un état attendu, pas une erreur.
|
|
|
|
Si plusieurs étapes Temps se suivent et que le réglage est désactivé, l'app attend avant chaque nouveau chrono.
|
|
|
|
Si la dernière étape d'un passage est Temps et que le passage suivant commence aussi par Temps : appliquer la même règle. L'écran peut afficher :
|
|
|
|
```text
|
|
Passage 2 / 10
|
|
ÉTAPE 1 / 4
|
|
Dribble main droite
|
|
|
|
Chrono suivant prêt
|
|
[Démarrer le chrono]
|
|
```
|
|
|
|
## 6. Interaction avec étapes à répétitions
|
|
|
|
Aucun changement.
|
|
|
|
- Temps -> Répétitions : le chrono finit, l'app affiche l'étape à répétitions et attend `Étape suivante` comme aujourd'hui.
|
|
- Répétitions -> Temps : après `Étape suivante`, si l'étape suivante est Temps, le chrono peut démarrer immédiatement selon le comportement déjà existant pour démarrer une étape Temps après action utilisateur. Le nouveau réglage cible uniquement le cas Temps -> Temps automatique.
|
|
|
|
## 7. Pause, reprise, app fermée
|
|
|
|
Si le réglage est désactivé et que l'app est dans l'état `Chrono suivant prêt` :
|
|
|
|
- pause/reprise conserve cet état prêt ;
|
|
- aucun temps ne s'écoule pour l'étape suivante ;
|
|
- après kill/reprise, revenir au même état avec le bouton `Démarrer le chrono`.
|
|
|
|
Si l'app est en arrière-plan pendant un chrono et que celui-ci atteint `0` :
|
|
|
|
- si l'enchaînement est activé, l'app peut recalculer et avancer dans les chronos consécutifs comme prévu ;
|
|
- si l'enchaînement est désactivé, l'app s'arrête au premier état `Chrono suivant prêt` et n'avance pas plus loin sans action utilisateur.
|
|
|
|
## 8. Libellés définitifs
|
|
|
|
Réglage :
|
|
|
|
```text
|
|
Enchaîner automatiquement les chronos consécutifs
|
|
```
|
|
|
|
Aide activée :
|
|
|
|
```text
|
|
Le chrono suivant démarre dès que le précédent arrive à 0.
|
|
```
|
|
|
|
Aide désactivée :
|
|
|
|
```text
|
|
L'app attendra ton démarrage avant de lancer le chrono suivant.
|
|
```
|
|
|
|
État d'exécution :
|
|
|
|
```text
|
|
Chrono suivant prêt
|
|
```
|
|
|
|
Bouton :
|
|
|
|
```text
|
|
Démarrer le chrono
|
|
```
|
|
|
|
Retour héritage programme :
|
|
|
|
```text
|
|
Revenir au réglage de l'exercice
|
|
```
|
|
|
|
Retour héritage séance :
|
|
|
|
```text
|
|
Revenir au réglage du programme
|
|
```
|
|
|
|
## 9. Découpage conseillé
|
|
|
|
1. `Domain · réglage auto-start chronos d'étapes` : valeur exercice + overrides programme/séance nullable.
|
|
2. `ExerciseForm · switch valeur par défaut`.
|
|
3. `ProgramExerciseCustomization · override avec retour au réglage exercice`.
|
|
4. `WorkoutTemplateProgramDetail · override avec retour au réglage programme`.
|
|
5. `WorkoutExecution · état Chrono suivant prêt + résolution effective`. |