@acorex/platform 21.0.0-next.2 → 21.0.0-next.3

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 (69) hide show
  1. package/auth/index.d.ts +97 -238
  2. package/common/index.d.ts +778 -213
  3. package/core/index.d.ts +562 -433
  4. package/fesm2022/acorex-platform-auth.mjs +160 -200
  5. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  6. package/fesm2022/acorex-platform-common.mjs +1012 -125
  7. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  8. package/fesm2022/acorex-platform-core.mjs +685 -400
  9. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-domain.mjs +54 -11
  11. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-layout-builder.mjs +412 -270
  13. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-components.mjs +2112 -3153
  15. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-designer.mjs +7 -7
  17. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  18. package/fesm2022/acorex-platform-layout-entity.mjs +756 -648
  19. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-layout-views.mjs +4 -4
  21. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  22. package/fesm2022/acorex-platform-layout-widget-core.mjs +248 -174
  23. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  24. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs → acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs} +2 -2
  25. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +1 -0
  26. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-m8rHZP8L.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs} +2 -2
  27. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +1 -0
  28. package/fesm2022/acorex-platform-layout-widgets.mjs +3058 -1038
  29. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  30. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-mARj77Mr.mjs → acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs} +26 -5
  31. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +1 -0
  32. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-Cym8pq0v.mjs → acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs} +4 -5
  33. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs.map +1 -0
  34. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +101 -0
  35. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +1 -0
  36. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs → acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs} +3 -3
  37. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +1 -0
  38. package/fesm2022/acorex-platform-themes-default.mjs +166 -30
  39. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  40. package/fesm2022/acorex-platform-themes-shared.mjs +27 -27
  41. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  42. package/layout/builder/index.d.ts +4 -1
  43. package/layout/components/index.d.ts +405 -327
  44. package/layout/designer/index.d.ts +3 -3
  45. package/layout/entity/index.d.ts +163 -108
  46. package/layout/widget-core/index.d.ts +39 -49
  47. package/layout/widgets/index.d.ts +368 -54
  48. package/package.json +5 -5
  49. package/themes/default/index.d.ts +15 -2
  50. package/themes/shared/index.d.ts +10 -10
  51. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs +0 -50
  52. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs.map +0 -1
  53. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs +0 -42
  54. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs.map +0 -1
  55. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs +0 -55
  56. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs.map +0 -1
  57. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs +0 -50
  58. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs.map +0 -1
  59. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs +0 -48
  60. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs.map +0 -1
  61. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs +0 -42
  62. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs.map +0 -1
  63. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs.map +0 -1
  64. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-m8rHZP8L.mjs.map +0 -1
  65. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-mARj77Mr.mjs.map +0 -1
  66. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-Cym8pq0v.mjs.map +0 -1
  67. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs +0 -101
  68. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs.map +0 -1
  69. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Injectable, computed, input, effect, Directive, EventEmitter, HostListener, Output, ViewContainerRef, ElementRef, Injector, runInInjectionContext, provideAppInitializer, signal, Pipe } from '@angular/core';
2
+ import { InjectionToken, inject, Injectable, computed, input, effect, Directive, EventEmitter, HostListener, Output, ViewContainerRef, ElementRef, signal, output, DestroyRef, Renderer2, untracked, Injector, runInInjectionContext, provideAppInitializer, NgModule, Pipe } from '@angular/core';
3
3
  import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
4
4
  import { get, isPlainObject, set, isArray, merge, isNil, isObjectLike, transform, isEmpty, isEqual, differenceWith, union, cloneDeep, isUndefined, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
5
5
  import { Subject, interval, fromEvent } from 'rxjs';
@@ -115,6 +115,41 @@ class AXPColorPaletteService {
115
115
  this.cache = null;
116
116
  await this.loadPalettes();
117
117
  }
118
+ /**
119
+ * Get the default palette (material-design) or fallback colors
120
+ * @returns Promise of default palette, never returns undefined
121
+ */
122
+ async getDefaultPalette() {
123
+ const defaultPalette = await this.getPalette('material-design');
124
+ if (defaultPalette) {
125
+ return defaultPalette;
126
+ }
127
+ // Fallback to hardcoded material design colors if provider fails
128
+ return {
129
+ name: 'material-design',
130
+ title: 'Material Design',
131
+ category: 'material',
132
+ description: 'Google Material Design color palette',
133
+ colors: [
134
+ '#F44336', // Red
135
+ '#E91E63', // Pink
136
+ '#9C27B0', // Purple
137
+ '#673AB7', // Deep Purple
138
+ '#3F51B5', // Indigo
139
+ '#2196F3', // Blue
140
+ '#03A9F4', // Light Blue
141
+ '#00BCD4', // Cyan
142
+ '#009688', // Teal
143
+ '#4CAF50', // Green
144
+ '#8BC34A', // Light Green
145
+ '#CDDC39', // Lime
146
+ '#FFEB3B', // Yellow
147
+ '#FFC107', // Amber
148
+ '#FF9800', // Orange
149
+ '#FF5722', // Deep Orange
150
+ ],
151
+ };
152
+ }
118
153
  //#endregion
119
154
  //#region ---- Private Methods ----
120
155
  /**
@@ -770,6 +805,10 @@ class AXPDataGenerator {
770
805
  const country = this.country();
771
806
  return `${streetNumber} ${street}, ${city}, ${state} ${zip}, ${country}`;
772
807
  }
808
+ static avatar() {
809
+ return `https://avatar.iran.liara.run/public/${this.pick([35, 22, 16, 6, 31])}`;
810
+ //return `https://i.pravatar.cc/300?u=${this.uuid()}`;
811
+ }
773
812
  }
774
813
 
775
814
  function objectKeyValueTransforms(keyName) {
@@ -783,19 +822,152 @@ function objectKeyValueTransforms(keyName) {
783
822
  };
784
823
  }
785
824
 
825
+ //#region ---- Imports ----
826
+ //#endregion
827
+ //#region ---- Provider Registry Service ----
828
+ /**
829
+ * Registry service for dynamically loaded module providers.
830
+ * Stores provider instances that are loaded conditionally based on access control.
831
+ */
832
+ class AXPModuleProviderRegistry {
833
+ constructor() {
834
+ //#region ---- Fields ----
835
+ this.permissionProviders = [];
836
+ this.menuProviders = [];
837
+ this.entityProviders = [];
838
+ this.settingProviders = [];
839
+ this.searchProviders = [];
840
+ this.featureProviders = [];
841
+ this.datasourceProviders = [];
842
+ }
843
+ //#endregion
844
+ //#region ---- Public Methods ----
845
+ /**
846
+ * Register a permission provider.
847
+ */
848
+ registerPermissionProvider(provider) {
849
+ this.permissionProviders.push(provider);
850
+ }
851
+ /**
852
+ * Get all registered permission providers.
853
+ */
854
+ getPermissionProviders() {
855
+ return [...this.permissionProviders];
856
+ }
857
+ /**
858
+ * Register a menu provider.
859
+ */
860
+ registerMenuProvider(provider) {
861
+ this.menuProviders.push(provider);
862
+ }
863
+ /**
864
+ * Get all registered menu providers.
865
+ */
866
+ getMenuProviders() {
867
+ return [...this.menuProviders];
868
+ }
869
+ /**
870
+ * Register an entity provider.
871
+ */
872
+ registerEntityProvider(provider) {
873
+ this.entityProviders.push(provider);
874
+ }
875
+ /**
876
+ * Get all registered entity providers.
877
+ */
878
+ getEntityProviders() {
879
+ return [...this.entityProviders];
880
+ }
881
+ /**
882
+ * Register a settings provider.
883
+ */
884
+ registerSettingProvider(provider) {
885
+ this.settingProviders.push(provider);
886
+ }
887
+ /**
888
+ * Get all registered settings providers.
889
+ */
890
+ getSettingProviders() {
891
+ return [...this.settingProviders];
892
+ }
893
+ /**
894
+ * Register a search provider.
895
+ */
896
+ registerSearchProvider(provider) {
897
+ this.searchProviders.push(provider);
898
+ }
899
+ /**
900
+ * Get all registered search providers.
901
+ */
902
+ getSearchProviders() {
903
+ return [...this.searchProviders];
904
+ }
905
+ /**
906
+ * Register a feature provider.
907
+ */
908
+ registerFeatureProvider(provider) {
909
+ this.featureProviders.push(provider);
910
+ }
911
+ /**
912
+ * Get all registered feature providers.
913
+ */
914
+ getFeatureProviders() {
915
+ return [...this.featureProviders];
916
+ }
917
+ /**
918
+ * Register a datasource provider.
919
+ */
920
+ registerDatasourceProvider(provider) {
921
+ this.datasourceProviders.push(provider);
922
+ }
923
+ /**
924
+ * Get all registered datasource providers.
925
+ */
926
+ getDatasourceProviders() {
927
+ return [...this.datasourceProviders];
928
+ }
929
+ /**
930
+ * Clear all registered providers.
931
+ * Useful for testing or re-initialization.
932
+ */
933
+ clear() {
934
+ this.permissionProviders.length = 0;
935
+ this.menuProviders.length = 0;
936
+ this.entityProviders.length = 0;
937
+ this.settingProviders.length = 0;
938
+ this.searchProviders.length = 0;
939
+ this.featureProviders.length = 0;
940
+ this.datasourceProviders.length = 0;
941
+ }
942
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleProviderRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
943
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleProviderRegistry, providedIn: 'root' }); }
944
+ }
945
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleProviderRegistry, decorators: [{
946
+ type: Injectable,
947
+ args: [{ providedIn: 'root' }]
948
+ }] });
949
+
786
950
  const AXP_DATASOURCE_DEFINITION_PROVIDER = new InjectionToken('AXP_DATASOURCE_TYPE_PROVIDER');
787
951
  class AXPDataSourceDefinitionProviderService {
788
952
  constructor() {
789
953
  this.providers = inject(AXP_DATASOURCE_DEFINITION_PROVIDER, { optional: true });
954
+ this.providerRegistry = inject(AXPModuleProviderRegistry);
790
955
  }
791
956
  async items() {
792
957
  const items = [];
958
+ // Load from DI tokens (backward compatibility)
793
959
  if (Array.isArray(this.providers)) {
794
960
  for (const provider of this.providers) {
795
961
  set(provider, '__parent__', this);
796
962
  items.push(...(await provider.items()));
797
963
  }
798
964
  }
965
+ // Load from registry (manifest-based, conditionally loaded)
966
+ const registryProviders = this.providerRegistry.getDatasourceProviders();
967
+ for (const provider of registryProviders) {
968
+ set(provider, '__parent__', this);
969
+ items.push(...(await provider.items()));
970
+ }
799
971
  return items;
800
972
  }
801
973
  async get(name) {
@@ -966,6 +1138,203 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
966
1138
  }]
967
1139
  }] });
968
1140
 
1141
+ //#region ---- Imports ----
1142
+ //#endregion
1143
+ //#region ---- Directive ----
1144
+ /**
1145
+ * Fullscreen directive that provides CSS-based fullscreen functionality
1146
+ * Usage: <element axFullscreen #fullscreen="axFullscreen"></element>
1147
+ * Then: fullscreen.toggle() or fullscreen.enter() or fullscreen.exit()
1148
+ */
1149
+ class AXFullscreenDirective {
1150
+ constructor(elementRef) {
1151
+ this.elementRef = elementRef;
1152
+ //#region ---- Properties ----
1153
+ /**
1154
+ * Current fullscreen state
1155
+ */
1156
+ this.isFullscreenState = signal(false, ...(ngDevMode ? [{ debugName: "isFullscreenState" }] : []));
1157
+ /**
1158
+ * Original element styles to restore
1159
+ */
1160
+ this.originalStyles = {};
1161
+ /**
1162
+ * Original parent element reference
1163
+ */
1164
+ this.originalParent = null;
1165
+ /**
1166
+ * Fullscreen container element
1167
+ */
1168
+ this.fullscreenContainer = null;
1169
+ /**
1170
+ * Fullscreen change event
1171
+ */
1172
+ this.fullscreenChange = output();
1173
+ //#endregion
1174
+ //#region ---- Constructor ----
1175
+ this.destroyRef = inject(DestroyRef);
1176
+ this.renderer = inject(Renderer2);
1177
+ // Sync state changes to output
1178
+ effect(() => {
1179
+ const isFullscreen = this.isFullscreenState();
1180
+ untracked(() => {
1181
+ this.fullscreenChange.emit(isFullscreen);
1182
+ });
1183
+ });
1184
+ }
1185
+ //#endregion
1186
+ //#region ---- Public API ----
1187
+ /**
1188
+ * Toggle fullscreen state
1189
+ */
1190
+ async toggle() {
1191
+ if (this.isFullscreenState()) {
1192
+ await this.exit();
1193
+ }
1194
+ else {
1195
+ await this.enter();
1196
+ }
1197
+ }
1198
+ /**
1199
+ * Enter fullscreen mode using CSS
1200
+ */
1201
+ async enter() {
1202
+ if (this.isFullscreenState()) {
1203
+ return;
1204
+ }
1205
+ const element = this.elementRef.nativeElement;
1206
+ try {
1207
+ // Store original styles and parent
1208
+ this.storeOriginalStyles(element);
1209
+ this.originalParent = element.parentElement;
1210
+ // Create fullscreen container
1211
+ this.fullscreenContainer = this.renderer.createElement('div');
1212
+ this.renderer.setStyle(this.fullscreenContainer, 'position', 'fixed');
1213
+ this.renderer.setStyle(this.fullscreenContainer, 'top', '0');
1214
+ this.renderer.setStyle(this.fullscreenContainer, 'left', '0');
1215
+ this.renderer.setStyle(this.fullscreenContainer, 'width', '100vw');
1216
+ this.renderer.setStyle(this.fullscreenContainer, 'height', '100vh');
1217
+ this.renderer.setStyle(this.fullscreenContainer, 'z-index', '9999');
1218
+ this.renderer.setStyle(this.fullscreenContainer, 'background-color', '#ffffff');
1219
+ this.renderer.setStyle(this.fullscreenContainer, 'overflow', 'auto');
1220
+ // Move element to container
1221
+ this.renderer.appendChild(this.fullscreenContainer, element);
1222
+ // Apply fullscreen styles to element
1223
+ this.renderer.setStyle(element, 'position', 'relative');
1224
+ this.renderer.setStyle(element, 'width', '100%');
1225
+ this.renderer.setStyle(element, 'height', '100%');
1226
+ this.renderer.setStyle(element, 'margin', '0');
1227
+ this.renderer.setStyle(element, 'padding', '0');
1228
+ // Append container to body
1229
+ this.renderer.appendChild(document.body, this.fullscreenContainer);
1230
+ // Prevent body scroll
1231
+ this.renderer.setStyle(document.body, 'overflow', 'hidden');
1232
+ this.isFullscreenState.set(true);
1233
+ }
1234
+ catch (error) {
1235
+ console.error('Error entering fullscreen:', error);
1236
+ this.restoreOriginalStyles(element);
1237
+ }
1238
+ }
1239
+ /**
1240
+ * Exit fullscreen mode
1241
+ */
1242
+ async exit() {
1243
+ if (!this.isFullscreenState()) {
1244
+ return;
1245
+ }
1246
+ const element = this.elementRef.nativeElement;
1247
+ try {
1248
+ // Restore body scroll
1249
+ this.renderer.removeStyle(document.body, 'overflow');
1250
+ // Move element back to original parent
1251
+ if (this.fullscreenContainer && this.originalParent) {
1252
+ this.renderer.removeChild(this.fullscreenContainer, element);
1253
+ this.renderer.appendChild(this.originalParent, element);
1254
+ // Remove container
1255
+ this.renderer.removeChild(document.body, this.fullscreenContainer);
1256
+ this.fullscreenContainer = null;
1257
+ }
1258
+ // Restore original styles
1259
+ this.restoreOriginalStyles(element);
1260
+ this.isFullscreenState.set(false);
1261
+ }
1262
+ catch (error) {
1263
+ console.error('Error exiting fullscreen:', error);
1264
+ }
1265
+ }
1266
+ /**
1267
+ * Check if currently in fullscreen mode
1268
+ */
1269
+ isFullscreen() {
1270
+ return this.isFullscreenState();
1271
+ }
1272
+ //#endregion
1273
+ //#region ---- Private Methods ----
1274
+ /**
1275
+ * Store original element styles
1276
+ */
1277
+ storeOriginalStyles(element) {
1278
+ const computedStyle = window.getComputedStyle(element);
1279
+ this.originalStyles = {
1280
+ position: computedStyle.position,
1281
+ top: computedStyle.top,
1282
+ left: computedStyle.left,
1283
+ width: computedStyle.width,
1284
+ height: computedStyle.height,
1285
+ zIndex: computedStyle.zIndex,
1286
+ backgroundColor: computedStyle.backgroundColor,
1287
+ margin: computedStyle.margin,
1288
+ padding: computedStyle.padding,
1289
+ };
1290
+ }
1291
+ /**
1292
+ * Restore original element styles
1293
+ */
1294
+ restoreOriginalStyles(element) {
1295
+ if (!this.originalStyles) {
1296
+ return;
1297
+ }
1298
+ // Restore each style property
1299
+ Object.entries(this.originalStyles).forEach(([key, value]) => {
1300
+ const styleKey = this.camelToKebabCase(key);
1301
+ if (value) {
1302
+ this.renderer.setStyle(element, styleKey, value);
1303
+ }
1304
+ else {
1305
+ this.renderer.removeStyle(element, styleKey);
1306
+ }
1307
+ });
1308
+ this.originalStyles = {};
1309
+ }
1310
+ /**
1311
+ * Convert camelCase to kebab-case for CSS properties
1312
+ */
1313
+ camelToKebabCase(str) {
1314
+ return str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase();
1315
+ }
1316
+ //#endregion
1317
+ //#region ---- Lifecycle ----
1318
+ ngOnDestroy() {
1319
+ // Exit fullscreen if still active
1320
+ if (this.isFullscreenState()) {
1321
+ this.exit().catch(() => {
1322
+ // Ignore errors during cleanup
1323
+ });
1324
+ }
1325
+ }
1326
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXFullscreenDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
1327
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.12", type: AXFullscreenDirective, isStandalone: true, selector: "[axFullscreen]", outputs: { fullscreenChange: "fullscreenChange" }, exportAs: ["axFullscreen"], ngImport: i0 }); }
1328
+ }
1329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXFullscreenDirective, decorators: [{
1330
+ type: Directive,
1331
+ args: [{
1332
+ selector: '[axFullscreen]',
1333
+ standalone: true,
1334
+ exportAs: 'axFullscreen',
1335
+ }]
1336
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { fullscreenChange: [{ type: i0.Output, args: ["fullscreenChange"] }] } });
1337
+
969
1338
  const AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER = new InjectionToken('AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER');
970
1339
 
971
1340
  //#region ---- Imports ----
@@ -1445,6 +1814,218 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1445
1814
  args: [{ providedIn: 'root' }]
1446
1815
  }] });
1447
1816
 
1817
+ //#region ---- Imports ----
1818
+ //#endregion
1819
+
1820
+ //#region ---- Provider Interfaces ----
1821
+ /**
1822
+ * Injection token for edition service.
1823
+ * Modules should provide their implementation using this token.
1824
+ */
1825
+ const AXP_EDITION_SERVICE = new InjectionToken('AXP_EDITION_SERVICE', {
1826
+ providedIn: 'root',
1827
+ factory: () => {
1828
+ return null;
1829
+ },
1830
+ });
1831
+ /**
1832
+ * Injection token for module provider loader.
1833
+ * Implementation: @acorex/platform/auth
1834
+ */
1835
+ const AXP_MODULE_PROVIDER_LOADER = new InjectionToken('AXP_MODULE_PROVIDER_LOADER');
1836
+ /**
1837
+ * Injection token for session service.
1838
+ * Implementation: @acorex/platform/auth
1839
+ */
1840
+ const AXP_SESSION_SERVICE = new InjectionToken('AXP_SESSION_SERVICE');
1841
+ /**
1842
+ * Injection token for module manifest providers.
1843
+ * Modules register their manifest providers using this token.
1844
+ */
1845
+ const AXP_MODULE_MANIFEST_PROVIDER = new InjectionToken('AXP_MODULE_MANIFEST_PROVIDER');
1846
+ //#endregion
1847
+
1848
+ //#region ---- Imports ----
1849
+ //#endregion
1850
+ //#region ---- Registry Service ----
1851
+ /**
1852
+ * Registry service for module manifests.
1853
+ * Collects and manages all registered module manifests.
1854
+ */
1855
+ class AXPModuleManifestRegistry {
1856
+ constructor() {
1857
+ //#region ---- Fields ----
1858
+ this.manifests = new Map();
1859
+ this.featureDefinitions = new Map();
1860
+ this.injector = inject(Injector);
1861
+ this.initializationPromise = null;
1862
+ this.isInitialized = false;
1863
+ }
1864
+ //#endregion
1865
+ //#region ---- Initialization ----
1866
+ /**
1867
+ * Initialize registry by loading all manifest providers.
1868
+ * Should be called during app startup.
1869
+ * Safe to call multiple times - will only initialize once.
1870
+ */
1871
+ async initialize() {
1872
+ // If already initialized, return immediately
1873
+ if (this.isInitialized) {
1874
+ return;
1875
+ }
1876
+ // If initialization is in progress, wait for it
1877
+ if (this.initializationPromise) {
1878
+ return this.initializationPromise;
1879
+ }
1880
+ // Start initialization
1881
+ this.initializationPromise = this._doInitialize();
1882
+ await this.initializationPromise;
1883
+ }
1884
+ /**
1885
+ * Internal initialization logic.
1886
+ */
1887
+ async _doInitialize() {
1888
+ // Get manifests from injector (using useValue, they are provided directly)
1889
+ let manifests;
1890
+ try {
1891
+ const injectedManifests = this.injector.get(AXP_MODULE_MANIFEST_PROVIDER, []);
1892
+ manifests = Array.isArray(injectedManifests) ? injectedManifests : injectedManifests ? [injectedManifests] : [];
1893
+ }
1894
+ catch (error) {
1895
+ console.error('Failed to get manifest providers from injector:', error);
1896
+ manifests = [];
1897
+ }
1898
+ // Register all manifests directly
1899
+ const registerPromises = manifests.map(async (manifest) => {
1900
+ try {
1901
+ // Validate manifest
1902
+ if (!manifest) {
1903
+ console.error('Invalid manifest:', manifest);
1904
+ return;
1905
+ }
1906
+ await this.register(manifest);
1907
+ }
1908
+ catch (error) {
1909
+ console.error(`Failed to register manifest:`, error);
1910
+ }
1911
+ });
1912
+ await Promise.all(registerPromises);
1913
+ this.isInitialized = true;
1914
+ }
1915
+ //#endregion
1916
+ //#region ---- Manifest Management ----
1917
+ /**
1918
+ * Register a module manifest.
1919
+ */
1920
+ async register(manifest) {
1921
+ // Validate manifest
1922
+ if (!manifest.name) {
1923
+ throw new Error('Manifest must have a name');
1924
+ }
1925
+ if (!manifest.version) {
1926
+ throw new Error(`Manifest for module '${manifest.name}' must have a version`);
1927
+ }
1928
+ // Register manifest
1929
+ this.manifests.set(manifest.name, manifest);
1930
+ }
1931
+ /**
1932
+ * Get manifest for a module.
1933
+ */
1934
+ get(moduleName) {
1935
+ return this.manifests.get(moduleName);
1936
+ }
1937
+ /**
1938
+ * Get all registered manifests.
1939
+ */
1940
+ getAll() {
1941
+ return Array.from(this.manifests.values());
1942
+ }
1943
+ /**
1944
+ * Check if a module manifest is registered.
1945
+ */
1946
+ has(moduleName) {
1947
+ return this.manifests.has(moduleName);
1948
+ }
1949
+ //#endregion
1950
+ //#region ---- Feature Definition Management ----
1951
+ /**
1952
+ * Get all feature definitions from all manifests.
1953
+ */
1954
+ getAllFeatureDefinitions() {
1955
+ return Array.from(this.featureDefinitions.values());
1956
+ }
1957
+ /**
1958
+ * Get feature definition by full name.
1959
+ */
1960
+ getFeatureDefinition(featureName) {
1961
+ return this.featureDefinitions.get(featureName);
1962
+ }
1963
+ /**
1964
+ * Check if a feature is defined in any manifest.
1965
+ */
1966
+ isFeatureDefined(featureName) {
1967
+ return this.featureDefinitions.has(featureName);
1968
+ }
1969
+ /**
1970
+ * Get default value for a feature.
1971
+ * Returns undefined if feature is not defined.
1972
+ */
1973
+ getFeatureDefault(featureName) {
1974
+ const definition = this.getFeatureDefinition(featureName);
1975
+ return definition?.defaultValue;
1976
+ }
1977
+ /**
1978
+ * Get all feature definitions for a specific module.
1979
+ */
1980
+ getModuleFeatures(moduleName) {
1981
+ return Array.from(this.featureDefinitions.values()).filter((def) => def.module === moduleName);
1982
+ }
1983
+ /**
1984
+ * Register a feature definition dynamically (e.g., from feature definition provider).
1985
+ * Used to add features that are defined at runtime via featuresProvider.
1986
+ */
1987
+ registerFeatureDefinition(definition) {
1988
+ this.featureDefinitions.set(definition.name, definition);
1989
+ }
1990
+ //#endregion
1991
+ //#region ---- Dependency Checking ----
1992
+ /**
1993
+ * Check if module dependencies are satisfied.
1994
+ * Returns array of missing dependencies.
1995
+ */
1996
+ checkDependencies(moduleName) {
1997
+ const manifest = this.get(moduleName);
1998
+ if (!manifest?.dependencies) {
1999
+ return { missingModules: [], missingFeatures: [] };
2000
+ }
2001
+ const missingModules = [];
2002
+ const missingFeatures = [];
2003
+ // Check module dependencies
2004
+ if (manifest.dependencies.modules) {
2005
+ for (const depModule of manifest.dependencies.modules) {
2006
+ if (!this.has(depModule)) {
2007
+ missingModules.push(depModule);
2008
+ }
2009
+ }
2010
+ }
2011
+ // Check feature dependencies
2012
+ if (manifest.dependencies.features) {
2013
+ for (const featureName of manifest.dependencies.features) {
2014
+ if (!this.isFeatureDefined(featureName)) {
2015
+ missingFeatures.push(featureName);
2016
+ }
2017
+ }
2018
+ }
2019
+ return { missingModules, missingFeatures };
2020
+ }
2021
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2022
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestRegistry, providedIn: 'root' }); }
2023
+ }
2024
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
2025
+ type: Injectable,
2026
+ args: [{ providedIn: 'root' }]
2027
+ }] });
2028
+
1448
2029
  class AXPAppStartUpService {
1449
2030
  constructor() {
1450
2031
  this.tasks = [];
@@ -1454,7 +2035,6 @@ class AXPAppStartUpService {
1454
2035
  }
1455
2036
  async runAllTasks() {
1456
2037
  for (const task of this.tasks.sort((a, b) => a.priority - b.priority)) {
1457
- console.log(`Running "${task.statusText}" with priority "${task.priority}"`);
1458
2038
  this.updateStatus(task.statusText);
1459
2039
  await task.run();
1460
2040
  }
@@ -1482,422 +2062,121 @@ const AXPAppStartUpProvider = provideAppInitializer(() => {
1482
2062
  return initializerFn();
1483
2063
  });
1484
2064
 
2065
+ //#region ---- Imports ----
2066
+ //#endregion
2067
+ //#region ---- Module ----
1485
2068
  /**
1486
- * Status Definition Types
1487
- * Defines the structure for status definitions and their transitions
1488
- */
1489
- /**
1490
- * Abstract class for status providers
1491
- * Similar to AXPTaskBadgeProvider pattern
2069
+ * Module for managing module manifests and providers initialization.
2070
+ * Handles the registration of manifest and module provider startup tasks.
1492
2071
  */
1493
- class AXPStatusProvider {
2072
+ class AXPModuleManifestModule {
2073
+ /**
2074
+ * @ignore
2075
+ * Initializes module manifest and provider tasks on module construction.
2076
+ */
2077
+ constructor(appInitService, injector) {
2078
+ const manifestRegistry = injector.get(AXPModuleManifestRegistry);
2079
+ const moduleProviderLoader = injector.get(AXP_MODULE_PROVIDER_LOADER);
2080
+ // Register manifest initialization task
2081
+ appInitService.registerTask({
2082
+ name: 'ModuleManifests',
2083
+ statusText: 'Loading module manifests...',
2084
+ priority: 1, // Load early, before features/permissions
2085
+ run: async () => {
2086
+ await manifestRegistry.initialize();
2087
+ },
2088
+ });
2089
+ // Register module provider tasks
2090
+ appInitService.registerTask({
2091
+ name: 'RequiredModuleProviders',
2092
+ statusText: 'Loading required modules...',
2093
+ priority: 1.5,
2094
+ run: async () => {
2095
+ await moduleProviderLoader.loadRequiredModules();
2096
+ },
2097
+ });
2098
+ appInitService.registerTask({
2099
+ name: 'ModuleProviders',
2100
+ statusText: 'Loading module providers...',
2101
+ priority: 3,
2102
+ run: async () => {
2103
+ await moduleProviderLoader.loadProvidersIfReady();
2104
+ },
2105
+ });
2106
+ }
2107
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestModule, deps: [{ token: AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
2108
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestModule }); }
2109
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestModule }); }
1494
2110
  }
1495
- //#endregion
2111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestModule, decorators: [{
2112
+ type: NgModule,
2113
+ args: [{
2114
+ providers: [],
2115
+ }]
2116
+ }], ctorParameters: () => [{ type: AXPAppStartUpService }, { type: i0.Injector }] });
1496
2117
 
1497
- //#region ---- Injection Token ----
1498
- /**
1499
- * Injection token for status providers
1500
- * Use with multi: true to register multiple providers
1501
- */
1502
- const AXP_STATUS_PROVIDERS = new InjectionToken('AXP_STATUS_PROVIDERS');
2118
+ //#region ---- Imports ----
1503
2119
  //#endregion
1504
- //#region ---- Provider Service ----
2120
+ //#region ---- Feature Definition Provider Interface ----
1505
2121
  /**
1506
- * Service for managing status definitions from multiple providers
1507
- * Similar to AXPTaskBadgeService pattern - no cache, direct access
1508
- *
1509
- * @example
1510
- * ```typescript
1511
- * // In a module providers array:
1512
- * {
1513
- * provide: AXP_STATUS_PROVIDERS,
1514
- * useClass: TaskStatusProvider,
1515
- * multi: true,
1516
- * }
1517
- *
1518
- * // Example provider implementation:
1519
- * export class TaskStatusProvider extends AXPStatusProvider {
1520
- * readonly key = 'task-management.status';
1521
- * readonly statuses = [
1522
- * { name: 'todo', title: 'To Do', color: '#6b7280', icon: 'fa-light fa-circle', isInitial: true },
1523
- * { name: 'in-progress', title: 'In Progress', color: '#3b82f6', icon: 'fa-light fa-play' },
1524
- * { name: 'done', title: 'Done', color: '#10b981', icon: 'fa-light fa-check-circle', isFinal: true },
1525
- * ];
1526
- * readonly transitions = [
1527
- * { from: 'todo', to: 'in-progress', title: 'Start', condition: '{{user.canEdit}}' },
1528
- * { from: 'in-progress', to: 'done', title: 'Complete' },
1529
- * ];
1530
- * readonly defaultStatus = 'todo';
1531
- * }
1532
- *
1533
- * // Later, get the status:
1534
- * const status = statusService.getStatus('task-management.status');
1535
- * if (status) {
1536
- * console.log('Statuses:', status.statuses);
1537
- * console.log('Transitions:', status.transitions);
1538
- * }
1539
- * ```
2122
+ * Context for feature definition providers.
2123
+ * Allows providers to add additional feature definitions dynamically.
1540
2124
  */
1541
- class AXPStatusDefinitionProviderService {
1542
- //#endregion
1543
- //#region ---- Constructor ----
2125
+ class AXPFeatureDefinitionProviderContext {
1544
2126
  constructor() {
1545
- //#region ---- Dependencies ----
1546
- this.providers = inject(AXP_STATUS_PROVIDERS, { optional: true }) ?? [];
1547
- //#endregion
1548
- //#region ---- State ----
1549
- this.statusMap = new Map();
1550
- // Register all providers in constructor (like badge service)
1551
- for (const provider of this.providers) {
1552
- if (this.statusMap.has(provider.key)) {
1553
- console.warn(`Status with key "${provider.key}" already exists. Overwriting with new status.`);
1554
- }
1555
- this.statusMap.set(provider.key, provider);
1556
- }
2127
+ this.features = new Map();
1557
2128
  }
1558
- //#endregion
1559
- //#region ---- Public API ----
1560
2129
  /**
1561
- * Get a status provider by key
1562
- * Direct access from Map (no lazy load, no cache)
1563
- *
1564
- * @param key - Status key (e.g., 'task-management.status')
1565
- * @returns Status provider with all statuses and transitions, or undefined if not found
1566
- *
1567
- * @example
1568
- * ```typescript
1569
- * const status = statusService.getStatus('task-management.status');
1570
- * if (status) {
1571
- * console.log('Statuses:', status.statuses);
1572
- * console.log('Transitions:', status.transitions);
1573
- * }
1574
- * ```
1575
- */
1576
- getStatus(key) {
1577
- return this.statusMap.get(key);
1578
- }
1579
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPStatusDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1580
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPStatusDefinitionProviderService, providedIn: 'root' }); }
2130
+ * Add a feature definition.
2131
+ * @param key Full feature key (ModuleName:FeatureKey format with colon separator)
2132
+ * @param definition Feature definition
2133
+ */
2134
+ addFeature(key, definition) {
2135
+ this.features.set(key, definition);
2136
+ }
2137
+ /**
2138
+ * Get all feature definitions.
2139
+ */
2140
+ getFeatures() {
2141
+ return this.features;
2142
+ }
1581
2143
  }
1582
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPStatusDefinitionProviderService, decorators: [{
1583
- type: Injectable,
1584
- args: [{ providedIn: 'root' }]
1585
- }], ctorParameters: () => [] });
1586
-
1587
2144
  /**
1588
- * Standard system status types
1589
- * These are the predefined status values used across the platform
2145
+ * Injection token for feature definition providers.
1590
2146
  */
1591
- var AXPSystemStatusType;
1592
- (function (AXPSystemStatusType) {
1593
- AXPSystemStatusType["Todo"] = "todo";
1594
- AXPSystemStatusType["InProgress"] = "in-progress";
1595
- AXPSystemStatusType["InReview"] = "in-review";
1596
- AXPSystemStatusType["Blocked"] = "blocked";
1597
- AXPSystemStatusType["Done"] = "done";
1598
- AXPSystemStatusType["Cancelled"] = "cancelled";
1599
- AXPSystemStatusType["Draft"] = "draft";
1600
- AXPSystemStatusType["PendingReview"] = "pending-review";
1601
- AXPSystemStatusType["Approved"] = "approved";
1602
- AXPSystemStatusType["Published"] = "published";
1603
- AXPSystemStatusType["Archived"] = "archived";
1604
- AXPSystemStatusType["Rejected"] = "rejected";
1605
- AXPSystemStatusType["Active"] = "active";
1606
- AXPSystemStatusType["Inactive"] = "inactive";
1607
- AXPSystemStatusType["Pending"] = "pending";
1608
- AXPSystemStatusType["Completed"] = "completed";
1609
- AXPSystemStatusType["Suspended"] = "suspended";
1610
- AXPSystemStatusType["Failed"] = "failed";
1611
- AXPSystemStatusType["Review"] = "review";
1612
- })(AXPSystemStatusType || (AXPSystemStatusType = {}));
1613
- const i18n$1 = (key) => `@general:statuses.${key}`;
1614
- /**
1615
- * Standard system status definitions
1616
- * Provides consistent status definitions across the platform
1617
- * Uses AXPStatusDefinition interface from status-definition.types.ts
1618
- */
1619
- const AXPSystemStatuses = Object.freeze({
1620
- Todo: {
1621
- name: AXPSystemStatusType.Todo,
1622
- title: i18n$1('todo.title'),
1623
- icon: 'fa-light fa-circle',
1624
- color: 'secondary',
1625
- description: i18n$1('todo.description'),
1626
- order: 1,
1627
- isActive: true,
1628
- isInitial: true,
1629
- isFinal: false,
1630
- },
1631
- InProgress: {
1632
- name: AXPSystemStatusType.InProgress,
1633
- title: i18n$1('in-progress.title'),
1634
- icon: 'fa-light fa-play',
1635
- color: 'info',
1636
- description: i18n$1('in-progress.description'),
1637
- order: 2,
1638
- isActive: true,
1639
- isInitial: false,
1640
- isFinal: false,
1641
- },
1642
- InReview: {
1643
- name: AXPSystemStatusType.InReview,
1644
- title: i18n$1('in-review.title'),
1645
- icon: 'fa-light fa-eye',
1646
- color: 'info',
1647
- description: i18n$1('in-review.description'),
1648
- order: 3,
1649
- isActive: true,
1650
- isInitial: false,
1651
- isFinal: false,
1652
- },
1653
- Blocked: {
1654
- name: AXPSystemStatusType.Blocked,
1655
- title: i18n$1('blocked.title'),
1656
- icon: 'fa-light fa-ban',
1657
- color: 'danger',
1658
- description: i18n$1('blocked.description'),
1659
- order: 4,
1660
- isActive: true,
1661
- isInitial: false,
1662
- isFinal: false,
1663
- },
1664
- Done: {
1665
- name: AXPSystemStatusType.Done,
1666
- title: i18n$1('done.title'),
1667
- icon: 'fa-light fa-check-circle',
1668
- color: 'success',
1669
- description: i18n$1('done.description'),
1670
- order: 5,
1671
- isActive: true,
1672
- isInitial: false,
1673
- isFinal: true,
1674
- },
1675
- Cancelled: {
1676
- name: AXPSystemStatusType.Cancelled,
1677
- title: i18n$1('cancelled.title'),
1678
- icon: 'fa-light fa-times-circle',
1679
- color: 'neutral',
1680
- description: i18n$1('cancelled.description'),
1681
- order: 6,
1682
- isActive: true,
1683
- isInitial: false,
1684
- isFinal: true,
1685
- },
1686
- Draft: {
1687
- name: AXPSystemStatusType.Draft,
1688
- title: i18n$1('draft.title'),
1689
- icon: 'fa-light fa-file-pen',
1690
- color: 'neutral',
1691
- description: i18n$1('draft.description'),
1692
- order: 1,
1693
- isActive: true,
1694
- isInitial: true,
1695
- isFinal: false,
1696
- },
1697
- PendingReview: {
1698
- name: AXPSystemStatusType.PendingReview,
1699
- title: i18n$1('pending-review.title'),
1700
- icon: 'fa-light fa-clock',
1701
- color: 'warning',
1702
- description: i18n$1('pending-review.description'),
1703
- order: 2,
1704
- isActive: true,
1705
- isInitial: false,
1706
- isFinal: false,
1707
- },
1708
- Approved: {
1709
- name: AXPSystemStatusType.Approved,
1710
- title: i18n$1('approved.title'),
1711
- icon: 'fa-light fa-check-circle',
1712
- color: 'success',
1713
- description: i18n$1('approved.description'),
1714
- order: 3,
1715
- isActive: true,
1716
- isInitial: false,
1717
- isFinal: false,
1718
- },
1719
- Published: {
1720
- name: AXPSystemStatusType.Published,
1721
- title: i18n$1('published.title'),
1722
- icon: 'fa-light fa-globe',
1723
- color: 'primary',
1724
- description: i18n$1('published.description'),
1725
- order: 4,
1726
- isActive: true,
1727
- isInitial: false,
1728
- isFinal: false,
1729
- },
1730
- Archived: {
1731
- name: AXPSystemStatusType.Archived,
1732
- title: i18n$1('archived.title'),
1733
- icon: 'fa-light fa-archive',
1734
- color: 'neutral',
1735
- description: i18n$1('archived.description'),
1736
- order: 5,
1737
- isActive: true,
1738
- isInitial: false,
1739
- isFinal: true,
1740
- },
1741
- Rejected: {
1742
- name: AXPSystemStatusType.Rejected,
1743
- title: i18n$1('rejected.title'),
1744
- icon: 'fa-light fa-times-circle',
1745
- color: 'danger',
1746
- description: i18n$1('rejected.description'),
1747
- order: 6,
1748
- isActive: true,
1749
- isInitial: false,
1750
- isFinal: true,
1751
- },
1752
- Active: {
1753
- name: AXPSystemStatusType.Active,
1754
- title: i18n$1('active.title'),
1755
- icon: 'fa-light fa-check-circle',
1756
- color: 'success',
1757
- description: i18n$1('active.description'),
1758
- order: 1,
1759
- isActive: true,
1760
- isInitial: false,
1761
- isFinal: false,
1762
- },
1763
- Inactive: {
1764
- name: AXPSystemStatusType.Inactive,
1765
- title: i18n$1('inactive.title'),
1766
- icon: 'fa-light fa-circle',
1767
- color: 'secondary',
1768
- description: i18n$1('inactive.description'),
1769
- order: 2,
1770
- isActive: true,
1771
- isInitial: false,
1772
- isFinal: false,
1773
- },
1774
- Pending: {
1775
- name: AXPSystemStatusType.Pending,
1776
- title: i18n$1('pending.title'),
1777
- icon: 'fa-light fa-clock',
1778
- color: 'warning',
1779
- description: i18n$1('pending.description'),
1780
- order: 1,
1781
- isActive: true,
1782
- isInitial: true,
1783
- isFinal: false,
1784
- },
1785
- Completed: {
1786
- name: AXPSystemStatusType.Completed,
1787
- title: i18n$1('completed.title'),
1788
- icon: 'fa-light fa-check-circle',
1789
- color: 'success',
1790
- description: i18n$1('completed.description'),
1791
- order: 10,
1792
- isActive: true,
1793
- isInitial: false,
1794
- isFinal: true,
1795
- },
1796
- Suspended: {
1797
- name: AXPSystemStatusType.Suspended,
1798
- title: i18n$1('suspended.title'),
1799
- icon: 'fa-light fa-pause-circle',
1800
- color: 'neutral',
1801
- description: i18n$1('suspended.description'),
1802
- order: 5,
1803
- isActive: true,
1804
- isInitial: false,
1805
- isFinal: false,
1806
- },
1807
- Failed: {
1808
- name: AXPSystemStatusType.Failed,
1809
- title: i18n$1('failed.title'),
1810
- icon: 'fa-light fa-xmark-circle',
1811
- color: 'danger',
1812
- description: i18n$1('failed.description'),
1813
- order: 10,
1814
- isActive: true,
1815
- isInitial: false,
1816
- isFinal: true,
1817
- },
1818
- Review: {
1819
- name: AXPSystemStatusType.Review,
1820
- title: i18n$1('review.title'),
1821
- icon: 'fa-light fa-eye',
1822
- color: 'info',
1823
- description: i18n$1('review.description'),
1824
- order: 3,
1825
- isActive: true,
1826
- },
2147
+ const AXP_FEATURE_DEFINITION_PROVIDER = new InjectionToken('AXP_FEATURE_DEFINITION_PROVIDER', {
2148
+ providedIn: 'root',
2149
+ factory: () => [],
1827
2150
  });
2151
+ //#endregion
2152
+
2153
+ //#region ---- Imports ----
2154
+ //#endregion
2155
+ //#region ---- Default Implementation ----
1828
2156
  /**
1829
- * Get system status definition by type
1830
- * @param type - Status type
1831
- * @returns System status definition or undefined
1832
- */
1833
- function getSystemStatus(type) {
1834
- return Object.values(AXPSystemStatuses).find(status => status.name === type);
1835
- }
1836
- /**
1837
- * Resolves the visual appearance (color and icon) for status
1838
- * using the system statuses from the core module.
1839
- * @param statusType - Status type string
1840
- * @returns Color and icon for the status
1841
- */
1842
- function resolveStatusLook(statusType) {
1843
- // Try to get system status first
1844
- const systemStatusType = statusType;
1845
- if (systemStatusType) {
1846
- const systemStatus = getSystemStatus(systemStatusType);
1847
- if (systemStatus) {
1848
- // Convert hex color to semantic color type if needed
1849
- // For now, return as-is and let the UI handle it
1850
- return {
1851
- color: systemStatus.color,
1852
- icon: systemStatus.icon || ''
1853
- };
1854
- }
1855
- }
1856
- // Fallback for unknown statuses
1857
- return {
1858
- color: 'secondary',
1859
- icon: ''
1860
- };
1861
- }
1862
- /**
1863
- * Resolves the complete status information (title, description, icon, color) for a status
1864
- * using the system statuses from the core module.
1865
- * @param statusType - Status type string
1866
- * @returns Complete status information as AXPStatusDefinition
2157
+ * Default implementation of module access control service.
2158
+ * Checks if module is enabled in edition.modulesAndFeatures.modules.
1867
2159
  */
1868
- function getStatusInfo(statusType) {
1869
- const systemStatusType = statusType;
1870
- if (systemStatusType) {
1871
- const systemStatus = getSystemStatus(systemStatusType);
1872
- if (systemStatus) {
1873
- return systemStatus;
1874
- }
1875
- }
1876
- // Fallback for unknown statuses
1877
- return {
1878
- name: statusType,
1879
- title: statusType,
1880
- description: `Status: ${statusType}`,
1881
- icon: '',
1882
- color: 'secondary'
1883
- };
2160
+ class DefaultModuleAccessControlService {
2161
+ checkAccess(manifest, context) {
2162
+ // Check if module is enabled in edition
2163
+ const enabledModules = context.edition.modulesAndFeatures?.modules || [];
2164
+ return enabledModules.includes(manifest.name);
2165
+ }
2166
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: DefaultModuleAccessControlService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2167
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: DefaultModuleAccessControlService, providedIn: 'root' }); }
1884
2168
  }
2169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: DefaultModuleAccessControlService, decorators: [{
2170
+ type: Injectable,
2171
+ args: [{ providedIn: 'root' }]
2172
+ }] });
2173
+ //#endregion
2174
+ //#region ---- Injection Token ----
1885
2175
  /**
1886
- * Get system status definition directly (no conversion needed since it's already AXPStatusDefinition)
1887
- * @param statusType - Status type
1888
- * @param overrides - Optional overrides for the status definition
1889
- * @returns AXPStatusDefinition
2176
+ * Injection token for module access control service.
2177
+ * If not provided, DefaultModuleAccessControlService will be used as fallback.
1890
2178
  */
1891
- function systemStatusToDefinition(statusType, overrides) {
1892
- const systemStatus = getSystemStatus(statusType);
1893
- if (!systemStatus) {
1894
- throw new Error(`System status ${statusType} not found`);
1895
- }
1896
- return {
1897
- ...systemStatus,
1898
- ...overrides,
1899
- };
1900
- }
2179
+ const AXP_MODULE_ACCESS_CONTROL_SERVICE = new InjectionToken('AXP_MODULE_ACCESS_CONTROL_SERVICE');
1901
2180
 
1902
2181
  //#region ---- Tag Types ----
1903
2182
  //#endregion
@@ -3007,6 +3286,12 @@ class AXPComponentLogoConfig {
3007
3286
  this.component = component;
3008
3287
  }
3009
3288
  }
3289
+ class AXPIconLogoConfig {
3290
+ constructor(icon, color) {
3291
+ this.icon = icon;
3292
+ this.color = color;
3293
+ }
3294
+ }
3010
3295
 
3011
3296
  var AXPPlatformScope;
3012
3297
  (function (AXPPlatformScope) {
@@ -3608,5 +3893,5 @@ function generateKebabCase(title) {
3608
3893
  * Generated bundle index. Do not edit.
3609
3894
  */
3610
3895
 
3611
- export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPColorPaletteProvider, AXPColorPaletteService, AXPComponentLogoConfig, AXPContentCheckerDirective, AXPContextChangeEvent, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDblClickDirective, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPExportTemplateToken, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPGridLayoutDirective, AXPHookService, AXPImageUrlLogoConfig, AXPPlatformScope, AXPScreenSize, AXPStatusDefinitionProviderService, AXPStatusProvider, AXPSystemActionType, AXPSystemActions, AXPSystemStatusType, AXPSystemStatuses, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_STATUS_PROVIDERS, AXP_TAG_PROVIDER, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, cleanDeep, extractNestedFieldsWildcard, extractTextFromHtml, extractValue, generateKebabCase, getActionButton, getChangedPaths, getDetailedChanges, getEnumValues, getNestedKeys, getSmart, getStatusInfo, getSystemActions, getSystemStatus, objectKeyValueTransforms, resolveActionLook, resolvePlatformScopeKey, resolvePlatformScopeName, resolveStatusLook, setSmart, systemStatusToDefinition };
3896
+ export { AXFullscreenDirective, AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPColorPaletteProvider, AXPColorPaletteService, AXPComponentLogoConfig, AXPContentCheckerDirective, AXPContextChangeEvent, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDblClickDirective, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPExportTemplateToken, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPImageUrlLogoConfig, AXPModuleManifestModule, AXPModuleManifestRegistry, AXPModuleProviderRegistry, AXPPlatformScope, AXPScreenSize, AXPSystemActionType, AXPSystemActions, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_EDITION_SERVICE, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_MODULE_ACCESS_CONTROL_SERVICE, AXP_MODULE_MANIFEST_PROVIDER, AXP_MODULE_PROVIDER_LOADER, AXP_SESSION_SERVICE, AXP_TAG_PROVIDER, DefaultModuleAccessControlService, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, cleanDeep, extractNestedFieldsWildcard, extractTextFromHtml, extractValue, generateKebabCase, getActionButton, getChangedPaths, getDetailedChanges, getEnumValues, getNestedKeys, getSmart, getSystemActions, objectKeyValueTransforms, resolveActionLook, resolvePlatformScopeKey, resolvePlatformScopeName, setSmart };
3612
3897
  //# sourceMappingURL=acorex-platform-core.mjs.map