You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

57 lines
1.5 KiB

import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
import { FormGroup } from '@angular/forms';
import { plainToInstance } from 'class-transformer';
import { isJSON, validate } from 'class-validator';
export function jsonValidator(): ValidatorFn {
return (control: AbstractControl): ValidationErrors | null => {
if (!isJSON(control.value)) {
return { invalidJson: true };
}
return null;
};
}
export async function validateObjectForForm<T>({
classDto,
form,
ignoreFields = [],
object
}: {
classDto: new () => T;
form: FormGroup;
ignoreFields?: string[];
object: T;
}): Promise<void> {
const objectInstance = plainToInstance(classDto, object);
const errors = await validate(objectInstance as object);
const nonIgnoredErrors = errors.filter(({ property }) => {
return !ignoreFields.includes(property);
});
if (nonIgnoredErrors.length === 0) {
return Promise.resolve();
}
for (const { constraints, property } of nonIgnoredErrors) {
const formControl = form.get(property);
if (formControl) {
formControl.setErrors({
validationError: Object.values(constraints ?? {})[0]
});
}
const formControlInCustomCurrency = form.get(`${property}InCustomCurrency`);
if (formControlInCustomCurrency) {
formControlInCustomCurrency.setErrors({
validationError: Object.values(constraints ?? {})[0]
});
}
}
return Promise.reject(nonIgnoredErrors);
}