import React, { useCallback, useEffect, useState } from 'react' import { Link } from 'react-router-dom' import api from '../utils/api' const TYPE_COUNT = (r) => typeof r.training_types_count === 'number' ? r.training_types_count : null const TG_COUNT = (r) => typeof r.target_groups_count === 'number' ? r.target_groups_count : null function contextTeaser(r) { const bits = [] if (r.focus_area_name) bits.push(r.focus_area_name) if (r.style_direction_name) bits.push(r.style_direction_name) const tn = TYPE_COUNT(r) const gn = TG_COUNT(r) if (tn != null && tn > 0) bits.push(`${tn} Trainingsart${tn === 1 ? '' : 'en'}`) if (gn != null && gn > 0) bits.push(`${gn} Zielgruppe${gn === 1 ? '' : 'n'}`) return bits.length ? bits.join(' · ') : null } export default function TrainingFrameworkProgramsListPage() { const [rows, setRows] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const load = useCallback(async () => { setLoading(true) setError('') try { const list = await api.listTrainingFrameworkPrograms() setRows(Array.isArray(list) ? list : []) } catch (e) { setError(e.message || 'Laden fehlgeschlagen') setRows([]) } finally { setLoading(false) } }, []) useEffect(() => { load() }, [load]) async function handleDelete(id, title) { if (!confirm(`Rahmenprogramm „${title || id}“ wirklich löschen?`)) return try { await api.deleteTrainingFrameworkProgram(id) await load() } catch (e) { alert(e.message || 'Löschen fehlgeschlagen') } } return (

Trainingsrahmenprogramme

Wiederverwendbare Vorlagen für Ziele und Sessions. Die Verknüpfung mit{' '} konkreten Gruppeneinheiten erfolgt aus der Planung der Gruppe (Übernahme mit Bezug zum Rahmen).

Rahmenprogramm anlegen

← Zurück zur Trainingsplanung

{error && (
{error}
)} {loading ? (

Laden…

) : rows.length === 0 ? (

Noch kein Rahmenprogramm gespeichert. Lege ein neues an — mit Titel, mindestens einem Ziel und optional Slots samt Übungen.

Rahmenprogramm anlegen
) : ( )}
) }