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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/auth/index.d.ts +238 -92
  2. package/common/index.d.ts +42 -606
  3. package/core/index.d.ts +432 -574
  4. package/fesm2022/acorex-platform-auth.mjs +200 -153
  5. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  6. package/fesm2022/acorex-platform-common.mjs +112 -1009
  7. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  8. package/fesm2022/acorex-platform-core.mjs +416 -694
  9. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-domain.mjs +11 -54
  11. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-layout-builder.mjs +272 -414
  13. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-components.mjs +3105 -2064
  15. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-designer.mjs +7 -7
  17. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  18. package/fesm2022/acorex-platform-layout-entity.mjs +648 -756
  19. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-layout-views.mjs +4 -4
  21. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  22. package/fesm2022/acorex-platform-layout-widget-core.mjs +174 -248
  23. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  24. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs +50 -0
  25. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs.map +1 -0
  26. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs +42 -0
  27. package/fesm2022/acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs.map +1 -0
  28. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs +55 -0
  29. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs.map +1 -0
  30. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs +50 -0
  31. package/fesm2022/acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs.map +1 -0
  32. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs +48 -0
  33. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs.map +1 -0
  34. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs +42 -0
  35. package/fesm2022/acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs.map +1 -0
  36. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs → acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs} +2 -2
  37. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs.map +1 -0
  38. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-m8rHZP8L.mjs} +2 -2
  39. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-m8rHZP8L.mjs.map +1 -0
  40. package/fesm2022/acorex-platform-layout-widgets.mjs +974 -2994
  41. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  42. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs → acorex-platform-themes-default-entity-master-create-view.component-mARj77Mr.mjs} +5 -26
  43. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-mARj77Mr.mjs.map +1 -0
  44. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs → acorex-platform-themes-default-entity-master-list-view.component-Cym8pq0v.mjs} +5 -4
  45. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-Cym8pq0v.mjs.map +1 -0
  46. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs +101 -0
  47. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs.map +1 -0
  48. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs → acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs} +3 -3
  49. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs.map +1 -0
  50. package/fesm2022/acorex-platform-themes-default.mjs +30 -166
  51. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  52. package/fesm2022/acorex-platform-themes-shared.mjs +27 -27
  53. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  54. package/layout/builder/index.d.ts +1 -4
  55. package/layout/components/index.d.ts +327 -405
  56. package/layout/designer/index.d.ts +3 -3
  57. package/layout/entity/index.d.ts +108 -163
  58. package/layout/widget-core/index.d.ts +49 -39
  59. package/layout/widgets/index.d.ts +54 -368
  60. package/package.json +5 -5
  61. package/themes/default/index.d.ts +2 -15
  62. package/themes/shared/index.d.ts +10 -10
  63. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +0 -1
  64. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +0 -1
  65. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +0 -1
  66. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs.map +0 -1
  67. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +0 -101
  68. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
  69. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { computed, signal, Injectable, InjectionToken, inject, ElementRef, effect, untracked, Injector, ChangeDetectorRef, ViewChild, Input, ChangeDetectionStrategy, Component, EventEmitter, Output, input, output, ViewContainerRef, Directive, Optional, Inject, NgModule } from '@angular/core';
2
+ import { computed, signal, Injectable, InjectionToken, inject, ElementRef, effect, untracked, Injector, ChangeDetectorRef, ViewChild, Input, ChangeDetectionStrategy, Component, EventEmitter, Output, input, output, ViewContainerRef, Directive, Optional, Inject, NgModule, createComponent } from '@angular/core';
3
3
  import { convertArrayToDataSource, AXDataSource } from '@acorex/cdk/common';
4
- import { setSmart, AXPDataSourceDefinitionProviderService, extractValue, AXPExpressionEvaluatorService, getSmart } from '@acorex/platform/core';
5
- import { cloneDeep, isEqual, has, get, set, merge, isNil, isUndefined, isObjectLike, sum, isEmpty, isString } from 'lodash-es';
4
+ import { setSmart, AXPDataSourceDefinitionProviderService, extractValue, getSmart, AXPExpressionEvaluatorService } from '@acorex/platform/core';
5
+ import { cloneDeep, isEqual, get, set, merge, isNil, isUndefined, isObjectLike, sum, isEmpty, isString } from 'lodash-es';
6
6
  import { Subject, BehaviorSubject, filter } from 'rxjs';
7
7
  import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
8
8
  import * as i1$1 from '@acorex/components/skeleton';
@@ -125,10 +125,6 @@ withMethods((store) => ({
125
125
  getValue(path) {
126
126
  return get(store.data(), path);
127
127
  },
128
- // Check if a path exists in the context
129
- hasValue(path) {
130
- return has(store.data(), path);
131
- },
132
128
  })));
133
129
 
134
130
  var AXPPageStatus;
@@ -332,6 +328,8 @@ const AXPWidgetsCatalog = {
332
328
  advancedGridItem: 'advanced-grid-item-layout',
333
329
  grid: 'grid-layout',
334
330
  gridItem: 'grid-item-layout',
331
+ // gridRow: 'grid-row-layout',
332
+ widgetSelector: 'widget-selector',
335
333
  template: 'template',
336
334
  templateDesigner: 'template-designer',
337
335
  cronJob: 'cron-job',
@@ -393,9 +391,8 @@ const AXPWidgetsCatalog = {
393
391
  editorJs: 'editor-js-editor',
394
392
  documentUploader: 'document-uploader',
395
393
  signatureList: 'signature-list',
394
+ status: 'status-widget',
396
395
  stepWizard: 'step-wizard',
397
- progressBar: 'progress-bar-editor',
398
- rate: 'rate-picker-editor'
399
396
  };
400
397
 
401
398
  function cloneProperty(property, values) {
@@ -599,8 +596,7 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
599
596
  this._isValueWidget = this.config.properties?.some((c) => c.name == 'path') ?? false;
600
597
  if (this.isValueWidget()) {
601
598
  this.detectFullPath();
602
- // Set defaultValue if it exists and the path doesn't exist in context
603
- if (!isNil(this.defaultValue) && this.fullPath() && !this.contextService.hasValue(this.fullPath())) {
599
+ if (!isNil(this.defaultValue) && isNil(this.getValue())) {
604
600
  this.setValue(this.defaultValue);
605
601
  }
606
602
  }
@@ -1216,14 +1212,8 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1216
1212
  super(...arguments);
1217
1213
  this.widgetRegistery = inject(AXPWidgetRegistryService);
1218
1214
  this.grid = inject(AXBaseDataTable);
1219
- this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
1220
1215
  this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : []));
1221
1216
  this.loadingRow = signal(null, ...(ngDevMode ? [{ debugName: "loadingRow" }] : []));
1222
- this.rowInjectorsCache = new Map();
1223
- this.hasExpressions = false;
1224
- this.pendingEvaluations = new Set();
1225
- this.changeDetectionScheduled = false;
1226
- this.MAX_CACHE_SIZE = 1000; // Limit cache size to prevent memory leaks
1227
1217
  this.injector = inject(Injector);
1228
1218
  this.cdr = inject(ChangeDetectorRef);
1229
1219
  }
@@ -1269,8 +1259,6 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1269
1259
  }, {});
1270
1260
  //
1271
1261
  this.mergedOptions.set(merge(props, this.node.options) || {});
1272
- // Check if options contain expressions (performance optimization)
1273
- this.hasExpressions = this.checkForExpressions(this.mergedOptions());
1274
1262
  const tokenValue = {
1275
1263
  path: this.node.path,
1276
1264
  options: this.mergedOptions(),
@@ -1288,164 +1276,12 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1288
1276
  this.allowResizing = this.mergedOptions().allowResizing || true;
1289
1277
  this.cdr.detectChanges();
1290
1278
  }
1291
- //#region ---- Performance Optimization Methods ----
1292
- /**
1293
- * Check if options contain any expressions that need evaluation
1294
- */
1295
- checkForExpressions(obj) {
1296
- if (typeof obj === 'string') {
1297
- return this.expressionEvaluator.isExpression(obj);
1298
- }
1299
- if (Array.isArray(obj)) {
1300
- return obj.some((item) => this.checkForExpressions(item));
1301
- }
1302
- if (obj && typeof obj === 'object') {
1303
- return Object.values(obj).some((value) => this.checkForExpressions(value));
1304
- }
1305
- return false;
1306
- }
1307
- /**
1308
- * Get cache key for row data - optimized to avoid JSON.stringify when possible
1309
- */
1310
- getCacheKey(data) {
1311
- if (data?.id) {
1312
- return `row-${data.id}`;
1313
- }
1314
- // Use a hash of key properties instead of full JSON.stringify
1315
- // This is much faster for large objects
1316
- const keyProps = ['id', 'code', 'name', 'title'];
1317
- const keyValues = keyProps.map((prop) => data?.[prop]).filter((v) => v != null);
1318
- if (keyValues.length > 0) {
1319
- return `row-${keyValues.join('-')}`;
1320
- }
1321
- // Fallback to JSON.stringify only if no key properties exist
1322
- // But limit the stringified size to prevent performance issues
1323
- try {
1324
- const str = JSON.stringify(data);
1325
- return str.length > 1000 ? `row-${str.substring(0, 1000)}` : `row-${str}`;
1326
- }
1327
- catch {
1328
- // If JSON.stringify fails, use a simple hash
1329
- return `row-${Object.keys(data || {}).length}`;
1330
- }
1331
- }
1332
- /**
1333
- * Schedule change detection (debounced to batch multiple updates)
1334
- */
1335
- scheduleChangeDetection() {
1336
- if (this.changeDetectionScheduled) {
1337
- return;
1338
- }
1339
- this.changeDetectionScheduled = true;
1340
- // Use requestAnimationFrame for better performance
1341
- requestAnimationFrame(() => {
1342
- this.cdr.detectChanges();
1343
- this.changeDetectionScheduled = false;
1344
- });
1345
- }
1346
- /**
1347
- * Limit cache size using simple FIFO eviction
1348
- */
1349
- evictCacheIfNeeded() {
1350
- if (this.rowInjectorsCache.size >= this.MAX_CACHE_SIZE) {
1351
- // Remove oldest entries (first 25% of cache)
1352
- const entriesToRemove = Math.floor(this.MAX_CACHE_SIZE * 0.25);
1353
- const keysToRemove = Array.from(this.rowInjectorsCache.keys()).slice(0, entriesToRemove);
1354
- keysToRemove.forEach((key) => this.rowInjectorsCache.delete(key));
1355
- }
1356
- }
1357
- //#endregion
1358
1279
  getInputs(data) {
1359
1280
  return {
1360
- rawValue: get(data, this.node.path),
1281
+ rawValue: getSmart(data, this.node.path),
1361
1282
  rowData: data,
1362
1283
  };
1363
1284
  }
1364
- getRowInjector(data) {
1365
- // Optimized cache key generation
1366
- const cacheKey = this.getCacheKey(data);
1367
- // Check if we have a cached injector for this row
1368
- let rowInjector = this.rowInjectorsCache.get(cacheKey);
1369
- if (!rowInjector) {
1370
- // If no expressions in options, use original options directly (performance optimization)
1371
- if (!this.hasExpressions) {
1372
- const tokenValue = {
1373
- path: this.node.path,
1374
- options: this.mergedOptions(),
1375
- };
1376
- rowInjector = Injector.create({
1377
- parent: this.injector,
1378
- providers: [
1379
- {
1380
- provide: AXP_WIDGET_COLUMN_TOKEN,
1381
- useValue: tokenValue,
1382
- },
1383
- ],
1384
- });
1385
- this.evictCacheIfNeeded();
1386
- this.rowInjectorsCache.set(cacheKey, rowInjector);
1387
- return rowInjector;
1388
- }
1389
- // Check if evaluation is already pending for this row
1390
- if (!this.pendingEvaluations.has(cacheKey)) {
1391
- this.pendingEvaluations.add(cacheKey);
1392
- // Evaluate expressions in options based on row data
1393
- const scope = {
1394
- ...(data ?? {}),
1395
- context: {
1396
- eval: (path) => {
1397
- return getSmart(data, path);
1398
- },
1399
- },
1400
- };
1401
- // Start async evaluation - will update injector when complete
1402
- this.expressionEvaluator.evaluate(this.mergedOptions(), scope).then((evaluatedOptions) => {
1403
- // Create injector with evaluated options
1404
- const tokenValue = {
1405
- path: this.node.path,
1406
- options: evaluatedOptions,
1407
- };
1408
- const newInjector = Injector.create({
1409
- parent: this.injector,
1410
- providers: [
1411
- {
1412
- provide: AXP_WIDGET_COLUMN_TOKEN,
1413
- useValue: tokenValue,
1414
- },
1415
- ],
1416
- });
1417
- // Replace cached injector to force component recreation on next render
1418
- this.rowInjectorsCache.delete(cacheKey);
1419
- this.evictCacheIfNeeded();
1420
- this.rowInjectorsCache.set(cacheKey, newInjector);
1421
- this.pendingEvaluations.delete(cacheKey);
1422
- // Schedule batched change detection (performance optimization)
1423
- this.scheduleChangeDetection();
1424
- }).catch(() => {
1425
- // If evaluation fails, keep using the fallback injector
1426
- this.pendingEvaluations.delete(cacheKey);
1427
- });
1428
- }
1429
- // Create injector with original options as fallback (will be updated when evaluation completes)
1430
- const tokenValue = {
1431
- path: this.node.path,
1432
- options: this.mergedOptions(),
1433
- };
1434
- rowInjector = Injector.create({
1435
- parent: this.injector,
1436
- providers: [
1437
- {
1438
- provide: AXP_WIDGET_COLUMN_TOKEN,
1439
- useValue: tokenValue,
1440
- },
1441
- ],
1442
- });
1443
- // Cache the initial injector
1444
- this.evictCacheIfNeeded();
1445
- this.rowInjectorsCache.set(cacheKey, rowInjector);
1446
- }
1447
- return rowInjector;
1448
- }
1449
1285
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetColumnRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1450
1286
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPWidgetColumnRendererComponent, isStandalone: false, selector: "axp-widget-column-renderer", inputs: { caption: "caption", customExpandIcon: "customExpandIcon", customCollapseIcon: "customCollapseIcon", customWidth: "customWidth", node: "node", footerTemplate: "footerTemplate", expandHandler: "expandHandler", cellTemplate: "cellTemplate", headerTemplate: "headerTemplate" }, providers: [
1451
1287
  AXPWidgetCoreService,
@@ -1473,9 +1309,9 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1473
1309
  }
1474
1310
  </div>
1475
1311
  }
1476
- @if (component && row?.data) {
1312
+ @if (component && widgetInjector && row?.data) {
1477
1313
  <ng-container
1478
- *ngComponentOutlet="component; injector: getRowInjector(row.data); inputs: getInputs(row.data)"
1314
+ *ngComponentOutlet="component; injector: widgetInjector; inputs: getInputs(row.data)"
1479
1315
  ></ng-container>
1480
1316
  }
1481
1317
  </div>
@@ -1510,9 +1346,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1510
1346
  }
1511
1347
  </div>
1512
1348
  }
1513
- @if (component && row?.data) {
1349
+ @if (component && widgetInjector && row?.data) {
1514
1350
  <ng-container
1515
- *ngComponentOutlet="component; injector: getRowInjector(row.data); inputs: getInputs(row.data)"
1351
+ *ngComponentOutlet="component; injector: widgetInjector; inputs: getInputs(row.data)"
1516
1352
  ></ng-container>
1517
1353
  }
1518
1354
  </div>
@@ -1636,7 +1472,6 @@ class AXPWidgetRendererDirective {
1636
1472
  this.options = this._options.asReadonly();
1637
1473
  this.onOptionsChanged = output();
1638
1474
  this.onValueChanged = output();
1639
- this.onLoad = output();
1640
1475
  //#region ---- Public API ----
1641
1476
  /**
1642
1477
  * Signal that emits the component reference when it's ready
@@ -1661,7 +1496,6 @@ class AXPWidgetRendererDirective {
1661
1496
  this.renderTimeoutId = null;
1662
1497
  this.hasInitialRender = false;
1663
1498
  this.onContextChanged = new Subject();
1664
- this.onLoadEvent = new Subject();
1665
1499
  //#region ---- Performance Optimization Properties ----
1666
1500
  this.contextUpdateQueue = new Set();
1667
1501
  this.contextUpdateTimeout = null;
@@ -1680,33 +1514,14 @@ class AXPWidgetRendererDirective {
1680
1514
  const changed = this.contextService.changeEvent();
1681
1515
  // Don't trigger re-render during initial setup
1682
1516
  if (!this.hasInitialRender) {
1683
- // Handle initial context set (state: 'initiated' with empty path means full context update)
1684
- if (changed.state === 'initiated' && (!changed.path || changed.path === '')) {
1685
- // Mark that we need to re-evaluate all expressions when initial render completes
1686
- // This handles the case where context is set before/during widget initialization
1687
- this.preRenderContextQueue.add('*'); // Use '*' as a marker for full context initialization
1688
- // console.log(`📝 [${this.node().type}] Buffered initial context set`);
1689
- }
1690
- else if (changed.path) {
1517
+ if (changed.path) {
1691
1518
  this.preRenderContextQueue.add(changed.path);
1692
1519
  // console.log(`📝 [${this.node().type}] Buffered pre-render context change: ${changed.path}`);
1693
1520
  }
1694
1521
  return;
1695
1522
  }
1696
1523
  // CRITICAL PERFORMANCE FIX: Only respond to relevant context changes
1697
- // Handle initial context set (full context update)
1698
- if (changed.state === 'initiated' && (!changed.path || changed.path === '')) {
1699
- // Full context initialization - trigger re-evaluation of all expressions
1700
- // console.log(`🎯 [${this.node().type}] Initial context set detected - triggering full re-evaluation`);
1701
- this.clearExpressionCache();
1702
- if (this.expressionEvaluators.size > 0) {
1703
- await this.updateOptionsBasedOnContext();
1704
- this.applyOptions();
1705
- }
1706
- await this.updateVisibility();
1707
- await this.updateValueBasedOnFormula();
1708
- }
1709
- else if (changed.path && this.isRelevantContextChange(changed.path)) {
1524
+ if (changed.path && this.isRelevantContextChange(changed.path)) {
1710
1525
  // console.log(`🎯 [${this.node().type}] Context change detected: ${changed.path}`);
1711
1526
  this.queueContextUpdate(changed.path);
1712
1527
  }
@@ -1864,7 +1679,7 @@ class AXPWidgetRendererDirective {
1864
1679
  let match;
1865
1680
  while ((match = contextEvalRegex.exec(expressionValue)) !== null) {
1866
1681
  const evalPath = match[1];
1867
- // Normalize Id-suffixed segments to dot-id form (e.g., 'typeId' -> 'type.id', 'person.typeId' -> 'person.type.id')
1682
+ // Normalize Id-suffixed segments to dot-id form (e.g., 'typeId' -> 'type.id', 'party.typeId' -> 'party.type.id')
1868
1683
  const normalizePath = (p) => {
1869
1684
  if (!p)
1870
1685
  return p;
@@ -2054,7 +1869,6 @@ class AXPWidgetRendererDirective {
2054
1869
  if (this.componentRef) {
2055
1870
  this.componentRef.destroy();
2056
1871
  }
2057
- this.onLoadEvent.complete();
2058
1872
  }
2059
1873
  async loadComponent() {
2060
1874
  if (this.isLoading()) {
@@ -2102,17 +1916,7 @@ class AXPWidgetRendererDirective {
2102
1916
  // Register expressions from widget defaults and node options to cover related-entity cases
2103
1917
  this.preprocessAndInitialOptions(cloneDeep(widget?.options));
2104
1918
  this.preprocessAndInitialOptions(cloneDeep(this.node().options));
2105
- // Check if context is available before evaluating expressions
2106
- // If context is empty, expressions will be re-evaluated after initial render
2107
- const contextData = this.contextService.data();
2108
- const hasContextData = contextData && Object.keys(contextData).length > 0;
2109
- if (hasContextData) {
2110
- await this.updateOptionsBasedOnContext();
2111
- }
2112
- else {
2113
- // Context not yet available - expressions will be evaluated after initial render
2114
- // when context is set (handled by the effect and preRenderContextQueue)
2115
- }
1919
+ await this.updateOptionsBasedOnContext();
2116
1920
  //
2117
1921
  this._options.update((val) => ({ ...val, ...this.mergedOptions() }));
2118
1922
  // Evaluate default value
@@ -2176,33 +1980,13 @@ class AXPWidgetRendererDirective {
2176
1980
  await this.updateVisibility();
2177
1981
  // Process any buffered pre-render context changes now that the component is ready
2178
1982
  if (this.preRenderContextQueue.size > 0) {
2179
- // Check if we have a full context initialization marker
2180
- const hasFullContextInit = this.preRenderContextQueue.has('*');
2181
- if (hasFullContextInit) {
2182
- // Full context was initialized - clear cache and re-evaluate all expressions
2183
- // console.log(`🚀 [${this.node().type}] Processing initial context set - full re-evaluation`);
2184
- this.clearExpressionCache();
2185
- this.preRenderContextQueue.clear();
2186
- // Re-evaluate all expressions since context is now available
2187
- if (this.expressionEvaluators.size > 0) {
2188
- await this.updateOptionsBasedOnContext();
2189
- this.applyOptions();
2190
- }
2191
- await this.updateVisibility();
2192
- }
2193
- else {
2194
- // console.log(
2195
- // `🚀 [${this.node().type}] Processing ${this.preRenderContextQueue.size} buffered pre-render changes`,
2196
- // );
2197
- this.preRenderContextQueue.forEach((p) => this.contextUpdateQueue.add(p));
2198
- this.preRenderContextQueue.clear();
2199
- await this.processBatchedUpdates();
2200
- }
1983
+ // console.log(
1984
+ // `🚀 [${this.node().type}] Processing ${this.preRenderContextQueue.size} buffered pre-render changes`,
1985
+ // );
1986
+ this.preRenderContextQueue.forEach((p) => this.contextUpdateQueue.add(p));
1987
+ this.preRenderContextQueue.clear();
1988
+ await this.processBatchedUpdates();
2201
1989
  }
2202
- // Emit load event after widget is fully loaded
2203
- const loadEvent = { sender: this, widget: this.instance };
2204
- this.onLoadEvent.next(loadEvent);
2205
- this.onLoad.emit(loadEvent);
2206
1990
  }
2207
1991
  catch (error) {
2208
1992
  // console.error('Error loading component:', error);
@@ -2474,9 +2258,6 @@ class AXPWidgetRendererDirective {
2474
2258
  }));
2475
2259
  },
2476
2260
  from: (event) => get(this.instance.api(), event),
2477
- load: () => {
2478
- return this.onLoadEvent.asObservable();
2479
- },
2480
2261
  };
2481
2262
  }
2482
2263
  getWidgetScope() {
@@ -2495,10 +2276,6 @@ class AXPWidgetRendererDirective {
2495
2276
  if (refresh && typeof refresh === 'function') {
2496
2277
  refresh.bind(this.instance)();
2497
2278
  }
2498
- else {
2499
- this.updateOptionsBasedOnContext();
2500
- this.applyOptions();
2501
- }
2502
2279
  },
2503
2280
  output: (name) => {
2504
2281
  this.instance.output(name);
@@ -2587,7 +2364,7 @@ class AXPWidgetRendererDirective {
2587
2364
  }
2588
2365
  }
2589
2366
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetRendererDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2590
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.12", type: AXPWidgetRendererDirective, isStandalone: false, selector: "[axp-widget-renderer]", inputs: { parentNode: { classPropertyName: "parentNode", publicName: "parentNode", isSignal: true, isRequired: false, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onOptionsChanged: "onOptionsChanged", onValueChanged: "onValueChanged", onLoad: "onLoad" }, providers: [
2367
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.12", type: AXPWidgetRendererDirective, isStandalone: false, selector: "[axp-widget-renderer]", inputs: { parentNode: { classPropertyName: "parentNode", publicName: "parentNode", isSignal: true, isRequired: false, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onOptionsChanged: "onOptionsChanged", onValueChanged: "onValueChanged" }, providers: [
2591
2368
  {
2592
2369
  provide: AXUnsubscriber,
2593
2370
  },
@@ -2605,7 +2382,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2605
2382
  ],
2606
2383
  standalone: false,
2607
2384
  }]
2608
- }], ctorParameters: () => [], propDecorators: { parentNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentNode", required: false }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: true }] }], node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], onOptionsChanged: [{ type: i0.Output, args: ["onOptionsChanged"] }], onValueChanged: [{ type: i0.Output, args: ["onValueChanged"] }], onLoad: [{ type: i0.Output, args: ["onLoad"] }] } });
2385
+ }], ctorParameters: () => [], propDecorators: { parentNode: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentNode", required: false }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: true }] }], node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }], onOptionsChanged: [{ type: i0.Output, args: ["onOptionsChanged"] }], onValueChanged: [{ type: i0.Output, args: ["onValueChanged"] }] } });
2609
2386
 
2610
2387
  const COMPONENTS = [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective];
2611
2388
  class AXPWidgetCoreModule {
@@ -2881,9 +2658,158 @@ var AXPWidgetGroupEnum;
2881
2658
  AXPWidgetGroupEnum["UtilityWidget"] = "utility-widget";
2882
2659
  })(AXPWidgetGroupEnum || (AXPWidgetGroupEnum = {}));
2883
2660
 
2661
+ class AXPWidgetStandaloneRendererHostComponent {
2662
+ constructor() {
2663
+ this.mode = 'edit';
2664
+ }
2665
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetStandaloneRendererHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2666
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.12", type: AXPWidgetStandaloneRendererHostComponent, isStandalone: true, selector: "axp-widget-standalone-renderer-host", inputs: { mode: "mode", node: "node", context: "context", functions: "functions" }, ngImport: i0, template: `
2667
+ <axp-widgets-container [context]="context" [functions]="functions">
2668
+ <ng-container axp-widget-renderer [mode]="mode" [node]="node"></ng-container>
2669
+ </axp-widgets-container>
2670
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }] }); }
2671
+ }
2672
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetStandaloneRendererHostComponent, decorators: [{
2673
+ type: Component,
2674
+ args: [{
2675
+ selector: 'axp-widget-standalone-renderer-host',
2676
+ template: `
2677
+ <axp-widgets-container [context]="context" [functions]="functions">
2678
+ <ng-container axp-widget-renderer [mode]="mode" [node]="node"></ng-container>
2679
+ </axp-widgets-container>
2680
+ `,
2681
+ standalone: true,
2682
+ imports: [AXPWidgetCoreModule]
2683
+ }]
2684
+ }], propDecorators: { mode: [{
2685
+ type: Input
2686
+ }], node: [{
2687
+ type: Input
2688
+ }], context: [{
2689
+ type: Input
2690
+ }], functions: [{
2691
+ type: Input
2692
+ }] } });
2693
+
2694
+ const LAYOUT_WIDGET_RENDER_ENGINE = new InjectionToken('LAYOUT_WIDGET_RENDER_ENGINE');
2695
+ class WidgetCoreRendererEngine {
2696
+ constructor(appRef, env) {
2697
+ this.appRef = appRef;
2698
+ this.env = env;
2699
+ }
2700
+ render(node, target, context, mode = 'edit') {
2701
+ const compRef = createComponent(AXPWidgetStandaloneRendererHostComponent, { environmentInjector: this.env });
2702
+ compRef.setInput('mode', mode);
2703
+ compRef.setInput('node', node);
2704
+ if (context) {
2705
+ compRef.setInput('context', context);
2706
+ }
2707
+ this.appRef.attachView(compRef.hostView);
2708
+ target.appendChild(compRef.location.nativeElement);
2709
+ return {
2710
+ element: compRef.location.nativeElement,
2711
+ destroy: () => {
2712
+ try {
2713
+ this.appRef.detachView(compRef.hostView);
2714
+ }
2715
+ catch { }
2716
+ compRef.destroy();
2717
+ },
2718
+ };
2719
+ }
2720
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: WidgetCoreRendererEngine, deps: [{ token: i0.ApplicationRef }, { token: i0.EnvironmentInjector }], target: i0.ɵɵFactoryTarget.Injectable }); }
2721
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: WidgetCoreRendererEngine, providedIn: 'root' }); }
2722
+ }
2723
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: WidgetCoreRendererEngine, decorators: [{
2724
+ type: Injectable,
2725
+ args: [{ providedIn: 'root' }]
2726
+ }], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i0.EnvironmentInjector }] });
2727
+ class SimpleDomRendererEngine {
2728
+ render(node, target) {
2729
+ const element = this.createElement(node);
2730
+ target.appendChild(element);
2731
+ return {
2732
+ element,
2733
+ destroy: () => {
2734
+ if (element.parentElement) {
2735
+ element.parentElement.removeChild(element);
2736
+ }
2737
+ },
2738
+ };
2739
+ }
2740
+ createElement(node) {
2741
+ const container = document.createElement('div');
2742
+ container.className = `axp-widget axp-widget-${node.type}`;
2743
+ switch (String(node.type)) {
2744
+ case 'text-block-layout':
2745
+ case 'static-text':
2746
+ this.renderText(container, node);
2747
+ break;
2748
+ case 'tag':
2749
+ this.renderTag(container, node);
2750
+ break;
2751
+ case 'text-editor':
2752
+ this.renderTextBox(container, node);
2753
+ break;
2754
+ default:
2755
+ this.renderGeneric(container, node);
2756
+ break;
2757
+ }
2758
+ return container;
2759
+ }
2760
+ renderText(container, node) {
2761
+ const anyNode = node;
2762
+ const content = (anyNode.options && (anyNode.options.content || anyNode.options.label)) || '';
2763
+ container.innerHTML = typeof content === 'string' ? content : String(content);
2764
+ }
2765
+ renderTag(container, node) {
2766
+ const label = node.options?.label || 'Tag';
2767
+ const tone = node.options?.tone || 'primary';
2768
+ container.innerHTML = `<span class="tag tag-${tone}" style="
2769
+ display: inline-block;
2770
+ padding: 4px 12px;
2771
+ border-radius: 12px;
2772
+ font-size: 12px;
2773
+ font-weight: 500;
2774
+ background: ${tone === 'success' ? '#d4edda' : '#cce5ff'};
2775
+ color: ${tone === 'success' ? '#155724' : '#004085'};
2776
+ border: 1px solid ${tone === 'success' ? '#c3e6cb' : '#b8daff'};
2777
+ ">${label}</span>`;
2778
+ }
2779
+ renderTextBox(container, node) {
2780
+ const placeholder = node.options?.placeholder || '';
2781
+ const input = document.createElement('input');
2782
+ input.type = 'text';
2783
+ input.placeholder = placeholder;
2784
+ input.style.cssText = `
2785
+ width: 100%;
2786
+ padding: 8px 12px;
2787
+ border: 1px solid #ddd;
2788
+ border-radius: 4px;
2789
+ font-size: 14px;
2790
+ `;
2791
+ container.appendChild(input);
2792
+ }
2793
+ renderGeneric(container, node) {
2794
+ const anyNode = node;
2795
+ if (anyNode.options?.content) {
2796
+ container.innerHTML = anyNode.options.content;
2797
+ }
2798
+ else {
2799
+ container.textContent = `[${String(node.type)}]`;
2800
+ }
2801
+ }
2802
+ }
2803
+ function provideWidgetCoreRenderer() {
2804
+ return [{ provide: LAYOUT_WIDGET_RENDER_ENGINE, useClass: WidgetCoreRendererEngine }];
2805
+ }
2806
+ function provideSimpleDomRenderer() {
2807
+ return [{ provide: LAYOUT_WIDGET_RENDER_ENGINE, useClass: SimpleDomRendererEngine }];
2808
+ }
2809
+
2884
2810
  /**
2885
2811
  * Generated bundle index. Do not edit.
2886
2812
  */
2887
2813
 
2888
- export { AXPBaseWidgetComponent, AXPBlockBaseLayoutWidgetComponent, AXPBoxModelLayoutWidgetComponent, AXPColumnWidgetComponent, AXPDataListWidgetComponent, AXPFlexBaseLayoutWidgetComponent, AXPFlexItemBaseLayoutWidgetComponent, AXPGridBaseLayoutWidgetComponent, AXPGridItemBaseLayoutWidgetComponent, AXPInlineBaseLayoutWidgetComponent, AXPLayoutBaseWidgetComponent, AXPPageStatus, AXPPropertyEditorHelper, AXPTableBaseLayoutWidgetComponent, AXPTableItemBaseLayoutWidgetComponent, AXPTableItemOpsBaseLayoutWidgetComponent, AXPValueWidgetComponent, AXPWidgetColumnRendererComponent, AXPWidgetContainerComponent, AXPWidgetCoreContextChangeEvent, AXPWidgetCoreContextStore, AXPWidgetCoreElement, AXPWidgetCoreModule, AXPWidgetCoreService, AXPWidgetGroupEnum, AXPWidgetRegistryService, AXPWidgetRendererDirective, AXPWidgetStatus, AXPWidgetsCatalog, AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_CATEGORIES, AXP_WIDGETS_EDITOR_CATEGORY, AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGET_COLUMN_TOKEN, AXP_WIDGET_TOKEN, cloneProperty, createBooleanProperty, createNumberProperty, createSelectProperty, createStringProperty, findNonEmptyBreakpoints };
2814
+ export { AXPBaseWidgetComponent, AXPBlockBaseLayoutWidgetComponent, AXPBoxModelLayoutWidgetComponent, AXPColumnWidgetComponent, AXPDataListWidgetComponent, AXPFlexBaseLayoutWidgetComponent, AXPFlexItemBaseLayoutWidgetComponent, AXPGridBaseLayoutWidgetComponent, AXPGridItemBaseLayoutWidgetComponent, AXPInlineBaseLayoutWidgetComponent, AXPLayoutBaseWidgetComponent, AXPPageStatus, AXPPropertyEditorHelper, AXPTableBaseLayoutWidgetComponent, AXPTableItemBaseLayoutWidgetComponent, AXPTableItemOpsBaseLayoutWidgetComponent, AXPValueWidgetComponent, AXPWidgetColumnRendererComponent, AXPWidgetContainerComponent, AXPWidgetCoreContextChangeEvent, AXPWidgetCoreContextStore, AXPWidgetCoreElement, AXPWidgetCoreModule, AXPWidgetCoreService, AXPWidgetGroupEnum, AXPWidgetRegistryService, AXPWidgetRendererDirective, AXPWidgetStandaloneRendererHostComponent, AXPWidgetStatus, AXPWidgetsCatalog, AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_CATEGORIES, AXP_WIDGETS_EDITOR_CATEGORY, AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGET_COLUMN_TOKEN, AXP_WIDGET_TOKEN, LAYOUT_WIDGET_RENDER_ENGINE, SimpleDomRendererEngine, WidgetCoreRendererEngine, cloneProperty, createBooleanProperty, createNumberProperty, createSelectProperty, createStringProperty, findNonEmptyBreakpoints, provideSimpleDomRenderer, provideWidgetCoreRenderer };
2889
2815
  //# sourceMappingURL=acorex-platform-layout-widget-core.mjs.map