merge(main): modèle et migration pour l'auto-enchaînement des chronos d'étapes (ticket #75)
Fusionne feature/step-chaining-75-model — pub get OK, build_runner OK (migration schemaVersion 13→14), analyze propre (mêmes infos préexistantes), 141/141 tests verts, build APK debug validé. Premier ticket du chantier "auto-enchaînement des chronos d'étapes" (#73). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -19,3 +19,5 @@
|
||||
- [gametime-online-layer-philosophy](gametime-online-layer-philosophy.md) — memory note gametime-online-layer-philosophy
|
||||
- [gametime-ux-online-client](gametime-ux-online-client.md) — memory note gametime-ux-online-client
|
||||
- [gametime-architecture-online-client](gametime-architecture-online-client.md) — memory note gametime-architecture-online-client
|
||||
- [gametime-ux-step-chaining-override](gametime-ux-step-chaining-override.md) — memory note gametime-ux-step-chaining-override
|
||||
- [gametime-architecture-step-chaining-override](gametime-architecture-step-chaining-override.md) — memory note gametime-architecture-step-chaining-override
|
||||
|
||||
153
.ideai/memory/gametime-architecture-step-chaining-override.md
Normal file
153
.ideai/memory/gametime-architecture-step-chaining-override.md
Normal file
@ -0,0 +1,153 @@
|
||||
---
|
||||
name: gametime-architecture-step-chaining-override
|
||||
description: memory note gametime-architecture-step-chaining-override
|
||||
metadata:
|
||||
type: project
|
||||
---
|
||||
# GameTime — Architecture auto-enchaînement configurable des chronos d'étapes
|
||||
|
||||
Décision d'architecture pour le ticket #73, basée sur `gametime-ux-step-chaining-override` et `gametime-architecture-exercise-steps`.
|
||||
|
||||
## Décision métier
|
||||
|
||||
Ajouter un réglage booléen : `autoStartNextTimedStep`.
|
||||
|
||||
Libellé UX : `Enchaîner automatiquement les chronos consécutifs`.
|
||||
|
||||
Valeur par défaut : `true`, pour préserver le comportement livré par les tickets #54/#60.
|
||||
|
||||
Portée exacte : le réglage ne concerne que le cas `Étape Temps -> Étape Temps`. Il ne change pas :
|
||||
- Temps -> Répétitions : attente manuelle comme aujourd'hui.
|
||||
- Répétitions -> Temps : démarrage possible après action utilisateur comme aujourd'hui.
|
||||
- Fin de série : la séquence ne termine toujours pas automatiquement la série.
|
||||
|
||||
## Stockage / modèle domain
|
||||
|
||||
### Exercise
|
||||
|
||||
Ajouter :
|
||||
|
||||
```dart
|
||||
final bool autoStartNextTimedStep;
|
||||
```
|
||||
|
||||
- non-null ;
|
||||
- défaut `true` ;
|
||||
- présent même si `steps` est vide, mais sans effet tant qu'il n'y a pas de séquence avec deux étapes Temps consécutives.
|
||||
|
||||
### ProgramExercise
|
||||
|
||||
Ajouter deux champs :
|
||||
|
||||
```dart
|
||||
final bool autoStartNextTimedStepSnapshot;
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
```
|
||||
|
||||
Raison : `ProgramExercise` est à la fois snapshot d'exercice et configuration programme. Il faut pouvoir revenir au réglage exercice sans dépendre de l'Exercise vivant, puisque les programmes existants restent indépendants des modifications ultérieures de bibliothèque.
|
||||
|
||||
Résolution programme :
|
||||
|
||||
```dart
|
||||
programEffective = autoStartNextTimedStepOverride ?? autoStartNextTimedStepSnapshot;
|
||||
```
|
||||
|
||||
À propager impérativement dans :
|
||||
- `ProgramExercise.snapshotFromExercise` ;
|
||||
- `ProgramExercise.toSnapshotJson()` ;
|
||||
- `ProgramExerciseConfig` ;
|
||||
- `_ProgramExerciseDraft` ;
|
||||
- mappers Drift ;
|
||||
- copie/share/import payloads.
|
||||
|
||||
Point d'attention #72 : ne pas oublier la propagation UI draft/config comme cela est arrivé pour `exerciseStepsSnapshot`.
|
||||
|
||||
### WorkoutTemplateExerciseOverride
|
||||
|
||||
Ajouter :
|
||||
|
||||
```dart
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
```
|
||||
|
||||
Décision consciente : cela élargit légèrement la règle historique des overrides de séance-modèle. Jusqu'ici, l'override ne portait que des valeurs numériques de série. Ce booléen est accepté dans `WorkoutTemplateExerciseOverride` parce qu'il ne modifie ni la structure, ni les mesures actives, ni la liste/l'ordre des exercices/étapes. Il modifie uniquement un comportement d'exécution local et nullable, avec héritage explicite.
|
||||
|
||||
Résolution séance :
|
||||
|
||||
```dart
|
||||
effective = templateOverride.autoStartNextTimedStepOverride
|
||||
?? programExercise.autoStartNextTimedStepOverride
|
||||
?? programExercise.autoStartNextTimedStepSnapshot;
|
||||
```
|
||||
|
||||
Null signifie toujours héritage.
|
||||
|
||||
## Drift / migration
|
||||
|
||||
Le schéma actuel vérifié est `schemaVersion = 13`. Le ticket #73 doit passer à `schemaVersion = 14`.
|
||||
|
||||
Migration recommandée :
|
||||
- `exercises.auto_start_next_timed_step BOOLEAN NOT NULL DEFAULT true`.
|
||||
- `program_exercises.auto_start_next_timed_step_snapshot BOOLEAN NOT NULL DEFAULT true`.
|
||||
- `program_exercises.auto_start_next_timed_step_override BOOLEAN NULL`.
|
||||
- `workout_template_exercise_overrides.auto_start_next_timed_step_override BOOLEAN NULL`.
|
||||
|
||||
Les snapshots JSON anciens n'auront pas ces champs : les parseurs doivent traiter l'absence comme `true`.
|
||||
|
||||
## Résolution pendant l'exécution
|
||||
|
||||
La valeur effective doit être disponible dans le snapshot résolu de séance ou, a minima, dans `_StepSequenceContext`.
|
||||
|
||||
Approche recommandée :
|
||||
- lors de `startFromTemplate`, inclure l'override séance dans `resolvedTemplateSnapshotJson` comme les autres overrides ;
|
||||
- lors de `_findExerciseSnapshot` / `_stepContext`, calculer ou exposer `autoStartNextTimedStepEffective` ;
|
||||
- `ActiveExerciseStepUseCases` ne doit pas relire les entités vivantes Exercise/Program/Template. Il travaille uniquement sur le snapshot de session, comme le reste de l'exécution.
|
||||
|
||||
Cela garantit que reprendre une séance en cours garde le comportement décidé au lancement, même si l'utilisateur modifie ensuite l'exercice ou le programme source.
|
||||
|
||||
## État `Chrono suivant prêt`
|
||||
|
||||
Ne pas ajouter de nouveau statut Drift/domain pour v1.
|
||||
|
||||
Réutiliser `ActiveExerciseStepProgressStatus.stoppedTimer` : il signifie déjà qu'une étape chronométrée courante est prête mais non lancée (`startedAt == null`, `accumulatedMs == 0`).
|
||||
|
||||
Ne pas utiliser `waitingManual`, réservé aux étapes de type `reps`.
|
||||
|
||||
Le libellé UX `Chrono suivant prêt` est dérivé côté présentation/use case view quand :
|
||||
- `state.status == stoppedTimer` ;
|
||||
- l'étape courante est `time` ;
|
||||
- l'étape précédente effective était aussi `time` ;
|
||||
- `autoStartNextTimedStepEffective == false` ;
|
||||
- un résultat completed/skipped existe pour l'étape précédente ou on vient de la transition timer expirée.
|
||||
|
||||
Pour la première étape chronométrée de la séquence, l'UI garde `Démarrer la séquence`. Pour une étape chrono prête après une étape Temps avec auto-enchaînement désactivé, l'UI affiche `Chrono suivant prêt` + `Démarrer le chrono`.
|
||||
|
||||
## `_advanceState` et `_autoAdvanceElapsedTimers`
|
||||
|
||||
Comportement actuel : `_autoAdvanceElapsedTimers` consomme l'overflow d'un timer expiré et peut démarrer automatiquement les timers suivants.
|
||||
|
||||
Nouveau comportement :
|
||||
- si `autoStartNextTimedStepEffective == true`, comportement inchangé ;
|
||||
- si `false` et que l'étape expirée est suivie d'une étape `time`, enregistrer le résultat de l'étape expirée, avancer la position vers l'étape suivante, puis s'arrêter en `stoppedTimer` avec `startedAt = null`, `accumulatedMs = 0` ;
|
||||
- dans ce cas, ne pas transférer `overflowMs` au chrono suivant ;
|
||||
- après kill/reprise, `_autoAdvanceElapsedTimers` doit s'arrêter exactement au premier `Chrono suivant prêt` et ne jamais avancer plus loin sans action utilisateur ;
|
||||
- si l'étape suivante est `reps`, comportement inchangé : `waitingManual` ;
|
||||
- si la dernière étape d'un passage est `time` et que le passage suivant commence par `time`, appliquer la même règle.
|
||||
|
||||
## Invariants
|
||||
|
||||
- Le réglage ne change jamais les résultats déjà enregistrés.
|
||||
- Le réglage ne crée pas une pause de séance : le temps total de séance continue selon les horodatages de session.
|
||||
- L'état `Chrono suivant prêt` est persistant car représenté par la ligne `ActiveExerciseStepProgressState` en `stoppedTimer` sur la bonne étape/passage.
|
||||
- Les anciens exercices/programmes/templates doivent migrer avec comportement effectif `true`.
|
||||
- Les overrides restent nullable pour permettre les actions UX `Revenir au réglage de l'exercice` et `Revenir au réglage du programme`.
|
||||
|
||||
## Tickets créés
|
||||
|
||||
- #75 `[DevBackend] Modèle et migration pour auto-enchaînement des chronos d'étapes`.
|
||||
- #76 `[DevBackend] Résolution effective et auto-advance des chronos d'étapes`, dépend de #75.
|
||||
- #77 `[DevFrontend] Réglages auto-enchaînement exercice, programme et séance`, dépend de #75.
|
||||
- #78 `[DevFrontend] État d'exécution Chrono suivant prêt`, dépend de #76 et #77.
|
||||
- #79 `[QA] Validation auto-enchaînement configurable des chronos d'étapes`, dépend de #78.
|
||||
|
||||
Ordre recommandé : #75 -> #76 et #77 en parallèle -> #78 -> #79.
|
||||
271
.ideai/memory/gametime-ux-step-chaining-override.md
Normal file
271
.ideai/memory/gametime-ux-step-chaining-override.md
Normal file
@ -0,0 +1,271 @@
|
||||
---
|
||||
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`.
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
issueRef: "#63"
|
||||
version: 8
|
||||
updatedBy: {"kind":"user"}
|
||||
updatedAt: 1784482673684
|
||||
version: 9
|
||||
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
|
||||
updatedAt: 1784533228302
|
||||
---
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
id: "17f54d9f-0317-429d-a275-480966976ced"
|
||||
number: 63
|
||||
title: "Ajouter les features déjà présentes sur le serveur au client"
|
||||
status: "open"
|
||||
status: "qa"
|
||||
priority: "medium"
|
||||
sprint: "4237adfd-91eb-45ff-9f32-6ce1daa39822"
|
||||
links: [{"target":"#57","kind":"dependsOn"},{"target":"#46","kind":"dependsOn"}]
|
||||
agentRefs: [{"agentId":"57695b92-24d0-4876-837c-76116e70a6ae","role":"assigned"}]
|
||||
createdBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"user"}
|
||||
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
|
||||
createdAt: 1784482089895
|
||||
updatedAt: 1784482673684
|
||||
version: 8
|
||||
updatedAt: 1784533228302
|
||||
version: 9
|
||||
---
|
||||
Une première version du serveur est disponible. J'aimerais que les features serveur soient ajouté à l'application (j'entends ici l'ajout de la totalité de la stack de la logique méier comme la sync des historiques etc, à la connexion). Pour la connexion, comme indiqué dans le ticket #57, la connexion n'est pas obligatoire pour l'acces à l'applicaiton, elle ne doit être que optionnelle, je pense entre autre à un menu "Profile" à créer. Le bon fonctionnement de l'application reste prioritaire sur le serveur, à savoir que le serveur sert l'applciation et pas l'inverse, c'est a dire que si une structure de donnée est actuellement différente entre le serveur et l'applciation, alors il faut modifier le serveur pour qu'il accepte la donnée du client. Je pense par exemple aux exercices, entre la création serveur et la réalisation du ticket, je pense que la forme des exercice a été modifiée (ajout entre autre des étapes dans une serie d'un exercice), il faudra alors adapter le serveur à ça.
|
||||
@ -1,6 +1,6 @@
|
||||
---
|
||||
issueRef: "#70"
|
||||
version: 1
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedAt: 1784488373778
|
||||
version: 2
|
||||
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
|
||||
updatedAt: 1784533224103
|
||||
---
|
||||
|
||||
@ -2,15 +2,15 @@
|
||||
id: "cb93ee24-0041-4926-b0c6-3ab26aab46ec"
|
||||
number: 70
|
||||
title: "[QA] Validation client online offline-first"
|
||||
status: "open"
|
||||
status: "qa"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: [{"target":"#63","kind":"relatesTo"},{"target":"#68","kind":"dependsOn"},{"target":"#69","kind":"dependsOn"}]
|
||||
agentRefs: [{"agentId":"7efa512f-3b3a-47b5-ade0-a2dd13073055","role":"assigned"}]
|
||||
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedBy: {"kind":"agent","agent_id":"57695b92-24d0-4876-837c-76116e70a6ae"}
|
||||
createdAt: 1784488373778
|
||||
updatedAt: 1784488373778
|
||||
version: 1
|
||||
updatedAt: 1784533224103
|
||||
version: 2
|
||||
---
|
||||
Valider le chantier client online : app utilisable sans compte, login/register/logout optionnels, tokens persistés, profil cache hors ligne, sync push/pull LWW, erreurs réseau silencieuses, retry différé, partage sortant ciblé, inbox, accept/decline/revoke, import local offline, absence de régression sur les parcours locaux exercices/programmes/séances/historique.
|
||||
6
.ideai/tickets/75/carnet.md
Normal file
6
.ideai/tickets/75/carnet.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
issueRef: "#75"
|
||||
version: 1
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedAt: 1784547220555
|
||||
---
|
||||
16
.ideai/tickets/75/issue.md
Normal file
16
.ideai/tickets/75/issue.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
id: "0197daa2-674e-4b03-9142-d0180874ffc4"
|
||||
number: 75
|
||||
title: "[DevBackend] Modèle et migration pour auto-enchaînement des chronos d'étapes"
|
||||
status: "open"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: [{"target":"#73","kind":"relatesTo"}]
|
||||
agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"}]
|
||||
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
createdAt: 1784547220555
|
||||
updatedAt: 1784547220555
|
||||
version: 1
|
||||
---
|
||||
Ajouter le réglage `autoStartNextTimedStep` côté modèle. Sur `Exercise` : bool non-null par défaut true. Sur `ProgramExercise` : `autoStartNextTimedStepSnapshot` non-null + `autoStartNextTimedStepOverride` nullable pour revenir au réglage exercice snapshoté. Sur `WorkoutTemplateExerciseOverride` : `autoStartNextTimedStepOverride` nullable, décision consciente d'élargir l'override séance à un comportement booléen non structurel. Propager dans `ProgramExerciseConfig`, `_ProgramExerciseDraft`, snapshots JSON et mappers Drift. Migration Drift schemaVersion 13 -> 14 avec defaults true et colonnes nullable d'override.
|
||||
6
.ideai/tickets/76/carnet.md
Normal file
6
.ideai/tickets/76/carnet.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
issueRef: "#76"
|
||||
version: 1
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedAt: 1784547227107
|
||||
---
|
||||
16
.ideai/tickets/76/issue.md
Normal file
16
.ideai/tickets/76/issue.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
id: "8896c34d-bc57-424b-967f-d3ef767185e1"
|
||||
number: 76
|
||||
title: "[DevBackend] Résolution effective et auto-advance des chronos d'étapes"
|
||||
status: "open"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: [{"target":"#73","kind":"relatesTo"},{"target":"#75","kind":"dependsOn"}]
|
||||
agentRefs: [{"agentId":"10ee045b-1c41-479e-ba03-dceed9edd495","role":"assigned"}]
|
||||
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
createdAt: 1784547227107
|
||||
updatedAt: 1784547227107
|
||||
version: 1
|
||||
---
|
||||
Adapter la résolution de séance et `ActiveExerciseStepUseCases` pour appliquer `séance > programme > exercice` à `autoStartNextTimedStep`. Inclure la valeur effective dans le snapshot résolu ou dans `_StepSequenceContext`. Modifier `_advanceState` et `_autoAdvanceElapsedTimers` : si une étape Temps expirée est suivie d'une étape Temps et que la valeur effective est false, enregistrer le résultat de l'étape expirée puis s'arrêter sur l'étape suivante en `stoppedTimer`, sans consommer l'overflow ni démarrer le chrono suivant. Conserver l'auto-enchaînement existant quand true.
|
||||
6
.ideai/tickets/77/carnet.md
Normal file
6
.ideai/tickets/77/carnet.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
issueRef: "#77"
|
||||
version: 1
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedAt: 1784547232756
|
||||
---
|
||||
16
.ideai/tickets/77/issue.md
Normal file
16
.ideai/tickets/77/issue.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
id: "835be070-248f-42fb-b996-4df86445f154"
|
||||
number: 77
|
||||
title: "[DevFrontend] Réglages auto-enchaînement exercice, programme et séance"
|
||||
status: "open"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: [{"target":"#73","kind":"relatesTo"},{"target":"#75","kind":"dependsOn"}]
|
||||
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
|
||||
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
createdAt: 1784547232756
|
||||
updatedAt: 1784547232756
|
||||
version: 1
|
||||
---
|
||||
Ajouter l'UI du réglage `Enchaîner automatiquement les chronos consécutifs` aux trois niveaux : `ExerciseFormScreen` valeur de base visible si séquence activée; `ProgramExerciseCustomizationScreen` override nullable avec indication héritage et action `Revenir au réglage de l'exercice`; `WorkoutTemplateProgramDetailScreen` override nullable avec action `Revenir au réglage du programme`. Attention à propager le champ dans `ProgramExerciseConfig` et `_ProgramExerciseDraft` comme pour `exerciseStepsSnapshot` corrigé au #72.
|
||||
6
.ideai/tickets/78/carnet.md
Normal file
6
.ideai/tickets/78/carnet.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
issueRef: "#78"
|
||||
version: 1
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedAt: 1784547239512
|
||||
---
|
||||
16
.ideai/tickets/78/issue.md
Normal file
16
.ideai/tickets/78/issue.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
id: "e7769413-3d3d-48af-b55e-361c69aef4b2"
|
||||
number: 78
|
||||
title: "[DevFrontend] État d'exécution Chrono suivant prêt"
|
||||
status: "open"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: [{"target":"#73","kind":"relatesTo"},{"target":"#76","kind":"dependsOn"},{"target":"#77","kind":"dependsOn"}]
|
||||
agentRefs: [{"agentId":"9933c93a-b8a1-4164-a3bb-7063fdad747d","role":"assigned"}]
|
||||
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
createdAt: 1784547239512
|
||||
updatedAt: 1784547239512
|
||||
version: 1
|
||||
---
|
||||
Adapter l'écran d'exécution des étapes pour afficher `Chrono suivant prêt` quand une étape Temps est prête après une étape Temps et que l'auto-enchaînement effectif est désactivé. Réutiliser `stoppedTimer` côté domaine; l'UI dérive le libellé/bouton depuis l'étape courante, le résultat précédent et la valeur effective. Bouton `Démarrer le chrono`, pas de pause séance, pas de rouge/erreur. Après kill/reprise, l'écran doit revenir à cet état sans démarrage automatique.
|
||||
6
.ideai/tickets/79/carnet.md
Normal file
6
.ideai/tickets/79/carnet.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
issueRef: "#79"
|
||||
version: 1
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedAt: 1784547247343
|
||||
---
|
||||
16
.ideai/tickets/79/issue.md
Normal file
16
.ideai/tickets/79/issue.md
Normal file
@ -0,0 +1,16 @@
|
||||
---
|
||||
id: "107fc29b-cd1d-40cc-9505-61180d081022"
|
||||
number: 79
|
||||
title: "[QA] Validation auto-enchaînement configurable des chronos d'étapes"
|
||||
status: "open"
|
||||
priority: "medium"
|
||||
sprint: null
|
||||
links: [{"target":"#73","kind":"relatesTo"},{"target":"#78","kind":"dependsOn"}]
|
||||
agentRefs: [{"agentId":"7efa512f-3b3a-47b5-ade0-a2dd13073055","role":"assigned"}]
|
||||
createdBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
updatedBy: {"kind":"agent","agent_id":"f8f40941-ecf7-4830-b9de-8818a099f448"}
|
||||
createdAt: 1784547247343
|
||||
updatedAt: 1784547247343
|
||||
version: 1
|
||||
---
|
||||
Valider le réglage d'auto-enchaînement des chronos d'étapes : défaut true sur anciens/nouveaux exercices, override programme puis séance avec retour héritage, résolution séance > programme > exercice, comportement Temps->Temps true et false, plusieurs chronos consécutifs, fin de passage vers passage suivant, pause/reprise/kill app dans l'état `Chrono suivant prêt`, absence de régression sur étapes répétitions et skips.
|
||||
@ -1,3 +1,3 @@
|
||||
{
|
||||
"nextNumber": 75
|
||||
"nextNumber": 80
|
||||
}
|
||||
@ -703,13 +703,13 @@
|
||||
"issueRef": "#63",
|
||||
"path": "63",
|
||||
"title": "Ajouter les features déjà présentes sur le serveur au client",
|
||||
"status": "open",
|
||||
"status": "qa",
|
||||
"priority": "medium",
|
||||
"sprint": "4237adfd-91eb-45ff-9f32-6ce1daa39822",
|
||||
"assignedAgentIds": [
|
||||
"57695b92-24d0-4876-837c-76116e70a6ae"
|
||||
],
|
||||
"updatedAt": 1784482673684
|
||||
"updatedAt": 1784533228302
|
||||
},
|
||||
{
|
||||
"issueRef": "#64",
|
||||
@ -787,13 +787,13 @@
|
||||
"issueRef": "#70",
|
||||
"path": "70",
|
||||
"title": "[QA] Validation client online offline-first",
|
||||
"status": "open",
|
||||
"status": "qa",
|
||||
"priority": "medium",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"7efa512f-3b3a-47b5-ade0-a2dd13073055"
|
||||
],
|
||||
"updatedAt": 1784488373778
|
||||
"updatedAt": 1784533224103
|
||||
},
|
||||
{
|
||||
"issueRef": "#71",
|
||||
@ -842,6 +842,66 @@
|
||||
"57695b92-24d0-4876-837c-76116e70a6ae"
|
||||
],
|
||||
"updatedAt": 1784526657602
|
||||
},
|
||||
{
|
||||
"issueRef": "#75",
|
||||
"path": "75",
|
||||
"title": "[DevBackend] Modèle et migration pour auto-enchaînement des chronos d'étapes",
|
||||
"status": "open",
|
||||
"priority": "medium",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"10ee045b-1c41-479e-ba03-dceed9edd495"
|
||||
],
|
||||
"updatedAt": 1784547220555
|
||||
},
|
||||
{
|
||||
"issueRef": "#76",
|
||||
"path": "76",
|
||||
"title": "[DevBackend] Résolution effective et auto-advance des chronos d'étapes",
|
||||
"status": "open",
|
||||
"priority": "medium",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"10ee045b-1c41-479e-ba03-dceed9edd495"
|
||||
],
|
||||
"updatedAt": 1784547227107
|
||||
},
|
||||
{
|
||||
"issueRef": "#77",
|
||||
"path": "77",
|
||||
"title": "[DevFrontend] Réglages auto-enchaînement exercice, programme et séance",
|
||||
"status": "open",
|
||||
"priority": "medium",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
|
||||
],
|
||||
"updatedAt": 1784547232756
|
||||
},
|
||||
{
|
||||
"issueRef": "#78",
|
||||
"path": "78",
|
||||
"title": "[DevFrontend] État d'exécution Chrono suivant prêt",
|
||||
"status": "open",
|
||||
"priority": "medium",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"9933c93a-b8a1-4164-a3bb-7063fdad747d"
|
||||
],
|
||||
"updatedAt": 1784547239512
|
||||
},
|
||||
{
|
||||
"issueRef": "#79",
|
||||
"path": "79",
|
||||
"title": "[QA] Validation auto-enchaînement configurable des chronos d'étapes",
|
||||
"status": "open",
|
||||
"priority": "medium",
|
||||
"sprint": null,
|
||||
"assignedAgentIds": [
|
||||
"7efa512f-3b3a-47b5-ade0-a2dd13073055"
|
||||
],
|
||||
"updatedAt": 1784547247343
|
||||
}
|
||||
]
|
||||
}
|
||||
@ -592,6 +592,10 @@ final class ShareUseCases {
|
||||
exerciseStepsSnapshot: _exerciseStepsFromSnapshot(
|
||||
map['exerciseStepsSnapshot'],
|
||||
),
|
||||
autoStartNextTimedStepSnapshot:
|
||||
map['autoStartNextTimedStepSnapshot'] as bool? ?? true,
|
||||
autoStartNextTimedStepOverride:
|
||||
map['autoStartNextTimedStepOverride'] as bool?,
|
||||
exerciseArchivedSnapshot: map['exerciseArchivedSnapshot'] == true,
|
||||
availableTimeSnapshot: map['availableTimeSnapshot'] == true,
|
||||
availableRepsSnapshot: map['availableRepsSnapshot'] == true,
|
||||
@ -733,6 +737,8 @@ final class ShareUseCases {
|
||||
targetRepsOverride: map['targetRepsOverride'] as int?,
|
||||
targetScoreOverride: (map['targetScoreOverride'] as num?)?.toDouble(),
|
||||
targetScoreTimeMsOverride: map['targetScoreTimeMsOverride'] as int?,
|
||||
autoStartNextTimedStepOverride:
|
||||
map['autoStartNextTimedStepOverride'] as bool?,
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -772,6 +778,7 @@ final class ExerciseUseCases {
|
||||
int? defaultTargetReps,
|
||||
double? defaultTargetScore,
|
||||
int? defaultTargetScoreTimeMs,
|
||||
bool autoStartNextTimedStep = true,
|
||||
List<ExerciseStep> steps = const [],
|
||||
}) async {
|
||||
_validateExerciseSteps(steps);
|
||||
@ -803,6 +810,7 @@ final class ExerciseUseCases {
|
||||
defaultTargetReps: defaultTargetReps,
|
||||
defaultTargetScore: defaultTargetScore,
|
||||
defaultTargetScoreTimeMs: defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep: autoStartNextTimedStep,
|
||||
steps: steps,
|
||||
);
|
||||
await repository.save(exercise);
|
||||
@ -835,6 +843,7 @@ final class ExerciseUseCases {
|
||||
Object? defaultTargetReps = _useCaseUnchanged,
|
||||
Object? defaultTargetScore = _useCaseUnchanged,
|
||||
Object? defaultTargetScoreTimeMs = _useCaseUnchanged,
|
||||
bool? autoStartNextTimedStep,
|
||||
Object? steps = _useCaseUnchanged,
|
||||
}) async {
|
||||
final exercise = await repository.findById(id);
|
||||
@ -895,6 +904,7 @@ final class ExerciseUseCases {
|
||||
defaultTargetReps: resolvedDefaultTargetReps,
|
||||
defaultTargetScore: resolvedDefaultTargetScore,
|
||||
defaultTargetScoreTimeMs: resolvedDefaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep: autoStartNextTimedStep,
|
||||
steps: resolvedSteps,
|
||||
);
|
||||
await repository.save(updated);
|
||||
@ -1204,6 +1214,10 @@ final class ProgramUseCases {
|
||||
exerciseImageMediaIdsSnapshot: input.exerciseImageMediaIdsSnapshot,
|
||||
exerciseVideoMediaIdSnapshot: input.exerciseVideoMediaIdSnapshot,
|
||||
exerciseStepsSnapshot: input.exerciseStepsSnapshot,
|
||||
autoStartNextTimedStepSnapshot:
|
||||
input.autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride:
|
||||
input.autoStartNextTimedStepOverride,
|
||||
exerciseArchivedSnapshot: input.exerciseArchivedSnapshot,
|
||||
availableTimeSnapshot: input.availableTimeSnapshot,
|
||||
availableRepsSnapshot: input.availableRepsSnapshot,
|
||||
@ -1322,6 +1336,8 @@ final class ProgramExerciseConfig {
|
||||
this.exerciseImageMediaIdsSnapshot = const [],
|
||||
this.exerciseVideoMediaIdSnapshot,
|
||||
this.exerciseStepsSnapshot = const [],
|
||||
this.autoStartNextTimedStepSnapshot = true,
|
||||
this.autoStartNextTimedStepOverride,
|
||||
this.exerciseArchivedSnapshot = false,
|
||||
required this.availableTimeSnapshot,
|
||||
required this.availableRepsSnapshot,
|
||||
@ -1346,6 +1362,8 @@ final class ProgramExerciseConfig {
|
||||
final List<String> exerciseImageMediaIdsSnapshot;
|
||||
final String? exerciseVideoMediaIdSnapshot;
|
||||
final List<ExerciseStep> exerciseStepsSnapshot;
|
||||
final bool autoStartNextTimedStepSnapshot;
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
final bool exerciseArchivedSnapshot;
|
||||
final bool availableTimeSnapshot;
|
||||
final bool availableRepsSnapshot;
|
||||
@ -1460,6 +1478,8 @@ final class WorkoutTemplateUseCases {
|
||||
targetRepsOverride: input.targetRepsOverride,
|
||||
targetScoreOverride: input.targetScoreOverride,
|
||||
targetScoreTimeMsOverride: input.targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride:
|
||||
input.autoStartNextTimedStepOverride,
|
||||
),
|
||||
);
|
||||
}
|
||||
@ -1502,6 +1522,7 @@ final class WorkoutTemplateUseCases {
|
||||
int? targetRepsOverride,
|
||||
double? targetScoreOverride,
|
||||
int? targetScoreTimeMsOverride,
|
||||
bool? autoStartNextTimedStepOverride,
|
||||
Set<WorkoutMeasure>? attemptedMeasureOverride,
|
||||
}) async {
|
||||
if (attemptedMeasureOverride != null) {
|
||||
@ -1519,6 +1540,7 @@ final class WorkoutTemplateUseCases {
|
||||
targetRepsOverride: targetRepsOverride,
|
||||
targetScoreOverride: targetScoreOverride,
|
||||
targetScoreTimeMsOverride: targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride,
|
||||
);
|
||||
await templateRepository.saveOverride(override);
|
||||
return override;
|
||||
@ -1568,6 +1590,7 @@ final class WorkoutTemplateExerciseOverrideConfig {
|
||||
this.targetRepsOverride,
|
||||
this.targetScoreOverride,
|
||||
this.targetScoreTimeMsOverride,
|
||||
this.autoStartNextTimedStepOverride,
|
||||
});
|
||||
|
||||
final EntityMetadata? existingMetadata;
|
||||
@ -1578,6 +1601,7 @@ final class WorkoutTemplateExerciseOverrideConfig {
|
||||
final int? targetRepsOverride;
|
||||
final double? targetScoreOverride;
|
||||
final int? targetScoreTimeMsOverride;
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
}
|
||||
|
||||
final class ActiveWorkoutSessionUseCases {
|
||||
@ -1635,6 +1659,8 @@ final class ActiveWorkoutSessionUseCases {
|
||||
'targetRepsOverride': override.targetRepsOverride,
|
||||
'targetScoreOverride': override.targetScoreOverride,
|
||||
'targetScoreTimeMsOverride': override.targetScoreTimeMsOverride,
|
||||
'autoStartNextTimedStepOverride':
|
||||
override.autoStartNextTimedStepOverride,
|
||||
},
|
||||
)
|
||||
.toList(),
|
||||
@ -3185,6 +3211,8 @@ Map<String, Object?> _workoutTemplateSharePayload(WorkoutTemplate template) => {
|
||||
'targetRepsOverride': override.targetRepsOverride,
|
||||
'targetScoreOverride': override.targetScoreOverride,
|
||||
'targetScoreTimeMsOverride': override.targetScoreTimeMsOverride,
|
||||
'autoStartNextTimedStepOverride':
|
||||
override.autoStartNextTimedStepOverride,
|
||||
},
|
||||
)
|
||||
.toList(),
|
||||
|
||||
@ -318,6 +318,7 @@ final class Exercise {
|
||||
this.defaultTargetReps,
|
||||
this.defaultTargetScore,
|
||||
this.defaultTargetScoreTimeMs,
|
||||
this.autoStartNextTimedStep = true,
|
||||
List<ExerciseStep> steps = const [],
|
||||
this.archivedAt,
|
||||
}) : name = _nonBlank(name, 'Exercise name'),
|
||||
@ -375,6 +376,7 @@ final class Exercise {
|
||||
final int? defaultTargetReps;
|
||||
final double? defaultTargetScore;
|
||||
final int? defaultTargetScoreTimeMs;
|
||||
final bool autoStartNextTimedStep;
|
||||
final List<ExerciseStep> steps;
|
||||
final DateTime? archivedAt;
|
||||
|
||||
@ -409,6 +411,7 @@ final class Exercise {
|
||||
Object? defaultTargetReps = _unchanged,
|
||||
Object? defaultTargetScore = _unchanged,
|
||||
Object? defaultTargetScoreTimeMs = _unchanged,
|
||||
bool? autoStartNextTimedStep,
|
||||
Object? steps = _unchanged,
|
||||
Object? archivedAt = _unchanged,
|
||||
}) {
|
||||
@ -456,6 +459,8 @@ final class Exercise {
|
||||
defaultTargetScoreTimeMs: defaultTargetScoreTimeMs == _unchanged
|
||||
? this.defaultTargetScoreTimeMs
|
||||
: defaultTargetScoreTimeMs as int?,
|
||||
autoStartNextTimedStep:
|
||||
autoStartNextTimedStep ?? this.autoStartNextTimedStep,
|
||||
steps: steps == _unchanged ? this.steps : steps as List<ExerciseStep>,
|
||||
archivedAt: archivedAt == _unchanged
|
||||
? this.archivedAt
|
||||
@ -562,6 +567,8 @@ final class ProgramExercise {
|
||||
List<String> exerciseImageMediaIdsSnapshot = const [],
|
||||
this.exerciseVideoMediaIdSnapshot,
|
||||
List<ExerciseStep> exerciseStepsSnapshot = const [],
|
||||
this.autoStartNextTimedStepSnapshot = true,
|
||||
this.autoStartNextTimedStepOverride,
|
||||
this.exerciseArchivedSnapshot = false,
|
||||
required this.availableTimeSnapshot,
|
||||
required this.availableRepsSnapshot,
|
||||
@ -628,6 +635,8 @@ final class ProgramExercise {
|
||||
final List<String> exerciseImageMediaIdsSnapshot;
|
||||
final String? exerciseVideoMediaIdSnapshot;
|
||||
final List<ExerciseStep> exerciseStepsSnapshot;
|
||||
final bool autoStartNextTimedStepSnapshot;
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
final bool exerciseArchivedSnapshot;
|
||||
final bool availableTimeSnapshot;
|
||||
final bool availableRepsSnapshot;
|
||||
@ -675,6 +684,7 @@ final class ProgramExercise {
|
||||
exerciseImageMediaIdsSnapshot: exercise.imageMediaIds,
|
||||
exerciseVideoMediaIdSnapshot: exercise.videoMediaId,
|
||||
exerciseStepsSnapshot: exercise.steps,
|
||||
autoStartNextTimedStepSnapshot: exercise.autoStartNextTimedStep,
|
||||
exerciseArchivedSnapshot: exercise.archivedAt != null,
|
||||
availableTimeSnapshot: exercise.hasTimeMeasure,
|
||||
availableRepsSnapshot: exercise.hasRepsMeasure,
|
||||
@ -707,6 +717,8 @@ final class ProgramExercise {
|
||||
'exerciseStepsSnapshot': exerciseStepsSnapshot
|
||||
.map((step) => step.toSnapshotJson())
|
||||
.toList(),
|
||||
'autoStartNextTimedStepSnapshot': autoStartNextTimedStepSnapshot,
|
||||
'autoStartNextTimedStepOverride': autoStartNextTimedStepOverride,
|
||||
'exerciseArchivedSnapshot': exerciseArchivedSnapshot,
|
||||
'availableTimeSnapshot': availableTimeSnapshot,
|
||||
'availableRepsSnapshot': availableRepsSnapshot,
|
||||
@ -802,6 +814,7 @@ final class WorkoutTemplateExerciseOverride {
|
||||
this.targetRepsOverride,
|
||||
this.targetScoreOverride,
|
||||
this.targetScoreTimeMsOverride,
|
||||
this.autoStartNextTimedStepOverride,
|
||||
}) : snapshotProgramExerciseId = _nonBlank(
|
||||
snapshotProgramExerciseId,
|
||||
'Snapshot program exercise id',
|
||||
@ -835,6 +848,7 @@ final class WorkoutTemplateExerciseOverride {
|
||||
final int? targetRepsOverride;
|
||||
final double? targetScoreOverride;
|
||||
final int? targetScoreTimeMsOverride;
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
}
|
||||
|
||||
final class ActiveWorkoutSession {
|
||||
|
||||
@ -46,7 +46,7 @@ final class AppDatabase extends _$AppDatabase {
|
||||
}
|
||||
|
||||
@override
|
||||
int get schemaVersion => 13;
|
||||
int get schemaVersion => 14;
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration {
|
||||
@ -100,6 +100,9 @@ final class AppDatabase extends _$AppDatabase {
|
||||
if (from < 13) {
|
||||
await _migrateToSchema13();
|
||||
}
|
||||
if (from < 14) {
|
||||
await _migrateToSchema14();
|
||||
}
|
||||
await _createIndexes();
|
||||
},
|
||||
beforeOpen: (details) async {
|
||||
@ -469,4 +472,26 @@ FROM exercises
|
||||
await customStatement('ALTER TABLE exercises_new RENAME TO exercises');
|
||||
await customStatement('PRAGMA foreign_keys = ON');
|
||||
}
|
||||
|
||||
Future<void> _migrateToSchema14() async {
|
||||
await customStatement(
|
||||
'ALTER TABLE exercises ADD COLUMN auto_start_next_timed_step '
|
||||
'INTEGER NOT NULL DEFAULT 1 CHECK (auto_start_next_timed_step IN (0, 1))',
|
||||
);
|
||||
await customStatement(
|
||||
'ALTER TABLE program_exercises ADD COLUMN '
|
||||
'auto_start_next_timed_step_snapshot INTEGER NOT NULL DEFAULT 1 '
|
||||
'CHECK (auto_start_next_timed_step_snapshot IN (0, 1))',
|
||||
);
|
||||
await customStatement(
|
||||
'ALTER TABLE program_exercises ADD COLUMN '
|
||||
'auto_start_next_timed_step_override INTEGER '
|
||||
'CHECK (auto_start_next_timed_step_override IN (0, 1))',
|
||||
);
|
||||
await customStatement(
|
||||
'ALTER TABLE workout_template_exercise_overrides ADD COLUMN '
|
||||
'auto_start_next_timed_step_override INTEGER '
|
||||
'CHECK (auto_start_next_timed_step_override IN (0, 1))',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -11542,6 +11542,21 @@ class $ExercisesTable extends Exercises
|
||||
type: DriftSqlType.int,
|
||||
requiredDuringInsert: false,
|
||||
);
|
||||
static const VerificationMeta _autoStartNextTimedStepMeta =
|
||||
const VerificationMeta('autoStartNextTimedStep');
|
||||
@override
|
||||
late final GeneratedColumn<bool> autoStartNextTimedStep =
|
||||
GeneratedColumn<bool>(
|
||||
'auto_start_next_timed_step',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.bool,
|
||||
requiredDuringInsert: false,
|
||||
defaultConstraints: GeneratedColumn.constraintIsAlways(
|
||||
'CHECK ("auto_start_next_timed_step" IN (0, 1))',
|
||||
),
|
||||
defaultValue: const Constant(true),
|
||||
);
|
||||
static const VerificationMeta _archivedAtMeta = const VerificationMeta(
|
||||
'archivedAt',
|
||||
);
|
||||
@ -11580,6 +11595,7 @@ class $ExercisesTable extends Exercises
|
||||
defaultTargetReps,
|
||||
defaultTargetScore,
|
||||
defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep,
|
||||
archivedAt,
|
||||
];
|
||||
@override
|
||||
@ -11812,6 +11828,15 @@ class $ExercisesTable extends Exercises
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('auto_start_next_timed_step')) {
|
||||
context.handle(
|
||||
_autoStartNextTimedStepMeta,
|
||||
autoStartNextTimedStep.isAcceptableOrUnknown(
|
||||
data['auto_start_next_timed_step']!,
|
||||
_autoStartNextTimedStepMeta,
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('archived_at')) {
|
||||
context.handle(
|
||||
_archivedAtMeta,
|
||||
@ -11927,6 +11952,10 @@ class $ExercisesTable extends Exercises
|
||||
DriftSqlType.int,
|
||||
data['${effectivePrefix}default_target_score_time_ms'],
|
||||
),
|
||||
autoStartNextTimedStep: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.bool,
|
||||
data['${effectivePrefix}auto_start_next_timed_step'],
|
||||
)!,
|
||||
archivedAt: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.dateTime,
|
||||
data['${effectivePrefix}archived_at'],
|
||||
@ -11966,6 +11995,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
final int? defaultTargetReps;
|
||||
final double? defaultTargetScore;
|
||||
final int? defaultTargetScoreTimeMs;
|
||||
final bool autoStartNextTimedStep;
|
||||
final DateTime? archivedAt;
|
||||
const Exercise({
|
||||
required this.id,
|
||||
@ -11993,6 +12023,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
this.defaultTargetReps,
|
||||
this.defaultTargetScore,
|
||||
this.defaultTargetScoreTimeMs,
|
||||
required this.autoStartNextTimedStep,
|
||||
this.archivedAt,
|
||||
});
|
||||
@override
|
||||
@ -12053,6 +12084,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
defaultTargetScoreTimeMs,
|
||||
);
|
||||
}
|
||||
map['auto_start_next_timed_step'] = Variable<bool>(autoStartNextTimedStep);
|
||||
if (!nullToAbsent || archivedAt != null) {
|
||||
map['archived_at'] = Variable<DateTime>(archivedAt);
|
||||
}
|
||||
@ -12112,6 +12144,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
defaultTargetScoreTimeMs: defaultTargetScoreTimeMs == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(defaultTargetScoreTimeMs),
|
||||
autoStartNextTimedStep: Value(autoStartNextTimedStep),
|
||||
archivedAt: archivedAt == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(archivedAt),
|
||||
@ -12157,6 +12190,9 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
defaultTargetScoreTimeMs: serializer.fromJson<int?>(
|
||||
json['defaultTargetScoreTimeMs'],
|
||||
),
|
||||
autoStartNextTimedStep: serializer.fromJson<bool>(
|
||||
json['autoStartNextTimedStep'],
|
||||
),
|
||||
archivedAt: serializer.fromJson<DateTime?>(json['archivedAt']),
|
||||
);
|
||||
}
|
||||
@ -12193,6 +12229,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
'defaultTargetScoreTimeMs': serializer.toJson<int?>(
|
||||
defaultTargetScoreTimeMs,
|
||||
),
|
||||
'autoStartNextTimedStep': serializer.toJson<bool>(autoStartNextTimedStep),
|
||||
'archivedAt': serializer.toJson<DateTime?>(archivedAt),
|
||||
};
|
||||
}
|
||||
@ -12223,6 +12260,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
Value<int?> defaultTargetReps = const Value.absent(),
|
||||
Value<double?> defaultTargetScore = const Value.absent(),
|
||||
Value<int?> defaultTargetScoreTimeMs = const Value.absent(),
|
||||
bool? autoStartNextTimedStep,
|
||||
Value<DateTime?> archivedAt = const Value.absent(),
|
||||
}) => Exercise(
|
||||
id: id ?? this.id,
|
||||
@ -12262,6 +12300,8 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
defaultTargetScoreTimeMs: defaultTargetScoreTimeMs.present
|
||||
? defaultTargetScoreTimeMs.value
|
||||
: this.defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep:
|
||||
autoStartNextTimedStep ?? this.autoStartNextTimedStep,
|
||||
archivedAt: archivedAt.present ? archivedAt.value : this.archivedAt,
|
||||
);
|
||||
Exercise copyWithCompanion(ExercisesCompanion data) {
|
||||
@ -12327,6 +12367,9 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
defaultTargetScoreTimeMs: data.defaultTargetScoreTimeMs.present
|
||||
? data.defaultTargetScoreTimeMs.value
|
||||
: this.defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep: data.autoStartNextTimedStep.present
|
||||
? data.autoStartNextTimedStep.value
|
||||
: this.autoStartNextTimedStep,
|
||||
archivedAt: data.archivedAt.present
|
||||
? data.archivedAt.value
|
||||
: this.archivedAt,
|
||||
@ -12361,6 +12404,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
..write('defaultTargetReps: $defaultTargetReps, ')
|
||||
..write('defaultTargetScore: $defaultTargetScore, ')
|
||||
..write('defaultTargetScoreTimeMs: $defaultTargetScoreTimeMs, ')
|
||||
..write('autoStartNextTimedStep: $autoStartNextTimedStep, ')
|
||||
..write('archivedAt: $archivedAt')
|
||||
..write(')'))
|
||||
.toString();
|
||||
@ -12393,6 +12437,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
defaultTargetReps,
|
||||
defaultTargetScore,
|
||||
defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep,
|
||||
archivedAt,
|
||||
]);
|
||||
@override
|
||||
@ -12424,6 +12469,7 @@ class Exercise extends DataClass implements Insertable<Exercise> {
|
||||
other.defaultTargetReps == this.defaultTargetReps &&
|
||||
other.defaultTargetScore == this.defaultTargetScore &&
|
||||
other.defaultTargetScoreTimeMs == this.defaultTargetScoreTimeMs &&
|
||||
other.autoStartNextTimedStep == this.autoStartNextTimedStep &&
|
||||
other.archivedAt == this.archivedAt);
|
||||
}
|
||||
|
||||
@ -12453,6 +12499,7 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
final Value<int?> defaultTargetReps;
|
||||
final Value<double?> defaultTargetScore;
|
||||
final Value<int?> defaultTargetScoreTimeMs;
|
||||
final Value<bool> autoStartNextTimedStep;
|
||||
final Value<DateTime?> archivedAt;
|
||||
final Value<int> rowid;
|
||||
const ExercisesCompanion({
|
||||
@ -12481,6 +12528,7 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
this.defaultTargetReps = const Value.absent(),
|
||||
this.defaultTargetScore = const Value.absent(),
|
||||
this.defaultTargetScoreTimeMs = const Value.absent(),
|
||||
this.autoStartNextTimedStep = const Value.absent(),
|
||||
this.archivedAt = const Value.absent(),
|
||||
this.rowid = const Value.absent(),
|
||||
});
|
||||
@ -12510,6 +12558,7 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
this.defaultTargetReps = const Value.absent(),
|
||||
this.defaultTargetScore = const Value.absent(),
|
||||
this.defaultTargetScoreTimeMs = const Value.absent(),
|
||||
this.autoStartNextTimedStep = const Value.absent(),
|
||||
this.archivedAt = const Value.absent(),
|
||||
this.rowid = const Value.absent(),
|
||||
}) : id = Value(id),
|
||||
@ -12548,6 +12597,7 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
Expression<int>? defaultTargetReps,
|
||||
Expression<double>? defaultTargetScore,
|
||||
Expression<int>? defaultTargetScoreTimeMs,
|
||||
Expression<bool>? autoStartNextTimedStep,
|
||||
Expression<DateTime>? archivedAt,
|
||||
Expression<int>? rowid,
|
||||
}) {
|
||||
@ -12581,6 +12631,8 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
'default_target_score': defaultTargetScore,
|
||||
if (defaultTargetScoreTimeMs != null)
|
||||
'default_target_score_time_ms': defaultTargetScoreTimeMs,
|
||||
if (autoStartNextTimedStep != null)
|
||||
'auto_start_next_timed_step': autoStartNextTimedStep,
|
||||
if (archivedAt != null) 'archived_at': archivedAt,
|
||||
if (rowid != null) 'rowid': rowid,
|
||||
});
|
||||
@ -12612,6 +12664,7 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
Value<int?>? defaultTargetReps,
|
||||
Value<double?>? defaultTargetScore,
|
||||
Value<int?>? defaultTargetScoreTimeMs,
|
||||
Value<bool>? autoStartNextTimedStep,
|
||||
Value<DateTime?>? archivedAt,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
@ -12643,6 +12696,8 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
defaultTargetScore: defaultTargetScore ?? this.defaultTargetScore,
|
||||
defaultTargetScoreTimeMs:
|
||||
defaultTargetScoreTimeMs ?? this.defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep:
|
||||
autoStartNextTimedStep ?? this.autoStartNextTimedStep,
|
||||
archivedAt: archivedAt ?? this.archivedAt,
|
||||
rowid: rowid ?? this.rowid,
|
||||
);
|
||||
@ -12732,6 +12787,11 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
defaultTargetScoreTimeMs.value,
|
||||
);
|
||||
}
|
||||
if (autoStartNextTimedStep.present) {
|
||||
map['auto_start_next_timed_step'] = Variable<bool>(
|
||||
autoStartNextTimedStep.value,
|
||||
);
|
||||
}
|
||||
if (archivedAt.present) {
|
||||
map['archived_at'] = Variable<DateTime>(archivedAt.value);
|
||||
}
|
||||
@ -12769,6 +12829,7 @@ class ExercisesCompanion extends UpdateCompanion<Exercise> {
|
||||
..write('defaultTargetReps: $defaultTargetReps, ')
|
||||
..write('defaultTargetScore: $defaultTargetScore, ')
|
||||
..write('defaultTargetScoreTimeMs: $defaultTargetScoreTimeMs, ')
|
||||
..write('autoStartNextTimedStep: $autoStartNextTimedStep, ')
|
||||
..write('archivedAt: $archivedAt, ')
|
||||
..write('rowid: $rowid')
|
||||
..write(')'))
|
||||
@ -17138,6 +17199,35 @@ class $ProgramExercisesTable extends ProgramExercises
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: false,
|
||||
);
|
||||
static const VerificationMeta _autoStartNextTimedStepSnapshotMeta =
|
||||
const VerificationMeta('autoStartNextTimedStepSnapshot');
|
||||
@override
|
||||
late final GeneratedColumn<bool> autoStartNextTimedStepSnapshot =
|
||||
GeneratedColumn<bool>(
|
||||
'auto_start_next_timed_step_snapshot',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.bool,
|
||||
requiredDuringInsert: false,
|
||||
defaultConstraints: GeneratedColumn.constraintIsAlways(
|
||||
'CHECK ("auto_start_next_timed_step_snapshot" IN (0, 1))',
|
||||
),
|
||||
defaultValue: const Constant(true),
|
||||
);
|
||||
static const VerificationMeta _autoStartNextTimedStepOverrideMeta =
|
||||
const VerificationMeta('autoStartNextTimedStepOverride');
|
||||
@override
|
||||
late final GeneratedColumn<bool> autoStartNextTimedStepOverride =
|
||||
GeneratedColumn<bool>(
|
||||
'auto_start_next_timed_step_override',
|
||||
aliasedName,
|
||||
true,
|
||||
type: DriftSqlType.bool,
|
||||
requiredDuringInsert: false,
|
||||
defaultConstraints: GeneratedColumn.constraintIsAlways(
|
||||
'CHECK ("auto_start_next_timed_step_override" IN (0, 1))',
|
||||
),
|
||||
);
|
||||
static const VerificationMeta _exerciseVideoMediaIdSnapshotMeta =
|
||||
const VerificationMeta('exerciseVideoMediaIdSnapshot');
|
||||
@override
|
||||
@ -17372,6 +17462,8 @@ class $ProgramExercisesTable extends ProgramExercises
|
||||
exerciseImageMediaIdSnapshot,
|
||||
exerciseImageMediaIdsSnapshotJson,
|
||||
exerciseStepsSnapshotJson,
|
||||
autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot,
|
||||
exerciseArchivedSnapshot,
|
||||
availableTimeSnapshot,
|
||||
@ -17567,6 +17659,24 @@ class $ProgramExercisesTable extends ProgramExercises
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('auto_start_next_timed_step_snapshot')) {
|
||||
context.handle(
|
||||
_autoStartNextTimedStepSnapshotMeta,
|
||||
autoStartNextTimedStepSnapshot.isAcceptableOrUnknown(
|
||||
data['auto_start_next_timed_step_snapshot']!,
|
||||
_autoStartNextTimedStepSnapshotMeta,
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('auto_start_next_timed_step_override')) {
|
||||
context.handle(
|
||||
_autoStartNextTimedStepOverrideMeta,
|
||||
autoStartNextTimedStepOverride.isAcceptableOrUnknown(
|
||||
data['auto_start_next_timed_step_override']!,
|
||||
_autoStartNextTimedStepOverrideMeta,
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('exercise_video_media_id_snapshot')) {
|
||||
context.handle(
|
||||
_exerciseVideoMediaIdSnapshotMeta,
|
||||
@ -17813,6 +17923,14 @@ class $ProgramExercisesTable extends ProgramExercises
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}exercise_steps_snapshot_json'],
|
||||
),
|
||||
autoStartNextTimedStepSnapshot: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.bool,
|
||||
data['${effectivePrefix}auto_start_next_timed_step_snapshot'],
|
||||
)!,
|
||||
autoStartNextTimedStepOverride: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.bool,
|
||||
data['${effectivePrefix}auto_start_next_timed_step_override'],
|
||||
),
|
||||
exerciseVideoMediaIdSnapshot: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}exercise_video_media_id_snapshot'],
|
||||
@ -17910,6 +18028,8 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
final String? exerciseImageMediaIdSnapshot;
|
||||
final String? exerciseImageMediaIdsSnapshotJson;
|
||||
final String? exerciseStepsSnapshotJson;
|
||||
final bool autoStartNextTimedStepSnapshot;
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
final String? exerciseVideoMediaIdSnapshot;
|
||||
final bool exerciseArchivedSnapshot;
|
||||
final bool availableTimeSnapshot;
|
||||
@ -17947,6 +18067,8 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
this.exerciseImageMediaIdSnapshot,
|
||||
this.exerciseImageMediaIdsSnapshotJson,
|
||||
this.exerciseStepsSnapshotJson,
|
||||
required this.autoStartNextTimedStepSnapshot,
|
||||
this.autoStartNextTimedStepOverride,
|
||||
this.exerciseVideoMediaIdSnapshot,
|
||||
required this.exerciseArchivedSnapshot,
|
||||
required this.availableTimeSnapshot,
|
||||
@ -18013,6 +18135,14 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
exerciseStepsSnapshotJson,
|
||||
);
|
||||
}
|
||||
map['auto_start_next_timed_step_snapshot'] = Variable<bool>(
|
||||
autoStartNextTimedStepSnapshot,
|
||||
);
|
||||
if (!nullToAbsent || autoStartNextTimedStepOverride != null) {
|
||||
map['auto_start_next_timed_step_override'] = Variable<bool>(
|
||||
autoStartNextTimedStepOverride,
|
||||
);
|
||||
}
|
||||
if (!nullToAbsent || exerciseVideoMediaIdSnapshot != null) {
|
||||
map['exercise_video_media_id_snapshot'] = Variable<String>(
|
||||
exerciseVideoMediaIdSnapshot,
|
||||
@ -18096,6 +18226,11 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
exerciseStepsSnapshotJson == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(exerciseStepsSnapshotJson),
|
||||
autoStartNextTimedStepSnapshot: Value(autoStartNextTimedStepSnapshot),
|
||||
autoStartNextTimedStepOverride:
|
||||
autoStartNextTimedStepOverride == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(autoStartNextTimedStepOverride),
|
||||
exerciseVideoMediaIdSnapshot:
|
||||
exerciseVideoMediaIdSnapshot == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
@ -18170,6 +18305,12 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
exerciseStepsSnapshotJson: serializer.fromJson<String?>(
|
||||
json['exerciseStepsSnapshotJson'],
|
||||
),
|
||||
autoStartNextTimedStepSnapshot: serializer.fromJson<bool>(
|
||||
json['autoStartNextTimedStepSnapshot'],
|
||||
),
|
||||
autoStartNextTimedStepOverride: serializer.fromJson<bool?>(
|
||||
json['autoStartNextTimedStepOverride'],
|
||||
),
|
||||
exerciseVideoMediaIdSnapshot: serializer.fromJson<String?>(
|
||||
json['exerciseVideoMediaIdSnapshot'],
|
||||
),
|
||||
@ -18238,6 +18379,12 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
'exerciseStepsSnapshotJson': serializer.toJson<String?>(
|
||||
exerciseStepsSnapshotJson,
|
||||
),
|
||||
'autoStartNextTimedStepSnapshot': serializer.toJson<bool>(
|
||||
autoStartNextTimedStepSnapshot,
|
||||
),
|
||||
'autoStartNextTimedStepOverride': serializer.toJson<bool?>(
|
||||
autoStartNextTimedStepOverride,
|
||||
),
|
||||
'exerciseVideoMediaIdSnapshot': serializer.toJson<String?>(
|
||||
exerciseVideoMediaIdSnapshot,
|
||||
),
|
||||
@ -18284,6 +18431,8 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
Value<String?> exerciseImageMediaIdSnapshot = const Value.absent(),
|
||||
Value<String?> exerciseImageMediaIdsSnapshotJson = const Value.absent(),
|
||||
Value<String?> exerciseStepsSnapshotJson = const Value.absent(),
|
||||
bool? autoStartNextTimedStepSnapshot,
|
||||
Value<bool?> autoStartNextTimedStepOverride = const Value.absent(),
|
||||
Value<String?> exerciseVideoMediaIdSnapshot = const Value.absent(),
|
||||
bool? exerciseArchivedSnapshot,
|
||||
bool? availableTimeSnapshot,
|
||||
@ -18335,6 +18484,11 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
exerciseStepsSnapshotJson: exerciseStepsSnapshotJson.present
|
||||
? exerciseStepsSnapshotJson.value
|
||||
: this.exerciseStepsSnapshotJson,
|
||||
autoStartNextTimedStepSnapshot:
|
||||
autoStartNextTimedStepSnapshot ?? this.autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride.present
|
||||
? autoStartNextTimedStepOverride.value
|
||||
: this.autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot: exerciseVideoMediaIdSnapshot.present
|
||||
? exerciseVideoMediaIdSnapshot.value
|
||||
: this.exerciseVideoMediaIdSnapshot,
|
||||
@ -18414,6 +18568,14 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
exerciseStepsSnapshotJson: data.exerciseStepsSnapshotJson.present
|
||||
? data.exerciseStepsSnapshotJson.value
|
||||
: this.exerciseStepsSnapshotJson,
|
||||
autoStartNextTimedStepSnapshot:
|
||||
data.autoStartNextTimedStepSnapshot.present
|
||||
? data.autoStartNextTimedStepSnapshot.value
|
||||
: this.autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride:
|
||||
data.autoStartNextTimedStepOverride.present
|
||||
? data.autoStartNextTimedStepOverride.value
|
||||
: this.autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot: data.exerciseVideoMediaIdSnapshot.present
|
||||
? data.exerciseVideoMediaIdSnapshot.value
|
||||
: this.exerciseVideoMediaIdSnapshot,
|
||||
@ -18492,6 +18654,12 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
'exerciseImageMediaIdsSnapshotJson: $exerciseImageMediaIdsSnapshotJson, ',
|
||||
)
|
||||
..write('exerciseStepsSnapshotJson: $exerciseStepsSnapshotJson, ')
|
||||
..write(
|
||||
'autoStartNextTimedStepSnapshot: $autoStartNextTimedStepSnapshot, ',
|
||||
)
|
||||
..write(
|
||||
'autoStartNextTimedStepOverride: $autoStartNextTimedStepOverride, ',
|
||||
)
|
||||
..write(
|
||||
'exerciseVideoMediaIdSnapshot: $exerciseVideoMediaIdSnapshot, ',
|
||||
)
|
||||
@ -18536,6 +18704,8 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
exerciseImageMediaIdSnapshot,
|
||||
exerciseImageMediaIdsSnapshotJson,
|
||||
exerciseStepsSnapshotJson,
|
||||
autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot,
|
||||
exerciseArchivedSnapshot,
|
||||
availableTimeSnapshot,
|
||||
@ -18580,6 +18750,10 @@ class ProgramExercise extends DataClass implements Insertable<ProgramExercise> {
|
||||
other.exerciseImageMediaIdsSnapshotJson ==
|
||||
this.exerciseImageMediaIdsSnapshotJson &&
|
||||
other.exerciseStepsSnapshotJson == this.exerciseStepsSnapshotJson &&
|
||||
other.autoStartNextTimedStepSnapshot ==
|
||||
this.autoStartNextTimedStepSnapshot &&
|
||||
other.autoStartNextTimedStepOverride ==
|
||||
this.autoStartNextTimedStepOverride &&
|
||||
other.exerciseVideoMediaIdSnapshot ==
|
||||
this.exerciseVideoMediaIdSnapshot &&
|
||||
other.exerciseArchivedSnapshot == this.exerciseArchivedSnapshot &&
|
||||
@ -18620,6 +18794,8 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
final Value<String?> exerciseImageMediaIdSnapshot;
|
||||
final Value<String?> exerciseImageMediaIdsSnapshotJson;
|
||||
final Value<String?> exerciseStepsSnapshotJson;
|
||||
final Value<bool> autoStartNextTimedStepSnapshot;
|
||||
final Value<bool?> autoStartNextTimedStepOverride;
|
||||
final Value<String?> exerciseVideoMediaIdSnapshot;
|
||||
final Value<bool> exerciseArchivedSnapshot;
|
||||
final Value<bool> availableTimeSnapshot;
|
||||
@ -18658,6 +18834,8 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
this.exerciseImageMediaIdSnapshot = const Value.absent(),
|
||||
this.exerciseImageMediaIdsSnapshotJson = const Value.absent(),
|
||||
this.exerciseStepsSnapshotJson = const Value.absent(),
|
||||
this.autoStartNextTimedStepSnapshot = const Value.absent(),
|
||||
this.autoStartNextTimedStepOverride = const Value.absent(),
|
||||
this.exerciseVideoMediaIdSnapshot = const Value.absent(),
|
||||
this.exerciseArchivedSnapshot = const Value.absent(),
|
||||
this.availableTimeSnapshot = const Value.absent(),
|
||||
@ -18697,6 +18875,8 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
this.exerciseImageMediaIdSnapshot = const Value.absent(),
|
||||
this.exerciseImageMediaIdsSnapshotJson = const Value.absent(),
|
||||
this.exerciseStepsSnapshotJson = const Value.absent(),
|
||||
this.autoStartNextTimedStepSnapshot = const Value.absent(),
|
||||
this.autoStartNextTimedStepOverride = const Value.absent(),
|
||||
this.exerciseVideoMediaIdSnapshot = const Value.absent(),
|
||||
this.exerciseArchivedSnapshot = const Value.absent(),
|
||||
required bool availableTimeSnapshot,
|
||||
@ -18751,6 +18931,8 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
Expression<String>? exerciseImageMediaIdSnapshot,
|
||||
Expression<String>? exerciseImageMediaIdsSnapshotJson,
|
||||
Expression<String>? exerciseStepsSnapshotJson,
|
||||
Expression<bool>? autoStartNextTimedStepSnapshot,
|
||||
Expression<bool>? autoStartNextTimedStepOverride,
|
||||
Expression<String>? exerciseVideoMediaIdSnapshot,
|
||||
Expression<bool>? exerciseArchivedSnapshot,
|
||||
Expression<bool>? availableTimeSnapshot,
|
||||
@ -18797,6 +18979,10 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
exerciseImageMediaIdsSnapshotJson,
|
||||
if (exerciseStepsSnapshotJson != null)
|
||||
'exercise_steps_snapshot_json': exerciseStepsSnapshotJson,
|
||||
if (autoStartNextTimedStepSnapshot != null)
|
||||
'auto_start_next_timed_step_snapshot': autoStartNextTimedStepSnapshot,
|
||||
if (autoStartNextTimedStepOverride != null)
|
||||
'auto_start_next_timed_step_override': autoStartNextTimedStepOverride,
|
||||
if (exerciseVideoMediaIdSnapshot != null)
|
||||
'exercise_video_media_id_snapshot': exerciseVideoMediaIdSnapshot,
|
||||
if (exerciseArchivedSnapshot != null)
|
||||
@ -18846,6 +19032,8 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
Value<String?>? exerciseImageMediaIdSnapshot,
|
||||
Value<String?>? exerciseImageMediaIdsSnapshotJson,
|
||||
Value<String?>? exerciseStepsSnapshotJson,
|
||||
Value<bool>? autoStartNextTimedStepSnapshot,
|
||||
Value<bool?>? autoStartNextTimedStepOverride,
|
||||
Value<String?>? exerciseVideoMediaIdSnapshot,
|
||||
Value<bool>? exerciseArchivedSnapshot,
|
||||
Value<bool>? availableTimeSnapshot,
|
||||
@ -18890,6 +19078,10 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
this.exerciseImageMediaIdsSnapshotJson,
|
||||
exerciseStepsSnapshotJson:
|
||||
exerciseStepsSnapshotJson ?? this.exerciseStepsSnapshotJson,
|
||||
autoStartNextTimedStepSnapshot:
|
||||
autoStartNextTimedStepSnapshot ?? this.autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride:
|
||||
autoStartNextTimedStepOverride ?? this.autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot:
|
||||
exerciseVideoMediaIdSnapshot ?? this.exerciseVideoMediaIdSnapshot,
|
||||
exerciseArchivedSnapshot:
|
||||
@ -18989,6 +19181,16 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
exerciseStepsSnapshotJson.value,
|
||||
);
|
||||
}
|
||||
if (autoStartNextTimedStepSnapshot.present) {
|
||||
map['auto_start_next_timed_step_snapshot'] = Variable<bool>(
|
||||
autoStartNextTimedStepSnapshot.value,
|
||||
);
|
||||
}
|
||||
if (autoStartNextTimedStepOverride.present) {
|
||||
map['auto_start_next_timed_step_override'] = Variable<bool>(
|
||||
autoStartNextTimedStepOverride.value,
|
||||
);
|
||||
}
|
||||
if (exerciseVideoMediaIdSnapshot.present) {
|
||||
map['exercise_video_media_id_snapshot'] = Variable<String>(
|
||||
exerciseVideoMediaIdSnapshot.value,
|
||||
@ -19084,6 +19286,12 @@ class ProgramExercisesCompanion extends UpdateCompanion<ProgramExercise> {
|
||||
'exerciseImageMediaIdsSnapshotJson: $exerciseImageMediaIdsSnapshotJson, ',
|
||||
)
|
||||
..write('exerciseStepsSnapshotJson: $exerciseStepsSnapshotJson, ')
|
||||
..write(
|
||||
'autoStartNextTimedStepSnapshot: $autoStartNextTimedStepSnapshot, ',
|
||||
)
|
||||
..write(
|
||||
'autoStartNextTimedStepOverride: $autoStartNextTimedStepOverride, ',
|
||||
)
|
||||
..write(
|
||||
'exerciseVideoMediaIdSnapshot: $exerciseVideoMediaIdSnapshot, ',
|
||||
)
|
||||
@ -27197,6 +27405,20 @@ class $WorkoutTemplateExerciseOverridesTable
|
||||
type: DriftSqlType.int,
|
||||
requiredDuringInsert: false,
|
||||
);
|
||||
static const VerificationMeta _autoStartNextTimedStepOverrideMeta =
|
||||
const VerificationMeta('autoStartNextTimedStepOverride');
|
||||
@override
|
||||
late final GeneratedColumn<bool> autoStartNextTimedStepOverride =
|
||||
GeneratedColumn<bool>(
|
||||
'auto_start_next_timed_step_override',
|
||||
aliasedName,
|
||||
true,
|
||||
type: DriftSqlType.bool,
|
||||
requiredDuringInsert: false,
|
||||
defaultConstraints: GeneratedColumn.constraintIsAlways(
|
||||
'CHECK ("auto_start_next_timed_step_override" IN (0, 1))',
|
||||
),
|
||||
);
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [
|
||||
id,
|
||||
@ -27217,6 +27439,7 @@ class $WorkoutTemplateExerciseOverridesTable
|
||||
targetRepsOverride,
|
||||
targetScoreOverride,
|
||||
targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride,
|
||||
];
|
||||
@override
|
||||
String get aliasedName => _alias ?? actualTableName;
|
||||
@ -27390,6 +27613,15 @@ class $WorkoutTemplateExerciseOverridesTable
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('auto_start_next_timed_step_override')) {
|
||||
context.handle(
|
||||
_autoStartNextTimedStepOverrideMeta,
|
||||
autoStartNextTimedStepOverride.isAcceptableOrUnknown(
|
||||
data['auto_start_next_timed_step_override']!,
|
||||
_autoStartNextTimedStepOverrideMeta,
|
||||
),
|
||||
);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
@ -27474,6 +27706,10 @@ class $WorkoutTemplateExerciseOverridesTable
|
||||
DriftSqlType.int,
|
||||
data['${effectivePrefix}target_score_time_ms_override'],
|
||||
),
|
||||
autoStartNextTimedStepOverride: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.bool,
|
||||
data['${effectivePrefix}auto_start_next_timed_step_override'],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -27503,6 +27739,7 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
final int? targetRepsOverride;
|
||||
final double? targetScoreOverride;
|
||||
final int? targetScoreTimeMsOverride;
|
||||
final bool? autoStartNextTimedStepOverride;
|
||||
const WorkoutTemplateExerciseOverride({
|
||||
required this.id,
|
||||
required this.createdAt,
|
||||
@ -27522,6 +27759,7 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
this.targetRepsOverride,
|
||||
this.targetScoreOverride,
|
||||
this.targetScoreTimeMsOverride,
|
||||
this.autoStartNextTimedStepOverride,
|
||||
});
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
@ -27570,6 +27808,11 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
targetScoreTimeMsOverride,
|
||||
);
|
||||
}
|
||||
if (!nullToAbsent || autoStartNextTimedStepOverride != null) {
|
||||
map['auto_start_next_timed_step_override'] = Variable<bool>(
|
||||
autoStartNextTimedStepOverride,
|
||||
);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@ -27613,6 +27856,10 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
targetScoreTimeMsOverride == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(targetScoreTimeMsOverride),
|
||||
autoStartNextTimedStepOverride:
|
||||
autoStartNextTimedStepOverride == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(autoStartNextTimedStepOverride),
|
||||
);
|
||||
}
|
||||
|
||||
@ -27652,6 +27899,9 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
targetScoreTimeMsOverride: serializer.fromJson<int?>(
|
||||
json['targetScoreTimeMsOverride'],
|
||||
),
|
||||
autoStartNextTimedStepOverride: serializer.fromJson<bool?>(
|
||||
json['autoStartNextTimedStepOverride'],
|
||||
),
|
||||
);
|
||||
}
|
||||
@override
|
||||
@ -27684,6 +27934,9 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
'targetScoreTimeMsOverride': serializer.toJson<int?>(
|
||||
targetScoreTimeMsOverride,
|
||||
),
|
||||
'autoStartNextTimedStepOverride': serializer.toJson<bool?>(
|
||||
autoStartNextTimedStepOverride,
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
@ -27706,6 +27959,7 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
Value<int?> targetRepsOverride = const Value.absent(),
|
||||
Value<double?> targetScoreOverride = const Value.absent(),
|
||||
Value<int?> targetScoreTimeMsOverride = const Value.absent(),
|
||||
Value<bool?> autoStartNextTimedStepOverride = const Value.absent(),
|
||||
}) => WorkoutTemplateExerciseOverride(
|
||||
id: id ?? this.id,
|
||||
createdAt: createdAt ?? this.createdAt,
|
||||
@ -27741,6 +27995,9 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
targetScoreTimeMsOverride: targetScoreTimeMsOverride.present
|
||||
? targetScoreTimeMsOverride.value
|
||||
: this.targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride.present
|
||||
? autoStartNextTimedStepOverride.value
|
||||
: this.autoStartNextTimedStepOverride,
|
||||
);
|
||||
WorkoutTemplateExerciseOverride copyWithCompanion(
|
||||
WorkoutTemplateExerciseOverridesCompanion data,
|
||||
@ -27790,6 +28047,10 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
targetScoreTimeMsOverride: data.targetScoreTimeMsOverride.present
|
||||
? data.targetScoreTimeMsOverride.value
|
||||
: this.targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride:
|
||||
data.autoStartNextTimedStepOverride.present
|
||||
? data.autoStartNextTimedStepOverride.value
|
||||
: this.autoStartNextTimedStepOverride,
|
||||
);
|
||||
}
|
||||
|
||||
@ -27813,7 +28074,10 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
..write('targetTimeSecondsOverride: $targetTimeSecondsOverride, ')
|
||||
..write('targetRepsOverride: $targetRepsOverride, ')
|
||||
..write('targetScoreOverride: $targetScoreOverride, ')
|
||||
..write('targetScoreTimeMsOverride: $targetScoreTimeMsOverride')
|
||||
..write('targetScoreTimeMsOverride: $targetScoreTimeMsOverride, ')
|
||||
..write(
|
||||
'autoStartNextTimedStepOverride: $autoStartNextTimedStepOverride',
|
||||
)
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
@ -27838,6 +28102,7 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
targetRepsOverride,
|
||||
targetScoreOverride,
|
||||
targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride,
|
||||
);
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
@ -27860,7 +28125,9 @@ class WorkoutTemplateExerciseOverride extends DataClass
|
||||
other.targetTimeSecondsOverride == this.targetTimeSecondsOverride &&
|
||||
other.targetRepsOverride == this.targetRepsOverride &&
|
||||
other.targetScoreOverride == this.targetScoreOverride &&
|
||||
other.targetScoreTimeMsOverride == this.targetScoreTimeMsOverride);
|
||||
other.targetScoreTimeMsOverride == this.targetScoreTimeMsOverride &&
|
||||
other.autoStartNextTimedStepOverride ==
|
||||
this.autoStartNextTimedStepOverride);
|
||||
}
|
||||
|
||||
class WorkoutTemplateExerciseOverridesCompanion
|
||||
@ -27883,6 +28150,7 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
final Value<int?> targetRepsOverride;
|
||||
final Value<double?> targetScoreOverride;
|
||||
final Value<int?> targetScoreTimeMsOverride;
|
||||
final Value<bool?> autoStartNextTimedStepOverride;
|
||||
final Value<int> rowid;
|
||||
const WorkoutTemplateExerciseOverridesCompanion({
|
||||
this.id = const Value.absent(),
|
||||
@ -27903,6 +28171,7 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
this.targetRepsOverride = const Value.absent(),
|
||||
this.targetScoreOverride = const Value.absent(),
|
||||
this.targetScoreTimeMsOverride = const Value.absent(),
|
||||
this.autoStartNextTimedStepOverride = const Value.absent(),
|
||||
this.rowid = const Value.absent(),
|
||||
});
|
||||
WorkoutTemplateExerciseOverridesCompanion.insert({
|
||||
@ -27924,6 +28193,7 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
this.targetRepsOverride = const Value.absent(),
|
||||
this.targetScoreOverride = const Value.absent(),
|
||||
this.targetScoreTimeMsOverride = const Value.absent(),
|
||||
this.autoStartNextTimedStepOverride = const Value.absent(),
|
||||
this.rowid = const Value.absent(),
|
||||
}) : id = Value(id),
|
||||
createdAt = Value(createdAt),
|
||||
@ -27952,6 +28222,7 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
Expression<int>? targetRepsOverride,
|
||||
Expression<double>? targetScoreOverride,
|
||||
Expression<int>? targetScoreTimeMsOverride,
|
||||
Expression<bool>? autoStartNextTimedStepOverride,
|
||||
Expression<int>? rowid,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
@ -27980,6 +28251,8 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
'target_score_override': targetScoreOverride,
|
||||
if (targetScoreTimeMsOverride != null)
|
||||
'target_score_time_ms_override': targetScoreTimeMsOverride,
|
||||
if (autoStartNextTimedStepOverride != null)
|
||||
'auto_start_next_timed_step_override': autoStartNextTimedStepOverride,
|
||||
if (rowid != null) 'rowid': rowid,
|
||||
});
|
||||
}
|
||||
@ -28003,6 +28276,7 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
Value<int?>? targetRepsOverride,
|
||||
Value<double?>? targetScoreOverride,
|
||||
Value<int?>? targetScoreTimeMsOverride,
|
||||
Value<bool?>? autoStartNextTimedStepOverride,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
return WorkoutTemplateExerciseOverridesCompanion(
|
||||
@ -28028,6 +28302,8 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
targetScoreOverride: targetScoreOverride ?? this.targetScoreOverride,
|
||||
targetScoreTimeMsOverride:
|
||||
targetScoreTimeMsOverride ?? this.targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride:
|
||||
autoStartNextTimedStepOverride ?? this.autoStartNextTimedStepOverride,
|
||||
rowid: rowid ?? this.rowid,
|
||||
);
|
||||
}
|
||||
@ -28101,6 +28377,11 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
targetScoreTimeMsOverride.value,
|
||||
);
|
||||
}
|
||||
if (autoStartNextTimedStepOverride.present) {
|
||||
map['auto_start_next_timed_step_override'] = Variable<bool>(
|
||||
autoStartNextTimedStepOverride.value,
|
||||
);
|
||||
}
|
||||
if (rowid.present) {
|
||||
map['rowid'] = Variable<int>(rowid.value);
|
||||
}
|
||||
@ -28128,6 +28409,9 @@ class WorkoutTemplateExerciseOverridesCompanion
|
||||
..write('targetRepsOverride: $targetRepsOverride, ')
|
||||
..write('targetScoreOverride: $targetScoreOverride, ')
|
||||
..write('targetScoreTimeMsOverride: $targetScoreTimeMsOverride, ')
|
||||
..write(
|
||||
'autoStartNextTimedStepOverride: $autoStartNextTimedStepOverride, ',
|
||||
)
|
||||
..write('rowid: $rowid')
|
||||
..write(')'))
|
||||
.toString();
|
||||
@ -35424,6 +35708,7 @@ typedef $$ExercisesTableCreateCompanionBuilder =
|
||||
Value<int?> defaultTargetReps,
|
||||
Value<double?> defaultTargetScore,
|
||||
Value<int?> defaultTargetScoreTimeMs,
|
||||
Value<bool> autoStartNextTimedStep,
|
||||
Value<DateTime?> archivedAt,
|
||||
Value<int> rowid,
|
||||
});
|
||||
@ -35454,6 +35739,7 @@ typedef $$ExercisesTableUpdateCompanionBuilder =
|
||||
Value<int?> defaultTargetReps,
|
||||
Value<double?> defaultTargetScore,
|
||||
Value<int?> defaultTargetScoreTimeMs,
|
||||
Value<bool> autoStartNextTimedStep,
|
||||
Value<DateTime?> archivedAt,
|
||||
Value<int> rowid,
|
||||
});
|
||||
@ -35677,6 +35963,11 @@ class $$ExercisesTableFilterComposer
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<bool> get autoStartNextTimedStep => $composableBuilder(
|
||||
column: $table.autoStartNextTimedStep,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<DateTime> get archivedAt => $composableBuilder(
|
||||
column: $table.archivedAt,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
@ -35928,6 +36219,11 @@ class $$ExercisesTableOrderingComposer
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<bool> get autoStartNextTimedStep => $composableBuilder(
|
||||
column: $table.autoStartNextTimedStep,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<DateTime> get archivedAt => $composableBuilder(
|
||||
column: $table.archivedAt,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
@ -36090,6 +36386,11 @@ class $$ExercisesTableAnnotationComposer
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<bool> get autoStartNextTimedStep => $composableBuilder(
|
||||
column: $table.autoStartNextTimedStep,
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<DateTime> get archivedAt => $composableBuilder(
|
||||
column: $table.archivedAt,
|
||||
builder: (column) => column,
|
||||
@ -36276,6 +36577,7 @@ class $$ExercisesTableTableManager
|
||||
Value<int?> defaultTargetReps = const Value.absent(),
|
||||
Value<double?> defaultTargetScore = const Value.absent(),
|
||||
Value<int?> defaultTargetScoreTimeMs = const Value.absent(),
|
||||
Value<bool> autoStartNextTimedStep = const Value.absent(),
|
||||
Value<DateTime?> archivedAt = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ExercisesCompanion(
|
||||
@ -36304,6 +36606,7 @@ class $$ExercisesTableTableManager
|
||||
defaultTargetReps: defaultTargetReps,
|
||||
defaultTargetScore: defaultTargetScore,
|
||||
defaultTargetScoreTimeMs: defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep: autoStartNextTimedStep,
|
||||
archivedAt: archivedAt,
|
||||
rowid: rowid,
|
||||
),
|
||||
@ -36334,6 +36637,7 @@ class $$ExercisesTableTableManager
|
||||
Value<int?> defaultTargetReps = const Value.absent(),
|
||||
Value<double?> defaultTargetScore = const Value.absent(),
|
||||
Value<int?> defaultTargetScoreTimeMs = const Value.absent(),
|
||||
Value<bool> autoStartNextTimedStep = const Value.absent(),
|
||||
Value<DateTime?> archivedAt = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => ExercisesCompanion.insert(
|
||||
@ -36362,6 +36666,7 @@ class $$ExercisesTableTableManager
|
||||
defaultTargetReps: defaultTargetReps,
|
||||
defaultTargetScore: defaultTargetScore,
|
||||
defaultTargetScoreTimeMs: defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep: autoStartNextTimedStep,
|
||||
archivedAt: archivedAt,
|
||||
rowid: rowid,
|
||||
),
|
||||
@ -39001,6 +39306,8 @@ typedef $$ProgramExercisesTableCreateCompanionBuilder =
|
||||
Value<String?> exerciseImageMediaIdSnapshot,
|
||||
Value<String?> exerciseImageMediaIdsSnapshotJson,
|
||||
Value<String?> exerciseStepsSnapshotJson,
|
||||
Value<bool> autoStartNextTimedStepSnapshot,
|
||||
Value<bool?> autoStartNextTimedStepOverride,
|
||||
Value<String?> exerciseVideoMediaIdSnapshot,
|
||||
Value<bool> exerciseArchivedSnapshot,
|
||||
required bool availableTimeSnapshot,
|
||||
@ -39041,6 +39348,8 @@ typedef $$ProgramExercisesTableUpdateCompanionBuilder =
|
||||
Value<String?> exerciseImageMediaIdSnapshot,
|
||||
Value<String?> exerciseImageMediaIdsSnapshotJson,
|
||||
Value<String?> exerciseStepsSnapshotJson,
|
||||
Value<bool> autoStartNextTimedStepSnapshot,
|
||||
Value<bool?> autoStartNextTimedStepOverride,
|
||||
Value<String?> exerciseVideoMediaIdSnapshot,
|
||||
Value<bool> exerciseArchivedSnapshot,
|
||||
Value<bool> availableTimeSnapshot,
|
||||
@ -39240,6 +39549,16 @@ class $$ProgramExercisesTableFilterComposer
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<bool> get autoStartNextTimedStepSnapshot => $composableBuilder(
|
||||
column: $table.autoStartNextTimedStepSnapshot,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<bool> get autoStartNextTimedStepOverride => $composableBuilder(
|
||||
column: $table.autoStartNextTimedStepOverride,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<bool> get exerciseArchivedSnapshot => $composableBuilder(
|
||||
column: $table.exerciseArchivedSnapshot,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
@ -39503,6 +39822,18 @@ class $$ProgramExercisesTableOrderingComposer
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<bool> get autoStartNextTimedStepSnapshot =>
|
||||
$composableBuilder(
|
||||
column: $table.autoStartNextTimedStepSnapshot,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<bool> get autoStartNextTimedStepOverride =>
|
||||
$composableBuilder(
|
||||
column: $table.autoStartNextTimedStepOverride,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<bool> get exerciseArchivedSnapshot => $composableBuilder(
|
||||
column: $table.exerciseArchivedSnapshot,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
@ -39754,6 +40085,18 @@ class $$ProgramExercisesTableAnnotationComposer
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<bool> get autoStartNextTimedStepSnapshot =>
|
||||
$composableBuilder(
|
||||
column: $table.autoStartNextTimedStepSnapshot,
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<bool> get autoStartNextTimedStepOverride =>
|
||||
$composableBuilder(
|
||||
column: $table.autoStartNextTimedStepOverride,
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<bool> get exerciseArchivedSnapshot => $composableBuilder(
|
||||
column: $table.exerciseArchivedSnapshot,
|
||||
builder: (column) => column,
|
||||
@ -39982,6 +40325,10 @@ class $$ProgramExercisesTableTableManager
|
||||
Value<String?> exerciseImageMediaIdsSnapshotJson =
|
||||
const Value.absent(),
|
||||
Value<String?> exerciseStepsSnapshotJson = const Value.absent(),
|
||||
Value<bool> autoStartNextTimedStepSnapshot =
|
||||
const Value.absent(),
|
||||
Value<bool?> autoStartNextTimedStepOverride =
|
||||
const Value.absent(),
|
||||
Value<String?> exerciseVideoMediaIdSnapshot =
|
||||
const Value.absent(),
|
||||
Value<bool> exerciseArchivedSnapshot = const Value.absent(),
|
||||
@ -40022,6 +40369,8 @@ class $$ProgramExercisesTableTableManager
|
||||
exerciseImageMediaIdsSnapshotJson:
|
||||
exerciseImageMediaIdsSnapshotJson,
|
||||
exerciseStepsSnapshotJson: exerciseStepsSnapshotJson,
|
||||
autoStartNextTimedStepSnapshot: autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot: exerciseVideoMediaIdSnapshot,
|
||||
exerciseArchivedSnapshot: exerciseArchivedSnapshot,
|
||||
availableTimeSnapshot: availableTimeSnapshot,
|
||||
@ -40065,6 +40414,10 @@ class $$ProgramExercisesTableTableManager
|
||||
Value<String?> exerciseImageMediaIdsSnapshotJson =
|
||||
const Value.absent(),
|
||||
Value<String?> exerciseStepsSnapshotJson = const Value.absent(),
|
||||
Value<bool> autoStartNextTimedStepSnapshot =
|
||||
const Value.absent(),
|
||||
Value<bool?> autoStartNextTimedStepOverride =
|
||||
const Value.absent(),
|
||||
Value<String?> exerciseVideoMediaIdSnapshot =
|
||||
const Value.absent(),
|
||||
Value<bool> exerciseArchivedSnapshot = const Value.absent(),
|
||||
@ -40105,6 +40458,8 @@ class $$ProgramExercisesTableTableManager
|
||||
exerciseImageMediaIdsSnapshotJson:
|
||||
exerciseImageMediaIdsSnapshotJson,
|
||||
exerciseStepsSnapshotJson: exerciseStepsSnapshotJson,
|
||||
autoStartNextTimedStepSnapshot: autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot: exerciseVideoMediaIdSnapshot,
|
||||
exerciseArchivedSnapshot: exerciseArchivedSnapshot,
|
||||
availableTimeSnapshot: availableTimeSnapshot,
|
||||
@ -44787,6 +45142,7 @@ typedef $$WorkoutTemplateExerciseOverridesTableCreateCompanionBuilder =
|
||||
Value<int?> targetRepsOverride,
|
||||
Value<double?> targetScoreOverride,
|
||||
Value<int?> targetScoreTimeMsOverride,
|
||||
Value<bool?> autoStartNextTimedStepOverride,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $$WorkoutTemplateExerciseOverridesTableUpdateCompanionBuilder =
|
||||
@ -44809,6 +45165,7 @@ typedef $$WorkoutTemplateExerciseOverridesTableUpdateCompanionBuilder =
|
||||
Value<int?> targetRepsOverride,
|
||||
Value<double?> targetScoreOverride,
|
||||
Value<int?> targetScoreTimeMsOverride,
|
||||
Value<bool?> autoStartNextTimedStepOverride,
|
||||
Value<int> rowid,
|
||||
});
|
||||
|
||||
@ -44943,6 +45300,11 @@ class $$WorkoutTemplateExerciseOverridesTableFilterComposer
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<bool> get autoStartNextTimedStepOverride => $composableBuilder(
|
||||
column: $table.autoStartNextTimedStepOverride,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
$$WorkoutTemplateProgramsTableFilterComposer get workoutTemplateProgramId {
|
||||
final $$WorkoutTemplateProgramsTableFilterComposer composer =
|
||||
$composerBuilder(
|
||||
@ -45062,6 +45424,12 @@ class $$WorkoutTemplateExerciseOverridesTableOrderingComposer
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<bool> get autoStartNextTimedStepOverride =>
|
||||
$composableBuilder(
|
||||
column: $table.autoStartNextTimedStepOverride,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
$$WorkoutTemplateProgramsTableOrderingComposer get workoutTemplateProgramId {
|
||||
final $$WorkoutTemplateProgramsTableOrderingComposer composer =
|
||||
$composerBuilder(
|
||||
@ -45171,6 +45539,12 @@ class $$WorkoutTemplateExerciseOverridesTableAnnotationComposer
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<bool> get autoStartNextTimedStepOverride =>
|
||||
$composableBuilder(
|
||||
column: $table.autoStartNextTimedStepOverride,
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
$$WorkoutTemplateProgramsTableAnnotationComposer
|
||||
get workoutTemplateProgramId {
|
||||
final $$WorkoutTemplateProgramsTableAnnotationComposer composer =
|
||||
@ -45257,6 +45631,8 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager
|
||||
Value<int?> targetRepsOverride = const Value.absent(),
|
||||
Value<double?> targetScoreOverride = const Value.absent(),
|
||||
Value<int?> targetScoreTimeMsOverride = const Value.absent(),
|
||||
Value<bool?> autoStartNextTimedStepOverride =
|
||||
const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => WorkoutTemplateExerciseOverridesCompanion(
|
||||
id: id,
|
||||
@ -45277,6 +45653,7 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager
|
||||
targetRepsOverride: targetRepsOverride,
|
||||
targetScoreOverride: targetScoreOverride,
|
||||
targetScoreTimeMsOverride: targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
@ -45299,6 +45676,8 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager
|
||||
Value<int?> targetRepsOverride = const Value.absent(),
|
||||
Value<double?> targetScoreOverride = const Value.absent(),
|
||||
Value<int?> targetScoreTimeMsOverride = const Value.absent(),
|
||||
Value<bool?> autoStartNextTimedStepOverride =
|
||||
const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => WorkoutTemplateExerciseOverridesCompanion.insert(
|
||||
id: id,
|
||||
@ -45319,6 +45698,7 @@ class $$WorkoutTemplateExerciseOverridesTableTableManager
|
||||
targetRepsOverride: targetRepsOverride,
|
||||
targetScoreOverride: targetScoreOverride,
|
||||
targetScoreTimeMsOverride: targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
|
||||
@ -1881,6 +1881,7 @@ db.ExercisesCompanion _exerciseCompanion(domain.Exercise exercise) {
|
||||
defaultTargetReps: Value(exercise.defaultTargetReps),
|
||||
defaultTargetScore: Value(exercise.defaultTargetScore),
|
||||
defaultTargetScoreTimeMs: Value(exercise.defaultTargetScoreTimeMs),
|
||||
autoStartNextTimedStep: Value(exercise.autoStartNextTimedStep),
|
||||
archivedAt: Value(_utcOrNull(exercise.archivedAt)),
|
||||
);
|
||||
}
|
||||
@ -1907,6 +1908,7 @@ domain.Exercise _exerciseFromRow(
|
||||
defaultTargetReps: row.defaultTargetReps,
|
||||
defaultTargetScore: row.defaultTargetScore,
|
||||
defaultTargetScoreTimeMs: row.defaultTargetScoreTimeMs,
|
||||
autoStartNextTimedStep: row.autoStartNextTimedStep,
|
||||
steps: steps,
|
||||
archivedAt: _utcOrNull(row.archivedAt),
|
||||
);
|
||||
@ -2132,6 +2134,12 @@ db.ProgramExercisesCompanion _programExerciseCompanion(
|
||||
exerciseStepsSnapshotJson: Value(
|
||||
_encodeExerciseStepsSnapshot(exercise.exerciseStepsSnapshot),
|
||||
),
|
||||
autoStartNextTimedStepSnapshot: Value(
|
||||
exercise.autoStartNextTimedStepSnapshot,
|
||||
),
|
||||
autoStartNextTimedStepOverride: Value(
|
||||
exercise.autoStartNextTimedStepOverride,
|
||||
),
|
||||
exerciseVideoMediaIdSnapshot: Value(exercise.exerciseVideoMediaIdSnapshot),
|
||||
exerciseArchivedSnapshot: Value(exercise.exerciseArchivedSnapshot),
|
||||
availableTimeSnapshot: Value(exercise.availableTimeSnapshot),
|
||||
@ -2170,6 +2178,8 @@ domain.ProgramExercise _programExerciseFromRow(db.ProgramExercise row) {
|
||||
exerciseStepsSnapshot: _decodeExerciseStepsSnapshot(
|
||||
row.exerciseStepsSnapshotJson,
|
||||
),
|
||||
autoStartNextTimedStepSnapshot: row.autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride: row.autoStartNextTimedStepOverride,
|
||||
exerciseVideoMediaIdSnapshot: row.exerciseVideoMediaIdSnapshot,
|
||||
exerciseArchivedSnapshot: row.exerciseArchivedSnapshot,
|
||||
availableTimeSnapshot: row.availableTimeSnapshot,
|
||||
@ -2288,6 +2298,9 @@ _workoutTemplateExerciseOverrideCompanion(
|
||||
targetRepsOverride: Value(override.targetRepsOverride),
|
||||
targetScoreOverride: Value(override.targetScoreOverride),
|
||||
targetScoreTimeMsOverride: Value(override.targetScoreTimeMsOverride),
|
||||
autoStartNextTimedStepOverride: Value(
|
||||
override.autoStartNextTimedStepOverride,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -2303,6 +2316,7 @@ domain.WorkoutTemplateExerciseOverride _workoutTemplateExerciseOverrideFromRow(
|
||||
targetRepsOverride: row.targetRepsOverride,
|
||||
targetScoreOverride: row.targetScoreOverride,
|
||||
targetScoreTimeMsOverride: row.targetScoreTimeMsOverride,
|
||||
autoStartNextTimedStepOverride: row.autoStartNextTimedStepOverride,
|
||||
);
|
||||
}
|
||||
|
||||
@ -2933,6 +2947,7 @@ Map<String, Object?> _exercisePayload(domain.Exercise exercise) => {
|
||||
'defaultTargetReps': exercise.defaultTargetReps,
|
||||
'defaultTargetScore': exercise.defaultTargetScore,
|
||||
'defaultTargetScoreTimeMs': exercise.defaultTargetScoreTimeMs,
|
||||
'autoStartNextTimedStep': exercise.autoStartNextTimedStep,
|
||||
'steps': exercise.steps.map((step) => step.toSnapshotJson()).toList(),
|
||||
'archivedAt': exercise.archivedAt?.toUtc().toIso8601String(),
|
||||
};
|
||||
@ -2991,6 +3006,8 @@ Map<String, Object?> _workoutTemplatePayload(domain.WorkoutTemplate template) =>
|
||||
'targetRepsOverride': override.targetRepsOverride,
|
||||
'targetScoreOverride': override.targetScoreOverride,
|
||||
'targetScoreTimeMsOverride': override.targetScoreTimeMsOverride,
|
||||
'autoStartNextTimedStepOverride':
|
||||
override.autoStartNextTimedStepOverride,
|
||||
},
|
||||
)
|
||||
.toList(),
|
||||
@ -3030,6 +3047,8 @@ domain.Exercise _exerciseFromPayload(RemoteSyncedItem item) {
|
||||
defaultTargetReps: payload['defaultTargetReps'] as int?,
|
||||
defaultTargetScore: (payload['defaultTargetScore'] as num?)?.toDouble(),
|
||||
defaultTargetScoreTimeMs: payload['defaultTargetScoreTimeMs'] as int?,
|
||||
autoStartNextTimedStep:
|
||||
payload['autoStartNextTimedStep'] as bool? ?? true,
|
||||
steps: _stepsFromPayload(payload['steps']),
|
||||
archivedAt: _dateTimeFromPayload(payload['archivedAt']),
|
||||
);
|
||||
@ -3133,6 +3152,10 @@ List<domain.ProgramExercise> _programExercisesFromPayload(
|
||||
exerciseStepsSnapshot: _stepsFromPayload(
|
||||
map['exerciseStepsSnapshot'],
|
||||
),
|
||||
autoStartNextTimedStepSnapshot:
|
||||
map['autoStartNextTimedStepSnapshot'] as bool? ?? true,
|
||||
autoStartNextTimedStepOverride:
|
||||
map['autoStartNextTimedStepOverride'] as bool?,
|
||||
exerciseArchivedSnapshot: map['exerciseArchivedSnapshot'] == true,
|
||||
availableTimeSnapshot: map['availableTimeSnapshot'] == true,
|
||||
availableRepsSnapshot: map['availableRepsSnapshot'] == true,
|
||||
@ -3217,6 +3240,8 @@ _workoutTemplateOverridesFromPayload(
|
||||
targetRepsOverride: map['targetRepsOverride'] as int?,
|
||||
targetScoreOverride: (map['targetScoreOverride'] as num?)?.toDouble(),
|
||||
targetScoreTimeMsOverride: map['targetScoreTimeMsOverride'] as int?,
|
||||
autoStartNextTimedStepOverride:
|
||||
map['autoStartNextTimedStepOverride'] as bool?,
|
||||
);
|
||||
})
|
||||
.toList(growable: false);
|
||||
|
||||
@ -191,6 +191,8 @@ class Exercises extends SyncableTable {
|
||||
IntColumn get defaultTargetReps => integer().nullable()();
|
||||
RealColumn get defaultTargetScore => real().nullable()();
|
||||
IntColumn get defaultTargetScoreTimeMs => integer().nullable()();
|
||||
BoolColumn get autoStartNextTimedStep =>
|
||||
boolean().withDefault(const Constant(true))();
|
||||
DateTimeColumn get archivedAt => dateTime().nullable()();
|
||||
|
||||
@override
|
||||
@ -296,6 +298,9 @@ class ProgramExercises extends SyncableTable {
|
||||
text().nullable().references(MediaAssets, #id)();
|
||||
TextColumn get exerciseImageMediaIdsSnapshotJson => text().nullable()();
|
||||
TextColumn get exerciseStepsSnapshotJson => text().nullable()();
|
||||
BoolColumn get autoStartNextTimedStepSnapshot =>
|
||||
boolean().withDefault(const Constant(true))();
|
||||
BoolColumn get autoStartNextTimedStepOverride => boolean().nullable()();
|
||||
|
||||
@ReferenceName('programExerciseVideoSnapshotReferences')
|
||||
TextColumn get exerciseVideoMediaIdSnapshot =>
|
||||
@ -390,6 +395,7 @@ class WorkoutTemplateExerciseOverrides extends SyncableTable {
|
||||
IntColumn get targetRepsOverride => integer().nullable()();
|
||||
RealColumn get targetScoreOverride => real().nullable()();
|
||||
IntColumn get targetScoreTimeMsOverride => integer().nullable()();
|
||||
BoolColumn get autoStartNextTimedStepOverride => boolean().nullable()();
|
||||
|
||||
@override
|
||||
List<String> get customConstraints => [
|
||||
|
||||
@ -479,6 +479,129 @@ void main() {
|
||||
);
|
||||
});
|
||||
|
||||
test('program exercise snapshots step chaining setting from exercise', () async {
|
||||
final exerciseRepository = _FakeExerciseRepository()
|
||||
..exercise = Exercise(
|
||||
metadata: _metadata('exercise-1'),
|
||||
name: 'Circuit',
|
||||
hasTimeMeasure: false,
|
||||
hasRepsMeasure: true,
|
||||
hasScoreMeasure: false,
|
||||
defaultTargetReps: 10,
|
||||
autoStartNextTimedStep: false,
|
||||
);
|
||||
final programRepository = _FakeProgramRepository()
|
||||
..programs.add(
|
||||
Program(
|
||||
metadata: _metadata('program-1'),
|
||||
name: 'Programme',
|
||||
defaultRestSeconds: 60,
|
||||
),
|
||||
);
|
||||
final useCase = ProgramUseCases(
|
||||
programRepository: programRepository,
|
||||
exerciseRepository: exerciseRepository,
|
||||
templateRepository: _FakeWorkoutTemplateRepository(),
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
ids: _FakeIds(),
|
||||
originDeviceId: 'device-1',
|
||||
);
|
||||
|
||||
final snapshot = await useCase.addExercise(
|
||||
programId: 'program-1',
|
||||
exerciseId: 'exercise-1',
|
||||
position: 0,
|
||||
setsCount: 3,
|
||||
enabledMeasures: const {WorkoutMeasure.reps},
|
||||
);
|
||||
|
||||
expect(snapshot.autoStartNextTimedStepSnapshot, isFalse);
|
||||
expect(snapshot.autoStartNextTimedStepOverride, isNull);
|
||||
expect(
|
||||
snapshot.toSnapshotJson()['autoStartNextTimedStepSnapshot'],
|
||||
isFalse,
|
||||
);
|
||||
});
|
||||
|
||||
test('program saveConfigured preserves step chaining override', () async {
|
||||
final programRepository = _FakeProgramRepository();
|
||||
final useCase = ProgramUseCases(
|
||||
programRepository: programRepository,
|
||||
exerciseRepository: _FakeExerciseRepository(),
|
||||
templateRepository: _FakeWorkoutTemplateRepository(),
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
ids: _FakeIds(),
|
||||
originDeviceId: 'device-1',
|
||||
);
|
||||
|
||||
final program = await useCase.saveConfigured(
|
||||
name: 'Programme',
|
||||
defaultRestSeconds: 60,
|
||||
exercises: const [
|
||||
ProgramExerciseConfig(
|
||||
exerciseNameSnapshot: 'Circuit',
|
||||
availableTimeSnapshot: false,
|
||||
availableRepsSnapshot: true,
|
||||
availableScoreSnapshot: false,
|
||||
setsCount: 3,
|
||||
enabledMeasures: {WorkoutMeasure.reps},
|
||||
targetReps: 10,
|
||||
autoStartNextTimedStepSnapshot: true,
|
||||
autoStartNextTimedStepOverride: false,
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
expect(program.exercises.single.autoStartNextTimedStepSnapshot, isTrue);
|
||||
expect(program.exercises.single.autoStartNextTimedStepOverride, isFalse);
|
||||
});
|
||||
|
||||
test('workout template override preserves step chaining override', () async {
|
||||
final templateRepository = _FakeWorkoutTemplateRepository();
|
||||
final useCase = WorkoutTemplateUseCases(
|
||||
templateRepository: templateRepository,
|
||||
programRepository: _FakeProgramRepository(),
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
ids: _FakeIds(),
|
||||
originDeviceId: 'device-1',
|
||||
);
|
||||
|
||||
final template = await useCase.saveConfigured(
|
||||
name: 'Séance',
|
||||
programs: [
|
||||
WorkoutTemplateProgramConfig(
|
||||
clientKey: 'program-1',
|
||||
programNameSnapshot: 'Programme',
|
||||
defaultRestSecondsSnapshot: 60,
|
||||
programSnapshotJson: jsonEncode({
|
||||
'exercises': [
|
||||
{
|
||||
'id': 'exercise-snapshot-1',
|
||||
'exerciseNameSnapshot': 'Circuit',
|
||||
'setsCount': 3,
|
||||
'timeEnabled': false,
|
||||
'repsEnabled': true,
|
||||
'scoreEnabled': false,
|
||||
},
|
||||
],
|
||||
}),
|
||||
),
|
||||
],
|
||||
overrides: const [
|
||||
WorkoutTemplateExerciseOverrideConfig(
|
||||
workoutTemplateProgramClientKey: 'program-1',
|
||||
snapshotProgramExerciseId: 'exercise-snapshot-1',
|
||||
autoStartNextTimedStepOverride: false,
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
expect(
|
||||
template.overrides.single.autoStartNextTimedStepOverride,
|
||||
isFalse,
|
||||
);
|
||||
});
|
||||
|
||||
test('delete exercise keeps existing program snapshots unchanged', () async {
|
||||
final exerciseRepository = _FakeExerciseRepository()
|
||||
..exercise = Exercise(
|
||||
|
||||
@ -98,6 +98,100 @@ void main() {
|
||||
expect(restored!.defaultTargetScore, 0);
|
||||
});
|
||||
|
||||
test('step chaining settings round-trip through drift repositories', () async {
|
||||
final now = DateTime.utc(2026, 7, 17, 12);
|
||||
final exercise = Exercise(
|
||||
metadata: _metadata('exercise-chain-1', now),
|
||||
name: 'Circuit',
|
||||
hasTimeMeasure: false,
|
||||
hasRepsMeasure: true,
|
||||
hasScoreMeasure: false,
|
||||
defaultTargetReps: 10,
|
||||
autoStartNextTimedStep: false,
|
||||
);
|
||||
await exerciseRepository.save(exercise);
|
||||
|
||||
final restoredExercise = await exerciseRepository.findById(
|
||||
exercise.metadata.id,
|
||||
);
|
||||
expect(restoredExercise!.autoStartNextTimedStep, isFalse);
|
||||
|
||||
final programExercise = _programExercise(
|
||||
'program-exercise-chain-1',
|
||||
now,
|
||||
programId: 'program-chain-1',
|
||||
position: 0,
|
||||
autoStartNextTimedStepSnapshot: false,
|
||||
autoStartNextTimedStepOverride: true,
|
||||
);
|
||||
await programRepository.save(
|
||||
Program(
|
||||
metadata: _metadata('program-chain-1', now),
|
||||
name: 'Programme',
|
||||
defaultRestSeconds: 60,
|
||||
exercises: [programExercise],
|
||||
),
|
||||
);
|
||||
|
||||
final restoredProgram = await programRepository.findById('program-chain-1');
|
||||
expect(
|
||||
restoredProgram!.exercises.single.autoStartNextTimedStepSnapshot,
|
||||
isFalse,
|
||||
);
|
||||
expect(
|
||||
restoredProgram.exercises.single.autoStartNextTimedStepOverride,
|
||||
isTrue,
|
||||
);
|
||||
|
||||
final templateProgram = WorkoutTemplateProgram(
|
||||
metadata: _metadata('template-program-chain-1', now),
|
||||
workoutTemplateId: 'template-chain-1',
|
||||
sourceProgramId: 'program-chain-1',
|
||||
position: 0,
|
||||
programNameSnapshot: 'Programme',
|
||||
defaultRestSecondsSnapshot: 60,
|
||||
programSnapshotJson: jsonEncode({
|
||||
'exercises': [programExercise.toSnapshotJson()],
|
||||
}),
|
||||
);
|
||||
await templateRepository.save(
|
||||
WorkoutTemplate(
|
||||
metadata: _metadata('template-chain-1', now),
|
||||
name: 'Séance',
|
||||
programs: [templateProgram],
|
||||
overrides: [
|
||||
WorkoutTemplateExerciseOverride(
|
||||
metadata: _metadata('override-chain-1', now),
|
||||
workoutTemplateProgramId: templateProgram.metadata.id,
|
||||
snapshotProgramExerciseId: programExercise.metadata.id,
|
||||
),
|
||||
WorkoutTemplateExerciseOverride(
|
||||
metadata: _metadata('override-chain-2', now),
|
||||
workoutTemplateProgramId: templateProgram.metadata.id,
|
||||
snapshotProgramExerciseId: 'program-exercise-chain-2',
|
||||
autoStartNextTimedStepOverride: false,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
final restoredTemplate = await templateRepository.findById(
|
||||
'template-chain-1',
|
||||
);
|
||||
expect(
|
||||
restoredTemplate!.overrides
|
||||
.singleWhere((override) => override.metadata.id == 'override-chain-1')
|
||||
.autoStartNextTimedStepOverride,
|
||||
isNull,
|
||||
);
|
||||
expect(
|
||||
restoredTemplate.overrides
|
||||
.singleWhere((override) => override.metadata.id == 'override-chain-2')
|
||||
.autoStartNextTimedStepOverride,
|
||||
isFalse,
|
||||
);
|
||||
});
|
||||
|
||||
test('exercise repository round-trips configured steps', () async {
|
||||
final now = DateTime.utc(2026, 7, 17, 12);
|
||||
final exercise = Exercise(
|
||||
@ -453,13 +547,18 @@ EntityMetadata _metadata(String id, DateTime now, [int localRevision = 0]) {
|
||||
ProgramExercise _programExercise(
|
||||
String id,
|
||||
DateTime now, {
|
||||
String programId = 'program-1',
|
||||
required int position,
|
||||
bool autoStartNextTimedStepSnapshot = true,
|
||||
bool? autoStartNextTimedStepOverride,
|
||||
}) {
|
||||
return ProgramExercise(
|
||||
metadata: _metadata(id, now),
|
||||
programId: 'program-1',
|
||||
programId: programId,
|
||||
position: position,
|
||||
exerciseNameSnapshot: 'Exercise $position',
|
||||
autoStartNextTimedStepSnapshot: autoStartNextTimedStepSnapshot,
|
||||
autoStartNextTimedStepOverride: autoStartNextTimedStepOverride,
|
||||
availableTimeSnapshot: false,
|
||||
availableRepsSnapshot: true,
|
||||
availableScoreSnapshot: false,
|
||||
|
||||
Reference in New Issue
Block a user