import React, { useState, useEffect } from 'react' import api from '../utils/api' import { useAuth } from '../context/AuthContext' function SkillsPage() { const { user } = useAuth() const [activeTab, setActiveTab] = useState('skills') const [skills, setSkills] = useState([]) const [methods, setMethods] = useState([]) const [loading, setLoading] = useState(true) const [showModal, setShowModal] = useState(false) const [editing, setEditing] = useState(null) const [modalType, setModalType] = useState('skill') const [formData, setFormData] = useState({}) const isAdmin = user?.role === 'admin' || user?.role === 'superadmin' useEffect(() => { loadData() }, []) const loadData = async () => { try { const [skillsData, methodsData] = await Promise.all([ api.listSkills(), api.listMethods() ]) setSkills(skillsData) setMethods(methodsData) } 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 === 'skill') { setFormData({ name: '', category: '', description: '', importance: 3, keywords: [], status: 'active' }) } else { setFormData({ name: '', abbreviation: '', category: '', description: '', typical_duration: '', typical_group_size: '', related_skills: [], keywords: [], status: 'active' }) } setShowModal(true) } const handleEdit = (item, type) => { setEditing(item) setModalType(type) setFormData({ ...item }) setShowModal(true) } const handleDelete = async (item, type) => { const confirmMsg = type === 'skill' ? `Fähigkeit "${item.name}" wirklich löschen?` : `Trainingsmethode "${item.name}" wirklich löschen?` if (!confirm(confirmMsg)) return try { if (type === 'skill') { await api.deleteSkill(item.id) } else { await api.deleteMethod(item.id) } await loadData() } catch (err) { alert('Fehler beim Löschen: ' + err.message) } } const handleSubmit = async (e) => { e.preventDefault() try { if (modalType === 'skill') { if (editing) { await api.updateSkill(editing.id, formData) } else { await api.createSkill(formData) } } else { if (editing) { await api.updateMethod(editing.id, formData) } else { await api.createMethod(formData) } } setShowModal(false) await loadData() } catch (err) { alert('Fehler beim Speichern: ' + err.message) } } const updateFormField = (field, value) => { setFormData(prev => ({ ...prev, [field]: value })) } const groupByCategory = (items) => { const grouped = {} items.forEach(item => { const cat = item.category || 'Ohne Kategorie' if (!grouped[cat]) grouped[cat] = [] grouped[cat].push(item) }) return grouped } if (loading) { return (

Laden...

) } const skillsByCategory = groupByCategory(skills) const methodsByCategory = groupByCategory(methods) return (

Fähigkeiten & Methoden

{/* Tabs */}
{['skills', 'methods'].map(tab => ( ))}
{/* Skills Tab */} {activeTab === 'skills' && ( <>

Fähigkeiten sind Kompetenzen, die in Übungen trainiert werden.

{isAdmin && ( )}
{Object.keys(skillsByCategory).length === 0 ? (

Keine Fähigkeiten gefunden

) : ( Object.keys(skillsByCategory).sort().map(category => (

{category}

{skillsByCategory[category].map(skill => (

{skill.name}

{skill.importance && ( ⭐ {skill.importance}/5 )}
{skill.description && (

{skill.description}

)} {isAdmin && (
)}
))}
)) )} )} {/* Methods Tab */} {activeTab === 'methods' && ( <>

Trainingsmethoden sind didaktische Ansätze für die Trainingsgestaltung.

{isAdmin && ( )}
{Object.keys(methodsByCategory).length === 0 ? (

Keine Trainingsmethoden gefunden

) : ( Object.keys(methodsByCategory).sort().map(category => (

{category}

{methodsByCategory[category].map(method => (

{method.name} {method.abbreviation && ( ({method.abbreviation}) )}

{method.typical_duration && ( ⏱️ {method.typical_duration} min )} {method.typical_group_size && ( 👥 {method.typical_group_size} )}
{method.description && (

{method.description}

)} {isAdmin && (
)}
))}
)) )} )} {/* Modal */} {showModal && isAdmin && (

{editing ? (modalType === 'skill' ? 'Fähigkeit bearbeiten' : 'Methode bearbeiten') : (modalType === 'skill' ? 'Neue Fähigkeit' : 'Neue Methode') }

updateFormField('name', e.target.value)} required />
{modalType === 'method' && (
updateFormField('abbreviation', e.target.value)} maxLength={20} />
)}
updateFormField('category', e.target.value)} placeholder={modalType === 'skill' ? 'z.B. kihon, kumite, kata' : 'z.B. kondition, didaktik'} />