import React, { useCallback, useEffect, useMemo, useState } from 'react' import api from '../utils/api' import NavStateLink from '../components/NavStateLink' import FrameworkProgramsFilterBlock from '../components/planning/FrameworkProgramsFilterBlock' import FrameworkProgramListCard from '../components/planning/FrameworkProgramListCard' import { useAuth } from '../context/AuthContext' import { getTenantClubDependencyKey } from '../utils/activeClub' import { buildFrameworkProgramsListReturnContext } from '../utils/navReturnContext' import { EMPTY_FRAMEWORK_IMPORT_FILTERS, filterFrameworkPrograms, hasActiveFrameworkImportFilters, } from '../utils/frameworkProgramListHelpers' export default function TrainingFrameworkProgramsListPage() { const { user } = useAuth() const tenantClubDepKey = useMemo(() => getTenantClubDependencyKey(user), [user]) const frameworkListReturn = useMemo(() => buildFrameworkProgramsListReturnContext(), []) const [rows, setRows] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [catalogFocusAreas, setCatalogFocusAreas] = useState([]) const [catalogTrainingTypes, setCatalogTrainingTypes] = useState([]) const [catalogTargetGroups, setCatalogTargetGroups] = useState([]) const [filters, setFilters] = useState(() => ({ ...EMPTY_FRAMEWORK_IMPORT_FILTERS })) const [filterPanelOpen, setFilterPanelOpen] = useState(true) const filteredRows = useMemo( () => filterFrameworkPrograms(rows, filters), [rows, filters] ) const filterActive = hasActiveFrameworkImportFilters(filters) const load = useCallback(async () => { setLoading(true) setError('') try { const [list, fa, tt, tg] = await Promise.all([ api.listTrainingFrameworkPrograms(), api.listFocusAreas({ status: 'active' }), api.listTrainingTypes({ status: 'active' }), api.listTargetGroups({ status: 'active' }), ]) setRows(Array.isArray(list) ? list : []) setCatalogFocusAreas(Array.isArray(fa) ? fa : []) setCatalogTrainingTypes(Array.isArray(tt) ? tt : []) setCatalogTargetGroups(Array.isArray(tg) ? tg : []) } catch (e) { setError(e.message || 'Laden fehlgeschlagen') setRows([]) setCatalogFocusAreas([]) setCatalogTrainingTypes([]) setCatalogTargetGroups([]) } finally { setLoading(false) } }, []) useEffect(() => { load() }, [load, tenantClubDepKey]) 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 (
Vorlagen für Entwicklungsziele und Sessions — die Übernahme in Gruppentermine erfolgt in der Trainingsplanung.
Rahmenprogramme werden geladen…
Lege ein neues Programm an — mit Titel, mindestens einem Entwicklungsziel und optional Sessions samt Übungsablauf.
{filterActive ? 'Kein Rahmenprogramm passt zu den gewählten Filtern. Passe die Kriterien an oder setze den Filter zurück.' : 'Keine Einträge.'}