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.
ghostfolio/apps/client/src/app/util/form.util.ts

47 lines
1.2 KiB

import { FormGroup } from '@angular/forms';
import { plainToInstance } from 'class-transformer';
import { validate } from 'class-validator';
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);
}