import { useCallback, useEffect, useState } from 'react' import { Link, useParams } from 'react-router-dom' import { getInitiative, listInitiativeActions, createInitiativeAction, } from '../api/initiatives.js' import { updateAction, setActionAssignments } from '../api/actions.js' import { ACTION_STATUS_LABELS } from '../constants/status.js' import { StatusBadge } from '../components/StatusBadge.jsx' import { PriorityBadge } from '../components/PriorityBadge.jsx' import { ActionForm } from '../components/ActionForm.jsx' import { EmptyState } from '../components/EmptyState.jsx' import { ErrorState } from '../components/ErrorState.jsx' import { LoadingState } from '../components/LoadingState.jsx' import { useCapabilities } from '../hooks/useCapabilities.js' import { useActors } from '../hooks/useActors.js' import { useSession } from '../context/SessionContext.jsx' export function InitiativeDetailPage() { const { id } = useParams() const { context } = useSession() const { hasCapability } = useCapabilities() const { actors, loading: actorsLoading, error: actorsError, usedFallback: actorsUsedFallback, reload: reloadActors, } = useActors() const [initiative, setInitiative] = useState(null) const [actions, setActions] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [showActionForm, setShowActionForm] = useState(false) const [editingAction, setEditingAction] = useState(null) const [formBusy, setFormBusy] = useState(false) const [hideDone, setHideDone] = useState(true) const load = useCallback(async () => { setLoading(true) setError(null) try { const [initData, actionData] = await Promise.all([ getInitiative(id), listInitiativeActions(id), ]) setInitiative(initData) setActions(actionData) } catch (err) { setError(err.message) } finally { setLoading(false) } }, [id]) useEffect(() => { load() }, [load]) const visibleActions = hideDone ? actions.filter((a) => a.status !== 'done' && a.status !== 'discarded') : actions async function handleCreateAction(payload) { setFormBusy(true) try { const assigned = payload.assigned_actor_ids?.length > 0 ? payload.assigned_actor_ids : context?.actor?.id ? [context.actor.id] : [] await createInitiativeAction(id, { ...payload, assigned_actor_ids: assigned }) setShowActionForm(false) await load() } catch (err) { setError(err.message) } finally { setFormBusy(false) } } async function handleUpdateAction(actionId, payload) { setFormBusy(true) try { await updateAction(actionId, { title: payload.title, description: payload.description, status: payload.status, priority: payload.priority, }) if (hasCapability('kairo.action.manage')) { await setActionAssignments(actionId, payload.assigned_actor_ids || []) } setEditingAction(null) await load() } catch (err) { setError(err.message) } finally { setFormBusy(false) } } async function handleQuickStatus(action, status) { if (!hasCapability('kairo.action.manage')) return try { await updateAction(action.id, { status }) await load() } catch (err) { setError(err.message) } } if (loading) { return (
) } if (error && !initiative) { return (
) } if (!initiative) { return (
) } return (

{initiative.title}

{initiative.goal &&

{initiative.goal}

}
{error &&

{error}

}

Maßnahmen

{hasCapability('kairo.action.manage') && ( )}
{showActionForm && (
setShowActionForm(false)} busy={formBusy} submitLabel="Maßnahme anlegen" />
)} {visibleActions.length === 0 && ( )}
    {visibleActions.map((action) => (
  • {editingAction === action.id ? ( handleUpdateAction(action.id, payload)} onCancel={() => setEditingAction(null)} busy={formBusy} submitLabel="Speichern" /> ) : ( <>
    {action.title} {action.description && (

    {action.description}

    )} {action.assigned_actor_ids?.length > 0 && (

    Zugewiesen: {action.assigned_actor_ids.length} Actor(s)

    )}
    {hasCapability('kairo.action.manage') && ( <> )}
    )}
  • ))}
) }