@acorex/platform 21.0.0-next.24 → 21.0.0-next.33

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 (118) hide show
  1. package/fesm2022/acorex-platform-auth.mjs +121 -27
  2. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  3. package/fesm2022/{acorex-platform-common-common-settings.provider-gyb6ohAE.mjs → acorex-platform-common-common-settings.provider-G9XcXXOG.mjs} +46 -4
  4. package/fesm2022/acorex-platform-common-common-settings.provider-G9XcXXOG.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-common.mjs +677 -267
  6. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-core.mjs +393 -111
  8. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-domain.mjs +554 -826
  10. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-builder.mjs +345 -59
  12. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  13. package/fesm2022/{acorex-platform-layout-components-binding-expression-editor-popup.component-Cb6Lk4Ch.mjs → acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs} +9 -9
  14. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-layout-components.mjs +3373 -872
  16. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-layout-designer.mjs +169 -154
  18. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-layout-entity.mjs +14645 -11533
  20. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  21. package/fesm2022/acorex-platform-layout-views.mjs +244 -170
  22. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  23. package/fesm2022/acorex-platform-layout-widget-core.mjs +367 -408
  24. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  25. package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-Dnbx_uY7.mjs → acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs} +10 -10
  26. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-B0omAUil.mjs → acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs} +30 -22
  28. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs.map +1 -0
  29. package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-D-HFZHNZ.mjs → acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs} +6 -7
  30. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs.map +1 -0
  31. package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-q30grR3z.mjs → acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs} +12 -12
  32. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs.map +1 -0
  33. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs +111 -0
  34. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs.map +1 -0
  35. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-BJh1QJqp.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-DmzNTYiS.mjs} +7 -7
  36. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-DmzNTYiS.mjs.map +1 -0
  37. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component--rzP7scF.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-BNG_588B.mjs} +5 -5
  38. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-BNG_588B.mjs.map +1 -0
  39. package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-DHlgsHa7.mjs → acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs} +6 -6
  40. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs.map +1 -0
  41. package/fesm2022/acorex-platform-layout-widgets.mjs +5924 -4049
  42. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  43. package/fesm2022/acorex-platform-native.mjs +8 -7
  44. package/fesm2022/acorex-platform-native.mjs.map +1 -1
  45. package/fesm2022/acorex-platform-runtime.mjs +220 -169
  46. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  47. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs +160 -0
  48. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs.map +1 -0
  49. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs +120 -0
  50. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs.map +1 -0
  51. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs → acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs} +15 -22
  52. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs.map +1 -0
  53. package/fesm2022/{acorex-platform-themes-default-error-401.component-D9NZ-6L_.mjs → acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs} +4 -4
  54. package/fesm2022/acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs.map +1 -0
  55. package/fesm2022/{acorex-platform-themes-default-error-404.component-CgB_tlPU.mjs → acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs} +4 -4
  56. package/fesm2022/acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs.map +1 -0
  57. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs +19 -0
  58. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs.map +1 -0
  59. package/fesm2022/acorex-platform-themes-default.mjs +1667 -61
  60. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  61. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-Cmju9l91.mjs → acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs} +6 -6
  62. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs.map +1 -0
  63. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-Cp5Th57U.mjs → acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs} +6 -6
  64. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs.map +1 -0
  65. package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +1 -1
  66. package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-column.component-BQxoUmYL.mjs → acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs} +4 -4
  67. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs.map +1 -0
  68. package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-CTGy2kjJ.mjs → acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs} +9 -9
  69. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs.map +1 -0
  70. package/fesm2022/acorex-platform-themes-shared.mjs +231 -227
  71. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  72. package/fesm2022/acorex-platform-workflow.mjs +208 -91
  73. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  74. package/fesm2022/acorex-platform.mjs.map +1 -1
  75. package/package.json +34 -34
  76. package/{auth/index.d.ts → types/acorex-platform-auth.d.ts} +14 -2
  77. package/{common/index.d.ts → types/acorex-platform-common.d.ts} +189 -16
  78. package/{core/index.d.ts → types/acorex-platform-core.d.ts} +178 -15
  79. package/{domain/index.d.ts → types/acorex-platform-domain.d.ts} +719 -413
  80. package/{layout/builder/index.d.ts → types/acorex-platform-layout-builder.d.ts} +91 -42
  81. package/{layout/components/index.d.ts → types/acorex-platform-layout-components.d.ts} +893 -138
  82. package/{layout/designer/index.d.ts → types/acorex-platform-layout-designer.d.ts} +9 -3
  83. package/{layout/entity/index.d.ts → types/acorex-platform-layout-entity.d.ts} +515 -26
  84. package/{layout/views/index.d.ts → types/acorex-platform-layout-views.d.ts} +44 -9
  85. package/{layout/widget-core/index.d.ts → types/acorex-platform-layout-widget-core.d.ts} +146 -95
  86. package/{layout/widgets/index.d.ts → types/acorex-platform-layout-widgets.d.ts} +506 -98
  87. package/{native/index.d.ts → types/acorex-platform-native.d.ts} +0 -7
  88. package/{runtime/index.d.ts → types/acorex-platform-runtime.d.ts} +237 -74
  89. package/{themes/default/index.d.ts → types/acorex-platform-themes-default.d.ts} +104 -4
  90. package/{workflow/index.d.ts → types/acorex-platform-workflow.d.ts} +33 -30
  91. package/fesm2022/acorex-platform-common-common-settings.provider-gyb6ohAE.mjs.map +0 -1
  92. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-Cb6Lk4Ch.mjs.map +0 -1
  93. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dnbx_uY7.mjs.map +0 -1
  94. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-B0omAUil.mjs.map +0 -1
  95. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-D-HFZHNZ.mjs.map +0 -1
  96. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-q30grR3z.mjs.map +0 -1
  97. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs +0 -111
  98. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs.map +0 -1
  99. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-BJh1QJqp.mjs.map +0 -1
  100. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component--rzP7scF.mjs.map +0 -1
  101. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-DHlgsHa7.mjs.map +0 -1
  102. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-D_ex0nL2.mjs +0 -160
  103. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-D_ex0nL2.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BhDLyC5P.mjs +0 -1611
  105. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BhDLyC5P.mjs.map +0 -1
  106. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs +0 -99
  107. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs.map +0 -1
  108. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs.map +0 -1
  109. package/fesm2022/acorex-platform-themes-default-error-401.component-D9NZ-6L_.mjs.map +0 -1
  110. package/fesm2022/acorex-platform-themes-default-error-404.component-CgB_tlPU.mjs.map +0 -1
  111. package/fesm2022/acorex-platform-themes-default-error-offline.component-DlUrqVmj.mjs +0 -19
  112. package/fesm2022/acorex-platform-themes-default-error-offline.component-DlUrqVmj.mjs.map +0 -1
  113. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-Cmju9l91.mjs.map +0 -1
  114. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-Cp5Th57U.mjs.map +0 -1
  115. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-BQxoUmYL.mjs.map +0 -1
  116. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-CTGy2kjJ.mjs.map +0 -1
  117. /package/{themes/shared/index.d.ts → types/acorex-platform-themes-shared.d.ts} +0 -0
  118. /package/{index.d.ts → types/acorex-platform.d.ts} +0 -0
@@ -1,10 +1,9 @@
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 { signal, computed, Injectable, InjectionToken, inject, ElementRef, effect, untracked, Injector, ChangeDetectorRef, ViewChild, Input, ChangeDetectionStrategy, Component, EventEmitter, Output, input, output, ViewContainerRef, Directive, NgModule } 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 { AXPContextStore, AXPDataSourceDefinitionProviderService, extractValue, AXPExpressionEvaluatorService, getSmart } from '@acorex/platform/core';
5
+ import { set, merge, cloneDeep, isNil, get, isEqual, isUndefined, isObjectLike, sum, isEmpty, isString } from 'lodash-es';
6
6
  import { Subject, BehaviorSubject, filter } from 'rxjs';
7
- import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
8
7
  import * as i1$1 from '@acorex/components/skeleton';
9
8
  import { AXSkeletonModule } from '@acorex/components/skeleton';
10
9
  import * as i2 from '@acorex/core/translation';
@@ -15,123 +14,6 @@ import { CommonModule } from '@angular/common';
15
14
  import { AXDataTableColumnComponent, AXBaseDataTable } from '@acorex/components/data-table';
16
15
  import { AXUnsubscriber } from '@acorex/core/utils';
17
16
 
18
- class AXPWidgetCoreContextChangeEvent {
19
- }
20
- const AXPWidgetCoreContextStore = signalStore(
21
- // Initial State
22
- withState(() => ({
23
- data: {}, // Shared context data
24
- state: 'initiated', // Current state
25
- initialSnapshot: {}, // Snapshot of the first initialized state
26
- previousSnapshot: {}, // Snapshot of the previous state
27
- lastChange: {
28
- state: 'initiated',
29
- }, // Last change event
30
- })),
31
- // Computed Signals
32
- withComputed(({ data, state, lastChange, initialSnapshot, previousSnapshot }) => ({
33
- isChanged: computed(() => state() === 'changed'),
34
- isReset: computed(() => state() === 'restored'),
35
- isInitiated: computed(() => state() === 'initiated'),
36
- isEmpty: computed(() => Object.keys(data()).length === 0),
37
- isDirty: computed(() => !isEqual(data(), previousSnapshot())),
38
- snapshot: computed(() => cloneDeep(data())), // Current data snapshot
39
- initial: computed(() => cloneDeep(initialSnapshot())), // Initial snapshot
40
- previous: computed(() => cloneDeep(previousSnapshot())), // Previous snapshot
41
- changeEvent: computed(() => lastChange()), // Reactive last change event
42
- })),
43
- // Methods for State Management
44
- withMethods((store) => ({
45
- // Update a specific value
46
- update(path, value) {
47
- const currentData = cloneDeep(store.data());
48
- const oldValue = get(currentData, path);
49
- // Skip if the value hasn't changed
50
- if (isEqual(oldValue, value)) {
51
- return;
52
- }
53
- // Update the value and prepare the change event
54
- const updatedData = setSmart(currentData, path, value);
55
- const changeEvent = {
56
- oldValue,
57
- newValue: value,
58
- path,
59
- state: 'changed',
60
- data: updatedData,
61
- };
62
- // Patch the state
63
- patchState(store, {
64
- previousSnapshot: store.snapshot(), // Save the previous state
65
- data: updatedData,
66
- state: 'changed',
67
- lastChange: changeEvent,
68
- });
69
- },
70
- patch(context, skipDirtyTracking = false) {
71
- const currentData = cloneDeep(store.data());
72
- // Update the value and prepare the change event
73
- const updatedData = { ...currentData, ...context };
74
- const changeEvent = {
75
- state: 'patch',
76
- data: updatedData,
77
- };
78
- // Patch the state
79
- patchState(store, {
80
- ...(skipDirtyTracking ? {} : { previousSnapshot: store.snapshot() }), // Only update previousSnapshot if not skipping dirty tracking
81
- data: updatedData,
82
- state: 'changed',
83
- lastChange: changeEvent,
84
- });
85
- },
86
- // Reset to the initial state
87
- reset() {
88
- const initialData = store.initial();
89
- const changeEvent = {
90
- oldValue: cloneDeep(store.data()), // Current data becomes old value
91
- newValue: cloneDeep(initialData), // Reset to the initial state
92
- path: '',
93
- state: 'restored',
94
- data: initialData,
95
- };
96
- patchState(store, {
97
- previousSnapshot: store.snapshot(), // Save the previous state
98
- data: initialData,
99
- state: 'restored',
100
- lastChange: changeEvent,
101
- });
102
- },
103
- // Initialize the state
104
- set(initialData) {
105
- const currentData = store.data();
106
- if (isEqual(currentData, initialData)) {
107
- return; // Skip if the current state matches the initial state
108
- }
109
- console.log('initialData', initialData);
110
- const changeEvent = {
111
- oldValue: null,
112
- newValue: cloneDeep(initialData),
113
- path: '',
114
- state: 'initiated',
115
- data: initialData,
116
- };
117
- patchState(store, {
118
- initialSnapshot: cloneDeep(initialData), // Save the initial state
119
- previousSnapshot: store.snapshot(), // Save the current state as the previous
120
- data: initialData,
121
- state: 'initiated',
122
- lastChange: changeEvent,
123
- });
124
- },
125
- // Get a specific value
126
- getValue(path) {
127
- return get(store.data(), path);
128
- },
129
- // Check if a path exists in the context
130
- hasValue(path) {
131
- return has(store.data(), path);
132
- },
133
- })));
134
-
135
17
  var AXPPageStatus;
136
18
  (function (AXPPageStatus) {
137
19
  // Idle statuses
@@ -171,17 +53,17 @@ class AXPWidgetCoreElement {
171
53
  }
172
54
  class AXPWidgetCoreService {
173
55
  constructor() {
174
- this.variables$ = signal({}, ...(ngDevMode ? [{ debugName: "variables$" }] : []));
175
- this.functions$ = signal({}, ...(ngDevMode ? [{ debugName: "functions$" }] : []));
56
+ this.variables$ = signal({}, ...(ngDevMode ? [{ debugName: "variables$" }] : /* istanbul ignore next */ []));
57
+ this.functions$ = signal({}, ...(ngDevMode ? [{ debugName: "functions$" }] : /* istanbul ignore next */ []));
176
58
  this.onRefresh = new Subject();
177
59
  this.widgets = new Map();
178
60
  this.onWidgetRegistered = new Subject();
179
- this.status$ = signal(AXPPageStatus.Rendering, ...(ngDevMode ? [{ debugName: "status$" }] : []));
61
+ this.status$ = signal(AXPPageStatus.Rendering, ...(ngDevMode ? [{ debugName: "status$" }] : /* istanbul ignore next */ []));
180
62
  this.status = this.status$.asReadonly();
181
63
  this.isBusy = computed(() => {
182
64
  return [AXPPageStatus.Processing, AXPPageStatus.Submitting, AXPPageStatus.Rendering].includes(this.status());
183
- }, ...(ngDevMode ? [{ debugName: "isBusy" }] : []));
184
- this.registeredWidgetsCount = signal(0, ...(ngDevMode ? [{ debugName: "registeredWidgetsCount" }] : []));
65
+ }, ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
66
+ this.registeredWidgetsCount = signal(0, ...(ngDevMode ? [{ debugName: "registeredWidgetsCount" }] : /* istanbul ignore next */ []));
185
67
  }
186
68
  get variables() {
187
69
  return this.variables$();
@@ -286,10 +168,10 @@ class AXPWidgetCoreService {
286
168
  return Array.from(this.widgets.keys());
287
169
  }
288
170
  ngOnDestroy() { }
289
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetCoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
290
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetCoreService }); }
171
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
172
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreService }); }
291
173
  }
292
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetCoreService, decorators: [{
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreService, decorators: [{
293
175
  type: Injectable
294
176
  }] });
295
177
 
@@ -319,6 +201,7 @@ const AXPWidgetsCatalog = {
319
201
  pageLayout: 'page-layout',
320
202
  repeaterLayout: 'repeater-layout',
321
203
  textBlockLayout: 'text-block-layout',
204
+ alertBoxLayout: 'alert-box-layout',
322
205
  fileUploader: 'file-uploader',
323
206
  fileTypeExtension: 'file-type-extension',
324
207
  map: 'map',
@@ -387,6 +270,7 @@ const AXPWidgetsCatalog = {
387
270
  advancedWeather: 'advanced-weather',
388
271
  metaData: 'meta-data-editor',
389
272
  templateEditor: 'template-box-editor',
273
+ templateContentEditor: 'template-content-editor',
390
274
  panel: 'panel',
391
275
  notification: 'notification',
392
276
  taskBoard: 'task-board',
@@ -398,7 +282,9 @@ const AXPWidgetsCatalog = {
398
282
  documentUploader: 'document-uploader',
399
283
  stepWizard: 'step-wizard',
400
284
  progressBar: 'progress-bar-editor',
401
- rate: 'rate-picker-editor'
285
+ rate: 'rate-picker-editor',
286
+ documentFileTypeFilter: 'document-file-type-filter',
287
+ entityDefinitionProvider: 'entity-definition-provider-editor',
402
288
  };
403
289
 
404
290
  function cloneProperty(property, values) {
@@ -453,7 +339,7 @@ function createBooleanProperty(ctor) {
453
339
  type: AXPWidgetsCatalog.toggle,
454
340
  },
455
341
  },
456
- visible: ctor.visible ?? true,
342
+ visible: !isNil(ctor.visible) ? ctor.visible : true,
457
343
  binding: {
458
344
  enabled: true,
459
345
  },
@@ -480,7 +366,7 @@ function createSelectProperty(ctor) {
480
366
  },
481
367
  },
482
368
  },
483
- visible: ctor.visible ?? true,
369
+ visible: !isNil(ctor.visible) ? ctor.visible : true,
484
370
  };
485
371
  }
486
372
  const AXP_WIDGET_TOKEN = new InjectionToken('AXP_WIDGET_TOKEN');
@@ -492,22 +378,22 @@ class AXPBaseWidgetComponent extends AXPWidgetCoreElement {
492
378
  this.token = inject(AXP_WIDGET_TOKEN);
493
379
  this.host = inject(ElementRef).nativeElement;
494
380
  this.layoutService = inject(AXPWidgetCoreService);
495
- this.contextService = inject(AXPWidgetCoreContextStore);
381
+ this.contextService = inject(AXPContextStore);
496
382
  this.config = this.token.config;
497
383
  this.node = this.token.node;
498
384
  this.name = this.token.node.name;
499
385
  this.component = this;
500
- this._options = signal(this.token.options ?? {}, ...(ngDevMode ? [{ debugName: "_options" }] : []));
386
+ this._options = signal(this.token.options ?? {}, ...(ngDevMode ? [{ debugName: "_options" }] : /* istanbul ignore next */ []));
501
387
  this.options = this._options.asReadonly();
502
388
  this.onOptionsChanged = new Subject();
503
- this._status = signal(AXPWidgetStatus.Rendering, ...(ngDevMode ? [{ debugName: "_status" }] : []));
389
+ this._status = signal(AXPWidgetStatus.Rendering, ...(ngDevMode ? [{ debugName: "_status" }] : /* istanbul ignore next */ []));
504
390
  this.status = this._status.asReadonly();
505
391
  this.onStatusChanged = new BehaviorSubject(this._status());
506
392
  this.#statusEffect = effect(() => {
507
393
  this.onStatusChanged.next(this.status());
508
- }, ...(ngDevMode ? [{ debugName: "#statusEffect" }] : []));
509
- this.isBusy = computed(() => [AXPWidgetStatus.Rendering, AXPWidgetStatus.Processing].includes(this.status()), ...(ngDevMode ? [{ debugName: "isBusy" }] : []));
510
- this._children = signal(this.token.node.children ?? [], ...(ngDevMode ? [{ debugName: "_children" }] : []));
394
+ }, ...(ngDevMode ? [{ debugName: "#statusEffect" }] : /* istanbul ignore next */ []));
395
+ this.isBusy = computed(() => [AXPWidgetStatus.Rendering, AXPWidgetStatus.Processing].includes(this.status()), ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
396
+ this._children = signal(this.token.node.children ?? [], ...(ngDevMode ? [{ debugName: "_children" }] : /* istanbul ignore next */ []));
511
397
  this.children = this._children.asReadonly();
512
398
  }
513
399
  get id() {
@@ -554,10 +440,10 @@ class AXPBaseWidgetComponent extends AXPWidgetCoreElement {
554
440
  this._children.set([...children]);
555
441
  }
556
442
  onAdded() { }
557
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
558
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBaseWidgetComponent }); }
443
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
444
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBaseWidgetComponent }); }
559
445
  }
560
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBaseWidgetComponent, decorators: [{
446
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBaseWidgetComponent, decorators: [{
561
447
  type: Injectable
562
448
  }] });
563
449
  class AXPLayoutBaseWidgetComponent extends AXPBaseWidgetComponent {
@@ -568,10 +454,10 @@ class AXPLayoutBaseWidgetComponent extends AXPBaseWidgetComponent {
568
454
  }
569
455
  super.ngOnInit();
570
456
  }
571
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPLayoutBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
572
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPLayoutBaseWidgetComponent }); }
457
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLayoutBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
458
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLayoutBaseWidgetComponent }); }
573
459
  }
574
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPLayoutBaseWidgetComponent, decorators: [{
460
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLayoutBaseWidgetComponent, decorators: [{
575
461
  type: Injectable
576
462
  }] });
577
463
  class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
@@ -582,11 +468,11 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
582
468
  this._isValueWidget = false;
583
469
  this.isValueWidget = () => this._isValueWidget;
584
470
  this.onValueChanged = new Subject();
585
- this.fullPath = signal(null, ...(ngDevMode ? [{ debugName: "fullPath" }] : []));
586
- this.parentPath = signal(null, ...(ngDevMode ? [{ debugName: "parentPath" }] : []));
471
+ this.fullPath = signal(null, ...(ngDevMode ? [{ debugName: "fullPath" }] : /* istanbul ignore next */ []));
472
+ this.parentPath = signal(null, ...(ngDevMode ? [{ debugName: "parentPath" }] : /* istanbul ignore next */ []));
587
473
  this.getValue = computed(() => {
588
474
  return this.fullPath() ? this.extractValue(this.fullPath()) : null;
589
- }, ...(ngDevMode ? [{ debugName: "getValue", equal: isEqual }] : [{ equal: isEqual }]));
475
+ }, { ...(ngDevMode ? { debugName: "getValue" } : /* istanbul ignore next */ {}), equal: isEqual });
590
476
  this.validationRules = computed(() => {
591
477
  const validationsRaw = this.options()['validations'];
592
478
  if (validationsRaw == null) {
@@ -599,7 +485,7 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
599
485
  message: c.message,
600
486
  options: c.options,
601
487
  }));
602
- }, ...(ngDevMode ? [{ debugName: "validationRules" }] : []));
488
+ }, ...(ngDevMode ? [{ debugName: "validationRules" }] : /* istanbul ignore next */ []));
603
489
  }
604
490
  ngOnInit() {
605
491
  this._isValueWidget = this.config.properties?.some((c) => c.name == 'path') ?? false;
@@ -629,7 +515,12 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
629
515
  if (isNil(value) && isNil(oldValue)) {
630
516
  return;
631
517
  }
632
- if (isEqual(oldValue, value)) {
518
+ // Reordered arrays must persist even when items are deep-equal (e.g. empty row objects).
519
+ const isArrayReorder = Array.isArray(oldValue) &&
520
+ Array.isArray(value) &&
521
+ oldValue.length === value.length &&
522
+ oldValue.some((v, i) => v !== value[i]);
523
+ if (!isArrayReorder && isEqual(oldValue, value)) {
633
524
  return;
634
525
  }
635
526
  if (this.fullPath()) {
@@ -676,23 +567,23 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
676
567
  this.setValue(e.value);
677
568
  }
678
569
  }
679
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPValueWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
680
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPValueWidgetComponent }); }
570
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPValueWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
571
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPValueWidgetComponent }); }
681
572
  }
682
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPValueWidgetComponent, decorators: [{
573
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPValueWidgetComponent, decorators: [{
683
574
  type: Injectable
684
575
  }] });
685
576
  class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
686
577
  constructor() {
687
578
  super(...arguments);
688
579
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
689
- this.textField = computed(() => this.options()['textField'] ?? 'title', ...(ngDevMode ? [{ debugName: "textField" }] : []));
690
- this.valueField = computed(() => this.options()['valueField'] ?? 'id', ...(ngDevMode ? [{ debugName: "valueField" }] : []));
580
+ this.textField = computed(() => this.options()['textField'] ?? 'title', ...(ngDevMode ? [{ debugName: "textField" }] : /* istanbul ignore next */ []));
581
+ this.valueField = computed(() => this.options()['valueField'] ?? 'id', ...(ngDevMode ? [{ debugName: "valueField" }] : /* istanbul ignore next */ []));
691
582
  this.textTemplate = computed(() => isNil(this.options()['textTemplate'])
692
583
  ? undefined
693
- : this.options()['textTemplate'].replace(/{/g, '{{').replace(/}/g, '}}'), ...(ngDevMode ? [{ debugName: "textTemplate" }] : []));
694
- this.dataSource = signal(convertArrayToDataSource([]), ...(ngDevMode ? [{ debugName: "dataSource" }] : []));
695
- this.selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
584
+ : this.options()['textTemplate'].replace(/{/g, '{{').replace(/}/g, '}}'), ...(ngDevMode ? [{ debugName: "textTemplate" }] : /* istanbul ignore next */ []));
585
+ this.dataSource = signal(convertArrayToDataSource([]), ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
586
+ this.selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : /* istanbul ignore next */ []));
696
587
  //#region ---- DataSource Loading Effect ----
697
588
  /**
698
589
  * Track the last loaded string dataSource reference to prevent infinite loops
@@ -772,7 +663,7 @@ class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
772
663
  this.dataSource.set(convertArrayToDataSource([]));
773
664
  }
774
665
  });
775
- }, ...(ngDevMode ? [{ debugName: "rf" }] : []));
666
+ }, ...(ngDevMode ? [{ debugName: "rf" }] : /* istanbul ignore next */ []));
776
667
  this.effect2 = effect(async () => {
777
668
  const value = this.getValue();
778
669
  const items = [];
@@ -783,7 +674,7 @@ class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
783
674
  items.push(await this.extractItem(value));
784
675
  }
785
676
  this.selectedItems.set(items.filter((c) => c != null));
786
- }, ...(ngDevMode ? [{ debugName: "effect2" }] : []));
677
+ }, ...(ngDevMode ? [{ debugName: "effect2" }] : /* istanbul ignore next */ []));
787
678
  }
788
679
  //#endregion
789
680
  async extractItem(item) {
@@ -808,10 +699,10 @@ class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
808
699
  [this.textField()]: item,
809
700
  };
810
701
  }
811
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPDataListWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
812
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPDataListWidgetComponent }); }
702
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataListWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
703
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataListWidgetComponent }); }
813
704
  }
814
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPDataListWidgetComponent, decorators: [{
705
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataListWidgetComponent, decorators: [{
815
706
  type: Injectable
816
707
  }] });
817
708
  class AXPColumnWidgetComponent {
@@ -829,10 +720,10 @@ class AXPColumnWidgetComponent {
829
720
  return this.rawValue;
830
721
  };
831
722
  }
832
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPColumnWidgetComponent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
833
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPColumnWidgetComponent }); }
723
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidgetComponent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
724
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidgetComponent }); }
834
725
  }
835
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPColumnWidgetComponent, decorators: [{
726
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidgetComponent, decorators: [{
836
727
  type: Injectable
837
728
  }] });
838
729
 
@@ -861,7 +752,7 @@ class AXPBoxModelLayoutWidgetComponent extends AXPLayoutBaseWidgetComponent {
861
752
  style['overflow-y'] = overflowY ?? '';
862
753
  style['direction'] = direction ?? '';
863
754
  return style;
864
- }, ...(ngDevMode ? [{ debugName: "hostBoxStyle" }] : []));
755
+ }, ...(ngDevMode ? [{ debugName: "hostBoxStyle" }] : /* istanbul ignore next */ []));
865
756
  this.blockStyle = computed(() => {
866
757
  const options = this.options();
867
758
  const style = { ...this.hostBoxStyle() };
@@ -878,47 +769,47 @@ class AXPBoxModelLayoutWidgetComponent extends AXPLayoutBaseWidgetComponent {
878
769
  style['height'] = height ?? '';
879
770
  style['max-height'] = maxHeight ?? '';
880
771
  return style;
881
- }, ...(ngDevMode ? [{ debugName: "blockStyle" }] : []));
772
+ }, ...(ngDevMode ? [{ debugName: "blockStyle" }] : /* istanbul ignore next */ []));
882
773
  this.inlineStyle = computed(() => {
883
774
  return { ...this.hostBoxStyle() };
884
- }, ...(ngDevMode ? [{ debugName: "inlineStyle" }] : []));
775
+ }, ...(ngDevMode ? [{ debugName: "inlineStyle" }] : /* istanbul ignore next */ []));
885
776
  this.blockClass = computed(() => {
886
777
  return {
887
778
  'ax-block': true,
888
779
  'ax-w-full': true,
889
780
  // 'ax-widget-outline': true,
890
781
  };
891
- }, ...(ngDevMode ? [{ debugName: "blockClass" }] : []));
782
+ }, ...(ngDevMode ? [{ debugName: "blockClass" }] : /* istanbul ignore next */ []));
892
783
  this.inlineClass = computed(() => {
893
784
  return {
894
785
  'ax-inline-block': true,
895
786
  };
896
- }, ...(ngDevMode ? [{ debugName: "inlineClass" }] : []));
787
+ }, ...(ngDevMode ? [{ debugName: "inlineClass" }] : /* istanbul ignore next */ []));
897
788
  }
898
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
899
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent }); }
789
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
790
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent }); }
900
791
  }
901
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, decorators: [{
792
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, decorators: [{
902
793
  type: Injectable
903
794
  }] });
904
795
 
905
796
  class AXPBlockBaseLayoutWidgetComponent extends AXPBoxModelLayoutWidgetComponent {
906
797
  constructor() {
907
798
  super(...arguments);
908
- this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
909
- this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
799
+ this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
800
+ this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
910
801
  }
911
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
912
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent }); }
802
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
803
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent }); }
913
804
  }
914
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, decorators: [{
805
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, decorators: [{
915
806
  type: Injectable
916
807
  }] });
917
808
 
918
809
  class AXPFlexBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent {
919
810
  constructor() {
920
811
  super(...arguments);
921
- this.flex = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flex" }] : []));
812
+ this.flex = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flex" }] : /* istanbul ignore next */ []));
922
813
  this.hostFlexStyle = computed(() => {
923
814
  const blockStyle = this.blockStyle();
924
815
  const style = { ...blockStyle };
@@ -957,45 +848,45 @@ class AXPFlexBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent
957
848
  style['gap'] = flex.gap;
958
849
  }
959
850
  return style;
960
- }, ...(ngDevMode ? [{ debugName: "hostFlexStyle" }] : []));
851
+ }, ...(ngDevMode ? [{ debugName: "hostFlexStyle" }] : /* istanbul ignore next */ []));
961
852
  this.hostFlexClass = computed(() => {
962
853
  return {
963
854
  ...this.blockClass(),
964
855
  'ax-flex': true,
965
856
  'ax-h-full': true,
966
857
  };
967
- }, ...(ngDevMode ? [{ debugName: "hostFlexClass" }] : []));
858
+ }, ...(ngDevMode ? [{ debugName: "hostFlexClass" }] : /* istanbul ignore next */ []));
968
859
  this.hostClass = computed(() => {
969
860
  return this.hostFlexClass();
970
- }, ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
861
+ }, ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
971
862
  this.hostStyle = computed(() => {
972
863
  return this.hostFlexStyle();
973
- }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
864
+ }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
974
865
  }
975
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
976
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent }); }
866
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
867
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent }); }
977
868
  }
978
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, decorators: [{
869
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, decorators: [{
979
870
  type: Injectable
980
871
  }] });
981
872
 
982
873
  class AXPInlineBaseLayoutWidgetComponent extends AXPBoxModelLayoutWidgetComponent {
983
874
  constructor() {
984
875
  super(...arguments);
985
- this.hostClass = computed(() => this.inlineClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
986
- this.hostStyle = computed(() => this.inlineStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
876
+ this.hostClass = computed(() => this.inlineClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
877
+ this.hostStyle = computed(() => this.inlineStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
987
878
  }
988
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
989
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent }); }
879
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
880
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent }); }
990
881
  }
991
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, decorators: [{
882
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, decorators: [{
992
883
  type: Injectable
993
884
  }] });
994
885
 
995
886
  class AXPFlexItemBaseLayoutWidgetComponent extends AXPInlineBaseLayoutWidgetComponent {
996
887
  constructor() {
997
888
  super(...arguments);
998
- this.flexItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flexItem" }] : []));
889
+ this.flexItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flexItem" }] : /* istanbul ignore next */ []));
999
890
  this.hostFlexItemStyle = computed(() => {
1000
891
  const inlineStyle = this.blockStyle();
1001
892
  const style = { ...inlineStyle };
@@ -1031,37 +922,37 @@ class AXPFlexItemBaseLayoutWidgetComponent extends AXPInlineBaseLayoutWidgetComp
1031
922
  style['align-self'] = fi.alignSelf;
1032
923
  }
1033
924
  return style;
1034
- }, ...(ngDevMode ? [{ debugName: "hostFlexItemStyle" }] : []));
925
+ }, ...(ngDevMode ? [{ debugName: "hostFlexItemStyle" }] : /* istanbul ignore next */ []));
1035
926
  this.hostFlexItemClass = computed(() => {
1036
927
  return {
1037
928
  ...this.blockClass(),
1038
929
  };
1039
- }, ...(ngDevMode ? [{ debugName: "hostFlexItemClass" }] : []));
930
+ }, ...(ngDevMode ? [{ debugName: "hostFlexItemClass" }] : /* istanbul ignore next */ []));
1040
931
  this.hostClass = computed(() => {
1041
932
  return this.hostFlexItemClass();
1042
- }, ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
933
+ }, ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1043
934
  this.hostStyle = computed(() => {
1044
935
  return this.hostFlexItemStyle();
1045
- }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
936
+ }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1046
937
  }
1047
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1048
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent }); }
938
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
939
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent }); }
1049
940
  }
1050
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, decorators: [{
941
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, decorators: [{
1051
942
  type: Injectable
1052
943
  }] });
1053
944
 
1054
945
  class AXPGridBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent {
1055
946
  constructor() {
1056
947
  super(...arguments);
1057
- this.grid = computed(() => this.options()?.['grid'], ...(ngDevMode ? [{ debugName: "grid" }] : []));
948
+ this.grid = computed(() => this.options()?.['grid'], ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
1058
949
  this.hostGridStyle = computed(() => {
1059
950
  const style = { ...this.inlineStyle() };
1060
951
  const g = this.grid()?.default;
1061
952
  if (g?.gap)
1062
953
  style['gap'] = g.gap;
1063
954
  return style;
1064
- }, ...(ngDevMode ? [{ debugName: "hostGridStyle" }] : []));
955
+ }, ...(ngDevMode ? [{ debugName: "hostGridStyle" }] : /* istanbul ignore next */ []));
1065
956
  this.hostGridClass = computed(() => {
1066
957
  const cls = {
1067
958
  ...this.inlineClass(),
@@ -1078,21 +969,21 @@ class AXPGridBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent
1078
969
  if (g?.autoFlow)
1079
970
  cls[`lg:ax-grid-flow-${g.autoFlow}`] = true;
1080
971
  return cls;
1081
- }, ...(ngDevMode ? [{ debugName: "hostGridClass" }] : []));
1082
- this.hostClass = computed(() => this.hostGridClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1083
- this.hostStyle = computed(() => this.hostGridStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
972
+ }, ...(ngDevMode ? [{ debugName: "hostGridClass" }] : /* istanbul ignore next */ []));
973
+ this.hostClass = computed(() => this.hostGridClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
974
+ this.hostStyle = computed(() => this.hostGridStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1084
975
  }
1085
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1086
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent }); }
976
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
977
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent }); }
1087
978
  }
1088
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, decorators: [{
979
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, decorators: [{
1089
980
  type: Injectable
1090
981
  }] });
1091
982
 
1092
983
  class AXPGridItemBaseLayoutWidgetComponent extends AXPFlexBaseLayoutWidgetComponent {
1093
984
  constructor() {
1094
985
  super(...arguments);
1095
- this.gridItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "gridItem" }] : []));
986
+ this.gridItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "gridItem" }] : /* istanbul ignore next */ []));
1096
987
  this.hostGridItemStyle = computed(() => {
1097
988
  const style = { ...this.hostFlexStyle() };
1098
989
  const g = this.gridItem();
@@ -1101,10 +992,13 @@ class AXPGridItemBaseLayoutWidgetComponent extends AXPFlexBaseLayoutWidgetCompon
1101
992
  if (g?.justifySelf)
1102
993
  style['justify-self'] = g.justifySelf;
1103
994
  return style;
1104
- }, ...(ngDevMode ? [{ debugName: "hostGridItemStyle" }] : []));
995
+ }, ...(ngDevMode ? [{ debugName: "hostGridItemStyle" }] : /* istanbul ignore next */ []));
1105
996
  this.hostGridItemClass = computed(() => {
1106
997
  const cls = { ...this.hostFlexClass() };
1107
998
  const g = this.gridItem();
999
+ // Mobile-first: full width on small screens so items stack vertically and don't overflow
1000
+ cls['ax-col-span-12'] = true;
1001
+ // Large screens: apply defined placement so multi-column layout works on desktop
1108
1002
  if (g?.colSpan)
1109
1003
  cls[`lg:ax-col-span-${g.colSpan}`] = true;
1110
1004
  if (g?.colStart)
@@ -1118,14 +1012,14 @@ class AXPGridItemBaseLayoutWidgetComponent extends AXPFlexBaseLayoutWidgetCompon
1118
1012
  if (g?.rowEnd)
1119
1013
  cls[`lg:ax-row-end-${g.rowEnd}`] = true;
1120
1014
  return cls;
1121
- }, ...(ngDevMode ? [{ debugName: "hostGridItemClass" }] : []));
1122
- this.hostClass = computed(() => this.hostGridItemClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1123
- this.hostStyle = computed(() => this.hostGridItemStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
1015
+ }, ...(ngDevMode ? [{ debugName: "hostGridItemClass" }] : /* istanbul ignore next */ []));
1016
+ this.hostClass = computed(() => this.hostGridItemClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1017
+ this.hostStyle = computed(() => this.hostGridItemStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1124
1018
  }
1125
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1126
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent }); }
1019
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1020
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent }); }
1127
1021
  }
1128
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, decorators: [{
1022
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, decorators: [{
1129
1023
  type: Injectable
1130
1024
  }] });
1131
1025
 
@@ -1134,27 +1028,27 @@ class AXPTableBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponen
1134
1028
  super(...arguments);
1135
1029
  this.hostTableClass = computed(() => ({
1136
1030
  ...this.blockClass(),
1137
- }), ...(ngDevMode ? [{ debugName: "hostTableClass" }] : []));
1031
+ }), ...(ngDevMode ? [{ debugName: "hostTableClass" }] : /* istanbul ignore next */ []));
1138
1032
  this.hostTableStyle = computed(() => {
1139
1033
  const style = { ...this.blockStyle() };
1140
1034
  style['overflow-x'] = 'auto';
1141
1035
  return style;
1142
- }, ...(ngDevMode ? [{ debugName: "hostTableStyle" }] : []));
1143
- this.hostClass = computed(() => this.hostTableClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1144
- this.hostStyle = computed(() => this.hostTableStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
1036
+ }, ...(ngDevMode ? [{ debugName: "hostTableStyle" }] : /* istanbul ignore next */ []));
1037
+ this.hostClass = computed(() => this.hostTableClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1038
+ this.hostStyle = computed(() => this.hostTableStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1145
1039
  }
1146
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1147
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent }); }
1040
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1041
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent }); }
1148
1042
  }
1149
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, decorators: [{
1043
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, decorators: [{
1150
1044
  type: Injectable
1151
1045
  }] });
1152
1046
 
1153
1047
  class AXPTableItemOpsBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent {
1154
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1155
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent }); }
1048
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1049
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent }); }
1156
1050
  }
1157
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, decorators: [{
1051
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, decorators: [{
1158
1052
  type: Injectable
1159
1053
  }] });
1160
1054
 
@@ -1164,57 +1058,105 @@ class AXPTableItemBaseLayoutWidgetComponent extends AXPTableItemOpsBaseLayoutWid
1164
1058
  this.colSpan = computed(() => {
1165
1059
  const v = this.options()?.colSpan;
1166
1060
  return v ? Math.max(1, v) : 1;
1167
- }, ...(ngDevMode ? [{ debugName: "colSpan" }] : []));
1061
+ }, ...(ngDevMode ? [{ debugName: "colSpan" }] : /* istanbul ignore next */ []));
1168
1062
  this.rowSpan = computed(() => {
1169
1063
  const v = this.options()?.rowSpan;
1170
1064
  return v ? Math.max(1, v) : 1;
1171
- }, ...(ngDevMode ? [{ debugName: "rowSpan" }] : []));
1172
- this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1173
- this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
1065
+ }, ...(ngDevMode ? [{ debugName: "rowSpan" }] : /* istanbul ignore next */ []));
1066
+ this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1067
+ this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1174
1068
  }
1175
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1176
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent }); }
1069
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1070
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent }); }
1177
1071
  }
1178
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, decorators: [{
1072
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, decorators: [{
1179
1073
  type: Injectable
1180
1074
  }] });
1181
1075
 
1076
+ //#region ---- Imports ----
1077
+ /**
1078
+ * Injection token for widget definition providers.
1079
+ * Modules register their widget providers using this token (multi: true).
1080
+ */
1081
+ const AXP_WIDGET_DEFINITION_PROVIDER = new InjectionToken('AXP_WIDGET_DEFINITION_PROVIDER', {
1082
+ factory: () => [],
1083
+ });
1084
+ //#endregion
1085
+
1086
+ //#region ---- Build widget map (shared with tooling / snapshot scripts) ----
1087
+ //TODO RECHECK THIS FUNCTION s.hosseini
1088
+ /**
1089
+ * Merges core + extended widgets the same way as AXPWidgetRegistryService.ensureBuilt().
1090
+ * Use with concrete providers (e.g. AXPCoreWidgetsProvider, AXPEntityWidgetsProvider) in Node scripts without DI.
1091
+ */
1092
+ function buildWidgetRegistryMapFromProviders(providers) {
1093
+ const types = new Map();
1094
+ const AXPExtendedWidgets = [];
1095
+ for (const provider of providers) {
1096
+ const widgets = provider.getWidgets?.() ?? [];
1097
+ for (const w of widgets) {
1098
+ types.set(w.name, w);
1099
+ }
1100
+ const extended = provider.getExtendedWidgets?.() ?? [];
1101
+ AXPExtendedWidgets.push(...extended);
1102
+ }
1103
+ for (const { parentName, widget } of AXPExtendedWidgets) {
1104
+ const parent = types.get(parentName);
1105
+ if (parent) {
1106
+ const merged = merge({}, parent, widget);
1107
+ merged.name = widget.name;
1108
+ types.set(merged.name, merged);
1109
+ }
1110
+ }
1111
+ return types;
1112
+ }
1113
+ //#endregion
1114
+ //#region ---- Widget Registry Service (Token-Based) ----
1115
+ /**
1116
+ * Aggregates widgets from all AXP_WIDGET_DEFINITION_PROVIDER instances.
1117
+ * Token-based like AXP_MENU_PROVIDER / AXP_PERMISSION_DEFINITION_PROVIDER / AXP_SETTING_DEFINITION_PROVIDER.
1118
+ * No separate registry - widgets come solely from providers.
1119
+ */
1182
1120
  class AXPWidgetRegistryService {
1183
- /**
1184
- *
1185
- */
1186
1121
  constructor() {
1187
- this.types = new Map();
1188
- AXPWidgetRegistryService.instance = this;
1189
- }
1190
- register(widget) {
1191
- this.types.set(widget.name, widget);
1122
+ this._providers = inject(AXP_WIDGET_DEFINITION_PROVIDER, { optional: true }) ?? [];
1123
+ this._types = null;
1192
1124
  }
1193
- extend(parentName, widget) {
1194
- const parentWidget = this.resolve(parentName);
1195
- const newWidget = merge({}, parentWidget, widget);
1196
- newWidget.name = widget.name;
1197
- this.register(newWidget);
1125
+ /**
1126
+ * Lazy-build widget map from all providers.
1127
+ */
1128
+ ensureBuilt() {
1129
+ if (this._types)
1130
+ return this._types;
1131
+ this._types = buildWidgetRegistryMapFromProviders(this._providers);
1132
+ return this._types;
1198
1133
  }
1199
1134
  resolve(name) {
1200
- const widget = this.types.get(name);
1135
+ const widget = this.ensureBuilt().get(name);
1201
1136
  if (!widget) {
1202
1137
  throw new Error(`Widget with name "${name}" does not exist.`);
1203
1138
  }
1204
1139
  return widget;
1205
1140
  }
1141
+ /**
1142
+ * Registered widget config when present; otherwise `undefined`. Does not throw — use when
1143
+ * {@link resolve}'s value may be a non-widget id (e.g. data-source row id in dynamic field configurator).
1144
+ */
1145
+ getOptional(name) {
1146
+ return this.ensureBuilt().get(name);
1147
+ }
1206
1148
  all() {
1207
- return Array.from(this.types.values());
1149
+ return Array.from(this.ensureBuilt().values());
1208
1150
  }
1209
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1210
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetRegistryService, providedIn: 'root' }); }
1151
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1152
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRegistryService, providedIn: 'root' }); }
1211
1153
  }
1212
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetRegistryService, decorators: [{
1154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRegistryService, decorators: [{
1213
1155
  type: Injectable,
1214
1156
  args: [{
1215
1157
  providedIn: 'root',
1216
1158
  }]
1217
- }], ctorParameters: () => [] });
1159
+ }] });
1218
1160
 
1219
1161
  class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1220
1162
  constructor() {
@@ -1222,8 +1164,8 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1222
1164
  this.widgetRegistery = inject(AXPWidgetRegistryService);
1223
1165
  this.grid = inject(AXBaseDataTable);
1224
1166
  this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
1225
- this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : []));
1226
- this.loadingRow = signal(null, ...(ngDevMode ? [{ debugName: "loadingRow" }] : []));
1167
+ this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
1168
+ this.loadingRow = signal(null, ...(ngDevMode ? [{ debugName: "loadingRow" }] : /* istanbul ignore next */ []));
1227
1169
  this.rowInjectorsCache = new Map();
1228
1170
  this.hasExpressions = false;
1229
1171
  this.pendingEvaluations = new Set();
@@ -1464,8 +1406,8 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1464
1406
  }
1465
1407
  return rowInjector;
1466
1408
  }
1467
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetColumnRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1468
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", 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: [
1409
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetColumnRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1410
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", 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: [
1469
1411
  AXPWidgetCoreService,
1470
1412
  { provide: AXDataTableColumnComponent, useExisting: AXPWidgetColumnRendererComponent },
1471
1413
  ], viewQueries: [{ propertyName: "_contentFooterTemplate", first: true, predicate: ["footer"], descendants: true }, { propertyName: "_contentCellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "_contentHeaderTemplate", first: true, predicate: ["header"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
@@ -1499,9 +1441,9 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1499
1441
  </div>
1500
1442
  </ng-template>
1501
1443
  <ng-template #footer></ng-template>
1502
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1444
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1503
1445
  }
1504
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetColumnRendererComponent, decorators: [{
1446
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetColumnRendererComponent, decorators: [{
1505
1447
  type: Component,
1506
1448
  args: [{
1507
1449
  selector: 'axp-widget-column-renderer',
@@ -1581,15 +1523,15 @@ class AXPWidgetContainerComponent {
1581
1523
  this.builderService.setFunctions(v);
1582
1524
  }
1583
1525
  constructor() {
1584
- this.contextService = inject(AXPWidgetCoreContextStore);
1526
+ this.contextService = inject(AXPContextStore);
1585
1527
  this.builderService = inject(AXPWidgetCoreService);
1586
1528
  this.onContextChanged = new EventEmitter();
1587
1529
  this.status = computed(() => {
1588
1530
  return this.builderService.status();
1589
- }, ...(ngDevMode ? [{ debugName: "status" }] : []));
1531
+ }, ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
1590
1532
  this.isBusy = computed(() => {
1591
1533
  return this.builderService.isBusy();
1592
- }, ...(ngDevMode ? [{ debugName: "isBusy" }] : []));
1534
+ }, ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
1593
1535
  effect(() => {
1594
1536
  if (this.contextService.isChanged()) {
1595
1537
  this.onContextChanged.emit(this.contextService.changeEvent());
@@ -1602,17 +1544,17 @@ class AXPWidgetContainerComponent {
1602
1544
  find(name) {
1603
1545
  return this.builderService.waitForWidget(name);
1604
1546
  }
1605
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1606
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AXPWidgetContainerComponent, isStandalone: false, selector: "axp-widgets-container", inputs: { context: "context", functions: "functions" }, outputs: { onContextChanged: "onContextChanged" }, host: { styleAttribute: "display: contents;" }, providers: [AXPWidgetCoreService, AXPWidgetCoreContextStore], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1547
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1548
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPWidgetContainerComponent, isStandalone: false, selector: "axp-widgets-container", inputs: { context: "context", functions: "functions" }, outputs: { onContextChanged: "onContextChanged" }, host: { styleAttribute: "display: contents;" }, providers: [AXPWidgetCoreService, AXPContextStore], ngImport: i0, template: `<ng-content></ng-content>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1607
1549
  }
1608
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetContainerComponent, decorators: [{
1550
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetContainerComponent, decorators: [{
1609
1551
  type: Component,
1610
1552
  args: [{
1611
1553
  selector: 'axp-widgets-container',
1612
1554
  template: `<ng-content></ng-content>`,
1613
1555
  changeDetection: ChangeDetectionStrategy.OnPush,
1614
1556
  host: { style: 'display: contents;' },
1615
- providers: [AXPWidgetCoreService, AXPWidgetCoreContextStore],
1557
+ providers: [AXPWidgetCoreService, AXPContextStore],
1616
1558
  standalone: false,
1617
1559
  }]
1618
1560
  }], ctorParameters: () => [], propDecorators: { onContextChanged: [{
@@ -1624,12 +1566,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
1624
1566
  }] } });
1625
1567
 
1626
1568
  class AXPWidgetPlaceholderComponent {
1627
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1628
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AXPWidgetPlaceholderComponent, isStandalone: true, selector: "axp-widget-placeholder", ngImport: i0, template: `<div>
1569
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1570
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPWidgetPlaceholderComponent, isStandalone: true, selector: "axp-widget-placeholder", ngImport: i0, template: `<div>
1629
1571
  <ax-skeleton class="ax-w-full ax-h-10 ax-rounded-md"></ax-skeleton>
1630
1572
  </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1631
1573
  }
1632
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetPlaceholderComponent, decorators: [{
1574
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetPlaceholderComponent, decorators: [{
1633
1575
  type: Component,
1634
1576
  args: [{
1635
1577
  selector: 'axp-widget-placeholder',
@@ -1646,11 +1588,11 @@ class AXPWidgetRendererDirective {
1646
1588
  //#endregion
1647
1589
  //#endregion
1648
1590
  constructor() {
1649
- this.parentNode = input(...(ngDevMode ? [undefined, { debugName: "parentNode" }] : []));
1650
- this.index = input(...(ngDevMode ? [undefined, { debugName: "index" }] : []));
1651
- this.mode = input.required(...(ngDevMode ? [{ debugName: "mode" }] : []));
1652
- this.node = input.required(...(ngDevMode ? [{ debugName: "node" }] : []));
1653
- this._options = signal({}, ...(ngDevMode ? [{ debugName: "_options" }] : []));
1591
+ this.parentNode = input(...(ngDevMode ? [undefined, { debugName: "parentNode" }] : /* istanbul ignore next */ []));
1592
+ this.index = input(...(ngDevMode ? [undefined, { debugName: "index" }] : /* istanbul ignore next */ []));
1593
+ this.mode = input.required(...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1594
+ this.node = input.required(...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
1595
+ this._options = signal({}, ...(ngDevMode ? [{ debugName: "_options" }] : /* istanbul ignore next */ []));
1654
1596
  this.options = this._options.asReadonly();
1655
1597
  this.onOptionsChanged = output();
1656
1598
  this.onValueChanged = output();
@@ -1659,22 +1601,22 @@ class AXPWidgetRendererDirective {
1659
1601
  /**
1660
1602
  * Signal that emits the component reference when it's ready
1661
1603
  */
1662
- this._componentRefSignal = signal(null, ...(ngDevMode ? [{ debugName: "_componentRefSignal" }] : []));
1604
+ this._componentRefSignal = signal(null, ...(ngDevMode ? [{ debugName: "_componentRefSignal" }] : /* istanbul ignore next */ []));
1663
1605
  this.componentRefSignal = this._componentRefSignal.asReadonly();
1664
1606
  //#endregion
1665
1607
  //#region ---- Properties ----
1666
- this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : []));
1608
+ this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
1667
1609
  this.injector = inject(Injector);
1668
1610
  this.builderService = inject(AXPWidgetCoreService);
1669
- this.contextService = inject(AXPWidgetCoreContextStore);
1611
+ this.contextService = inject(AXPContextStore);
1670
1612
  this.widgetRegistery = inject(AXPWidgetRegistryService);
1671
1613
  this.unsubscriber = inject(AXUnsubscriber);
1672
1614
  this.translateService = inject(AXTranslationService);
1673
1615
  this.widgetService = inject(AXPWidgetRegistryService);
1674
1616
  this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
1675
1617
  this.viewContainerRef = inject(ViewContainerRef);
1676
- this.isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
1677
- this.isVisible = signal(true, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
1618
+ this.isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
1619
+ this.isVisible = signal(true, ...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
1678
1620
  this.expressionEvaluators = new Map();
1679
1621
  this.renderTimeoutId = null;
1680
1622
  this.hasInitialRender = false;
@@ -1852,77 +1794,88 @@ class AXPWidgetRendererDirective {
1852
1794
  }
1853
1795
  return false;
1854
1796
  }
1797
+ /**
1798
+ * True when a context store path used in an expression (`context.eval`, `context.options`) is
1799
+ * affected by `changedPath`.
1800
+ */
1801
+ contextStorePathDependsOnChangedPath(evalPath, changedPath) {
1802
+ const normalizePath = (p) => {
1803
+ if (!p)
1804
+ return p;
1805
+ const parts = p.split('.');
1806
+ const last = parts[parts.length - 1];
1807
+ if (last && last.endsWith('Id')) {
1808
+ parts.splice(parts.length - 1, 1, last.slice(0, -2), 'id');
1809
+ }
1810
+ return parts.join('.');
1811
+ };
1812
+ const isSegmentSuffix = (a, b) => {
1813
+ if (!a || !b)
1814
+ return false;
1815
+ const pa = a.split('.');
1816
+ const pb = b.split('.');
1817
+ if (pb.length > pa.length)
1818
+ return false;
1819
+ for (let i = 1; i <= pb.length; i++) {
1820
+ if (pa[pa.length - i] !== pb[pb.length - i])
1821
+ return false;
1822
+ }
1823
+ return true;
1824
+ };
1825
+ const evalNorm = normalizePath(evalPath);
1826
+ const changedNorm = normalizePath(changedPath);
1827
+ const rawMatch = evalPath === changedPath ||
1828
+ evalPath.startsWith(changedPath + '.') ||
1829
+ changedPath.startsWith(evalPath + '.') ||
1830
+ isSegmentSuffix(evalPath, changedPath) ||
1831
+ isSegmentSuffix(changedPath, evalPath);
1832
+ const normMatch = evalNorm === changedNorm ||
1833
+ evalNorm.startsWith(changedNorm + '.') ||
1834
+ changedNorm.startsWith(evalNorm + '.') ||
1835
+ isSegmentSuffix(evalNorm, changedNorm) ||
1836
+ isSegmentSuffix(changedNorm, evalNorm);
1837
+ if (rawMatch || normMatch) {
1838
+ return true;
1839
+ }
1840
+ return this.isPathAlias(evalPath, changedPath);
1841
+ }
1842
+ /**
1843
+ * Whether an expression template string reads context store paths affected by `changedPath`.
1844
+ */
1845
+ expressionTextDependsOnContextPath(expressionValue, changedPath) {
1846
+ const contextEvalRegex = /context\.eval\(['"]([^'\"]+)['"]\)/g;
1847
+ let match;
1848
+ while ((match = contextEvalRegex.exec(expressionValue)) !== null) {
1849
+ if (this.contextStorePathDependsOnChangedPath(match[1], changedPath)) {
1850
+ return true;
1851
+ }
1852
+ }
1853
+ const contextOptionsQuoted = /context\.options\(\s*['"]([^'"]*)['"]\s*\)/g;
1854
+ while ((match = contextOptionsQuoted.exec(expressionValue)) !== null) {
1855
+ const sub = match[1];
1856
+ const evalPath = sub === '' ? 'options' : `options.${sub}`;
1857
+ if (this.contextStorePathDependsOnChangedPath(evalPath, changedPath)) {
1858
+ return true;
1859
+ }
1860
+ }
1861
+ const contextOptionsEmpty = /context\.options\(\s*\)/g;
1862
+ while ((match = contextOptionsEmpty.exec(expressionValue)) !== null) {
1863
+ if (this.contextStorePathDependsOnChangedPath('options', changedPath)) {
1864
+ return true;
1865
+ }
1866
+ }
1867
+ return false;
1868
+ }
1855
1869
  hasExpressionDependency(changedPath) {
1856
- // Check if any cached expressions depend on the changed path
1857
1870
  for (const [path, evaluator] of this.expressionEvaluators) {
1858
- // Check if the expression path itself contains the changed path
1859
1871
  if (path.includes(changedPath)) {
1860
1872
  return true;
1861
1873
  }
1862
- // Parse the actual expression content to check for context.eval() calls
1863
- // We need to get the original expression string to analyze it
1864
1874
  const node = this.node();
1865
1875
  const expressionValue = this.getExpressionValueFromNode(node, path);
1866
1876
  if (expressionValue && typeof expressionValue === 'string') {
1867
- // Look for context.eval() calls that reference the changed path
1868
- const contextEvalRegex = /context\.eval\(['"]([^'\"]+)['"]\)/g;
1869
- let match;
1870
- while ((match = contextEvalRegex.exec(expressionValue)) !== null) {
1871
- const evalPath = match[1];
1872
- // Normalize Id-suffixed segments to dot-id form (e.g., 'typeId' -> 'type.id', 'person.typeId' -> 'person.type.id')
1873
- const normalizePath = (p) => {
1874
- if (!p)
1875
- return p;
1876
- const parts = p.split('.');
1877
- const last = parts[parts.length - 1];
1878
- if (last && last.endsWith('Id')) {
1879
- parts.splice(parts.length - 1, 1, last.slice(0, -2), 'id');
1880
- }
1881
- return parts.join('.');
1882
- };
1883
- const isSegmentSuffix = (a, b) => {
1884
- if (!a || !b)
1885
- return false;
1886
- const pa = a.split('.');
1887
- const pb = b.split('.');
1888
- if (pb.length > pa.length)
1889
- return false;
1890
- for (let i = 1; i <= pb.length; i++) {
1891
- if (pa[pa.length - i] !== pb[pb.length - i])
1892
- return false;
1893
- }
1894
- return true;
1895
- };
1896
- const evalNorm = normalizePath(evalPath);
1897
- const changedNorm = normalizePath(changedPath);
1898
- // Debug log for dependency check
1899
- // console.log(
1900
- // `🧭 [${this.node().type}] dep-check expr='${path}', changed='${changedPath}', eval='${evalPath}', evalNorm='${evalNorm}', changedNorm='${changedNorm}'`,
1901
- // );
1902
- // Generic direct and hierarchical dependency checks (raw and normalized)
1903
- const rawMatch = evalPath === changedPath ||
1904
- evalPath.startsWith(changedPath + '.') ||
1905
- changedPath.startsWith(evalPath + '.') ||
1906
- isSegmentSuffix(evalPath, changedPath) ||
1907
- isSegmentSuffix(changedPath, evalPath);
1908
- const normMatch = evalNorm === changedNorm ||
1909
- evalNorm.startsWith(changedNorm + '.') ||
1910
- changedNorm.startsWith(evalNorm + '.') ||
1911
- isSegmentSuffix(evalNorm, changedNorm) ||
1912
- isSegmentSuffix(changedNorm, evalNorm);
1913
- if (rawMatch || normMatch) {
1914
- // console.log(
1915
- // `🔍 [${this.node().type}] Expression '${path}' depends on '${changedPath}' via context.eval('${evalPath}') (generic match)`,
1916
- // );
1917
- return true;
1918
- }
1919
- // Check for path aliases/mappings (e.g., typeId.id <-> type.id)
1920
- if (this.isPathAlias(evalPath, changedPath)) {
1921
- // console.log(
1922
- // `🔍 [${this.node().type}] Expression '${path}' depends on '${changedPath}' via context.eval('${evalPath}') (path alias)`,
1923
- // );
1924
- return true;
1925
- }
1877
+ if (this.expressionTextDependsOnContextPath(expressionValue, changedPath)) {
1878
+ return true;
1926
1879
  }
1927
1880
  }
1928
1881
  }
@@ -2009,20 +1962,8 @@ class AXPWidgetRendererDirective {
2009
1962
  const visibility = node.options?.['visible'] || this.mergedOptions()?.visible;
2010
1963
  if (!visibility || typeof visibility !== 'string')
2011
1964
  return false;
2012
- // Check if visibility expression depends on the changed path
2013
1965
  if (this.expressionEvaluator.isExpression(visibility)) {
2014
- // Parse the visibility expression to check for context.eval() calls
2015
- const contextEvalRegex = /context\.eval\(['"]([^'\"]+)['"]\)/g;
2016
- let match;
2017
- while ((match = contextEvalRegex.exec(visibility)) !== null) {
2018
- const evalPath = match[1];
2019
- // Check for direct or hierarchical dependency
2020
- if (evalPath === changedPath ||
2021
- evalPath.startsWith(changedPath + '.') ||
2022
- changedPath.startsWith(evalPath + '.')) {
2023
- return true;
2024
- }
2025
- }
1966
+ return this.expressionTextDependsOnContextPath(visibility, changedPath);
2026
1967
  }
2027
1968
  return false;
2028
1969
  }
@@ -2438,6 +2379,17 @@ class AXPWidgetRendererDirective {
2438
2379
  isDirty: () => {
2439
2380
  return this.contextService.isDirty();
2440
2381
  },
2382
+ /**
2383
+ * Host/widget-under-edit `options` from the shared context store (same values as
2384
+ * `context.eval('options' + (path ? '.' + path : ''))`), not `widget.options` on the nested
2385
+ * property field instance. Uses one `getValue` so smart-path behavior matches `context.eval`.
2386
+ */
2387
+ options: (path) => {
2388
+ if (path == null || path === '') {
2389
+ return this.contextService.getValue('options');
2390
+ }
2391
+ return this.contextService.getValue(`options.${path}`);
2392
+ },
2441
2393
  };
2442
2394
  }
2443
2395
  getEventScope() {
@@ -2476,6 +2428,16 @@ class AXPWidgetRendererDirective {
2476
2428
  }
2477
2429
  getWidgetScope() {
2478
2430
  return {
2431
+ /** Resolved options for this renderer's widget instance (not the host / property-viewer target). */
2432
+ options: (path) => {
2433
+ const opts = this.instance && typeof this.instance.options === 'function'
2434
+ ? this.instance.options()
2435
+ : this.mergedOptions();
2436
+ if (path == null || path === '') {
2437
+ return opts;
2438
+ }
2439
+ return getSmart(opts, path);
2440
+ },
2479
2441
  call: (name, ...args) => {
2480
2442
  this.instance.call(name, ...args);
2481
2443
  },
@@ -2581,14 +2543,14 @@ class AXPWidgetRendererDirective {
2581
2543
  // console.error('Error evaluating action expression:', templateExpression, error);
2582
2544
  }
2583
2545
  }
2584
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetRendererDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2585
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.16", 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: [
2546
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRendererDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2547
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", 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: [
2586
2548
  {
2587
2549
  provide: AXUnsubscriber,
2588
2550
  },
2589
2551
  ], exportAs: ["widgetRenderer"], usesOnChanges: true, ngImport: i0 }); }
2590
2552
  }
2591
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetRendererDirective, decorators: [{
2553
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRendererDirective, decorators: [{
2592
2554
  type: Directive,
2593
2555
  args: [{
2594
2556
  selector: '[axp-widget-renderer]',
@@ -2604,63 +2566,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2604
2566
 
2605
2567
  const COMPONENTS = [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective];
2606
2568
  class AXPWidgetCoreModule {
2607
- static forRoot(config) {
2608
- return {
2609
- ngModule: AXPWidgetCoreModule,
2610
- providers: [
2611
- {
2612
- provide: 'AXPWidgetCoreModuleFactory',
2613
- useFactory: (registry) => async () => {
2614
- await Promise.all(config?.widgets?.map((w) => Promise.resolve(registry.register(w))) || []);
2615
- await Promise.all(config?.extendedWidgets?.map((ew) => Promise.resolve(registry.extend(ew.parentName, ew.widget))) || []);
2616
- },
2617
- deps: [AXPWidgetRegistryService],
2618
- multi: true,
2619
- },
2620
- ],
2621
- };
2622
- }
2623
- static forChild(config) {
2624
- return {
2625
- ngModule: AXPWidgetCoreModule,
2626
- providers: [
2627
- {
2628
- provide: 'AXPWidgetCoreModuleFactory',
2629
- useFactory: (registry) => async () => {
2630
- await Promise.all(config?.widgets?.map((w) => Promise.resolve(registry.register(w))) || []);
2631
- await Promise.all(config?.extendedWidgets?.map((ew) => Promise.resolve(registry.extend(ew.parentName, ew.widget))) || []);
2632
- },
2633
- deps: [AXPWidgetRegistryService],
2634
- multi: true,
2635
- },
2636
- ],
2637
- };
2638
- }
2639
- /**
2640
- * @ignore
2641
- */
2642
- constructor(instances) {
2643
- instances?.forEach((f) => {
2644
- f();
2645
- });
2646
- }
2647
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetCoreModule, deps: [{ token: 'AXPWidgetCoreModuleFactory', optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
2648
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetCoreModule, declarations: [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective], imports: [CommonModule, PortalModule, AXSkeletonModule, CommonModule, AXTranslationModule], exports: [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective] }); }
2649
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetCoreModule, imports: [CommonModule, PortalModule, AXSkeletonModule, CommonModule, AXTranslationModule] }); }
2569
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2570
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreModule, declarations: [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective], imports: [CommonModule, PortalModule, AXSkeletonModule, AXTranslationModule], exports: [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective] }); }
2571
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreModule, imports: [CommonModule, PortalModule, AXSkeletonModule, AXTranslationModule] }); }
2650
2572
  }
2651
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AXPWidgetCoreModule, decorators: [{
2573
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreModule, decorators: [{
2652
2574
  type: NgModule,
2653
2575
  args: [{
2654
- imports: [CommonModule, PortalModule, AXSkeletonModule, CommonModule, AXTranslationModule],
2576
+ imports: [CommonModule, PortalModule, AXSkeletonModule, AXTranslationModule],
2655
2577
  exports: [...COMPONENTS],
2656
2578
  declarations: [...COMPONENTS],
2579
+ providers: [],
2657
2580
  }]
2658
- }], ctorParameters: () => [{ type: undefined, decorators: [{
2659
- type: Optional
2660
- }, {
2661
- type: Inject,
2662
- args: ['AXPWidgetCoreModuleFactory']
2663
- }] }] });
2581
+ }] });
2664
2582
 
2665
2583
  class AXPPropertyEditorHelper {
2666
2584
  static expandShorthand(values) {
@@ -2944,6 +2862,13 @@ class AXPWidgetSerializationHelper {
2944
2862
  }
2945
2863
  //#endregion
2946
2864
 
2865
+ /** Normalizes widget categories to an array for iteration and serialization. */
2866
+ function normalizeWidgetCategories(categories) {
2867
+ if (categories == null) {
2868
+ return [];
2869
+ }
2870
+ return Array.isArray(categories) ? categories : [categories];
2871
+ }
2947
2872
  const AXP_WIDGETS_LAYOUT_CATEGORY = {
2948
2873
  name: 'layout',
2949
2874
  order: 1,
@@ -2964,11 +2889,18 @@ const AXP_WIDGETS_ADVANCE_CATEGORY = {
2964
2889
  order: 4,
2965
2890
  title: 'Advance',
2966
2891
  };
2892
+ /** Widgets exposed to AI assistants for structured rendering (see Widgets:GetForAI). */
2893
+ const AXP_WIDGETS_AI_CATEGORY = {
2894
+ name: 'ai',
2895
+ order: 5,
2896
+ title: 'AI',
2897
+ };
2967
2898
  const AXP_WIDGETS_CATEGORIES = [
2968
2899
  AXP_WIDGETS_LAYOUT_CATEGORY,
2969
2900
  AXP_WIDGETS_EDITOR_CATEGORY,
2970
2901
  AXP_WIDGETS_ACTION_CATEGORY,
2971
2902
  AXP_WIDGETS_ADVANCE_CATEGORY,
2903
+ AXP_WIDGETS_AI_CATEGORY,
2972
2904
  ];
2973
2905
 
2974
2906
  var AXPWidgetGroupEnum;
@@ -2983,9 +2915,36 @@ var AXPWidgetGroupEnum;
2983
2915
  AXPWidgetGroupEnum["UtilityWidget"] = "utility-widget";
2984
2916
  })(AXPWidgetGroupEnum || (AXPWidgetGroupEnum = {}));
2985
2917
 
2918
+ //#region ---- Helpers ----
2919
+ /**
2920
+ * True when the widget declares the AI category (see {@link AXP_WIDGETS_AI_CATEGORY}).
2921
+ */
2922
+ function hasAiWidgetCategory(config) {
2923
+ return normalizeWidgetCategories(config.categories).some((c) => c.name === AXP_WIDGETS_AI_CATEGORY.name);
2924
+ }
2925
+ //#endregion
2926
+ //#region ---- Public API ----
2927
+ /**
2928
+ * Resolves AI catalog visibility using {@link AXPWidgetConfig.aiCatalog} and the AI widget category.
2929
+ * - `exclude`: never listed.
2930
+ * - `include`: always listed (override when the widget cannot declare the AI category yet).
2931
+ * - `inherit` / omitted: listed only if {@link hasAiWidgetCategory} is true.
2932
+ */
2933
+ function isWidgetAiCatalogIncluded(config) {
2934
+ const mode = config.aiCatalog ?? 'inherit';
2935
+ if (mode === 'exclude') {
2936
+ return false;
2937
+ }
2938
+ if (mode === 'include') {
2939
+ return true;
2940
+ }
2941
+ return hasAiWidgetCategory(config);
2942
+ }
2943
+ //#endregion
2944
+
2986
2945
  /**
2987
2946
  * Generated bundle index. Do not edit.
2988
2947
  */
2989
2948
 
2990
- 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, AXPWidgetSerializationHelper, 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 };
2949
+ export { AXPBaseWidgetComponent, AXPBlockBaseLayoutWidgetComponent, AXPBoxModelLayoutWidgetComponent, AXPColumnWidgetComponent, AXPDataListWidgetComponent, AXPFlexBaseLayoutWidgetComponent, AXPFlexItemBaseLayoutWidgetComponent, AXPGridBaseLayoutWidgetComponent, AXPGridItemBaseLayoutWidgetComponent, AXPInlineBaseLayoutWidgetComponent, AXPLayoutBaseWidgetComponent, AXPPageStatus, AXPPropertyEditorHelper, AXPTableBaseLayoutWidgetComponent, AXPTableItemBaseLayoutWidgetComponent, AXPTableItemOpsBaseLayoutWidgetComponent, AXPValueWidgetComponent, AXPWidgetColumnRendererComponent, AXPWidgetContainerComponent, AXPWidgetCoreElement, AXPWidgetCoreModule, AXPWidgetCoreService, AXPWidgetGroupEnum, AXPWidgetRegistryService, AXPWidgetRendererDirective, AXPWidgetSerializationHelper, AXPWidgetStatus, AXPWidgetsCatalog, AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_AI_CATEGORY, AXP_WIDGETS_CATEGORIES, AXP_WIDGETS_EDITOR_CATEGORY, AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGET_COLUMN_TOKEN, AXP_WIDGET_DEFINITION_PROVIDER, AXP_WIDGET_TOKEN, buildWidgetRegistryMapFromProviders, cloneProperty, createBooleanProperty, createNumberProperty, createSelectProperty, createStringProperty, findNonEmptyBreakpoints, hasAiWidgetCategory, isWidgetAiCatalogIncluded, normalizeWidgetCategories };
2991
2950
  //# sourceMappingURL=acorex-platform-layout-widget-core.mjs.map