import type { FormContent, FormDataType, FormFields, PartialFormDataType, PartialNullableFormDataType, StaticFormFields, UnknownFormField } from '@douglasneuroinformatics/libui-form-types'; export function getInitialValues(values: PartialNullableFormDataType) { const initialValues: { [key: string]: unknown } = {}; for (const key in values) { const value = values[key]; if (value === null || value === undefined) { continue; } else if (Array.isArray(value)) { initialValues[key] = value.map(getInitialValues); } else { initialValues[key] = value; } } return initialValues as PartialFormDataType; } /** Extract a flat array of form fields from the content. This function assumes there are no duplicate keys in groups */ export function getFormFields(content: FormContent): FormFields { if (!Array.isArray(content)) { return content; } return content.reduce((prev, current) => ({ ...prev, ...current.fields }), content[0]!.fields) as FormFields; } /** * Given a set of data, resolve static content for form fields. Null values * will be removed. */ export function resolveStaticFormFields(content: FormContent, data: PartialFormDataType) { const staticFormFields: Partial> = {}; const formFields = getFormFields(content); for (const fieldName in formFields) { const field: UnknownFormField = formFields[fieldName]; if (field.kind === 'dynamic') { const resolvedField = field.render.call(undefined, data); if (resolvedField) { staticFormFields[fieldName] = resolvedField; } } else { staticFormFields[fieldName] = field; } } return staticFormFields; }