@acorex/platform-generator 18.0.11 → 19.0.1

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 (51) hide show
  1. package/generators.json +11 -1
  2. package/package.json +7 -6
  3. package/src/generators/app-module/files/project.json.template +3 -119
  4. package/src/generators/app-module/files/src/app/app.component.ts.template +1 -0
  5. package/src/generators/app-module/files/src/app/app.module.ts.template +15 -20
  6. package/src/generators/app-module/files/src/app/basic-interceptor.interceptor.ts.template +62 -0
  7. package/src/generators/app-module/files/src/app/modules/auth/auth-root.module.ts.template +2 -2
  8. package/src/generators/app-module/files/src/app/modules/layout/entity.loader.ts.template +6 -5
  9. package/src/generators/app-module/files/src/app/modules/layout/layout-root.module.ts.template +32 -34
  10. package/src/generators/app-module/files/src/app/modules/layout/menu.provider.ts.template +104 -0
  11. package/src/generators/app-module/files/src/app/modules/root/const.ts.template +6 -0
  12. package/src/generators/app-module/files/src/app/modules/root/home/home.page.html.template +1 -1
  13. package/src/generators/app-module/files/src/app/modules/root/mock.data.ts.template +14 -0
  14. package/src/generators/app-module/files/src/app/modules/root/sample/sample.entity.ts.template +431 -160
  15. package/src/generators/app-module/files/src/app/modules/root/sample/sample.module.ts.template +18 -0
  16. package/src/generators/app-module/files/src/app/modules/root/sample/sample.service.ts.template +18 -0
  17. package/src/generators/app-module/files/src/app/modules/root/sample/sample.types.ts.template +15 -0
  18. package/src/generators/app-module/files/src/assets/i18n/en/auth.json +12 -0
  19. package/src/generators/app-module/files/src/assets/i18n/en/common.json +108 -1
  20. package/src/generators/app-module/files/src/assets/i18n/en/form-template-management.json +19 -0
  21. package/src/generators/app-module/files/src/assets/i18n/en/notification-management.json +8 -0
  22. package/src/generators/app-module/files/src/assets/i18n/en/platform-management.json +30 -0
  23. package/src/generators/app-module/files/src/assets/i18n/en/platform.json +20 -0
  24. package/src/generators/app-module/files/src/assets/i18n/en/scheduler-job-management.json +6 -0
  25. package/src/generators/app-module/files/src/assets/i18n/en/text-template-management.json +6 -0
  26. package/src/generators/app-module/files/src/assets/i18n/fa/auth.json +61 -0
  27. package/src/generators/app-module/files/src/assets/i18n/fa/common.json +282 -0
  28. package/src/generators/app-module/files/src/assets/i18n/fa/form-template-management.json +19 -0
  29. package/src/generators/app-module/files/src/assets/i18n/fa/notification-management.json +8 -0
  30. package/src/generators/app-module/files/src/assets/i18n/fa/platform-management.json +33 -0
  31. package/src/generators/app-module/files/src/assets/i18n/fa/platform.json +20 -0
  32. package/src/generators/app-module/files/src/assets/i18n/fa/scheduler-job-management.json +6 -0
  33. package/src/generators/app-module/files/src/assets/i18n/fa/text-template-management.json +6 -0
  34. package/src/generators/app-module/files/src/styles.scss.template +10 -11
  35. package/src/generators/app-module/files/tailwind.config.js.template +53 -18
  36. package/src/generators/create-app-module/files/__fileName__/README.md +3 -0
  37. package/src/generators/create-app-module/files/__fileName__/ng-package.json +5 -0
  38. package/src/generators/create-app-module/generator.d.ts +6 -0
  39. package/src/generators/create-app-module/generator.js +25 -0
  40. package/src/generators/create-app-module/generator.js.map +1 -0
  41. package/src/generators/create-app-module/schema.json +13 -0
  42. package/src/generators/create-module-entity/generator.d.ts +7 -0
  43. package/src/generators/create-module-entity/generator.js +94 -0
  44. package/src/generators/create-module-entity/generator.js.map +1 -0
  45. package/src/generators/create-module-entity/schema.json +16 -0
  46. package/src/generators/app-module/files/src/app/header-interceptor.interceptor.ts.template +0 -33
  47. package/src/generators/app-module/files/src/app/modules/layout/menu.loader.ts.template +0 -159
  48. package/src/generators/app-module/files/src/environments/environment.local.ts.template +0 -19
  49. package/src/generators/app-module/files/src/environments/environment.prod.ts.template +0 -19
  50. package/src/generators/app-module/files/src/environments/environment.test.local.ts.template +0 -19
  51. package/src/generators/app-module/files/src/environments/environment.test.ts.template +0 -19
@@ -1,184 +1,455 @@
1
- import { AXDataSourceQuery } from '@acorex/components/common';
2
- import { applyFilterArray, applySortArray } from '@acorex/modules/backend';
1
+
3
2
  import {
4
- AXPEntityConfig,
5
- AXPEntityListDisplayColumnConfig,
6
- convertPropertiesToColumns,
7
- AXPEntityPropertyConfig,
8
- widgetSchemas,
3
+ AXPEntity,
4
+ AXPEntityCommandScope,
5
+ AXPEntityQueryType,
9
6
  } from '@acorex/platform/common';
7
+ import { AXPWidgetsCatalog } from '@acorex/platform/layout/builder';
10
8
  import { Injector } from '@angular/core';
9
+ import { AXMSampleEntityService } from './sample.service';
10
+ import { AXMSampleModuleConst } from '../const';
11
11
 
12
- const properties: AXPEntityPropertyConfig[] = [
13
- {
12
+ export async function sampleFactory(injector: Injector): Promise<AXPEntity | null> {
13
+ const dataService = injector.get(AXMSampleEntityService);
14
+
15
+ const moduleName = AXMSampleModuleConst.moduleName;
16
+
17
+ const entityDef: AXPEntity = {
18
+ module: moduleName,
19
+ name: AXMSampleModuleConst.categoryEntity,
20
+ source: '',
21
+ title: 'Sample Entity',
22
+ formats: {
23
+ individual: 'Sample',
24
+ plural: 'Samples',
25
+ },
26
+ relatedEntities: [],
27
+ groups: [
28
+ {
29
+ id: 'personal',
30
+ title: 'Personal',
31
+ },
32
+ {
33
+ id: 'contact',
34
+ title: 'Contact',
35
+ },
36
+ {
37
+ id: 'address',
38
+ title: 'Address',
39
+ },
40
+ ],
41
+ properties: [
42
+ {
43
+ name: 'id',
44
+ title: 'ID',
45
+ schema: {
46
+ dataType: 'uuid',
47
+ hidden: true,
48
+ nullable: false,
49
+ readonly: true,
50
+ unique: {
51
+ enabled: true,
52
+ },
53
+ },
54
+ },
55
+ {
14
56
  name: 'firstname',
15
57
  title: 'First Name',
16
- schema: widgetSchemas.text,
17
- canEdit: true,
18
- canInsert: true,
19
- canInlineFilter: true,
20
- validationRules: [
21
- {
22
- rule: 'required',
58
+ groupId: 'personal',
59
+ schema: {
60
+ dataType: 'string',
61
+ interface: {
62
+ type: AXPWidgetsCatalog.text,
63
+ },
64
+ },
65
+ options: {
66
+ filter: {
67
+ inline: {
68
+ enabled: true,
23
69
  },
70
+ },
71
+ sort: {
72
+ enabled: true,
73
+ },
74
+ },
75
+ validations: [
76
+ {
77
+ rule: 'required',
78
+ },
24
79
  ],
25
- layout: {
26
- positions: {
27
- default: {
28
- start: 0,
29
- span: 6,
30
- },
80
+ },
81
+ {
82
+ name: 'lastname',
83
+ title: 'Last Name',
84
+ groupId: 'personal',
85
+ schema: {
86
+ dataType: 'string',
87
+ interface: {
88
+ type: AXPWidgetsCatalog.text,
89
+ },
90
+ },
91
+ options: {
92
+ filter: {
93
+ inline: {
94
+ enabled: true,
95
+ },
96
+ },
97
+ sort: {
98
+ enabled: true,
99
+ },
100
+ },
101
+ validations: [
102
+ {
103
+ rule: 'required',
104
+ },
105
+ ],
106
+ },
107
+ {
108
+ name: 'email',
109
+ title: 'Email',
110
+ groupId: 'contact',
111
+ schema: {
112
+ dataType: 'string',
113
+ interface: {
114
+ type: AXPWidgetsCatalog.contact,
115
+ options: {
116
+ type: { id: 'email', title: 'Email' },
117
+ },
118
+ },
119
+ },
120
+ validations: [
121
+ {
122
+ rule: 'required',
123
+ },
124
+ ],
125
+ },
126
+ {
127
+ name: 'phone',
128
+ title: 'Phone',
129
+ groupId: 'contact',
130
+ schema: {
131
+ dataType: 'string',
132
+ interface: {
133
+ type: AXPWidgetsCatalog.contact,
134
+ options: {
135
+ type: { id: 'phone', title: 'phone' },
136
+ },
137
+ },
138
+ },
139
+ validations: [
140
+ {
141
+ rule: 'required',
142
+ },
143
+ ],
144
+ },
145
+ {
146
+ name: 'address',
147
+ title: 'Address',
148
+ groupId: 'address',
149
+ schema: {
150
+ dataType: 'string',
151
+ interface: {
152
+ type: AXPWidgetsCatalog.text,
153
+ options: {
154
+ multiple: false,
155
+ hasLabel: false,
31
156
  },
157
+ },
32
158
  },
159
+ },
160
+ ],
161
+ columns: [{ name: 'firstname' }, { name: 'lastname' }, { name: 'email' }, { name: 'phone' }, { name: 'address' }],
162
+ commands: {
163
+ create: {
164
+ execute: async (data: any) => {
165
+ console.log('CREATE', data);
166
+ const res =await dataService.insertOne(data);
167
+ return {id: res};
168
+ },
169
+ },
170
+ delete: {
171
+ execute: async (id: any) => {
172
+ console.log('DELETE', id);
173
+ return await dataService.deleteOne(id);
174
+ },
175
+ },
176
+ update: {
177
+ execute: async (data: any) => {
178
+ console.log('UPDATE', data);
179
+ return new Promise((resolve) => {
180
+ setTimeout(async () => {
181
+ await dataService.updateOne(data.id, data);
182
+ resolve(data);
183
+ }, 1000);
184
+ });
185
+ },
186
+ },
33
187
  },
34
- {
35
- name: 'lastname',
36
- title: 'Last Name',
37
- schema: widgetSchemas.text,
38
- canEdit: true,
39
- canInsert: true,
40
- canInlineFilter: true,
41
- validationRules: [
188
+ queries: {
189
+ byKey: {
190
+ execute: async (id: string) => {
191
+ console.log('users=>byKey', id);
192
+ return new Promise((resolve) => {
193
+ setTimeout(async () => {
194
+ const entity = await dataService.getOne(id);
195
+ resolve(entity);
196
+ }, 500);
197
+ });
198
+ },
199
+ type: AXPEntityQueryType.Single,
200
+ },
201
+ list: {
202
+ execute: async (e: any) => {
203
+ return await dataService.query({ skip: e.skip, take: e.take, filter: e.filter, sort: e.sort });
204
+ },
205
+ type: AXPEntityQueryType.List,
206
+ },
207
+ },
208
+ interfaces: {
209
+ master: {
210
+ create: {
211
+ sections: [
42
212
  {
43
- rule: 'required',
213
+ id: 'personal',
44
214
  },
45
- ],
46
- layout: {
47
- positions: {
48
- default: {
49
- start: 6,
50
- span: 6,
215
+ {
216
+ id: 'contact',
217
+ },
218
+ ],
219
+ properties: [
220
+ {
221
+ name: 'firstname',
222
+ layout: {
223
+ positions: {
224
+ lg: {
225
+ colSpan: 6,
226
+ },
51
227
  },
228
+ },
52
229
  },
230
+ {
231
+ name: 'lastname',
232
+ layout: {
233
+ positions: {
234
+ lg: {
235
+ colSpan: 6,
236
+ },
237
+ },
238
+ },
239
+ },
240
+ {
241
+ name: 'email',
242
+ layout: {
243
+ positions: {
244
+ lg: {
245
+ colSpan: 6,
246
+ },
247
+ },
248
+ },
249
+ },
250
+ {
251
+ name: 'phone',
252
+ layout: {
253
+ positions: {
254
+ lg: {
255
+ colSpan: 6,
256
+ },
257
+ },
258
+ },
259
+ },
260
+ ],
53
261
  },
54
- },
55
- {
56
- name: 'birthDate',
57
- title: 'Birth Date',
58
- schema: widgetSchemas.date,
59
- canEdit: true,
60
- canInsert: true,
61
- validationRules: [
262
+ update: {
263
+ sections: [
62
264
  {
63
- rule: 'required',
265
+ id: 'personal',
64
266
  },
65
- ],
66
- },
67
- {
68
- name: 'notify',
69
- title: 'Notification',
70
- schema: widgetSchemas.toggle,
71
- canEdit: true,
72
- canInsert: false,
73
- component: {
74
- common: {
75
- options: {
76
- trulyText: 'Enabled',
77
- falsyText: 'Disabled',
267
+ {
268
+ id: 'contact',
269
+ },
270
+ {
271
+ id: 'address',
272
+ },
273
+ ],
274
+ properties: [
275
+ {
276
+ name: 'firstname',
277
+ layout: {
278
+ positions: {
279
+ lg: {
280
+ colSpan: 6,
281
+ },
78
282
  },
283
+ },
79
284
  },
285
+ {
286
+ name: 'lastname',
287
+ layout: {
288
+ positions: {
289
+ lg: {
290
+ colSpan: 6,
291
+ },
292
+ },
293
+ },
294
+ },
295
+ {
296
+ name: 'email',
297
+ layout: {
298
+ positions: {
299
+ lg: {
300
+ colSpan: 6,
301
+ },
302
+ },
303
+ },
304
+ },
305
+ {
306
+ name: 'phone',
307
+ layout: {
308
+ positions: {
309
+ lg: {
310
+ colSpan: 6,
311
+ },
312
+ },
313
+ },
314
+ },
315
+ {
316
+ name: 'address',
317
+ layout: {
318
+ positions: {
319
+ lg: {
320
+ colSpan: 12,
321
+ },
322
+ },
323
+ },
324
+ },
325
+ ],
326
+ },
327
+ single: {
328
+ title: '{{firstname}} {{lastname}}',
329
+ sections: [
330
+ {
331
+ id: 'personal',
332
+ layout: {
333
+ positions: {
334
+ lg: {
335
+ colSpan: 8,
336
+ },
337
+ },
338
+ },
339
+ },
340
+ {
341
+ id: 'contact',
342
+ layout: {
343
+ positions: {
344
+ lg: {
345
+ colSpan: 4,
346
+ },
347
+ },
348
+ },
349
+ },
350
+ {
351
+ id: 'address',
352
+ },
353
+ ],
354
+ properties: [
355
+ {
356
+ name: 'firstname',
357
+ layout: {
358
+ positions: {
359
+ lg: {
360
+ colSpan: 6,
361
+ },
362
+ },
363
+ },
364
+ },
365
+ {
366
+ name: 'lastname',
367
+ layout: {
368
+ positions: {
369
+ lg: {
370
+ colSpan: 6,
371
+ },
372
+ },
373
+ },
374
+ },
375
+ {
376
+ name: 'email',
377
+ layout: {
378
+ positions: {
379
+ lg: {
380
+ colSpan: 12,
381
+ },
382
+ },
383
+ },
384
+ },
385
+ {
386
+ name: 'phone',
387
+ layout: {
388
+ positions: {
389
+ lg: {
390
+ colSpan: 12,
391
+ },
392
+ },
393
+ },
394
+ },
395
+ {
396
+ name: 'address',
397
+ layout: {
398
+ positions: {
399
+ lg: {
400
+ colSpan: 12,
401
+ },
402
+ },
403
+ },
404
+ },
405
+ ],
406
+ actions: [],
80
407
  },
408
+ list: {
409
+ actions: [
410
+ {
411
+ title: 'Create New',
412
+ command: 'create-entity',
413
+ priority: 'primary',
414
+ type: 'create',
415
+ scope: AXPEntityCommandScope.TypeLevel,
416
+ },
417
+ {
418
+ title: 'Delete Items',
419
+ command: 'delete-entity',
420
+ priority: 'primary',
421
+ type: 'delete',
422
+ scope: AXPEntityCommandScope.Selected,
423
+ },
424
+ {
425
+ title: 'Details',
426
+ command: 'open-entity',
427
+ priority: 'primary',
428
+ type: 'view',
429
+ scope: AXPEntityCommandScope.Individual,
430
+ },
431
+ {
432
+ title: 'Delete',
433
+ command: 'delete-entity',
434
+ priority: 'primary',
435
+ type: 'delete',
436
+ scope: AXPEntityCommandScope.Individual,
437
+ },
438
+ ],
439
+ views: [
440
+ {
441
+ name: 'all',
442
+ title: 'All Items',
443
+ fixed: true,
444
+ columns: [],
445
+ conditions: [],
446
+ sorts: [{ name: 'firstname', dir: 'asc' }],
447
+ },
448
+ ],
449
+ },
450
+ },
81
451
  },
82
- ];
83
-
84
- const result = Array.from({ length: 30 }).map((_, i) => ({
85
- id: i,
86
- firstname: ['John', 'Allen', 'Jak', 'Rose', 'Kate'][Math.floor(Math.random() * 5)],
87
- lastname: ['Gates', 'Jonsen', 'Smith', 'Ford', 'Jakson'][Math.floor(Math.random() * 5)],
88
- birthDate: new Date(),
89
- phone: `123456789${i}`,
90
- email: `example@gmail.com`,
91
- notify: Math.floor(Math.random() * 5) % 3 == 0,
92
- }));
93
-
94
- const entityName = 'sample';
95
-
96
- const columns: AXPEntityListDisplayColumnConfig[] = convertPropertiesToColumns(...properties);
97
-
98
- export async function entityFactory(injector: Injector): Promise<AXPEntityConfig> {
99
-
100
- const entity: AXPEntityConfig = {
101
- module: '<%= name %>',
102
- name: entityName,
103
- title: 'Sample Entity',
104
- properties: properties,
105
- formats: {
106
- default: '{{firstname}} {{lastname}}',
107
- },
108
- dataSource: {
109
- key: 'id',
110
- pageSize: 20,
111
- load: async (e: AXDataSourceQuery) => {
112
- const sortedItems = applySortArray(result, e.sort);
113
- const filteredItems = applyFilterArray(sortedItems, e.filter?.filters);
114
- return new Promise((resolve) => {
115
- setTimeout(() => {
116
- resolve({
117
- items: filteredItems.slice(e.skip, (e.skip ?? 0) + (e.take ?? 0)),
118
- total: filteredItems.length,
119
- });
120
- }, 100);
121
- });
122
- },
123
- byKey: (id: any) => {
124
- return new Promise((resolve) => {
125
- setTimeout(() => {
126
- resolve(result.find((c) => c.id.toString() == id));
127
- }, 100);
128
- });
129
- },
130
- },
131
- views: {
132
- list: {
133
- title: 'Sample Entity List',
134
- views: [
135
- {
136
- name: 'all',
137
- title: 'All Items',
138
- fixed: true,
139
- columns: columns,
140
- conditions: [],
141
- sorts: [
142
- {
143
- name: 'firstname',
144
- dir: 'asc',
145
- },
146
- {
147
- name: 'lastname',
148
- dir: 'asc',
149
- },
150
- ],
151
- },
152
- ],
153
- },
154
- quickView: {
155
- root: {
156
- properties: properties.map((c) => c.name),
157
- },
158
- },
159
- detailView: {
160
- root: {
161
- properties: properties.map((c) => c.name),
162
- },
163
- },
164
- createView: {
165
- root: {
166
- properties: properties.slice(0, properties.length - 1).map((c) => c.name),
167
- },
168
- },
169
- },
170
- commands: {
171
- create: async (values) => {
172
- return Promise.resolve({ id: Math.floor(Math.random() * 10000) });
173
- },
174
- update: async (id: string, values) => {
175
- return Promise.resolve();
176
- },
177
- delete: (id: string) => {
178
- return Promise.resolve();
179
- },
180
- }
181
- };
452
+ };
182
453
 
183
- return entity;
454
+ return entityDef;
184
455
  }
@@ -0,0 +1,18 @@
1
+ import { NgModule } from '@angular/core';
2
+ import {
3
+ AXMSampleEntityService,
4
+ AXMSampleEntityServiceImpl
5
+ } from './sample.service';
6
+
7
+ @NgModule({
8
+ imports: [],
9
+ exports: [],
10
+ declarations: [],
11
+ providers: [
12
+ {
13
+ provide: AXMSampleEntityService,
14
+ useClass: AXMSampleEntityServiceImpl,
15
+ },
16
+ ],
17
+ })
18
+ export class AXMSampleEntityModule {}
@@ -0,0 +1,18 @@
1
+ import { AXMEntityCrudServiceImpl } from '@acorex/platform/common';
2
+ import { Injectable } from '@angular/core';
3
+ import { AXMSampleModuleConst } from '../const';
4
+ import { AXMSampleEntityModel } from './sample.types';
5
+ import { AXMSampleCreateEntityModel } from './sample.types';
6
+
7
+ export abstract class AXMSampleEntityService extends AXMEntityCrudServiceImpl<
8
+ string,
9
+ AXMSampleEntityModel,
10
+ AXMSampleCreateEntityModel
11
+ > {}
12
+
13
+ @Injectable()
14
+ export class AXMSampleEntityServiceImpl extends AXMSampleEntityService {
15
+ constructor() {
16
+ super(`${AXMSampleModuleConst.moduleName}.${AXMSampleModuleConst.categoryEntity}`);
17
+ }
18
+ }
@@ -0,0 +1,15 @@
1
+ import { AXPEntityModel } from '@acorex/platform/common';
2
+
3
+ export interface AXMSampleEntityModel extends AXPEntityModel<string> {
4
+ firstname?: string;
5
+ lastname?: string;
6
+ phone?: string;
7
+ email?: string;
8
+ address?: string;
9
+ }
10
+ export interface AXMSampleCreateEntityModel extends AXPEntityModel<string> {
11
+ firstname?: string;
12
+ lastname?: string;
13
+ phone?: string;
14
+ email?: string;
15
+ }
@@ -6,10 +6,17 @@
6
6
  "username-email": "Username / Email",
7
7
  "firstname": "First Name",
8
8
  "lastname": "Last Name",
9
+ "register": "Register",
9
10
  "mobile": "Mobile",
10
11
  "processing": "Processing...",
11
12
  "redirecting": "Redirecting...",
12
13
  "backLogin": "Back to Login",
14
+ "profile": {
15
+ "title": "Profile",
16
+ "edit": "Edit Profile",
17
+ "logout": "Logout",
18
+ "settings": "Settings"
19
+ },
13
20
  "signin": {
14
21
  "title": "Sign In",
15
22
  "submit": "Sign In",
@@ -45,5 +52,10 @@
45
52
  "submit": "Reset Password",
46
53
  "remember": "Remember Password?",
47
54
  "hint": "Enter Your {{ name }}"
55
+ },
56
+ "management": {
57
+ "title": "Security",
58
+ "users": "Users",
59
+ "rols": "Roles"
48
60
  }
49
61
  }