@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
@@ -4,23 +4,15 @@ import { kebabCase, merge, sortBy, cloneDeep, get, omit } from 'lodash-es';
4
4
  import { Router, ROUTES, RouterModule } from '@angular/router';
5
5
  import { AXPSessionService, AXPSessionStatus } from '@acorex/platform/auth';
6
6
  import { Subject, distinctUntilChanged, merge as merge$1 } from 'rxjs';
7
- import * as i1$1 from '@acorex/platform/core';
8
- import { AXPPlatformScope, AXPBroadcastEventService, objectKeyValueTransforms, AXPComponentLogoConfig, AXPImageUrlLogoConfig, AXPSystemActionType, AXPAppStartUpProvider, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER } from '@acorex/platform/core';
7
+ import { AXPModuleProviderRegistry, AXPPlatformScope, AXPBroadcastEventService, objectKeyValueTransforms, AXPSystemActionType, AXPModuleManifestModule, AXPAppStartUpProvider, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXPModuleManifestRegistry } from '@acorex/platform/core';
9
8
  import { AXTranslationService } from '@acorex/core/translation';
10
9
  import { AXPWidgetsCatalog } from '@acorex/platform/layout/widget-core';
11
10
  import { AXPopupModule, AXPopupService } from '@acorex/components/popup';
12
11
  import { AXToastService, AXToastModule } from '@acorex/components/toast';
13
12
  import { AXDateTimeModule } from '@acorex/core/date-time';
14
- import * as i3 from '@acorex/platform/workflow';
13
+ import * as i1 from '@acorex/platform/workflow';
15
14
  import { AXPWorkflowService, createWorkFlowEvent, AXPWorkflowAction, AXPWorkflowError, AXPWorkflowModule } from '@acorex/platform/workflow';
16
- import * as i4 from '@acorex/components/decorators';
17
- import { AXDecoratorModule } from '@acorex/components/decorators';
18
- import * as i2 from '@acorex/components/image';
19
- import { AXImageModule } from '@acorex/components/image';
20
- import { AXPlatform } from '@acorex/core/platform';
21
- import * as i1 from '@angular/common';
22
- import { CommonModule } from '@angular/common';
23
- import { AXPCommandExecutor } from '@acorex/platform/runtime';
15
+ import { AXPCommandExecutor, AXPCommandService } from '@acorex/platform/runtime';
24
16
  import { signalStore, withState, withMethods, patchState, withHooks } from '@ngrx/signals';
25
17
  import { AXFormatService } from '@acorex/core/format';
26
18
  import { AXDialogService } from '@acorex/components/dialog';
@@ -29,13 +21,15 @@ import { AXButtonModule } from '@acorex/components/button';
29
21
  import { AXCheckBoxModule } from '@acorex/components/check-box';
30
22
  import * as i6 from '@acorex/components/color-box';
31
23
  import { AXColorBoxModule } from '@acorex/components/color-box';
32
- import * as i3$1 from '@acorex/components/label';
24
+ import * as i4 from '@acorex/components/decorators';
25
+ import { AXDecoratorModule } from '@acorex/components/decorators';
26
+ import * as i3 from '@acorex/components/label';
33
27
  import { AXLabelModule } from '@acorex/components/label';
34
- import * as i2$1 from '@acorex/components/number-box';
28
+ import * as i2 from '@acorex/components/number-box';
35
29
  import { AXNumberBoxModule } from '@acorex/components/number-box';
36
30
  import { AXBasePageComponent } from '@acorex/components/page';
37
31
  import { AXTextBoxModule } from '@acorex/components/text-box';
38
- import * as i1$2 from '@angular/forms';
32
+ import * as i1$1 from '@angular/forms';
39
33
  import { FormsModule } from '@angular/forms';
40
34
 
41
35
  const AXP_APP_VERSION_PROVIDER = new InjectionToken('AXP_APP_VERSION_PROVIDER', {
@@ -133,24 +127,24 @@ function createAllQueryView(params = {
133
127
  });
134
128
  }
135
129
 
136
- const EQ_OPER = { name: 'equal', title: 'Equal', hasValue: true };
137
- const NOT_EQ_OPER = { name: 'notEqual', title: 'Not Equal', hasValue: true };
138
- const GT_OPER = { name: 'greaterThan', title: 'Greater Than', hasValue: true };
139
- const LT_OPER = { name: 'lessThan', title: 'Less Than', hasValue: true };
130
+ const EQ_OPER = { name: 'equal', title: '@general:terms.operators.equal', hasValue: true };
131
+ const NOT_EQ_OPER = { name: 'notEqual', title: '@general:terms.operators.not-equal', hasValue: true };
132
+ const GT_OPER = { name: 'greaterThan', title: '@general:terms.operators.greater-than', hasValue: true };
133
+ const LT_OPER = { name: 'lessThan', title: '@general:terms.operators.less-than', hasValue: true };
140
134
  const GTE_OPER = {
141
135
  name: 'greaterThanOrEqual',
142
- title: 'Greater Than or Equal',
136
+ title: '@general:terms.operators.greater-than-or-equal',
143
137
  hasValue: true,
144
138
  };
145
- const LTE_OPER = { name: 'lessThanOrEqual', title: 'Less Than or Equal', hasValue: true };
146
- const CONTAINS_OPER = { name: 'contains', title: 'Contains', hasValue: true };
147
- const NOT_CONTAINS_OPER = { name: 'notContains', title: 'Does Not Contain', hasValue: true };
148
- const IN_OPER = { name: 'in', title: 'In', hasValue: true };
149
- const STARTS_WITH_OPER = { name: 'startsWith', title: 'Starts With', hasValue: true };
150
- const ENDS_WITH_OPER = { name: 'endsWith', title: 'Ends With', hasValue: true };
151
- const IS_EMPTY_OPER = { name: 'isEmpty', title: 'Is Empty', hasValue: false };
152
- const IS_NOT_EMPTY_OPER = { name: 'isNotEmpty', title: 'Is Not Empty', hasValue: false };
153
- const BETWEEN_OPER = { name: 'between', title: 'Between', hasValue: true };
139
+ const LTE_OPER = { name: 'lessThanOrEqual', title: '@general:terms.operators.less-than-or-equal', hasValue: true };
140
+ const CONTAINS_OPER = { name: 'contains', title: '@general:terms.operators.contains', hasValue: true };
141
+ const NOT_CONTAINS_OPER = { name: 'notContains', title: '@general:terms.operators.not-contains', hasValue: true };
142
+ const IN_OPER = { name: 'in', title: '@general:terms.operators.in', hasValue: true };
143
+ const STARTS_WITH_OPER = { name: 'startsWith', title: '@general:terms.operators.starts-with', hasValue: true };
144
+ const ENDS_WITH_OPER = { name: 'endsWith', title: '@general:terms.operators.ends-with', hasValue: true };
145
+ const IS_EMPTY_OPER = { name: 'isEmpty', title: '@general:terms.operators.is-empty', hasValue: false };
146
+ const IS_NOT_EMPTY_OPER = { name: 'isNotEmpty', title: '@general:terms.operators.is-not-empty', hasValue: false };
147
+ const BETWEEN_OPER = { name: 'between', title: '@general:terms.operators.between', hasValue: true };
154
148
  const STRING_OPERATORS = [
155
149
  EQ_OPER,
156
150
  NOT_EQ_OPER,
@@ -327,6 +321,7 @@ const AXP_SETTING_DEFINITION_PROVIDER = new InjectionToken('AXP_SETTING_DEFINITI
327
321
  class AXPSettingDefinitionProviderService {
328
322
  constructor() {
329
323
  this.providers = inject(AXP_SETTING_DEFINITION_PROVIDER, { optional: true });
324
+ this.providerRegistry = inject(AXPModuleProviderRegistry);
330
325
  this.cache = null;
331
326
  }
332
327
  async load() {
@@ -334,6 +329,7 @@ class AXPSettingDefinitionProviderService {
334
329
  return;
335
330
  }
336
331
  const context = new AXPSettingDefinitionProviderContext();
332
+ // Load providers from DI tokens (backward compatibility)
337
333
  if (Array.isArray(this.providers)) {
338
334
  for (const provider of this.providers) {
339
335
  if (provider instanceof Promise) {
@@ -347,6 +343,11 @@ class AXPSettingDefinitionProviderService {
347
343
  }
348
344
  }
349
345
  }
346
+ // Load providers from registry (manifest-based, conditionally loaded)
347
+ const registryProviders = this.providerRegistry.getSettingProviders();
348
+ for (const provider of registryProviders) {
349
+ await provider.provide(context);
350
+ }
350
351
  this.cache = context.getGroups();
351
352
  }
352
353
  async reload() {
@@ -556,7 +557,7 @@ class AXPSettingValueProviderDefault {
556
557
  }
557
558
  }
558
559
 
559
- class AXPSettingService {
560
+ class AXPSettingsService {
560
561
  constructor() {
561
562
  this.providers = inject(AXP_SETTING_VALUE_PROVIDER);
562
563
  this.injector = inject(Injector);
@@ -676,10 +677,10 @@ class AXPSettingService {
676
677
  this.onChanged.next(event);
677
678
  this.eventService.publish('AXPSettingChangedEvent', event);
678
679
  }
679
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPSettingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
680
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPSettingService, providedIn: 'root' }); }
680
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPSettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
681
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPSettingsService, providedIn: 'root' }); }
681
682
  }
682
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPSettingService, decorators: [{
683
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPSettingsService, decorators: [{
683
684
  type: Injectable,
684
685
  args: [{
685
686
  providedIn: 'root',
@@ -735,9 +736,38 @@ class ScopedSettingService {
735
736
  }
736
737
  }
737
738
 
739
+ /**
740
+ * Regional settings keys for date, time, and locale formatting.
741
+ * These keys are used by platform widgets and components to access regional settings.
742
+ * The actual setting definitions and providers are implemented in the locale-management module.
743
+ */
744
+ var AXPRegionalSetting;
745
+ (function (AXPRegionalSetting) {
746
+ AXPRegionalSetting["LocaleProfile"] = "LocaleManagement:Setting:Regional.LocaleProfile";
747
+ AXPRegionalSetting["TimeZone"] = "LocaleManagement:Setting:Regional.TimeZone";
748
+ AXPRegionalSetting["Language"] = "LocaleManagement:Setting:Regional.Language";
749
+ AXPRegionalSetting["Country"] = "LocaleManagement:Setting:Regional.Country";
750
+ AXPRegionalSetting["Calendar"] = "LocaleManagement:Setting:Regional.Calendar";
751
+ AXPRegionalSetting["FirstDayOfWeek"] = "LocaleManagement:Setting:Regional.FirstDayOfWeek";
752
+ AXPRegionalSetting["WeekendDays"] = "LocaleManagement:Setting:Regional.WeekendDays";
753
+ AXPRegionalSetting["ShortDate"] = "LocaleManagement:Setting:Regional.ShortDate";
754
+ AXPRegionalSetting["MediumDate"] = "LocaleManagement:Setting:Regional.MediumDate";
755
+ AXPRegionalSetting["LongDate"] = "LocaleManagement:Setting:Regional.LongDate";
756
+ AXPRegionalSetting["ShortTime"] = "LocaleManagement:Setting:Regional.ShortTime";
757
+ AXPRegionalSetting["MediumTime"] = "LocaleManagement:Setting:Regional.MediumTime";
758
+ AXPRegionalSetting["LongTime"] = "LocaleManagement:Setting:Regional.LongTime";
759
+ AXPRegionalSetting["MeasurementUnits"] = "LocaleManagement:Setting:Regional.MeasurementUnits";
760
+ AXPRegionalSetting["TemperatureUnits"] = "LocaleManagement:Setting:Regional.TemperatureUnits";
761
+ AXPRegionalSetting["DistanceUnits"] = "LocaleManagement:Setting:Regional.DistanceUnits";
762
+ AXPRegionalSetting["WeightUnits"] = "LocaleManagement:Setting:Regional.WeightUnits";
763
+ AXPRegionalSetting["VolumeUnits"] = "LocaleManagement:Setting:Regional.VolumeUnits";
764
+ AXPRegionalSetting["SpeedUnits"] = "LocaleManagement:Setting:Regional.SpeedUnits";
765
+ AXPRegionalSetting["AreaUnits"] = "LocaleManagement:Setting:Regional.AreaUnits";
766
+ })(AXPRegionalSetting || (AXPRegionalSetting = {}));
767
+
738
768
  var AXPHomePageSettings;
739
769
  (function (AXPHomePageSettings) {
740
- AXPHomePageSettings["UserHomePath"] = "general:startup:home-page";
770
+ AXPHomePageSettings["UserHomePath"] = "Common:Setting:Startup.HomePage";
741
771
  })(AXPHomePageSettings || (AXPHomePageSettings = {}));
742
772
 
743
773
  class AXPHomePageService {
@@ -748,7 +778,7 @@ class AXPHomePageService {
748
778
  this.defaultHomePageKey = inject(AXP_HOME_PAGE_DEFAULT_KEY, { optional: true }) ?? 'home';
749
779
  this.userHomePageKey = null;
750
780
  this.candidates = inject(AXP_HOME_PAGES, { optional: true }) ?? [];
751
- this.settingsService = inject(AXPSettingService);
781
+ this.settingsService = inject(AXPSettingsService);
752
782
  this.sessionService = inject(AXPSessionService);
753
783
  this.injector = inject(Injector);
754
784
  this.originalConfig = null;
@@ -1081,43 +1111,61 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1081
1111
  args: [{ providedIn: 'root' }]
1082
1112
  }], ctorParameters: () => [{ type: i0.Injector }, { type: AXPErrorHandlerRegistryService }] });
1083
1113
 
1084
- const AXP_GLOBAL_VARIABLE_DEFINITION_PROVIDER = new InjectionToken('AXP_GLOBAL_VARIABLE_DEFINITION_PROVIDER', {
1114
+ const AXP_TOKEN_DEFINITION_PROVIDER = new InjectionToken('AXP_TOKEN_DEFINITION_PROVIDER', {
1085
1115
  factory: () => [],
1086
1116
  });
1087
1117
 
1088
1118
  //#region ---- Imports ----
1089
1119
  //#endregion
1090
- class AXPGlobalVariableDefinitionService {
1120
+ class AXPTokenDefinitionService {
1091
1121
  constructor() {
1092
1122
  //#region ---- Providers & Caches ----
1093
- this.definitionProviders = inject(AXP_GLOBAL_VARIABLE_DEFINITION_PROVIDER, { optional: true }) || [];
1123
+ this.definitionProviders = inject(AXP_TOKEN_DEFINITION_PROVIDER, { optional: true }) || [];
1094
1124
  /** Cache for definitions by name. */
1095
1125
  this.definitionsByName = new Map();
1096
1126
  }
1097
1127
  //#endregion
1098
1128
  //#region ---- Public API ----
1099
1129
  /**
1100
- * Returns a report definition by its id.
1130
+ * Returns a token definition by its name.
1101
1131
  * First checks the cache, then queries all providers if not found.
1102
- * @param name The global variable name.
1103
- * @returns The global variable definition if found, undefined otherwise.
1132
+ * @param name The token name.
1133
+ * @returns The token definition if found, undefined otherwise.
1104
1134
  */
1105
- async getByName(name) {
1135
+ async getDefinition(name) {
1106
1136
  // Check cache first
1107
1137
  if (this.definitionsByName.has(name)) {
1108
1138
  return this.definitionsByName.get(name);
1109
1139
  }
1110
- // Not in cache, query providers (each provider is itself a global variable definition)
1140
+ // Not in cache, query providers
1141
+ // Resolve all providers (some may be promises, some may be arrays)
1111
1142
  const resolvedProviders = await Promise.all(this.definitionProviders);
1112
- const match = resolvedProviders.find(def => def?.name === name);
1143
+ // Flatten the array - some providers may be arrays of providers (e.g., dynamic token providers)
1144
+ const flattenedProviders = [];
1145
+ for (const provider of resolvedProviders) {
1146
+ if (Array.isArray(provider)) {
1147
+ // If provider is an array, add all items
1148
+ flattenedProviders.push(...provider);
1149
+ }
1150
+ else if (provider) {
1151
+ // If provider is a single provider, add it
1152
+ flattenedProviders.push(provider);
1153
+ }
1154
+ }
1155
+ const match = flattenedProviders.find(def => def?.name === name);
1113
1156
  if (match) {
1114
1157
  this.definitionsByName.set(name, match);
1115
1158
  return match;
1116
1159
  }
1117
1160
  return undefined;
1118
1161
  }
1119
- async execute(name) {
1120
- const definition = await this.getByName(name);
1162
+ /**
1163
+ * Gets the resolved value of a token by its name.
1164
+ * @param name The token name.
1165
+ * @returns The resolved token value, or undefined if the token is not found.
1166
+ */
1167
+ async getValue(name) {
1168
+ const definition = await this.getDefinition(name);
1121
1169
  if (definition) {
1122
1170
  return await definition.execute();
1123
1171
  }
@@ -1129,24 +1177,24 @@ class AXPGlobalVariableDefinitionService {
1129
1177
  clearDefinitionsCache() {
1130
1178
  this.definitionsByName.clear();
1131
1179
  }
1132
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGlobalVariableDefinitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1133
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGlobalVariableDefinitionService, providedIn: 'root' }); }
1180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTokenDefinitionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1181
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTokenDefinitionService, providedIn: 'root' }); }
1134
1182
  }
1135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGlobalVariableDefinitionService, decorators: [{
1183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTokenDefinitionService, decorators: [{
1136
1184
  type: Injectable,
1137
1185
  args: [{
1138
1186
  providedIn: 'root',
1139
1187
  }]
1140
1188
  }] });
1141
1189
 
1142
- class AXPGlobalVariableEvaluatorScopeProvider {
1190
+ class AXPTokenEvaluatorScopeProvider {
1143
1191
  constructor() {
1144
- this.globalVariableService = inject(AXPGlobalVariableDefinitionService);
1192
+ this.tokenService = inject(AXPTokenDefinitionService);
1145
1193
  }
1146
1194
  async provide(context) {
1147
- context.addScope('variables', {
1148
- execute: async (name) => {
1149
- return await this.globalVariableService.execute(name);
1195
+ context.addScope('tokens', {
1196
+ get: async (name) => {
1197
+ return await this.tokenService.getValue(name);
1150
1198
  }
1151
1199
  });
1152
1200
  }
@@ -1256,46 +1304,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1256
1304
  type: Input
1257
1305
  }] } });
1258
1306
 
1259
- class AXPLogoComponent {
1260
- constructor() {
1261
- this.platform = inject(AXPlatform);
1262
- }
1263
- ngOnInit() {
1264
- this.setLogoType();
1265
- this.platform.themeMode$.subscribe(() => {
1266
- this.setLogoTheme();
1267
- });
1268
- }
1269
- ngOnChanges() {
1270
- this.setLogoTheme();
1271
- }
1272
- setLogoType() {
1273
- switch (true) {
1274
- case this.source instanceof AXPImageUrlLogoConfig:
1275
- this.logoType = 'url';
1276
- break;
1277
- case this.source instanceof AXPComponentLogoConfig:
1278
- this.logoType = 'component';
1279
- break;
1280
- default:
1281
- break;
1282
- }
1283
- }
1284
- setLogoTheme() {
1285
- if (this.source && this.source.dark && this.source.light) {
1286
- this.source = this.platform.isDark() ? this.source.dark : this.source.light;
1287
- }
1288
- }
1289
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1290
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPLogoComponent, isStandalone: true, selector: "axp-logo", inputs: { source: "source" }, host: { classAttribute: "ax-flex ax-justify-center" }, usesOnChanges: true, ngImport: i0, template: "@switch (logoType) { @case ('url') {\n<ax-image [width]=\"source.width\" [height]=\"source.height\" [src]=\"source.url\"></ax-image>\n} @case ('component') {\n<ng-container *ngComponentOutlet=\"source.component\"></ng-container>\n} }\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }] }); }
1291
- }
1292
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLogoComponent, decorators: [{
1293
- type: Component,
1294
- args: [{ selector: 'axp-logo', imports: [CommonModule, AXImageModule, AXDecoratorModule], host: { class: 'ax-flex ax-justify-center' }, template: "@switch (logoType) { @case ('url') {\n<ax-image [width]=\"source.width\" [height]=\"source.height\" [src]=\"source.url\"></ax-image>\n} @case ('component') {\n<ng-container *ngComponentOutlet=\"source.component\"></ng-container>\n} }\n" }]
1295
- }], propDecorators: { source: [{
1296
- type: Input
1297
- }] } });
1298
-
1299
1307
  //#region ---- Menu Context Builder ----
1300
1308
  /**
1301
1309
  * Creates a rich context for menu manipulation
@@ -1627,10 +1635,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1627
1635
  }] });
1628
1636
 
1629
1637
  const AXP_MENU_PROVIDER = new InjectionToken('AXP_MENU_PROVIDER');
1638
+ //TODO: check performance of this service
1630
1639
  class AXPMenuProviderService {
1631
1640
  constructor() {
1632
1641
  //#region ---- Dependencies ----
1633
1642
  this.providers = inject(AXP_MENU_PROVIDER, { optional: true });
1643
+ this.providerRegistry = inject(AXPModuleProviderRegistry);
1634
1644
  this.middlewareRegistry = inject(AXPMenuMiddlewareRegistry);
1635
1645
  //#endregion
1636
1646
  //#region ---- State ----
@@ -1658,11 +1668,17 @@ class AXPMenuProviderService {
1658
1668
  }
1659
1669
  const items = [];
1660
1670
  const context = this.createMenuProviderContext(items);
1671
+ // Load providers from DI tokens (backward compatibility)
1661
1672
  if (Array.isArray(this.providers)) {
1662
1673
  for (const provider of this.providers) {
1663
1674
  await provider.provide(context);
1664
1675
  }
1665
1676
  }
1677
+ // Load providers from registry (manifest-based, conditionally loaded)
1678
+ const registryProviders = this.providerRegistry.getMenuProviders();
1679
+ for (const provider of registryProviders) {
1680
+ await provider.provide(context);
1681
+ }
1666
1682
  // Apply pending operations
1667
1683
  this.applyPendingOperations(items);
1668
1684
  // Sort items by priority
@@ -1682,11 +1698,17 @@ class AXPMenuProviderService {
1682
1698
  async rawItems() {
1683
1699
  const items = [];
1684
1700
  const context = this.createMenuProviderContext(items);
1701
+ // Load providers from DI tokens (backward compatibility)
1685
1702
  if (Array.isArray(this.providers)) {
1686
1703
  for (const provider of this.providers) {
1687
1704
  await provider.provide(context);
1688
1705
  }
1689
1706
  }
1707
+ // Load providers from registry (manifest-based, conditionally loaded)
1708
+ const registryProviders = this.providerRegistry.getMenuProviders();
1709
+ for (const provider of registryProviders) {
1710
+ await provider.provide(context);
1711
+ }
1690
1712
  // Apply pending operations
1691
1713
  this.applyPendingOperations(items);
1692
1714
  // Sort items by priority
@@ -1732,10 +1754,29 @@ class AXPMenuProviderService {
1732
1754
  createMenuProviderContext(items) {
1733
1755
  return {
1734
1756
  addItems: (newItems) => {
1735
- items.push(...newItems);
1757
+ for (const newItem of newItems) {
1758
+ if (newItem.name) {
1759
+ const existingItem = this.findItemByName(items, newItem.name);
1760
+ if (existingItem) {
1761
+ // Update existing item, merging properties
1762
+ this.mergeMenuItem(existingItem, newItem);
1763
+ }
1764
+ else {
1765
+ // Add new item if it doesn't exist
1766
+ items.push(newItem);
1767
+ }
1768
+ }
1769
+ else {
1770
+ // Add item without name (no way to check for duplicates)
1771
+ items.push(newItem);
1772
+ }
1773
+ }
1736
1774
  },
1737
1775
  find: (target) => {
1776
+ const foundItemInfo = this.findItemWithParent(items, target);
1777
+ const exists = foundItemInfo.foundItem !== null;
1738
1778
  return {
1779
+ exists,
1739
1780
  insert: (newItems, position) => {
1740
1781
  this.pendingInserts.push({ target, newItems, position });
1741
1782
  },
@@ -1761,13 +1802,48 @@ class AXPMenuProviderService {
1761
1802
  items.push(...newItems);
1762
1803
  }
1763
1804
  else {
1764
- if (position == 'inside') {
1765
- foundItem.children?.push(...newItems);
1805
+ if (position === 'inside') {
1806
+ if (!foundItem.children) {
1807
+ foundItem.children = [];
1808
+ }
1809
+ // Check for duplicates by name and merge or add
1810
+ for (const newItem of newItems) {
1811
+ if (newItem.name) {
1812
+ const existingChild = this.findItemByName(foundItem.children, newItem.name);
1813
+ if (existingChild) {
1814
+ this.mergeMenuItem(existingChild, newItem);
1815
+ }
1816
+ else {
1817
+ foundItem.children.push(newItem);
1818
+ }
1819
+ }
1820
+ else {
1821
+ foundItem.children.push(newItem);
1822
+ }
1823
+ }
1766
1824
  }
1767
1825
  else {
1768
- const index = parentItems.indexOf(foundItem);
1769
- const insertPosition = position === 'before' ? index : index + 1;
1770
- parentItems.splice(insertPosition, 0, ...newItems);
1826
+ // For 'before' and 'after', check for duplicates in parent items
1827
+ const itemsToInsert = [];
1828
+ for (const newItem of newItems) {
1829
+ if (newItem.name) {
1830
+ const existingItem = this.findItemByName(parentItems, newItem.name);
1831
+ if (existingItem) {
1832
+ this.mergeMenuItem(existingItem, newItem);
1833
+ }
1834
+ else {
1835
+ itemsToInsert.push(newItem);
1836
+ }
1837
+ }
1838
+ else {
1839
+ itemsToInsert.push(newItem);
1840
+ }
1841
+ }
1842
+ if (itemsToInsert.length > 0) {
1843
+ const index = parentItems.indexOf(foundItem);
1844
+ const insertPosition = position === 'before' ? index : index + 1;
1845
+ parentItems.splice(insertPosition, 0, ...itemsToInsert);
1846
+ }
1771
1847
  }
1772
1848
  }
1773
1849
  }
@@ -1802,7 +1878,21 @@ class AXPMenuProviderService {
1802
1878
  if (!foundItem.children) {
1803
1879
  foundItem.children = [];
1804
1880
  }
1805
- foundItem.children.push(...newItems);
1881
+ // Check for duplicates by name and merge or add
1882
+ for (const newItem of newItems) {
1883
+ if (newItem.name) {
1884
+ const existingChild = this.findItemByName(foundItem.children, newItem.name);
1885
+ if (existingChild) {
1886
+ this.mergeMenuItem(existingChild, newItem);
1887
+ }
1888
+ else {
1889
+ foundItem.children.push(newItem);
1890
+ }
1891
+ }
1892
+ else {
1893
+ foundItem.children.push(newItem);
1894
+ }
1895
+ }
1806
1896
  }
1807
1897
  }
1808
1898
  // Clear pending operations after applying them
@@ -1825,6 +1915,70 @@ class AXPMenuProviderService {
1825
1915
  }
1826
1916
  return { foundItem: null, parentItems: items };
1827
1917
  }
1918
+ /**
1919
+ * Find menu item by name in the items tree (recursive search)
1920
+ */
1921
+ findItemByName(items, name) {
1922
+ for (const item of items) {
1923
+ if (item.name === name) {
1924
+ return item;
1925
+ }
1926
+ if (item.children) {
1927
+ const found = this.findItemByName(item.children, name);
1928
+ if (found) {
1929
+ return found;
1930
+ }
1931
+ }
1932
+ }
1933
+ return null;
1934
+ }
1935
+ /**
1936
+ * Merge new item properties into existing item, handling children merge
1937
+ */
1938
+ mergeMenuItem(existingItem, newItem) {
1939
+ // Merge top-level properties (newItem properties override existing only if defined)
1940
+ if (newItem.text !== undefined)
1941
+ existingItem.text = newItem.text;
1942
+ if (newItem.description !== undefined)
1943
+ existingItem.description = newItem.description;
1944
+ if (newItem.icon !== undefined)
1945
+ existingItem.icon = newItem.icon;
1946
+ if (newItem.path !== undefined)
1947
+ existingItem.path = newItem.path;
1948
+ if (newItem.priority !== undefined)
1949
+ existingItem.priority = newItem.priority;
1950
+ if (newItem.type !== undefined)
1951
+ existingItem.type = newItem.type;
1952
+ if (newItem.command !== undefined)
1953
+ existingItem.command = newItem.command;
1954
+ if (newItem.badgeKey !== undefined)
1955
+ existingItem.badgeKey = newItem.badgeKey;
1956
+ if (newItem.data !== undefined)
1957
+ existingItem.data = newItem.data;
1958
+ if (newItem.policy !== undefined)
1959
+ existingItem.policy = newItem.policy;
1960
+ // Merge children if both have children
1961
+ if (newItem.children && newItem.children.length > 0) {
1962
+ if (!existingItem.children) {
1963
+ existingItem.children = [];
1964
+ }
1965
+ // For each child in newItem, check if it exists by name and merge or add
1966
+ for (const newChild of newItem.children) {
1967
+ if (newChild.name) {
1968
+ const existingChild = this.findItemByName(existingItem.children, newChild.name);
1969
+ if (existingChild) {
1970
+ this.mergeMenuItem(existingChild, newChild);
1971
+ }
1972
+ else {
1973
+ existingItem.children.push(newChild);
1974
+ }
1975
+ }
1976
+ else {
1977
+ existingItem.children.push(newChild);
1978
+ }
1979
+ }
1980
+ }
1981
+ }
1828
1982
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPMenuProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1829
1983
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPMenuProviderService, providedIn: 'root' }); }
1830
1984
  }
@@ -2051,6 +2205,105 @@ withMethods((store, router = inject(Router), workflow = inject(AXPWorkflowServic
2051
2205
  };
2052
2206
  }));
2053
2207
 
2208
+ /**
2209
+ * Service for checking menu item visibility based on permissions, features, and children.
2210
+ * This service helps filter out empty menu items that have no visible children.
2211
+ */
2212
+ class AXPMenuVisibilityService {
2213
+ constructor() {
2214
+ this.sessionService = inject(AXPSessionService);
2215
+ }
2216
+ /**
2217
+ * Checks if a menu item should be visible based on permissions and features.
2218
+ */
2219
+ isItemVisible(item) {
2220
+ const policy = item.policy;
2221
+ if (!policy) {
2222
+ return true; // No policy means visible
2223
+ }
2224
+ // Check features
2225
+ if (policy.features && policy.features.length > 0) {
2226
+ const featureKeys = Array.isArray(policy.features) ? policy.features : [policy.features];
2227
+ if (!this.sessionService.isFeatureEnabled(...featureKeys)) {
2228
+ return false;
2229
+ }
2230
+ }
2231
+ // Check permissions
2232
+ if (policy.permissions && policy.permissions.length > 0) {
2233
+ const permissionKeys = Array.isArray(policy.permissions) ? policy.permissions : [policy.permissions];
2234
+ if (!this.sessionService.authorize(...permissionKeys)) {
2235
+ return false;
2236
+ }
2237
+ }
2238
+ return true;
2239
+ }
2240
+ /**
2241
+ * Recursively checks if a menu item has any visible children.
2242
+ * @param item The menu item to check
2243
+ * @param getRouterLink Optional function to check if an item has a router link
2244
+ */
2245
+ hasVisibleChildren(item, getRouterLink) {
2246
+ if (!item.children || item.children.length === 0) {
2247
+ return false;
2248
+ }
2249
+ return item.children.some((child) => {
2250
+ // Check if child itself is visible
2251
+ if (!this.isItemVisible(child)) {
2252
+ return false;
2253
+ }
2254
+ // If child has a routerLink, it's visible
2255
+ if (getRouterLink && getRouterLink(child)) {
2256
+ return true;
2257
+ }
2258
+ // If child has visible children, it's visible
2259
+ if (this.hasVisibleChildren(child, getRouterLink)) {
2260
+ return true;
2261
+ }
2262
+ // For items without routerLink, check if they have a command (non-empty menu items)
2263
+ if (child.command) {
2264
+ return true;
2265
+ }
2266
+ return false;
2267
+ });
2268
+ }
2269
+ /**
2270
+ * Determines if a menu item should be rendered.
2271
+ * A menu item should be rendered if:
2272
+ * 1. It has a routerLink, OR
2273
+ * 2. It has visible children, OR
2274
+ * 3. It has a command (for non-router navigation)
2275
+ *
2276
+ * @param item The menu item to check
2277
+ * @param getRouterLink Optional function to check if an item has a router link
2278
+ */
2279
+ shouldRenderMenuItem(item, getRouterLink) {
2280
+ // Check if item itself is visible (permissions/features)
2281
+ if (!this.isItemVisible(item)) {
2282
+ return false;
2283
+ }
2284
+ // If it has a routerLink, render it
2285
+ if (getRouterLink && getRouterLink(item)) {
2286
+ return true;
2287
+ }
2288
+ // If it has visible children, render it
2289
+ if (this.hasVisibleChildren(item, getRouterLink)) {
2290
+ return true;
2291
+ }
2292
+ // If it has a command (for non-router navigation), render it
2293
+ if (item.command) {
2294
+ return true;
2295
+ }
2296
+ // Otherwise, don't render empty menu items
2297
+ return false;
2298
+ }
2299
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPMenuVisibilityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2300
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPMenuVisibilityService, providedIn: 'root' }); }
2301
+ }
2302
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPMenuVisibilityService, decorators: [{
2303
+ type: Injectable,
2304
+ args: [{ providedIn: 'root' }]
2305
+ }] });
2306
+
2054
2307
  class AXPMenuSearchDefinitionProvider {
2055
2308
  async provide(context) {
2056
2309
  context.addDefinition('menu', 'Menu', 'menu', 'fa-thin fa-bars', 2, {
@@ -2245,6 +2498,7 @@ const AXP_SEARCH_DEFINITION_PROVIDER = new InjectionToken('AXP_SEARCH_DEFINITION
2245
2498
  class AXPSearchDefinitionProviderService {
2246
2499
  constructor() {
2247
2500
  this.providers = inject(AXP_SEARCH_DEFINITION_PROVIDER, { optional: true });
2501
+ this.providerRegistry = inject(AXPModuleProviderRegistry);
2248
2502
  this.cache = null;
2249
2503
  }
2250
2504
  async load() {
@@ -2252,11 +2506,14 @@ class AXPSearchDefinitionProviderService {
2252
2506
  return;
2253
2507
  }
2254
2508
  const context = new AXPSearchDefinitionProviderContext();
2509
+ // Load providers from DI tokens (backward compatibility)
2255
2510
  if (Array.isArray(this.providers)) {
2256
2511
  for (const provider of this.providers) {
2257
2512
  await provider.provide(context);
2258
2513
  }
2259
2514
  }
2515
+ // Note: Search definition providers are different from search command providers
2516
+ // Search command providers are handled separately in search.service.ts
2260
2517
  this.cache = context.getDefinitions();
2261
2518
  }
2262
2519
  async getListAsync() {
@@ -2304,6 +2561,7 @@ const AXP_SEARCH_PROVIDER = new InjectionToken('AXP_SEARCH_PROVIDER');
2304
2561
  class AXPSearchService {
2305
2562
  constructor() {
2306
2563
  this.providers = inject(AXP_SEARCH_PROVIDER, { optional: true });
2564
+ this.providerRegistry = inject(AXPModuleProviderRegistry);
2307
2565
  this.definitionService = inject(AXPSearchDefinitionProviderService);
2308
2566
  this.formatService = inject(AXFormatService);
2309
2567
  }
@@ -2312,11 +2570,24 @@ class AXPSearchService {
2312
2570
  if (this.definitionService.getList().length == 0) {
2313
2571
  await this.definitionService.getListAsync();
2314
2572
  }
2315
- if (!this.providers || (this.providers?.length || 0) === 0) {
2316
- throw new Error('No search providers available'); // No providers available
2573
+ // Collect providers from both DI tokens and registry
2574
+ const allProviders = [];
2575
+ // Load from DI tokens (backward compatibility)
2576
+ if (Array.isArray(this.providers)) {
2577
+ allProviders.push(...this.providers);
2578
+ }
2579
+ else if (this.providers) {
2580
+ allProviders.push(this.providers);
2581
+ }
2582
+ // Load from registry (manifest-based, conditionally loaded)
2583
+ // Note: Registry stores AXPSearchCommandProvider which implements AXPSearchProvider
2584
+ const registryProviders = this.providerRegistry.getSearchProviders();
2585
+ allProviders.push(...registryProviders);
2586
+ if (allProviders.length === 0) {
2587
+ throw new Error('No search providers available');
2317
2588
  }
2318
2589
  const mergeData = [];
2319
- const promises = this.providers.map((provider) => provider.search(text));
2590
+ const promises = allProviders.map((provider) => provider.search(text));
2320
2591
  const results = await Promise.all(promises);
2321
2592
  for (const resultArray of results) {
2322
2593
  for (const result of resultArray) {
@@ -2382,8 +2653,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2382
2653
 
2383
2654
  var AXPCommonSettings;
2384
2655
  (function (AXPCommonSettings) {
2385
- AXPCommonSettings["EnableOperationToasts"] = "general:notifications:enable-operation-toasts";
2386
- AXPCommonSettings["EntityFilterApplyMode"] = "general:entity:filter-apply-mode";
2656
+ AXPCommonSettings["EnableOperationToasts"] = "Common:Setting:Notifications.EnableOperationToasts";
2657
+ AXPCommonSettings["EntityFilterApplyMode"] = "Common:Setting:Entity.FilterApplyMode";
2387
2658
  })(AXPCommonSettings || (AXPCommonSettings = {}));
2388
2659
 
2389
2660
  //TODO Loading, Redirect, Drawer, Show toast
@@ -2438,10 +2709,10 @@ class AXPToastAction extends AXPWorkflowAction {
2438
2709
  super(...arguments);
2439
2710
  this.toastService = inject(AXToastService);
2440
2711
  this.translationService = inject(AXTranslationService);
2441
- this.settingService = inject(AXPSettingService);
2712
+ this.settingsService = inject(AXPSettingsService);
2442
2713
  }
2443
2714
  async execute(context) {
2444
- const showResult = await this.settingService.get(AXPCommonSettings.EnableOperationToasts);
2715
+ const showResult = await this.settingsService.get(AXPCommonSettings.EnableOperationToasts);
2445
2716
  if (showResult) {
2446
2717
  this.toastService.show({
2447
2718
  color: this.color,
@@ -2577,23 +2848,16 @@ class AXPCommonModule {
2577
2848
  /**
2578
2849
  * @ignore
2579
2850
  */
2580
- constructor(instances, appInitService, settingsService) {
2851
+ constructor(instances) {
2581
2852
  instances.forEach((f) => {
2582
2853
  f();
2583
2854
  });
2584
- appInitService.registerTask({
2585
- name: 'Settings',
2586
- statusText: 'Loading Settings ...',
2587
- priority: 2,
2588
- run: async () => {
2589
- await settingsService.load();
2590
- },
2591
- });
2592
2855
  }
2593
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPCommonModule, deps: [{ token: 'AXPCommonModuleFactory' }, { token: i1$1.AXPAppStartUpService }, { token: AXPSettingService }], target: i0.ɵɵFactoryTarget.NgModule }); }
2594
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.12", ngImport: i0, type: AXPCommonModule, imports: [i3.AXPWorkflowModule, AXPopupModule,
2856
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPCommonModule, deps: [{ token: 'AXPCommonModuleFactory' }], target: i0.ɵɵFactoryTarget.NgModule }); }
2857
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.12", ngImport: i0, type: AXPCommonModule, imports: [i1.AXPWorkflowModule, AXPopupModule,
2595
2858
  AXDateTimeModule,
2596
- AXToastModule], exports: [RouterModule] }); }
2859
+ AXToastModule,
2860
+ AXPModuleManifestModule], exports: [RouterModule] }); }
2597
2861
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPCommonModule, providers: [
2598
2862
  AXPAppStartUpProvider,
2599
2863
  {
@@ -2620,7 +2884,7 @@ class AXPCommonModule {
2620
2884
  },
2621
2885
  {
2622
2886
  provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
2623
- useClass: AXPGlobalVariableEvaluatorScopeProvider,
2887
+ useClass: AXPTokenEvaluatorScopeProvider,
2624
2888
  multi: true,
2625
2889
  },
2626
2890
  {
@@ -2645,7 +2909,8 @@ class AXPCommonModule {
2645
2909
  }),
2646
2910
  AXPopupModule,
2647
2911
  AXDateTimeModule,
2648
- AXToastModule, RouterModule] }); }
2912
+ AXToastModule,
2913
+ AXPModuleManifestModule, RouterModule] }); }
2649
2914
  }
2650
2915
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPCommonModule, decorators: [{
2651
2916
  type: NgModule,
@@ -2665,6 +2930,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2665
2930
  AXPopupModule,
2666
2931
  AXDateTimeModule,
2667
2932
  AXToastModule,
2933
+ AXPModuleManifestModule,
2668
2934
  ],
2669
2935
  exports: [RouterModule],
2670
2936
  providers: [
@@ -2693,7 +2959,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2693
2959
  },
2694
2960
  {
2695
2961
  provide: AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER,
2696
- useClass: AXPGlobalVariableEvaluatorScopeProvider,
2962
+ useClass: AXPTokenEvaluatorScopeProvider,
2697
2963
  multi: true,
2698
2964
  },
2699
2965
  {
@@ -2710,7 +2976,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2710
2976
  }], ctorParameters: () => [{ type: undefined, decorators: [{
2711
2977
  type: Inject,
2712
2978
  args: ['AXPCommonModuleFactory']
2713
- }] }, { type: i1$1.AXPAppStartUpService }, { type: AXPSettingService }] });
2979
+ }] }] });
2714
2980
 
2715
2981
  const ENVIRONMENT = new InjectionToken('ENVIRONMENT');
2716
2982
  const AXP_PLATFORM_CONFIG_TOKEN = new InjectionToken('AXP_PLATFORM_CONFIG_TOKEN', {
@@ -2782,6 +3048,510 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2782
3048
  type: Injectable
2783
3049
  }] });
2784
3050
 
3051
+ /**
3052
+ * Status Definition Types
3053
+ * Defines the structure for status definitions and their transitions
3054
+ */
3055
+ /**
3056
+ * Abstract class for status providers
3057
+ * Similar to AXPTaskBadgeProvider pattern
3058
+ */
3059
+ class AXPStatusProvider {
3060
+ }
3061
+ //#endregion
3062
+
3063
+ //#region ---- Injection Token ----
3064
+ /**
3065
+ * Injection token for status providers
3066
+ * Use with multi: true to register multiple providers
3067
+ */
3068
+ const AXP_STATUS_PROVIDERS = new InjectionToken('AXP_STATUS_PROVIDERS');
3069
+ //#endregion
3070
+ //#region ---- Provider Service ----
3071
+ /**
3072
+ * Service for managing status definitions from multiple providers
3073
+ * Similar to AXPTaskBadgeService pattern - no cache, direct access
3074
+ *
3075
+ * @example
3076
+ * ```typescript
3077
+ * // In a module providers array:
3078
+ * {
3079
+ * provide: AXP_STATUS_PROVIDERS,
3080
+ * useClass: TaskStatusProvider,
3081
+ * multi: true,
3082
+ * }
3083
+ *
3084
+ * // Example provider implementation:
3085
+ * export class TaskStatusProvider extends AXPStatusProvider {
3086
+ * readonly key = 'task-management.status';
3087
+ * readonly statuses = [
3088
+ * { name: 'todo', title: 'To Do', color: '#6b7280', icon: 'fa-light fa-circle', isInitial: true },
3089
+ * { name: 'in-progress', title: 'In Progress', color: '#3b82f6', icon: 'fa-light fa-play' },
3090
+ * { name: 'done', title: 'Done', color: '#10b981', icon: 'fa-light fa-check-circle', isFinal: true },
3091
+ * ];
3092
+ * readonly transitions = [
3093
+ * { from: 'todo', to: 'in-progress', title: 'Start', condition: '{{user.canEdit}}' },
3094
+ * { from: 'in-progress', to: 'done', title: 'Complete' },
3095
+ * ];
3096
+ * readonly defaultStatus = 'todo';
3097
+ * }
3098
+ *
3099
+ * // Later, get the status:
3100
+ * const status = statusService.getStatus('task-management.status');
3101
+ * if (status) {
3102
+ * console.log('Statuses:', status.statuses);
3103
+ * console.log('Transitions:', status.transitions);
3104
+ * }
3105
+ * ```
3106
+ */
3107
+ class AXPStatusDefinitionProviderService {
3108
+ //#endregion
3109
+ //#region ---- Constructor ----
3110
+ constructor() {
3111
+ //#region ---- Dependencies ----
3112
+ this.providers = inject(AXP_STATUS_PROVIDERS, { optional: true }) ?? [];
3113
+ this.commandService = inject(AXPCommandService);
3114
+ //#endregion
3115
+ //#region ---- State ----
3116
+ this.statusMap = new Map();
3117
+ // Register all providers in constructor (like badge service)
3118
+ for (const provider of this.providers) {
3119
+ if (this.statusMap.has(provider.key)) {
3120
+ console.warn(`Status with key "${provider.key}" already exists. Overwriting with new status.`);
3121
+ }
3122
+ this.statusMap.set(provider.key, provider);
3123
+ }
3124
+ }
3125
+ //#endregion
3126
+ //#region ---- Public API ----
3127
+ /**
3128
+ * Get a status provider by key
3129
+ * Direct access from Map (no lazy load, no cache)
3130
+ *
3131
+ * @param key - Status key (e.g., 'task-management.status')
3132
+ * @returns Status provider with all statuses and transitions, or undefined if not found
3133
+ *
3134
+ * @example
3135
+ * ```typescript
3136
+ * const status = statusService.getStatus('task-management.status');
3137
+ * if (status) {
3138
+ * console.log('Statuses:', status.statuses);
3139
+ * console.log('Transitions:', status.transitions);
3140
+ * }
3141
+ * ```
3142
+ */
3143
+ getStatus(key) {
3144
+ return this.statusMap.get(key);
3145
+ }
3146
+ /**
3147
+ * Execute a status transition workflow action
3148
+ * Uses transition.command if provided, otherwise defaults to Entity:UpdateStatus
3149
+ * Validates the transition is allowed before executing
3150
+ *
3151
+ * @param definitionKey - Status definition key
3152
+ * @param transition - The transition to execute
3153
+ * @param context - Context data for the command (must include entity name and id/ids)
3154
+ * @returns Promise that resolves when the command execution completes
3155
+ *
3156
+ * @example
3157
+ * ```typescript
3158
+ * await statusService.executeTransition(
3159
+ * 'task-management.status',
3160
+ * { from: 'todo', to: 'in-progress' },
3161
+ * { entity: 'TaskManagement.Task', id: '123', ...entityData }
3162
+ * );
3163
+ * ```
3164
+ */
3165
+ async executeTransition(definitionKey, transition, context) {
3166
+ const provider = this.getStatus(definitionKey);
3167
+ if (!provider) {
3168
+ throw new Error(`Status provider with key "${definitionKey}" not found.`);
3169
+ }
3170
+ // Validate transition is allowed
3171
+ if (!this.isValidTransition(provider, transition.from, transition.to)) {
3172
+ throw new Error(`Invalid transition from "${transition.from}" to "${transition.to}"`);
3173
+ }
3174
+ // Determine which command to use
3175
+ let commandName;
3176
+ let commandOptions;
3177
+ if (transition.command) {
3178
+ // Use transition's explicit command
3179
+ commandName = transition.command.name;
3180
+ commandOptions = {
3181
+ ...(transition.command.options ?? {}),
3182
+ ...context,
3183
+ };
3184
+ }
3185
+ else {
3186
+ // Use default Entity:UpdateStatus command
3187
+ const entity = context['entityName'] ?? context['__meta__']?.config?.name;
3188
+ if (!entity) {
3189
+ throw new Error('Entity name is required in context when using default status update command');
3190
+ }
3191
+ const id = context['id'];
3192
+ const ids = context['ids'];
3193
+ if (!id && !ids) {
3194
+ throw new Error('Either id or ids must be provided in context');
3195
+ }
3196
+ commandName = 'Entity:UpdateStatus';
3197
+ commandOptions = {
3198
+ entity,
3199
+ status: transition.to,
3200
+ statusField: context['statusField'] ?? 'statusId',
3201
+ ...(id ? { id } : {}),
3202
+ ...(ids ? { ids } : {}),
3203
+ };
3204
+ }
3205
+ // Execute the command
3206
+ const result = await this.commandService.execute(commandName, commandOptions);
3207
+ if (!result?.success) {
3208
+ throw new Error(result?.message?.text || 'Failed to execute status transition command');
3209
+ }
3210
+ }
3211
+ /**
3212
+ * Validate if a transition is allowed
3213
+ * Checks if the transition exists in the provider's transitions list
3214
+ */
3215
+ isValidTransition(provider, from, to) {
3216
+ return provider.transitions.some((transition) => transition.from === from && transition.to === to);
3217
+ }
3218
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPStatusDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3219
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPStatusDefinitionProviderService, providedIn: 'root' }); }
3220
+ }
3221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPStatusDefinitionProviderService, decorators: [{
3222
+ type: Injectable,
3223
+ args: [{ providedIn: 'root' }]
3224
+ }], ctorParameters: () => [] });
3225
+
3226
+ /**
3227
+ * Standard system status types
3228
+ * These are the predefined status values used across the platform
3229
+ */
3230
+ var AXPSystemStatusType;
3231
+ (function (AXPSystemStatusType) {
3232
+ AXPSystemStatusType["Todo"] = "todo";
3233
+ AXPSystemStatusType["InProgress"] = "in-progress";
3234
+ AXPSystemStatusType["InReview"] = "in-review";
3235
+ AXPSystemStatusType["Open"] = "open";
3236
+ AXPSystemStatusType["Closed"] = "closed";
3237
+ AXPSystemStatusType["Blocked"] = "blocked";
3238
+ AXPSystemStatusType["Done"] = "done";
3239
+ AXPSystemStatusType["Cancelled"] = "cancelled";
3240
+ AXPSystemStatusType["Draft"] = "draft";
3241
+ AXPSystemStatusType["PendingReview"] = "pending-review";
3242
+ AXPSystemStatusType["Approved"] = "approved";
3243
+ AXPSystemStatusType["Published"] = "published";
3244
+ AXPSystemStatusType["Archived"] = "archived";
3245
+ AXPSystemStatusType["Rejected"] = "rejected";
3246
+ AXPSystemStatusType["Active"] = "active";
3247
+ AXPSystemStatusType["Inactive"] = "inactive";
3248
+ AXPSystemStatusType["Pending"] = "pending";
3249
+ AXPSystemStatusType["Completed"] = "completed";
3250
+ AXPSystemStatusType["Suspended"] = "suspended";
3251
+ AXPSystemStatusType["Failed"] = "failed";
3252
+ AXPSystemStatusType["Review"] = "review";
3253
+ AXPSystemStatusType["Expired"] = "expired";
3254
+ })(AXPSystemStatusType || (AXPSystemStatusType = {}));
3255
+ const i18n = (key) => `@general:statuses.${key}`;
3256
+ /**
3257
+ * Standard system status definitions
3258
+ * Provides consistent status definitions across the platform
3259
+ * Uses AXPStatusDefinition interface from status-definition.types.ts
3260
+ */
3261
+ const AXPSystemStatuses = Object.freeze({
3262
+ Open: {
3263
+ name: AXPSystemStatusType.Open,
3264
+ title: i18n('open.title'),
3265
+ icon: 'fa-light fa-circle',
3266
+ color: 'secondary',
3267
+ description: i18n('open.description'),
3268
+ order: 1,
3269
+ isInitial: true,
3270
+ isFinal: false,
3271
+ },
3272
+ Closed: {
3273
+ name: AXPSystemStatusType.Closed,
3274
+ title: i18n('closed.title'),
3275
+ icon: 'fa-light fa-circle',
3276
+ color: 'danger',
3277
+ description: i18n('closed.description'),
3278
+ order: 2,
3279
+ isInitial: false,
3280
+ isFinal: true,
3281
+ },
3282
+ Todo: {
3283
+ name: AXPSystemStatusType.Todo,
3284
+ title: i18n('todo.title'),
3285
+ icon: 'fa-light fa-circle',
3286
+ color: 'secondary',
3287
+ description: i18n('todo.description'),
3288
+ order: 1,
3289
+ isInitial: true,
3290
+ isFinal: false,
3291
+ },
3292
+ InProgress: {
3293
+ name: AXPSystemStatusType.InProgress,
3294
+ title: i18n('in-progress.title'),
3295
+ icon: 'fa-light fa-play',
3296
+ color: 'info',
3297
+ description: i18n('in-progress.description'),
3298
+ order: 2,
3299
+ isInitial: false,
3300
+ isFinal: false,
3301
+ },
3302
+ InReview: {
3303
+ name: AXPSystemStatusType.InReview,
3304
+ title: i18n('in-review.title'),
3305
+ icon: 'fa-light fa-eye',
3306
+ color: 'info',
3307
+ description: i18n('in-review.description'),
3308
+ order: 3,
3309
+ isInitial: false,
3310
+ isFinal: false,
3311
+ },
3312
+ Blocked: {
3313
+ name: AXPSystemStatusType.Blocked,
3314
+ title: i18n('blocked.title'),
3315
+ icon: 'fa-light fa-ban',
3316
+ color: 'danger',
3317
+ description: i18n('blocked.description'),
3318
+ order: 4,
3319
+ isInitial: false,
3320
+ isFinal: false,
3321
+ },
3322
+ Done: {
3323
+ name: AXPSystemStatusType.Done,
3324
+ title: i18n('done.title'),
3325
+ icon: 'fa-light fa-check-circle',
3326
+ color: 'success',
3327
+ description: i18n('done.description'),
3328
+ order: 5,
3329
+ isInitial: false,
3330
+ isFinal: true,
3331
+ },
3332
+ Cancelled: {
3333
+ name: AXPSystemStatusType.Cancelled,
3334
+ title: i18n('cancelled.title'),
3335
+ icon: 'fa-light fa-times-circle',
3336
+ color: 'neutral',
3337
+ description: i18n('cancelled.description'),
3338
+ order: 6,
3339
+ isInitial: false,
3340
+ isFinal: true,
3341
+ },
3342
+ Draft: {
3343
+ name: AXPSystemStatusType.Draft,
3344
+ title: i18n('draft.title'),
3345
+ icon: 'fa-light fa-file-pen',
3346
+ color: 'neutral',
3347
+ description: i18n('draft.description'),
3348
+ order: 1,
3349
+ isInitial: true,
3350
+ isFinal: false,
3351
+ },
3352
+ PendingReview: {
3353
+ name: AXPSystemStatusType.PendingReview,
3354
+ title: i18n('pending-review.title'),
3355
+ icon: 'fa-light fa-clock',
3356
+ color: 'warning',
3357
+ description: i18n('pending-review.description'),
3358
+ order: 2,
3359
+ isInitial: false,
3360
+ isFinal: false,
3361
+ },
3362
+ Approved: {
3363
+ name: AXPSystemStatusType.Approved,
3364
+ title: i18n('approved.title'),
3365
+ icon: 'fa-light fa-check-circle',
3366
+ color: 'success',
3367
+ description: i18n('approved.description'),
3368
+ order: 3,
3369
+ isInitial: false,
3370
+ isFinal: false,
3371
+ },
3372
+ Published: {
3373
+ name: AXPSystemStatusType.Published,
3374
+ title: i18n('published.title'),
3375
+ icon: 'fa-light fa-globe',
3376
+ color: 'primary',
3377
+ description: i18n('published.description'),
3378
+ order: 4,
3379
+ isInitial: false,
3380
+ isFinal: false,
3381
+ },
3382
+ Archived: {
3383
+ name: AXPSystemStatusType.Archived,
3384
+ title: i18n('archived.title'),
3385
+ icon: 'fa-light fa-archive',
3386
+ color: 'danger',
3387
+ description: i18n('archived.description'),
3388
+ order: 5,
3389
+ isInitial: false,
3390
+ isFinal: true,
3391
+ },
3392
+ Rejected: {
3393
+ name: AXPSystemStatusType.Rejected,
3394
+ title: i18n('rejected.title'),
3395
+ icon: 'fa-light fa-times-circle',
3396
+ color: 'danger',
3397
+ description: i18n('rejected.description'),
3398
+ order: 6,
3399
+ isInitial: false,
3400
+ isFinal: true,
3401
+ },
3402
+ Active: {
3403
+ name: AXPSystemStatusType.Active,
3404
+ title: i18n('active.title'),
3405
+ icon: 'fa-light fa-check-circle',
3406
+ color: 'success',
3407
+ description: i18n('active.description'),
3408
+ order: 1,
3409
+ isInitial: false,
3410
+ isFinal: false,
3411
+ },
3412
+ Inactive: {
3413
+ name: AXPSystemStatusType.Inactive,
3414
+ title: i18n('inactive.title'),
3415
+ icon: 'fa-light fa-circle',
3416
+ color: 'secondary',
3417
+ description: i18n('inactive.description'),
3418
+ order: 2,
3419
+ isInitial: false,
3420
+ isFinal: false,
3421
+ },
3422
+ Pending: {
3423
+ name: AXPSystemStatusType.Pending,
3424
+ title: i18n('pending.title'),
3425
+ icon: 'fa-light fa-clock',
3426
+ color: 'warning',
3427
+ description: i18n('pending.description'),
3428
+ order: 1,
3429
+ isInitial: true,
3430
+ isFinal: false,
3431
+ },
3432
+ Completed: {
3433
+ name: AXPSystemStatusType.Completed,
3434
+ title: i18n('completed.title'),
3435
+ icon: 'fa-light fa-check-circle',
3436
+ color: 'success',
3437
+ description: i18n('completed.description'),
3438
+ order: 10,
3439
+ isInitial: false,
3440
+ isFinal: true,
3441
+ },
3442
+ Suspended: {
3443
+ name: AXPSystemStatusType.Suspended,
3444
+ title: i18n('suspended.title'),
3445
+ icon: 'fa-light fa-pause-circle',
3446
+ color: 'neutral',
3447
+ description: i18n('suspended.description'),
3448
+ order: 5,
3449
+ isInitial: false,
3450
+ isFinal: false,
3451
+ },
3452
+ Failed: {
3453
+ name: AXPSystemStatusType.Failed,
3454
+ title: i18n('failed.title'),
3455
+ icon: 'fa-light fa-xmark-circle',
3456
+ color: 'danger',
3457
+ description: i18n('failed.description'),
3458
+ order: 10,
3459
+ isInitial: false,
3460
+ isFinal: true,
3461
+ },
3462
+ Review: {
3463
+ name: AXPSystemStatusType.Review,
3464
+ title: i18n('review.title'),
3465
+ icon: 'fa-light fa-eye',
3466
+ color: 'info',
3467
+ description: i18n('review.description'),
3468
+ order: 3,
3469
+ },
3470
+ Expired: {
3471
+ name: AXPSystemStatusType.Expired,
3472
+ title: i18n('expired.title'),
3473
+ icon: 'fa-light fa-clock',
3474
+ color: 'danger',
3475
+ description: i18n('expired.description'),
3476
+ order: 10,
3477
+ isInitial: false,
3478
+ isFinal: true,
3479
+ },
3480
+ });
3481
+ /**
3482
+ * Get system status definition by type
3483
+ * @param type - Status type
3484
+ * @returns System status definition or undefined
3485
+ */
3486
+ function getSystemStatus(type) {
3487
+ return Object.values(AXPSystemStatuses).find(status => status.name === type);
3488
+ }
3489
+ /**
3490
+ * Resolves the visual appearance (color and icon) for status
3491
+ * using the system statuses from the core module.
3492
+ * @param statusType - Status type string
3493
+ * @returns Color and icon for the status
3494
+ */
3495
+ function resolveStatusLook(statusType) {
3496
+ // Try to get system status first
3497
+ const systemStatusType = statusType;
3498
+ if (systemStatusType) {
3499
+ const systemStatus = getSystemStatus(systemStatusType);
3500
+ if (systemStatus) {
3501
+ // Convert hex color to semantic color type if needed
3502
+ // For now, return as-is and let the UI handle it
3503
+ return {
3504
+ color: systemStatus.color,
3505
+ icon: systemStatus.icon || ''
3506
+ };
3507
+ }
3508
+ }
3509
+ // Fallback for unknown statuses
3510
+ return {
3511
+ color: 'secondary',
3512
+ icon: ''
3513
+ };
3514
+ }
3515
+ /**
3516
+ * Resolves the complete status information (title, description, icon, color) for a status
3517
+ * using the system statuses from the core module.
3518
+ * @param statusType - Status type string
3519
+ * @returns Complete status information as AXPStatusDefinition
3520
+ */
3521
+ function getStatusInfo(statusType) {
3522
+ const systemStatusType = statusType;
3523
+ if (systemStatusType) {
3524
+ const systemStatus = getSystemStatus(systemStatusType);
3525
+ if (systemStatus) {
3526
+ return systemStatus;
3527
+ }
3528
+ }
3529
+ // Fallback for unknown statuses
3530
+ return {
3531
+ name: statusType,
3532
+ title: statusType,
3533
+ description: `Status: ${statusType}`,
3534
+ icon: '',
3535
+ color: 'secondary'
3536
+ };
3537
+ }
3538
+ /**
3539
+ * Get system status definition directly (no conversion needed since it's already AXPStatusDefinition)
3540
+ * @param statusType - Status type
3541
+ * @param overrides - Optional overrides for the status definition
3542
+ * @returns AXPStatusDefinition
3543
+ */
3544
+ function systemStatusToDefinition(statusType, overrides) {
3545
+ const systemStatus = getSystemStatus(statusType);
3546
+ if (!systemStatus) {
3547
+ throw new Error(`System status ${statusType} not found`);
3548
+ }
3549
+ return {
3550
+ ...systemStatus,
3551
+ ...overrides,
3552
+ };
3553
+ }
3554
+
2785
3555
  class AXPClipBoardService {
2786
3556
  constructor() {
2787
3557
  this.toast = inject(AXToastService);
@@ -2805,6 +3575,123 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2805
3575
  }]
2806
3576
  }] });
2807
3577
 
3578
+ //#region ---- Imports ----
3579
+ //#endregion
3580
+ //#region ---- Debug Service ----
3581
+ /**
3582
+ * Service for debugging user access information.
3583
+ * Displays loaded modules, features, and permissions for the current user.
3584
+ */
3585
+ class AXPDebugService {
3586
+ constructor() {
3587
+ //#region ---- Services & Dependencies ----
3588
+ this.sessionService = inject(AXPSessionService);
3589
+ this.manifestRegistry = inject(AXPModuleManifestRegistry);
3590
+ }
3591
+ //#endregion
3592
+ //#region ---- Public Methods ----
3593
+ /**
3594
+ * Display all loaded modules, features, and permissions for the current user.
3595
+ */
3596
+ async displayUserAccessInfo() {
3597
+ try {
3598
+ // Ensure registry is initialized
3599
+ await this.manifestRegistry.initialize();
3600
+ // Get all registered modules
3601
+ const allManifests = this.manifestRegistry.getAll();
3602
+ // Get all feature definitions
3603
+ const allFeatures = this.manifestRegistry.getAllFeatureDefinitions();
3604
+ // Get current user permissions
3605
+ const userPermissions = this.sessionService.permissions;
3606
+ const user = this.sessionService.user;
3607
+ console.group('🔐 User Access Information');
3608
+ console.log(`User: ${user?.name || user?.title || 'Unknown'} (${user?.id || 'N/A'})`);
3609
+ console.log('');
3610
+ if (allManifests.length === 0) {
3611
+ console.log('No modules loaded');
3612
+ console.groupEnd();
3613
+ return;
3614
+ }
3615
+ // Group features by module
3616
+ const featuresByModule = new Map();
3617
+ allFeatures.forEach((feature) => {
3618
+ const moduleName = feature.module;
3619
+ if (!featuresByModule.has(moduleName)) {
3620
+ featuresByModule.set(moduleName, []);
3621
+ }
3622
+ featuresByModule.get(moduleName).push(feature);
3623
+ });
3624
+ // Group permissions by module (if they follow ModuleName:PermissionKey pattern)
3625
+ const permissionsByModule = new Map();
3626
+ const ungroupedPermissions = [];
3627
+ userPermissions.forEach((permission) => {
3628
+ const parts = permission.split(':');
3629
+ if (parts.length >= 2) {
3630
+ const moduleName = parts[0];
3631
+ if (!permissionsByModule.has(moduleName)) {
3632
+ permissionsByModule.set(moduleName, []);
3633
+ }
3634
+ permissionsByModule.get(moduleName).push(permission);
3635
+ }
3636
+ else {
3637
+ ungroupedPermissions.push(permission);
3638
+ }
3639
+ });
3640
+ // Display modules in tree format
3641
+ allManifests.forEach((manifest) => {
3642
+ const moduleName = manifest.name;
3643
+ const moduleFeatures = featuresByModule.get(moduleName) || [];
3644
+ const modulePermissions = permissionsByModule.get(moduleName) || [];
3645
+ console.group(`📦 ${moduleName}`);
3646
+ // Display Features
3647
+ if (moduleFeatures.length > 0) {
3648
+ console.log(' --- Features:');
3649
+ moduleFeatures.forEach((feature) => {
3650
+ console.log(` • ${feature.name}`);
3651
+ });
3652
+ }
3653
+ else {
3654
+ console.log(' --- Features: (none)');
3655
+ }
3656
+ // Display Permissions
3657
+ if (modulePermissions.length > 0) {
3658
+ console.log(' --- Permissions:');
3659
+ modulePermissions.forEach((permission) => {
3660
+ console.log(` • ${permission}`);
3661
+ });
3662
+ }
3663
+ else {
3664
+ console.log(' --- Permissions: (none)');
3665
+ }
3666
+ console.groupEnd();
3667
+ });
3668
+ // Display ungrouped permissions if any
3669
+ if (ungroupedPermissions.length > 0) {
3670
+ console.group('📁 Other Permissions');
3671
+ ungroupedPermissions.forEach((permission) => {
3672
+ console.log(` • ${permission}`);
3673
+ });
3674
+ console.groupEnd();
3675
+ }
3676
+ // Summary
3677
+ console.log('');
3678
+ console.log(`Summary: ${allManifests.length} modules, ${allFeatures.length} features, ${userPermissions.length} permissions`);
3679
+ console.groupEnd();
3680
+ }
3681
+ catch (error) {
3682
+ console.error('[AXPDebugService] Failed to display user access info:', error);
3683
+ }
3684
+ }
3685
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDebugService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3686
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDebugService, providedIn: 'root' }); }
3687
+ }
3688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDebugService, decorators: [{
3689
+ type: Injectable,
3690
+ args: [{
3691
+ providedIn: 'root',
3692
+ }]
3693
+ }] });
3694
+
2808
3695
  class AXMOrgChartPrintPage extends AXBasePageComponent {
2809
3696
  constructor() {
2810
3697
  super(...arguments);
@@ -2903,7 +3790,7 @@ class AXMOrgChartPrintPage extends AXBasePageComponent {
2903
3790
  <ax-icon class="fa-solid fa-print"> </ax-icon>
2904
3791
  </ax-button>
2905
3792
  </ax-suffix>
2906
- </ax-footer>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i2$1.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3$1.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i4.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXColorBoxModule }, { kind: "component", type: i6.AXColorBoxComponent, selector: "ax-color-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "showBadge", "showValue", "showClearButton", "showIcon"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }] }); }
3793
+ </ax-footer>`, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXNumberBoxModule }, { kind: "component", type: i2.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "minValue", "maxValue", "showSpinButtons", "thousandsSeparator", "decimals", "changeOnScroll", "step"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "thousandsSeparatorChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i4.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXColorBoxModule }, { kind: "component", type: i6.AXColorBoxComponent, selector: "ax-color-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "showBadge", "showValue", "showClearButton", "showIcon"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }] }); }
2907
3794
  }
2908
3795
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXMOrgChartPrintPage, decorators: [{
2909
3796
  type: Component,
@@ -3069,5 +3956,5 @@ class AXPVersioningService {
3069
3956
  * Generated bundle index. Do not edit.
3070
3957
  */
3071
3958
 
3072
- export { ALL_DEFAULT_OPERATORS, AXMWorkflowErrorHandler, AXPAppVersionService, AXPCleanNestedFilters, AXPClipBoardService, AXPCommonModule, AXPCommonSettings, AXPCustomOperatorService, AXPCustomOperatorServiceImpl, AXPDataProvider, AXPDialogConfirmAction, AXPEntityCommandScope, AXPEntityQueryType, AXPErrorHandlerRegistryService, AXPExportService, AXPFileStorageService, AXPFileStorageStatus, AXPFileTypeProviderService, AXPFilterOperatorMiddlewareService, AXPFilterOperatorMiddlewareServiceImpl, AXPFooterTextSlotComponent, AXPGlobalErrorHandler, AXPGlobalVariableDefinitionService, AXPGlobalVariableEvaluatorScopeProvider, AXPHomePageModule, AXPHomePageService, AXPLockService, AXPLogoComponent, AXPMenuMiddlewareRegistry, AXPMenuProviderService, AXPMenuSearchDefinitionProvider, AXPMenuSearchProvider, AXPMenuService, AXPNavBarSlotComponent, AXPNavigateWorkflow, AXPPlatformDefaultConfigs, AXPRedirectEvent, AXPRefreshEvent, AXPRelationshipCardinality, AXPRelationshipKind, AXPReloadAction, AXPReloadEvent, AXPSearchCommandProvider, AXPSearchDefinitionActionBuilder, AXPSearchDefinitionBuilder, AXPSearchDefinitionProviderContext, AXPSearchDefinitionProviderService, AXPSearchService, AXPSettingDefaultValuesAggregatorService, AXPSettingDefinitionGroupBuilder, AXPSettingDefinitionProviderContext, AXPSettingDefinitionProviderService, AXPSettingDefinitionSectionBuilder, AXPSettingService, AXPStickyDirective, AXPToastAction, AXPVersioningService, AXPWorkflowNavigateAction, AXPWorkflowRouterNavigateAction, AXP_APP_VERSION_PROVIDER, AXP_FILE_TYPE_INFO_PROVIDER, AXP_GLOBAL_VARIABLE_DEFINITION_PROVIDER, AXP_HOME_PAGES, AXP_HOME_PAGE_DEFAULT_KEY, AXP_MENU_MIDDLEWARE, AXP_MENU_PROVIDER, AXP_PLATFORM_CONFIG_TOKEN, AXP_ROOT_CONFIG_TOKEN, AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SETTING_DEFAULT_VALUES_PROVIDERS, AXP_SETTING_DEFINITION_PROVIDER, AXP_SETTING_VALUE_PROVIDER, AXVChangeType, BETWEEN_OPER, BOOLEAN_OPERATORS, CONTAINS_OPER, DATE_OPERATORS, ENDS_WITH_OPER, ENVIRONMENT, EQ_OPER, GTE_OPER, GT_OPER, IN_OPER, IS_EMPTY_OPER, IS_NOT_EMPTY_OPER, LTE_OPER, LT_OPER, NOT_CONTAINS_OPER, NOT_EQ_OPER, NUMBER_OPERATORS, STARTS_WITH_OPER, STRING_OPERATORS, configPlatform, createAllQueryView, createMenuContext, createMenuMiddleware, createQueryView, getEntityInfo, provideDynamicHomePage, provideMenuMiddleware };
3959
+ export { ALL_DEFAULT_OPERATORS, AXMWorkflowErrorHandler, AXPAppVersionService, AXPCleanNestedFilters, AXPClipBoardService, AXPCommonModule, AXPCommonSettings, AXPCustomOperatorService, AXPCustomOperatorServiceImpl, AXPDataProvider, AXPDebugService, AXPDialogConfirmAction, AXPEntityCommandScope, AXPEntityQueryType, AXPErrorHandlerRegistryService, AXPExportService, AXPFileStorageService, AXPFileStorageStatus, AXPFileTypeProviderService, AXPFilterOperatorMiddlewareService, AXPFilterOperatorMiddlewareServiceImpl, AXPFooterTextSlotComponent, AXPGlobalErrorHandler, AXPHomePageModule, AXPHomePageService, AXPLockService, AXPMenuMiddlewareRegistry, AXPMenuProviderService, AXPMenuSearchDefinitionProvider, AXPMenuSearchProvider, AXPMenuService, AXPMenuVisibilityService, AXPNavBarSlotComponent, AXPNavigateWorkflow, AXPPlatformDefaultConfigs, AXPRedirectEvent, AXPRefreshEvent, AXPRegionalSetting, AXPRelationshipCardinality, AXPRelationshipKind, AXPReloadAction, AXPReloadEvent, AXPSearchCommandProvider, AXPSearchDefinitionActionBuilder, AXPSearchDefinitionBuilder, AXPSearchDefinitionProviderContext, AXPSearchDefinitionProviderService, AXPSearchService, AXPSettingDefaultValuesAggregatorService, AXPSettingDefinitionGroupBuilder, AXPSettingDefinitionProviderContext, AXPSettingDefinitionProviderService, AXPSettingDefinitionSectionBuilder, AXPSettingsService, AXPStatusDefinitionProviderService, AXPStatusProvider, AXPStickyDirective, AXPSystemStatusType, AXPSystemStatuses, AXPToastAction, AXPTokenDefinitionService, AXPTokenEvaluatorScopeProvider, AXPVersioningService, AXPWorkflowNavigateAction, AXPWorkflowRouterNavigateAction, AXP_APP_VERSION_PROVIDER, AXP_FILE_TYPE_INFO_PROVIDER, AXP_HOME_PAGES, AXP_HOME_PAGE_DEFAULT_KEY, AXP_MENU_MIDDLEWARE, AXP_MENU_PROVIDER, AXP_PLATFORM_CONFIG_TOKEN, AXP_ROOT_CONFIG_TOKEN, AXP_SEARCH_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER, AXP_SETTING_DEFAULT_VALUES_PROVIDERS, AXP_SETTING_DEFINITION_PROVIDER, AXP_SETTING_VALUE_PROVIDER, AXP_STATUS_PROVIDERS, AXP_TOKEN_DEFINITION_PROVIDER, AXVChangeType, BETWEEN_OPER, BOOLEAN_OPERATORS, CONTAINS_OPER, DATE_OPERATORS, ENDS_WITH_OPER, ENVIRONMENT, EQ_OPER, GTE_OPER, GT_OPER, IN_OPER, IS_EMPTY_OPER, IS_NOT_EMPTY_OPER, LTE_OPER, LT_OPER, NOT_CONTAINS_OPER, NOT_EQ_OPER, NUMBER_OPERATORS, STARTS_WITH_OPER, STRING_OPERATORS, configPlatform, createAllQueryView, createMenuContext, createMenuMiddleware, createQueryView, getEntityInfo, getStatusInfo, getSystemStatus, provideDynamicHomePage, provideMenuMiddleware, resolveStatusLook, systemStatusToDefinition };
3073
3960
  //# sourceMappingURL=acorex-platform-common.mjs.map