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