@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
@@ -1,26 +1,9 @@
1
1
  import { AXMAuthModule, AXMAuthenticationTypes, AXM_AUTH_CONFIG_TOKEN, configAuthModule } from '@acorex/modules/auth';
2
- import {
3
- AXPAuthModule,
4
- AXP_APPLICATION_LOADER,
5
- AXP_FEATURE_LOADER,
6
- AXP_PERMISSION_LOADER,
7
- AXP_TENANT_LOADER,
8
- } from '@acorex/platform/auth';
9
2
  import { NgModule } from '@angular/core';
10
3
  import { environment } from '../../../environments/environment';
11
- import { <%= className %>ApplicationLoader } from './application.loader';
12
- import { <%= className %>Strategy } from './auth.strategy';
13
- import { <%= className %>FeatureLoader } from './feature.loader';
14
- import { <%= className %>PermissionLoader } from './permission.loader';
15
- import { <%= className %>TenantLoader } from './tenant.loader';
16
4
 
17
5
  @NgModule({
18
- imports: [
19
- AXMAuthModule,
20
- AXPAuthModule.forRoot({
21
- strategies: [<%= className %>Strategy],
22
- }),
23
- ],
6
+ imports: [AXMAuthModule],
24
7
  exports: [],
25
8
  providers: [
26
9
  {
@@ -28,6 +11,18 @@ import { <%= className %>TenantLoader } from './tenant.loader';
28
11
  useValue: configAuthModule({
29
12
  type: AXMAuthenticationTypes.UsernameEmailPassword,
30
13
  authConfig: { ...environment.oidcConfig },
14
+ baseUrl: environment.baseUrl,
15
+ logoutUrl: environment.logoutUrl,
16
+ signup: {
17
+ enable: true,
18
+ url: '/auth/register',
19
+ },
20
+ defaultStrategyName: 'user-pass',
21
+ externalProviders: {
22
+ google: {
23
+ providerName: 'google',
24
+ },
25
+ },
31
26
  signinPage: {
32
27
  description: `In this kind of post, the blogger introduces a person they've
33
28
  interviewed and provides some background information about the
@@ -37,22 +32,6 @@ import { <%= className %>TenantLoader } from './tenant.loader';
37
32
  },
38
33
  }),
39
34
  },
40
- {
41
- provide: AXP_TENANT_LOADER,
42
- useClass: <%= className %>TenantLoader,
43
- },
44
- {
45
- provide: AXP_APPLICATION_LOADER,
46
- useClass: <%= className %>ApplicationLoader,
47
- },
48
- {
49
- provide: AXP_PERMISSION_LOADER,
50
- useClass: <%= className %>PermissionLoader,
51
- },
52
- {
53
- provide: AXP_FEATURE_LOADER,
54
- useClass: <%= className %>FeatureLoader,
55
- },
56
35
  ],
57
36
  })
58
37
  export class <%= className %>AuthRootModule {}
@@ -1,5 +1,5 @@
1
1
  import { AXPAppVersion, AXPAppVersionProvider } from '@acorex/platform/common';
2
- import pkg from '../../../../package.json';
2
+ import pkg from '../../../../../../package.json';
3
3
 
4
4
  export class <%= className %>AppVersionProvider implements AXPAppVersionProvider {
5
5
  provider(): Promise<AXPAppVersion> {
@@ -9,4 +9,6 @@ export class <%= className %>AppVersionProvider implements AXPAppVersionProvider
9
9
  date: new Date(),
10
10
  });
11
11
  }
12
- }
12
+ }
13
+
14
+
@@ -0,0 +1,38 @@
1
+ //#region ---- Imports ----
2
+
3
+ import { AXPRegionalSetting } from '@acorex/modules/locale-management';
4
+ import {
5
+ AXP_SETTING_DEFAULT_VALUES_PROVIDERS,
6
+ AXPCommonSettings,
7
+ AXPSettingDefaultValuesProvider,
8
+ } from '@acorex/platform/common';
9
+ import { AXPThemeLayoutSetting } from '@acorex/platform/themes/shared';
10
+
11
+ //#endregion
12
+
13
+ //#region ---- App Default Settings Providers ----
14
+
15
+ export const APP_DEFAULT_SETTINGS_PROVIDER: AXPSettingDefaultValuesProvider = {
16
+ priority: 50,
17
+ async provide() {
18
+ return {
19
+ [AXPRegionalSetting.LocaleProfile]: 'en-US',
20
+ [AXPRegionalSetting.Language]: 'en-US',
21
+ [AXPRegionalSetting.TimeZone]: 'UTC',
22
+ [AXPRegionalSetting.FirstDayOfWeek]: 1,
23
+ [AXPThemeLayoutSetting.Palette]: 'golden-dusk',
24
+ [AXPThemeLayoutSetting.MenuBadgeVisible]: true,
25
+ [AXPCommonSettings.EnableOperationToasts]: true,
26
+ } as Record<string, unknown>;
27
+ },
28
+ };
29
+
30
+ export const APP_DEFAULT_SETTINGS_PROVIDERS = {
31
+ provide: AXP_SETTING_DEFAULT_VALUES_PROVIDERS,
32
+ useValue: APP_DEFAULT_SETTINGS_PROVIDER,
33
+ multi: true,
34
+ };
35
+
36
+ //#endregion
37
+
38
+
@@ -19,7 +19,8 @@ export class MyTranslationLoader implements AXTranslationLoader {
19
19
 
20
20
  load(options: AXTranslationLoaderOptions): Observable<AXTranslation> {
21
21
  try {
22
- return this.http.get<AXTranslation>(`/assets/i18n/${options.lang}/${options.scope}.json`);
22
+ const scope = options.scope?.startsWith('general-') ? options.scope?.replace('-', '/') : options.scope;
23
+ return this.http.get<AXTranslation>(`/assets/i18n/${options.lang}/${scope}.json`);
23
24
  } catch (error) {
24
25
  console.error(error);
25
26
  return of({});
@@ -41,11 +42,11 @@ export class MyTranslationLoader implements AXTranslationLoader {
41
42
  useValue: translationConfig({
42
43
  preload: {
43
44
  langs: ['en-US'],
44
- scopes: ['common'],
45
+ scopes: ['acorex', 'general'],
45
46
  },
46
47
  defaults: {
47
48
  lang: 'en-US',
48
- scope: 'common',
49
+ scope: 'general',
49
50
  },
50
51
  }),
51
52
  },
@@ -1,22 +1,39 @@
1
+ //#region ---- Imports ----
2
+
1
3
  import { AXPEntity } from '@acorex/platform/common';
2
4
  import { AXPEntityDefinitionLoader } from '@acorex/platform/layout/entity';
3
5
  import { Injectable, Injector, inject } from '@angular/core';
6
+ import { RootConfig } from '../<%= name %>/const';
7
+
8
+ //#endregion
9
+
10
+ //#region ---- Root Entity Loader ----
4
11
 
12
+ /**
13
+ * Entity definition loader for <%= className %> module entities
14
+ */
5
15
  @Injectable()
6
16
  export class AXPRootEntityLoader implements AXPEntityDefinitionLoader {
17
+
18
+ //#region ---- Services ----
19
+
7
20
  private injector = inject(Injector);
21
+
22
+ //#endregion
23
+
24
+ //#region ---- Get Method ----
8
25
 
9
26
  async get(moduleName: string, entityName: string): Promise<AXPEntity | null> {
10
- return new Promise(async (resolve) => {
27
+ if (moduleName === RootConfig.module.name) {
11
28
  switch (entityName) {
12
- case 'sample': {
13
- const entity = (await import('../<%= name %>/sample/sample.entity')).sampleFactory;
14
- resolve(entity(this.injector) as any);
15
- break;
16
- }
17
- default:
18
- resolve(null);
29
+ case RootConfig.entities.sample.name:
30
+ return (await import('../<%= name %>/sample/sample.entity')).sampleFactory(this.injector);
19
31
  }
20
- });
32
+ }
33
+ return null;
21
34
  }
35
+
36
+ //#endregion
22
37
  }
38
+
39
+ //#endregion
@@ -1,46 +1,44 @@
1
+ import { AXMAppVersionSlotComponent } from '@acorex/modules/platform-management';
1
2
  import {
2
3
  AXPCommonModule,
3
4
  AXPFooterTextSlotComponent,
4
5
  AXPNavBarSlotComponent,
6
+ AXPSettingService,
5
7
  AXP_MENU_PROVIDER,
6
8
  AXP_PLATFORM_CONFIG_TOKEN,
7
9
  } from '@acorex/platform/common';
8
- import { AXPLayoutBuilderModule, AXPWidgetsCatalog, AXP_WIDGETS_EDITOR_CATEGORY } from '@acorex/platform/layout/builder';
10
+ import { AXPWidgetCoreModule, AXPWidgetGroupEnum, AXPWidgetsCatalog, AXP_WIDGETS_EDITOR_CATEGORY } from '@acorex/platform/layout/widget-core';
9
11
  import { AXPEntityModule, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
10
12
  import { AXPDefaultThemeModule } from '@acorex/platform/themes/default';
11
13
  import { AXP_THEME_PALETTE_PROVIDER } from '@acorex/platform/themes/shared';
12
- import { AXPComponentSlotModule } from '@acorex/platform/layout/components';
13
-
14
-
15
14
  import { NgModule, inject } from '@angular/core';
16
- import pkg from '../../../../../../package.json';
17
15
  import { AXPRootEntityLoader } from './entity.loader';
18
16
  import { AXPRootMenuProvider } from './menu.provider';
19
-
17
+ import { AXPComponentSlotModule } from '@acorex/platform/layout/components';
18
+ import { AXPPlatformScope } from '@acorex/platform/core';
20
19
  @NgModule({
21
20
  imports: [
22
21
  AXPDefaultThemeModule,
23
22
  AXPCommonModule,
24
23
  AXPEntityModule,
25
- AXPLayoutBuilderModule.forChild({
24
+ AXPWidgetCoreModule.forChild({
26
25
  widgets: [],
27
26
  extendedWidgets: [],
28
27
  }),
29
28
  AXPComponentSlotModule.forRoot({
30
- 'rootfooter-start': [
29
+ 'root-footer-start': [
31
30
  {
32
31
  name: 'version',
33
- component: AXPFooterTextSlotComponent,
34
- options: () => {
35
- return { text: `v${pkg.version}` };
36
- },
32
+ component: AXMAppVersionSlotComponent,
37
33
  },
38
34
  {
39
35
  name: 'copyright',
40
36
  component: AXPFooterTextSlotComponent,
41
- options: () => {
42
- const a = inject(AXP_PLATFORM_CONFIG_TOKEN);
43
- return { text: a.copyright };
37
+ options: async () => {
38
+ const platformConfig = inject(AXP_PLATFORM_CONFIG_TOKEN);
39
+ const settingService = inject(AXPSettingService);
40
+ const copyrightText = await settingService.scope(AXPPlatformScope.Tenant).get("organization:copyright-text");
41
+ return { text: copyrightText ?? platformConfig.copyright };
44
42
  },
45
43
  },
46
44
  ],
@@ -52,7 +50,7 @@ import { AXPRootMenuProvider } from './menu.provider';
52
50
  ],
53
51
  }),
54
52
  ],
55
- exports: [],
53
+ exports: [AXPDefaultThemeModule],
56
54
  providers: [
57
55
  {
58
56
  provide: AXP_MENU_PROVIDER,
@@ -73,4 +71,4 @@ import { AXPRootMenuProvider } from './menu.provider';
73
71
  },
74
72
  ],
75
73
  })
76
- export class AXPLayoutRootModule {}
74
+ export class AXPLayoutRootModule { }
@@ -1,23 +1,9 @@
1
1
  import { AXPMenuProviderContext, AXPMenuProvider } from '@acorex/platform/common';
2
2
  import { Injectable } from '@angular/core';
3
- import { Router } from '@angular/router';
4
- import { cloneDeep, omit } from 'lodash-es';
5
- import { Observable, of } from 'rxjs';
6
3
 
7
4
  @Injectable()
8
5
  export class AXPRootMenuProvider implements AXPMenuProvider {
9
6
  async provide(context: AXPMenuProviderContext): Promise<void> {
10
- context.addItems([
11
- {
12
- text: 'Sample',
13
- path: '/<%= name %>/m/sample/e/sample/list',
14
- icon: 'fa-solid fa-grid-2',
15
- data: {
16
- //requiredPermission: '',
17
- },
18
- },
19
- ]);
7
+ // Intentionally empty; feature modules should register their own menus.
20
8
  }
21
-
22
-
23
9
  }
@@ -213,6 +213,63 @@ export class AXPRootThemePaletteProvider implements AXPThemePaletteProvider {
213
213
  light: '#fafafa',
214
214
  },
215
215
  },
216
+ {
217
+ name: 'cherry-blossom',
218
+ title: 'Cherry Blossom',
219
+ colors: {
220
+ primary: '#d63384',
221
+ secondary: '#f8b4cb',
222
+ success: '#20c997',
223
+ warning: '#fd7e14',
224
+ danger: '#dc3545',
225
+ accents: ['#6f42c1', '#0dcaf0', '#6c757d'],
226
+ dark: '#251821',
227
+ light: '#ffffff',
228
+ },
229
+ },
230
+ {
231
+ name: 'autumn-harvest',
232
+ title: 'Autumn Harvest',
233
+ colors: {
234
+ primary: '#d2691e',
235
+ secondary: '#cd853f',
236
+ success: '#228b22',
237
+ warning: '#daa520',
238
+ danger: '#b22222',
239
+ accents: ['#8b4513', '#4682b4', '#2f4f4f'],
240
+ dark: '#25140e',
241
+ light: '#ffffff',
242
+ },
243
+ },
244
+ {
245
+ name: 'arctic-glacier',
246
+ title: 'Arctic Glacier',
247
+ colors: {
248
+ primary: '#4169e1',
249
+ secondary: '#87ceeb',
250
+ success: '#32cd32',
251
+ warning: '#ffa500',
252
+ danger: '#dc143c',
253
+ accents: ['#483d8b', '#20b2aa', '#708090'],
254
+ dark: '#172028',
255
+ light: '#ffffff',
256
+ },
257
+ },
258
+ {
259
+ name: 'teal-ocean',
260
+ title: 'Teal Ocean',
261
+ colors: {
262
+ primary: '#018b77',
263
+ secondary: '#00a693',
264
+ neutral: '#606c76',
265
+ success: '#2d9c67',
266
+ warning: '#e9a01b',
267
+ danger: '#c02f1d',
268
+ accents: ['#006b5c', '#4db6ac', '#80cbc4'],
269
+ dark: '#131f1c',
270
+ light: '#ffffff',
271
+ },
272
+ },
216
273
  ]);
217
274
  }
218
275
  }
@@ -1,6 +1,26 @@
1
- export const AXMSampleModuleConst = {
2
- moduleName: 'sample',
3
- moduleRoute: 'sample',
4
- categoryEntity: 'sample',
5
- templateEntity: 'templates',
1
+ //#region ---- Module Configuration ----
2
+
3
+ const config = {
4
+ i18n: '<%= name %>-module',
5
+ module: '<%= className %>Module',
6
6
  };
7
+
8
+ export const RootConfig = {
9
+ config,
10
+ module: {
11
+ route: '<%= name %>',
12
+ name: '<%= className %>Module',
13
+ title: `t('module-name', {scope:"${config.i18n}"})`,
14
+ icon: 'fa-light fa-cube',
15
+ },
16
+ entities: {
17
+ sample: {
18
+ name: 'Sample',
19
+ title: `t("sample.individual-title",{scope:"${config.i18n}"})`,
20
+ source: `${config.module}.Sample`,
21
+ icon: 'fa-light fa-box',
22
+ },
23
+ },
24
+ };
25
+
26
+ //#endregion
@@ -0,0 +1,9 @@
1
+ //#region ---- Menu Keys ----
2
+
3
+ export const <%= className %>ModuleMenuKeys = {
4
+ Root: '<%= name %>-module:menu',
5
+ Samples: '<%= name %>-module:menu:samples',
6
+ } as const;
7
+
8
+ //#endregion
9
+
@@ -0,0 +1,61 @@
1
+ //#region ---- Imports ----
2
+
3
+ import { AXPSessionService } from '@acorex/platform/auth';
4
+ import { AXPMenuProvider, AXPMenuProviderContext } from '@acorex/platform/common';
5
+ import { AXPEntityService } from '@acorex/platform/layout/entity';
6
+ import { inject } from '@angular/core';
7
+ import { firstValueFrom } from 'rxjs';
8
+ import { RootConfig } from './const';
9
+ import { <%= className %>ModuleMenuKeys } from './menu.keys';
10
+ import { <%= className %>ModulePermissionsKeys } from './permission.keys';
11
+
12
+ //#endregion
13
+
14
+ //#region ---- Menu Provider ----
15
+
16
+ export class <%= className %>ModuleMenuProvider implements AXPMenuProvider {
17
+
18
+ //#region ---- Services ----
19
+
20
+ private entityService = inject(AXPEntityService);
21
+ private sessionService = inject(AXPSessionService);
22
+
23
+ //#endregion
24
+
25
+ //#region ---- Provider Method ----
26
+
27
+ async provide(context: AXPMenuProviderContext): Promise<void> {
28
+ const isAuthorized = await firstValueFrom(this.sessionService.isAuthorized$);
29
+ if (!isAuthorized) {
30
+ return;
31
+ }
32
+
33
+ const scope = RootConfig.config.i18n;
34
+ const module = RootConfig.module;
35
+
36
+ context.addItems([
37
+ {
38
+ name: <%= className %>ModuleMenuKeys.Root,
39
+ priority: 9000,
40
+ text: `t('root-menu', {scope:"${scope}"})`,
41
+ icon: module.icon,
42
+ data: {},
43
+ children: [
44
+ {
45
+ name: <%= className %>ModuleMenuKeys.Samples,
46
+ text: `t('samples-menu', {scope:"${scope}"})`,
47
+ path: this.entityService.createPath(module.name, RootConfig.entities.sample.name),
48
+ icon: RootConfig.entities.sample.icon,
49
+ priority: 1,
50
+ data: {},
51
+ },
52
+ ],
53
+ },
54
+ ]);
55
+ }
56
+
57
+ //#endregion
58
+ }
59
+
60
+ //#endregion
61
+
@@ -1,50 +1,26 @@
1
+ //#region ---- Imports ----
2
+
1
3
  import { AXPDataGenerator } from '@acorex/platform/core';
2
4
 
3
- export const USERS = Array.from({ length: 20 }).map((_, i) => {
5
+ //#endregion
6
+
7
+ //#region ---- Sample Mock Data ----
8
+
9
+ /**
10
+ * Mock data for Sample entity (20 items)
11
+ * Used by the mock service for testing and development
12
+ */
13
+ export const SAMPLE_DATA = Array.from({ length: 20 }).map((_, i) => {
4
14
  const firstName = AXPDataGenerator.firstName();
5
15
  const lastName = AXPDataGenerator.lastName();
6
16
  return {
7
17
  id: AXPDataGenerator.uuid(),
8
18
  firstname: firstName,
9
19
  lastname: lastName,
10
- phone: AXPDataGenerator.phone(),
11
20
  email: AXPDataGenerator.email(firstName, lastName),
21
+ phone: AXPDataGenerator.phone(),
12
22
  address: AXPDataGenerator.address(),
13
23
  };
14
24
  });
15
25
 
16
- export interface SampleEntity {
17
- id: string;
18
- name: string;
19
- description: string;
20
- isActive: boolean;
21
- createdDate: Date;
22
- category: string;
23
- }
24
-
25
- export const sampleData: SampleEntity[] = [
26
- {
27
- id: '1',
28
- name: 'Sample Item 1',
29
- description: 'This is a sample item for testing',
30
- isActive: true,
31
- createdDate: new Date(2024, 0, 15),
32
- category: 'Category A'
33
- },
34
- {
35
- id: '2',
36
- name: 'Sample Item 2',
37
- description: 'Another sample item with different data',
38
- isActive: false,
39
- createdDate: new Date(2024, 1, 20),
40
- category: 'Category B'
41
- },
42
- {
43
- id: '3',
44
- name: 'Sample Item 3',
45
- description: 'Third sample item for demonstration',
46
- isActive: true,
47
- createdDate: new Date(2024, 2, 5),
48
- category: 'Category A'
49
- }
50
- ];
26
+ //#endregion
@@ -0,0 +1,51 @@
1
+ //#region ---- Imports ----
2
+
3
+ import { AXTranslationService } from '@acorex/core/translation';
4
+ import { AXPPermissionDefinitionProvider, AXPPermissionDefinitionProviderContext } from '@acorex/platform/auth';
5
+ import { Injector } from '@angular/core';
6
+ import { <%= className %>ModulePermissionsKeys } from './permission.keys';
7
+
8
+ //#endregion
9
+
10
+ //#region ---- Permission Definition Provider ----
11
+
12
+ export class <%= className %>ModulePermissionDefinitionProvider implements AXPPermissionDefinitionProvider {
13
+
14
+ //#region ---- Services ----
15
+
16
+ private readonly translateService = this.injector.get(AXTranslationService);
17
+
18
+ //#endregion
19
+
20
+ //#region ---- Constructor ----
21
+
22
+ constructor(private injector: Injector) {}
23
+
24
+ //#endregion
25
+
26
+ //#region ---- Define Method ----
27
+
28
+ async define(context: AXPPermissionDefinitionProviderContext): Promise<void> {
29
+ const trans = async (key: string) =>
30
+ await this.translateService.translateAsync(`permissions.<%= name %>-module.${key}`, {
31
+ scope: '<%= name %>-module',
32
+ });
33
+
34
+ const keys = <%= className %>ModulePermissionsKeys;
35
+
36
+ context
37
+ .addGroup(keys.Module.Management, await trans('manage.title'))
38
+ //
39
+ .addPermission(keys.Sample.Management, await trans('sample.manage.title'))
40
+ .addChild(keys.Sample.View, await trans('sample.view.title'))
41
+ .addChild(keys.Sample.Edit, await trans('sample.edit.title'))
42
+ .addChild(keys.Sample.Delete, await trans('sample.delete.title'))
43
+ .addChild(keys.Sample.Create, await trans('sample.create.title'))
44
+ .endPermission();
45
+ }
46
+
47
+ //#endregion
48
+ }
49
+
50
+ //#endregion
51
+
@@ -0,0 +1,17 @@
1
+ //#region ---- Permission Keys ----
2
+
3
+ export const <%= className %>ModulePermissionsKeys = {
4
+ Module: {
5
+ Management: '<%= name %>-module:manage',
6
+ },
7
+ Sample: {
8
+ Management: '<%= name %>-module:sample:manage',
9
+ View: '<%= name %>-module:sample:view',
10
+ Edit: '<%= name %>-module:sample:edit',
11
+ Delete: '<%= name %>-module:sample:delete',
12
+ Create: '<%= name %>-module:sample:create',
13
+ },
14
+ };
15
+
16
+ //#endregion
17
+
@@ -1,9 +1,17 @@
1
- import { AXPAuthGuard } from '@acorex/platform/auth';
2
- import { AXPWidgetRegistryService } from '@acorex/platform/layout/builder';
1
+ //#region ---- Imports ----
2
+
3
+ import { AXPAuthGuard, AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
4
+ import { AXPWidgetRegistryService } from '@acorex/platform/layout/widget-core';
3
5
  import { AXPRootLayoutComponent } from '@acorex/platform/themes/default';
4
6
  import { CommonModule } from '@angular/common';
5
- import { inject, NgModule } from '@angular/core';
7
+ import { inject, Injector, NgModule } from '@angular/core';
6
8
  import { RouterModule, Routes } from '@angular/router';
9
+ import { AXP_MENU_PROVIDER, AXP_SEARCH_PROVIDER } from '@acorex/platform/common';
10
+ import { AXMSampleEntityModule } from './sample/sample.module';
11
+ import { <%= className %>ModuleMenuProvider } from './menu.provider';
12
+ import { <%= className %>ModuleSearchCommandProvider } from './search-command.provider';
13
+
14
+ //#endregion
7
15
 
8
16
  const routes: Routes = [
9
17
  {
@@ -15,25 +23,46 @@ const routes: Routes = [
15
23
  path: 'home',
16
24
  loadComponent: () => import('./home/home.page').then((c) => c.<%= className %>HomePage),
17
25
  },
18
- {
19
- canActivate: [AXPAuthGuard],
20
- path: 'sample',
21
- loadComponent: () => import('./sample/sample.component').then((c) => c.SampleComponent),
22
- },
23
26
  ],
24
27
  },
25
28
  ];
26
29
 
30
+ //#region ---- Module Definition ----
31
+
27
32
  @NgModule({
28
33
  imports: [
29
34
  CommonModule,
30
- RouterModule.forChild(routes)
35
+ RouterModule.forChild(routes),
36
+ //
37
+ AXMSampleEntityModule,
31
38
  ],
32
39
  exports: [RouterModule],
33
- providers: [],
40
+ providers: [
41
+ {
42
+ provide: AXP_MENU_PROVIDER,
43
+ useClass: <%= className %>ModuleMenuProvider,
44
+ multi: true,
45
+ },
46
+ {
47
+ provide: AXP_PERMISSION_DEFINITION_PROVIDER,
48
+ useFactory: async () => {
49
+ const injector = inject(Injector);
50
+ const provider = (await import('./permission-definition.provider')).<%= className %>ModulePermissionDefinitionProvider;
51
+ return new provider(injector);
52
+ },
53
+ multi: true,
54
+ },
55
+ {
56
+ provide: AXP_SEARCH_PROVIDER,
57
+ useClass: <%= className %>ModuleSearchCommandProvider,
58
+ multi: true,
59
+ },
60
+ ],
34
61
  declarations: [],
35
62
  })
36
63
  export class <%= upperCase(name) %>RootModule {
37
64
  registry = inject(AXPWidgetRegistryService);
38
65
  extendedWidgets = [];
39
66
  }
67
+
68
+ //#endregion