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.
Files changed (75) hide show
  1. package/README.md +57 -4
  2. package/cli/deploy/build.js +1 -1
  3. package/cli/deploy/git-operations-handler.js +1 -1
  4. package/cli/deploy/index.js +1 -1
  5. package/cli/generate/index.js +2 -0
  6. package/cli/generate/mock/index.js +17 -15
  7. package/cli/generate/new/angular-template/.editorconfig +13 -0
  8. package/cli/generate/new/angular-template/README.md +7 -0
  9. package/cli/generate/new/angular-template/angular.json.ejs +167 -0
  10. package/cli/generate/new/angular-template/build.sh +6 -0
  11. package/cli/generate/new/angular-template/extra-webpack.config.js.ejs +5 -0
  12. package/cli/generate/new/angular-template/karma.conf.js +44 -0
  13. package/cli/generate/new/angular-template/package.json.ejs +67 -0
  14. package/cli/generate/new/angular-template/protractor.conf.js +28 -0
  15. package/cli/generate/new/angular-template/src/app/app.component.html +35 -0
  16. package/cli/generate/new/angular-template/src/app/app.component.scss +0 -0
  17. package/cli/generate/new/angular-template/src/app/app.component.ts +81 -0
  18. package/cli/generate/new/angular-template/src/app/config/segment-dynamic-loader.config.ts.ejs +8 -0
  19. package/cli/generate/new/angular-template/src/app/i18n/ar.ts.ejs +18 -0
  20. package/cli/generate/new/angular-template/src/app/i18n/en.ts.ejs +18 -0
  21. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.html.ejs +33 -0
  22. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/@@.component.ts.ejs +128 -0
  23. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-field.ejs +97 -0
  24. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_html-table.ejs +27 -0
  25. package/cli/generate/new/angular-template/src/app/page-components/@@comp-template@@/_ts-field.ejs +3 -0
  26. package/cli/generate/new/angular-template/src/app/shared/pipes/translate.pipe.ts +32 -0
  27. package/cli/generate/new/angular-template/src/app/shared/services/i18n.service.ts +32 -0
  28. package/cli/generate/new/angular-template/src/app/shared/services/segment-dynamic-loader.service.ts.ejs +49 -0
  29. package/cli/generate/new/angular-template/src/app/shared/services/state-machine.service.ts +119 -0
  30. package/cli/generate/new/angular-template/src/app/shared/types/lov.enum.ts.ejs +7 -0
  31. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.html +5 -0
  32. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.scss +0 -0
  33. package/cli/generate/new/angular-template/src/app/templates/print-section/print-section.component.ts.ejs +156 -0
  34. package/cli/generate/new/angular-template/src/app/templates/print.ts.ejs +392 -0
  35. package/cli/generate/new/angular-template/src/environments/environment.local.ts.ejs +40 -0
  36. package/cli/generate/new/angular-template/src/environments/environment.prod.ts +25 -0
  37. package/cli/generate/new/angular-template/src/environments/environment.ts +25 -0
  38. package/cli/generate/new/angular-template/src/favicon.ico +0 -0
  39. package/cli/generate/new/angular-template/src/index.html.ejs +14 -0
  40. package/cli/generate/new/angular-template/src/main.ts +49 -0
  41. package/cli/generate/new/angular-template/src/polyfills.ts +65 -0
  42. package/cli/generate/new/angular-template/src/styles.scss.ejs +121 -0
  43. package/cli/generate/new/angular-template/src/test.ts +26 -0
  44. package/cli/generate/new/angular-template/tsconfig.app.json +15 -0
  45. package/cli/generate/new/angular-template/tsconfig.json +50 -0
  46. package/cli/generate/new/angular-template/tsconfig.spec.json +18 -0
  47. package/cli/generate/new/angular-template/tslint.json +143 -0
  48. package/cli/generate/new/copy-and-generate.js +120 -0
  49. package/cli/generate/new/field.js +4 -0
  50. package/cli/generate/new/index.js +47 -0
  51. package/cli/generate/new/service-data.js +284 -0
  52. package/fesm2022/bpm-core.mjs +244 -252
  53. package/fesm2022/bpm-core.mjs.map +1 -1
  54. package/lib/components/shared-components/form-field/attachment-section/attachment-section.component.d.ts +1 -2
  55. package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +4 -4
  56. package/lib/components/shared-components/form-field/index.d.ts +0 -1
  57. package/lib/components/shared-components/form-field/input/input.component.d.ts +3 -2
  58. package/lib/components/shared-components/form-field/input-number/input-number.component.d.ts +2 -0
  59. package/lib/components/shared-components/form-field/radio/radio.component.d.ts +39 -2
  60. package/lib/components/shared-components/form-field/search-employee/search-employee.component.d.ts +5 -5
  61. package/lib/components/shared-components/form-field/shared-imports.d.ts +1 -4
  62. package/lib/components/shared-components/form-field/textarea/textarea.component.d.ts +76 -1
  63. package/lib/components/shared-components/table/table.component.d.ts +3 -3
  64. package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-filters.d.ts +1 -0
  65. package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-map-filter.directive.d.ts +4 -1
  66. package/lib/testComponent/request-details-section/request-details-section.component.d.ts +8 -3
  67. package/package.json +7 -2
  68. package/public-api.d.ts +1 -0
  69. package/lib/directives/ar.directive.d.ts +0 -11
  70. package/lib/directives/en.directive.d.ts +0 -11
  71. package/lib/directives/number.directive.d.ts +0 -14
  72. /package/cli/{deploy → utilities}/utilities.js +0 -0
  73. /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/index.d.ts +0 -0
  74. /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/input-mappers.d.ts +0 -0
  75. /package/lib/{components/shared-components/form-field/input → directives}/input-map-filter/types.d.ts +0 -0
package/README.md CHANGED
@@ -3,6 +3,19 @@
3
3
 
4
4
  > Ensure your project is updated to Angular 19 to avoid compatibility issues.
5
5
 
6
+ ---
7
+
8
+ ## Table of Contents
9
+
10
+ - [Recently Added Features](#recently-added-features)
11
+ - [BPM Core CLI](#bpm-core-cli)
12
+ - [Input Mapping and Filtering](#input-mapping-and-filtering)
13
+ - [Time Picker](#time-picker)
14
+ - [Summary Section](#summary-section)
15
+ - [Changes Log](#changes-log)
16
+
17
+ ---
18
+
6
19
  ## [Recently Added Features](#recently-added-features)
7
20
  - ### [BPM Core CLI](#bpm-core-cli)
8
21
  A command-line interface tool that provides helper scripts to speed up common tasks.
@@ -20,7 +33,8 @@
20
33
 
21
34
  ---
22
35
 
23
- - `deploy` (supports only library services)
36
+ - `deploy` *Supports only library services*.
37
+
24
38
  Use this command to deploy your service to one of the following environments: `dev`, `sit`, or `bat`.
25
39
 
26
40
  The deployment process includes:
@@ -40,10 +54,16 @@
40
54
  ```bash
41
55
  npx bpm-core deploy --help
42
56
  ```
43
- - `generate` (alias: `g`) — *Supports only library services* Provides subcommands for generating development utilities used in your service.
44
- - `mock` (alias: `m`) Use this subcommand to generate mock data for your service. The generated mock data will be saved in your service root as a file named `mock-output.json`.
57
+ ---
58
+ - `generate` (alias: `g`) *Supports only library services*.
59
+
60
+ Provides the following subcommands:
61
+ - `mock` (alias: `m`).
62
+
63
+ Use this subcommand to generate mock data for your service. The generated mock data will be saved in your service root as a file named `mock-output.json`.
64
+
65
+ **Example usage**
45
66
 
46
- **Example usage**
47
67
  In your terminal, navigate to the service directory and run the following command:
48
68
 
49
69
  ```bash
@@ -51,7 +71,24 @@
51
71
  # or using aliases
52
72
  npx bpm-core g m
53
73
  ```
74
+ ---
75
+ - `new` (alias: `n`)
54
76
 
77
+ Use this subcommand to generate a new service, just like the form builder does.
78
+
79
+ **Example usage**
80
+
81
+ First, create the service directory. Then, in your terminal, navigate to that directory and run the following command:
82
+
83
+ ```bash
84
+ npx bpm-core generate new --config config.json --service-code MSM
85
+ # or using aliases
86
+ npx bpm-core g n --config config.json --service-code MSM
87
+ ```
88
+ The required options are:
89
+ - `--config` the generation config path (like a form builder config).
90
+ - `--service-code` the service code.
91
+ ---
55
92
 
56
93
 
57
94
  - ### [Input Mapping and Filtering](#input-mapping-and-filtering)
@@ -212,6 +249,22 @@
212
249
 
213
250
  ## [Changes Log](#changes-log)
214
251
 
252
+ <a id="bpm-core00130-2025-09-18"></a>
253
+ ### [bpm-core@0.0.130 — 2025-09-18](#bpm-core00130-2025-09-18)
254
+ - feat(cli): add `generate new` command to generate an initial service from a config like the form builder.
255
+ - fix(cli/mock-data): restructure LOVs in payload and enhance logged path generation.
256
+ - [BREAKING CHANGE] fix(custom-searchable): update the default value of the `key` input property to 'value' (was 'description').
257
+ - feat(radio): activate and enhance radio component.
258
+ - refactor: remove ngx-translate package.
259
+ - [BREAKING CHANGE] refactor(input & textarea): remove 'enOnly' and 'arOnly' type values, use filterFn instead.
260
+ - fix(input-number): prevent dropping text into input number.
261
+ - [BREAKING CHANGE] refactor(attachment-section): replace `isRequired` input with `descriptionRequired` input and add `commentsRequired` input.
262
+ - fix(attachment-section): hide label in read-only mode if no attachments.
263
+ - fix(custom-searchable): add padding for search and clear icons in RTL.
264
+ - feat(input): add `maxLength` input property.
265
+ - feat(datepicker): support typed inputs for `minDate`, `maxDate`, `customMinDate`, and `customMaxDate`.
266
+ - feat(search-employee): add `selectedEmployee` output to emit the full details of the selected employee.
267
+
215
268
  <a id="bpm-core00129-2025-09-01"></a>
216
269
  ### [bpm-core@0.0.129 — 2025-09-01](#bpm-core00129-2025-09-01)
217
270
  - feat(cli): add generate command with mock subcommand to produce mock data
@@ -24,7 +24,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.LibraryBuild = exports.Build = void 0;
27
- const utilities_1 = require("./utilities");
27
+ const utilities_1 = require("../utilities/utilities");
28
28
  const fs = __importStar(require("fs"));
29
29
  class Build {
30
30
  constructor() { }
@@ -28,7 +28,7 @@ const fs = __importStar(require("fs"));
28
28
  const path = __importStar(require("path"));
29
29
  const util_1 = require("util");
30
30
  const child_process_1 = require("child_process");
31
- const utilities_1 = require("./utilities");
31
+ const utilities_1 = require("../utilities/utilities");
32
32
  class GitOperationsHandler {
33
33
  constructor() { }
34
34
  async sync(localBuildRepoPath, serviceRemoteDir, servicePath, commitMessage, logger, env) {
@@ -29,7 +29,7 @@ const commander_1 = require("commander");
29
29
  const build_1 = require("./build");
30
30
  const git_operations_handler_1 = require("./git-operations-handler");
31
31
  const jenkins_manager_1 = require("./jenkins-manager");
32
- const utilities_1 = require("./utilities");
32
+ const utilities_1 = require("../utilities/utilities");
33
33
  exports.deployCommand = new commander_1.Command('deploy');
34
34
  exports.deployCommand
35
35
  .description('Deploy a service to a specific environment, deployment process includes building the service, syncing with the remote repository, and running a Jenkins job if credentials are provided.')
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateCommand = void 0;
4
4
  const commander_1 = require("commander");
5
5
  const mock_1 = require("./mock");
6
+ const new_1 = require("./new");
6
7
  exports.generateCommand = new commander_1.Command('generate');
7
8
  exports.generateCommand.alias('g');
8
9
  exports.generateCommand.addCommand(mock_1.generateMockDataCommand);
10
+ exports.generateCommand.addCommand(new_1.generateNewProjectCommand);
@@ -169,20 +169,22 @@ function buildPayloadWithMockData(roleToStageMockMap, requestMock) {
169
169
  }
170
170
  },
171
171
  "meta": {
172
- "decision": {
173
- "options": [
174
- {
175
- "description": "Submit to Account manager",
176
- "value": "SUBMIT_TO_ACCOUNT_MANAGER",
177
- },
178
- {
179
- "description": "Send Back",
180
- "value": "SENDBACK",
181
- }
182
- ],
183
- "type": "button"
184
- },
185
- ...(0, lov_1.getLOVs)()
172
+ "lovs": {
173
+ "decision": {
174
+ "options": [
175
+ {
176
+ "description": "Submit to Account manager",
177
+ "value": "SUBMIT_TO_ACCOUNT_MANAGER",
178
+ },
179
+ {
180
+ "description": "Send Back",
181
+ "value": "SENDBACK",
182
+ }
183
+ ],
184
+ "type": "button"
185
+ },
186
+ ...(0, lov_1.getLOVs)()
187
+ }
186
188
  }
187
189
  };
188
190
  return output;
@@ -201,7 +203,7 @@ function main() {
201
203
  const requestTemplatePath = path.join(projectRoot, '/src/app/page-components/request-details-section/request-details-section.component.html');
202
204
  const requestMock = getTemplateMockData(requestTemplatePath);
203
205
  const payload = buildPayloadWithMockData(stageMocks, requestMock);
204
- const outputPath = projectRoot + '/mock-output.json';
206
+ const outputPath = path.join(projectRoot, '/mock-output.json');
205
207
  fs.writeFileSync(outputPath, JSON.stringify(payload, null, 2), 'utf-8');
206
208
  console.log(`Mock data written to: ${outputPath}`);
207
209
  }
@@ -0,0 +1,13 @@
1
+ # Editor configuration, see http://editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ indent_style = space
7
+ indent_size = 2
8
+ insert_final_newline = true
9
+ trim_trailing_whitespace = true
10
+
11
+ [*.md]
12
+ max_line_length = off
13
+ trim_trailing_whitespace = false
@@ -0,0 +1,7 @@
1
+ # BPM Core CLI
2
+
3
+ This project was generated with [BPM Core CLI](https://www.npmjs.com/package/bpm-core?activeTab=readme#bpm-core-cli).
4
+
5
+ ## Development server
6
+
7
+ Run `ng serve` for a dev server. Navigate to `http://localhost:4200/` . The app will automatically reload if you change any of the source files.
@@ -0,0 +1,167 @@
1
+ {
2
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
3
+ "version": 1,
4
+ "newProjectRoot": "projects",
5
+ "projects": {
6
+ "<%=serviceCode%>": {
7
+ "projectType": "application",
8
+ "schematics": {},
9
+ "root": "",
10
+ "sourceRoot": "src",
11
+ "prefix": "app",
12
+ "architect": {
13
+ "build": {
14
+ "builder": "@angular-builders/custom-webpack:browser",
15
+ "options": {
16
+ "customWebpackConfig": {
17
+ "path": "extra-webpack.config.js",
18
+ "mergeStrategies": {
19
+ "externals": "replace"
20
+ }
21
+ },
22
+ "allowedCommonJsDependencies": [
23
+ "file-saver","handlebars","moment"
24
+ ],
25
+ "outputPath": "dist",
26
+ "index": "src/index.html",
27
+ "main": "src/main.ts",
28
+ "tsConfig": "tsconfig.app.json",
29
+ "polyfills": "src/polyfills.ts",
30
+ "aot": true,
31
+ "assets": [
32
+ "src/favicon.ico",
33
+ "src/assets",
34
+ {
35
+ "glob": "**/*",
36
+ "input": "node_modules/bpm-core/src/lib/assets",
37
+ "output": "/assets/"
38
+ }
39
+ ],
40
+ "styles": [
41
+ "node_modules/@angular/material/prebuilt-themes/indigo-pink.css",
42
+ "node_modules/intl-tel-input/build/css/intlTelInput.css",
43
+ "node_modules/ngx-toastr/toastr.css",
44
+ "node_modules/basic-ui-components/dist/assets/scss/base.scss",
45
+ "node_modules/bpm-core/src/lib/assets/scss/base.scss",
46
+ "src/styles.scss"
47
+ ],
48
+ "scripts": [
49
+ "./node_modules/intl-tel-input/build/js/intlTelInput.min.js"
50
+ ]
51
+ },
52
+ "configurations": {
53
+ "production": {
54
+ "fileReplacements": [
55
+ {
56
+ "replace": "src/environments/environment.ts",
57
+ "with": "src/environments/environment.prod.ts"
58
+ }
59
+ ],
60
+ "optimization": true,
61
+ "outputHashing": "none",
62
+ "sourceMap": false,
63
+ "namedChunks": false,
64
+ "extractLicenses": true,
65
+ "vendorChunk": false,
66
+ "buildOptimizer": true,
67
+ "budgets": [
68
+ {
69
+ "type": "initial",
70
+ "maximumWarning": "4mb",
71
+ "maximumError": "6mb"
72
+ },
73
+ {
74
+ "type": "anyComponentStyle",
75
+ "maximumWarning": "6mb",
76
+ "maximumError": "6mb"
77
+ }
78
+ ]
79
+ },
80
+ "local": {
81
+ "fileReplacements": [
82
+ {
83
+ "replace": "src/environments/environment.ts",
84
+ "with": "src/environments/environment.local.ts"
85
+ }
86
+ ]
87
+ },
88
+ "development": {
89
+ "buildOptimizer": false,
90
+ "optimization": false,
91
+ "vendorChunk": true,
92
+ "extractLicenses": false,
93
+ "sourceMap": true,
94
+ "namedChunks": true,
95
+ "fileReplacements": [
96
+ {
97
+ "replace": "src/environments/environment.ts",
98
+ "with": "src/environments/environment.local.ts"
99
+ }
100
+ ]
101
+ }
102
+ }
103
+ },
104
+ "serve": {
105
+ "builder": "@angular-devkit/build-angular:dev-server",
106
+ "options": {},
107
+ "configurations": {
108
+ "production": {
109
+ "buildTarget": "<%=serviceCode%>:build:production"
110
+ },
111
+ "local": {
112
+ "buildTarget": "<%=serviceCode%>:build:local"
113
+ },
114
+ "development": {
115
+ "buildTarget": "<%=serviceCode%>:build:development"
116
+ }
117
+ },
118
+ "defaultConfiguration": "development"
119
+ },
120
+ "extract-i18n": {
121
+ "builder": "@angular-devkit/build-angular:extract-i18n",
122
+ "options": {
123
+ "buildTarget": "<%=serviceCode%>:build"
124
+ }
125
+ },
126
+ "test": {
127
+ "builder": "@angular-devkit/build-angular:karma",
128
+ "options": {
129
+ "main": "src/test.ts",
130
+ "karmaConfig": "./karma.conf.js",
131
+ "polyfills": "src/polyfills.ts",
132
+ "tsConfig": "src/tsconfig.spec.json",
133
+ "assets": [
134
+ "src/favicon.ico",
135
+ "src/assets"
136
+ ],
137
+ "styles": []
138
+ }
139
+ },
140
+ "e2e": {
141
+ "builder": "@angular-devkit/build-angular:protractor",
142
+ "options": {
143
+ "protractorConfig": "e2e/protractor.conf.js"
144
+ },
145
+ "configurations": {
146
+ "production": {
147
+ "devServerTarget": "<%=serviceCode%>:serve:production"
148
+ },
149
+ "development": {
150
+ "devServerTarget": "<%=serviceCode%>:serve:development"
151
+ }
152
+ },
153
+ "defaultConfiguration": "development"
154
+ },
155
+ "lint": {
156
+ "builder": "@angular-eslint/builder:lint",
157
+ "options": {
158
+ "lintFilePatterns": [
159
+ "src/**/*.ts",
160
+ "src/**/*.html"
161
+ ]
162
+ }
163
+ }
164
+ }
165
+ }
166
+ }
167
+ }
@@ -0,0 +1,6 @@
1
+ npx ng build --aot -c production --output-hashing none
2
+ mv ./dist/main.js ./dist/wm-main.bundle.js
3
+ mv ./dist/styles.css ./dist/wm-styles.bundle.css
4
+ mv ./dist/polyfills.js ./dist/wm-polyfills.bundle.js
5
+ mv ./dist/scripts.js ./dist/wm-scripts.bundle.js
6
+ mv ./dist/runtime.js ./dist/wm-inline.bundle.js
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ output: {
3
+ chunkLoadingGlobal: "webpackJsonp<%=serviceCode%>"
4
+ }
5
+ };
@@ -0,0 +1,44 @@
1
+ // Karma configuration file, see link for more information
2
+ // https://karma-runner.github.io/1.0/config/configuration-file.html
3
+
4
+ module.exports = function (config) {
5
+ config.set({
6
+ basePath: '',
7
+ frameworks: ['jasmine', '@angular-devkit/build-angular'],
8
+ plugins: [
9
+ require('karma-jasmine'),
10
+ require('karma-chrome-launcher'),
11
+ require('karma-jasmine-html-reporter'),
12
+ require('karma-coverage'),
13
+ require('@angular-devkit/build-angular/plugins/karma')
14
+ ],
15
+ client: {
16
+ jasmine: {
17
+ // you can add configuration options for Jasmine here
18
+ // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html
19
+ // for example, you can disable the random execution with `random: false`
20
+ // or set a specific seed with `seed: 4321`
21
+ },
22
+ clearContext: false // leave Jasmine Spec Runner output visible in browser
23
+ },
24
+ jasmineHtmlReporter: {
25
+ suppressAll: true // removes the duplicated traces
26
+ },
27
+ coverageReporter: {
28
+ dir: require('path').join(__dirname, './coverage/contractor-service'),
29
+ subdir: '.',
30
+ reporters: [
31
+ { type: 'html' },
32
+ { type: 'text-summary' }
33
+ ]
34
+ },
35
+ reporters: ['progress', 'kjhtml'],
36
+ port: 9876,
37
+ colors: true,
38
+ logLevel: config.LOG_INFO,
39
+ autoWatch: true,
40
+ browsers: ['Chrome'],
41
+ singleRun: false,
42
+ restartOnFileChange: true
43
+ });
44
+ };
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "<%=serviceCode%>",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "scripts": {
6
+ "ng": "ng",
7
+ "start": "ng serve",
8
+ "build": "ng build --configuration production",
9
+ "test": "ng test",
10
+ "lint": "ng lint",
11
+ "e2e": "ng e2e"
12
+ },
13
+ "private": true,
14
+ "dependencies": {
15
+ "@angular-builders/custom-webpack": "^19.0.0",
16
+ "@angular/animations": "^19.0.0",
17
+ "@angular/cdk": "^19.0.0",
18
+ "@angular/common": "^19.0.0",
19
+ "@angular/compiler": "^19.0.0",
20
+ "@angular/core": "^19.0.0",
21
+ "@angular/forms": "^19.0.0",
22
+ "@angular/localize": "^19.0.0",
23
+ "@angular/material": "^19.0.0",
24
+ "@angular/platform-browser": "^19.0.0",
25
+ "@angular/platform-browser-dynamic": "^19.0.0",
26
+ "@angular/platform-server": "^19.0.0",
27
+ "@angular/router": "^19.0.0",
28
+ "@ncstate/sat-popover": "^13.1.0",
29
+ "basic-ui-components": "^0.0.6992",
30
+ "bootstrap": "^5.3.3",
31
+ "bpm-core": "^0.0.124",
32
+ "date-fns": "^4.1.0",
33
+ "express": "^4.18.2",
34
+ "file-saver": "^2.0.5",
35
+ "google-libphonenumber": "^3.2.42",
36
+ "handlebars": "^4.7.7",
37
+ "handlebars-loader": "^1.7.2",
38
+ "intl-tel-input": "^24.5.0",
39
+ "moment": "^2.29.4",
40
+ "moment-hijri": "^2.30.0",
41
+ "ng-dynamic-component": "^10.7.0",
42
+ "ngx-bootstrap": "^19.0.2",
43
+ "ngx-intl-tel-input-gg": "^1.0.12",
44
+ "ngx-mask": "^18.0.0",
45
+ "ngx-scrollbar": "^15.1.3",
46
+ "ngx-toastr": "^19.0.0",
47
+ "rxjs": "~7.8.0",
48
+ "tslib": "^2.3.0",
49
+ "zone.js": "~0.14.10"
50
+ },
51
+ "devDependencies": {
52
+ "@angular-devkit/build-angular": "^19.0.0",
53
+ "@angular/cli": "^19.0.0",
54
+ "@angular/compiler-cli": "^19.0.0",
55
+ "@types/express": "^4.17.17",
56
+ "@types/jasmine": "~5.1.0",
57
+ "@types/node": "^18.18.0",
58
+ "jasmine-core": "~5.2.0",
59
+ "karma": "~6.4.0",
60
+ "karma-chrome-launcher": "~3.2.0",
61
+ "karma-coverage": "~2.2.0",
62
+ "karma-jasmine": "~5.1.0",
63
+ "karma-jasmine-html-reporter": "~2.1.0",
64
+ "ng-packagr": "^18.2.1",
65
+ "typescript": "~5.5.2"
66
+ }
67
+ }
@@ -0,0 +1,28 @@
1
+ // Protractor configuration file, see link for more information
2
+ // https://github.com/angular/protractor/blob/master/lib/config.ts
3
+
4
+ const { SpecReporter } = require('jasmine-spec-reporter');
5
+
6
+ exports.config = {
7
+ allScriptsTimeout: 11000,
8
+ specs: [
9
+ './e2e/**/*.e2e-spec.ts'
10
+ ],
11
+ capabilities: {
12
+ 'browserName': 'chrome'
13
+ },
14
+ directConnect: true,
15
+ baseUrl: 'http://localhost:4200/',
16
+ framework: 'jasmine',
17
+ jasmineNodeOpts: {
18
+ showColors: true,
19
+ defaultTimeoutInterval: 30000,
20
+ print: function() {}
21
+ },
22
+ onPrepare() {
23
+ require('ts-node').register({
24
+ project: 'e2e/tsconfig.e2e.json'
25
+ });
26
+ jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
27
+ }
28
+ };
@@ -0,0 +1,35 @@
1
+ <core-layout>
2
+ @if (!loading['form']) {
3
+ @if (noError) {
4
+ <core-service-header
5
+ [isLoading]="false"
6
+ [formTitle]="'formTitle' | translate"
7
+ [form]="form">
8
+ <app-print-section [form]="form">
9
+ </app-print-section>
10
+ </core-service-header>
11
+ <app-workflow-section
12
+ workflow
13
+ [segmentDynamicLoaderService]="segmentDynamicLoader"
14
+ [form]="form" [sections]="form?.['sections']">
15
+ <app-request-details-section
16
+ [section]="form.sections[0]" [form]="form" [lov]="form?.lovs" className="form-section"
17
+ [isReadOnly]="form.sections[0].header.readOnly"></app-request-details-section>
18
+ </app-workflow-section>
19
+ } @else {
20
+ @if (errorMessage?.length) {
21
+ <ds-message></ds-message>
22
+ @for (item of errorMessage; track $index) {
23
+ <div class="d-flex justify-content-center">
24
+ <span class="fc-coral fs-18" [innerHTML]="item?.['message']"></span>
25
+ </div>
26
+ }
27
+ } @else {
28
+ <ds-message label="{{'errorOccurred' | translate}}"></ds-message>
29
+ }
30
+ }
31
+ } @else {
32
+ <core-service-header header [formTitle]="'formTitle' | translate" [isLoading]="true">
33
+ </core-service-header>
34
+ }
35
+ </core-layout>
@@ -0,0 +1,81 @@
1
+ import {AfterViewInit, Component, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA} from '@angular/core';
2
+ import {
3
+ CoreService,
4
+ Form,
5
+ LayoutComponent,
6
+ ServiceHeaderComponent,
7
+ SidenavService,
8
+ WorkflowSectionComponent,
9
+ CoreI18nService
10
+ } from 'bpm-core';
11
+ import {DynamicComponentInjectorToken} from 'ng-dynamic-component';
12
+ import {RequestDetailsSectionComponent} from "./page-components/request-details-section/request-details-section.component";
13
+ import {SegmentDynamicLoaderService} from './shared/services/segment-dynamic-loader.service';
14
+ import {DOCUMENT, isPlatformBrowser} from "@angular/common";
15
+ import { Inject, PLATFORM_ID} from '@angular/core';
16
+ import {Router} from "@angular/router";
17
+ import {PrintSectionComponent} from "./templates/print-section/print-section.component";
18
+ import {I18nService} from "./shared/services/i18n.service";
19
+ import { TranslatePipe } from './shared/pipes/translate.pipe';
20
+
21
+ @Component({
22
+ selector: 'app-wm-root',
23
+ standalone: true,
24
+ templateUrl: './app.component.html',
25
+ styleUrl: './app.component.scss',
26
+ imports: [
27
+ LayoutComponent,
28
+ ServiceHeaderComponent,
29
+ WorkflowSectionComponent,
30
+ RequestDetailsSectionComponent,
31
+ PrintSectionComponent,
32
+ TranslatePipe
33
+ ],
34
+ schemas: [CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA],
35
+ providers: [
36
+ {provide: DynamicComponentInjectorToken, useValue: { /* your value here */}}
37
+ ]
38
+
39
+ })
40
+ export class AppComponent implements AfterViewInit {
41
+ loading = {
42
+ form: false
43
+ }
44
+ form: Form
45
+ noError = true;
46
+ errorMessage: [];
47
+ constructor(
48
+ public segmentDynamicLoader: SegmentDynamicLoaderService,
49
+ @Inject(DOCUMENT) private readonly document: Document,
50
+ private readonly router: Router,
51
+ private readonly sidenavService: SidenavService,
52
+ public i18n: I18nService,
53
+ private readonly coreService: CoreService,
54
+ @Inject(PLATFORM_ID) private readonly platformId: any
55
+ ) {
56
+ this.loading['form'] = true
57
+ this.coreService.loadForm().subscribe({
58
+ next: (form: any) => {
59
+ if (form instanceof Form) {
60
+ this.form = form;
61
+ } else {
62
+ this.noError = false;
63
+ }
64
+ this.loading['form'] = false;
65
+ },
66
+ error: (err) => {
67
+ this.noError = false;
68
+ this.loading['form'] = false;
69
+ this.errorMessage = err?.error?.meta?.messages;
70
+ }
71
+ });
72
+ }
73
+
74
+ ngAfterViewInit() {
75
+ if (isPlatformBrowser(this.platformId)) {
76
+ const direction = this.i18n.getLanguage() == 'en' ? 'ltr' : 'rtl';
77
+ document.documentElement.setAttribute('dir', direction);
78
+ }
79
+ }
80
+
81
+ }
@@ -0,0 +1,8 @@
1
+ <% const config = getSegmentDynamicLoaderConfig() -%>
2
+ <%- config.imports %>
3
+
4
+ export default {
5
+ roleToApprovalSectionMapping: {
6
+ <%- config.roleToCompClass -%>
7
+ }
8
+ }