src/factory/reactive-forms-factory.ts
        
                                Methods | 
                        
                                
  | 
                        
| Public createFormArrayFromQuestions | ||||||||
                                        
                                    createFormArrayFromQuestions(questions: [][])
                                 | 
                            ||||||||
| 
                                             Defined in src/factory/reactive-forms-factory.ts:67 
                                         | 
                                    ||||||||
| 
            
                                         
                                                Parameters :
                                                 
                                        
 
                                            Returns :      
                                            Promise<>
            
                                         | 
                            
| Public createFormGroupFromGroups | ||||||||
                                        
                                    createFormGroupFromGroups(groups: Group[])
                                 | 
                            ||||||||
| 
                                             Defined in src/factory/reactive-forms-factory.ts:14 
                                         | 
                                    ||||||||
| 
            
                                         
                                                Parameters :
                                                 
                                        
 
                                            Returns :      
                                            Promise<>
            
                                         | 
                            
| Public createFormGroupFromQuestions | ||||||||||||
                                        
                                    createFormGroupFromQuestions(questions: Question[], checkDisabledQuestions: boolean)
                                 | 
                            ||||||||||||
| 
                                             Defined in src/factory/reactive-forms-factory.ts:42 
                                         | 
                                    ||||||||||||
| 
            
                                         
                                                Parameters :
                                                 
                                        
 
                                            Returns :      
                                            Promise<>
            
                                         | 
                            
| Public createValidators | ||||||||
                                        
                                    createValidators(validations: Validation[])
                                 | 
                            ||||||||
| 
                                             Defined in src/factory/reactive-forms-factory.ts:89 
                                         | 
                                    ||||||||
| 
            
                                         
                                                Parameters :
                                                 
                                        
 
                                            Returns :      
                                            Promise<[]>
            
                                         | 
                            
import { FormGroup, FormArray, FormControl, ValidatorFn, Validators } from '@angular/forms';
import { Group, GroupType, Fieldset, DataTable } from '../group';
import { Choice, Question } from '../question';
import { Validation, MinLength, MaxLength, Pattern, Required, Min, Max } from '../validation';
import {
  ValidatorFactoryHandler, RequiredValidator, EmailValidator, MaxValidator, MinValidator,
  MaxLengthValidator, MinLengthValidator, PatternValidator
} from '../chain-of-responsibility/validator-factory';
import { ValidationTypeNotFoundError } from '../chain-of-responsibility/validator-factory/error';
export class ReactiveFormsFactory {
  public static async createFormGroupFromGroups(groups: Group<any>[]): Promise<FormGroup> {
    return new Promise<FormGroup>(async (resolve: (formGroup: FormGroup) => void, reject: (error: string) => void) => {
      try {
        const formGroup: FormGroup = new FormGroup({});
        for await (const group of groups) {
          let control: FormGroup | FormArray;
          if (GroupType.FIELDSET === group.type) {
            control = await ReactiveFormsFactory.createFormGroupFromQuestions((<Fieldset>group).questions);
          } else {
            control = await ReactiveFormsFactory.createFormArrayFromQuestions((<DataTable>group).questions.slice(1));
            if ((<DataTable>group).validations && 0 < (<DataTable>group).validations.length) {
              control.setValidators(await ReactiveFormsFactory.createValidators((<DataTable>group).validations));
            }
          }
          formGroup.addControl(group.code, control);
        }
        resolve(formGroup);
      } catch (error) {
        reject(error);
      }
    });
  }
  public static async createFormGroupFromQuestions(questions: Question<any>[], checkDisabledQuestions: boolean = true): Promise<FormGroup> {
    return new Promise<FormGroup>(async (resolve: (formGroup: FormGroup) => void, reject: (error: Error) => void) => {
      try {
        const formGroup: FormGroup = new FormGroup({});
        for await (const question of questions) {
          const validators: ValidatorFn[] = await ReactiveFormsFactory.createValidators(question.validations);
          const answer: any = ReactiveFormsFactory.getFormStateValue(question);
          const formState: any = { value: answer, disabled: checkDisabledQuestions && question.disabled };
          const control: FormControl = new FormControl(formState, validators);
          if (question.validations && 0 < question.validations.length) {
            control.setValidators(await ReactiveFormsFactory.createValidators(question.validations));
          }
          formGroup.addControl(question.name, control);
        }
        resolve(formGroup);
      } catch (error) {
        reject(error);
      }
    });
  }
  public static async createFormArrayFromQuestions(questions: Question<any>[][]): Promise<FormArray> {
    return new Promise<FormArray>(async (resolve: (formArray: FormArray) => void, reject: (error: Error) => void) => {
      try {
        const formArray: FormArray = new FormArray([]);
        for await (const question of questions) {
          const group: FormGroup = new FormGroup({});
          for (const column of question) {
            group.addControl(column.name, new FormControl(column.answer ? column.answer.value : null));
          }
          formArray.push(group);
        }
        resolve(formArray);
      } catch (error) {
        reject(error);
      }
    });
  }
  public static async createValidators(validations: Validation[]): Promise<ValidatorFn[]> {
    return new Promise<ValidatorFn[]>(async (resolve: (validators: ValidatorFn[]) => void, reject: (error: Error) => void) => {
      try {
        const validators: ValidatorFn[] = [];
        for await (const validation of validations) {
          const validatorFactoryHandler: ValidatorFactoryHandler = (new RequiredValidator())
            .append(new EmailValidator())
            .append(new MaxValidator())
            .append(new MinValidator())
            .append(new MaxLengthValidator())
            .append(new MinLengthValidator())
            .append(new PatternValidator());
          const validatorFn: ValidatorFn = validatorFactoryHandler.handle(validation);
          validators.push(validatorFn);
        }
        resolve(validators);
      } catch (error) {
        reject(error);
      }
    });
  }
  private static getFormStateValue(question: Question<any>): any {
    if ((<Choice>question).defaultOption && (!question.answer || !question.answer.value)) {
      return (<Choice>question).defaultOption;
    }
    if (question.answer && question.answer.value) {
      return question.answer.value;
    }
    return null;
  }
}