Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save krohne/64d3b1e2d5430fb291cec2592a0843e8 to your computer and use it in GitHub Desktop.
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
Copy link
Author

krohne commented Oct 11, 2023

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