import { Rule } from '@angular-devkit/schematics'; import { IModel, Model, ModelField, maskList } from '@vmfvmf/ywtc-lib'; import { camelize, classify, dasherize } from '@angular-devkit/core/src/utils/strings'; import { getPrjSrd } from '../../../router.gen'; import { FrontEndGenerator } from '../../../shared/generator'; import { UcType } from '@vmfvmf/ywtc-lib/dist/model.enums'; import { P3, P4 } from '../../../router.map'; let imports: Set; export function gen(imodel: IModel): Rule { imports = new Set(); var model = new Model(imodel); const tableableOptionsSet = getTableableOptions(imodel.menuTitle!, imodel.name, [UcType.STDUBD, UcType.CHILD_TABLE].includes(imodel.ucType!) ); const columns = model.getColumns(); const serviceLoader = [UcType.STD, UcType.STDUBD].includes(imodel.ucType!) ? `this.service = AppInjector.get(${model.name}Service);` : ''; if (serviceLoader) { imports.add(`import { ${model.name}Service } from './${dasherize(model.name!)}.service';`); } setEnumImports(model); const importsStr = Array.from(imports).sort().join('\n'); let paginator = ''; if ([UcType.STD, UcType.STDUBD].includes(model.ucType)) { paginator = `\n\toverride showPaginator = true; override paginatorPageSizeOptions = [5,10,15,20,50]`; } return new FrontEndGenerator(__filename).gen({ ...model, ...getPrjSrd(), getColumns, tableableOptionsSet, columns, importsStr, serviceLoader, paginator }); } function setEnumImports(model: Model) { model.getColumns() .filter((mfield: ModelField) => mfield.angularType === 'ENUM') .map((mfield: ModelField) => mfield.enumDefName) .forEach((eName: string) => imports.add(`import { ${camelize(eName)}DescMap } from '../enums/${dasherize(eName)}';`)) } function getColumns(columns: Array) { let completeDeclaration = new Array(); columns.forEach(col => { let declaration = new Array(); declaration.push(`${P4}key: '${col.name}'`); declaration.push(`${P4}header: '${col.label}'`); declaration.push(`${P4}canSort: true`); // TODO fix // declaration.push(`${P4}pipeTransform: ${col.pipeTransform}`); if (col.angularType === 'ENUM') { const enumName = classify(col.enumDefName); const varName = camelize(enumName); if (col.collection) { declaration.push(`${P4}pipeTransform: (es: ${enumName}[] | undefined) => es? es.map(e => ${varName}DescMap.get(e)).join(", ") : ''`) } else { declaration.push(`${P4}pipeTransform: (s: string) => ${varName}DescMap.get(s)!`); } } else if (['DATE', 'DATETIME'].includes(col.angularType) && col.showFormatMask) { declaration.push(`${P4}pipeTransform: (s: Date) => s? this.pipeTransform.date(s, '${col.showFormatMask}') : ''`); } else if (Object.values(maskList).map(m => m.name).includes(col.showFormatMask)) { declaration.push(`${P4}pipeTransform: this.pipeTransform.${col.showFormatMask}`); } completeDeclaration.push(`\n${P3}{\n${declaration.join(',\n')}\n${P3}}`); }); return completeDeclaration.join(',\n'); } function getTableableOptions(tableTitle: string, mdlN: string, updateByDlg: boolean) { let declaration = new Array(); declaration.push('override updateDeleteControl = true;'); declaration.push('override showNewButton = true;'); if (tableTitle) { declaration.push(`override tableTitle = '${tableTitle}';`); declaration.push(`override tableName = '${tableTitle.toLowerCase()}';`); } if (updateByDlg) { imports.add(`import { ${mdlN}UpdateDialogComponent } from './${dasherize(mdlN)}-update-dialog.component';`); declaration.push(`override updateByDialog = ${mdlN}UpdateDialogComponent;`); } return declaration.join('\n'); }