import { useCallback, useEffect, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { getAction } from '../api/actions.js' import { getInitiativeSteeringSnapshot } from '../api/initiatives.js' import { listInitiativeProjects } from '../api/projects.js' import { updateAction, setActionAssignments } from '../api/actions.js' import { createInitiativeBlocker } from '../api/blockers.js' import { ActionHubCard } from '../components/ActionHubCard.jsx' import { ActionForm } from '../components/ActionForm.jsx' import { TasksSection } from '../components/TasksSection.jsx' import { ErrorState } from '../components/ErrorState.jsx' import { LoadingState } from '../components/LoadingState.jsx' import { useInitiativeOperations } from '../context/InitiativeOperationsContext.jsx' import { useCapabilities } from '../hooks/useCapabilities.js' import { useActors } from '../hooks/useActors.js' function ActionDetailBody({ action, context, editing, onEdit, onCancelEdit, onSubmit, onQuickStatus, onCreateBlocker, formBusy, capabilities, actorsState, projects = [], }) { if (editing) { return ( ) } return ( <> ) } function ActionDetailStandalone() { const { actionId } = useParams() const { capabilities } = useCapabilities() const actorsState = useActors() const [action, setAction] = useState(null) const [projects, setProjects] = useState([]) const [context, setContext] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [editing, setEditing] = useState(false) const [formBusy, setFormBusy] = useState(false) const load = useCallback(async () => { setLoading(true) setError(null) try { const actionData = await getAction(actionId) setAction(actionData) const [snap, projectData] = await Promise.all([ getInitiativeSteeringSnapshot(actionData.initiative_id), listInitiativeProjects(actionData.initiative_id).catch(() => []), ]) setProjects(projectData) setContext((snap.actions || []).find((a) => a.id === actionId) || null) } catch (err) { setError(err.message) } finally { setLoading(false) } }, [actionId]) useEffect(() => { load() }, [load]) async function handleSubmit(payload) { setFormBusy(true) try { await updateAction(action.id, { title: payload.title, description: payload.description, status: payload.status, priority: payload.priority, due_at: payload.due_at, clear_due_at: !payload.due_at, }) if (capabilities.has('kairo.action.manage')) { await setActionAssignments(action.id, payload.assigned_actor_ids || []) } setEditing(false) await load() } catch (err) { setError(err.message) } finally { setFormBusy(false) } } async function handleQuickStatus(status) { if (!capabilities.has('kairo.action.manage')) return try { await updateAction(action.id, { status }) await load() } catch (err) { setError(err.message) } } async function handleCreateBlocker() { if (!capabilities.has('kairo.blocker.manage')) return setFormBusy(true) try { await createInitiativeBlocker(action.initiative_id, { title: 'Blocker', action_id: action.id, set_action_blocked: true, }) await load() } catch (err) { setError(err.message) } finally { setFormBusy(false) } } if (loading) { return (
) } if (error || !action) { return (
) } return (

Arbeitspaket

setEditing(true)} onCancelEdit={() => setEditing(false)} onSubmit={handleSubmit} onQuickStatus={handleQuickStatus} onCreateBlocker={handleCreateBlocker} formBusy={formBusy} capabilities={capabilities} actorsState={actorsState} projects={projects} />
) } function ActionDetailNested() { const { actionId } = useParams() const ops = useInitiativeOperations() const action = ops.actions.find((a) => a.id === actionId) const context = ops.actionContextById[actionId] const [editing, setEditing] = useState(false) if (!action) { return } return (

Arbeitspaket

setEditing(true)} onCancelEdit={() => setEditing(false)} onSubmit={(payload) => ops.handleUpdateAction(action.id, payload)} onQuickStatus={(status) => ops.handleQuickStatus(action, status)} onCreateBlocker={() => ops.handleCreateBlockerForAction(action.id)} formBusy={ops.formBusy} capabilities={ops.capabilities} actorsState={{ actors: ops.actors, loading: ops.actorsLoading, error: ops.actorsError, usedFallback: ops.actorsUsedFallback, reload: ops.reloadActors, }} projects={ops.projects} />
) } export function ActionDetailPage({ nested = false }) { if (nested) { return } return }