@acorex/platform 20.6.0-next.2 → 20.6.0-next.21

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 (107) hide show
  1. package/common/index.d.ts +7 -3
  2. package/core/index.d.ts +210 -56
  3. package/fesm2022/acorex-platform-auth.mjs +19 -19
  4. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  5. package/fesm2022/{acorex-platform-common-common-settings.provider-CLb2KMfv.mjs → acorex-platform-common-common-settings.provider-zhqNP3xb.mjs} +28 -4
  6. package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map +1 -0
  7. package/fesm2022/acorex-platform-common.mjs +104 -103
  8. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-core.mjs +279 -78
  10. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-domain.mjs +65 -20
  12. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-builder.mjs +56 -135
  14. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-layout-components.mjs +1322 -409
  16. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-layout-designer.mjs +73 -73
  18. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-layout-entity.mjs +7736 -3813
  20. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  21. package/fesm2022/acorex-platform-layout-views.mjs +58 -40
  22. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  23. package/fesm2022/acorex-platform-layout-widget-core.mjs +91 -82
  24. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  25. package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-lHfg4JFJ.mjs → acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs} +4 -4
  26. package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-lHfg4JFJ.mjs.map → acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs.map} +1 -1
  27. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-CMSnecnD.mjs → acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs} +4 -4
  28. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-CMSnecnD.mjs.map → acorex-platform-layout-widgets-extra-properties-schema-widget-edit.component-fhhZOWul.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-DN-sIFYe.mjs → acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs} +4 -4
  30. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-DN-sIFYe.mjs.map → acorex-platform-layout-widgets-extra-properties-schema-widget-view.component-C3Qbs0fz.mjs.map} +1 -1
  31. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-Bn9w0SEz.mjs → acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs} +4 -4
  32. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-Bn9w0SEz.mjs.map → acorex-platform-layout-widgets-extra-properties-values-widget-edit.component-CngQBUlN.mjs.map} +1 -1
  33. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-values-widget-view.component-B8mgcvoX.mjs → acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs} +4 -4
  34. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-values-widget-view.component-B8mgcvoX.mjs.map → acorex-platform-layout-widgets-extra-properties-values-widget-view.component-DSNo9e4W.mjs.map} +1 -1
  35. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-widget-edit.component-Bhof2SY8.mjs → acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs} +4 -4
  36. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-widget-edit.component-Bhof2SY8.mjs.map → acorex-platform-layout-widgets-extra-properties-widget-edit.component-CL0CwEHX.mjs.map} +1 -1
  37. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-widget-view.component-CeQIvKVV.mjs → acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs} +4 -4
  38. package/fesm2022/{acorex-platform-layout-widgets-extra-properties-widget-view.component-CeQIvKVV.mjs.map → acorex-platform-layout-widgets-extra-properties-widget-view.component-B6Fi0xTw.mjs.map} +1 -1
  39. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-BOP7jFp4.mjs → acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs} +6 -6
  40. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-BOP7jFp4.mjs.map → acorex-platform-layout-widgets-file-list-popup.component-D0y-9nE5.mjs.map} +1 -1
  41. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs +30 -0
  42. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map +1 -0
  43. package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-C57lyBs3.mjs → acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs} +4 -4
  44. package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-C57lyBs3.mjs.map → acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs.map} +1 -1
  45. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-fr77M8Z0.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-m8rHZP8L.mjs} +6 -6
  46. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-m8rHZP8L.mjs.map +1 -0
  47. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-CvZTRhct.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs} +5 -5
  48. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map +1 -0
  49. package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-DHES_0ot.mjs → acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs} +4 -4
  50. package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-DHES_0ot.mjs.map → acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs.map} +1 -1
  51. package/fesm2022/acorex-platform-layout-widgets.mjs +3809 -2060
  52. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  53. package/fesm2022/acorex-platform-native.mjs +7 -7
  54. package/fesm2022/acorex-platform-native.mjs.map +1 -1
  55. package/fesm2022/acorex-platform-runtime.mjs +119 -43
  56. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  57. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-C_XmJV7Y.mjs → acorex-platform-themes-default-entity-master-create-view.component-mARj77Mr.mjs} +30 -9
  58. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-mARj77Mr.mjs.map +1 -0
  59. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-D5K0XUqM.mjs +1522 -0
  60. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-D5K0XUqM.mjs.map +1 -0
  61. package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-DJPDil7w.mjs → acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs} +4 -4
  62. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-BTA6h7Xd.mjs.map +1 -0
  63. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-BArdGNfr.mjs → acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs} +7 -7
  64. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-B_P0a5KW.mjs.map +1 -0
  65. package/fesm2022/{acorex-platform-themes-default-error-401.component-D7rEInHg.mjs → acorex-platform-themes-default-error-401.component-cfREo88K.mjs} +4 -4
  66. package/fesm2022/{acorex-platform-themes-default-error-401.component-D7rEInHg.mjs.map → acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map} +1 -1
  67. package/fesm2022/{acorex-platform-themes-default-error-404.component-BTZlVrd8.mjs → acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs} +4 -4
  68. package/fesm2022/{acorex-platform-themes-default-error-404.component-BTZlVrd8.mjs.map → acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map} +1 -1
  69. package/fesm2022/{acorex-platform-themes-default-error-offline.component-BhvEi6nX.mjs → acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs} +4 -4
  70. package/fesm2022/{acorex-platform-themes-default-error-offline.component-BhvEi6nX.mjs.map → acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map} +1 -1
  71. package/fesm2022/acorex-platform-themes-default.mjs +156 -53
  72. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  73. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs +55 -0
  74. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map +1 -0
  75. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-BXV40gay.mjs → acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs} +4 -4
  76. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-BXV40gay.mjs.map → acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs.map} +1 -1
  77. package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-column.component-BpIf4s53.mjs → acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs} +4 -4
  78. package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-column.component-BpIf4s53.mjs.map → acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs.map} +1 -1
  79. package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-C9gvfQfX.mjs → acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs} +4 -4
  80. package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-C9gvfQfX.mjs.map → acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs.map} +1 -1
  81. package/fesm2022/acorex-platform-themes-shared.mjs +58 -153
  82. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  83. package/fesm2022/acorex-platform-workflow.mjs +327 -151
  84. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  85. package/layout/builder/index.d.ts +6 -33
  86. package/layout/components/index.d.ts +306 -61
  87. package/layout/designer/index.d.ts +1 -1
  88. package/layout/entity/index.d.ts +595 -94
  89. package/layout/views/index.d.ts +6 -58
  90. package/layout/widget-core/index.d.ts +31 -26
  91. package/layout/widgets/README.md +0 -1
  92. package/layout/widgets/index.d.ts +325 -99
  93. package/package.json +1 -1
  94. package/runtime/index.d.ts +36 -8
  95. package/themes/default/index.d.ts +32 -77
  96. package/themes/shared/index.d.ts +1 -39
  97. package/workflow/index.d.ts +909 -457
  98. package/fesm2022/acorex-platform-common-common-settings.provider-CLb2KMfv.mjs.map +0 -1
  99. package/fesm2022/acorex-platform-layout-entity-create-entity.command-BsLbiAdA.mjs +0 -52
  100. package/fesm2022/acorex-platform-layout-entity-create-entity.command-BsLbiAdA.mjs.map +0 -1
  101. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-fr77M8Z0.mjs.map +0 -1
  102. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-CvZTRhct.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-C_XmJV7Y.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BkY9HXcT.mjs +0 -782
  105. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BkY9HXcT.mjs.map +0 -1
  106. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-DJPDil7w.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-BArdGNfr.mjs.map +0 -1
@@ -5,10 +5,9 @@ import { inject, Injectable, input, model, signal, effect, output, viewChild, Ch
5
5
  import { AXPopupService } from '@acorex/components/popup';
6
6
  import * as i2 from '@acorex/components/form';
7
7
  import { AXFormComponent, AXFormModule } from '@acorex/components/form';
8
- import { AXPExpressionEvaluatorService } from '@acorex/platform/core';
9
8
  import * as i1 from '@acorex/platform/layout/widget-core';
10
9
  import { AXPWidgetContainerComponent, AXPPageStatus, AXPWidgetCoreModule } from '@acorex/platform/layout/widget-core';
11
- import { isEqual, get, cloneDeep } from 'lodash-es';
10
+ import { isEqual, cloneDeep } from 'lodash-es';
12
11
  import { Subject, debounceTime, distinctUntilChanged, startWith } from 'rxjs';
13
12
  import * as i1$1 from '@acorex/components/button';
14
13
  import { AXButtonModule } from '@acorex/components/button';
@@ -19,6 +18,7 @@ import { AXLoadingModule } from '@acorex/components/loading';
19
18
  import { AXBasePageComponent } from '@acorex/components/page';
20
19
  import * as i5 from '@acorex/core/translation';
21
20
  import { AXTranslationModule } from '@acorex/core/translation';
21
+ import { AXPExpressionEvaluatorService } from '@acorex/platform/core';
22
22
 
23
23
  //#region ---- Inheritance Utilities ----
24
24
  /**
@@ -86,10 +86,10 @@ class AXPLayoutBuilderService {
86
86
  create() {
87
87
  return new LayoutBuilder(this.popupService);
88
88
  }
89
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutBuilderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
90
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutBuilderService, providedIn: 'root' }); }
89
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutBuilderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
90
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutBuilderService, providedIn: 'root' }); }
91
91
  }
92
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutBuilderService, decorators: [{
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutBuilderService, decorators: [{
93
93
  type: Injectable,
94
94
  args: [{
95
95
  providedIn: 'root',
@@ -725,6 +725,14 @@ class FormFieldBuilder extends LayoutContainerMixin {
725
725
  setShowLabel(showLabel) {
726
726
  return this.setOptions({ showLabel });
727
727
  }
728
+ defaultValue(value) {
729
+ this.containerState.defaultValue = value;
730
+ this.inheritanceContext.defaultValue = value;
731
+ if (this.childWidget) {
732
+ this.childWidget.withInheritanceContext(this.inheritanceContext);
733
+ }
734
+ return this;
735
+ }
728
736
  // Single widget methods with automatic path generation
729
737
  addSingleWidget(type, options) {
730
738
  if (this.hasWidget) {
@@ -916,7 +924,7 @@ class FieldsetContainerBuilder extends LayoutContainerMixin {
916
924
  */
917
925
  class ListWidgetBuilder extends WidgetContainerMixin {
918
926
  constructor() {
919
- super('list');
927
+ super('data-list');
920
928
  }
921
929
  setOptions(options) {
922
930
  this.containerState.options = { ...this.containerState.options, ...options };
@@ -1201,6 +1209,10 @@ class WidgetBuilder {
1201
1209
  this.inheritanceContext.disabled = condition;
1202
1210
  return this;
1203
1211
  }
1212
+ defaultValue(defaultValue) {
1213
+ this.widgetState.defaultValue = defaultValue;
1214
+ return this;
1215
+ }
1204
1216
  readonly(condition) {
1205
1217
  if (!this.widgetState.options) {
1206
1218
  this.widgetState.options = {};
@@ -1241,6 +1253,9 @@ class WidgetBuilder {
1241
1253
  if (resolved.visible !== undefined) {
1242
1254
  this.widgetState.options['visible'] = resolved.visible;
1243
1255
  }
1256
+ if (context.defaultValue !== undefined) {
1257
+ this.widgetState.defaultValue = context.defaultValue;
1258
+ }
1244
1259
  return this;
1245
1260
  }
1246
1261
  getInheritanceContext() {
@@ -1679,10 +1694,10 @@ class AXPLayoutConversionService {
1679
1694
  }
1680
1695
  return Math.abs(hash).toString(36); // Convert to base36 for shorter string
1681
1696
  }
1682
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutConversionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1683
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutConversionService, providedIn: 'root' }); }
1697
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutConversionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1698
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutConversionService, providedIn: 'root' }); }
1684
1699
  }
1685
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutConversionService, decorators: [{
1700
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutConversionService, decorators: [{
1686
1701
  type: Injectable,
1687
1702
  args: [{
1688
1703
  providedIn: 'root',
@@ -1691,29 +1706,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImpo
1691
1706
 
1692
1707
  class AXPLayoutRendererComponent {
1693
1708
  constructor() {
1694
- this.evaluatorService = inject(AXPExpressionEvaluatorService);
1695
1709
  this.conversionService = inject(AXPLayoutConversionService);
1696
- /**
1697
- * Tracks the latest scheduled evaluation to ensure last-write-wins for async evaluate
1698
- */
1699
- this.evaluationRunId = 0;
1700
1710
  /**
1701
1711
  * RxJS subjects for context management
1702
1712
  */
1703
1713
  this.contextUpdateSubject = new Subject();
1704
1714
  this.contextChangeSubject = new Subject();
1705
- /**
1706
- * Cache for expression evaluation results
1707
- */
1708
- this.expressionCache = new Map();
1709
- /**
1710
- * Cache for widget tree comparisons
1711
- */
1712
- this.widgetTreeCache = new Map();
1713
- /**
1714
- * Last layout hash for change detection
1715
- */
1716
- this.lastLayoutHash = '';
1717
1715
  //#region ---- Inputs ----
1718
1716
  /**
1719
1717
  * Form definition containing groups and fields OR widget tree
@@ -1735,36 +1733,29 @@ class AXPLayoutRendererComponent {
1735
1733
  //#region ---- Widget Tree Conversion ----
1736
1734
  this.widgetTree = signal(null, ...(ngDevMode ? [{ debugName: "widgetTree" }] : []));
1737
1735
  /**
1738
- * Convert and evaluate data when inputs change (optimized with RxJS)
1736
+ * Convert layout data to widget tree when inputs change
1739
1737
  */
1740
1738
  this.conversionEffect = effect(() => {
1741
1739
  const inputData = this.layout();
1742
- const ctx = this.internalContext();
1743
- const look = this.look();
1744
- const runId = ++this.evaluationRunId;
1745
- // Generate layout hash for change detection
1746
- const layoutHash = this.generateLayoutHash(inputData, look);
1747
- // Skip if layout hasn't changed
1748
- if (layoutHash === this.lastLayoutHash && this.widgetTree()) {
1740
+ // Convert to widget tree
1741
+ let tree;
1742
+ if (this.isFormDefinition(inputData)) {
1743
+ // Convert form definition to widget tree
1744
+ tree = this.conversionService.convertFormDefinition(inputData);
1745
+ }
1746
+ else if (this.isWidgetNode(inputData)) {
1747
+ // Use widget tree directly
1748
+ tree = inputData;
1749
+ }
1750
+ else {
1751
+ console.warn('AXPLayoutRendererComponent: Invalid layout input. Expected AXPDynamicFormDefinition or AXPWidgetNode.', inputData);
1749
1752
  return;
1750
1753
  }
1751
- this.lastLayoutHash = layoutHash;
1752
- (async () => {
1753
- // First evaluate expressions if needed
1754
- const evaluated = await this.expressionEvaluator(inputData, ctx);
1755
- // Ignore stale results
1756
- if (runId !== this.evaluationRunId) {
1757
- return;
1758
- }
1759
- // Convert to widget tree (this will also apply the layout look)
1760
- const tree = evaluated;
1761
- // Update widget tree
1762
- const prev = this.widgetTree();
1763
- if (!isEqual(prev, tree)) {
1764
- tree.mode = this.mode();
1765
- this.widgetTree.set(tree);
1766
- }
1767
- })();
1754
+ // Update widget tree only if changed (Angular effect already prevents unnecessary runs)
1755
+ const prev = this.widgetTree();
1756
+ if (!isEqual(prev, tree)) {
1757
+ this.widgetTree.set(tree);
1758
+ }
1768
1759
  }, ...(ngDevMode ? [{ debugName: "conversionEffect" }] : []));
1769
1760
  //#endregion
1770
1761
  //#region ---- Outputs ----
@@ -1807,32 +1798,6 @@ class AXPLayoutRendererComponent {
1807
1798
  }
1808
1799
  }, ...(ngDevMode ? [{ debugName: "#widgetStatusEffect" }] : []));
1809
1800
  }
1810
- async expressionEvaluator(expression, context) {
1811
- // Check if it's a form definition that needs conversion
1812
- if (this.isFormDefinition(expression)) {
1813
- return this.conversionService.convertFormDefinition(expression);
1814
- }
1815
- // Generate cache key using a more efficient method
1816
- const cacheKey = this.generateCacheKey(expression, context);
1817
- // Check cache first
1818
- if (this.expressionCache.has(cacheKey)) {
1819
- return this.expressionCache.get(cacheKey);
1820
- }
1821
- const scope = {
1822
- context: {
1823
- eval: (path) => get(context, path),
1824
- },
1825
- };
1826
- const result = await this.evaluatorService.evaluate(expression, scope);
1827
- // Cache result with LRU-like behavior
1828
- if (this.expressionCache.size > 50) {
1829
- // Clear half the cache when it gets too large
1830
- const keysToDelete = Array.from(this.expressionCache.keys()).slice(0, 25);
1831
- keysToDelete.forEach((key) => this.expressionCache.delete(key));
1832
- }
1833
- this.expressionCache.set(cacheKey, result);
1834
- return result;
1835
- }
1836
1801
  //#endregion
1837
1802
  //#region ---- Lifecycle Methods ----
1838
1803
  ngOnInit() {
@@ -1965,58 +1930,14 @@ class AXPLayoutRendererComponent {
1965
1930
  isFormDefinition(data) {
1966
1931
  return data && typeof data === 'object' && 'groups' in data && Array.isArray(data.groups);
1967
1932
  }
1968
- //#endregion
1969
- //#region ---- Utility Methods ----
1970
- /**
1971
- * Generate layout hash for change detection (short hash)
1972
- */
1973
- generateLayoutHash(layout, look) {
1974
- if (!layout)
1975
- return '';
1976
- // Generate short hash for large layout strings
1977
- const layoutStr = typeof layout === 'string' ? layout : JSON.stringify(layout);
1978
- const layoutHash = this.simpleHash(layoutStr);
1979
- return `${layoutHash}|${look}`;
1980
- }
1981
- /**
1982
- * Generate cache key for expression evaluation (short hash)
1983
- */
1984
- generateCacheKey(expression, context) {
1985
- // Use short hash for better performance
1986
- const exprStr = typeof expression === 'string' ? expression : JSON.stringify(expression);
1987
- const exprHash = this.simpleHash(exprStr);
1988
- const ctxHash = this.generateContextHash(context);
1989
- return `${exprHash}|${ctxHash}`;
1990
- }
1991
1933
  /**
1992
- * Generate a simple hash for context change detection
1934
+ * Type guard to check if the input is a widget node
1993
1935
  */
1994
- generateContextHash(context) {
1995
- if (!context || typeof context !== 'object') {
1996
- return String(context);
1997
- }
1998
- // Generate short hash for context
1999
- const keys = Object.keys(context).sort();
2000
- const contextStr = keys.map((key) => `${key}:${context[key]}`).join('|');
2001
- return this.simpleHash(contextStr);
2002
- }
2003
- /**
2004
- * Simple hash function for generating short keys
2005
- */
2006
- simpleHash(str) {
2007
- let hash = 0;
2008
- if (str.length === 0)
2009
- return hash.toString();
2010
- for (let i = 0; i < str.length; i++) {
2011
- const char = str.charCodeAt(i);
2012
- hash = (hash << 5) - hash + char;
2013
- hash = hash & hash; // Convert to 32-bit integer
2014
- }
2015
- // Convert to positive hex string
2016
- return Math.abs(hash).toString(16);
1936
+ isWidgetNode(data) {
1937
+ return data && typeof data === 'object' && 'type' in data && typeof data.type === 'string';
2017
1938
  }
2018
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2019
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.10", type: AXPLayoutRendererComponent, isStandalone: true, selector: "axp-layout-renderer", inputs: { layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: true, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { context: "contextChange", contextInitiated: "contextInitiated", validityChange: "validityChange" }, viewQueries: [{ propertyName: "form", first: true, predicate: AXFormComponent, descendants: true, isSignal: true }, { propertyName: "container", first: true, predicate: AXPWidgetContainerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
1939
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1940
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPLayoutRendererComponent, isStandalone: true, selector: "axp-layout-renderer", inputs: { layout: { classPropertyName: "layout", publicName: "layout", isSignal: true, isRequired: true, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { context: "contextChange", contextInitiated: "contextInitiated", validityChange: "validityChange" }, viewQueries: [{ propertyName: "form", first: true, predicate: AXFormComponent, descendants: true, isSignal: true }, { propertyName: "container", first: true, predicate: AXPWidgetContainerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
2020
1941
  <ax-form>
2021
1942
  <axp-widgets-container [context]="internalContext()" (onContextChanged)="handleContextChanged($event)">
2022
1943
  @if (widgetTree()) {
@@ -2024,9 +1945,9 @@ class AXPLayoutRendererComponent {
2024
1945
  }
2025
1946
  </axp-widgets-container>
2026
1947
  </ax-form>
2027
- `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i2.AXFormComponent, selector: "ax-form", inputs: ["labelMode", "look", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1948
+ `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXPWidgetCoreModule }, { kind: "component", type: i1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i2.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2028
1949
  }
2029
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPLayoutRendererComponent, decorators: [{
1950
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutRendererComponent, decorators: [{
2030
1951
  type: Component,
2031
1952
  args: [{ selector: 'axp-layout-renderer', standalone: true, imports: [CommonModule, AXPWidgetCoreModule, AXFormModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
2032
1953
  <ax-form>
@@ -2040,11 +1961,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImpo
2040
1961
  }], propDecorators: { layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: true }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }, { type: i0.Output, args: ["contextChange"] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: "look", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], contextInitiated: [{ type: i0.Output, args: ["contextInitiated"] }], validityChange: [{ type: i0.Output, args: ["validityChange"] }], form: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXFormComponent), { isSignal: true }] }], container: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPWidgetContainerComponent), { isSignal: true }] }] } });
2041
1962
 
2042
1963
  class LayoutBuilderModule {
2043
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: LayoutBuilderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2044
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.10", ngImport: i0, type: LayoutBuilderModule, imports: [CommonModule, AXPLayoutRendererComponent], exports: [AXPLayoutRendererComponent] }); }
2045
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: LayoutBuilderModule, providers: [AXPLayoutBuilderService], imports: [CommonModule, AXPLayoutRendererComponent] }); }
1964
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LayoutBuilderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1965
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.12", ngImport: i0, type: LayoutBuilderModule, imports: [CommonModule, AXPLayoutRendererComponent], exports: [AXPLayoutRendererComponent] }); }
1966
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LayoutBuilderModule, providers: [AXPLayoutBuilderService], imports: [CommonModule, AXPLayoutRendererComponent] }); }
2046
1967
  }
2047
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: LayoutBuilderModule, decorators: [{
1968
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: LayoutBuilderModule, decorators: [{
2048
1969
  type: NgModule,
2049
1970
  args: [{
2050
1971
  imports: [CommonModule, AXPLayoutRendererComponent],
@@ -2280,8 +2201,8 @@ class AXPDialogRendererComponent extends AXBasePageComponent {
2280
2201
  return undefined;
2281
2202
  }
2282
2203
  }
2283
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPDialogRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2284
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.10", type: AXPDialogRendererComponent, isStandalone: true, selector: "axp-dialog-renderer", inputs: { config: "config" }, outputs: { result: "result" }, viewQueries: [{ propertyName: "layoutRenderer", first: true, predicate: AXPLayoutRendererComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
2204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDialogRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPDialogRendererComponent, isStandalone: true, selector: "axp-dialog-renderer", inputs: { config: "config" }, outputs: { result: "result" }, viewQueries: [{ propertyName: "layoutRenderer", first: true, predicate: AXPLayoutRendererComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
2285
2206
  <div class="ax-p-4">
2286
2207
  <axp-layout-renderer
2287
2208
  [layout]="config.definition"
@@ -2331,7 +2252,7 @@ class AXPDialogRendererComponent extends AXBasePageComponent {
2331
2252
  </ax-footer>
2332
2253
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AXPLayoutRendererComponent, selector: "axp-layout-renderer", inputs: ["layout", "context", "look", "mode"], outputs: ["contextChange", "contextInitiated", "validityChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i3.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }] }); }
2333
2254
  }
2334
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.10", ngImport: i0, type: AXPDialogRendererComponent, decorators: [{
2255
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDialogRendererComponent, decorators: [{
2335
2256
  type: Component,
2336
2257
  args: [{
2337
2258
  selector: 'axp-dialog-renderer',