Skip to content

Commit

Permalink
fix(dynamic-form-builder): Add ValidatorOptions for nested objects va…
Browse files Browse the repository at this point in the history
…lidations
  • Loading branch information
EndyKaufman committed Mar 9, 2018
1 parent 739518d commit 95b4dfd
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 18 deletions.
5 changes: 4 additions & 1 deletion apps/demo/src/app/shared/models/exp-company.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@ export class ExpCompany {

id: number;
@Validate(TextLengthMore15, {
groups: ['user'],
message: 'The company name must be longer than 15'
})
@IsNotEmpty()
@IsNotEmpty({
groups: ['user']
})
name: string;

constructor(data?: any) {
Expand Down
12 changes: 9 additions & 3 deletions apps/demo/src/app/shared/models/exp-department.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,16 @@ import { ExpCompany } from './exp-company';

export class ExpDepartment {
id: number;
@IsNotEmpty()
@IsNotEmpty({
groups: ['user']
})
name: string;
@ValidateNested()
@IsOptional()
@ValidateNested({
groups: ['user']
})
@IsOptional({
groups: ['user']
})
company: ExpCompany;

constructor(data?: any) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,18 @@ export class DynamicFormBuilder extends FormBuilder {
DynamicFormGroup.getClassValidators<TModel>(
factoryModel,
newControlsConfig,
'',
(extra &&
extra.customValidatorOptions &&
extra.customValidatorOptions.groups) ?
extra.customValidatorOptions.groups :
undefined
(extra && extra.customValidatorOptions) ? extra.customValidatorOptions : undefined
)
, extra
);
Object.keys(formGroup.controls).forEach(key => {
dynamicFormGroup.addControl(key, formGroup.controls[key]);
});
dynamicFormGroup.valueChanges.subscribe(data => {
dynamicFormGroup.validate();
dynamicFormGroup.validate(
undefined,
(extra && extra.customValidatorOptions) ? extra.customValidatorOptions : undefined
);
});
return dynamicFormGroup;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'reflect-metadata';
import { ClassType } from 'class-transformer/ClassTransformer';

export class DynamicFormGroup<TModel> extends FormGroup {
public otherErrors: ValidationError[] = [];
public customValidateErrors = new BehaviorSubject<any>({});
private _object: TModel;
constructor(
Expand All @@ -27,14 +28,13 @@ export class DynamicFormGroup<TModel> extends FormGroup {
fields: {
[key: string]: any
},
targetSchema?: string,
groups?: string[]
validatorOptions?: ValidatorOptions
) {
const validationMetadatas: ValidationMetadata[] =
getFromContainer(MetadataStorage).getTargetValidationMetadatas(
factoryModel,
targetSchema ? targetSchema : '',
groups ? groups : undefined
'',
validatorOptions && validatorOptions.groups ? validatorOptions.groups : undefined
);
const formGroupFields = {};
const validator = new Validator();
Expand Down Expand Up @@ -78,7 +78,7 @@ export class DynamicFormGroup<TModel> extends FormGroup {
const isValid = (c.parent && c.parent.value) ?
validateSync(
c.value,
{ validationError: { target: false } }
validatorOptions
).length === 0 : true;
return isValid ? null : {
nestedValidate: {
Expand Down Expand Up @@ -106,7 +106,7 @@ export class DynamicFormGroup<TModel> extends FormGroup {
const validateErrors = (c.parent && c.parent.value) ?
validateSync(
object,
{ validationError: { target: false } }
validatorOptions
) : [];
const isValid = validateErrors.filter((error: ValidationError) => {
if (error.children.length &&
Expand Down Expand Up @@ -236,7 +236,7 @@ export class DynamicFormGroup<TModel> extends FormGroup {
}
validate(otherErrors?: ValidationError[], validatorOptions?: ValidatorOptions) {
if (otherErrors === undefined) {
otherErrors = [];
otherErrors = this.otherErrors;
}
const errors = validateSync(this.object, validatorOptions);
this.customValidateErrors.next(
Expand Down

0 comments on commit 95b4dfd

Please sign in to comment.