assets/angular/shared/form/field-control.service.ts
Field / Model Factory Service...
Author: Shilo Banihit
Properties |
|
Methods |
constructor(vocabFieldLookupService: VocabFieldLookupService, completerService: CompleterService, configService: ConfigService, translationService: TranslationService, utilityService: UtilityService, app: ApplicationRef)
|
||||||||||||||||||||||||||||
Parameters :
|
flattenFields | ||||||||||||
flattenFields(fields: any[], fieldArr: any[])
|
||||||||||||
Parameters :
Returns :
void
|
getEmptyFormGroup |
getEmptyFormGroup()
|
Returns :
any
|
getFieldsMeta | ||||||||
getFieldsMeta(fieldsArr: any)
|
||||||||
Parameters :
Returns :
any
|
getLookupData | ||||||||
getLookupData(fields: any[])
|
||||||||
Parameters :
Returns :
any
|
populateFormGroup |
populateFormGroup(fields: any[], group: any, fieldMap: any)
|
Returns :
any
|
setupEventHandlers | ||||||||
setupEventHandlers(fieldMap: any)
|
||||||||
Parameters :
Returns :
void
|
toFormGroup | ||||||||||||
toFormGroup(fields: FieldBase
|
||||||||||||
Parameters :
Returns :
any
|
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);
});
}
}