From 3504093c33a2595f001b276fbba92a25b8e17780 Mon Sep 17 00:00:00 2001 From: YOUNG Date: Tue, 10 Mar 2026 09:17:09 -0500 Subject: [PATCH] modified how sets are intereted in the frontend, they still get inserted the same way in the back so no DB changes needed --- frontend/src/pages/Workouts.tsx | 102 +++++++++++++++++++------------- 1 file changed, 62 insertions(+), 40 deletions(-) diff --git a/frontend/src/pages/Workouts.tsx b/frontend/src/pages/Workouts.tsx index 79eeaba..cb0f367 100644 --- a/frontend/src/pages/Workouts.tsx +++ b/frontend/src/pages/Workouts.tsx @@ -16,9 +16,9 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; -interface SetForm { +interface ExerciseRow { exercise_id: number; - set_number: number; + sets: string; reps: string; weight_lbs: string; duration_min: string; @@ -30,7 +30,7 @@ export default function Workouts() { const [date, setDate] = useState(today()); const [name, setName] = useState(""); const [wNotes, setWNotes] = useState(""); - const [sets, setSets] = useState([]); + const [rows, setRows] = useState([]); const [newExName, setNewExName] = useState(""); const [newExCategory, setNewExCategory] = useState(""); const [showNewExercise, setShowNewExercise] = useState(false); @@ -44,12 +44,12 @@ export default function Workouts() { load(); }, []); - const addSet = () => { - setSets([ - ...sets, + const addRow = () => { + setRows([ + ...rows, { exercise_id: exercises[0]?.id || 0, - set_number: sets.length + 1, + sets: "3", reps: "", weight_lbs: "", duration_min: "", @@ -57,34 +57,42 @@ export default function Workouts() { ]); }; - const updateSet = (i: number, field: keyof SetForm, value: string | number) => { - const next = [...sets]; + const updateRow = (i: number, field: keyof ExerciseRow, value: string | number) => { + const next = [...rows]; (next[i] as any)[field] = value; - next[i].set_number = i + 1; - setSets(next); + setRows(next); }; - const removeSet = (i: number) => { - setSets(sets.filter((_, idx) => idx !== i).map((s, idx) => ({ ...s, set_number: idx + 1 }))); + const removeRow = (i: number) => { + setRows(rows.filter((_, idx) => idx !== i)); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); + // Expand each row into individual sets + const allSets: { exercise_id: number; set_number: number; reps: number | null; weight_lbs: number | null; duration_min: number | null }[] = []; + let setNum = 1; + for (const row of rows) { + const numSets = parseInt(row.sets) || 1; + for (let s = 0; s < numSets; s++) { + allSets.push({ + exercise_id: row.exercise_id, + set_number: setNum++, + reps: row.reps ? parseInt(row.reps) : null, + weight_lbs: row.weight_lbs ? parseFloat(row.weight_lbs) : null, + duration_min: row.duration_min ? parseFloat(row.duration_min) : null, + }); + } + } await api.post("/workouts", { date, name: name || null, notes: wNotes || null, - sets: sets.map((s) => ({ - exercise_id: s.exercise_id, - set_number: s.set_number, - reps: s.reps ? parseInt(s.reps) : null, - weight_lbs: s.weight_lbs ? parseFloat(s.weight_lbs) : null, - duration_min: s.duration_min ? parseFloat(s.duration_min) : null, - })), + sets: allSets, }); setName(""); setWNotes(""); - setSets([]); + setRows([]); load(); }; @@ -132,30 +140,44 @@ export default function Workouts() {
- -
{exercises.length === 0 && (

Create an exercise first

)} - {sets.map((s, i) => ( -
- - updateSet(i, "reps", e.target.value)} /> - updateSet(i, "weight_lbs", e.target.value)} /> - + {rows.map((r, i) => ( +
+
+ + +
+
+
+ + updateRow(i, "sets", e.target.value)} /> +
+
+ + updateRow(i, "reps", e.target.value)} /> +
+
+ + updateRow(i, "weight_lbs", e.target.value)} placeholder="lbs" /> +
+
))}