import { useEffect, useMemo, useState } from 'react' import { createActionTask, deleteTask, listActionTasks, updateTask, } from '../api/tasks.js' import { buildTasksByParent } from '../utils/taskTree.js' import { Modal } from './Modal.jsx' import { TaskForm, TaskTreeNodes } from './TaskForm.jsx' export function ActionTaskPanel({ actionId, roadmapItems, canManage, expanded, onToggle, openTaskCount, }) { const [tasks, setTasks] = useState([]) const [loading, setLoading] = useState(false) const [error, setError] = useState(null) const [busy, setBusy] = useState(false) const [modal, setModal] = useState(null) const [reloadKey, setReloadKey] = useState(0) useEffect(() => { if (!expanded || !actionId) return undefined let cancelled = false setLoading(true) setError(null) listActionTasks(actionId) .then((data) => { if (!cancelled) setTasks(data) }) .catch((err) => { if (!cancelled) setError(err.message) }) .finally(() => { if (!cancelled) setLoading(false) }) return () => { cancelled = true } }, [expanded, actionId, reloadKey]) const tasksByParent = useMemo(() => buildTasksByParent(tasks), [tasks]) async function reload() { setReloadKey((value) => value + 1) } async function handleCreate(payload) { setBusy(true) setError(null) try { await createActionTask(actionId, payload) setModal(null) await reload() } catch (err) { setError(err.message) } finally { setBusy(false) } } async function handleUpdate(taskId, payload) { setBusy(true) setError(null) try { await updateTask(taskId, payload) setModal(null) await reload() } catch (err) { setError(err.message) } finally { setBusy(false) } } async function handleStatus(taskId, status) { setBusy(true) setError(null) try { await updateTask(taskId, { status }) await reload() } catch (err) { setError(err.message) } finally { setBusy(false) } } async function handleDelete(taskId) { setBusy(true) setError(null) try { await deleteTask(taskId) await reload() } catch (err) { setError(err.message) } finally { setBusy(false) } } const taskLabel = openTaskCount != null ? ` (${openTaskCount} offen)` : '' return (
{error}
} {loading &&Aufgaben werden geladen …
} {!loading && tasks.length === 0 && (Noch keine Aufgaben für dieses Arbeitspaket.
)} {!loading && tasks.length > 0 && (