Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save krohne/64d3b1e2d5430fb291cec2592a0843e8 to your computer and use it in GitHub Desktop.

Select an option

Save krohne/64d3b1e2d5430fb291cec2592a0843e8 to your computer and use it in GitHub Desktop.
Get all validation errors for Angular FormGroup, FormRecord, or FormArray
import {
FormGroup,
FormRecord,
FormArray,
ValidationErrors
} from '@angular/forms';
export function getFormValidationErrors(form: FormGroup|FormRecord|FormArray, path ?: string = '$') {
const result = [];
const formErrors: (ValidationErrors|null|undefined) = form.errors;
if (formErrors) {
Object.entries(formErrors).forEach( ([keyError, message]) => {
result.push({
'control': 'form',
'error': keyError,
'value': message,
'path': path
});
});
}
if (form instanceof FormArray) {
form.controls.forEach( ([control, index]) => {
if (control instanceof FormGroup || control instanceof FormRecord || control instanceof FormArray) {
result.push(...getFormValidationErrors(control, `${path}.[${index}]`))
} else {
const controlErrors: (ValidationErrors|null|undefined) = control.errors;
if (controlErrors) {
Object.entries(controlErrors).forEach( ([keyError, message]) => {
result.push({
'control': key,
'error': keyError,
'value': message,
'path': `${path}.[${index}].${key}`
});
});
}
}
});
} else {
Object.entries(form.controls).forEach( ([key, control]) => {
if (control instanceof FormGroup || control instanceof FormRecord || control instanceof FormArray) {
result.push(...getFormValidationErrors(control, `${path}.${key}`))
} else {
const controlErrors: (ValidationErrors|null|undefined) = control.errors;
if (controlErrors) {
Object.entries(controlErrors).forEach( ([keyError, message]) => {
result.push({
'control': key,
'error': keyError,
'value': message,
'path': `${path}.${key}`
});
});
}
}
});
}
return result;
}
@krohne

krohne commented Oct 10, 2023

Copy link
Copy Markdown
Author

Switching from Object.keys to Object.entries and adding recursion for nested forms.

@krohne

krohne commented Oct 10, 2023

Copy link
Copy Markdown
Author

Added form-level validation errors

@krohne

krohne commented Oct 11, 2023

Copy link
Copy Markdown
Author

Added JSONPath path, in case the recursion gets deep.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment