Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | 11x 11x 11x 3x 3x 3x 4x 4x 4x 4x 4x 4x 4x 4x 4x 2x 2x 4x 1x 1x 1x | import { Injectable } from '@angular/core';
import { TranslatorService } from './translator.service';
import { AbstractControl, FormGroup, ValidationErrors } from '@angular/forms';
import { Subscription } from 'rxjs';
import { BackendError } from '@core/errors/backend-error';
@Injectable({
providedIn: 'root'
})
export class FormErrorService {
// useful to cancel subsriptions when user changes a value
private cleanupSubscriptions = new Map<AbstractControl, Subscription>();
constructor(private translatorService: TranslatorService) { }
setBackendErrors(
form: FormGroup,
errorMap: Record<string, BackendError[]>
): void {
for (const [fieldName, errors] of Object.entries(errorMap)) {
const control = form.get(fieldName);
Eif (control) {
const translatedErrors = errors.map((err:BackendError) =>
this.translatorService.translateError(err.code, err.details)
);
const controlErrors = control.errors ?? {} as ValidationErrors;
controlErrors['backend'] = translatedErrors;
control.setErrors(controlErrors);
// unsub the previous subscription if it exists
this.cleanupSubscriptions.get(control)?.unsubscribe();
// automatic cleanup errors are removed if user changes form control value
const sub = control.valueChanges.subscribe(() => {
const currentErrors = control.errors;
Iif (currentErrors && currentErrors['backend']) {
delete currentErrors['backend'];
// replace with cleaned up errors
if (Object.keys(currentErrors).length > 0) {
control.setErrors(currentErrors);
} else {
control.setErrors(null);
}
}
});
this.cleanupSubscriptions.set(control, sub);
}
}
}
// removes all subscriptions, useful to avoid memory leaks on form components destroy
cleanup(): void {
for (const sub of this.cleanupSubscriptions.values()) {
sub.unsubscribe();
}
this.cleanupSubscriptions.clear();
}
}
|