import React, { useState, useEffect } from 'react' import api from '../utils/api' import { useAuth } from '../context/AuthContext' function ClubsPage() { const { user } = useAuth() const [activeTab, setActiveTab] = useState('clubs') const [clubs, setClubs] = useState([]) const [divisions, setDivisions] = useState([]) const [groups, setGroups] = useState([]) const [loading, setLoading] = useState(true) const [showModal, setShowModal] = useState(false) const [editing, setEditing] = useState(null) const [modalType, setModalType] = useState('club') // Form state const [formData, setFormData] = useState({}) const isPlatformAdmin = user?.role === 'admin' || user?.role === 'superadmin' const isSuperAdmin = user?.role === 'superadmin' const clubAdminClubIds = new Set( (user?.clubs || []) .filter((c) => (c.roles || []).includes('club_admin')) .map((c) => c.id) ) const canManageClub = (clubId) => isPlatformAdmin || clubAdminClubIds.has(clubId) const canCreateClub = isPlatformAdmin const canManageOrgSomewhere = isPlatformAdmin || clubAdminClubIds.size > 0 const canCreateTrainingGroup = isPlatformAdmin || (Array.isArray(user?.clubs) && user.clubs.length > 0) const canEditGroup = (g) => isPlatformAdmin || clubAdminClubIds.has(g.club_id) || g.trainer_id === user?.id || (Array.isArray(g.co_trainer_ids) && g.co_trainer_ids.includes(user?.id)) const canDeleteGroup = (g) => isPlatformAdmin || clubAdminClubIds.has(g.club_id) useEffect(() => { loadData() }, []) const loadData = async () => { try { const [clubsData, divisionsData, groupsData] = await Promise.all([ api.listClubs(), api.listDivisions(), api.listTrainingGroups() ]) setClubs(clubsData) setDivisions(divisionsData) setGroups(groupsData) } catch (err) { console.error('Failed to load data:', err) alert('Fehler beim Laden: ' + err.message) } finally { setLoading(false) } } const handleCreate = (type) => { setEditing(null) setModalType(type) if (type === 'club') { setFormData({ name: '', abbreviation: '', description: '', status: 'active', primary_admin_profile_id: user?.id ?? '', }) } else if (type === 'division') { setFormData({ club_id: '', name: '', focus_area: '' }) } else if (type === 'group') { setFormData({ club_id: '', division_id: '', name: '', focus: '', level: '', age_group: '', weekday: '', time_start: '', time_end: '', location: '', trainer_id: user?.id ?? '', co_trainer_ids: [], status: 'active' }) } setShowModal(true) } const handleEdit = (item, type) => { setEditing(item) setModalType(type) setFormData({ ...item }) setShowModal(true) } const handleDelete = async (item, type) => { const confirmMsg = { club: `Verein "${item.name}" wirklich löschen? Alle Sparten und Gruppen werden auch gelöscht!`, division: `Sparte "${item.name}" wirklich löschen?`, group: `Trainingsgruppe "${item.name}" wirklich löschen?` } if (!confirm(confirmMsg[type])) return try { if (type === 'club') await api.deleteClub(item.id) else if (type === 'division') await api.deleteDivision(item.id) else if (type === 'group') await api.deleteTrainingGroup(item.id) await loadData() } catch (err) { alert('Fehler beim Löschen: ' + err.message) } } const handleSubmit = async (e) => { e.preventDefault() try { if (modalType === 'club') { if (editing) { await api.updateClub(editing.id, formData) } else { const payload = { ...formData, primary_admin_profile_id: Number(formData.primary_admin_profile_id), } if (!payload.primary_admin_profile_id) { alert('Hauptverwalter (Profil-ID) ist Pflicht.') return } await api.createClub(payload) } } else if (modalType === 'division') { if (editing) { await api.updateDivision(editing.id, formData) } else { await api.createDivision(formData) } } else if (modalType === 'group') { if (editing) { await api.updateTrainingGroup(editing.id, formData) } else { await api.createTrainingGroup(formData) } } setShowModal(false) await loadData() } catch (err) { alert('Fehler beim Speichern: ' + err.message) } } const updateFormField = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })) } if (loading) { return (
Laden...
Für die Trainingsplanung wird mindestens ein Verein und eine Trainingsgruppe gebraucht. Sparten sind optional — typische Eckdaten einer Gruppe (Wochentag, Zeit, Ort) kannst du schrittweise eintragen.
{/* Tabs */}Noch kein Verein angelegt. {canCreateClub ? ' Nutze „+ Neuer Verein“ — ein Name reicht zum Start.' : ' Bitte einen Administrator oder Support um Anlage.'}
{canCreateClub && (Danach im Tab Trainingsgruppen eine Gruppe diesem Verein zuordnen; Details sind optional.
)}{club.description}
)} {club.status}Keine Sparten gefunden
Verein: {division.club_name}
{division.focus_area && ( {division.focus_area} )}Keine Trainingsgruppen gefunden
{group.club_name} {group.division_name && ` · ${group.division_name}`}