@hicoder/angular-cli
Version:
Angular UI componenets and service generator. It works with the mean-rest-express package to generate the end to end web application. The input to this generator is the Mongoose schema defined for the express application. mean-rest-express exposes the Res
140 lines (127 loc) • 5.3 kB
text/typescript
import { Component, OnInit, AfterViewInit, Input, Output, Directive, EventEmitter } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Injector } from '@angular/core';
declare const $: any;
import { <%-SchemaName%>EditCustComponent } from '../../../<%-moduleName%>-cust/base/<%-schemaName%>/<%-schemaName%>-edit.cust.component';
import { ViewType } from '../<%-schemaName%>.component';
import { <%-SchemaName%>Service } from '../<%-schemaName%>.service';
<%for (let mapField of mapFieldsRef) {%>
import { <%-mapField[1]%> } from '../../<%-mapField[0]%>/<%-mapField[0]%>.service';<% } %>
<%if (schemaHasValidator) {%>
import { NG_VALIDATORS, Validator, ValidationErrors, AbstractControl, FormGroup } from '@angular/forms';
<%_ compositeEditView.forEach( (field) => {
if (field.validators) {%>
export class <%-ModuleName%><%-SchemaName%>Directive<%-field.FieldName%> implements Validator {
validators:any[] = [
<%field.validators.forEach( (v)=>{%>
{validator: <%-v.validator%>,
msg: `<%-v.msg%>`
},<%})%>
];
validate(control: AbstractControl): ValidationErrors | null {
//TODO: For validator of NgModelGroup, need to get list of contained controls and do validation on the combined data.
let value = control.value;
return this.validateValue(value);
}
validateValue(value:any): ValidationErrors | null {
//only compare when input presents
let result = true;
if (typeof value == '<%-field.jstype%>') {
for (let idx = 0; idx < this.validators.length; idx ++) {
let obj = this.validators[idx];
try {
result = obj.validator(value)
if (result == false ) return { '<%-moduleName%><%-SchemaName%>Directive<%-field.FieldName%>': obj.msg };
} catch (e) {
return { '<%-moduleName%><%-SchemaName%>Directive<%-field.FieldName%>': obj.msg };
}
}
}
return null;
}
}<%_}}); %><%#comments: end of: forEach %>
<%}%><%#comments: end of: if (schemaHasValidator%>
export class <%-SchemaName%>EditComponent extends <%-SchemaName%>EditCustComponent implements OnInit, AfterViewInit {
public action: string = '';
public minDate = {year: (new Date()).getFullYear() - 100, month: 1, day: 1};
public override view: ViewType = ViewType.EDIT;
constructor(
public override <%-schemaName%>Service: <%-SchemaName%>Service,
public override injector: Injector,
public override route: ActivatedRoute,
) {
super(<%-schemaName%>Service, injector, route);
<% let theView = compositeEditView; let isEditView = true;%><%- include('schema-construct.component.ts', {theView: compositeEditView, isEditView: true}) %>
const detail = {};
this.detail = this.formatDetail(detail);
}
override ngOnInit() {
super.ngOnInit();
if (this.embedMode == 'create') { // parent ask to create
this.action='Create';
this.getDetailData();
} else {
let id = this.route.snapshot.paramMap.get('id');
if (!this.id) this.id = id? id : '';
if (this.id) {
this.action='Edit';
this.populateDetailForAction(this.id, 'edit'); //populate with action as 'edit'
}
else {
this.action='Create';
let id = this.route.snapshot.queryParamMap.get('cid');
if (!this.cid) this.cid = id ? id : '';
if (this.cid) {
this.populateDetailFromCopy(this.cid);
} else {
this.getDetailData();
}
}
}
// get editHintFields
this.searchHintFieldValues();
}
ngAfterViewInit() {
// Initialize all tooltips
$('[data-bs-toggle="tooltip"]').tooltip();
}
public override addFieldsRefComponents() {<%if (sFeatures.hasRef) {%>
<%for (let field of compositeEditBriefView) {
if (field.Ref) {%>
if (this.field<%-field.FieldName%>) {
this.fieldsRef['<%-field.fieldName%>'] = this.field<%-field.FieldName%>;
}<%}
}%>
<%}%>
}
getDetailData() {
let detail: any = {<%_ createView.forEach( (field) => {
let fn = field.fieldName;let fdv = field.defaultValue;
if ( typeof(fdv) !== 'undefined' && field.type !== 'SchemaDate') {
/* Schemedate default value is a function, like Now. So sikp it */
%>
<%-fn%>: <%-JSON.stringify(fdv)%>,<%_}
}); %>
};
if (this.initData) {
// Some data fields have been filled already.
this.action='Add';
for (let prop of Object.keys(this.initData)) {
detail[prop] = this.initData[prop];
if (!this.initDataAllowChange) {
this.hiddenFields.push(prop);
}
}
}
this.detail = this.formatDetail(detail);
}
}