diff --git a/frontend/src/components/ExerciseFullContent.jsx b/frontend/src/components/ExerciseFullContent.jsx index 73253b8..288f4d9 100644 --- a/frontend/src/components/ExerciseFullContent.jsx +++ b/frontend/src/components/ExerciseFullContent.jsx @@ -1,5 +1,6 @@ /** * Voller Katalog-Inhalt einer Übung (Lesemodus für Coach/Mobile). + * Optional: geplante Variante (`variantId`) — Beschreibung und Durchführungsänderungen oben. */ import React from 'react' import { Link } from 'react-router-dom' @@ -51,9 +52,9 @@ function metaParts(exercise) { } /** - * @param {{ exercise?: object|null, loading?: boolean, error?: string|null, exerciseId?: number }} props + * @param {{ exercise?: object|null, loading?: boolean, error?: string|null, exerciseId?: number, variantId?: number|string|null }} props */ -export default function ExerciseFullContent({ exercise, loading, error, exerciseId }) { +export default function ExerciseFullContent({ exercise, loading, error, exerciseId, variantId }) { if (loading) { return (
@@ -70,8 +71,41 @@ export default function ExerciseFullContent({ exercise, loading, error, exercise const resolvedId = exercise.id ?? exerciseId const meta = metaParts(exercise) + const variant = + variantId != null && variantId !== '' && Array.isArray(exercise.variants) && exercise.variants.length + ? exercise.variants.find((v) => String(v.id) === String(variantId)) || null + : null + return (
+ {variant ? ( +
+

+ Geplante Variante +

+

{variant.variant_name || `Variante #${variant.id}`}

+ {variant.description ? ( +
+

Zur Variante

+ +
+ ) : null} + {variant.execution_changes ? ( +
+

Durchführung (Variante)

+ +
+ ) : null} +
+ ) : null}

{exercise.title}

{meta.length > 0 && (

diff --git a/frontend/src/pages/TrainingCoachPage.jsx b/frontend/src/pages/TrainingCoachPage.jsx index 1bedf06..56a75c4 100644 --- a/frontend/src/pages/TrainingCoachPage.jsx +++ b/frontend/src/pages/TrainingCoachPage.jsx @@ -400,7 +400,7 @@ export default function TrainingCoachPage() { return () => { cancelled = true } - }, [step, currentEntry?.item?.exercise_id, currentEntry?.item?.item_type]) + }, [step, currentEntry?.item?.exercise_id, currentEntry?.item?.exercise_variant_id, currentEntry?.item?.item_type]) const handleSaveDebrief = async () => { setSaveOk(null) @@ -739,6 +739,7 @@ export default function TrainingCoachPage() { error={catalogError} exercise={catalogExercise} exerciseId={currentEntry?.item?.exercise_id ?? null} + variantId={currentEntry?.item?.exercise_variant_id ?? null} />

diff --git a/frontend/src/pages/TrainingUnitRunPage.jsx b/frontend/src/pages/TrainingUnitRunPage.jsx index 5e72bbd..a8c7341 100644 --- a/frontend/src/pages/TrainingUnitRunPage.jsx +++ b/frontend/src/pages/TrainingUnitRunPage.jsx @@ -33,7 +33,7 @@ export default function TrainingUnitRunPage() { const [loadError, setLoadError] = useState(null) const [loading, setLoading] = useState(true) const [checked, setChecked] = useState(() => new Set()) - const [peekExerciseId, setPeekExerciseId] = useState(null) + const [peekCtx, setPeekCtx] = useState(null) const loadChecked = useCallback((uid) => { try { @@ -143,9 +143,10 @@ export default function TrainingUnitRunPage() { return (
setPeekExerciseId(null)} + open={peekCtx != null} + exerciseId={peekCtx?.exerciseId} + variantId={peekCtx?.variantId ?? undefined} + onClose={() => setPeekCtx(null)} />