From a632de65ea48904a67ab5462801bc1d92cc8094e Mon Sep 17 00:00:00 2001 From: AG Date: Wed, 3 Dec 2025 23:30:32 +0200 Subject: [PATCH] Unilateral exercises logging --- components/ExerciseModal.tsx | 16 + components/Profile.tsx | 5 +- components/Tracker/ActiveSessionView.tsx | 215 ++++-- components/Tracker/SporadicView.tsx | 213 ++++-- components/Tracker/useTracker.ts | 473 ++++++++++-- server/.env | 2 +- server/dev.db | 0 server/package-lock.json | 721 +++++++++++++++++- server/package.json | 8 +- server/prisma/dev.db | Bin 221184 -> 102400 bytes .../migration.sql | 116 +++ server/prisma/migrations/migration_lock.toml | 3 + server/prisma/schema.prisma | 3 + server/src/index.ts | 9 +- server/src/lib/prisma.ts | 33 + server/src/routes/auth.ts | 3 +- server/src/routes/exercises.ts | 24 +- server/src/routes/plans.ts | 3 +- server/src/routes/sessions.ts | 3 +- server/src/routes/sporadic-sets.ts | 29 +- server/src/routes/weight.ts | 3 +- services/i18n.ts | 14 + services/sporadicSets.ts | 1 + types.ts | 3 + 24 files changed, 1656 insertions(+), 244 deletions(-) create mode 100644 server/dev.db create mode 100644 server/prisma/migrations/20251203165359_add_unilateral_support/migration.sql create mode 100644 server/prisma/migrations/migration_lock.toml create mode 100644 server/src/lib/prisma.ts diff --git a/components/ExerciseModal.tsx b/components/ExerciseModal.tsx index e84df02..67896ed 100644 --- a/components/ExerciseModal.tsx +++ b/components/ExerciseModal.tsx @@ -17,6 +17,7 @@ const ExerciseModal: React.FC = ({ isOpen, onClose, onSave, const [newName, setNewName] = useState(''); const [newType, setNewType] = useState(ExerciseType.STRENGTH); const [newBwPercentage, setNewBwPercentage] = useState('100'); + const [isUnilateral, setIsUnilateral] = useState(false); const [error, setError] = useState(''); const exerciseTypeLabels: Record = { @@ -47,12 +48,14 @@ const ExerciseModal: React.FC = ({ isOpen, onClose, onSave, id: generateId(), name: trimmedName, type: newType, + isUnilateral, ...(newType === ExerciseType.BODYWEIGHT && { bodyWeightPercentage: parseFloat(newBwPercentage) || 100 }) }; await onSave(newEx); setNewName(''); setNewType(ExerciseType.STRENGTH); setNewBwPercentage('100'); + setIsUnilateral(false); setError(''); onClose(); }; @@ -120,6 +123,19 @@ const ExerciseModal: React.FC = ({ isOpen, onClose, onSave, /> )} +
+ setIsUnilateral(e.target.checked)} + className="w-5 h-5 rounded border-2 border-outline bg-surface-container-high checked:bg-primary checked:border-primary cursor-pointer" + /> + +
+