@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.
- package/auth/index.d.ts +97 -238
- package/common/index.d.ts +778 -213
- package/core/index.d.ts +562 -433
- package/fesm2022/acorex-platform-auth.mjs +160 -200
- package/fesm2022/acorex-platform-auth.mjs.map +1 -1
- package/fesm2022/acorex-platform-common.mjs +1012 -125
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-core.mjs +685 -400
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-domain.mjs +54 -11
- package/fesm2022/acorex-platform-domain.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +412 -270
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-components.mjs +2112 -3153
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +7 -7
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +756 -648
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-views.mjs +4 -4
- package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widget-core.mjs +248 -174
- package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
- 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
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-widgets.mjs +3058 -1038
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- 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
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +101 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default.mjs +166 -30
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-shared.mjs +27 -27
- package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
- package/layout/builder/index.d.ts +4 -1
- package/layout/components/index.d.ts +405 -327
- package/layout/designer/index.d.ts +3 -3
- package/layout/entity/index.d.ts +163 -108
- package/layout/widget-core/index.d.ts +39 -49
- package/layout/widgets/index.d.ts +368 -54
- package/package.json +5 -5
- package/themes/default/index.d.ts +15 -2
- package/themes/shared/index.d.ts +10 -10
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs +0 -50
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs +0 -42
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs +0 -55
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs +0 -50
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs +0 -48
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs +0 -42
- package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-m8rHZP8L.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-mARj77Mr.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-Cym8pq0v.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs +0 -101
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs.map +0 -1
- 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
|
|
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
|
|
13
|
+
import * as i1 from '@acorex/platform/workflow';
|
|
15
14
|
import { AXPWorkflowService, createWorkFlowEvent, AXPWorkflowAction, AXPWorkflowError, AXPWorkflowModule } from '@acorex/platform/workflow';
|
|
16
|
-
import
|
|
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
|
|
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
|
|
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$
|
|
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: '
|
|
137
|
-
const NOT_EQ_OPER = { name: 'notEqual', title: '
|
|
138
|
-
const GT_OPER = { name: 'greaterThan', title: '
|
|
139
|
-
const LT_OPER = { name: 'lessThan', title: '
|
|
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: '
|
|
136
|
+
title: '@general:terms.operators.greater-than-or-equal',
|
|
143
137
|
hasValue: true,
|
|
144
138
|
};
|
|
145
|
-
const LTE_OPER = { name: 'lessThanOrEqual', title: '
|
|
146
|
-
const CONTAINS_OPER = { name: 'contains', title: '
|
|
147
|
-
const NOT_CONTAINS_OPER = { name: 'notContains', title: '
|
|
148
|
-
const IN_OPER = { name: 'in', title: '
|
|
149
|
-
const STARTS_WITH_OPER = { name: 'startsWith', title: '
|
|
150
|
-
const ENDS_WITH_OPER = { name: 'endsWith', title: '
|
|
151
|
-
const IS_EMPTY_OPER = { name: 'isEmpty', title: '
|
|
152
|
-
const IS_NOT_EMPTY_OPER = { name: 'isNotEmpty', title: '
|
|
153
|
-
const BETWEEN_OPER = { name: 'between', title: '
|
|
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
|
|
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:
|
|
680
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type:
|
|
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:
|
|
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"] = "
|
|
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(
|
|
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
|
|
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
|
|
1120
|
+
class AXPTokenDefinitionService {
|
|
1091
1121
|
constructor() {
|
|
1092
1122
|
//#region ---- Providers & Caches ----
|
|
1093
|
-
this.definitionProviders = inject(
|
|
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
|
|
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
|
|
1103
|
-
* @returns The
|
|
1132
|
+
* @param name The token name.
|
|
1133
|
+
* @returns The token definition if found, undefined otherwise.
|
|
1104
1134
|
*/
|
|
1105
|
-
async
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1120
|
-
|
|
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:
|
|
1133
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type:
|
|
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:
|
|
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
|
|
1190
|
+
class AXPTokenEvaluatorScopeProvider {
|
|
1143
1191
|
constructor() {
|
|
1144
|
-
this.
|
|
1192
|
+
this.tokenService = inject(AXPTokenDefinitionService);
|
|
1145
1193
|
}
|
|
1146
1194
|
async provide(context) {
|
|
1147
|
-
context.addScope('
|
|
1148
|
-
|
|
1149
|
-
return await this.
|
|
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
|
-
|
|
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
|
|
1765
|
-
foundItem.children
|
|
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
|
-
|
|
1769
|
-
const
|
|
1770
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2316
|
-
|
|
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 =
|
|
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"] = "
|
|
2386
|
-
AXPCommonSettings["EntityFilterApplyMode"] = "
|
|
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.
|
|
2712
|
+
this.settingsService = inject(AXPSettingsService);
|
|
2442
2713
|
}
|
|
2443
2714
|
async execute(context) {
|
|
2444
|
-
const showResult = await this.
|
|
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
|
|
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' }
|
|
2594
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.12", ngImport: i0, type: AXPCommonModule, imports: [
|
|
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
|
|
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:
|
|
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,
|
|
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:
|
|
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
|
-
}] }
|
|
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$
|
|
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,
|
|
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
|