bpm-core 0.0.129 → 0.0.130
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -4
- package/cli/deploy/build.js +1 -1
- package/cli/deploy/git-operations-handler.js +1 -1
- package/cli/deploy/index.js +1 -1
- package/cli/generate/index.js +2 -0
- package/cli/generate/mock/index.js +17 -15
- package/cli/generate/new/angular-template/.editorconfig +13 -0
- package/cli/generate/new/angular-template/README.md +7 -0
- package/cli/generate/new/angular-template/angular.json.ejs +167 -0
- package/cli/generate/new/angular-template/build.sh +6 -0
- package/cli/generate/new/angular-template/extra-webpack.config.js.ejs +5 -0
- package/cli/generate/new/angular-template/karma.conf.js +44 -0
- package/cli/generate/new/angular-template/package.json.ejs +67 -0
- package/cli/generate/new/angular-template/protractor.conf.js +28 -0
- package/cli/generate/new/angular-template/src/app/app.component.html +35 -0
- package/cli/generate/new/angular-template/src/app/app.component.scss +0 -0
- package/cli/generate/new/angular-template/src/app/app.component.ts +81 -0
- package/cli/generate/new/angular-template/src/app/config/segment-dynamic-loader.config.ts.ejs +8 -0
- package/cli/generate/new/angular-template/src/app/i18n/ar.ts.ejs +18 -0
- package/cli/generate/new/angular-template/src/app/i18n/en.ts.ejs +18 -0
- package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.html.ejs +33 -0
- package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.ts.ejs +128 -0
- package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-field.ejs +97 -0
- package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-table.ejs +27 -0
- package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_ts-field.ejs +3 -0
- package/cli/generate/new/angular-template/src/app/shared/pipes/translate.pipe.ts +32 -0
- package/cli/generate/new/angular-template/src/app/shared/services/i18n.service.ts +32 -0
- package/cli/generate/new/angular-template/src/app/shared/services/segment-dynamic-loader.service.ts.ejs +49 -0
- package/cli/generate/new/angular-template/src/app/shared/services/state-machine.service.ts +119 -0
- package/cli/generate/new/angular-template/src/app/shared/types/lov.enum.ts.ejs +7 -0
- package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.html +5 -0
- package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.scss +0 -0
- package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.ts.ejs +156 -0
- package/cli/generate/new/angular-template/src/app/templates/print.ts.ejs +392 -0
- package/cli/generate/new/angular-template/src/environments/environment.local.ts.ejs +40 -0
- package/cli/generate/new/angular-template/src/environments/environment.prod.ts +25 -0
- package/cli/generate/new/angular-template/src/environments/environment.ts +25 -0
- package/cli/generate/new/angular-template/src/favicon.ico +0 -0
- package/cli/generate/new/angular-template/src/index.html.ejs +14 -0
- package/cli/generate/new/angular-template/src/main.ts +49 -0
- package/cli/generate/new/angular-template/src/polyfills.ts +65 -0
- package/cli/generate/new/angular-template/src/styles.scss.ejs +121 -0
- package/cli/generate/new/angular-template/src/test.ts +26 -0
- package/cli/generate/new/angular-template/tsconfig.app.json +15 -0
- package/cli/generate/new/angular-template/tsconfig.json +50 -0
- package/cli/generate/new/angular-template/tsconfig.spec.json +18 -0
- package/cli/generate/new/angular-template/tslint.json +143 -0
- package/cli/generate/new/copy-and-generate.js +120 -0
- package/cli/generate/new/field.js +4 -0
- package/cli/generate/new/index.js +47 -0
- package/cli/generate/new/service-data.js +284 -0
- package/fesm2022/bpm-core.mjs +244 -252
- package/fesm2022/bpm-core.mjs.map +1 -1
- package/lib/components/shared-components/form-field/attachment-section/attachment-section.component.d.ts +1 -2
- package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +4 -4
- package/lib/components/shared-components/form-field/index.d.ts +0 -1
- package/lib/components/shared-components/form-field/input/input.component.d.ts +3 -2
- package/lib/components/shared-components/form-field/input-number/input-number.component.d.ts +2 -0
- package/lib/components/shared-components/form-field/radio/radio.component.d.ts +39 -2
- package/lib/components/shared-components/form-field/search-employee/search-employee.component.d.ts +5 -5
- package/lib/components/shared-components/form-field/shared-imports.d.ts +1 -4
- package/lib/components/shared-components/form-field/textarea/textarea.component.d.ts +76 -1
- package/lib/components/shared-components/table/table.component.d.ts +3 -3
- package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-filters.d.ts +1 -0
- package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-map-filter.directive.d.ts +4 -1
- package/lib/testComponent/request-details-section/request-details-section.component.d.ts +8 -3
- package/package.json +7 -2
- package/public-api.d.ts +1 -0
- package/lib/directives/ar.directive.d.ts +0 -11
- package/lib/directives/en.directive.d.ts +0 -11
- package/lib/directives/number.directive.d.ts +0 -14
- /package/cli/{deploy → utilities}/utilities.js +0 -0
- /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/index.d.ts +0 -0
- /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-mappers.d.ts +0 -0
- /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/types.d.ts +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.main = main;
|
|
30
|
+
const fs = __importStar(require("fs"));
|
|
31
|
+
const path = __importStar(require("path"));
|
|
32
|
+
const ejs_1 = __importDefault(require("ejs"));
|
|
33
|
+
const prettier_1 = require("prettier");
|
|
34
|
+
const util_1 = require("util");
|
|
35
|
+
const utilities_1 = require("../../utilities/utilities");
|
|
36
|
+
const renderEjsFile = (0, util_1.promisify)(ejs_1.default.renderFile);
|
|
37
|
+
const sourceDir = path.join(__dirname, 'angular-template');
|
|
38
|
+
const destDir = process.cwd();
|
|
39
|
+
;
|
|
40
|
+
function formatWithPrettier(content, fileName) {
|
|
41
|
+
const splitFileName = fileName.split('.');
|
|
42
|
+
const fileExtension = splitFileName[splitFileName.length - 1];
|
|
43
|
+
const parserTyp = {
|
|
44
|
+
'html': 'html',
|
|
45
|
+
'ts': 'typescript',
|
|
46
|
+
'css': 'css',
|
|
47
|
+
'scss': 'scss'
|
|
48
|
+
};
|
|
49
|
+
if (!parserTyp[fileExtension])
|
|
50
|
+
return Promise.resolve(content);
|
|
51
|
+
return (0, prettier_1.format)(content, { parser: parserTyp[fileExtension], printWidth: 120 });
|
|
52
|
+
}
|
|
53
|
+
async function processTemplateFiles(src, dest, serviceData) {
|
|
54
|
+
if (!fs.existsSync(dest))
|
|
55
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
56
|
+
const entries = fs.readdirSync(src);
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
const srcPath = path.join(src, entry);
|
|
59
|
+
const stats = fs.statSync(srcPath);
|
|
60
|
+
if (stats.isDirectory()) {
|
|
61
|
+
if (entry === '@@comp-template@@') {
|
|
62
|
+
const srcPathForPageComponents = src;
|
|
63
|
+
const destPathForPageComponents = dest;
|
|
64
|
+
await writePageComponents(srcPathForPageComponents, destPathForPageComponents, serviceData);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const subDest = path.join(dest, entry);
|
|
68
|
+
await processTemplateFiles(srcPath, subDest, serviceData);
|
|
69
|
+
}
|
|
70
|
+
else if (stats.isFile()) {
|
|
71
|
+
const isEjs = entry.endsWith('.ejs');
|
|
72
|
+
const outputFilename = isEjs ? entry.slice(0, -4) : entry;
|
|
73
|
+
const destPath = path.join(dest, outputFilename);
|
|
74
|
+
if (isEjs) {
|
|
75
|
+
const result = await renderEjsFile(srcPath, serviceData);
|
|
76
|
+
if (result && result.trim()) {
|
|
77
|
+
const formattedResult = await formatWithPrettier(result, destPath);
|
|
78
|
+
fs.writeFileSync(destPath, formattedResult, 'utf8');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
fs.copyFileSync(srcPath, destPath);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function writePageComponents(src, dest, serviceData) {
|
|
88
|
+
if (!fs.existsSync(dest))
|
|
89
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
90
|
+
const templateWrapperPath = path.join(src, '@@comp-template@@');
|
|
91
|
+
const entries = fs.readdirSync(templateWrapperPath);
|
|
92
|
+
for (const compInfo of serviceData.getPageComponents()) {
|
|
93
|
+
for (const entry of entries) {
|
|
94
|
+
if (entry.startsWith('_'))
|
|
95
|
+
continue;
|
|
96
|
+
const filePath = path.join(templateWrapperPath, entry);
|
|
97
|
+
let result = await renderEjsFile(filePath, compInfo);
|
|
98
|
+
const fileSuffix = entry.match(/@@(?<suffix>.+).ejs/)?.groups?.suffix;
|
|
99
|
+
const fileName = compInfo.componentNameKebab + fileSuffix;
|
|
100
|
+
const dir = path.join(dest, compInfo.componentNameKebab);
|
|
101
|
+
const destPath = path.join(dir, fileName);
|
|
102
|
+
if (!fs.existsSync(dir))
|
|
103
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
104
|
+
if (fileSuffix.endsWith('.ts')) {
|
|
105
|
+
result = compInfo.importsManager.renderImports(result);
|
|
106
|
+
}
|
|
107
|
+
const formattedResult = await formatWithPrettier(result, fileName);
|
|
108
|
+
fs.writeFileSync(destPath, formattedResult, 'utf8');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async function main(serviceData) {
|
|
113
|
+
const logger = new utilities_1.Logger();
|
|
114
|
+
try {
|
|
115
|
+
await logger.asyncLog('Generating the service...')(processTemplateFiles(sourceDir, destDir, serviceData), `${serviceData.serviceCode} Service Generated.`, 'Service Generation Failed.');
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.log(`${err.message} ${(err.cause?.message || err.cause) ? 'because ' + (err.cause?.message || err.cause) : ''}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.generateNewProjectCommand = void 0;
|
|
27
|
+
const commander_1 = require("commander");
|
|
28
|
+
const copy_and_generate_1 = require("./copy-and-generate");
|
|
29
|
+
const path = __importStar(require("path"));
|
|
30
|
+
const fs = __importStar(require("fs"));
|
|
31
|
+
const service_data_1 = require("./service-data");
|
|
32
|
+
exports.generateNewProjectCommand = new commander_1.Command('new');
|
|
33
|
+
exports.generateNewProjectCommand.description('Generate a new project based on the provided config, like the form builder');
|
|
34
|
+
exports.generateNewProjectCommand.alias('n');
|
|
35
|
+
exports.generateNewProjectCommand.requiredOption('--config <string>', 'Path to config file');
|
|
36
|
+
exports.generateNewProjectCommand.requiredOption('--service-code <string>', 'Service Code');
|
|
37
|
+
exports.generateNewProjectCommand.action((options) => {
|
|
38
|
+
const cwd = process.cwd();
|
|
39
|
+
const configPath = path.join(cwd, options.config);
|
|
40
|
+
const serviceCode = options.serviceCode;
|
|
41
|
+
if (!fs.existsSync(configPath)) {
|
|
42
|
+
throw new Error(`Config file not found: ${configPath}`);
|
|
43
|
+
}
|
|
44
|
+
const configContent = fs.readFileSync(configPath, 'utf-8');
|
|
45
|
+
const config = JSON.parse(configContent);
|
|
46
|
+
(0, copy_and_generate_1.main)(new service_data_1.ServiceData(serviceCode, config));
|
|
47
|
+
});
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ServiceData = void 0;
|
|
27
|
+
const changeCase = __importStar(require("change-case"));
|
|
28
|
+
class ServiceData {
|
|
29
|
+
constructor(serviceCode, stages) {
|
|
30
|
+
this.serviceCode = serviceCode;
|
|
31
|
+
this.stages = stages;
|
|
32
|
+
this.visibilityCodeLOVEnums = this.parseLOVEnums();
|
|
33
|
+
this.changeCase = changeCase;
|
|
34
|
+
this.en = {};
|
|
35
|
+
this.ar = {};
|
|
36
|
+
this.addI18n();
|
|
37
|
+
}
|
|
38
|
+
getPageComponents() {
|
|
39
|
+
return Object.entries(this.stages).map(([key, value]) => {
|
|
40
|
+
return {
|
|
41
|
+
componentNameKebab: `${changeCase.kebabCase(key)}-section`,
|
|
42
|
+
componentNamePascal: `${changeCase.pascalCase(key)}Section`,
|
|
43
|
+
fields: value.fields,
|
|
44
|
+
getCommonAttributes(field) {
|
|
45
|
+
const attrs = {
|
|
46
|
+
class: "section-item",
|
|
47
|
+
formControlName: field.fieldName,
|
|
48
|
+
"[label]": `'${changeCase.camelCase(field.label)}' | translate`,
|
|
49
|
+
"[mandatory]": field.required,
|
|
50
|
+
"[isReadOnly]": field.readOnly ? 'true' : 'section?.header?.readOnly',
|
|
51
|
+
};
|
|
52
|
+
return Object.entries(attrs).map(([key, value]) => `${key}="${value}"`).join('\n');
|
|
53
|
+
},
|
|
54
|
+
importsManager: new ImportsManager(),
|
|
55
|
+
getFieldType(field) {
|
|
56
|
+
const importManager = this.importsManager;
|
|
57
|
+
switch (field.componentName) {
|
|
58
|
+
case 'input':
|
|
59
|
+
importManager.addImport('InputComponent', 'bpm-core', true);
|
|
60
|
+
return 'string';
|
|
61
|
+
case 'textarea':
|
|
62
|
+
importManager.addImport('TextareaComponent', 'bpm-core', true);
|
|
63
|
+
return 'string';
|
|
64
|
+
case 'input-currency':
|
|
65
|
+
importManager.addImport('InputCurrencyComponent', 'bpm-core', true);
|
|
66
|
+
return 'string';
|
|
67
|
+
case 'input-number':
|
|
68
|
+
importManager.addImport('InputNumberComponent', 'bpm-core', true);
|
|
69
|
+
return 'string';
|
|
70
|
+
case 'datepicker':
|
|
71
|
+
importManager.addImport('DatePickerComponent', 'bpm-core', true);
|
|
72
|
+
return 'string';
|
|
73
|
+
case 'select':
|
|
74
|
+
importManager.addImport('CustomSearchableComponent', 'bpm-core', true);
|
|
75
|
+
importManager.addImport('Select', 'bpm-core');
|
|
76
|
+
return 'Select';
|
|
77
|
+
case 'search-employee':
|
|
78
|
+
importManager.addImport('SearchEmployeeComponent', 'bpm-core', true);
|
|
79
|
+
importManager.addImport('Employee', 'bpm-core');
|
|
80
|
+
return 'Employee';
|
|
81
|
+
case 'attachment-section':
|
|
82
|
+
importManager.addImport('AttachmentSectionComponent', 'bpm-core', true);
|
|
83
|
+
importManager.addImport('Attachment', 'bpm-core');
|
|
84
|
+
return 'Attachment[]';
|
|
85
|
+
case 'file-uploader':
|
|
86
|
+
importManager.addImport('DocsUploaderComponent', 'bpm-core', true);
|
|
87
|
+
importManager.addImport('Attachment', 'bpm-core');
|
|
88
|
+
return 'Attachment';
|
|
89
|
+
case 'table':
|
|
90
|
+
return 'any[]';
|
|
91
|
+
default:
|
|
92
|
+
return 'any';
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
changeCase: changeCase,
|
|
96
|
+
getValidators(field) {
|
|
97
|
+
const importManager = this.importsManager;
|
|
98
|
+
const validators = [];
|
|
99
|
+
switch (field.componentName) {
|
|
100
|
+
case 'input':
|
|
101
|
+
if (field.required)
|
|
102
|
+
validators.push('Validators.required');
|
|
103
|
+
if (field.minLength)
|
|
104
|
+
validators.push(`Validators.minLength(${field.minLength})`);
|
|
105
|
+
break;
|
|
106
|
+
case 'textarea':
|
|
107
|
+
if (field.required)
|
|
108
|
+
validators.push('Validators.required');
|
|
109
|
+
if (field.minLength)
|
|
110
|
+
validators.push(`Validators.minLength(${field.minLength})`);
|
|
111
|
+
break;
|
|
112
|
+
case 'select':
|
|
113
|
+
importManager.addImport('DataValidators', 'bpm-core');
|
|
114
|
+
if (field.required)
|
|
115
|
+
validators.push('DataValidators.selectRequired');
|
|
116
|
+
break;
|
|
117
|
+
case 'search-employee':
|
|
118
|
+
importManager.addImport('DataValidators', 'bpm-core');
|
|
119
|
+
if (field.required)
|
|
120
|
+
validators.push('DataValidators.employeeRequired');
|
|
121
|
+
break;
|
|
122
|
+
case 'file-uploader':
|
|
123
|
+
importManager.addImport('DataValidators', 'bpm-core');
|
|
124
|
+
if (field.required) {
|
|
125
|
+
if (field.multiple)
|
|
126
|
+
validators.push('DataValidators.multiFileUploaderRequired');
|
|
127
|
+
else
|
|
128
|
+
validators.push('DataValidators.fileUploaderRequired');
|
|
129
|
+
}
|
|
130
|
+
break;
|
|
131
|
+
case 'attachment-section':
|
|
132
|
+
importManager.addImport('DataValidators', 'bpm-core');
|
|
133
|
+
if (field.required)
|
|
134
|
+
validators.push('DataValidators.multiFileUploaderRequired');
|
|
135
|
+
break;
|
|
136
|
+
default:
|
|
137
|
+
if (field.required)
|
|
138
|
+
validators.push('Validators.required');
|
|
139
|
+
}
|
|
140
|
+
let output = `[${validators.join(',')}]`;
|
|
141
|
+
if ('visibilityCheckCode' in field && field.componentName !== 'hint') {
|
|
142
|
+
importManager.addImport('validateOnlyWhen', 'bpm-core');
|
|
143
|
+
output = `validateOnlyWhen(() => this.${changeCase.camelCase(`is ${field.fieldName} visible`)}, [${validators.join(',')}])`;
|
|
144
|
+
}
|
|
145
|
+
return output;
|
|
146
|
+
},
|
|
147
|
+
getEnumName(field) {
|
|
148
|
+
const code = field.visibilityCheckCode;
|
|
149
|
+
return [...code.matchAll(/(?<![\w?.])(?<enumName>\b\w+Enum)\.(?<key>\w+)\b/g)]
|
|
150
|
+
.map(item => item.groups.enumName);
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
addI18n() {
|
|
156
|
+
const requestStage = this.stages.requestDetails;
|
|
157
|
+
const setI18n = (field) => {
|
|
158
|
+
if (field.label) {
|
|
159
|
+
const labelKey = changeCase.camelCase(field.label);
|
|
160
|
+
this.en[labelKey] = field.labelEn;
|
|
161
|
+
this.ar[labelKey] = field.labelAr;
|
|
162
|
+
}
|
|
163
|
+
if (field.componentName === 'panel-start' || field.componentName === 'hint') {
|
|
164
|
+
const labelKey = changeCase.camelCase(field.headerName);
|
|
165
|
+
this.en[labelKey] = field.headerNameEn;
|
|
166
|
+
this.ar[labelKey] = field.headerNameAr;
|
|
167
|
+
}
|
|
168
|
+
if (field.componentName === 'table') {
|
|
169
|
+
field.tableColumns.forEach(col => setI18n(col));
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
if (requestStage) {
|
|
173
|
+
this.en.formTitle = requestStage.labelEn;
|
|
174
|
+
this.ar.formTitle = requestStage.labelAr;
|
|
175
|
+
requestStage.fields.forEach(field => setI18n(field));
|
|
176
|
+
}
|
|
177
|
+
this.getRoleStages().forEach(stageInfo => {
|
|
178
|
+
const stageTitleKey = `${stageInfo.role.toLowerCase()}Role`;
|
|
179
|
+
this.en[stageTitleKey] = stageInfo.titleEn;
|
|
180
|
+
this.ar[stageTitleKey] = stageInfo.titleAr;
|
|
181
|
+
stageInfo.fields.forEach(field => setI18n(field));
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
getRoleStages() {
|
|
185
|
+
const roleStages = [];
|
|
186
|
+
Object.entries(this.stages)
|
|
187
|
+
.filter(([key, value]) => key !== 'requestDetails')
|
|
188
|
+
.forEach(([key, item]) => {
|
|
189
|
+
item.roles.forEach((role, index) => {
|
|
190
|
+
roleStages.push({
|
|
191
|
+
role: role.toLowerCase(),
|
|
192
|
+
compClass: `${changeCase.pascalCase(key)}SectionComponent`,
|
|
193
|
+
dirName: `${changeCase.kebabCase(key)}-section`,
|
|
194
|
+
fbConfigKey: key,
|
|
195
|
+
printPartialName: changeCase.camelCase(`section ${key}`),
|
|
196
|
+
fields: item.fields,
|
|
197
|
+
titleAr: item.rolesAr[index],
|
|
198
|
+
titleEn: item.rolesEn[index]
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
return roleStages;
|
|
203
|
+
}
|
|
204
|
+
getSegmentDynamicLoaderConfig() {
|
|
205
|
+
const roleStages = this.getRoleStages();
|
|
206
|
+
const compClassToDirName = roleStages.reduce((prev, curr) => {
|
|
207
|
+
prev[curr.compClass] = curr.dirName;
|
|
208
|
+
return prev;
|
|
209
|
+
}, {});
|
|
210
|
+
return {
|
|
211
|
+
roleToCompClass: roleStages.map(item => `${item.role}: ${item.compClass}`).join(',\n'),
|
|
212
|
+
imports: Object.entries(compClassToDirName).map(([compClass, compDirName]) => `import { ${compClass} } from '../page-components/${compDirName}/${compDirName}.component';`).join('\n')
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
getPrintPartials() {
|
|
216
|
+
let output;
|
|
217
|
+
output = Object.entries(this.stages).map(([key, value]) => {
|
|
218
|
+
return {
|
|
219
|
+
printPartialName: changeCase.camelCase(`section ${key}`),
|
|
220
|
+
fields: value.fields
|
|
221
|
+
};
|
|
222
|
+
});
|
|
223
|
+
return output;
|
|
224
|
+
}
|
|
225
|
+
checkInAllFieldsStages(checker) {
|
|
226
|
+
return Object.values(this.stages).some(stage => stage.fields.some(field => {
|
|
227
|
+
return checker(field);
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
parseLOVEnums() {
|
|
231
|
+
const lovEnums = {};
|
|
232
|
+
Object.entries(this.stages).forEach(([key, value]) => {
|
|
233
|
+
value.fields.forEach(field => {
|
|
234
|
+
const visibilityCheckCode = field.visibilityCheckCode;
|
|
235
|
+
if (visibilityCheckCode) {
|
|
236
|
+
[...visibilityCheckCode.matchAll(/(?<![\w?.])(?<enumName>\b\w+Enum)\.(?<key>\w+)\b/g)]
|
|
237
|
+
.forEach(match => {
|
|
238
|
+
const { enumName, key } = match.groups;
|
|
239
|
+
if (!lovEnums[enumName]) {
|
|
240
|
+
lovEnums[enumName] = new Set();
|
|
241
|
+
}
|
|
242
|
+
lovEnums[enumName].add(key);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
if (!Object.keys(lovEnums).length)
|
|
248
|
+
return null;
|
|
249
|
+
return lovEnums;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
exports.ServiceData = ServiceData;
|
|
253
|
+
class ImportsManager {
|
|
254
|
+
constructor() {
|
|
255
|
+
this.imports = {};
|
|
256
|
+
this.componentImports = new Set();
|
|
257
|
+
}
|
|
258
|
+
addImport(value, path, addToComponentImports = false) {
|
|
259
|
+
if (!this.imports[path]) {
|
|
260
|
+
this.imports[path] = new Set();
|
|
261
|
+
}
|
|
262
|
+
if (!Array.isArray(value))
|
|
263
|
+
value = [value];
|
|
264
|
+
value.forEach(item => this.imports[path].add(item));
|
|
265
|
+
if (addToComponentImports) {
|
|
266
|
+
value.forEach(item => this.componentImports.add(item));
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
getImports() {
|
|
270
|
+
return Object.entries(this.imports).map(([path, value]) => `import { ${[...value].join(', ')} } from '${path}';`).join('\n');
|
|
271
|
+
}
|
|
272
|
+
getComponentImports() {
|
|
273
|
+
return [...this.componentImports].join(', ');
|
|
274
|
+
}
|
|
275
|
+
renderImports(tsContent) {
|
|
276
|
+
if (this.componentImports.size) {
|
|
277
|
+
tsContent = tsContent.replace(/imports:\s*\[\]/, `imports: [${this.getComponentImports()}]`);
|
|
278
|
+
}
|
|
279
|
+
if (Object.keys(this.imports).length) {
|
|
280
|
+
tsContent = `${this.getImports()}\n${tsContent}`;
|
|
281
|
+
}
|
|
282
|
+
return tsContent;
|
|
283
|
+
}
|
|
284
|
+
}
|