import { useState, useEffect } from 'react' import { api } from '../utils/api' export default function AdminCatalogsPage() { const [activeTab, setActiveTab] = useState('focus-areas') const [loading, setLoading] = useState(false) const [error, setError] = useState('') // Focus Areas const [focusAreas, setFocusAreas] = useState([]) const [editingFA, setEditingFA] = useState(null) const [newFA, setNewFA] = useState({ name: '', description: '', color: '#1D9E75', icon: '' }) // Training Styles const [trainingStyles, setTrainingStyles] = useState([]) const [editingTS, setEditingTS] = useState(null) const [newTS, setNewTS] = useState({ name: '', description: '', parent_style_id: null }) // Training Characters const [trainingCharacters, setTrainingCharacters] = useState([]) const [editingTC, setEditingTC] = useState(null) const [newTC, setNewTC] = useState({ name: '', description: '' }) // Skill Categories const [skillCategories, setSkillCategories] = useState([]) const [editingSC, setEditingSC] = useState(null) const [newSC, setNewSC] = useState({ name: '', description: '', parent_category_id: null }) // Target Groups const [targetGroups, setTargetGroups] = useState([]) const [editingTG, setEditingTG] = useState(null) const [newTG, setNewTG] = useState({ name: '', description: '', training_style_id: null, min_age: null, max_age: null }) // Trainer Focus Areas const [trainerAssignments, setTrainerAssignments] = useState([]) const [profiles, setProfiles] = useState([]) const [newAssignment, setNewAssignment] = useState({ profile_id: '', focus_area_id: '' }) useEffect(() => { loadData() }, [activeTab]) async function loadData() { setLoading(true) setError('') try { if (activeTab === 'focus-areas') { const data = await api.listFocusAreas() setFocusAreas(data) } else if (activeTab === 'training-styles') { const data = await api.listTrainingStyles() setTrainingStyles(data) } else if (activeTab === 'training-characters') { const data = await api.listTrainingCharacters() setTrainingCharacters(data) } else if (activeTab === 'skill-categories') { const data = await api.listSkillCategories() setSkillCategories(data) } else if (activeTab === 'target-groups') { const [groups, styles] = await Promise.all([ api.listTargetGroups(), api.listTrainingStyles() ]) setTargetGroups(groups) setTrainingStyles(styles) } else if (activeTab === 'trainer-assignments') { const [assignments, profs, areas] = await Promise.all([ api.listTrainerFocusAreas(), fetch('/api/profiles').then(r => r.json()), api.listFocusAreas() ]) setTrainerAssignments(assignments) setProfiles(profs) setFocusAreas(areas) } } catch (e) { setError(e.message) } finally { setLoading(false) } } // Focus Areas async function createFocusArea() { try { await api.createFocusArea(newFA) setNewFA({ name: '', description: '', color: '#1D9E75', icon: '' }) loadData() } catch (e) { setError(e.message) } } async function updateFocusArea(id, data) { try { await api.updateFocusArea(id, data) setEditingFA(null) loadData() } catch (e) { setError(e.message) } } async function deleteFocusArea(id) { if (!confirm('Fokusbereich wirklich löschen?')) return try { await api.deleteFocusArea(id) loadData() } catch (e) { setError(e.message) } } // Training Styles async function createTrainingStyle() { try { await api.createTrainingStyle(newTS) setNewTS({ name: '', description: '', parent_style_id: null }) loadData() } catch (e) { setError(e.message) } } async function updateTrainingStyle(id, data) { try { await api.updateTrainingStyle(id, data) setEditingTS(null) loadData() } catch (e) { setError(e.message) } } async function deleteTrainingStyle(id) { if (!confirm('Trainingsstil wirklich löschen?')) return try { await api.deleteTrainingStyle(id) loadData() } catch (e) { setError(e.message) } } // Training Characters async function createTrainingCharacter() { try { await api.createTrainingCharacter(newTC) setNewTC({ name: '', description: '' }) loadData() } catch (e) { setError(e.message) } } async function updateTrainingCharacter(id, data) { try { await api.updateTrainingCharacter(id, data) setEditingTC(null) loadData() } catch (e) { setError(e.message) } } async function deleteTrainingCharacter(id) { if (!confirm('Trainingscharakter wirklich löschen?')) return try { await api.deleteTrainingCharacter(id) loadData() } catch (e) { setError(e.message) } } // Skill Categories async function createSkillCategory() { try { await api.createSkillCategory(newSC) setNewSC({ name: '', description: '', parent_category_id: null }) loadData() } catch (e) { setError(e.message) } } async function updateSkillCategory(id, data) { try { await api.updateSkillCategory(id, data) setEditingSC(null) loadData() } catch (e) { setError(e.message) } } async function deleteSkillCategory(id) { if (!confirm('Fähigkeitskategorie wirklich löschen?')) return try { await api.deleteSkillCategory(id) loadData() } catch (e) { setError(e.message) } } // Target Groups async function createTargetGroup() { try { await api.createTargetGroup(newTG) setNewTG({ name: '', description: '', training_style_id: null, min_age: null, max_age: null }) loadData() } catch (e) { setError(e.message) } } async function updateTargetGroup(id, data) { try { await api.updateTargetGroup(id, data) setEditingTG(null) loadData() } catch (e) { setError(e.message) } } async function deleteTargetGroup(id) { if (!confirm('Zielgruppe wirklich löschen?')) return try { await api.deleteTargetGroup(id) loadData() } catch (e) { setError(e.message) } } // Trainer Assignments async function assignTrainer() { try { await api.assignTrainerFocusArea(newAssignment) setNewAssignment({ profile_id: '', focus_area_id: '' }) loadData() } catch (e) { setError(e.message) } } async function removeAssignment(id) { if (!confirm('Zuordnung wirklich entfernen?')) return try { await api.deleteTrainerFocusArea(id) loadData() } catch (e) { setError(e.message) } } return (

Stammdaten-Kataloge

{/* Tabs */}
{[ { id: 'focus-areas', label: 'Fokusbereiche' }, { id: 'training-styles', label: 'Trainingsstile' }, { id: 'training-characters', label: 'Trainingscharakter' }, { id: 'skill-categories', label: 'Fähigkeitskategorien' }, { id: 'target-groups', label: 'Zielgruppen' }, { id: 'trainer-assignments', label: 'Trainer-Zuordnungen' } ].map(tab => ( ))}
{error && (
{error}
)} {loading ? (
) : ( <> {/* Focus Areas */} {activeTab === 'focus-areas' && (

Neuer Fokusbereich

setNewFA({ ...newFA, name: e.target.value })} placeholder="z.B. Karate" />