import { useEffect, useState } from 'react' import { type FeedbackDimension, type FeedbackCategory, type FeedbackCriterionItem, loadFeedbackStructure, addFeedbackDimension, updateFeedbackDimension, deleteFeedbackDimension, addFeedbackCategory, updateFeedbackCategory, deleteFeedbackCategory, addFeedbackCriterionItem, updateFeedbackCriterionItem, deleteFeedbackCriterionItem, } from '../db' export default function FeedbackStructureConfig() { const [dimensions, setDimensions] = useState([]) const [categories, setCategories] = useState([]) const [items, setItems] = useState([]) const [expanded, setExpanded] = useState>(new Set()) const [expandedCat, setExpandedCat] = useState>(new Set()) // Neue Einträge const [newDimName, setNewDimName] = useState('') const [newCatName, setNewCatName] = useState>({}) const [newItemName, setNewItemName] = useState>({}) const load = async () => { const structure = await loadFeedbackStructure() setDimensions(structure.dimensions) setCategories(structure.categories) setItems(structure.items) } useEffect(() => { load() }, []) // ── Dimensionen ─────────────────────────────────────────────────────────── const addDimension = async () => { if (!newDimName.trim()) return const maxOrder = dimensions.reduce((m, d) => Math.max(m, d.order), 0) const id = await addFeedbackDimension({ name: newDimName.trim(), order: maxOrder + 1 }) setNewDimName('') await load() setExpanded(prev => new Set([...prev, id])) } const updateDimension = async (id: number, name: string) => { await updateFeedbackDimension(id, { name }) setDimensions(prev => prev.map(d => d.id === id ? { ...d, name } : d)) } const deleteDimension = async (id: number) => { await deleteFeedbackDimension(id) await load() } const moveDim = async (dim: FeedbackDimension, dir: -1 | 1) => { const sorted = [...dimensions].sort((a, b) => a.order - b.order) const idx = sorted.findIndex(d => d.id === dim.id) const other = sorted[idx + dir] if (!other) return await updateFeedbackDimension(dim.id!, { order: other.order }) await updateFeedbackDimension(other.id!, { order: dim.order }) await load() } // ── Kategorien ──────────────────────────────────────────────────────────── const addCategory = async (dimId: number) => { const name = newCatName[dimId]?.trim() if (!name) return const dimCats = categories.filter(c => c.dimensionId === dimId) const maxOrder = dimCats.reduce((m, c) => Math.max(m, c.order), 0) const id = await addFeedbackCategory({ dimensionId: dimId, name, order: maxOrder + 1 }) setNewCatName(prev => ({ ...prev, [dimId]: '' })) await load() setExpandedCat(prev => new Set([...prev, id])) } const updateCategory = async (id: number, name: string) => { await updateFeedbackCategory(id, { name }) setCategories(prev => prev.map(c => c.id === id ? { ...c, name } : c)) } const deleteCategory = async (id: number) => { await deleteFeedbackCategory(id) await load() } // ── Kriterium-Items ─────────────────────────────────────────────────────── const addItem = async (catId: number) => { const name = newItemName[catId]?.trim() if (!name) return const catItems = items.filter(i => i.categoryId === catId) const maxOrder = catItems.reduce((m, i) => Math.max(m, i.order), 0) await addFeedbackCriterionItem({ categoryId: catId, name, order: maxOrder + 1 }) setNewItemName(prev => ({ ...prev, [catId]: '' })) await load() } const updateItem = async (id: number, name: string) => { await updateFeedbackCriterionItem(id, { name }) setItems(prev => prev.map(i => i.id === id ? { ...i, name } : i)) } const deleteItem = async (id: number) => { await deleteFeedbackCriterionItem(id) setItems(prev => prev.filter(i => i.id !== id)) } const updateItemWeight = async (id: number, weight: number) => { await updateFeedbackCriterionItem(id, { weight }) setItems(prev => prev.map(i => i.id === id ? { ...i, weight } : i)) } const sorted = [...dimensions].sort((a, b) => a.order - b.order) return (

Feedback-Dimensionen & Kategorien

{/* Neue Dimension */}
setNewDimName(e.target.value)} onKeyDown={e => e.key === 'Enter' && addDimension()} />
{/* Dimensionen */} {sorted.map((dim, di) => { const isOpen = expanded.has(dim.id!) const dimCats = [...categories].filter(c => c.dimensionId === dim.id).sort((a, b) => a.order - b.order) return (
{/* Dimension-Header */}
updateDimension(dim.id!, e.target.value)} />
{isOpen && (
{dimCats.map(cat => { const isCatOpen = expandedCat.has(cat.id!) const catItems = [...items].filter(i => i.categoryId === cat.id).sort((a, b) => a.order - b.order) return (
updateCategory(cat.id!, e.target.value)} />
{isCatOpen && (
{catItems.map(item => (
· updateItem(item.id!, e.target.value)} /> updateItemWeight(item.id!, Number(e.target.value))} title="Gewichtung" className="w-14 text-xs border border-gray-200 rounded px-1 py-0.5 text-gray-500 bg-white focus:outline-none focus:border-brand" />
))}
setNewItemName(p => ({ ...p, [cat.id!]: e.target.value }))} onKeyDown={e => e.key === 'Enter' && addItem(cat.id!)} />
)}
) })} {/* Neue Kategorie */}
setNewCatName(p => ({ ...p, [dim.id!]: e.target.value }))} onKeyDown={e => e.key === 'Enter' && addCategory(dim.id!)} />
)}
) })}
) }