import React, { useEffect, useMemo, useState } from 'react' import { Link } from 'react-router-dom' import TrainingPlanExerciseVisibilityPanel from '../TrainingPlanExerciseVisibilityPanel' import TrainingUnitSectionsEditor from '../TrainingUnitSectionsEditor' import { activeClubMemberships } from '../../utils/activeClub' import { frameworkLineageText } from '../../utils/trainingPlanningPageHelpers' /** * Vollseiten-Formular: Trainingseinheit planen / nachbereiten (ohne Modal-Overlay). */ export default function TrainingUnitFormShell({ editingUnit, formData, updateFormField, setFormData, onSaveOnly, onSaveAndClose, draftPlanTemplateId, onDraftTemplateSelect, planTemplates, clubDirectory, clubDirectoryForCo, planningClubId, user, onMetaRefresh, sectionsEditMode, setSectionsEditMode, onSaveAsTemplate, onRequestPublishToFramework, onRequestSaveAsModule, onRequestTrainingModulePick, onRequestExercisePick, onPeekExercise, formId = 'planning-unit-form', }) { const [newTplVisibility, setNewTplVisibility] = useState('private') const [newTplClubId, setNewTplClubId] = useState('') const memberClubs = useMemo(() => activeClubMemberships(user?.clubs), [user?.clubs]) const roleLc = String(user?.role || '').toLowerCase() const isSuperadmin = roleLc === 'superadmin' useEffect(() => { if (planningClubId != null && planningClubId !== '') { setNewTplClubId(String(planningClubId)) } else if (memberClubs.length === 1) { setNewTplClubId(String(memberClubs[0].id)) } }, [planningClubId, memberClubs]) return (
(onSaveAndClose ? onSaveAndClose(e) : onSaveOnly?.(e))} >
{editingUnit?.origin_framework_slot_id ? (() => { const L = frameworkLineageText(editingUnit) return (
Herkunft:{' '} {editingUnit.origin_framework_program_id ? ( {L.fpTitle} ) : ( L.fpTitle )} · {L.slotBit}

Inhalt stammt aus dem Session-Blueprint des Rahmenprogramms. Änderungen gelten nur für diese geplante Einheit; die Zuordnung zum Rahmen bleibt zur Nachverfolgung erhalten.

) })() : null} {!editingUnit && (

Übernimmt nur die Sektionsstruktur aus der Bibliothek; Übungen trägst du unten bei den Abschnitten ein. Vorlagen verwaltest du unter{' '} Planung → Vorlagen.

)}

Planung

updateFormField('planned_date', e.target.value)} required />
updateFormField('planned_time_start', e.target.value)} />
updateFormField('planned_time_end', e.target.value)} />
updateFormField('planned_focus', e.target.value)} placeholder="z.B. Grundlagen, Kinder altersgerecht" />

Trainerzuordnung (diese Einheit)

{!formData.session_assistants_inherit ? (
{clubDirectoryForCo.map((m) => { const mid = typeof m.id === 'number' ? m.id : parseInt(String(m.id), 10) const isOn = Number.isFinite(mid) && formData.session_assistant_profile_ids.includes(mid) return ( ) })}
) : null}
{editingUnit ? (
Ablauf bearbeiten als
{[ { id: 'planning', label: 'Planung' }, { id: 'debrief', label: 'Nachbereitung' }, ].map((opt, i) => ( ))}
) : null}
{newTplVisibility === 'club' ? (
) : null} {editingUnit?.id && !editingUnit?.framework_slot_id ? ( <> ) : null}
} sections={formData.sections} wideExerciseGrid onSectionsChange={(updater) => setFormData((prev) => ({ ...prev, sections: updater(prev.sections) })) } onRequestTrainingModulePick={onRequestTrainingModulePick} onRequestExercisePick={onRequestExercisePick} onPeekExercise={onPeekExercise} showExecutionExtras={Boolean(editingUnit) && sectionsEditMode === 'debrief'} enableParallelPhaseControls />
{editingUnit ? ( <>

Durchführung

updateFormField('actual_date', e.target.value)} />
updateFormField('actual_time_start', e.target.value)} />
updateFormField('actual_time_end', e.target.value)} />
updateFormField('attendance_count', e.target.value)} />
{formData.status === 'completed' ? (
) : null} ) : null}

Notizen