@acorex/platform 20.7.13 → 20.7.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/common/index.d.ts +10 -1
  2. package/core/index.d.ts +93 -4
  3. package/fesm2022/{acorex-platform-common-common-settings.provider-BwBLG0Hl.mjs → acorex-platform-common-common-settings.provider-gyb6ohAE.mjs} +15 -1
  4. package/fesm2022/acorex-platform-common-common-settings.provider-gyb6ohAE.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-common.mjs +3 -2
  6. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-core.mjs +428 -157
  8. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-layout-builder.mjs +90 -74
  11. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-layout-components.mjs +954 -1223
  13. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-entity.mjs +600 -192
  15. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-views.mjs +7 -7
  17. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  18. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-BfV3spe3.mjs → acorex-platform-layout-widgets-file-list-popup.component-B0omAUil.mjs} +18 -3
  19. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-B0omAUil.mjs.map +1 -0
  20. package/fesm2022/{acorex-platform-layout-widgets-repeater-widget-column.component-DnhR00cH.mjs → acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs} +2 -2
  21. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs.map +1 -0
  22. package/fesm2022/acorex-platform-layout-widgets.mjs +153 -37
  23. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  24. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-CJcbkSBF.mjs → acorex-platform-themes-default-entity-master-create-view.component-CCiYPMhz.mjs} +29 -26
  25. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CCiYPMhz.mjs.map +1 -0
  26. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-HBr-ZTSt.mjs → acorex-platform-themes-default-entity-master-list-view.component-BQODc73e.mjs} +2 -2
  27. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-HBr-ZTSt.mjs.map → acorex-platform-themes-default-entity-master-list-view.component-BQODc73e.mjs.map} +1 -1
  28. package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-DAFQ4UI9.mjs → acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs} +3 -4
  29. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs.map +1 -0
  30. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-CwHHYmiK.mjs → acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs} +4 -4
  31. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs.map +1 -0
  32. package/fesm2022/acorex-platform-themes-default.mjs +11 -11
  33. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  34. package/fesm2022/acorex-platform-themes-shared.mjs +244 -246
  35. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  36. package/fesm2022/acorex-platform-workflow.mjs +0 -3
  37. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  38. package/layout/components/index.d.ts +159 -248
  39. package/layout/entity/index.d.ts +42 -1
  40. package/layout/widgets/index.d.ts +41 -3
  41. package/package.json +9 -9
  42. package/themes/shared/index.d.ts +1 -1
  43. package/workflow/index.d.ts +33 -30
  44. package/fesm2022/acorex-platform-common-common-settings.provider-BwBLG0Hl.mjs.map +0 -1
  45. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-BfV3spe3.mjs.map +0 -1
  46. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-DnhR00cH.mjs.map +0 -1
  47. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CJcbkSBF.mjs.map +0 -1
  48. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-DAFQ4UI9.mjs.map +0 -1
  49. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-CwHHYmiK.mjs.map +0 -1
@@ -1,7 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, Injectable, computed, ViewContainerRef, ElementRef, Directive, EventEmitter, HostListener, Output, input, effect, Injector, runInInjectionContext, provideAppInitializer, NgModule, signal, Pipe } from '@angular/core';
2
+ import { InjectionToken, inject, Injectable, Directive, computed, Injector, ChangeDetectionStrategy, Component, input, ElementRef, ViewContainerRef, signal, effect, runInInjectionContext, Optional, Inject, NgModule, EventEmitter, HostListener, Output, provideAppInitializer, Pipe } from '@angular/core';
3
+ import { get, isPlainObject, set, isNil, isEmpty, isArray, merge, isObjectLike, transform, isEqual, differenceWith, union, cloneDeep, sortBy, isUndefined, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
3
4
  import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
4
- import { get, isPlainObject, set, isNil, isEmpty, isArray, merge, isObjectLike, transform, isEqual, differenceWith, union, cloneDeep, isUndefined, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
5
+ import * as i1 from '@acorex/components/skeleton';
6
+ import { AXSkeletonModule } from '@acorex/components/skeleton';
5
7
  import { Subject, interval, fromEvent } from 'rxjs';
6
8
  import { AXCalendarService } from '@acorex/core/date-time';
7
9
  import { startWith, map, debounceTime } from 'rxjs/operators';
@@ -513,6 +515,14 @@ const defaultColumnWidthProvider = {
513
515
  };
514
516
  //#endregion
515
517
 
518
+ class AXPComponentSlot {
519
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
520
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.16", type: AXPComponentSlot, isStandalone: true, ngImport: i0 }); }
521
+ }
522
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlot, decorators: [{
523
+ type: Directive
524
+ }] });
525
+
516
526
  function extractNestedFieldsWildcard(obj, basePath, fields) {
517
527
  const result = {};
518
528
  if (fields.length === 1 && fields[0] === '*') {
@@ -645,8 +655,6 @@ function getSmart(obj, smartPath) {
645
655
  });
646
656
  }
647
657
  function extractValue(value, key = 'id') {
648
- console.log('value', value);
649
- console.log('key', key);
650
658
  if (isNil(value)) {
651
659
  return null;
652
660
  }
@@ -891,6 +899,421 @@ withMethods((store) => ({
891
899
  },
892
900
  })));
893
901
 
902
+ class AXPExpressionEvaluatorScopeProviderContext {
903
+ constructor() {
904
+ this.scopes = {};
905
+ }
906
+ addScope(namespace, functions) {
907
+ this.scopes[namespace] = { ...this.scopes[namespace], ...functions };
908
+ }
909
+ getScopes() {
910
+ return this.scopes;
911
+ }
912
+ }
913
+ const AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER = new InjectionToken('AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER');
914
+ class AXPExpressionEvaluatorScopeProviderService {
915
+ constructor() {
916
+ this.injector = inject(Injector);
917
+ this.cache = null;
918
+ }
919
+ async load() {
920
+ if (this.cache)
921
+ return;
922
+ const raw = this.injector.get(AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, [], { optional: true });
923
+ const providers = Array.isArray(raw)
924
+ ? raw
925
+ : typeof raw === 'function'
926
+ ? raw()
927
+ : [];
928
+ const context = new AXPExpressionEvaluatorScopeProviderContext();
929
+ for (const provider of providers) {
930
+ await provider.provide(context);
931
+ }
932
+ this.cache = context.getScopes();
933
+ }
934
+ async getScopesAsync() {
935
+ await this.load();
936
+ return this.cache || {};
937
+ }
938
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
939
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, providedIn: 'root' }); }
940
+ }
941
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, decorators: [{
942
+ type: Injectable,
943
+ args: [{ providedIn: 'root' }]
944
+ }] });
945
+
946
+ class AXPExpressionEvaluatorService {
947
+ constructor() {
948
+ // Memoization cache for compiled expressions
949
+ this.expressionCache = new Map();
950
+ this.providerService = inject(AXPExpressionEvaluatorScopeProviderService);
951
+ }
952
+ getOrCompileFunction(expression) {
953
+ if (!this.expressionCache.has(expression)) {
954
+ // Check if expression contains multiple statements (has semicolons or newlines)
955
+ const hasMultipleStatements = expression.includes(';') || expression.includes('\n');
956
+ let fn;
957
+ if (hasMultipleStatements) {
958
+ // For multiple statements, execute them in sequence and return the last expression
959
+ fn = new Function('scope', `with (scope) { return (async function() { ${expression} })(); }`);
960
+ }
961
+ else {
962
+ // For single expressions, use return
963
+ fn = new Function('scope', `with (scope) { return (async function() { return ${expression}; })(); }`);
964
+ }
965
+ this.expressionCache.set(expression, fn);
966
+ }
967
+ return this.expressionCache.get(expression);
968
+ }
969
+ async getMergedScope(userScope) {
970
+ const pluginScopes = await this.providerService.getScopesAsync();
971
+ // Merge pluginScopes and userScope (userScope takes precedence)
972
+ return { ...pluginScopes, ...userScope };
973
+ }
974
+ async evaluate(source, scope = {}) {
975
+ try {
976
+ const mergedScope = await this.getMergedScope(scope);
977
+ if (typeof source === 'string' && source.includes('{{')) {
978
+ return await this.evaluateStringExpression(source, mergedScope);
979
+ }
980
+ else if (Array.isArray(source)) {
981
+ const evaluatedArray = [];
982
+ for (const item of source) {
983
+ evaluatedArray.push(await this.evaluate(item, mergedScope));
984
+ }
985
+ return evaluatedArray;
986
+ }
987
+ else if (typeof source === 'object' && source !== null) {
988
+ const evaluatedObject = {};
989
+ for (const key in source) {
990
+ if (source.hasOwnProperty(key)) {
991
+ evaluatedObject[key] = await this.evaluate(source[key], mergedScope);
992
+ }
993
+ }
994
+ return evaluatedObject;
995
+ }
996
+ else {
997
+ return source;
998
+ }
999
+ }
1000
+ catch (error) {
1001
+ console.error('Expression evaluator - Error evaluating expression:', source, error);
1002
+ return false;
1003
+ }
1004
+ }
1005
+ async evaluateStringExpression(templateExpression, scope) {
1006
+ // Check if the input is exactly a single {{ ... }} expression (handle multiline)
1007
+ const exactMatch = templateExpression.match(/^\s*\{\{\s*([\s\S]*?)\s*\}\}\s*$/);
1008
+ if (exactMatch) {
1009
+ const expression = exactMatch[1];
1010
+ const sandbox = this.getOrCompileFunction(expression);
1011
+ const result = await sandbox(scope);
1012
+ return result;
1013
+ }
1014
+ // Otherwise, interpolate all {{ ... }} expressions in the string
1015
+ const regex = /\{\{\s*([\s\S]*?)\s*\}\}/g;
1016
+ // Collect all matches and their positions
1017
+ const matches = [];
1018
+ let match;
1019
+ while ((match = regex.exec(templateExpression)) !== null) {
1020
+ matches.push({
1021
+ expression: match[1],
1022
+ start: match.index,
1023
+ end: regex.lastIndex,
1024
+ raw: match[0],
1025
+ });
1026
+ }
1027
+ // Evaluate all expressions in parallel
1028
+ const values = await Promise.all(matches.map((m) => {
1029
+ const sandbox = this.getOrCompileFunction(m.expression);
1030
+ return sandbox(scope);
1031
+ }));
1032
+ // Reconstruct the string with evaluated values
1033
+ let result = '';
1034
+ let lastIndex = 0;
1035
+ matches.forEach((m, i) => {
1036
+ result += templateExpression.slice(lastIndex, m.start);
1037
+ const value = values[i];
1038
+ result += value !== undefined && value !== null ? value : '';
1039
+ lastIndex = m.end;
1040
+ });
1041
+ result += templateExpression.slice(lastIndex);
1042
+ return result;
1043
+ }
1044
+ isExpression(expression) {
1045
+ if (typeof expression === 'string') {
1046
+ return expression.trim().startsWith('{{') && expression.trim().endsWith('}}');
1047
+ }
1048
+ return false;
1049
+ }
1050
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1051
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorService, providedIn: 'root' }); }
1052
+ }
1053
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorService, decorators: [{
1054
+ type: Injectable,
1055
+ args: [{ providedIn: 'root' }]
1056
+ }] });
1057
+
1058
+ class AXPComponentSlotPlaceholderComponent {
1059
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1060
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AXPComponentSlotPlaceholderComponent, isStandalone: true, selector: "axp-component-slot-placeholder", ngImport: i0, template: `<div>
1061
+ <ax-skeleton class="ax-w-full ax-h-10 ax-rounded-md"></ax-skeleton>
1062
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1063
+ }
1064
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotPlaceholderComponent, decorators: [{
1065
+ type: Component,
1066
+ args: [{
1067
+ selector: 'axp-component-slot-placeholder',
1068
+ template: `<div>
1069
+ <ax-skeleton class="ax-w-full ax-h-10 ax-rounded-md"></ax-skeleton>
1070
+ </div>`,
1071
+ changeDetection: ChangeDetectionStrategy.OnPush,
1072
+ imports: [AXSkeletonModule],
1073
+ standalone: true,
1074
+ }]
1075
+ }] });
1076
+
1077
+ class AXPComponentSlotRegistryService {
1078
+ constructor() {
1079
+ this.registry = new Map();
1080
+ }
1081
+ register(slotName, config) {
1082
+ let configs = this.registry.get(slotName) || [];
1083
+ // Check if the component is already registered in this slot
1084
+ const isDuplicate = configs.some(existingConfig => existingConfig.name === config.name);
1085
+ if (!isDuplicate) {
1086
+ configs = [...configs, config]; // Add the new configuration
1087
+ this.registry.set(slotName, configs);
1088
+ }
1089
+ }
1090
+ get(slotName) {
1091
+ return this.registry.get(slotName) || [];
1092
+ }
1093
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1094
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotRegistryService, providedIn: 'root' }); }
1095
+ }
1096
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotRegistryService, decorators: [{
1097
+ type: Injectable,
1098
+ args: [{
1099
+ providedIn: 'root'
1100
+ }]
1101
+ }] });
1102
+
1103
+ class AXPComponentSlotDirective {
1104
+ constructor() {
1105
+ this.name = input.required(...(ngDevMode ? [{ debugName: "name" }] : []));
1106
+ this.host = input(...(ngDevMode ? [undefined, { debugName: "host" }] : []));
1107
+ this.context = input(...(ngDevMode ? [undefined, { debugName: "context" }] : []));
1108
+ this.elementRef = inject(ElementRef);
1109
+ this.registryService = inject(AXPComponentSlotRegistryService);
1110
+ this.injector = inject(Injector);
1111
+ this.evaluator = inject(AXPExpressionEvaluatorService);
1112
+ this.viewContainerRef = inject(ViewContainerRef);
1113
+ this.contextStore = inject(AXPContextStore);
1114
+ this.isEmpty = computed(() => this._viewCount() === 0, ...(ngDevMode ? [{ debugName: "isEmpty" }] : []));
1115
+ // Create a signal to store the count of children
1116
+ this._viewCount = signal(0, ...(ngDevMode ? [{ debugName: "_viewCount" }] : []));
1117
+ // Track component references for updates
1118
+ this.componentRefs = [];
1119
+ // Track placeholder references for replacement
1120
+ this.placeholderRefs = new Map();
1121
+ // Watch for context changes and update component instances
1122
+ effect(() => {
1123
+ const currentContext = this.context();
1124
+ const currentHost = this.host();
1125
+ // Update all component references with new context and host
1126
+ this.componentRefs.forEach((componentRef) => {
1127
+ if (componentRef.instance) {
1128
+ Object.assign(componentRef.instance, {
1129
+ host: currentHost,
1130
+ context: currentContext,
1131
+ });
1132
+ }
1133
+ });
1134
+ });
1135
+ }
1136
+ async ngOnInit() {
1137
+ await this.loadComponents();
1138
+ // Update the signal after loading
1139
+ this._viewCount.set(this.viewContainerRef.length);
1140
+ }
1141
+ async loadComponents() {
1142
+ this.viewContainerRef.clear();
1143
+ // Clear previous component references
1144
+ this.componentRefs = [];
1145
+ this.placeholderRefs.clear();
1146
+ const configs = sortBy(this.registryService.get(this.name()), (c) => c.priority ?? 0);
1147
+ if (!configs) {
1148
+ console.error(`No component found for slot ${this.name()}`);
1149
+ return;
1150
+ }
1151
+ // Evaluate conditions and check features in parallel for performance
1152
+ const results = await Promise.all(configs.map(async (c) => {
1153
+ // Check condition if provided
1154
+ const conditionPassed = c.condition ? await this.evaluateCondition(c.condition) : true;
1155
+ // Check features if provided
1156
+ // const featuresPassed =
1157
+ // c.features && c.features.length > 0 ? this.sessionService.isFeatureEnabled(...c.features) : true;
1158
+ return {
1159
+ config: c,
1160
+ // visible: conditionPassed && featuresPassed,
1161
+ visible: conditionPassed,
1162
+ };
1163
+ }));
1164
+ // Filter visible components while preserving priority order
1165
+ const slots = results.filter((r) => r.visible).map((r) => r.config);
1166
+ // Create skeleton placeholders immediately in priority order
1167
+ slots.forEach((config, index) => {
1168
+ const placeholderRef = this.viewContainerRef.createComponent(AXPComponentSlotPlaceholderComponent);
1169
+ this.placeholderRefs.set(index, placeholderRef);
1170
+ });
1171
+ // Load all components in parallel and replace placeholders as they become ready
1172
+ const loadPromises = slots.map(async (config, index) => {
1173
+ let component;
1174
+ let options = {};
1175
+ // load component
1176
+ if (typeof config.loadComponent === 'function') {
1177
+ await runInInjectionContext(this.injector, async () => {
1178
+ component = await config.loadComponent?.();
1179
+ });
1180
+ }
1181
+ else if (config.component) {
1182
+ component = config.component;
1183
+ }
1184
+ // load options
1185
+ if (typeof config.options === 'function') {
1186
+ await runInInjectionContext(this.injector, async () => {
1187
+ const fun = config.options;
1188
+ options = await fun();
1189
+ });
1190
+ }
1191
+ else if (config.options) {
1192
+ options = await this.evaluator.evaluate(config.options, {});
1193
+ }
1194
+ // Replace placeholder with actual component as soon as it's ready
1195
+ if (!component) {
1196
+ console.warn(`Component failed to load for slot ${this.name()} at index ${index}`);
1197
+ // Remove placeholder if component failed to load
1198
+ const placeholderRef = this.placeholderRefs.get(index);
1199
+ if (placeholderRef) {
1200
+ placeholderRef.destroy();
1201
+ this.placeholderRefs.delete(index);
1202
+ }
1203
+ return;
1204
+ }
1205
+ // Get the placeholder reference at this index
1206
+ const placeholderRef = this.placeholderRefs.get(index);
1207
+ if (!placeholderRef) {
1208
+ console.warn(`Placeholder not found for index ${index}`);
1209
+ return;
1210
+ }
1211
+ // Get the index of the placeholder in the view container
1212
+ const placeholderIndex = this.viewContainerRef.indexOf(placeholderRef.hostView);
1213
+ // Remove the placeholder
1214
+ placeholderRef.destroy();
1215
+ this.placeholderRefs.delete(index);
1216
+ // Create the actual component at the same position
1217
+ const componentRef = this.viewContainerRef.createComponent(component, { index: placeholderIndex });
1218
+ // Store the component reference for future updates
1219
+ this.componentRefs.push(componentRef);
1220
+ Object.assign(componentRef.instance, {
1221
+ host: this.host(),
1222
+ context: this.context(),
1223
+ ...options,
1224
+ });
1225
+ });
1226
+ // Wait for all components to finish loading (they render as they become ready)
1227
+ await Promise.all(loadPromises);
1228
+ }
1229
+ async evaluateCondition(condition) {
1230
+ if (typeof condition === 'string') {
1231
+ const result = await this.evaluator.evaluate(condition, {});
1232
+ return result;
1233
+ }
1234
+ return condition(this.contextStore.data());
1235
+ //return condition(this.context());
1236
+ }
1237
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1238
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.16", type: AXPComponentSlotDirective, isStandalone: false, selector: "axp-component-slot", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, host: { classPropertyName: "host", publicName: "host", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["slot"], ngImport: i0 }); }
1239
+ }
1240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotDirective, decorators: [{
1241
+ type: Directive,
1242
+ args: [{
1243
+ selector: 'axp-component-slot',
1244
+ standalone: false,
1245
+ exportAs: 'slot',
1246
+ }]
1247
+ }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: true }] }], host: [{ type: i0.Input, args: [{ isSignal: true, alias: "host", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }] } });
1248
+
1249
+ class AXPComponentSlotModule {
1250
+ static forRoot(configs) {
1251
+ return {
1252
+ ngModule: AXPComponentSlotModule,
1253
+ providers: [
1254
+ {
1255
+ provide: 'AXPComponentSlotModuleFactory',
1256
+ useFactory: (registry) => () => {
1257
+ if (configs) {
1258
+ for (const [key, value] of Object.entries(configs)) {
1259
+ value.forEach(v => {
1260
+ registry.register(key, v);
1261
+ });
1262
+ }
1263
+ }
1264
+ },
1265
+ deps: [AXPComponentSlotRegistryService],
1266
+ multi: true
1267
+ }
1268
+ ]
1269
+ };
1270
+ }
1271
+ static forChild(configs) {
1272
+ return {
1273
+ ngModule: AXPComponentSlotModule,
1274
+ providers: [
1275
+ {
1276
+ provide: 'AXPComponentSlotModuleFactory',
1277
+ useFactory: (registry) => () => {
1278
+ if (configs) {
1279
+ for (const [key, value] of Object.entries(configs)) {
1280
+ value.forEach(v => {
1281
+ registry.register(key, v);
1282
+ });
1283
+ }
1284
+ }
1285
+ },
1286
+ deps: [AXPComponentSlotRegistryService],
1287
+ multi: true
1288
+ }
1289
+ ]
1290
+ };
1291
+ }
1292
+ /**
1293
+ * @ignore
1294
+ */
1295
+ constructor(instances) {
1296
+ instances?.forEach(f => {
1297
+ f();
1298
+ });
1299
+ }
1300
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotModule, deps: [{ token: 'AXPComponentSlotModuleFactory', optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
1301
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotModule, declarations: [AXPComponentSlotDirective], exports: [AXPComponentSlotDirective] }); }
1302
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotModule }); }
1303
+ }
1304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPComponentSlotModule, decorators: [{
1305
+ type: NgModule,
1306
+ args: [{
1307
+ declarations: [AXPComponentSlotDirective],
1308
+ exports: [AXPComponentSlotDirective]
1309
+ }]
1310
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
1311
+ type: Optional
1312
+ }, {
1313
+ type: Inject,
1314
+ args: ['AXPComponentSlotModuleFactory']
1315
+ }] }] });
1316
+
894
1317
  class AXPDataGenerator {
895
1318
  static uuid() {
896
1319
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {
@@ -1536,158 +1959,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1536
1959
  }]
1537
1960
  }], ctorParameters: () => [] });
1538
1961
 
1539
- class AXPExpressionEvaluatorScopeProviderContext {
1540
- constructor() {
1541
- this.scopes = {};
1542
- }
1543
- addScope(namespace, functions) {
1544
- this.scopes[namespace] = { ...this.scopes[namespace], ...functions };
1545
- }
1546
- getScopes() {
1547
- return this.scopes;
1548
- }
1549
- }
1550
- const AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER = new InjectionToken('AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER');
1551
- class AXPExpressionEvaluatorScopeProviderService {
1552
- constructor() {
1553
- this.providers = inject(AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, { optional: true });
1554
- this.cache = null;
1555
- }
1556
- async load() {
1557
- if (this.cache)
1558
- return;
1559
- const context = new AXPExpressionEvaluatorScopeProviderContext();
1560
- if (Array.isArray(this.providers)) {
1561
- for (const provider of this.providers) {
1562
- await provider.provide(context);
1563
- }
1564
- }
1565
- this.cache = context.getScopes();
1566
- }
1567
- async getScopesAsync() {
1568
- await this.load();
1569
- return this.cache || {};
1570
- }
1571
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1572
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, providedIn: 'root' }); }
1573
- }
1574
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, decorators: [{
1575
- type: Injectable,
1576
- args: [{ providedIn: 'root' }]
1577
- }] });
1578
-
1579
- class AXPExpressionEvaluatorService {
1580
- constructor() {
1581
- // Memoization cache for compiled expressions
1582
- this.expressionCache = new Map();
1583
- this.providerService = inject(AXPExpressionEvaluatorScopeProviderService);
1584
- }
1585
- getOrCompileFunction(expression) {
1586
- if (!this.expressionCache.has(expression)) {
1587
- // Check if expression contains multiple statements (has semicolons or newlines)
1588
- const hasMultipleStatements = expression.includes(';') || expression.includes('\n');
1589
- let fn;
1590
- if (hasMultipleStatements) {
1591
- // For multiple statements, execute them in sequence and return the last expression
1592
- fn = new Function('scope', `with (scope) { return (async function() { ${expression} })(); }`);
1593
- }
1594
- else {
1595
- // For single expressions, use return
1596
- fn = new Function('scope', `with (scope) { return (async function() { return ${expression}; })(); }`);
1597
- }
1598
- this.expressionCache.set(expression, fn);
1599
- }
1600
- return this.expressionCache.get(expression);
1601
- }
1602
- async getMergedScope(userScope) {
1603
- const pluginScopes = await this.providerService.getScopesAsync();
1604
- // Merge pluginScopes and userScope (userScope takes precedence)
1605
- return { ...pluginScopes, ...userScope };
1606
- }
1607
- async evaluate(source, scope = {}) {
1608
- try {
1609
- const mergedScope = await this.getMergedScope(scope);
1610
- if (typeof source === 'string' && source.includes('{{')) {
1611
- return await this.evaluateStringExpression(source, mergedScope);
1612
- }
1613
- else if (Array.isArray(source)) {
1614
- const evaluatedArray = [];
1615
- for (const item of source) {
1616
- evaluatedArray.push(await this.evaluate(item, mergedScope));
1617
- }
1618
- return evaluatedArray;
1619
- }
1620
- else if (typeof source === 'object' && source !== null) {
1621
- const evaluatedObject = {};
1622
- for (const key in source) {
1623
- if (source.hasOwnProperty(key)) {
1624
- evaluatedObject[key] = await this.evaluate(source[key], mergedScope);
1625
- }
1626
- }
1627
- return evaluatedObject;
1628
- }
1629
- else {
1630
- return source;
1631
- }
1632
- }
1633
- catch (error) {
1634
- console.error('Expression evaluator - Error evaluating expression:', source, error);
1635
- return false;
1636
- }
1637
- }
1638
- async evaluateStringExpression(templateExpression, scope) {
1639
- // Check if the input is exactly a single {{ ... }} expression (handle multiline)
1640
- const exactMatch = templateExpression.match(/^\s*\{\{\s*([\s\S]*?)\s*\}\}\s*$/);
1641
- if (exactMatch) {
1642
- const expression = exactMatch[1];
1643
- const sandbox = this.getOrCompileFunction(expression);
1644
- const result = await sandbox(scope);
1645
- return result;
1646
- }
1647
- // Otherwise, interpolate all {{ ... }} expressions in the string
1648
- const regex = /\{\{\s*([\s\S]*?)\s*\}\}/g;
1649
- // Collect all matches and their positions
1650
- const matches = [];
1651
- let match;
1652
- while ((match = regex.exec(templateExpression)) !== null) {
1653
- matches.push({
1654
- expression: match[1],
1655
- start: match.index,
1656
- end: regex.lastIndex,
1657
- raw: match[0],
1658
- });
1659
- }
1660
- // Evaluate all expressions in parallel
1661
- const values = await Promise.all(matches.map((m) => {
1662
- const sandbox = this.getOrCompileFunction(m.expression);
1663
- return sandbox(scope);
1664
- }));
1665
- // Reconstruct the string with evaluated values
1666
- let result = '';
1667
- let lastIndex = 0;
1668
- matches.forEach((m, i) => {
1669
- result += templateExpression.slice(lastIndex, m.start);
1670
- const value = values[i];
1671
- result += value !== undefined && value !== null ? value : '';
1672
- lastIndex = m.end;
1673
- });
1674
- result += templateExpression.slice(lastIndex);
1675
- return result;
1676
- }
1677
- isExpression(expression) {
1678
- if (typeof expression === 'string') {
1679
- return expression.trim().startsWith('{{') && expression.trim().endsWith('}}');
1680
- }
1681
- return false;
1682
- }
1683
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1684
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorService, providedIn: 'root' }); }
1685
- }
1686
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPExpressionEvaluatorService, decorators: [{
1687
- type: Injectable,
1688
- args: [{ providedIn: 'root' }]
1689
- }] });
1690
-
1691
1962
  class AXPHookService {
1692
1963
  constructor() {
1693
1964
  this.listenerProviders = inject(AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, { optional: true }) || [];
@@ -3860,5 +4131,5 @@ function generateKebabCase(title) {
3860
4131
  * Generated bundle index. Do not edit.
3861
4132
  */
3862
4133
 
3863
- export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPColorPaletteProvider, AXPColorPaletteService, AXPColumnWidthService, AXPComponentLogoConfig, AXPContentCheckerDirective, AXPContextChangeEvent, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDblClickDirective, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPExportTemplateToken, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPImageUrlLogoConfig, AXPModuleManifestModule, AXPModuleManifestRegistry, AXPPlatformScope, AXPScreenSize, AXPSystemActionType, AXPSystemActions, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_COLUMN_WIDTH_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, AXP_SESSION_SERVICE, AXP_TAG_PROVIDER, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, cleanDeep, createProviderWithInjectionContext, defaultColumnWidthProvider, extractNestedFieldsWildcard, extractTextFromHtml, extractValue, generateKebabCase, getActionButton, getChangedPaths, getDetailedChanges, getEnumValues, getNestedKeys, getSmart, getSystemActions, objectKeyValueTransforms, provideLazyProvider, resolveActionLook, resolvePlatformScopeKey, resolvePlatformScopeName, setSmart };
4134
+ export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPColorPaletteProvider, AXPColorPaletteService, AXPColumnWidthService, AXPComponentLogoConfig, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPContentCheckerDirective, AXPContextChangeEvent, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDblClickDirective, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPExportTemplateToken, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPImageUrlLogoConfig, AXPModuleManifestModule, AXPModuleManifestRegistry, AXPPlatformScope, AXPScreenSize, AXPSystemActionType, AXPSystemActions, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_COLUMN_WIDTH_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, AXP_SESSION_SERVICE, AXP_TAG_PROVIDER, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, cleanDeep, createProviderWithInjectionContext, defaultColumnWidthProvider, extractNestedFieldsWildcard, extractTextFromHtml, extractValue, generateKebabCase, getActionButton, getChangedPaths, getDetailedChanges, getEnumValues, getNestedKeys, getSmart, getSystemActions, objectKeyValueTransforms, provideLazyProvider, resolveActionLook, resolvePlatformScopeKey, resolvePlatformScopeName, setSmart };
3864
4135
  //# sourceMappingURL=acorex-platform-core.mjs.map