import React, { useState, useEffect } from 'react' import api from '../utils/api' import { useAuth } from '../context/AuthContext' function TrainingPlanningPage() { const { user } = useAuth() const [groups, setGroups] = useState([]) const [selectedGroupId, setSelectedGroupId] = useState('') const [units, setUnits] = useState([]) const [exercises, setExercises] = useState([]) const [loading, setLoading] = useState(true) const [showModal, setShowModal] = useState(false) const [editingUnit, setEditingUnit] = useState(null) // Date range (default: next 30 days) const today = new Date().toISOString().split('T')[0] const thirtyDaysLater = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0] const [startDate, setStartDate] = useState(today) const [endDate, setEndDate] = useState(thirtyDaysLater) // Form state const [formData, setFormData] = useState({ group_id: '', planned_date: '', planned_time_start: '', planned_time_end: '', planned_focus: '', actual_date: '', actual_time_start: '', actual_time_end: '', attendance_count: '', status: 'planned', notes: '', trainer_notes: '', exercises: [] }) useEffect(() => { loadData() }, []) useEffect(() => { if (selectedGroupId) { loadUnits() } }, [selectedGroupId, startDate, endDate]) const loadData = async () => { try { const [groupsData, exercisesData] = await Promise.all([ api.listTrainingGroups({ status: 'active' }), api.listExercises() ]) setGroups(groupsData) setExercises(exercisesData) // Auto-select first group if trainer owns it if (groupsData.length > 0) { const ownGroup = groupsData.find(g => g.trainer_id === user?.id) if (ownGroup) { setSelectedGroupId(ownGroup.id) } else if (groupsData.length === 1) { setSelectedGroupId(groupsData[0].id) } } } catch (err) { console.error('Failed to load data:', err) alert('Fehler beim Laden: ' + err.message) } finally { setLoading(false) } } const loadUnits = async () => { if (!selectedGroupId) return try { const unitsData = await api.listTrainingUnits({ group_id: selectedGroupId, start_date: startDate, end_date: endDate }) setUnits(unitsData) } catch (err) { console.error('Failed to load units:', err) } } const handleQuickCreate = async () => { if (!selectedGroupId) { alert('Bitte wähle zuerst eine Trainingsgruppe') return } const date = prompt('Datum für neue Trainingseinheit (YYYY-MM-DD):', today) if (!date) return try { await api.quickCreateTrainingUnit({ group_id: parseInt(selectedGroupId), planned_date: date }) await loadUnits() } catch (err) { alert('Fehler beim Erstellen: ' + err.message) } } const handleCreate = () => { if (!selectedGroupId) { alert('Bitte wähle zuerst eine Trainingsgruppe') return } const group = groups.find(g => g.id === parseInt(selectedGroupId)) setEditingUnit(null) setFormData({ group_id: selectedGroupId, planned_date: today, planned_time_start: group?.time_start?.slice(0, 5) || '', planned_time_end: group?.time_end?.slice(0, 5) || '', planned_focus: '', actual_date: '', actual_time_start: '', actual_time_end: '', attendance_count: '', status: 'planned', notes: '', trainer_notes: '', exercises: [] }) setShowModal(true) } const handleEdit = async (unit) => { try { const fullUnit = await api.getTrainingUnit(unit.id) setEditingUnit(fullUnit) setFormData({ group_id: fullUnit.group_id, planned_date: fullUnit.planned_date || '', planned_time_start: fullUnit.planned_time_start?.slice(0, 5) || '', planned_time_end: fullUnit.planned_time_end?.slice(0, 5) || '', planned_focus: fullUnit.planned_focus || '', actual_date: fullUnit.actual_date || '', actual_time_start: fullUnit.actual_time_start?.slice(0, 5) || '', actual_time_end: fullUnit.actual_time_end?.slice(0, 5) || '', attendance_count: fullUnit.attendance_count || '', status: fullUnit.status || 'planned', notes: fullUnit.notes || '', trainer_notes: fullUnit.trainer_notes || '', exercises: fullUnit.exercises || [] }) setShowModal(true) } catch (err) { alert('Fehler beim Laden: ' + err.message) } } const handleDelete = async (unit) => { if (!confirm(`Trainingseinheit vom ${unit.planned_date} wirklich löschen?`)) return try { await api.deleteTrainingUnit(unit.id) await loadUnits() } catch (err) { alert('Fehler beim Löschen: ' + err.message) } } const handleSubmit = async (e) => { e.preventDefault() if (!formData.group_id || !formData.planned_date) { alert('Gruppe und Datum sind Pflichtfelder') return } try { const payload = { ...formData, group_id: parseInt(formData.group_id), attendance_count: formData.attendance_count ? parseInt(formData.attendance_count) : null, exercises: formData.exercises.map((ex, idx) => ({ exercise_id: ex.exercise_id, order_index: idx, planned_duration_min: ex.planned_duration_min ? parseInt(ex.planned_duration_min) : null, actual_duration_min: ex.actual_duration_min ? parseInt(ex.actual_duration_min) : null, notes: ex.notes || null, modifications: ex.modifications || null })) } if (editingUnit) { await api.updateTrainingUnit(editingUnit.id, payload) } else { await api.createTrainingUnit(payload) } setShowModal(false) await loadUnits() } catch (err) { alert('Fehler beim Speichern: ' + err.message) } } const updateFormField = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })) } const addExercise = () => { setFormData(prev => ({ ...prev, exercises: [...prev.exercises, { exercise_id: '', planned_duration_min: '', actual_duration_min: '', notes: '', modifications: '' }] })) } const updateExercise = (index, field, value) => { setFormData(prev => ({ ...prev, exercises: prev.exercises.map((ex, i) => i === index ? { ...ex, [field]: value } : ex ) })) } const removeExercise = (index) => { setFormData(prev => ({ ...prev, exercises: prev.exercises.filter((_, i) => i !== index) })) } const moveExercise = (index, direction) => { const newExercises = [...formData.exercises] const target = index + direction if (target < 0 || target >= newExercises.length) return [newExercises[index], newExercises[target]] = [newExercises[target], newExercises[index]] setFormData(prev => ({ ...prev, exercises: newExercises })) } if (loading) { return (
Laden...
📍 {selectedGroup.location || 'Kein Ort angegeben'} {selectedGroup.weekday && ` · ${selectedGroup.weekday}`} {selectedGroup.time_start && ` · ${selectedGroup.time_start.slice(0, 5)} - ${selectedGroup.time_end?.slice(0, 5)}`}
Bitte wähle eine Trainingsgruppe aus
Keine Trainingseinheiten im gewählten Zeitraum
🎯 {unit.planned_focus}
)}💬 {unit.notes}
)}