diff --git a/frontend/src/components/FieldRenderer.jsx b/frontend/src/components/FieldRenderer.jsx index 29b3db8..e1dc89f 100644 --- a/frontend/src/components/FieldRenderer.jsx +++ b/frontend/src/components/FieldRenderer.jsx @@ -1,11 +1,11 @@ -export function FieldRenderer({ definitions, values, onChange, disabled = false }) { +export function FieldRenderer({ definitions, values, onChange, disabled = false, actors = [] }) { if (!definitions?.length) { return null } return (
- Zusatzfelder + Zusatzfelder (Archetyp) {definitions.map((def) => ( onChange(def.field_key, next)} disabled={disabled} + actors={actors} /> ))}
) } -function DynamicField({ definition, value, onChange, disabled }) { +function DynamicField({ definition, value, onChange, disabled, actors = [] }) { const { field_key, field_type, label, required, validation_json: validation } = definition const inputId = `field-${field_key}` @@ -83,6 +84,30 @@ function DynamicField({ definition, value, onChange, disabled }) { ) } + if (field_type === 'actor_ref') { + return ( + + ) + } + const inputType = field_type === 'number' ? 'number' : field_type === 'date' ? 'date' : field_type === 'url' ? 'url' : 'text' diff --git a/frontend/src/components/InitiativeForm.jsx b/frontend/src/components/InitiativeForm.jsx index 37c8455..b6ce2c8 100644 --- a/frontend/src/components/InitiativeForm.jsx +++ b/frontend/src/components/InitiativeForm.jsx @@ -4,7 +4,6 @@ import { INITIATIVE_STATUS_LABELS, PRIORITY_LABELS } from '../constants/status.j import { INITIATIVE_ARCHETYPE_LABELS } from '../constants/initiativeArchetypes.js' import { listEntityArchetypes } from '../api/entityArchetypes.js' import { - getInitiativeFieldDefinitions, getInitiativeFields, listArchetypeFieldDefinitions, } from '../api/entityFields.js' @@ -13,6 +12,7 @@ import { FieldRenderer } from './FieldRenderer.jsx' export function InitiativeForm({ initial = {}, initiativeId = null, + actors = [], onSubmit, onCancel, busy = false, @@ -46,22 +46,24 @@ export function InitiativeForm({ }, []) useEffect(() => { + if (!archetypeKey) return undefined let cancelled = false setFieldsLoading(true) async function loadFields() { try { - let definitions = [] + const definitions = await listArchetypeFieldDefinitions('initiative', archetypeKey) let values = {} if (initiativeId) { - definitions = await getInitiativeFieldDefinitions(initiativeId) values = await getInitiativeFields(initiativeId) - } else if (archetypeKey) { - definitions = await listArchetypeFieldDefinitions('initiative', archetypeKey) } + 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(values) + setDynamicValues(filteredValues) } } catch { if (!cancelled) { @@ -90,6 +92,7 @@ export function InitiativeForm({ 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, }) } @@ -102,73 +105,100 @@ export function InitiativeForm({ const selectedArchetype = (archetypes || []).find((item) => item.key === archetypeKey) return ( -
- -