import { useEffect, useState } from 'react' import { INITIATIVE_STATUSES, PRIORITIES } from '../constants/status.js' import { INITIATIVE_STATUS_LABELS, PRIORITY_LABELS } from '../constants/status.js' import { INITIATIVE_ARCHETYPE_LABELS, STUFE_A_ARCHETYPE_KEYS } from '../constants/initiativeArchetypes.js' import { listEntityArchetypes, getArchetypeStarterPreview } from '../api/entityArchetypes.js' import { getInitiativeFields, listArchetypeFieldDefinitions, } from '../api/entityFields.js' import { FieldRenderer } from './FieldRenderer.jsx' export function InitiativeForm({ initial = {}, initiativeId = null, actors = [], onSubmit, onCancel, busy = false, submitLabel = 'Speichern', }) { const [archetypes, setArchetypes] = useState(null) const [archetypeKey, setArchetypeKey] = useState(initial.archetype_key || 'initiative.generic') const [fieldDefinitions, setFieldDefinitions] = useState([]) const [dynamicValues, setDynamicValues] = useState({}) const [fieldsLoading, setFieldsLoading] = useState(false) const [starterPreview, setStarterPreview] = useState(null) const [starterLoading, setStarterLoading] = useState(false) const isCreate = !initiativeId useEffect(() => { let cancelled = false listEntityArchetypes('initiative') .then((items) => { if (!cancelled) setArchetypes(items) }) .catch(() => { if (!cancelled) { setArchetypes( Object.entries(INITIATIVE_ARCHETYPE_LABELS).map(([key, label]) => ({ key, label, })), ) } }) return () => { cancelled = true } }, []) useEffect(() => { if (!archetypeKey) return undefined let cancelled = false setFieldsLoading(true) async function loadFields() { try { const definitions = await listArchetypeFieldDefinitions('initiative', archetypeKey) let values = {} if (initiativeId) { values = await getInitiativeFields(initiativeId) } const validKeys = new Set(definitions.map((def) => def.field_key)) const filteredValues = Object.fromEntries( Object.entries(values || {}).filter(([key]) => validKeys.has(key)), ) if (!cancelled) { setFieldDefinitions(definitions) setDynamicValues(filteredValues) } } catch { if (!cancelled) { setFieldDefinitions([]) setDynamicValues({}) } } finally { if (!cancelled) setFieldsLoading(false) } } loadFields() return () => { cancelled = true } }, [initiativeId, archetypeKey]) useEffect(() => { if (!isCreate || !archetypeKey) { setStarterPreview(null) return undefined } let cancelled = false setStarterLoading(true) getArchetypeStarterPreview(archetypeKey) .then((preview) => { if (!cancelled) setStarterPreview(preview) }) .catch(() => { if (!cancelled) setStarterPreview(null) }) .finally(() => { if (!cancelled) setStarterLoading(false) }) return () => { cancelled = true } }, [isCreate, archetypeKey]) async function handleSubmit(e) { e.preventDefault() const form = e.target await onSubmit({ title: form.title.value.trim(), archetype_key: form.archetype_key.value, goal: form.goal.value, vision: form.vision.value, target_state_summary: form.target_state_summary.value, status: form.status.value, priority: form.priority.value, owner_actor_id: form.owner_actor_id?.value || undefined, dynamicFields: dynamicValues, apply_starter_kit: isCreate && starterPreview?.supported !== false, }) } function handleDynamicChange(fieldKey, value) { setDynamicValues((prev) => ({ ...prev, [fieldKey]: value })) } const formReady = archetypes && !fieldsLoading const selectedArchetype = (archetypes || []).find((item) => item.key === archetypeKey) const stufeA = (archetypes || []).filter((item) => STUFE_A_ARCHETYPE_KEYS.has(item.key)) const otherArchetypes = (archetypes || []).filter((item) => !STUFE_A_ARCHETYPE_KEYS.has(item.key)) return (
) }