File

assets/angular/shared/form/field-control.service.ts

Description

Field / Model Factory Service...

Author: Shilo Banihit

Index

Properties
Methods

Constructor

constructor(vocabFieldLookupService: VocabFieldLookupService, completerService: CompleterService, configService: ConfigService, translationService: TranslationService, utilityService: UtilityService, app: ApplicationRef)
Parameters :
Name Type Optional Description
vocabFieldLookupService VocabFieldLookupService
completerService CompleterService
configService ConfigService
translationService TranslationService
utilityService UtilityService
app ApplicationRef

Methods

flattenFields
flattenFields(fields: any[], fieldArr: any[])
Parameters :
Name Type Optional Description
fields any[]
fieldArr any[]
Returns : void
getEmptyFormGroup
getEmptyFormGroup()
Returns : any
getFieldsMeta
getFieldsMeta(fieldsArr: any)
Parameters :
Name Type Optional Description
fieldsArr any
Returns : any
getLookupData
getLookupData(fields: any[])
Parameters :
Name Type Optional Description
fields any[]
Returns : any
populateFormGroup
populateFormGroup(fields: any[], group: any, fieldMap: any)
Parameters :
Name Type Optional Description
fields any[]
group any
fieldMap any
Returns : any
setupEventHandlers
setupEventHandlers(fieldMap: any)
Parameters :
Name Type Optional Description
fieldMap any
Returns : void
toFormGroup
toFormGroup(fields: FieldBase[], fieldMap: any)
Parameters :
Name Type Optional Description
fields FieldBase<any>[]
fieldMap any
Returns : any

Properties

Protected classes
classes:
import { Injectable, Inject, ApplicationRef }   from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { FieldBase } from './field-base';
import { TextField, Container, TextArea, DateTime, AnchorOrButton, HiddenValue, LinkValue, TabOrAccordionContainer, SelectionField } from './field-simple';
import { TextFieldComponent, RepeatableTextfieldComponent} from './field-textfield.component';
import {
  DropdownFieldComponent,
  TabOrAccordionContainerComponent,
  TextBlockComponent,
  TextAreaComponent,
  DateTimeComponent,
  AnchorOrButtonComponent,
  HiddenValueComponent,
  LinkValueComponent,
  SelectionFieldComponent
} from './field-simple.component';
import { VocabField, VocabFieldComponent, VocabFieldLookupService } from './field-vocab.component';
import { RepeatableContainer, RepeatableVocabComponent, RepeatableContributorComponent } from './field-repeatable.component';
import { ContributorField, ContributorComponent } from './field-contributor.component';
import { WorkflowStepButton, WorkflowStepButtonComponent } from './workflow-button.component';
import { RelatedObjectDataField, RelatedObjectDataComponent } from './field-relatedobjectdata.component';
import * as _ from "lodash-lib";
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/operator/last';
import 'rxjs/add/observable/from';
import { CompleterService } from 'ng2-completer';
import { ConfigService } from '../config-service';
import { TranslationService } from '../translation-service';
import { UtilityService } from '../util-service';
/**
 * Field / Model Factory Service...
 *
 * Author: <a href='https://github.com/shilob' target='_blank'>Shilo Banihit</a>
 *
 */
@Injectable()
export class FieldControlService {
  protected classes = {
    'TextField': { 'meta': TextField, 'comp': TextFieldComponent },
    'TextArea': { 'meta': TextArea, 'comp': TextAreaComponent },
    'DateTime': { 'meta': DateTime, 'comp': DateTimeComponent },
    'Container': {'meta': Container, 'comp': [ TextBlockComponent ] },
    'TabOrAccordionContainer': {'meta': TabOrAccordionContainer, 'comp': TabOrAccordionContainerComponent },
    'AnchorOrButton': { 'meta': AnchorOrButton, 'comp': AnchorOrButtonComponent },
    'VocabField': {'meta': VocabField, 'comp': VocabFieldComponent, 'lookupService': 'vocabFieldLookupService'},
    'RepeatableContainer': {'meta': RepeatableContainer, 'comp': [RepeatableVocabComponent, RepeatableContributorComponent, RepeatableTextfieldComponent]},
    'ContributorField': {'meta': ContributorField, 'comp': ContributorComponent, 'lookupService': 'vocabFieldLookupService'},
    'HiddenValue': {'meta': HiddenValue, 'comp': HiddenValueComponent},
    'WorkflowStepButton': {'meta': WorkflowStepButton, 'comp': WorkflowStepButtonComponent},
    'LinkValueComponent': {'meta': LinkValue, 'comp': LinkValueComponent },
    'SelectionField': {'meta': SelectionField, 'comp': [ SelectionFieldComponent, DropdownFieldComponent ]},
    'RelatedObjectDataField': {'meta': RelatedObjectDataField, 'comp': RelatedObjectDataComponent, 'lookupService': 'vocabFieldLookupService'}
  };
  constructor(@Inject(VocabFieldLookupService) private vocabFieldLookupService: VocabFieldLookupService, @Inject(CompleterService) private completerService: CompleterService,
  @Inject(ConfigService) protected configService: ConfigService,
  @Inject(TranslationService) protected translationService: TranslationService,
  @Inject(UtilityService) protected utilityService: UtilityService,
  protected app: ApplicationRef
  ) {

  }

  getEmptyFormGroup() {
    return new FormGroup({});
  }

  toFormGroup(fields: FieldBase<any>[], fieldMap: any = null ) {
    let group: any = {};
    this.populateFormGroup(fields, group, fieldMap);
    this.setupEventHandlers(fieldMap);
    return new FormGroup(group);
  }

  setupEventHandlers(fieldMap: any) {
    _.forOwn(fieldMap, (fMap:any) => {
      if (fMap.field) {
        fMap.field.setupEventHandlers();
      }
    });
  }

  populateFormGroup(fields: any[], group: any, fieldMap: any) {
    fields.forEach((field:any) => {
      if (field.fields && !field.hasGroup) {
        this.populateFormGroup(field.fields, group, fieldMap);
      } else {
        field.getGroup(group, fieldMap);
      }
    });
    return group;
  }

  getFieldsMeta(fieldsArr: any) {
    const fields = _.map(fieldsArr, (f:any) => {
      const inst = new this.classes[f.class].meta(f.definition, this.app['_injector']);
      inst.utilityService = this.utilityService;
      // set the component class
      if (_.isArray(this.classes[f.class].comp)) {
        inst.compClass = _.find(this.classes[f.class].comp, (c:any)=> { return c.name == f.compClass });
      } else {
        inst.compClass = this.classes[f.class].comp;
      }
      if (f.definition && f.definition.fields) {
        inst.fields = this.getFieldsMeta(f.definition.fields);
      }
      return inst;
    });
    return fields;
  }

  flattenFields(fields: any[], fieldArr: any[]) {
    _.map(fields, (f:any)=> {
      fieldArr.push(f);
      if (f.fields) {
        this.flattenFields(f.fields, fieldArr);
      }
    });
  }

  getLookupData(fields: any[]) {
    let fieldArray: any[] = [];
    this.flattenFields(fields, fieldArray);
    return Observable.from(fieldArray).flatMap((f:any) => {
      if (f.hasLookup) {
        const lookupServiceName = this.classes[f.constructor.name].lookupService;
        f.setLookupServices(this.completerService, this[lookupServiceName]);
        // f.completerService = this.completerService;
        // f.lookupService = this[lookupServiceName];
        return this[lookupServiceName].getLookupData(f);
      } else {
        return Observable.of(null);
      }
    })
    .flatMap((field:any) => {
      return Observable.of(field);
    })
    .last()
    .flatMap((whatever:any) => {
      return Observable.of(fields);
    });
  }

}

results matching ""

    No results matching ""