@cnamts/form-builder
Version:
FormBuilder for the French Health Insurance
50 lines (37 loc) • 1.53 kB
text/typescript
import { FormErrors } from './types';
import { Form } from '../../components/FormBuilder/types';
import { ChoiceFieldErrorMessages, FieldOptions } from '../../components/FormField/types';
import { deepCopy } from '@cnamts/vue-dot/src/helpers/deepCopy';
/** Set error-messages prop on the fields in error */
export function setFormErrors(formErrors: FormErrors, form: Form): Form {
const newForm = deepCopy<Form>(form);
for (const [sectionName] of Object.entries(newForm)) {
for (const [fieldName, errors] of Object.entries(formErrors)) {
const field = newForm[sectionName].questions[fieldName];
if (!field || !errors) {
continue;
}
const fieldOptions = field.fieldOptions || {};
if (typeof errors === 'string' || Array.isArray(errors)) {
(fieldOptions as FieldOptions).errorMessages = errors;
} else if (typeof errors === 'object') {
for (const [subFieldName, subErrors] of Object.entries(errors)) {
if (subFieldName === 'value' || subFieldName === 'other') {
if (!fieldOptions.errorMessages) {
fieldOptions.errorMessages = {};
}
(fieldOptions.errorMessages as ChoiceFieldErrorMessages)[subFieldName] = subErrors;
continue;
}
const subFieldOptions = fieldOptions[subFieldName] || {};
(subFieldOptions as FieldOptions).errorMessages = subErrors;
fieldOptions[subFieldName] = subFieldOptions;
}
} else {
continue;
}
newForm[sectionName].questions[fieldName].fieldOptions = fieldOptions;
}
}
return newForm;
}