@acorex/platform-generator 20.3.0-next.8 → 20.4.0

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 (135) hide show
  1. package/package.json +2 -2
  2. package/src/bin/interactive-entity-creator.js +84 -90
  3. package/src/generators/app-module/files/src/app/app.config.ts.template +63 -13
  4. package/src/generators/app-module/files/src/app/basic-interceptor.interceptor.ts.template +4 -4
  5. package/src/generators/app-module/files/src/app/modules/auth/auth-root.module.ts.template +13 -34
  6. package/src/generators/app-module/files/src/app/{app-version.provider.ts.template → modules/common/app-version.provider.ts.template} +4 -2
  7. package/src/generators/app-module/files/src/app/modules/common/default-settings.providers.ts.template +38 -0
  8. package/src/generators/app-module/files/src/app/modules/common/translation-root.module.ts.template +4 -3
  9. package/src/generators/app-module/files/src/app/modules/layout/entity.loader.ts.template +26 -9
  10. package/src/generators/app-module/files/src/app/modules/layout/layout-root.module.ts.template +15 -17
  11. package/src/generators/app-module/files/src/app/modules/layout/menu.provider.ts.template +1 -15
  12. package/src/generators/app-module/files/src/app/modules/layout/theme-palette.provider.ts.template +57 -0
  13. package/src/generators/app-module/files/src/app/modules/root/const.ts.template +25 -5
  14. package/src/generators/app-module/files/src/app/modules/root/menu.keys.ts.template +9 -0
  15. package/src/generators/app-module/files/src/app/modules/root/menu.provider.ts.template +61 -0
  16. package/src/generators/app-module/files/src/app/modules/root/mock.data.ts.template +13 -37
  17. package/src/generators/app-module/files/src/app/modules/root/permission-definition.provider.ts.template +51 -0
  18. package/src/generators/app-module/files/src/app/modules/root/permission.keys.ts.template +17 -0
  19. package/src/generators/app-module/files/src/app/modules/root/root.module.ts.template +39 -10
  20. package/src/generators/app-module/files/src/app/modules/root/sample/index.ts.template +9 -0
  21. package/src/generators/app-module/files/src/app/modules/root/sample/sample.entity.ts.template +146 -225
  22. package/src/generators/app-module/files/src/app/modules/root/sample/sample.module.ts.template +13 -5
  23. package/src/generators/app-module/files/src/app/modules/root/sample/sample.service.ts.template +26 -6
  24. package/src/generators/app-module/files/src/app/modules/root/sample/sample.types.ts.template +49 -11
  25. package/src/generators/app-module/files/src/app/modules/root/search-command.provider.ts.template +37 -0
  26. package/src/generators/app-module/files/src/assets/i18n/en-US/acorex.json +285 -0
  27. package/src/generators/app-module/files/src/assets/i18n/en-US/activity-log.json +31 -0
  28. package/src/generators/app-module/files/src/assets/i18n/en-US/application-management.json +112 -0
  29. package/src/generators/app-module/files/src/assets/i18n/en-US/auth.json +38 -3
  30. package/src/generators/app-module/files/src/assets/i18n/en-US/calendar-management.json +170 -0
  31. package/src/generators/app-module/files/src/assets/i18n/en-US/contact-management.json +182 -0
  32. package/src/generators/app-module/files/src/assets/i18n/en-US/content-management.json +23 -0
  33. package/src/generators/app-module/files/src/assets/i18n/en-US/conversation.json +120 -0
  34. package/src/generators/app-module/files/src/assets/i18n/en-US/customer-management.json +130 -0
  35. package/src/generators/app-module/files/src/assets/i18n/en-US/dashboard.json +231 -5
  36. package/src/generators/app-module/files/src/assets/i18n/en-US/data-management.json +93 -0
  37. package/src/generators/app-module/files/src/assets/i18n/en-US/document-management.json +321 -22
  38. package/src/generators/app-module/files/src/assets/i18n/en-US/dynamic-form-designer.json +58 -0
  39. package/src/generators/app-module/files/src/assets/i18n/en-US/extra-properties.json +39 -0
  40. package/src/generators/app-module/files/src/assets/i18n/en-US/form-template-management.json +61 -0
  41. package/src/generators/app-module/files/src/assets/i18n/en-US/general-old.json +800 -0
  42. package/src/generators/app-module/files/src/assets/i18n/en-US/general.json +993 -4
  43. package/src/generators/app-module/files/src/assets/i18n/en-US/help-desk.json +55 -0
  44. package/src/generators/app-module/files/src/assets/i18n/en-US/human-capital-management.json +144 -0
  45. package/src/generators/app-module/files/src/assets/i18n/en-US/layout-designer.json +19 -0
  46. package/src/generators/app-module/files/src/assets/i18n/en-US/locale-management.json +30 -0
  47. package/src/generators/app-module/files/src/assets/i18n/en-US/location-management.json +46 -0
  48. package/src/generators/app-module/files/src/assets/i18n/en-US/lock-system.json +40 -0
  49. package/src/generators/app-module/files/src/assets/i18n/en-US/log-management.json +29 -21
  50. package/src/generators/app-module/files/src/assets/i18n/en-US/meeting-management.json +69 -0
  51. package/src/generators/app-module/files/src/assets/i18n/en-US/module.json.template +45 -0
  52. package/src/generators/app-module/files/src/assets/i18n/en-US/notification-management.json +37 -0
  53. package/src/generators/app-module/files/src/assets/i18n/en-US/organization-management.json +59 -138
  54. package/src/generators/app-module/files/src/assets/i18n/en-US/party-management.json +300 -0
  55. package/src/generators/app-module/files/src/assets/i18n/en-US/platform-management.json +20 -79
  56. package/src/generators/app-module/files/src/assets/i18n/en-US/project-management.json +157 -0
  57. package/src/generators/app-module/files/src/assets/i18n/en-US/questionnaire.json +118 -0
  58. package/src/generators/app-module/files/src/assets/i18n/en-US/regional.json +41 -8
  59. package/src/generators/app-module/files/src/assets/i18n/en-US/report-management.json +76 -0
  60. package/src/generators/app-module/files/src/assets/i18n/en-US/security-management.json +42 -3
  61. package/src/generators/app-module/files/src/assets/i18n/en-US/settings.json +17 -0
  62. package/src/generators/app-module/files/src/assets/i18n/en-US/task-management.json +151 -0
  63. package/src/generators/app-module/files/src/assets/i18n/en-US/text-template-management.json +3 -1
  64. package/src/generators/app-module/files/src/assets/i18n/en-US/training-management.json +50 -0
  65. package/src/generators/app-module/files/src/assets/i18n/en-US/workflow-management.json +21 -0
  66. package/src/generators/app-module/files/src/assets/i18n/fa-IR/acorex.json +285 -0
  67. package/src/generators/app-module/files/src/assets/i18n/fa-IR/activity-log.json +31 -0
  68. package/src/generators/app-module/files/src/assets/i18n/fa-IR/application-management.json +112 -0
  69. package/src/generators/app-module/files/src/assets/i18n/fa-IR/auth.json +74 -38
  70. package/src/generators/app-module/files/src/assets/i18n/fa-IR/calendar-management.json +170 -0
  71. package/src/generators/app-module/files/src/assets/i18n/fa-IR/contact-management.json +182 -0
  72. package/src/generators/app-module/files/src/assets/i18n/fa-IR/content-management.json +23 -0
  73. package/src/generators/app-module/files/src/assets/i18n/fa-IR/conversation.json +80 -0
  74. package/src/generators/app-module/files/src/assets/i18n/fa-IR/customer-management.json +130 -0
  75. package/src/generators/app-module/files/src/assets/i18n/fa-IR/dashboard.json +231 -5
  76. package/src/generators/app-module/files/src/assets/i18n/fa-IR/data-management.json +93 -0
  77. package/src/generators/app-module/files/src/assets/i18n/fa-IR/document-management.json +333 -29
  78. package/src/generators/app-module/files/src/assets/i18n/fa-IR/dynamic-form-designer.json +39 -0
  79. package/src/generators/app-module/files/src/assets/i18n/fa-IR/extra-properties.json +39 -0
  80. package/src/generators/app-module/files/src/assets/i18n/fa-IR/form-template-management.json +82 -21
  81. package/src/generators/app-module/files/src/assets/i18n/fa-IR/general-old.json +800 -0
  82. package/src/generators/app-module/files/src/assets/i18n/fa-IR/general.json +987 -9
  83. package/src/generators/app-module/files/src/assets/i18n/fa-IR/global-search.json +5 -5
  84. package/src/generators/app-module/files/src/assets/i18n/fa-IR/help-desk.json +55 -0
  85. package/src/generators/app-module/files/src/assets/i18n/fa-IR/human-capital-management.json +144 -0
  86. package/src/generators/app-module/files/src/assets/i18n/fa-IR/layout-designer.json +19 -0
  87. package/src/generators/app-module/files/src/assets/i18n/fa-IR/layout.json +14 -14
  88. package/src/generators/app-module/files/src/assets/i18n/fa-IR/locale-management.json +30 -0
  89. package/src/generators/app-module/files/src/assets/i18n/fa-IR/location-management.json +46 -0
  90. package/src/generators/app-module/files/src/assets/i18n/fa-IR/lock-system.json +40 -0
  91. package/src/generators/app-module/files/src/assets/i18n/fa-IR/log-management.json +99 -47
  92. package/src/generators/app-module/files/src/assets/i18n/fa-IR/meeting-management.json +69 -0
  93. package/src/generators/app-module/files/src/assets/i18n/fa-IR/module.json.template +45 -0
  94. package/src/generators/app-module/files/src/assets/i18n/fa-IR/notification-management.json +59 -22
  95. package/src/generators/app-module/files/src/assets/i18n/fa-IR/organization-management.json +74 -152
  96. package/src/generators/app-module/files/src/assets/i18n/fa-IR/party-management.json +300 -0
  97. package/src/generators/app-module/files/src/assets/i18n/fa-IR/platform-management.json +38 -93
  98. package/src/generators/app-module/files/src/assets/i18n/fa-IR/project-management.json +157 -0
  99. package/src/generators/app-module/files/src/assets/i18n/fa-IR/questionnaire.json +118 -0
  100. package/src/generators/app-module/files/src/assets/i18n/fa-IR/regional.json +71 -38
  101. package/src/generators/app-module/files/src/assets/i18n/fa-IR/report-management.json +76 -0
  102. package/src/generators/app-module/files/src/assets/i18n/fa-IR/scheduler-job-management.json +4 -4
  103. package/src/generators/app-module/files/src/assets/i18n/fa-IR/security-management.json +43 -4
  104. package/src/generators/app-module/files/src/assets/i18n/fa-IR/settings.json +33 -16
  105. package/src/generators/app-module/files/src/assets/i18n/fa-IR/task-management.json +151 -0
  106. package/src/generators/app-module/files/src/assets/i18n/fa-IR/text-template-management.json +8 -5
  107. package/src/generators/app-module/files/src/assets/i18n/fa-IR/training-management.json +50 -0
  108. package/src/generators/app-module/files/src/assets/i18n/fa-IR/workflow-management.json +20 -0
  109. package/src/generators/app-module/files/src/environments/environment.dev.ts.template +1 -0
  110. package/src/generators/app-module/files/src/environments/environment.ts.template +1 -0
  111. package/src/generators/app-module/generator.js +3 -0
  112. package/src/generators/app-module/generator.js.map +1 -1
  113. package/src/generators/create-module-entity/files/__entityFileName__.entity.ts__tmpl__ +1 -1
  114. package/src/generators/create-tag-entity/files/tag-__entityFileName__.entity.ts__tmpl__ +1 -1
  115. package/src/generators/create-widget/files/__fileName__-widget-column.component.ts__tmpl__ +1 -1
  116. package/src/generators/create-widget/files/__fileName__-widget-edit.component.ts__tmpl__ +1 -1
  117. package/src/generators/create-widget/files/__fileName__-widget-filter.component.ts__tmpl__ +1 -1
  118. package/src/generators/create-widget/files/__fileName__-widget-print.component.ts__tmpl__ +1 -1
  119. package/src/generators/create-widget/files/__fileName__-widget-view.component.ts__tmpl__ +1 -1
  120. package/src/generators/create-widget/files/__fileName__-widget.config.ts__tmpl__ +2 -2
  121. package/src/generators/app-module/files/src/app/app.config.api.ts.template +0 -105
  122. package/src/generators/app-module/files/src/app/app.module.api.ts.template +0 -108
  123. package/src/generators/app-module/files/src/app/app.module.ts.template +0 -113
  124. package/src/generators/app-module/files/src/app/modules/auth/application.loader.ts.template +0 -34
  125. package/src/generators/app-module/files/src/app/modules/auth/auth.strategy.ts.template +0 -93
  126. package/src/generators/app-module/files/src/app/modules/auth/feature.loader.ts.template +0 -17
  127. package/src/generators/app-module/files/src/app/modules/auth/permission.loader.ts.template +0 -20
  128. package/src/generators/app-module/files/src/app/modules/auth/tenant.loader.ts.template +0 -26
  129. package/src/generators/app-module/files/src/app/modules/root/sample/sample.component.html.template +0 -15
  130. package/src/generators/app-module/files/src/app/modules/root/sample/sample.component.scss.template +0 -10
  131. package/src/generators/app-module/files/src/app/modules/root/sample/sample.component.ts.template +0 -20
  132. package/src/generators/app-module/files/src/assets/i18n/en-US/common.json +0 -404
  133. package/src/generators/app-module/files/src/assets/i18n/en-US/vehicle-management.json +0 -146
  134. package/src/generators/app-module/files/src/assets/i18n/fa-IR/common.json +0 -386
  135. package/src/generators/app-module/files/src/assets/i18n/fa-IR/vehicle-management.json +0 -144
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@acorex/platform-generator",
3
- "version": "20.3.0-next.8",
3
+ "version": "20.4.0",
4
4
  "peerDependencies": {
5
- "@acorex/modules": ">=20.0.0"
5
+ "@acorex/modules": "20.4.0"
6
6
  },
7
7
  "type": "commonjs",
8
8
  "main": "./src/index.js",
@@ -27,18 +27,18 @@ function validateName(name) {
27
27
  if (!name || name.trim() === '') {
28
28
  return 'Name cannot be empty.';
29
29
  }
30
-
30
+
31
31
  // Ensure name is not just a number
32
32
  if (/^\d+$/.test(name)) {
33
33
  return 'Name cannot be just a number. Please include at least one letter.';
34
34
  }
35
-
35
+
36
36
  // Less restrictive validation that allows non-Latin characters
37
37
  // Just check for spaces, special characters, and make sure it starts with a letter or non-Latin character
38
38
  if (/^[^a-zA-Z\p{L}]|\s|[^\w\p{L}]/u.test(name)) {
39
39
  return 'Name must start with a letter and cannot contain spaces or special characters.';
40
40
  }
41
-
41
+
42
42
  return null; // No error
43
43
  }
44
44
 
@@ -48,15 +48,13 @@ const isDryRun = process.argv.includes('--dryRun');
48
48
  // Create an interface for readline
49
49
  const rl = readline.createInterface({
50
50
  input: process.stdin,
51
- output: process.stdout
51
+ output: process.stdout,
52
52
  });
53
53
 
54
54
  // Define widget catalog - copied from widget-catalog.ts
55
55
  const widgetCatalog = {
56
56
  text: 'text-editor',
57
- email: 'email-editor',
58
57
  password: 'password-editor',
59
- phone: 'phone-editor',
60
58
  largeText: 'large-text-editor',
61
59
  richText: 'rich-text-editor',
62
60
  number: 'number-editor',
@@ -66,7 +64,6 @@ const widgetCatalog = {
66
64
  toggle: 'toggle-editor',
67
65
  dateTime: 'date-time-editor',
68
66
  color: 'color-editor',
69
- link: 'link-editor',
70
67
  contact: 'contact-editor',
71
68
  tagable: 'tagable-editor',
72
69
  file: 'file',
@@ -78,15 +75,13 @@ const widgetCatalog = {
78
75
  table: 'table-editor',
79
76
  qrcode: 'qrcode',
80
77
  singleFileBox: 'single-file-box-editor',
81
- metaData: 'meta-data-editor'
78
+ metaData: 'meta-data-editor',
82
79
  };
83
80
 
84
81
  // Define widget to data type mapping
85
82
  const widgetToDataType = {
86
83
  'text-editor': 'string',
87
- 'email-editor': 'string',
88
84
  'password-editor': 'string',
89
- 'phone-editor': 'string',
90
85
  'large-text-editor': 'string',
91
86
  'rich-text-editor': 'string',
92
87
  'number-editor': 'number',
@@ -96,35 +91,32 @@ const widgetToDataType = {
96
91
  'toggle-editor': 'boolean',
97
92
  'date-time-editor': 'date',
98
93
  'color-editor': 'string',
99
- 'link-editor': 'string',
100
94
  'contact-editor': 'object',
101
95
  'tagable-editor': 'string',
102
- 'file': 'object',
103
- 'gallery': 'object',
104
- 'signature': 'string',
105
- 'map': 'object',
96
+ file: 'object',
97
+ gallery: 'object',
98
+ signature: 'string',
99
+ map: 'object',
106
100
  'lookup-editor': 'object',
107
101
  'selection-list-editor': 'array',
108
102
  'table-editor': 'array',
109
- 'qrcode': 'string',
103
+ qrcode: 'string',
110
104
  'single-file-box-editor': 'object',
111
- 'meta-data-editor': 'object'
105
+ 'meta-data-editor': 'object',
112
106
  };
113
107
 
114
108
  // Widget groups for better display
115
109
  const widgetGroups = {
116
- 'Basic': ['text-editor', 'large-text-editor', 'rich-text-editor', 'number-editor', 'checkbox-editor', 'toggle-editor'],
117
- 'Input': ['email-editor', 'password-editor', 'phone-editor', 'date-time-editor', 'color-editor'],
118
- 'Complex': ['select-editor', 'lookup-editor', 'selection-list-editor', 'table-editor'],
119
- 'Media': ['file', 'gallery', 'signature', 'map', 'qrcode']
110
+ Basic: ['text-editor', 'large-text-editor', 'rich-text-editor', 'number-editor', 'checkbox-editor', 'toggle-editor'],
111
+ Input: ['password-editor', 'date-time-editor', 'color-editor'],
112
+ Complex: ['select-editor', 'lookup-editor', 'selection-list-editor', 'table-editor'],
113
+ Media: ['file', 'gallery', 'signature', 'map', 'qrcode'],
120
114
  };
121
115
 
122
116
  // Define default colSpan based on widget type
123
117
  const widgetToColSpan = {
124
118
  'text-editor': 6,
125
- 'email-editor': 6,
126
119
  'password-editor': 6,
127
- 'phone-editor': 6,
128
120
  'large-text-editor': 12,
129
121
  'rich-text-editor': 12,
130
122
  'number-editor': 4,
@@ -134,19 +126,18 @@ const widgetToColSpan = {
134
126
  'toggle-editor': 4,
135
127
  'date-time-editor': 6,
136
128
  'color-editor': 4,
137
- 'link-editor': 6,
138
129
  'contact-editor': 8,
139
130
  'tagable-editor': 8,
140
- 'file': 6,
141
- 'gallery': 12,
142
- 'signature': 8,
143
- 'map': 12,
131
+ file: 6,
132
+ gallery: 12,
133
+ signature: 8,
134
+ map: 12,
144
135
  'lookup-editor': 6,
145
136
  'selection-list-editor': 8,
146
137
  'table-editor': 12,
147
- 'qrcode': 6,
138
+ qrcode: 6,
148
139
  'single-file-box-editor': 6,
149
- 'meta-data-editor': 8
140
+ 'meta-data-editor': 8,
150
141
  };
151
142
 
152
143
  // Create data object to store all user input
@@ -163,13 +154,13 @@ const data = {
163
154
  enableSorts: [],
164
155
  enableFilters: [],
165
156
  enableInlineFilters: [],
166
- inColumn: [] // اضافه کردن آرایه جدید برای ذخیره وضعیت نمایش در ستون
157
+ inColumn: [], // اضافه کردن آرایه جدید برای ذخیره وضعیت نمایش در ستون
167
158
  };
168
159
 
169
160
  // Run the prompts in sequence
170
161
  async function runPrompts() {
171
162
  console.log('\n=== AcoreX Platform Interactive Entity Generator ===\n');
172
-
163
+
173
164
  // Get module name with validation
174
165
  while (true) {
175
166
  data.moduleName = await askQuestion('Module name: ');
@@ -180,7 +171,7 @@ async function runPrompts() {
180
171
  break;
181
172
  }
182
173
  }
183
-
174
+
184
175
  // Get entity name with validation
185
176
  while (true) {
186
177
  data.name = await askQuestion('Entity name: ');
@@ -191,7 +182,7 @@ async function runPrompts() {
191
182
  break;
192
183
  }
193
184
  }
194
-
185
+
195
186
  // Get properties
196
187
  console.log('\nEnter properties (type "done" when finished):');
197
188
  let propCount = 1;
@@ -201,50 +192,53 @@ async function runPrompts() {
201
192
  break;
202
193
  }
203
194
  data.properties.push(prop);
204
-
195
+
205
196
  // Get widget for this property
206
197
  const widget = await selectWidget(`Select widget for "${prop}": `);
207
198
  data.widgets.push(widget);
208
-
199
+
209
200
  // Automatically determine data type based on widget
210
201
  const dataType = widgetToDataType[widget] || 'string';
211
202
  data.dataTypes.push(dataType);
212
-
203
+
213
204
  // Ask if this property is required
214
205
  const isRequired = await askQuestion(`Is "${prop}" required? (y/n): `, 'n');
215
206
  if (isRequired.toLowerCase() === 'y') {
216
207
  data.required.push(prop);
217
208
  }
218
-
209
+
219
210
  // Ask if this property should be displayed in columns
220
211
  const showInColumn = await askQuestion(`Show "${prop}" in table columns? (y/n): `, 'y');
221
212
  data.inColumn.push(showInColumn.toLowerCase() === 'y' ? 'true' : 'false');
222
-
213
+
223
214
  // Get colSpan for this property (1-12)
224
215
  const defaultColSpan = widgetToColSpan[widget] || 6;
225
216
  const colSpan = await askQuestion(`Column span for "${prop}" (1-12): `, defaultColSpan.toString());
226
217
  data.colSpans.push(parseInt(colSpan));
227
-
218
+
228
219
  // Get order for this property
229
220
  const defaultOrder = propCount; // Default order is sequential
230
- const order = await askQuestion(`Display order for "${prop}" (default: ${defaultOrder}): `, defaultOrder.toString());
221
+ const order = await askQuestion(
222
+ `Display order for "${prop}" (default: ${defaultOrder}): `,
223
+ defaultOrder.toString(),
224
+ );
231
225
  data.orders.push(parseInt(order));
232
-
226
+
233
227
  // Ask about sort
234
228
  const enableSort = await askQuestion(`Enable sorting for "${prop}"? (y/n): `, 'y');
235
229
  data.enableSorts.push(enableSort.toLowerCase() === 'y' ? 'true' : 'false');
236
-
230
+
237
231
  // Ask about filter
238
232
  const enableFilter = await askQuestion(`Enable filtering for "${prop}"? (y/n): `, 'y');
239
233
  data.enableFilters.push(enableFilter.toLowerCase() === 'y' ? 'true' : 'false');
240
-
234
+
241
235
  // Ask about inline filter
242
236
  const enableInlineFilter = await askQuestion(`Enable inline filtering for "${prop}"? (y/n): `, 'n');
243
237
  data.enableInlineFilters.push(enableInlineFilter.toLowerCase() === 'y' ? 'true' : 'false');
244
-
238
+
245
239
  propCount++;
246
240
  }
247
-
241
+
248
242
  // Get icon
249
243
  console.log('\nSelect an icon:');
250
244
  console.log('1. Default icon (fa-light fa-default)');
@@ -253,28 +247,28 @@ async function runPrompts() {
253
247
  console.log('4. Shopping cart (fa-solid fa-shopping-cart)');
254
248
  console.log('5. File (fa-solid fa-file)');
255
249
  console.log('6. Custom icon');
256
-
250
+
257
251
  const iconChoice = await askQuestion('Select option (1-6): ', '1');
258
252
  const iconOptions = [
259
253
  'fa-light fa-default',
260
254
  'fa-solid fa-box',
261
255
  'fa-solid fa-user',
262
256
  'fa-solid fa-shopping-cart',
263
- 'fa-solid fa-file'
257
+ 'fa-solid fa-file',
264
258
  ];
265
-
259
+
266
260
  if (iconChoice >= 1 && iconChoice <= 5) {
267
261
  data.icon = iconOptions[iconChoice - 1];
268
262
  } else if (iconChoice == 6) {
269
263
  data.icon = await askQuestion('Enter custom icon (format: fa-solid fa-xyz): ', 'fa-solid fa-star');
270
264
  }
271
-
265
+
272
266
  // Show summary
273
267
  console.log('\n=== Summary ===');
274
268
  console.log(`Module: ${data.moduleName}`);
275
269
  console.log(`Entity: ${data.name}`);
276
270
  console.log('Properties:');
277
-
271
+
278
272
  // Sort properties by order for display
279
273
  const propSummary = data.properties.map((prop, i) => ({
280
274
  name: prop,
@@ -286,18 +280,20 @@ async function runPrompts() {
286
280
  enableSort: data.enableSorts[i],
287
281
  enableFilter: data.enableFilters[i],
288
282
  enableInlineFilter: data.enableInlineFilters[i],
289
- inColumn: data.inColumn[i]
283
+ inColumn: data.inColumn[i],
290
284
  }));
291
-
285
+
292
286
  // Sort by order
293
287
  propSummary.sort((a, b) => a.order - b.order);
294
-
295
- propSummary.forEach(prop => {
296
- console.log(` - ${prop.name} (Widget: ${prop.widget}, Type: ${prop.dataType}${prop.required ? ', Required' : ''}, ColSpan: ${prop.colSpan}, Order: ${prop.order}, Sort: ${prop.enableSort ? 'Enabled' : 'Disabled'}, Filter: ${prop.enableFilter ? 'Enabled' : 'Disabled'}, Inline Filter: ${prop.enableInlineFilter ? 'Enabled' : 'Disabled'}, In Column: ${prop.inColumn === 'true' ? 'Yes' : 'No'})`);
288
+
289
+ propSummary.forEach((prop) => {
290
+ console.log(
291
+ ` - ${prop.name} (Widget: ${prop.widget}, Type: ${prop.dataType}${prop.required ? ', Required' : ''}, ColSpan: ${prop.colSpan}, Order: ${prop.order}, Sort: ${prop.enableSort ? 'Enabled' : 'Disabled'}, Filter: ${prop.enableFilter ? 'Enabled' : 'Disabled'}, Inline Filter: ${prop.enableInlineFilter ? 'Enabled' : 'Disabled'}, In Column: ${prop.inColumn === 'true' ? 'Yes' : 'No'})`,
292
+ );
297
293
  });
298
-
294
+
299
295
  console.log(`Icon: ${data.icon}`);
300
-
296
+
301
297
  const confirm = await askQuestion('\nGenerate entity with these settings? (y/n): ', 'y');
302
298
  if (confirm.toLowerCase() === 'y') {
303
299
  runNxGenerator();
@@ -309,9 +305,9 @@ async function runPrompts() {
309
305
 
310
306
  // Helper function to ask questions and get answers
311
307
  function askQuestion(question, defaultAnswer) {
312
- return new Promise(resolve => {
308
+ return new Promise((resolve) => {
313
309
  const prompt = defaultAnswer ? `${question} [${defaultAnswer}] ` : question;
314
-
310
+
315
311
  rl.question(prompt, (answer) => {
316
312
  // If answer is empty and there's a default, use the default
317
313
  const result = answer.trim() === '' && defaultAnswer ? defaultAnswer : answer.trim();
@@ -324,7 +320,7 @@ function askQuestion(question, defaultAnswer) {
324
320
  async function selectWidget(prompt) {
325
321
  console.log(`\n${prompt}`);
326
322
  console.log('Available widgets (you can type to filter):');
327
-
323
+
328
324
  // Display widgets by groups
329
325
  for (const [groupName, groupWidgets] of Object.entries(widgetGroups)) {
330
326
  console.log(`\n${groupName} widgets:`);
@@ -333,17 +329,17 @@ async function selectWidget(prompt) {
333
329
  console.log(` ${(index + 1).toString().padStart(2)}: ${widget} (${widgetKey})`);
334
330
  });
335
331
  }
336
-
332
+
337
333
  // Handling widget selection with filtering
338
334
  let selectedWidget = '';
339
335
  while (!selectedWidget) {
340
336
  const input = await askQuestion('\nEnter widget name or number (or part of name to filter): ');
341
-
337
+
342
338
  // Check if input is a number
343
339
  if (!isNaN(input) && input > 0 && input <= Object.values(widgetCatalog).length) {
344
340
  const allWidgets = Object.values(widgetCatalog);
345
341
  selectedWidget = allWidgets[parseInt(input) - 1];
346
- }
342
+ }
347
343
  // Check if input exactly matches a widget name
348
344
  else if (Object.values(widgetCatalog).includes(input)) {
349
345
  selectedWidget = input;
@@ -354,55 +350,53 @@ async function selectWidget(prompt) {
354
350
  }
355
351
  // Filter widgets by input
356
352
  else {
357
- const filteredWidgets = Object.entries(widgetCatalog)
358
- .filter(([key, value]) =>
359
- key.toLowerCase().includes(input.toLowerCase()) ||
360
- value.toLowerCase().includes(input.toLowerCase())
361
- );
362
-
353
+ const filteredWidgets = Object.entries(widgetCatalog).filter(
354
+ ([key, value]) =>
355
+ key.toLowerCase().includes(input.toLowerCase()) || value.toLowerCase().includes(input.toLowerCase()),
356
+ );
357
+
363
358
  if (filteredWidgets.length === 1) {
364
359
  selectedWidget = filteredWidgets[0][1]; // Pick the only match
365
- }
366
- else if (filteredWidgets.length > 1) {
360
+ } else if (filteredWidgets.length > 1) {
367
361
  console.log('\nFiltered widgets:');
368
362
  filteredWidgets.forEach(([key, value], index) => {
369
363
  console.log(` ${(index + 1).toString().padStart(2)}: ${value} (${key})`);
370
364
  });
371
-
365
+
372
366
  const selection = await askQuestion('Select number or continue typing to filter more: ');
373
367
  if (!isNaN(selection) && selection > 0 && selection <= filteredWidgets.length) {
374
368
  selectedWidget = filteredWidgets[parseInt(selection) - 1][1];
375
369
  }
376
- }
377
- else {
370
+ } else {
378
371
  console.log('No matches found. Try again.');
379
372
  }
380
373
  }
381
374
  }
382
-
375
+
383
376
  return selectedWidget;
384
377
  }
385
378
 
386
379
  // Run the NX generator with collected data
387
380
  function runNxGenerator() {
388
381
  // Handle special cases and ensure proper formatting
389
-
382
+
390
383
  // For empty required array, use "_none_"
391
- const requiredValue = data.required.length === 0 ? "_none_" : data.required.join(',');
392
-
384
+ const requiredValue = data.required.length === 0 ? '_none_' : data.required.join(',');
385
+
393
386
  // Ensure single values for colSpans and orders have trailing commas
394
387
  let colSpansStr = data.colSpans.join(',');
395
388
  if (data.colSpans.length === 1) {
396
389
  colSpansStr = colSpansStr + ',';
397
390
  }
398
-
391
+
399
392
  let ordersStr = data.orders.join(',');
400
393
  if (data.orders.length === 1) {
401
394
  ordersStr = ordersStr + ',';
402
395
  }
403
-
396
+
404
397
  // Prepare arguments properly
405
- const command = `cd "${projectRoot}" && npx nx g @acorex-platform/generator:create-module-entity` +
398
+ const command =
399
+ `cd "${projectRoot}" && npx nx g @acorex-platform/generator:create-module-entity` +
406
400
  ` --moduleName=${data.moduleName}` +
407
401
  ` --name=${data.name}` +
408
402
  ` --properties=${data.properties.join(',')}` +
@@ -416,22 +410,22 @@ function runNxGenerator() {
416
410
  ` --enableInlineFilters=${data.enableInlineFilters.join(',')}` +
417
411
  ` --inColumn=${data.inColumn.join(',')}` +
418
412
  (isDryRun ? ' --dryRun' : '');
419
-
413
+
420
414
  console.log(`\nRunning: ${command}`);
421
-
415
+
422
416
  try {
423
417
  // Execute the command as a shell command to ensure proper environment
424
418
  const { execSync } = require('child_process');
425
- const options = {
419
+ const options = {
426
420
  stdio: 'inherit',
427
- shell: true
421
+ shell: true,
428
422
  };
429
-
423
+
430
424
  execSync(command, options);
431
425
  console.log(`\nGenerator completed successfully`);
432
426
  } catch (error) {
433
427
  console.error(`\nGenerator failed with error: ${error.message}`);
434
-
428
+
435
429
  // Show more detailed error information
436
430
  if (error.stderr) {
437
431
  console.error(`Error details: ${error.stderr.toString()}`);
@@ -442,7 +436,7 @@ function runNxGenerator() {
442
436
  }
443
437
 
444
438
  // Start the prompts
445
- runPrompts().catch(err => {
439
+ runPrompts().catch((err) => {
446
440
  console.error('An error occurred:', err);
447
441
  rl.close();
448
- });
442
+ });
@@ -1,5 +1,5 @@
1
1
  import { ApplicationConfig, importProvidersFrom } from '@angular/core';
2
- import { provideRouter, withEnabledBlockingInitialNavigation, withComponentInputBinding, withNavigationErrorHandler, NavigationError, withDebugTracing } from '@angular/router';
2
+ import { provideRouter, withEnabledBlockingInitialNavigation, withComponentInputBinding } from '@angular/router';
3
3
  import { appRoutes } from './app.routes';
4
4
  import { BrowserModule } from '@angular/platform-browser';
5
5
  import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
@@ -11,19 +11,35 @@ import { AXFormatModule } from '@acorex/core/format';
11
11
  import { AXValidationModule } from '@acorex/core/validation';
12
12
  import { AXPTranslationRootModule } from './modules/common/translation-root.module';
13
13
  import { AXPLayoutRootModule } from './modules/layout/layout-root.module';
14
- import { AXMSettingsManagementModule } from '@acorex/modules/settings-management';
15
- import { <%= className %>AuthRootModule } from './modules/auth/auth-root.module';
16
- import { AXMPlatformManagementModule } from '@acorex/modules/platform-management';
14
+ import { AXCMockModule, AXCUserPassStrategyMock } from '@acorex/connectivity/mock';
15
+ import { AXPAuthModule } from '@acorex/platform/auth';
17
16
  import { AXMNotificationManagementModule } from '@acorex/modules/notification-management';
17
+ import { AXMSettingsManagementModule } from '@acorex/modules/settings-management';
18
+ import { AXMHelpDeskModule } from '@acorex/modules/help-desk';
19
+ import { AXMDashboardManagementModule } from '@acorex/modules/dashboard-management';
20
+ import { AXMHumanCapitalManagementModule } from '@acorex/modules/human-capital-management';
18
21
  import { AXMFormTemplateManagementModule } from '@acorex/modules/form-template-management';
19
- import { AXMTextTemplateManagementModule } from '@acorex/modules/text-template-management';
20
22
  import { AXMSecurityManagementModule } from '@acorex/modules/security-management';
21
23
  import { AXMOrganizationManagementModule } from '@acorex/modules/organization-management';
22
24
  import { AXMLogManagementModule } from '@acorex/modules/log-management';
23
25
  import { AXMDocumentManagementModule } from '@acorex/modules/document-management';
24
- import { AXCMockModule } from '@acorex/connectivity/mock';
25
- import { AXMSampleEntityModule } from './modules/<%= name %>/sample/sample.module';
26
- import { <%= upperCase(name) %>RootModule } from './modules/<%= name %>/<%= name %>-root.module';
26
+ import { AXMProjectManagementModule } from '@acorex/modules/project-management';
27
+ import { AXMTrainingManagementModule } from '@acorex/modules/training-management';
28
+ import { AXMWorkflowManagementModule } from '@acorex/modules/workflow-management';
29
+ import { AXMContentManagementModule } from '@acorex/modules/content-management';
30
+ import { AXMConversationModule } from '@acorex/modules/conversation';
31
+ import { AXMPlatformManagementModule } from '@acorex/modules/platform-management';
32
+ import { AXMDataManagementModule } from '@acorex/modules/data-management';
33
+ import { AXMReportManagementModule } from '@acorex/modules/report-management';
34
+ import { AXMCalendarManagementModule } from '@acorex/modules/calendar-management';
35
+ import { AXMLocationManagementModule } from '@acorex/modules/location-management';
36
+ import { AXMPartyManagementModule } from '@acorex/modules/party-management';
37
+ import { AXMContactManagementModule } from '@acorex/modules/contact-management';
38
+ import { AXMLocaleManagementModule } from '@acorex/modules/locale-management';
39
+ import { AXMMeetingManagementModule } from '@acorex/modules/meeting-management';
40
+ import { AXMTaskManagementModule } from '@acorex/modules/task-management';
41
+ import { AXMIdentifierManagementModule } from '@acorex/modules/identifier-management';
42
+ import { AXMApplicationManagementModule } from '@acorex/modules/application-management';
27
43
 
28
44
  import {
29
45
  AXPHomePageModule,
@@ -37,12 +53,17 @@ import {
37
53
  import { AXPImageUrlLogoConfig } from '@acorex/platform/core';
38
54
 
39
55
  import { environment } from '../environments/environment';
40
- import { <%= className %>AppVersionProvider } from './app-version.provider';
41
- import { AXMCommonModule,AXPGlobalSearchModule } from '@acorex/modules/common';
56
+ import { <%= className %>AppVersionProvider } from './modules/common/app-version.provider';
57
+ import { AXMCommonModule } from '@acorex/modules/common';
58
+ import { AXPGlobalSearchModule } from '@acorex/modules/common';
59
+ import { APP_DEFAULT_SETTINGS_PROVIDERS } from './modules/common/default-settings.providers';
60
+ import { <%= className %>AuthRootModule } from './modules/auth/auth-root.module';
61
+ import { <%= upperCase(name) %>RootModule } from './modules/<%= name %>/<%= name %>-root.module';
42
62
 
43
63
 
44
64
  export const appConfig: ApplicationConfig = {
45
65
  providers: [
66
+ APP_DEFAULT_SETTINGS_PROVIDERS,
46
67
  provideHttpClient(withInterceptorsFromDi()),
47
68
  provideRouter(appRoutes, withEnabledBlockingInitialNavigation(), withComponentInputBinding()),
48
69
  //
@@ -71,7 +92,7 @@ export const appConfig: ApplicationConfig = {
71
92
  light: new AXPImageUrlLogoConfig('assets/images/logos/full-light.svg', 160),
72
93
  },
73
94
  },
74
- title: 'Demo',
95
+ title: '<%= title %>',
75
96
  copyright: '© 2024',
76
97
  }),
77
98
  },
@@ -90,16 +111,45 @@ export const appConfig: ApplicationConfig = {
90
111
  AXValidationModule.forRoot(),
91
112
  //
92
113
  AXPGlobalSearchModule,
93
- AXMSettingsManagementModule,
94
114
  //
95
115
  AXMCommonModule,
96
116
  AXPHomePageModule,
97
117
  //
98
118
  AXPTranslationRootModule,
99
119
  AXPLayoutRootModule,
120
+ // Management Modules (Mock)
121
+ AXMSettingsManagementModule,
122
+ AXMHelpDeskModule,
123
+ AXMDashboardManagementModule,
124
+ AXMNotificationManagementModule,
125
+ AXMFormTemplateManagementModule,
126
+ AXMSecurityManagementModule,
127
+ AXMOrganizationManagementModule,
128
+ AXMHumanCapitalManagementModule,
129
+ AXMLogManagementModule,
130
+ AXMDocumentManagementModule,
131
+ AXMProjectManagementModule,
132
+ AXMTrainingManagementModule,
133
+ AXMWorkflowManagementModule,
134
+ AXMContentManagementModule,
135
+ AXMConversationModule,
136
+ AXMPlatformManagementModule,
137
+ AXMDataManagementModule,
138
+ AXMReportManagementModule,
139
+ AXMCalendarManagementModule,
140
+ AXMLocationManagementModule,
141
+ AXMPartyManagementModule,
142
+ AXMContactManagementModule,
143
+ AXMLocaleManagementModule,
144
+ AXMMeetingManagementModule,
145
+ AXMTaskManagementModule,
146
+ AXMIdentifierManagementModule,
147
+ AXMApplicationManagementModule,
100
148
  //
101
- AXMSampleEntityModule,
102
149
  AXCMockModule,
150
+ AXPAuthModule.forRoot({
151
+ strategies: [AXCUserPassStrategyMock],
152
+ }),
103
153
  //
104
154
  <%= upperCase(name) %>RootModule,
105
155
  <%= className %>AuthRootModule,
@@ -11,21 +11,21 @@ export class BasicInterceptor implements HttpInterceptor {
11
11
  private isRefreshing = false;
12
12
 
13
13
  session = inject(AXPSessionService);
14
- token = this.session.getToken();
15
14
  router = inject(Router);
16
15
 
17
16
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
17
+ const token = this.session.getToken();
18
18
  let modifiedReq = request.clone();
19
19
  if (!(request.body instanceof FormData) && !request.headers.has('Content-Type')) {
20
20
  modifiedReq = modifiedReq.clone({ setHeaders: { 'Content-Type': 'application/json' } });
21
21
  }
22
- if (this.token) {
23
- modifiedReq = modifiedReq.clone({ setHeaders: { Authorization: `Bearer ${this.token}` } });
22
+ if (token) {
23
+ modifiedReq = modifiedReq.clone({ setHeaders: { Authorization: `Bearer ${token}` } });
24
24
  }
25
25
 
26
26
  return next.handle(modifiedReq).pipe(
27
27
  catchError((error: HttpErrorResponse) => {
28
- if (error.status === 401 && !this.isRefreshing && this.token) {
28
+ if (error.status === 401 && !this.isRefreshing && token) {
29
29
  return this.handle401Error(modifiedReq, next);
30
30
  } else {
31
31
  return throwError(() => error);