@acorex/platform 21.0.0-next.7 → 21.0.0-next.70

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 (126) hide show
  1. package/fesm2022/acorex-platform-auth.mjs +281 -23
  2. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  3. package/fesm2022/acorex-platform-common-common-settings.provider-Bi1RYif5.mjs +163 -0
  4. package/fesm2022/acorex-platform-common-common-settings.provider-Bi1RYif5.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-common.mjs +1370 -276
  6. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-core.mjs +1185 -514
  8. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-domain.mjs +557 -826
  10. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-builder.mjs +832 -189
  12. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs +121 -0
  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 +6309 -1956
  16. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-layout-designer.mjs +456 -204
  18. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-layout-entity-attachments-page.component-D8iQnT-R.mjs +371 -0
  20. package/fesm2022/acorex-platform-layout-entity-attachments-page.component-D8iQnT-R.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-layout-entity-file-list-popup.component-_yrP5SQe.mjs +100 -0
  22. package/fesm2022/acorex-platform-layout-entity-file-list-popup.component-_yrP5SQe.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-layout-entity.mjs +22488 -10232
  24. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  25. package/fesm2022/acorex-platform-layout-views.mjs +564 -170
  26. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  27. package/fesm2022/acorex-platform-layout-widget-core.mjs +2084 -481
  28. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  29. package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs → acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs} +10 -10
  30. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs.map +1 -0
  31. package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs → acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs} +6 -7
  32. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs.map +1 -0
  33. package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs → acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs} +12 -12
  34. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs +116 -0
  36. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs.map +1 -0
  37. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-BcpRkpJp.mjs} +6 -6
  38. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-BcpRkpJp.mjs.map +1 -0
  39. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-DQtK4lxl.mjs} +5 -5
  40. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-DQtK4lxl.mjs.map +1 -0
  41. package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs → acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs} +6 -6
  42. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs.map +1 -0
  43. package/fesm2022/acorex-platform-layout-widgets.mjs +10326 -7981
  44. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  45. package/fesm2022/acorex-platform-native.mjs +8 -7
  46. package/fesm2022/acorex-platform-native.mjs.map +1 -1
  47. package/fesm2022/acorex-platform-runtime.mjs +391 -166
  48. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  49. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs +160 -0
  50. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs.map +1 -0
  51. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs +120 -0
  52. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs.map +1 -0
  53. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs → acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs} +21 -28
  54. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs.map +1 -0
  55. package/fesm2022/{acorex-platform-themes-default-error-401.component-cfREo88K.mjs → acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs} +4 -4
  56. package/fesm2022/acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs.map +1 -0
  57. package/fesm2022/{acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs → acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs} +4 -4
  58. package/fesm2022/acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs.map +1 -0
  59. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs +19 -0
  60. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs.map +1 -0
  61. package/fesm2022/acorex-platform-themes-default.mjs +2283 -83
  62. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  63. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs → acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs} +6 -6
  64. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs.map +1 -0
  65. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs → acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs} +6 -6
  66. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs.map +1 -0
  67. package/fesm2022/{acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs → acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs} +52 -33
  68. package/fesm2022/acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs.map +1 -0
  69. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs +94 -0
  70. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs.map +1 -0
  71. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs +86 -0
  72. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs.map +1 -0
  73. package/fesm2022/acorex-platform-themes-shared.mjs +767 -609
  74. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  75. package/fesm2022/acorex-platform-workflow.mjs +978 -238
  76. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  77. package/fesm2022/acorex-platform.mjs.map +1 -1
  78. package/package.json +40 -38
  79. package/{auth/index.d.ts → types/acorex-platform-auth.d.ts} +241 -4
  80. package/{common/index.d.ts → types/acorex-platform-common.d.ts} +822 -89
  81. package/{core/index.d.ts → types/acorex-platform-core.d.ts} +658 -133
  82. package/{domain/index.d.ts → types/acorex-platform-domain.d.ts} +744 -412
  83. package/{layout/builder/index.d.ts → types/acorex-platform-layout-builder.d.ts} +194 -49
  84. package/types/acorex-platform-layout-components.d.ts +3253 -0
  85. package/{layout/designer/index.d.ts → types/acorex-platform-layout-designer.d.ts} +96 -18
  86. package/types/acorex-platform-layout-entity.d.ts +4439 -0
  87. package/{layout/views/index.d.ts → types/acorex-platform-layout-views.d.ts} +179 -56
  88. package/{layout/widget-core/index.d.ts → types/acorex-platform-layout-widget-core.d.ts} +398 -127
  89. package/{layout/widgets/index.d.ts → types/acorex-platform-layout-widgets.d.ts} +1120 -501
  90. package/{native/index.d.ts → types/acorex-platform-native.d.ts} +0 -7
  91. package/types/acorex-platform-runtime.d.ts +571 -0
  92. package/{themes/default/index.d.ts → types/acorex-platform-themes-default.d.ts} +233 -6
  93. package/{themes/shared/index.d.ts → types/acorex-platform-themes-shared.d.ts} +24 -2
  94. package/{workflow/index.d.ts → types/acorex-platform-workflow.d.ts} +620 -617
  95. package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs +0 -71
  96. package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map +0 -1
  97. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs.map +0 -1
  98. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs +0 -135
  99. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +0 -1
  100. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map +0 -1
  101. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs.map +0 -1
  102. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs.map +0 -1
  105. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs +0 -157
  106. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DfJEx_bs.mjs +0 -1542
  108. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DfJEx_bs.mjs.map +0 -1
  109. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +0 -101
  110. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
  111. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +0 -1
  112. package/fesm2022/acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map +0 -1
  113. package/fesm2022/acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map +0 -1
  114. package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs +0 -19
  115. package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map +0 -1
  116. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map +0 -1
  117. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs.map +0 -1
  118. package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +0 -1
  119. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs +0 -65
  120. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs.map +0 -1
  121. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs +0 -64
  122. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs.map +0 -1
  123. package/layout/components/index.d.ts +0 -1669
  124. package/layout/entity/index.d.ts +0 -2287
  125. package/runtime/index.d.ts +0 -307
  126. /package/{index.d.ts → types/acorex-platform.d.ts} +0 -0
@@ -1,136 +1,20 @@
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';
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';
2
+ import { signal, computed, Injectable, InjectionToken, inject, ElementRef, effect, untracked, EventEmitter, Injector, ChangeDetectorRef, ViewChild, Input, Output, ChangeDetectionStrategy, Component, input, output, ViewContainerRef, Directive, NgModule } from '@angular/core';
3
+ import { convertArrayToDataSource, AXDataSource, AX_STYLE_COLOR_TYPES, AX_STYLE_LOOK_TYPES } from '@acorex/cdk/common';
4
+ import { AXPContextStore, AXPDataSourceDefinitionProviderService, extractValue, AXPExpressionEvaluatorService, getSmart } from '@acorex/platform/core';
5
+ export { normalizeDefinitionCategories } from '@acorex/platform/core';
6
+ import { set, merge, cloneDeep, isNil, get, isEqual, isUndefined, isObjectLike, sum, isEmpty, isString } from 'lodash-es';
6
7
  import { Subject, BehaviorSubject, filter } from 'rxjs';
7
- import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
8
8
  import * as i1$1 from '@acorex/components/skeleton';
9
9
  import { AXSkeletonModule } from '@acorex/components/skeleton';
10
10
  import * as i2 from '@acorex/core/translation';
11
11
  import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
12
12
  import { PortalModule } from '@angular/cdk/portal';
13
13
  import * as i1 from '@angular/common';
14
- import { CommonModule } from '@angular/common';
14
+ import { CommonModule, NgComponentOutlet } from '@angular/common';
15
15
  import { AXDataTableColumnComponent, AXBaseDataTable } from '@acorex/components/data-table';
16
16
  import { AXUnsubscriber } from '@acorex/core/utils';
17
17
 
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) {
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
- previousSnapshot: store.snapshot(), // Save the previous state
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
- const changeEvent = {
110
- oldValue: null,
111
- newValue: cloneDeep(initialData),
112
- path: '',
113
- state: 'initiated',
114
- data: initialData,
115
- };
116
- patchState(store, {
117
- initialSnapshot: cloneDeep(initialData), // Save the initial state
118
- previousSnapshot: store.snapshot(), // Save the current state as the previous
119
- data: initialData,
120
- state: 'initiated',
121
- lastChange: changeEvent,
122
- });
123
- },
124
- // Get a specific value
125
- getValue(path) {
126
- return get(store.data(), path);
127
- },
128
- // Check if a path exists in the context
129
- hasValue(path) {
130
- return has(store.data(), path);
131
- },
132
- })));
133
-
134
18
  var AXPPageStatus;
135
19
  (function (AXPPageStatus) {
136
20
  // Idle statuses
@@ -170,17 +54,17 @@ class AXPWidgetCoreElement {
170
54
  }
171
55
  class AXPWidgetCoreService {
172
56
  constructor() {
173
- this.variables$ = signal({}, ...(ngDevMode ? [{ debugName: "variables$" }] : []));
174
- this.functions$ = signal({}, ...(ngDevMode ? [{ debugName: "functions$" }] : []));
57
+ this.variables$ = signal({}, ...(ngDevMode ? [{ debugName: "variables$" }] : /* istanbul ignore next */ []));
58
+ this.functions$ = signal({}, ...(ngDevMode ? [{ debugName: "functions$" }] : /* istanbul ignore next */ []));
175
59
  this.onRefresh = new Subject();
176
60
  this.widgets = new Map();
177
61
  this.onWidgetRegistered = new Subject();
178
- this.status$ = signal(AXPPageStatus.Rendering, ...(ngDevMode ? [{ debugName: "status$" }] : []));
62
+ this.status$ = signal(AXPPageStatus.Rendering, ...(ngDevMode ? [{ debugName: "status$" }] : /* istanbul ignore next */ []));
179
63
  this.status = this.status$.asReadonly();
180
64
  this.isBusy = computed(() => {
181
65
  return [AXPPageStatus.Processing, AXPPageStatus.Submitting, AXPPageStatus.Rendering].includes(this.status());
182
- }, ...(ngDevMode ? [{ debugName: "isBusy" }] : []));
183
- this.registeredWidgetsCount = signal(0, ...(ngDevMode ? [{ debugName: "registeredWidgetsCount" }] : []));
66
+ }, ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
67
+ this.registeredWidgetsCount = signal(0, ...(ngDevMode ? [{ debugName: "registeredWidgetsCount" }] : /* istanbul ignore next */ []));
184
68
  }
185
69
  get variables() {
186
70
  return this.variables$();
@@ -285,13 +169,16 @@ class AXPWidgetCoreService {
285
169
  return Array.from(this.widgets.keys());
286
170
  }
287
171
  ngOnDestroy() { }
288
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetCoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
289
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetCoreService }); }
172
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
173
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreService }); }
290
174
  }
291
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetCoreService, decorators: [{
175
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreService, decorators: [{
292
176
  type: Injectable
293
177
  }] });
294
178
 
179
+ //
180
+ // @deprecated
181
+ // Prefer AXPWidgetsList from @acorex/modules/common; dashboard widget type ids live in dashboard-management RootConfig.widgets.
295
182
  const AXPWidgetsCatalog = {
296
183
  timeDuration: 'time-duration',
297
184
  timeDurationFilter: 'time-duration-filter',
@@ -315,7 +202,9 @@ const AXPWidgetsCatalog = {
315
202
  pageLayout: 'page-layout',
316
203
  repeaterLayout: 'repeater-layout',
317
204
  textBlockLayout: 'text-block-layout',
318
- fileUploader: 'file-uploader',
205
+ alertBoxLayout: 'alert-box-layout',
206
+ badgeLayout: 'badge-layout',
207
+ attachments: 'attachments',
319
208
  fileTypeExtension: 'file-type-extension',
320
209
  map: 'map',
321
210
  imageMarker: 'image-marker',
@@ -343,7 +232,6 @@ const AXPWidgetsCatalog = {
343
232
  tableLayout: 'table-layout',
344
233
  tableItem: 'table-item-layout',
345
234
  avatar: 'avatar',
346
- themePaletteChooser: 'theme-palette-chooser',
347
235
  themeModeChooser: 'theme-mode-chooser',
348
236
  menuOrientationChooser: 'menu-orientation-chooser',
349
237
  fontStyleChooser: 'font-style-chooser',
@@ -371,31 +259,23 @@ const AXPWidgetsCatalog = {
371
259
  betweenValidation: 'between-validation',
372
260
  equalValidation: 'equal-validation',
373
261
  callbackValidation: 'callback-validation',
374
- donutChart: 'donut-chart',
375
- lineChart: 'line-chart',
376
- barChart: 'bar-chart',
377
- gaugeChart: 'gauge-chart',
378
- stickyNote: 'sticky-note',
379
- clockCalendar: 'clock-calendar',
380
- analogClock: 'analog-clock',
381
- weather: 'weather',
382
- minimalWeather: 'minimal-weather',
383
- advancedWeather: 'advanced-weather',
384
262
  metaData: 'meta-data-editor',
385
263
  templateEditor: 'template-box-editor',
264
+ templateContentEditor: 'template-content-editor',
386
265
  panel: 'panel',
387
266
  notification: 'notification',
388
- taskBoard: 'task-board',
389
267
  comment: 'comment',
390
268
  dataList: 'data-list',
391
269
  listToolbar: 'list-toolbar',
392
270
  entityList: 'entity-list',
271
+ pageComponent: 'page-component',
393
272
  editorJs: 'editor-js-editor',
394
273
  documentUploader: 'document-uploader',
395
- signatureList: 'signature-list',
396
274
  stepWizard: 'step-wizard',
397
275
  progressBar: 'progress-bar-editor',
398
- rate: 'rate-picker-editor'
276
+ rate: 'rate-picker-editor',
277
+ documentFileTypeFilter: 'document-file-type-filter',
278
+ entityDefinitionProvider: 'entity-definition-provider-editor',
399
279
  };
400
280
 
401
281
  function cloneProperty(property, values) {
@@ -450,7 +330,10 @@ function createBooleanProperty(ctor) {
450
330
  type: AXPWidgetsCatalog.toggle,
451
331
  },
452
332
  },
453
- visible: ctor.visible ?? true,
333
+ visible: !isNil(ctor.visible) ? ctor.visible : true,
334
+ binding: {
335
+ enabled: true,
336
+ },
454
337
  };
455
338
  }
456
339
  function createSelectProperty(ctor) {
@@ -474,7 +357,7 @@ function createSelectProperty(ctor) {
474
357
  },
475
358
  },
476
359
  },
477
- visible: ctor.visible ?? true,
360
+ visible: !isNil(ctor.visible) ? ctor.visible : true,
478
361
  };
479
362
  }
480
363
  const AXP_WIDGET_TOKEN = new InjectionToken('AXP_WIDGET_TOKEN');
@@ -486,22 +369,22 @@ class AXPBaseWidgetComponent extends AXPWidgetCoreElement {
486
369
  this.token = inject(AXP_WIDGET_TOKEN);
487
370
  this.host = inject(ElementRef).nativeElement;
488
371
  this.layoutService = inject(AXPWidgetCoreService);
489
- this.contextService = inject(AXPWidgetCoreContextStore);
372
+ this.contextService = inject(AXPContextStore);
490
373
  this.config = this.token.config;
491
374
  this.node = this.token.node;
492
375
  this.name = this.token.node.name;
493
376
  this.component = this;
494
- this._options = signal(this.token.options ?? {}, ...(ngDevMode ? [{ debugName: "_options" }] : []));
377
+ this._options = signal(this.token.options ?? {}, ...(ngDevMode ? [{ debugName: "_options" }] : /* istanbul ignore next */ []));
495
378
  this.options = this._options.asReadonly();
496
379
  this.onOptionsChanged = new Subject();
497
- this._status = signal(AXPWidgetStatus.Rendering, ...(ngDevMode ? [{ debugName: "_status" }] : []));
380
+ this._status = signal(AXPWidgetStatus.Rendering, ...(ngDevMode ? [{ debugName: "_status" }] : /* istanbul ignore next */ []));
498
381
  this.status = this._status.asReadonly();
499
382
  this.onStatusChanged = new BehaviorSubject(this._status());
500
383
  this.#statusEffect = effect(() => {
501
384
  this.onStatusChanged.next(this.status());
502
- }, ...(ngDevMode ? [{ debugName: "#statusEffect" }] : []));
503
- this.isBusy = computed(() => [AXPWidgetStatus.Rendering, AXPWidgetStatus.Processing].includes(this.status()), ...(ngDevMode ? [{ debugName: "isBusy" }] : []));
504
- this._children = signal(this.token.node.children ?? [], ...(ngDevMode ? [{ debugName: "_children" }] : []));
385
+ }, ...(ngDevMode ? [{ debugName: "#statusEffect" }] : /* istanbul ignore next */ []));
386
+ this.isBusy = computed(() => [AXPWidgetStatus.Rendering, AXPWidgetStatus.Processing].includes(this.status()), ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
387
+ this._children = signal(this.token.node.children ?? [], ...(ngDevMode ? [{ debugName: "_children" }] : /* istanbul ignore next */ []));
505
388
  this.children = this._children.asReadonly();
506
389
  }
507
390
  get id() {
@@ -530,7 +413,7 @@ class AXPBaseWidgetComponent extends AXPWidgetCoreElement {
530
413
  output(name) {
531
414
  const outputs = this.outputs().map((c) => (typeof c == 'string' ? { name: c, value: c } : c));
532
415
  if (outputs.some((c) => c.name == name)) {
533
- const opt = get(this, name);
416
+ const opt = outputs.find((c) => c.name == name)?.value;
534
417
  if (typeof opt == 'function') {
535
418
  return opt();
536
419
  }
@@ -548,10 +431,10 @@ class AXPBaseWidgetComponent extends AXPWidgetCoreElement {
548
431
  this._children.set([...children]);
549
432
  }
550
433
  onAdded() { }
551
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
552
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBaseWidgetComponent }); }
434
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
435
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBaseWidgetComponent }); }
553
436
  }
554
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBaseWidgetComponent, decorators: [{
437
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBaseWidgetComponent, decorators: [{
555
438
  type: Injectable
556
439
  }] });
557
440
  class AXPLayoutBaseWidgetComponent extends AXPBaseWidgetComponent {
@@ -562,10 +445,10 @@ class AXPLayoutBaseWidgetComponent extends AXPBaseWidgetComponent {
562
445
  }
563
446
  super.ngOnInit();
564
447
  }
565
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
566
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutBaseWidgetComponent }); }
448
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLayoutBaseWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
449
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLayoutBaseWidgetComponent }); }
567
450
  }
568
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPLayoutBaseWidgetComponent, decorators: [{
451
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLayoutBaseWidgetComponent, decorators: [{
569
452
  type: Injectable
570
453
  }] });
571
454
  class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
@@ -576,11 +459,11 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
576
459
  this._isValueWidget = false;
577
460
  this.isValueWidget = () => this._isValueWidget;
578
461
  this.onValueChanged = new Subject();
579
- this.fullPath = signal(null, ...(ngDevMode ? [{ debugName: "fullPath" }] : []));
580
- this.parentPath = signal(null, ...(ngDevMode ? [{ debugName: "parentPath" }] : []));
462
+ this.fullPath = signal(null, ...(ngDevMode ? [{ debugName: "fullPath" }] : /* istanbul ignore next */ []));
463
+ this.parentPath = signal(null, ...(ngDevMode ? [{ debugName: "parentPath" }] : /* istanbul ignore next */ []));
581
464
  this.getValue = computed(() => {
582
465
  return this.fullPath() ? this.extractValue(this.fullPath()) : null;
583
- }, ...(ngDevMode ? [{ debugName: "getValue", equal: isEqual }] : [{ equal: isEqual }]));
466
+ }, { ...(ngDevMode ? { debugName: "getValue" } : /* istanbul ignore next */ {}), equal: isEqual });
584
467
  this.validationRules = computed(() => {
585
468
  const validationsRaw = this.options()['validations'];
586
469
  if (validationsRaw == null) {
@@ -593,7 +476,7 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
593
476
  message: c.message,
594
477
  options: c.options,
595
478
  }));
596
- }, ...(ngDevMode ? [{ debugName: "validationRules" }] : []));
479
+ }, ...(ngDevMode ? [{ debugName: "validationRules" }] : /* istanbul ignore next */ []));
597
480
  }
598
481
  ngOnInit() {
599
482
  this._isValueWidget = this.config.properties?.some((c) => c.name == 'path') ?? false;
@@ -623,7 +506,12 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
623
506
  if (isNil(value) && isNil(oldValue)) {
624
507
  return;
625
508
  }
626
- if (isEqual(oldValue, value)) {
509
+ // Reordered arrays must persist even when items are deep-equal (e.g. empty row objects).
510
+ const isArrayReorder = Array.isArray(oldValue) &&
511
+ Array.isArray(value) &&
512
+ oldValue.length === value.length &&
513
+ oldValue.some((v, i) => v !== value[i]);
514
+ if (!isArrayReorder && isEqual(oldValue, value)) {
627
515
  return;
628
516
  }
629
517
  if (this.fullPath()) {
@@ -670,23 +558,23 @@ class AXPValueWidgetComponent extends AXPLayoutBaseWidgetComponent {
670
558
  this.setValue(e.value);
671
559
  }
672
560
  }
673
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPValueWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
674
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPValueWidgetComponent }); }
561
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPValueWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
562
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPValueWidgetComponent }); }
675
563
  }
676
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPValueWidgetComponent, decorators: [{
564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPValueWidgetComponent, decorators: [{
677
565
  type: Injectable
678
566
  }] });
679
567
  class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
680
568
  constructor() {
681
569
  super(...arguments);
682
570
  this.dataService = inject(AXPDataSourceDefinitionProviderService);
683
- this.textField = computed(() => this.options()['textField'] ?? 'title', ...(ngDevMode ? [{ debugName: "textField" }] : []));
684
- this.valueField = computed(() => this.options()['valueField'] ?? 'id', ...(ngDevMode ? [{ debugName: "valueField" }] : []));
571
+ this.textField = computed(() => this.options()['textField'] ?? 'title', ...(ngDevMode ? [{ debugName: "textField" }] : /* istanbul ignore next */ []));
572
+ this.valueField = computed(() => this.options()['valueField'] ?? 'id', ...(ngDevMode ? [{ debugName: "valueField" }] : /* istanbul ignore next */ []));
685
573
  this.textTemplate = computed(() => isNil(this.options()['textTemplate'])
686
574
  ? undefined
687
- : this.options()['textTemplate'].replace(/{/g, '{{').replace(/}/g, '}}'), ...(ngDevMode ? [{ debugName: "textTemplate" }] : []));
688
- this.dataSource = signal(convertArrayToDataSource([]), ...(ngDevMode ? [{ debugName: "dataSource" }] : []));
689
- this.selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : []));
575
+ : this.options()['textTemplate'].replace(/{/g, '{{').replace(/}/g, '}}'), ...(ngDevMode ? [{ debugName: "textTemplate" }] : /* istanbul ignore next */ []));
576
+ this.dataSource = signal(convertArrayToDataSource([]), ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
577
+ this.selectedItems = signal([], ...(ngDevMode ? [{ debugName: "selectedItems" }] : /* istanbul ignore next */ []));
690
578
  //#region ---- DataSource Loading Effect ----
691
579
  /**
692
580
  * Track the last loaded string dataSource reference to prevent infinite loops
@@ -766,7 +654,7 @@ class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
766
654
  this.dataSource.set(convertArrayToDataSource([]));
767
655
  }
768
656
  });
769
- }, ...(ngDevMode ? [{ debugName: "rf" }] : []));
657
+ }, ...(ngDevMode ? [{ debugName: "rf" }] : /* istanbul ignore next */ []));
770
658
  this.effect2 = effect(async () => {
771
659
  const value = this.getValue();
772
660
  const items = [];
@@ -777,7 +665,7 @@ class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
777
665
  items.push(await this.extractItem(value));
778
666
  }
779
667
  this.selectedItems.set(items.filter((c) => c != null));
780
- }, ...(ngDevMode ? [{ debugName: "effect2" }] : []));
668
+ }, ...(ngDevMode ? [{ debugName: "effect2" }] : /* istanbul ignore next */ []));
781
669
  }
782
670
  //#endregion
783
671
  async extractItem(item) {
@@ -802,10 +690,10 @@ class AXPDataListWidgetComponent extends AXPValueWidgetComponent {
802
690
  [this.textField()]: item,
803
691
  };
804
692
  }
805
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDataListWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
806
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDataListWidgetComponent }); }
693
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataListWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
694
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataListWidgetComponent }); }
807
695
  }
808
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDataListWidgetComponent, decorators: [{
696
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataListWidgetComponent, decorators: [{
809
697
  type: Injectable
810
698
  }] });
811
699
  class AXPColumnWidgetComponent {
@@ -813,20 +701,22 @@ class AXPColumnWidgetComponent {
813
701
  this.token = inject(AXP_WIDGET_COLUMN_TOKEN);
814
702
  this.path = this.token.path;
815
703
  this.options = this.token.options ?? {};
704
+ /** Column header caption when rendered inside `axp-widget-column-renderer`. */
705
+ this.columnCaption = this.token.caption;
816
706
  this.rawValue = null;
817
707
  this.nullText = this.options['nullText'];
818
708
  this.nullValue = this.options['nullValue'];
819
- this.value = computed(() => {
709
+ this.value = () => {
820
710
  if (isNil(this.rawValue) && !isNil(this.nullValue)) {
821
711
  return this.nullValue;
822
712
  }
823
713
  return this.rawValue;
824
- }, ...(ngDevMode ? [{ debugName: "value" }] : []));
714
+ };
825
715
  }
826
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPColumnWidgetComponent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
827
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPColumnWidgetComponent }); }
716
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidgetComponent, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
717
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidgetComponent }); }
828
718
  }
829
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPColumnWidgetComponent, decorators: [{
719
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidgetComponent, decorators: [{
830
720
  type: Injectable
831
721
  }] });
832
722
 
@@ -855,7 +745,7 @@ class AXPBoxModelLayoutWidgetComponent extends AXPLayoutBaseWidgetComponent {
855
745
  style['overflow-y'] = overflowY ?? '';
856
746
  style['direction'] = direction ?? '';
857
747
  return style;
858
- }, ...(ngDevMode ? [{ debugName: "hostBoxStyle" }] : []));
748
+ }, ...(ngDevMode ? [{ debugName: "hostBoxStyle" }] : /* istanbul ignore next */ []));
859
749
  this.blockStyle = computed(() => {
860
750
  const options = this.options();
861
751
  const style = { ...this.hostBoxStyle() };
@@ -872,47 +762,47 @@ class AXPBoxModelLayoutWidgetComponent extends AXPLayoutBaseWidgetComponent {
872
762
  style['height'] = height ?? '';
873
763
  style['max-height'] = maxHeight ?? '';
874
764
  return style;
875
- }, ...(ngDevMode ? [{ debugName: "blockStyle" }] : []));
765
+ }, ...(ngDevMode ? [{ debugName: "blockStyle" }] : /* istanbul ignore next */ []));
876
766
  this.inlineStyle = computed(() => {
877
767
  return { ...this.hostBoxStyle() };
878
- }, ...(ngDevMode ? [{ debugName: "inlineStyle" }] : []));
768
+ }, ...(ngDevMode ? [{ debugName: "inlineStyle" }] : /* istanbul ignore next */ []));
879
769
  this.blockClass = computed(() => {
880
770
  return {
881
771
  'ax-block': true,
882
772
  'ax-w-full': true,
883
773
  // 'ax-widget-outline': true,
884
774
  };
885
- }, ...(ngDevMode ? [{ debugName: "blockClass" }] : []));
775
+ }, ...(ngDevMode ? [{ debugName: "blockClass" }] : /* istanbul ignore next */ []));
886
776
  this.inlineClass = computed(() => {
887
777
  return {
888
778
  'ax-inline-block': true,
889
779
  };
890
- }, ...(ngDevMode ? [{ debugName: "inlineClass" }] : []));
780
+ }, ...(ngDevMode ? [{ debugName: "inlineClass" }] : /* istanbul ignore next */ []));
891
781
  }
892
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
893
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent }); }
782
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
783
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent }); }
894
784
  }
895
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, decorators: [{
785
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBoxModelLayoutWidgetComponent, decorators: [{
896
786
  type: Injectable
897
787
  }] });
898
788
 
899
789
  class AXPBlockBaseLayoutWidgetComponent extends AXPBoxModelLayoutWidgetComponent {
900
790
  constructor() {
901
791
  super(...arguments);
902
- this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
903
- this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
792
+ this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
793
+ this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
904
794
  }
905
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
906
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent }); }
795
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
796
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent }); }
907
797
  }
908
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, decorators: [{
798
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBlockBaseLayoutWidgetComponent, decorators: [{
909
799
  type: Injectable
910
800
  }] });
911
801
 
912
802
  class AXPFlexBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent {
913
803
  constructor() {
914
804
  super(...arguments);
915
- this.flex = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flex" }] : []));
805
+ this.flex = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flex" }] : /* istanbul ignore next */ []));
916
806
  this.hostFlexStyle = computed(() => {
917
807
  const blockStyle = this.blockStyle();
918
808
  const style = { ...blockStyle };
@@ -951,45 +841,45 @@ class AXPFlexBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent
951
841
  style['gap'] = flex.gap;
952
842
  }
953
843
  return style;
954
- }, ...(ngDevMode ? [{ debugName: "hostFlexStyle" }] : []));
844
+ }, ...(ngDevMode ? [{ debugName: "hostFlexStyle" }] : /* istanbul ignore next */ []));
955
845
  this.hostFlexClass = computed(() => {
956
846
  return {
957
847
  ...this.blockClass(),
958
848
  'ax-flex': true,
959
849
  'ax-h-full': true,
960
850
  };
961
- }, ...(ngDevMode ? [{ debugName: "hostFlexClass" }] : []));
851
+ }, ...(ngDevMode ? [{ debugName: "hostFlexClass" }] : /* istanbul ignore next */ []));
962
852
  this.hostClass = computed(() => {
963
853
  return this.hostFlexClass();
964
- }, ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
854
+ }, ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
965
855
  this.hostStyle = computed(() => {
966
856
  return this.hostFlexStyle();
967
- }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
857
+ }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
968
858
  }
969
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
970
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent }); }
859
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
860
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent }); }
971
861
  }
972
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, decorators: [{
862
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexBaseLayoutWidgetComponent, decorators: [{
973
863
  type: Injectable
974
864
  }] });
975
865
 
976
866
  class AXPInlineBaseLayoutWidgetComponent extends AXPBoxModelLayoutWidgetComponent {
977
867
  constructor() {
978
868
  super(...arguments);
979
- this.hostClass = computed(() => this.inlineClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
980
- this.hostStyle = computed(() => this.inlineStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
869
+ this.hostClass = computed(() => this.inlineClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
870
+ this.hostStyle = computed(() => this.inlineStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
981
871
  }
982
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
983
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent }); }
872
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
873
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent }); }
984
874
  }
985
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, decorators: [{
875
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPInlineBaseLayoutWidgetComponent, decorators: [{
986
876
  type: Injectable
987
877
  }] });
988
878
 
989
879
  class AXPFlexItemBaseLayoutWidgetComponent extends AXPInlineBaseLayoutWidgetComponent {
990
880
  constructor() {
991
881
  super(...arguments);
992
- this.flexItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flexItem" }] : []));
882
+ this.flexItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "flexItem" }] : /* istanbul ignore next */ []));
993
883
  this.hostFlexItemStyle = computed(() => {
994
884
  const inlineStyle = this.blockStyle();
995
885
  const style = { ...inlineStyle };
@@ -1025,37 +915,37 @@ class AXPFlexItemBaseLayoutWidgetComponent extends AXPInlineBaseLayoutWidgetComp
1025
915
  style['align-self'] = fi.alignSelf;
1026
916
  }
1027
917
  return style;
1028
- }, ...(ngDevMode ? [{ debugName: "hostFlexItemStyle" }] : []));
918
+ }, ...(ngDevMode ? [{ debugName: "hostFlexItemStyle" }] : /* istanbul ignore next */ []));
1029
919
  this.hostFlexItemClass = computed(() => {
1030
920
  return {
1031
921
  ...this.blockClass(),
1032
922
  };
1033
- }, ...(ngDevMode ? [{ debugName: "hostFlexItemClass" }] : []));
923
+ }, ...(ngDevMode ? [{ debugName: "hostFlexItemClass" }] : /* istanbul ignore next */ []));
1034
924
  this.hostClass = computed(() => {
1035
925
  return this.hostFlexItemClass();
1036
- }, ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
926
+ }, ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1037
927
  this.hostStyle = computed(() => {
1038
928
  return this.hostFlexItemStyle();
1039
- }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
929
+ }, ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1040
930
  }
1041
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1042
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent }); }
931
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
932
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent }); }
1043
933
  }
1044
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, decorators: [{
934
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPFlexItemBaseLayoutWidgetComponent, decorators: [{
1045
935
  type: Injectable
1046
936
  }] });
1047
937
 
1048
938
  class AXPGridBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent {
1049
939
  constructor() {
1050
940
  super(...arguments);
1051
- this.grid = computed(() => this.options()?.['grid'], ...(ngDevMode ? [{ debugName: "grid" }] : []));
941
+ this.grid = computed(() => this.options()?.['grid'], ...(ngDevMode ? [{ debugName: "grid" }] : /* istanbul ignore next */ []));
1052
942
  this.hostGridStyle = computed(() => {
1053
943
  const style = { ...this.inlineStyle() };
1054
944
  const g = this.grid()?.default;
1055
945
  if (g?.gap)
1056
946
  style['gap'] = g.gap;
1057
947
  return style;
1058
- }, ...(ngDevMode ? [{ debugName: "hostGridStyle" }] : []));
948
+ }, ...(ngDevMode ? [{ debugName: "hostGridStyle" }] : /* istanbul ignore next */ []));
1059
949
  this.hostGridClass = computed(() => {
1060
950
  const cls = {
1061
951
  ...this.inlineClass(),
@@ -1064,8 +954,7 @@ class AXPGridBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent
1064
954
  const g = this.grid()?.default;
1065
955
  if (g?.columns)
1066
956
  cls[`lg:ax-grid-cols-${g.columns}`] = true;
1067
- if (g?.rows)
1068
- cls[`lg:ax-grid-rows-${g.rows}`] = true;
957
+ // if (g?.rows) cls[`lg:ax-grid-rows-${g.rows}`] = true;
1069
958
  if (g?.justifyItems)
1070
959
  cls[`lg:ax-justify-items-${g.justifyItems}`] = true;
1071
960
  if (g?.alignItems)
@@ -1073,21 +962,21 @@ class AXPGridBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent
1073
962
  if (g?.autoFlow)
1074
963
  cls[`lg:ax-grid-flow-${g.autoFlow}`] = true;
1075
964
  return cls;
1076
- }, ...(ngDevMode ? [{ debugName: "hostGridClass" }] : []));
1077
- this.hostClass = computed(() => this.hostGridClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1078
- this.hostStyle = computed(() => this.hostGridStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
965
+ }, ...(ngDevMode ? [{ debugName: "hostGridClass" }] : /* istanbul ignore next */ []));
966
+ this.hostClass = computed(() => this.hostGridClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
967
+ this.hostStyle = computed(() => this.hostGridStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1079
968
  }
1080
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1081
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent }); }
969
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
970
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent }); }
1082
971
  }
1083
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, decorators: [{
972
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridBaseLayoutWidgetComponent, decorators: [{
1084
973
  type: Injectable
1085
974
  }] });
1086
975
 
1087
976
  class AXPGridItemBaseLayoutWidgetComponent extends AXPFlexBaseLayoutWidgetComponent {
1088
977
  constructor() {
1089
978
  super(...arguments);
1090
- this.gridItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "gridItem" }] : []));
979
+ this.gridItem = computed(() => this.options(), ...(ngDevMode ? [{ debugName: "gridItem" }] : /* istanbul ignore next */ []));
1091
980
  this.hostGridItemStyle = computed(() => {
1092
981
  const style = { ...this.hostFlexStyle() };
1093
982
  const g = this.gridItem();
@@ -1096,10 +985,13 @@ class AXPGridItemBaseLayoutWidgetComponent extends AXPFlexBaseLayoutWidgetCompon
1096
985
  if (g?.justifySelf)
1097
986
  style['justify-self'] = g.justifySelf;
1098
987
  return style;
1099
- }, ...(ngDevMode ? [{ debugName: "hostGridItemStyle" }] : []));
988
+ }, ...(ngDevMode ? [{ debugName: "hostGridItemStyle" }] : /* istanbul ignore next */ []));
1100
989
  this.hostGridItemClass = computed(() => {
1101
990
  const cls = { ...this.hostFlexClass() };
1102
991
  const g = this.gridItem();
992
+ // Mobile-first: full width on small screens so items stack vertically and don't overflow
993
+ cls['ax-col-span-12'] = true;
994
+ // Large screens: apply defined placement so multi-column layout works on desktop
1103
995
  if (g?.colSpan)
1104
996
  cls[`lg:ax-col-span-${g.colSpan}`] = true;
1105
997
  if (g?.colStart)
@@ -1113,14 +1005,14 @@ class AXPGridItemBaseLayoutWidgetComponent extends AXPFlexBaseLayoutWidgetCompon
1113
1005
  if (g?.rowEnd)
1114
1006
  cls[`lg:ax-row-end-${g.rowEnd}`] = true;
1115
1007
  return cls;
1116
- }, ...(ngDevMode ? [{ debugName: "hostGridItemClass" }] : []));
1117
- this.hostClass = computed(() => this.hostGridItemClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1118
- this.hostStyle = computed(() => this.hostGridItemStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
1008
+ }, ...(ngDevMode ? [{ debugName: "hostGridItemClass" }] : /* istanbul ignore next */ []));
1009
+ this.hostClass = computed(() => this.hostGridItemClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1010
+ this.hostStyle = computed(() => this.hostGridItemStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1119
1011
  }
1120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1121
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent }); }
1012
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1013
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent }); }
1122
1014
  }
1123
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, decorators: [{
1015
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridItemBaseLayoutWidgetComponent, decorators: [{
1124
1016
  type: Injectable
1125
1017
  }] });
1126
1018
 
@@ -1129,27 +1021,27 @@ class AXPTableBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponen
1129
1021
  super(...arguments);
1130
1022
  this.hostTableClass = computed(() => ({
1131
1023
  ...this.blockClass(),
1132
- }), ...(ngDevMode ? [{ debugName: "hostTableClass" }] : []));
1024
+ }), ...(ngDevMode ? [{ debugName: "hostTableClass" }] : /* istanbul ignore next */ []));
1133
1025
  this.hostTableStyle = computed(() => {
1134
1026
  const style = { ...this.blockStyle() };
1135
1027
  style['overflow-x'] = 'auto';
1136
1028
  return style;
1137
- }, ...(ngDevMode ? [{ debugName: "hostTableStyle" }] : []));
1138
- this.hostClass = computed(() => this.hostTableClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1139
- this.hostStyle = computed(() => this.hostTableStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
1029
+ }, ...(ngDevMode ? [{ debugName: "hostTableStyle" }] : /* istanbul ignore next */ []));
1030
+ this.hostClass = computed(() => this.hostTableClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1031
+ this.hostStyle = computed(() => this.hostTableStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1140
1032
  }
1141
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1142
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent }); }
1033
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1034
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent }); }
1143
1035
  }
1144
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, decorators: [{
1036
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableBaseLayoutWidgetComponent, decorators: [{
1145
1037
  type: Injectable
1146
1038
  }] });
1147
1039
 
1148
1040
  class AXPTableItemOpsBaseLayoutWidgetComponent extends AXPBlockBaseLayoutWidgetComponent {
1149
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1150
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent }); }
1041
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1042
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent }); }
1151
1043
  }
1152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, decorators: [{
1044
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemOpsBaseLayoutWidgetComponent, decorators: [{
1153
1045
  type: Injectable
1154
1046
  }] });
1155
1047
 
@@ -1159,57 +1051,105 @@ class AXPTableItemBaseLayoutWidgetComponent extends AXPTableItemOpsBaseLayoutWid
1159
1051
  this.colSpan = computed(() => {
1160
1052
  const v = this.options()?.colSpan;
1161
1053
  return v ? Math.max(1, v) : 1;
1162
- }, ...(ngDevMode ? [{ debugName: "colSpan" }] : []));
1054
+ }, ...(ngDevMode ? [{ debugName: "colSpan" }] : /* istanbul ignore next */ []));
1163
1055
  this.rowSpan = computed(() => {
1164
1056
  const v = this.options()?.rowSpan;
1165
1057
  return v ? Math.max(1, v) : 1;
1166
- }, ...(ngDevMode ? [{ debugName: "rowSpan" }] : []));
1167
- this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : []));
1168
- this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : []));
1058
+ }, ...(ngDevMode ? [{ debugName: "rowSpan" }] : /* istanbul ignore next */ []));
1059
+ this.hostClass = computed(() => this.blockClass(), ...(ngDevMode ? [{ debugName: "hostClass" }] : /* istanbul ignore next */ []));
1060
+ this.hostStyle = computed(() => this.blockStyle(), ...(ngDevMode ? [{ debugName: "hostStyle" }] : /* istanbul ignore next */ []));
1169
1061
  }
1170
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1171
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent }); }
1062
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
1063
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent }); }
1172
1064
  }
1173
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, decorators: [{
1065
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTableItemBaseLayoutWidgetComponent, decorators: [{
1174
1066
  type: Injectable
1175
1067
  }] });
1176
1068
 
1069
+ //#region ---- Imports ----
1070
+ /**
1071
+ * Injection token for widget definition providers.
1072
+ * Modules register their widget providers using this token (multi: true).
1073
+ */
1074
+ const AXP_WIDGET_DEFINITION_PROVIDER = new InjectionToken('AXP_WIDGET_DEFINITION_PROVIDER', {
1075
+ factory: () => [],
1076
+ });
1077
+ //#endregion
1078
+
1079
+ //#region ---- Build widget map (shared with tooling / snapshot scripts) ----
1080
+ //TODO RECHECK THIS FUNCTION s.hosseini
1081
+ /**
1082
+ * Merges core + extended widgets the same way as AXPWidgetRegistryService.ensureBuilt().
1083
+ * Use with concrete providers (e.g. AXPCoreWidgetsProvider, AXPEntityWidgetsProvider) in Node scripts without DI.
1084
+ */
1085
+ function buildWidgetRegistryMapFromProviders(providers) {
1086
+ const types = new Map();
1087
+ const AXPExtendedWidgets = [];
1088
+ for (const provider of providers) {
1089
+ const widgets = provider.getWidgets?.() ?? [];
1090
+ for (const w of widgets) {
1091
+ types.set(w.name, w);
1092
+ }
1093
+ const extended = provider.getExtendedWidgets?.() ?? [];
1094
+ AXPExtendedWidgets.push(...extended);
1095
+ }
1096
+ for (const { parentName, widget } of AXPExtendedWidgets) {
1097
+ const parent = types.get(parentName);
1098
+ if (parent) {
1099
+ const merged = merge({}, parent, widget);
1100
+ merged.name = widget.name;
1101
+ types.set(merged.name, merged);
1102
+ }
1103
+ }
1104
+ return types;
1105
+ }
1106
+ //#endregion
1107
+ //#region ---- Widget Registry Service (Token-Based) ----
1108
+ /**
1109
+ * Aggregates widgets from all AXP_WIDGET_DEFINITION_PROVIDER instances.
1110
+ * Token-based like AXP_MENU_PROVIDER / AXP_PERMISSION_DEFINITION_PROVIDER / AXP_SETTING_DEFINITION_PROVIDER.
1111
+ * No separate registry - widgets come solely from providers.
1112
+ */
1177
1113
  class AXPWidgetRegistryService {
1178
- /**
1179
- *
1180
- */
1181
1114
  constructor() {
1182
- this.types = new Map();
1183
- AXPWidgetRegistryService.instance = this;
1184
- }
1185
- register(widget) {
1186
- this.types.set(widget.name, widget);
1115
+ this._providers = inject(AXP_WIDGET_DEFINITION_PROVIDER, { optional: true }) ?? [];
1116
+ this._types = null;
1187
1117
  }
1188
- extend(parentName, widget) {
1189
- const parentWidget = this.resolve(parentName);
1190
- const newWidget = merge({}, parentWidget, widget);
1191
- newWidget.name = widget.name;
1192
- this.register(newWidget);
1118
+ /**
1119
+ * Lazy-build widget map from all providers.
1120
+ */
1121
+ ensureBuilt() {
1122
+ if (this._types)
1123
+ return this._types;
1124
+ this._types = buildWidgetRegistryMapFromProviders(this._providers);
1125
+ return this._types;
1193
1126
  }
1194
1127
  resolve(name) {
1195
- const widget = this.types.get(name);
1128
+ const widget = this.ensureBuilt().get(name);
1196
1129
  if (!widget) {
1197
1130
  throw new Error(`Widget with name "${name}" does not exist.`);
1198
1131
  }
1199
1132
  return widget;
1200
1133
  }
1134
+ /**
1135
+ * Registered widget config when present; otherwise `undefined`. Does not throw — use when
1136
+ * {@link resolve}'s value may be a non-widget id (e.g. data-source row id in dynamic field configurator).
1137
+ */
1138
+ getOptional(name) {
1139
+ return this.ensureBuilt().get(name);
1140
+ }
1201
1141
  all() {
1202
- return Array.from(this.types.values());
1142
+ return Array.from(this.ensureBuilt().values());
1203
1143
  }
1204
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1205
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetRegistryService, providedIn: 'root' }); }
1144
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1145
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRegistryService, providedIn: 'root' }); }
1206
1146
  }
1207
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetRegistryService, decorators: [{
1147
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRegistryService, decorators: [{
1208
1148
  type: Injectable,
1209
1149
  args: [{
1210
1150
  providedIn: 'root',
1211
1151
  }]
1212
- }], ctorParameters: () => [] });
1152
+ }] });
1213
1153
 
1214
1154
  class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1215
1155
  constructor() {
@@ -1217,13 +1157,16 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1217
1157
  this.widgetRegistery = inject(AXPWidgetRegistryService);
1218
1158
  this.grid = inject(AXBaseDataTable);
1219
1159
  this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
1220
- this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : []));
1221
- this.loadingRow = signal(null, ...(ngDevMode ? [{ debugName: "loadingRow" }] : []));
1160
+ this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
1161
+ this.loadingRow = signal(null, ...(ngDevMode ? [{ debugName: "loadingRow" }] : /* istanbul ignore next */ []));
1222
1162
  this.rowInjectorsCache = new Map();
1223
1163
  this.hasExpressions = false;
1224
1164
  this.pendingEvaluations = new Set();
1225
1165
  this.changeDetectionScheduled = false;
1226
1166
  this.MAX_CACHE_SIZE = 1000; // Limit cache size to prevent memory leaks
1167
+ /** When true, header click cycles sort (handled by parent; synced with list sort state). */
1168
+ this.sortEnabled = false;
1169
+ this.sortToggle = new EventEmitter();
1227
1170
  this.injector = inject(Injector);
1228
1171
  this.cdr = inject(ChangeDetectorRef);
1229
1172
  }
@@ -1239,6 +1182,19 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1239
1182
  get renderCellTemplate() {
1240
1183
  return this.cellTemplate ?? this._contentCellTemplate;
1241
1184
  }
1185
+ /**
1186
+ * True when the row should show the expand icon: either hasChild is true (from server/initial load)
1187
+ * or the row has loaded children (e.g. after refreshItemChildren when children go from 0 to 1).
1188
+ */
1189
+ hasExpandableRow(row) {
1190
+ const data = row?.data;
1191
+ if (!data)
1192
+ return false;
1193
+ if (data['hasChild'] === true)
1194
+ return true;
1195
+ const children = data['__meta__']?.['children'];
1196
+ return Array.isArray(children) && children.length > 0;
1197
+ }
1242
1198
  async handleExpandRow(row) {
1243
1199
  this.loadingRow.set(row);
1244
1200
  await this.grid.expandRow(row);
@@ -1250,6 +1206,73 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1250
1206
  get renderHeaderTemplate() {
1251
1207
  return this.headerTemplate ?? this._contentHeaderTemplate;
1252
1208
  }
1209
+ //#region ---- Column alignment (header / cell) ----
1210
+ /**
1211
+ * Resolves `options.align`: string applies to header and cell; object uses optional `header` / `cell` (default start).
1212
+ * Supports designer select values `{ id: 'center' }`.
1213
+ */
1214
+ getHeaderTextAlign() {
1215
+ return this.resolveAlignForSide('header');
1216
+ }
1217
+ getHeaderJustifyContent() {
1218
+ const align = this.getHeaderTextAlign();
1219
+ if (align === 'center') {
1220
+ return 'center';
1221
+ }
1222
+ if (align === 'end') {
1223
+ return 'flex-end';
1224
+ }
1225
+ return 'flex-start';
1226
+ }
1227
+ onHeaderClick(event) {
1228
+ if (!this.sortEnabled) {
1229
+ return;
1230
+ }
1231
+ event.stopPropagation();
1232
+ this.sortToggle.emit(event);
1233
+ }
1234
+ /**
1235
+ * When true, the cell body uses flex so `justify-content` can place content on the main axis.
1236
+ */
1237
+ getCellUseFlexLayout() {
1238
+ return !!this.expandHandler || this.resolveAlignForSide('cell') !== 'start';
1239
+ }
1240
+ /**
1241
+ * Flex `justify-content` for the cell wrapper; omit when not using flex layout.
1242
+ */
1243
+ getCellJustifyContent() {
1244
+ if (!this.getCellUseFlexLayout()) {
1245
+ return null;
1246
+ }
1247
+ return this.resolveAlignForSide('cell');
1248
+ }
1249
+ resolveAlignForSide(side) {
1250
+ const align = this.mergedOptions().align;
1251
+ if (align == null || align === '') {
1252
+ return 'start';
1253
+ }
1254
+ if (typeof align === 'string') {
1255
+ return this.normalizeColumnAlignment(align);
1256
+ }
1257
+ if (typeof align === 'object' && !Array.isArray(align)) {
1258
+ const raw = side === 'header' ? align.header : align.cell;
1259
+ return this.normalizeColumnAlignment(raw);
1260
+ }
1261
+ return 'start';
1262
+ }
1263
+ normalizeColumnAlignment(value) {
1264
+ if (value === 'center' || value === 'end' || value === 'start') {
1265
+ return value;
1266
+ }
1267
+ if (value && typeof value === 'object' && 'id' in value) {
1268
+ const id = value.id;
1269
+ if (id === 'center' || id === 'end' || id === 'start') {
1270
+ return id;
1271
+ }
1272
+ }
1273
+ return 'start';
1274
+ }
1275
+ //#endregion
1253
1276
  get loadingEnabled() {
1254
1277
  return true;
1255
1278
  }
@@ -1274,6 +1297,7 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1274
1297
  const tokenValue = {
1275
1298
  path: this.node.path,
1276
1299
  options: this.mergedOptions(),
1300
+ caption: this.caption,
1277
1301
  };
1278
1302
  this.widgetInjector = Injector.create({
1279
1303
  parent: this.injector,
@@ -1286,8 +1310,14 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1286
1310
  });
1287
1311
  this.width = this.mergedOptions().width === 'auto' ? 'auto' : this.customWidth ? this.customWidth : (this.mergedOptions().width ?? '200px');
1288
1312
  this.allowResizing = this.mergedOptions().allowResizing || true;
1313
+ this.allowSorting = this.sortEnabled;
1289
1314
  this.cdr.detectChanges();
1290
1315
  }
1316
+ ngOnChanges() {
1317
+ this.allowSorting = this.sortEnabled;
1318
+ this.sortOrder = this.headerSortDirection;
1319
+ this.sortIndex = this.headerSortPriority;
1320
+ }
1291
1321
  //#region ---- Performance Optimization Methods ----
1292
1322
  /**
1293
1323
  * Check if options contain any expressions that need evaluation
@@ -1372,6 +1402,7 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1372
1402
  const tokenValue = {
1373
1403
  path: this.node.path,
1374
1404
  options: this.mergedOptions(),
1405
+ caption: this.caption,
1375
1406
  };
1376
1407
  rowInjector = Injector.create({
1377
1408
  parent: this.injector,
@@ -1404,6 +1435,7 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1404
1435
  const tokenValue = {
1405
1436
  path: this.node.path,
1406
1437
  options: evaluatedOptions,
1438
+ caption: this.caption,
1407
1439
  };
1408
1440
  const newInjector = Injector.create({
1409
1441
  parent: this.injector,
@@ -1430,6 +1462,7 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1430
1462
  const tokenValue = {
1431
1463
  path: this.node.path,
1432
1464
  options: this.mergedOptions(),
1465
+ caption: this.caption,
1433
1466
  };
1434
1467
  rowInjector = Injector.create({
1435
1468
  parent: this.injector,
@@ -1446,19 +1479,49 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1446
1479
  }
1447
1480
  return rowInjector;
1448
1481
  }
1449
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetColumnRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1450
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: AXPWidgetColumnRendererComponent, isStandalone: false, selector: "axp-widget-column-renderer", inputs: { caption: "caption", customExpandIcon: "customExpandIcon", customCollapseIcon: "customCollapseIcon", customWidth: "customWidth", node: "node", footerTemplate: "footerTemplate", expandHandler: "expandHandler", cellTemplate: "cellTemplate", headerTemplate: "headerTemplate" }, providers: [
1482
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetColumnRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1483
+ 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", sortEnabled: "sortEnabled", headerSortDirection: "headerSortDirection", headerSortPriority: "headerSortPriority", cellTemplate: "cellTemplate", headerTemplate: "headerTemplate" }, outputs: { sortToggle: "sortToggle" }, providers: [
1451
1484
  AXPWidgetCoreService,
1452
1485
  { provide: AXDataTableColumnComponent, useExisting: AXPWidgetColumnRendererComponent },
1453
- ], 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: `
1454
- <ng-template #header>{{ caption | translate | async }}</ng-template>
1486
+ ], 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, usesOnChanges: true, ngImport: i0, template: `
1487
+ <ng-template #header>
1488
+ <div
1489
+ class="axp-widget-column-header ax-w-full ax-flex ax-items-center ax-gap-1 ax-select-none"
1490
+ [class.axp-widget-column-header--sortable]="sortEnabled"
1491
+ [style.justify-content]="getHeaderJustifyContent()"
1492
+ (click)="onHeaderClick($event)"
1493
+ >
1494
+ <span class="axp-widget-column-header__caption ax-truncate">{{ caption | translate | async }}</span>
1495
+ @if (sortEnabled) {
1496
+ <span class="axp-widget-column-header__sort ax-flex ax-items-center ax-gap-0.5 ax-shrink-0">
1497
+ @if (headerSortPriority !== undefined && headerSortPriority > 1) {
1498
+ <span class="axp-widget-column-header__sort-priority ax-text-xs ax-opacity-70">{{ headerSortPriority }}</span>
1499
+ }
1500
+ <i
1501
+ class="fa-solid fa-arrow-up-long ax-text-neutral-400"
1502
+ [class.ax-text-primary]="headerSortDirection === 'asc'"
1503
+ ></i>
1504
+ <i
1505
+ class="fa-solid fa-arrow-down-long ax-text-neutral-400"
1506
+ [class.ax-text-primary]="headerSortDirection === 'desc'"
1507
+ ></i>
1508
+ </span>
1509
+ }
1510
+ </div>
1511
+ </ng-template>
1455
1512
  <ng-template #cell let-row>
1456
- <div [class]="expandHandler ? 'ax-flex ax-gap-2 ax-items-center' : ''">
1513
+ <div
1514
+ class="ax-w-full"
1515
+ [class.ax-flex]="getCellUseFlexLayout()"
1516
+ [class.ax-gap-2]="expandHandler"
1517
+ [class.ax-items-center]="getCellUseFlexLayout()"
1518
+ [style.justify-content]="getCellJustifyContent()"
1519
+ >
1457
1520
  @if (expandHandler) {
1458
1521
  <div
1459
1522
  (click)="handleExpandRow(row)"
1460
1523
  class="ax-expand-handler"
1461
- [class.ax-invisible]="row.data.hasChild === false"
1524
+ [class.ax-invisible]="!hasExpandableRow(row)"
1462
1525
  id="ax-expand-handler-container"
1463
1526
  [style.padding-inline-start.rem]="row.data?.__meta__?.level * 2"
1464
1527
  >
@@ -1481,21 +1544,49 @@ class AXPWidgetColumnRendererComponent extends AXDataTableColumnComponent {
1481
1544
  </div>
1482
1545
  </ng-template>
1483
1546
  <ng-template #footer></ng-template>
1484
- `, 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 }); }
1547
+ `, isInline: true, styles: [".axp-widget-column-header--sortable{cursor:pointer}.axp-widget-column-header__caption{min-width:0}.axp-widget-column-header__sort{opacity:0;transition:opacity .15s ease}.axp-widget-column-header--sortable:hover .axp-widget-column-header__sort,.axp-widget-column-header--sortable:focus-within .axp-widget-column-header__sort{opacity:1}.axp-widget-column-header__sort-priority{line-height:1}:host-context(.ax-data-table-head-cell.ax-interactive:hover) .axp-widget-column-header__sort,:host-context(.ax-data-table-head-cell.ax-interactive:focus-within) .axp-widget-column-header__sort{opacity:1}\n"], 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 }); }
1485
1548
  }
1486
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetColumnRendererComponent, decorators: [{
1549
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetColumnRendererComponent, decorators: [{
1487
1550
  type: Component,
1488
- args: [{
1489
- selector: 'axp-widget-column-renderer',
1490
- template: `
1491
- <ng-template #header>{{ caption | translate | async }}</ng-template>
1551
+ args: [{ selector: 'axp-widget-column-renderer', template: `
1552
+ <ng-template #header>
1553
+ <div
1554
+ class="axp-widget-column-header ax-w-full ax-flex ax-items-center ax-gap-1 ax-select-none"
1555
+ [class.axp-widget-column-header--sortable]="sortEnabled"
1556
+ [style.justify-content]="getHeaderJustifyContent()"
1557
+ (click)="onHeaderClick($event)"
1558
+ >
1559
+ <span class="axp-widget-column-header__caption ax-truncate">{{ caption | translate | async }}</span>
1560
+ @if (sortEnabled) {
1561
+ <span class="axp-widget-column-header__sort ax-flex ax-items-center ax-gap-0.5 ax-shrink-0">
1562
+ @if (headerSortPriority !== undefined && headerSortPriority > 1) {
1563
+ <span class="axp-widget-column-header__sort-priority ax-text-xs ax-opacity-70">{{ headerSortPriority }}</span>
1564
+ }
1565
+ <i
1566
+ class="fa-solid fa-arrow-up-long ax-text-neutral-400"
1567
+ [class.ax-text-primary]="headerSortDirection === 'asc'"
1568
+ ></i>
1569
+ <i
1570
+ class="fa-solid fa-arrow-down-long ax-text-neutral-400"
1571
+ [class.ax-text-primary]="headerSortDirection === 'desc'"
1572
+ ></i>
1573
+ </span>
1574
+ }
1575
+ </div>
1576
+ </ng-template>
1492
1577
  <ng-template #cell let-row>
1493
- <div [class]="expandHandler ? 'ax-flex ax-gap-2 ax-items-center' : ''">
1578
+ <div
1579
+ class="ax-w-full"
1580
+ [class.ax-flex]="getCellUseFlexLayout()"
1581
+ [class.ax-gap-2]="expandHandler"
1582
+ [class.ax-items-center]="getCellUseFlexLayout()"
1583
+ [style.justify-content]="getCellJustifyContent()"
1584
+ >
1494
1585
  @if (expandHandler) {
1495
1586
  <div
1496
1587
  (click)="handleExpandRow(row)"
1497
1588
  class="ax-expand-handler"
1498
- [class.ax-invisible]="row.data.hasChild === false"
1589
+ [class.ax-invisible]="!hasExpandableRow(row)"
1499
1590
  id="ax-expand-handler-container"
1500
1591
  [style.padding-inline-start.rem]="row.data?.__meta__?.level * 2"
1501
1592
  >
@@ -1518,15 +1609,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1518
1609
  </div>
1519
1610
  </ng-template>
1520
1611
  <ng-template #footer></ng-template>
1521
- `,
1522
- providers: [
1612
+ `, providers: [
1523
1613
  AXPWidgetCoreService,
1524
1614
  { provide: AXDataTableColumnComponent, useExisting: AXPWidgetColumnRendererComponent },
1525
- ],
1526
- changeDetection: ChangeDetectionStrategy.OnPush,
1527
- inputs: ['caption'],
1528
- standalone: false,
1529
- }]
1615
+ ], changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['caption'], standalone: false, styles: [".axp-widget-column-header--sortable{cursor:pointer}.axp-widget-column-header__caption{min-width:0}.axp-widget-column-header__sort{opacity:0;transition:opacity .15s ease}.axp-widget-column-header--sortable:hover .axp-widget-column-header__sort,.axp-widget-column-header--sortable:focus-within .axp-widget-column-header__sort{opacity:1}.axp-widget-column-header__sort-priority{line-height:1}:host-context(.ax-data-table-head-cell.ax-interactive:hover) .axp-widget-column-header__sort,:host-context(.ax-data-table-head-cell.ax-interactive:focus-within) .axp-widget-column-header__sort{opacity:1}\n"] }]
1530
1616
  }], propDecorators: { customExpandIcon: [{
1531
1617
  type: Input
1532
1618
  }], customCollapseIcon: [{
@@ -1543,6 +1629,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1543
1629
  args: ['footer']
1544
1630
  }], expandHandler: [{
1545
1631
  type: Input
1632
+ }], sortEnabled: [{
1633
+ type: Input
1634
+ }], headerSortDirection: [{
1635
+ type: Input
1636
+ }], headerSortPriority: [{
1637
+ type: Input
1638
+ }], sortToggle: [{
1639
+ type: Output
1546
1640
  }], cellTemplate: [{
1547
1641
  type: Input
1548
1642
  }], _contentCellTemplate: [{
@@ -1563,15 +1657,15 @@ class AXPWidgetContainerComponent {
1563
1657
  this.builderService.setFunctions(v);
1564
1658
  }
1565
1659
  constructor() {
1566
- this.contextService = inject(AXPWidgetCoreContextStore);
1660
+ this.contextService = inject(AXPContextStore);
1567
1661
  this.builderService = inject(AXPWidgetCoreService);
1568
1662
  this.onContextChanged = new EventEmitter();
1569
1663
  this.status = computed(() => {
1570
1664
  return this.builderService.status();
1571
- }, ...(ngDevMode ? [{ debugName: "status" }] : []));
1665
+ }, ...(ngDevMode ? [{ debugName: "status" }] : /* istanbul ignore next */ []));
1572
1666
  this.isBusy = computed(() => {
1573
1667
  return this.builderService.isBusy();
1574
- }, ...(ngDevMode ? [{ debugName: "isBusy" }] : []));
1668
+ }, ...(ngDevMode ? [{ debugName: "isBusy" }] : /* istanbul ignore next */ []));
1575
1669
  effect(() => {
1576
1670
  if (this.contextService.isChanged()) {
1577
1671
  this.onContextChanged.emit(this.contextService.changeEvent());
@@ -1584,17 +1678,17 @@ class AXPWidgetContainerComponent {
1584
1678
  find(name) {
1585
1679
  return this.builderService.waitForWidget(name);
1586
1680
  }
1587
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1588
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.12", 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 }); }
1681
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1682
+ 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 }); }
1589
1683
  }
1590
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetContainerComponent, decorators: [{
1684
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetContainerComponent, decorators: [{
1591
1685
  type: Component,
1592
1686
  args: [{
1593
1687
  selector: 'axp-widgets-container',
1594
1688
  template: `<ng-content></ng-content>`,
1595
1689
  changeDetection: ChangeDetectionStrategy.OnPush,
1596
1690
  host: { style: 'display: contents;' },
1597
- providers: [AXPWidgetCoreService, AXPWidgetCoreContextStore],
1691
+ providers: [AXPWidgetCoreService, AXPContextStore],
1598
1692
  standalone: false,
1599
1693
  }]
1600
1694
  }], ctorParameters: () => [], propDecorators: { onContextChanged: [{
@@ -1606,12 +1700,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
1606
1700
  }] } });
1607
1701
 
1608
1702
  class AXPWidgetPlaceholderComponent {
1609
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1610
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.12", type: AXPWidgetPlaceholderComponent, isStandalone: true, selector: "axp-widget-placeholder", ngImport: i0, template: `<div>
1703
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1704
+ 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>
1611
1705
  <ax-skeleton class="ax-w-full ax-h-10 ax-rounded-md"></ax-skeleton>
1612
1706
  </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1613
1707
  }
1614
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetPlaceholderComponent, decorators: [{
1708
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetPlaceholderComponent, decorators: [{
1615
1709
  type: Component,
1616
1710
  args: [{
1617
1711
  selector: 'axp-widget-placeholder',
@@ -1628,11 +1722,11 @@ class AXPWidgetRendererDirective {
1628
1722
  //#endregion
1629
1723
  //#endregion
1630
1724
  constructor() {
1631
- this.parentNode = input(...(ngDevMode ? [undefined, { debugName: "parentNode" }] : []));
1632
- this.index = input(...(ngDevMode ? [undefined, { debugName: "index" }] : []));
1633
- this.mode = input.required(...(ngDevMode ? [{ debugName: "mode" }] : []));
1634
- this.node = input.required(...(ngDevMode ? [{ debugName: "node" }] : []));
1635
- this._options = signal({}, ...(ngDevMode ? [{ debugName: "_options" }] : []));
1725
+ this.parentNode = input(...(ngDevMode ? [undefined, { debugName: "parentNode" }] : /* istanbul ignore next */ []));
1726
+ this.index = input(...(ngDevMode ? [undefined, { debugName: "index" }] : /* istanbul ignore next */ []));
1727
+ this.mode = input.required(...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1728
+ this.node = input.required(...(ngDevMode ? [{ debugName: "node" }] : /* istanbul ignore next */ []));
1729
+ this._options = signal({}, ...(ngDevMode ? [{ debugName: "_options" }] : /* istanbul ignore next */ []));
1636
1730
  this.options = this._options.asReadonly();
1637
1731
  this.onOptionsChanged = output();
1638
1732
  this.onValueChanged = output();
@@ -1641,22 +1735,22 @@ class AXPWidgetRendererDirective {
1641
1735
  /**
1642
1736
  * Signal that emits the component reference when it's ready
1643
1737
  */
1644
- this._componentRefSignal = signal(null, ...(ngDevMode ? [{ debugName: "_componentRefSignal" }] : []));
1738
+ this._componentRefSignal = signal(null, ...(ngDevMode ? [{ debugName: "_componentRefSignal" }] : /* istanbul ignore next */ []));
1645
1739
  this.componentRefSignal = this._componentRefSignal.asReadonly();
1646
1740
  //#endregion
1647
1741
  //#region ---- Properties ----
1648
- this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : []));
1742
+ this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
1649
1743
  this.injector = inject(Injector);
1650
1744
  this.builderService = inject(AXPWidgetCoreService);
1651
- this.contextService = inject(AXPWidgetCoreContextStore);
1745
+ this.contextService = inject(AXPContextStore);
1652
1746
  this.widgetRegistery = inject(AXPWidgetRegistryService);
1653
1747
  this.unsubscriber = inject(AXUnsubscriber);
1654
1748
  this.translateService = inject(AXTranslationService);
1655
1749
  this.widgetService = inject(AXPWidgetRegistryService);
1656
1750
  this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
1657
1751
  this.viewContainerRef = inject(ViewContainerRef);
1658
- this.isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
1659
- this.isVisible = signal(true, ...(ngDevMode ? [{ debugName: "isVisible" }] : []));
1752
+ this.isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
1753
+ this.isVisible = signal(true, ...(ngDevMode ? [{ debugName: "isVisible" }] : /* istanbul ignore next */ []));
1660
1754
  this.expressionEvaluators = new Map();
1661
1755
  this.renderTimeoutId = null;
1662
1756
  this.hasInitialRender = false;
@@ -1703,12 +1797,12 @@ class AXPWidgetRendererDirective {
1703
1797
  await this.updateOptionsBasedOnContext();
1704
1798
  this.applyOptions();
1705
1799
  }
1706
- await this.updateVisibility();
1707
1800
  }
1708
1801
  else if (changed.path && this.isRelevantContextChange(changed.path)) {
1709
1802
  // console.log(`🎯 [${this.node().type}] Context change detected: ${changed.path}`);
1710
1803
  this.queueContextUpdate(changed.path);
1711
1804
  }
1805
+ await this.updateVisibility();
1712
1806
  });
1713
1807
  this.builderService.onRefresh.pipe(this.unsubscriber.takeUntilDestroy).subscribe(async () => {
1714
1808
  await this.processBatchedUpdates();
@@ -1834,77 +1928,88 @@ class AXPWidgetRendererDirective {
1834
1928
  }
1835
1929
  return false;
1836
1930
  }
1931
+ /**
1932
+ * True when a context store path used in an expression (`context.eval`, `context.options`) is
1933
+ * affected by `changedPath`.
1934
+ */
1935
+ contextStorePathDependsOnChangedPath(evalPath, changedPath) {
1936
+ const normalizePath = (p) => {
1937
+ if (!p)
1938
+ return p;
1939
+ const parts = p.split('.');
1940
+ const last = parts[parts.length - 1];
1941
+ if (last && last.endsWith('Id')) {
1942
+ parts.splice(parts.length - 1, 1, last.slice(0, -2), 'id');
1943
+ }
1944
+ return parts.join('.');
1945
+ };
1946
+ const isSegmentSuffix = (a, b) => {
1947
+ if (!a || !b)
1948
+ return false;
1949
+ const pa = a.split('.');
1950
+ const pb = b.split('.');
1951
+ if (pb.length > pa.length)
1952
+ return false;
1953
+ for (let i = 1; i <= pb.length; i++) {
1954
+ if (pa[pa.length - i] !== pb[pb.length - i])
1955
+ return false;
1956
+ }
1957
+ return true;
1958
+ };
1959
+ const evalNorm = normalizePath(evalPath);
1960
+ const changedNorm = normalizePath(changedPath);
1961
+ const rawMatch = evalPath === changedPath ||
1962
+ evalPath.startsWith(changedPath + '.') ||
1963
+ changedPath.startsWith(evalPath + '.') ||
1964
+ isSegmentSuffix(evalPath, changedPath) ||
1965
+ isSegmentSuffix(changedPath, evalPath);
1966
+ const normMatch = evalNorm === changedNorm ||
1967
+ evalNorm.startsWith(changedNorm + '.') ||
1968
+ changedNorm.startsWith(evalNorm + '.') ||
1969
+ isSegmentSuffix(evalNorm, changedNorm) ||
1970
+ isSegmentSuffix(changedNorm, evalNorm);
1971
+ if (rawMatch || normMatch) {
1972
+ return true;
1973
+ }
1974
+ return this.isPathAlias(evalPath, changedPath);
1975
+ }
1976
+ /**
1977
+ * Whether an expression template string reads context store paths affected by `changedPath`.
1978
+ */
1979
+ expressionTextDependsOnContextPath(expressionValue, changedPath) {
1980
+ const contextEvalRegex = /context\.eval\(['"]([^'\"]+)['"]\)/g;
1981
+ let match;
1982
+ while ((match = contextEvalRegex.exec(expressionValue)) !== null) {
1983
+ if (this.contextStorePathDependsOnChangedPath(match[1], changedPath)) {
1984
+ return true;
1985
+ }
1986
+ }
1987
+ const contextOptionsQuoted = /context\.options\(\s*['"]([^'"]*)['"]\s*\)/g;
1988
+ while ((match = contextOptionsQuoted.exec(expressionValue)) !== null) {
1989
+ const sub = match[1];
1990
+ const evalPath = sub === '' ? 'options' : `options.${sub}`;
1991
+ if (this.contextStorePathDependsOnChangedPath(evalPath, changedPath)) {
1992
+ return true;
1993
+ }
1994
+ }
1995
+ const contextOptionsEmpty = /context\.options\(\s*\)/g;
1996
+ while ((match = contextOptionsEmpty.exec(expressionValue)) !== null) {
1997
+ if (this.contextStorePathDependsOnChangedPath('options', changedPath)) {
1998
+ return true;
1999
+ }
2000
+ }
2001
+ return false;
2002
+ }
1837
2003
  hasExpressionDependency(changedPath) {
1838
- // Check if any cached expressions depend on the changed path
1839
2004
  for (const [path, evaluator] of this.expressionEvaluators) {
1840
- // Check if the expression path itself contains the changed path
1841
2005
  if (path.includes(changedPath)) {
1842
2006
  return true;
1843
2007
  }
1844
- // Parse the actual expression content to check for context.eval() calls
1845
- // We need to get the original expression string to analyze it
1846
2008
  const node = this.node();
1847
2009
  const expressionValue = this.getExpressionValueFromNode(node, path);
1848
2010
  if (expressionValue && typeof expressionValue === 'string') {
1849
- // Look for context.eval() calls that reference the changed path
1850
- const contextEvalRegex = /context\.eval\(['"]([^'\"]+)['"]\)/g;
1851
- let match;
1852
- while ((match = contextEvalRegex.exec(expressionValue)) !== null) {
1853
- const evalPath = match[1];
1854
- // Normalize Id-suffixed segments to dot-id form (e.g., 'typeId' -> 'type.id', 'person.typeId' -> 'person.type.id')
1855
- const normalizePath = (p) => {
1856
- if (!p)
1857
- return p;
1858
- const parts = p.split('.');
1859
- const last = parts[parts.length - 1];
1860
- if (last && last.endsWith('Id')) {
1861
- parts.splice(parts.length - 1, 1, last.slice(0, -2), 'id');
1862
- }
1863
- return parts.join('.');
1864
- };
1865
- const isSegmentSuffix = (a, b) => {
1866
- if (!a || !b)
1867
- return false;
1868
- const pa = a.split('.');
1869
- const pb = b.split('.');
1870
- if (pb.length > pa.length)
1871
- return false;
1872
- for (let i = 1; i <= pb.length; i++) {
1873
- if (pa[pa.length - i] !== pb[pb.length - i])
1874
- return false;
1875
- }
1876
- return true;
1877
- };
1878
- const evalNorm = normalizePath(evalPath);
1879
- const changedNorm = normalizePath(changedPath);
1880
- // Debug log for dependency check
1881
- // console.log(
1882
- // `🧭 [${this.node().type}] dep-check expr='${path}', changed='${changedPath}', eval='${evalPath}', evalNorm='${evalNorm}', changedNorm='${changedNorm}'`,
1883
- // );
1884
- // Generic direct and hierarchical dependency checks (raw and normalized)
1885
- const rawMatch = evalPath === changedPath ||
1886
- evalPath.startsWith(changedPath + '.') ||
1887
- changedPath.startsWith(evalPath + '.') ||
1888
- isSegmentSuffix(evalPath, changedPath) ||
1889
- isSegmentSuffix(changedPath, evalPath);
1890
- const normMatch = evalNorm === changedNorm ||
1891
- evalNorm.startsWith(changedNorm + '.') ||
1892
- changedNorm.startsWith(evalNorm + '.') ||
1893
- isSegmentSuffix(evalNorm, changedNorm) ||
1894
- isSegmentSuffix(changedNorm, evalNorm);
1895
- if (rawMatch || normMatch) {
1896
- // console.log(
1897
- // `🔍 [${this.node().type}] Expression '${path}' depends on '${changedPath}' via context.eval('${evalPath}') (generic match)`,
1898
- // );
1899
- return true;
1900
- }
1901
- // Check for path aliases/mappings (e.g., typeId.id <-> type.id)
1902
- if (this.isPathAlias(evalPath, changedPath)) {
1903
- // console.log(
1904
- // `🔍 [${this.node().type}] Expression '${path}' depends on '${changedPath}' via context.eval('${evalPath}') (path alias)`,
1905
- // );
1906
- return true;
1907
- }
2011
+ if (this.expressionTextDependsOnContextPath(expressionValue, changedPath)) {
2012
+ return true;
1908
2013
  }
1909
2014
  }
1910
2015
  }
@@ -1991,20 +2096,8 @@ class AXPWidgetRendererDirective {
1991
2096
  const visibility = node.options?.['visible'] || this.mergedOptions()?.visible;
1992
2097
  if (!visibility || typeof visibility !== 'string')
1993
2098
  return false;
1994
- // Check if visibility expression depends on the changed path
1995
2099
  if (this.expressionEvaluator.isExpression(visibility)) {
1996
- // Parse the visibility expression to check for context.eval() calls
1997
- const contextEvalRegex = /context\.eval\(['"]([^'\"]+)['"]\)/g;
1998
- let match;
1999
- while ((match = contextEvalRegex.exec(visibility)) !== null) {
2000
- const evalPath = match[1];
2001
- // Check for direct or hierarchical dependency
2002
- if (evalPath === changedPath ||
2003
- evalPath.startsWith(changedPath + '.') ||
2004
- changedPath.startsWith(evalPath + '.')) {
2005
- return true;
2006
- }
2007
- }
2100
+ return this.expressionTextDependsOnContextPath(visibility, changedPath);
2008
2101
  }
2009
2102
  return false;
2010
2103
  }
@@ -2285,8 +2378,13 @@ class AXPWidgetRendererDirective {
2285
2378
  const newValue = await evaluator();
2286
2379
  const evalTime = performance.now() - evalStartTime;
2287
2380
  // Check if result has actually changed using Lodash isEqual
2381
+ // Important: We must check if the key exists in the map, not just compare values
2382
+ // This handles the case where the expression evaluates to `undefined` for the first time
2383
+ // Without this check, `undefined` would be incorrectly treated as "no change"
2384
+ // because Map.get() returns `undefined` for non-existent keys
2385
+ const hasLastValue = this.lastExpressionResults.has(path);
2288
2386
  const lastValue = this.lastExpressionResults.get(path);
2289
- const hasChanged = !isEqual(newValue, lastValue);
2387
+ const hasChanged = !hasLastValue || !isEqual(newValue, lastValue);
2290
2388
  if (hasChanged) {
2291
2389
  // console.log(
2292
2390
  // `📝 [${this.node().type}] Expression '${path}' evaluated in ${evalTime.toFixed(2)}ms - value changed`,
@@ -2365,7 +2463,8 @@ class AXPWidgetRendererDirective {
2365
2463
  if (!this.isVisible()) {
2366
2464
  this.isVisible.set(true);
2367
2465
  if (this.componentRef && this.componentRef.location) {
2368
- this.componentRef.location.nativeElement.style.display = '';
2466
+ this.loadComponent();
2467
+ // this.componentRef.location.nativeElement.style.display = '';
2369
2468
  }
2370
2469
  }
2371
2470
  }
@@ -2373,7 +2472,8 @@ class AXPWidgetRendererDirective {
2373
2472
  if (this.isVisible()) {
2374
2473
  this.isVisible.set(false);
2375
2474
  if (this.componentRef && this.componentRef.location) {
2376
- this.componentRef.location.nativeElement.style.display = 'none';
2475
+ this.componentRef.destroy();
2476
+ // this.componentRef.location.nativeElement.style.display = 'none';
2377
2477
  }
2378
2478
  }
2379
2479
  }
@@ -2413,34 +2513,46 @@ class AXPWidgetRendererDirective {
2413
2513
  isDirty: () => {
2414
2514
  return this.contextService.isDirty();
2415
2515
  },
2516
+ /**
2517
+ * Host/widget-under-edit `options` from the shared context store (same values as
2518
+ * `context.eval('options' + (path ? '.' + path : ''))`), not `widget.options` on the nested
2519
+ * property field instance. Uses one `getValue` so smart-path behavior matches `context.eval`.
2520
+ */
2521
+ options: (path) => {
2522
+ if (path == null || path === '') {
2523
+ return this.contextService.getValue('options');
2524
+ }
2525
+ return this.contextService.getValue(`options.${path}`);
2526
+ },
2416
2527
  };
2417
2528
  }
2418
2529
  getEventScope() {
2419
2530
  return {
2420
- context: (path) => {
2531
+ context: (...paths) => {
2421
2532
  return this.onContextChanged.pipe(filter((c) => {
2422
- // If no path filter specified, pass all events
2423
- if (path == null || path === '') {
2533
+ const activePaths = paths.filter((p) => !!p && p.trim().length > 0);
2534
+ // If no path filters specified, pass all events
2535
+ if (activePaths.length === 0) {
2424
2536
  return true;
2425
2537
  }
2426
2538
  // Ensure c.path exists
2427
2539
  if (!c.path) {
2428
2540
  return false;
2429
2541
  }
2430
- // Pattern: "prefix*" - matches paths that start with prefix
2431
- if (path.endsWith('*')) {
2432
- const prefix = path.substring(0, path.length - 1);
2433
- return c.path.startsWith(prefix);
2434
- }
2435
- // Pattern: "*suffix" - matches paths that end with suffix
2436
- else if (path.startsWith('*')) {
2437
- const suffix = path.substring(1);
2438
- return c.path.endsWith(suffix);
2439
- }
2440
- // Exact match
2441
- else {
2542
+ return activePaths.some((path) => {
2543
+ // Pattern: "prefix*" - matches paths that start with prefix
2544
+ if (path.endsWith('*')) {
2545
+ const prefix = path.substring(0, path.length - 1);
2546
+ return c.path.startsWith(prefix);
2547
+ }
2548
+ // Pattern: "*suffix" - matches paths that end with suffix
2549
+ if (path.startsWith('*')) {
2550
+ const suffix = path.substring(1);
2551
+ return c.path.endsWith(suffix);
2552
+ }
2553
+ // Exact match
2442
2554
  return c.path === path;
2443
- }
2555
+ });
2444
2556
  }));
2445
2557
  },
2446
2558
  from: (event) => get(this.instance.api(), event),
@@ -2451,6 +2563,16 @@ class AXPWidgetRendererDirective {
2451
2563
  }
2452
2564
  getWidgetScope() {
2453
2565
  return {
2566
+ /** Resolved options for this renderer's widget instance (not the host / property-viewer target). */
2567
+ options: (path) => {
2568
+ const opts = this.instance && typeof this.instance.options === 'function'
2569
+ ? this.instance.options()
2570
+ : this.mergedOptions();
2571
+ if (path == null || path === '') {
2572
+ return opts;
2573
+ }
2574
+ return getSmart(opts, path);
2575
+ },
2454
2576
  call: (name, ...args) => {
2455
2577
  this.instance.call(name, ...args);
2456
2578
  },
@@ -2471,7 +2593,7 @@ class AXPWidgetRendererDirective {
2471
2593
  }
2472
2594
  },
2473
2595
  output: (name) => {
2474
- this.instance.output(name);
2596
+ return this.instance.output(name);
2475
2597
  },
2476
2598
  find: (id) => {
2477
2599
  return this.builderService.getWidget(id);
@@ -2556,14 +2678,14 @@ class AXPWidgetRendererDirective {
2556
2678
  // console.error('Error evaluating action expression:', templateExpression, error);
2557
2679
  }
2558
2680
  }
2559
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetRendererDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2560
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.12", type: AXPWidgetRendererDirective, isStandalone: false, selector: "[axp-widget-renderer]", inputs: { parentNode: { classPropertyName: "parentNode", publicName: "parentNode", isSignal: true, isRequired: false, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: true, transformFunction: null }, node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { onOptionsChanged: "onOptionsChanged", onValueChanged: "onValueChanged", onLoad: "onLoad" }, providers: [
2681
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRendererDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2682
+ 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: [
2561
2683
  {
2562
2684
  provide: AXUnsubscriber,
2563
2685
  },
2564
2686
  ], exportAs: ["widgetRenderer"], usesOnChanges: true, ngImport: i0 }); }
2565
2687
  }
2566
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetRendererDirective, decorators: [{
2688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetRendererDirective, decorators: [{
2567
2689
  type: Directive,
2568
2690
  args: [{
2569
2691
  selector: '[axp-widget-renderer]',
@@ -2579,63 +2701,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
2579
2701
 
2580
2702
  const COMPONENTS = [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective];
2581
2703
  class AXPWidgetCoreModule {
2582
- static forRoot(config) {
2583
- return {
2584
- ngModule: AXPWidgetCoreModule,
2585
- providers: [
2586
- {
2587
- provide: 'AXPWidgetCoreModuleFactory',
2588
- useFactory: (registry) => async () => {
2589
- await Promise.all(config?.widgets?.map((w) => Promise.resolve(registry.register(w))) || []);
2590
- await Promise.all(config?.extendedWidgets?.map((ew) => Promise.resolve(registry.extend(ew.parentName, ew.widget))) || []);
2591
- },
2592
- deps: [AXPWidgetRegistryService],
2593
- multi: true,
2594
- },
2595
- ],
2596
- };
2597
- }
2598
- static forChild(config) {
2599
- return {
2600
- ngModule: AXPWidgetCoreModule,
2601
- providers: [
2602
- {
2603
- provide: 'AXPWidgetCoreModuleFactory',
2604
- useFactory: (registry) => async () => {
2605
- await Promise.all(config?.widgets?.map((w) => Promise.resolve(registry.register(w))) || []);
2606
- await Promise.all(config?.extendedWidgets?.map((ew) => Promise.resolve(registry.extend(ew.parentName, ew.widget))) || []);
2607
- },
2608
- deps: [AXPWidgetRegistryService],
2609
- multi: true,
2610
- },
2611
- ],
2612
- };
2613
- }
2614
- /**
2615
- * @ignore
2616
- */
2617
- constructor(instances) {
2618
- instances?.forEach((f) => {
2619
- f();
2620
- });
2621
- }
2622
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetCoreModule, deps: [{ token: 'AXPWidgetCoreModuleFactory', optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
2623
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetCoreModule, declarations: [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective], imports: [CommonModule, PortalModule, AXSkeletonModule, CommonModule, AXTranslationModule], exports: [AXPWidgetContainerComponent, AXPWidgetColumnRendererComponent, AXPWidgetRendererDirective] }); }
2624
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetCoreModule, imports: [CommonModule, PortalModule, AXSkeletonModule, CommonModule, AXTranslationModule] }); }
2704
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2705
+ 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] }); }
2706
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreModule, imports: [CommonModule, PortalModule, AXSkeletonModule, AXTranslationModule] }); }
2625
2707
  }
2626
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPWidgetCoreModule, decorators: [{
2708
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetCoreModule, decorators: [{
2627
2709
  type: NgModule,
2628
2710
  args: [{
2629
- imports: [CommonModule, PortalModule, AXSkeletonModule, CommonModule, AXTranslationModule],
2711
+ imports: [CommonModule, PortalModule, AXSkeletonModule, AXTranslationModule],
2630
2712
  exports: [...COMPONENTS],
2631
2713
  declarations: [...COMPONENTS],
2714
+ providers: [],
2632
2715
  }]
2633
- }], ctorParameters: () => [{ type: undefined, decorators: [{
2634
- type: Optional
2635
- }, {
2636
- type: Inject,
2637
- args: ['AXPWidgetCoreModuleFactory']
2638
- }] }] });
2716
+ }] });
2717
+
2718
+ //#endregion
2719
+ //#region ---- Mapping ----
2720
+ /**
2721
+ * Converts a domain {@link AXPProperty} into a {@link AXPWidgetProperty} row for
2722
+ * the layout property viewer (`AXPPropertyViewerService` and `buildPropertyViewerTabsFromProperties`).
2723
+ */
2724
+ function mapAXPPropertyToWidgetProperty(property, options) {
2725
+ const { group, order, valuePathPrefix, resolveTitle, resolveDescription } = options;
2726
+ const path = valuePathPrefix ? `${valuePathPrefix}.${property.name}` : property.name;
2727
+ const iface = property.interface;
2728
+ const widgetType = iface?.type ?? 'text-editor';
2729
+ const description = resolveDescription?.(property);
2730
+ return {
2731
+ name: property.name,
2732
+ title: resolveTitle(property),
2733
+ ...(description !== undefined && description !== '' ? { description } : {}),
2734
+ group,
2735
+ order,
2736
+ schema: {
2737
+ dataType: property.dataType,
2738
+ interface: {
2739
+ path,
2740
+ name: property.name,
2741
+ type: widgetType,
2742
+ options: iface?.options ?? {},
2743
+ ...(iface?.triggers ? { triggers: iface.triggers } : {}),
2744
+ },
2745
+ },
2746
+ validations: property.validations,
2747
+ visible: true,
2748
+ };
2749
+ }
2750
+ //#endregion
2639
2751
 
2640
2752
  class AXPPropertyEditorHelper {
2641
2753
  static expandShorthand(values) {
@@ -2919,48 +3031,1539 @@ class AXPWidgetSerializationHelper {
2919
3031
  }
2920
3032
  //#endregion
2921
3033
 
3034
+ //#region ---- Editor sub-categories (widget picker) ----
3035
+ const AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS = {
3036
+ name: 'editor-text-inputs',
3037
+ order: 1,
3038
+ title: '@platform-layout-widgets:subcategories.editor-text-inputs.title',
3039
+ };
3040
+ const AXP_WIDGETS_EDITOR_SUB_NUMERIC = {
3041
+ name: 'editor-numeric',
3042
+ order: 2,
3043
+ title: '@platform-layout-widgets:subcategories.editor-numeric.title',
3044
+ };
3045
+ const AXP_WIDGETS_EDITOR_SUB_DATETIME = {
3046
+ name: 'editor-datetime',
3047
+ order: 3,
3048
+ title: '@platform-layout-widgets:subcategories.editor-datetime.title',
3049
+ };
3050
+ const AXP_WIDGETS_EDITOR_SUB_CHOICE = {
3051
+ name: 'editor-choice',
3052
+ order: 4,
3053
+ title: '@platform-layout-widgets:subcategories.editor-choice.title',
3054
+ };
3055
+ const AXP_WIDGETS_EDITOR_SUB_RICH = {
3056
+ name: 'editor-rich',
3057
+ order: 5,
3058
+ title: '@platform-layout-widgets:subcategories.editor-rich.title',
3059
+ };
3060
+ const AXP_WIDGETS_EDITOR_SUB_VISUAL = {
3061
+ name: 'editor-visual',
3062
+ order: 6,
3063
+ title: '@platform-layout-widgets:subcategories.editor-visual.title',
3064
+ };
3065
+ const AXP_WIDGETS_EDITOR_SUB_COMPOSITE = {
3066
+ name: 'editor-composite',
3067
+ order: 7,
3068
+ title: '@platform-layout-widgets:subcategories.editor-composite.title',
3069
+ };
3070
+ const AXP_WIDGETS_EDITOR_SUB_CONFIG = {
3071
+ name: 'editor-config',
3072
+ order: 8,
3073
+ title: '@platform-layout-widgets:subcategories.editor-config.title',
3074
+ };
3075
+ //#endregion
3076
+ //#region ---- Layout sub-categories (widget picker) ----
3077
+ const AXP_WIDGETS_LAYOUT_SUB_SHELL = {
3078
+ name: 'layout-shell',
3079
+ order: 1,
3080
+ title: '@platform-layout-widgets:subcategories.layout-shell.title',
3081
+ };
3082
+ const AXP_WIDGETS_LAYOUT_SUB_GRID = {
3083
+ name: 'layout-grid',
3084
+ order: 2,
3085
+ title: '@platform-layout-widgets:subcategories.layout-grid.title',
3086
+ };
3087
+ const AXP_WIDGETS_LAYOUT_SUB_SURFACES = {
3088
+ name: 'layout-surfaces',
3089
+ order: 3,
3090
+ title: '@platform-layout-widgets:subcategories.layout-surfaces.title',
3091
+ };
3092
+ const AXP_WIDGETS_LAYOUT_SUB_TABS = {
3093
+ name: 'layout-tabs',
3094
+ order: 4,
3095
+ title: '@platform-layout-widgets:subcategories.layout-tabs.title',
3096
+ };
3097
+ const AXP_WIDGETS_LAYOUT_SUB_LISTS = {
3098
+ name: 'layout-lists',
3099
+ order: 5,
3100
+ title: '@platform-layout-widgets:subcategories.layout-lists.title',
3101
+ };
3102
+ const AXP_WIDGETS_LAYOUT_SUB_UTILITY = {
3103
+ name: 'layout-utility',
3104
+ order: 6,
3105
+ title: '@platform-layout-widgets:subcategories.layout-utility.title',
3106
+ };
3107
+ //#endregion
3108
+ //#region ---- Action sub-categories (widget picker) ----
3109
+ const AXP_WIDGETS_ACTION_SUB_CONTROLS = {
3110
+ name: 'action-controls',
3111
+ order: 1,
3112
+ title: '@platform-layout-widgets:subcategories.action-controls.title',
3113
+ };
3114
+ //#endregion
3115
+ //#region ---- Advance sub-categories (widget picker) ----
3116
+ const AXP_WIDGETS_ADVANCE_SUB_MEDIA = {
3117
+ name: 'advance-media',
3118
+ order: 1,
3119
+ title: '@platform-layout-widgets:subcategories.advance-media.title',
3120
+ };
3121
+ const AXP_WIDGETS_ADVANCE_SUB_INPUT = {
3122
+ name: 'advance-input',
3123
+ order: 2,
3124
+ title: '@platform-layout-widgets:subcategories.advance-input.title',
3125
+ };
3126
+ const AXP_WIDGETS_ADVANCE_SUB_DATA = {
3127
+ name: 'advance-data',
3128
+ order: 3,
3129
+ title: '@platform-layout-widgets:subcategories.advance-data.title',
3130
+ };
3131
+ const AXP_WIDGETS_ADVANCE_SUB_TOOLS = {
3132
+ name: 'advance-tools',
3133
+ order: 4,
3134
+ title: '@platform-layout-widgets:subcategories.advance-tools.title',
3135
+ };
3136
+ //#endregion
3137
+ /** Normalizes widget categories to an array for iteration and serialization. */
3138
+ function normalizeWidgetCategories(categories) {
3139
+ if (categories == null) {
3140
+ return [];
3141
+ }
3142
+ return Array.isArray(categories) ? categories : [categories];
3143
+ }
2922
3144
  const AXP_WIDGETS_LAYOUT_CATEGORY = {
2923
3145
  name: 'layout',
2924
3146
  order: 1,
2925
- title: 'Layout',
3147
+ title: '@platform-layout-widgets:categories.layout.title',
2926
3148
  };
2927
3149
  const AXP_WIDGETS_EDITOR_CATEGORY = {
2928
3150
  name: 'editor',
2929
3151
  order: 2,
2930
- title: 'Editors',
3152
+ title: '@platform-layout-widgets:categories.editor.title',
2931
3153
  };
2932
3154
  const AXP_WIDGETS_ACTION_CATEGORY = {
2933
3155
  name: 'action',
2934
3156
  order: 3,
2935
- title: 'Action',
3157
+ title: '@platform-layout-widgets:categories.action.title',
2936
3158
  };
2937
3159
  const AXP_WIDGETS_ADVANCE_CATEGORY = {
2938
3160
  name: 'advance',
2939
3161
  order: 4,
2940
- title: 'Advance',
3162
+ title: '@platform-layout-widgets:categories.advance.title',
3163
+ };
3164
+ /** AI category tab in the widget picker (metadata); unrelated to Widgets:GetForAI listing scope. */
3165
+ const AXP_WIDGETS_AI_CATEGORY = {
3166
+ name: 'ai',
3167
+ order: 5,
3168
+ title: '@platform-layout-widgets:categories.ai.title',
2941
3169
  };
2942
3170
  const AXP_WIDGETS_CATEGORIES = [
2943
3171
  AXP_WIDGETS_LAYOUT_CATEGORY,
2944
3172
  AXP_WIDGETS_EDITOR_CATEGORY,
2945
3173
  AXP_WIDGETS_ACTION_CATEGORY,
2946
3174
  AXP_WIDGETS_ADVANCE_CATEGORY,
3175
+ AXP_WIDGETS_AI_CATEGORY,
2947
3176
  ];
2948
3177
 
2949
- var AXPWidgetGroupEnum;
2950
- (function (AXPWidgetGroupEnum) {
2951
- AXPWidgetGroupEnum["FormElement"] = "form-element";
2952
- AXPWidgetGroupEnum["DashboardWidget"] = "dashboard-widget";
2953
- AXPWidgetGroupEnum["FormTemplate"] = "form-template";
2954
- AXPWidgetGroupEnum["PropertyEditor"] = "property-editor";
2955
- AXPWidgetGroupEnum["MetaData"] = "meta-data";
2956
- AXPWidgetGroupEnum["SettingWidget"] = "setting-widget";
2957
- AXPWidgetGroupEnum["EntityWidget"] = "entity-widget";
2958
- AXPWidgetGroupEnum["UtilityWidget"] = "utility-widget";
2959
- })(AXPWidgetGroupEnum || (AXPWidgetGroupEnum = {}));
3178
+ /**
3179
+ * Standalone cell renderer using the same column-mode widget pipeline as {@link AXPWidgetColumnRendererComponent}.
3180
+ */
3181
+ class AXPWidgetColumnCellComponent {
3182
+ constructor() {
3183
+ this.caption = '';
3184
+ this.mergedOptions = signal({}, ...(ngDevMode ? [{ debugName: "mergedOptions" }] : /* istanbul ignore next */ []));
3185
+ this.rowInjectorsCache = new Map();
3186
+ this.hasExpressions = false;
3187
+ this.pendingEvaluations = new Set();
3188
+ this.changeDetectionScheduled = false;
3189
+ this.injector = inject(Injector);
3190
+ this.cdr = inject(ChangeDetectorRef);
3191
+ this.widgetRegistry = inject(AXPWidgetRegistryService);
3192
+ this.expressionEvaluator = inject(AXPExpressionEvaluatorService);
3193
+ }
3194
+ async ngOnInit() {
3195
+ await this.resolveComponent();
3196
+ }
3197
+ ngOnChanges(changes) {
3198
+ if (changes['node'] && !changes['node'].firstChange) {
3199
+ void this.resolveComponent();
3200
+ }
3201
+ if (changes['rowData'] && !changes['rowData'].firstChange) {
3202
+ this.rowInjectorsCache.clear();
3203
+ this.cdr.markForCheck();
3204
+ }
3205
+ }
3206
+ getInputs(data) {
3207
+ return {
3208
+ rawValue: get(data, this.node.path),
3209
+ rowData: data,
3210
+ };
3211
+ }
3212
+ getRowInjector(data) {
3213
+ const cacheKey = this.getCacheKey(data);
3214
+ let rowInjector = this.rowInjectorsCache.get(cacheKey);
3215
+ if (!rowInjector) {
3216
+ if (!this.hasExpressions) {
3217
+ rowInjector = this.createRowInjector(this.mergedOptions());
3218
+ this.rowInjectorsCache.set(cacheKey, rowInjector);
3219
+ return rowInjector;
3220
+ }
3221
+ if (!this.pendingEvaluations.has(cacheKey)) {
3222
+ this.pendingEvaluations.add(cacheKey);
3223
+ const scope = {
3224
+ ...(data ?? {}),
3225
+ context: {
3226
+ eval: (path) => getSmart(data, path),
3227
+ },
3228
+ };
3229
+ void this.expressionEvaluator.evaluate(this.mergedOptions(), scope).then((evaluatedOptions) => {
3230
+ const newInjector = this.createRowInjector(evaluatedOptions);
3231
+ this.rowInjectorsCache.delete(cacheKey);
3232
+ this.rowInjectorsCache.set(cacheKey, newInjector);
3233
+ this.pendingEvaluations.delete(cacheKey);
3234
+ this.scheduleChangeDetection();
3235
+ }).catch(() => {
3236
+ this.pendingEvaluations.delete(cacheKey);
3237
+ });
3238
+ }
3239
+ rowInjector = this.createRowInjector(this.mergedOptions());
3240
+ this.rowInjectorsCache.set(cacheKey, rowInjector);
3241
+ }
3242
+ return rowInjector;
3243
+ }
3244
+ async resolveComponent() {
3245
+ const widget = this.widgetRegistry.resolve(this.node.type);
3246
+ const mode = 'column';
3247
+ this.component = await widget?.components[mode]?.component();
3248
+ const props = widget?.components[mode]?.properties
3249
+ ?.filter((c) => c.schema.defaultValue)
3250
+ .map((c) => ({ [c.name]: c.schema.defaultValue }))
3251
+ .reduce((acc, curr) => ({ ...acc, ...curr }), {});
3252
+ this.mergedOptions.set(merge(props, this.node.options) || {});
3253
+ this.hasExpressions = this.checkForExpressions(this.mergedOptions());
3254
+ this.rowInjectorsCache.clear();
3255
+ this.cdr.markForCheck();
3256
+ }
3257
+ createRowInjector(options) {
3258
+ return Injector.create({
3259
+ parent: this.injector,
3260
+ providers: [
3261
+ {
3262
+ provide: AXP_WIDGET_COLUMN_TOKEN,
3263
+ useValue: {
3264
+ path: this.node.path,
3265
+ options,
3266
+ caption: this.caption,
3267
+ },
3268
+ },
3269
+ ],
3270
+ });
3271
+ }
3272
+ getCacheKey(data) {
3273
+ const id = data['id'];
3274
+ if (id != null) {
3275
+ return `row-${String(id)}`;
3276
+ }
3277
+ return `row-${Object.keys(data).length}`;
3278
+ }
3279
+ checkForExpressions(obj) {
3280
+ if (typeof obj === 'string') {
3281
+ return this.expressionEvaluator.isExpression(obj);
3282
+ }
3283
+ if (Array.isArray(obj)) {
3284
+ return obj.some((item) => this.checkForExpressions(item));
3285
+ }
3286
+ if (obj && typeof obj === 'object') {
3287
+ return Object.values(obj).some((value) => this.checkForExpressions(value));
3288
+ }
3289
+ return false;
3290
+ }
3291
+ scheduleChangeDetection() {
3292
+ if (this.changeDetectionScheduled) {
3293
+ return;
3294
+ }
3295
+ this.changeDetectionScheduled = true;
3296
+ requestAnimationFrame(() => {
3297
+ this.cdr.markForCheck();
3298
+ this.changeDetectionScheduled = false;
3299
+ });
3300
+ }
3301
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetColumnCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3302
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPWidgetColumnCellComponent, isStandalone: true, selector: "axp-widget-column-cell", inputs: { node: "node", rowData: "rowData", caption: "caption" }, usesOnChanges: true, ngImport: i0, template: `
3303
+ @if (component && rowData) {
3304
+ <ng-container
3305
+ *ngComponentOutlet="component; injector: getRowInjector(rowData); inputs: getInputs(rowData)"
3306
+ ></ng-container>
3307
+ }
3308
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3309
+ }
3310
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPWidgetColumnCellComponent, decorators: [{
3311
+ type: Component,
3312
+ args: [{
3313
+ selector: 'axp-widget-column-cell',
3314
+ changeDetection: ChangeDetectionStrategy.OnPush,
3315
+ imports: [NgComponentOutlet],
3316
+ template: `
3317
+ @if (component && rowData) {
3318
+ <ng-container
3319
+ *ngComponentOutlet="component; injector: getRowInjector(rowData); inputs: getInputs(rowData)"
3320
+ ></ng-container>
3321
+ }
3322
+ `,
3323
+ }]
3324
+ }], propDecorators: { node: [{
3325
+ type: Input,
3326
+ args: [{ required: true }]
3327
+ }], rowData: [{
3328
+ type: Input,
3329
+ args: [{ required: true }]
3330
+ }], caption: [{
3331
+ type: Input
3332
+ }] } });
3333
+
3334
+ var AXPWidgetGroupEnum;
3335
+ (function (AXPWidgetGroupEnum) {
3336
+ AXPWidgetGroupEnum["FormElement"] = "form-element";
3337
+ AXPWidgetGroupEnum["DashboardWidget"] = "dashboard-widget";
3338
+ AXPWidgetGroupEnum["FormTemplate"] = "form-template";
3339
+ AXPWidgetGroupEnum["PropertyEditor"] = "property-editor";
3340
+ AXPWidgetGroupEnum["MetaData"] = "meta-data";
3341
+ AXPWidgetGroupEnum["SettingWidget"] = "setting-widget";
3342
+ AXPWidgetGroupEnum["EntityWidget"] = "entity-widget";
3343
+ AXPWidgetGroupEnum["UtilityWidget"] = "utility-widget";
3344
+ AXPWidgetGroupEnum["BaseWidget"] = "base-widget";
3345
+ })(AXPWidgetGroupEnum || (AXPWidgetGroupEnum = {}));
3346
+
3347
+ const AXP_STYLING_PROPERTY_GROUP = {
3348
+ name: 'styling',
3349
+ order: 1,
3350
+ title: 'Styling',
3351
+ };
3352
+ const AXP_DATA_PROPERTY_GROUP = {
3353
+ name: 'data',
3354
+ order: 7,
3355
+ title: 'Data',
3356
+ };
3357
+ const AXP_BEHAVIOR_PROPERTY_GROUP = {
3358
+ name: 'behavior',
3359
+ order: 2,
3360
+ title: 'Behavior',
3361
+ };
3362
+ const AXP_WIDGET_PROPERTY_GROUP = {
3363
+ name: 'widget',
3364
+ order: 0,
3365
+ title: 'Widget',
3366
+ };
3367
+ const AXP_VALIDATION_PROPERTY_GROUP = {
3368
+ name: 'validation',
3369
+ order: 4,
3370
+ title: 'Validation',
3371
+ };
3372
+ const AXP_APPEARANCE_PROPERTY_GROUP = {
3373
+ name: 'appearance',
3374
+ order: 2,
3375
+ title: 'Appearance',
3376
+ };
3377
+ const AXP_ANIMATION_PROPERTY_GROUP = {
3378
+ name: 'animation',
3379
+ order: 5,
3380
+ title: 'Animation',
3381
+ };
3382
+ const AXP_TRIGGERS_PROPERTY_GROUP = {
3383
+ name: 'triggers',
3384
+ order: 3,
3385
+ title: 'Triggers',
3386
+ };
3387
+
3388
+ /**
3389
+ * Single property that edits all data-source-related options (dataSource, valueField, textField, filters)
3390
+ * in one dedicated widget. Uses path: 'options' and setValue with merge (same pattern as flex-options).
3391
+ */
3392
+ const AXP_DATA_SOURCE_OPTIONS_PROPERTY = {
3393
+ name: 'dataSourceOptions',
3394
+ title: 'Data Source',
3395
+ group: AXP_DATA_PROPERTY_GROUP,
3396
+ showLabel: false,
3397
+ schema: {
3398
+ dataType: 'object',
3399
+ interface: {
3400
+ name: 'dataSourceOptions',
3401
+ path: 'options',
3402
+ type: 'data-source-options',
3403
+ options: {},
3404
+ },
3405
+ },
3406
+ visible: true,
3407
+ };
3408
+ // export const AXP_DATA_SOURCE_PROPERTY: AXPWidgetProperty = {
3409
+ // name: 'dataSource',
3410
+ // title: 'Data Source',
3411
+ // group: AXP_DATA_PROPERTY_GROUP,
3412
+ // schema: {
3413
+ // dataType: 'object',
3414
+ // interface: {
3415
+ // name: 'dataSource',
3416
+ // path: 'options.dataSource',
3417
+ // type: AXPWidgetsCatalog.select,
3418
+ // valueTransforms: objectKeyValueTransforms('name'),
3419
+ // options: {
3420
+ // valueField: 'name',
3421
+ // textField: 'title',
3422
+ // dataSource: 'dataSources',
3423
+ // hasClearButton: true,
3424
+ // allowSearch: true,
3425
+ // },
3426
+ // },
3427
+ // },
3428
+ // visible: true,
3429
+ // };
3430
+ // export const AXP_DATA_SOURCE_VALUE_FIELD: AXPWidgetProperty = {
3431
+ // name: 'valueField',
3432
+ // title: 'Value Field',
3433
+ // group: AXP_DATA_PROPERTY_GROUP,
3434
+ // schema: {
3435
+ // dataType: 'string',
3436
+ // interface: {
3437
+ // name: 'valueField',
3438
+ // path: 'options.valueField',
3439
+ // type: AXPWidgetsCatalog.text,
3440
+ // options: {
3441
+ // hasClearButton: true,
3442
+ // },
3443
+ // triggers: [
3444
+ // {
3445
+ // event: `{{ events.context('options.dataSource') }}`,
3446
+ // action: `{{ context.set('options.valueField',widget.find('dataSource').output('item').valueField?.name); }}`,
3447
+ // },
3448
+ // ],
3449
+ // },
3450
+ // },
3451
+ // visible: true,
3452
+ // };
3453
+ // export const AXP_DATA_SOURCE_TEXT_FIELD: AXPWidgetProperty = {
3454
+ // name: 'textField',
3455
+ // title: 'Text Field',
3456
+ // group: AXP_DATA_PROPERTY_GROUP,
3457
+ // schema: {
3458
+ // dataType: 'string',
3459
+ // interface: {
3460
+ // name: 'textField',
3461
+ // path: 'options.textField',
3462
+ // type: AXPWidgetsCatalog.text,
3463
+ // options: {
3464
+ // hasClearButton: true,
3465
+ // },
3466
+ // triggers: [
3467
+ // {
3468
+ // event: `{{ events.context('options.dataSource') }}`,
3469
+ // action: `{{ context.set('options.textField',widget.find('dataSource').output('item').textField?.name); }}`,
3470
+ // },
3471
+ // ],
3472
+ // },
3473
+ // },
3474
+ // visible: true,
3475
+ // };
3476
+ // /** Use AXP_DATA_SOURCE_OPTIONS_PROPERTY for a single unified data-source editor, or the three below for separate fields. */
3477
+ // export const AXP_DATA_SOURCE_PROPERTIES = [
3478
+ // AXP_DATA_SOURCE_PROPERTY,
3479
+ // AXP_DATA_SOURCE_VALUE_FIELD,
3480
+ // AXP_DATA_SOURCE_TEXT_FIELD,
3481
+ // ];
3482
+
3483
+ const AXP_NAME_PROPERTY = createStringProperty({
3484
+ name: 'name',
3485
+ title: 'Name',
3486
+ group: AXP_WIDGET_PROPERTY_GROUP,
3487
+ });
3488
+ const AXP_THEME_PROPERTY = {
3489
+ name: 'theme',
3490
+ title: 'Theme',
3491
+ group: AXP_STYLING_PROPERTY_GROUP,
3492
+ schema: {
3493
+ dataType: 'string',
3494
+ defaultValue: { id: 'default', title: 'Default' },
3495
+ interface: {
3496
+ name: 'theme',
3497
+ path: 'options.theme',
3498
+ type: AXPWidgetsCatalog.select,
3499
+ options: {
3500
+ dataSource: [
3501
+ {
3502
+ id: 'default',
3503
+ title: 'Default',
3504
+ },
3505
+ {
3506
+ id: 'light',
3507
+ title: 'Light',
3508
+ },
3509
+ {
3510
+ id: 'dark',
3511
+ title: 'Dark',
3512
+ },
3513
+ ],
3514
+ },
3515
+ },
3516
+ },
3517
+ visible: true,
3518
+ };
3519
+ const AXP_DIRECTION_PROPERTY = {
3520
+ name: 'direction',
3521
+ title: 'Direction',
3522
+ group: AXP_STYLING_PROPERTY_GROUP,
3523
+ schema: {
3524
+ dataType: 'string',
3525
+ defaultValue: { id: 'horizontal' },
3526
+ interface: {
3527
+ name: 'direction',
3528
+ path: 'options.direction',
3529
+ type: AXPWidgetsCatalog.select,
3530
+ options: {
3531
+ dataSource: [
3532
+ {
3533
+ id: 'horizontal',
3534
+ title: 'Horizontal',
3535
+ },
3536
+ {
3537
+ id: 'vertical',
3538
+ title: 'Vertical',
3539
+ },
3540
+ ],
3541
+ },
3542
+ },
3543
+ },
3544
+ visible: true,
3545
+ };
3546
+ const AXP_COLOR_PROPERTY = {
3547
+ name: 'color',
3548
+ title: 'Color',
3549
+ group: AXP_STYLING_PROPERTY_GROUP,
3550
+ schema: {
3551
+ dataType: 'string',
3552
+ interface: {
3553
+ path: 'options.color',
3554
+ options: {
3555
+ hasClearButton: true,
3556
+ },
3557
+ type: AXPWidgetsCatalog.color,
3558
+ },
3559
+ },
3560
+ visible: true,
3561
+ };
3562
+ const AXP_FONT_SIZE_PROPERTY = {
3563
+ name: 'fontSize',
3564
+ title: 'Font Size',
3565
+ group: AXP_STYLING_PROPERTY_GROUP,
3566
+ schema: {
3567
+ dataType: 'string',
3568
+ defaultValue: '12px',
3569
+ interface: {
3570
+ name: 'fontSize',
3571
+ path: 'options.fontSize',
3572
+ type: AXPWidgetsCatalog.text,
3573
+ },
3574
+ },
3575
+ visible: true,
3576
+ };
3577
+ const AXP_BG_COLOR_PROPERTY = {
3578
+ name: 'backgroundColor',
3579
+ title: 'Background Color',
3580
+ group: AXP_STYLING_PROPERTY_GROUP,
3581
+ schema: {
3582
+ dataType: 'string',
3583
+ interface: {
3584
+ path: 'options.backgroundColor',
3585
+ options: {
3586
+ hasClearButton: true,
3587
+ },
3588
+ type: AXPWidgetsCatalog.color,
3589
+ },
3590
+ },
3591
+ visible: true,
3592
+ };
3593
+
3594
+ const AXP_CONTENT_PROPERTY = createStringProperty({
3595
+ name: 'content',
3596
+ title: 'Content',
3597
+ path: 'options.content',
3598
+ group: AXP_DATA_PROPERTY_GROUP,
3599
+ });
3600
+ const AXP_PLACEHOLDER_PROPERTY = createStringProperty({
3601
+ name: 'placeholder',
3602
+ title: 'Placeholder',
3603
+ path: 'options.placeholder',
3604
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3605
+ });
3606
+ const AXP_DATA_PATH_PROPERTY = createStringProperty({
3607
+ name: 'path',
3608
+ title: 'Data Path',
3609
+ group: AXP_DATA_PROPERTY_GROUP,
3610
+ });
3611
+ const AXP_DISABLED_PROPERTY = createBooleanProperty({
3612
+ name: 'disabled',
3613
+ title: 'Disabled',
3614
+ path: 'options.disabled',
3615
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3616
+ });
3617
+ const AXP_READONLY_PROPERTY = createBooleanProperty({
3618
+ name: 'readonly',
3619
+ title: 'Readonly',
3620
+ path: 'options.readonly',
3621
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3622
+ });
3623
+ const AXP_ALLOW_MULTIPLE_PROPERTY = createBooleanProperty({
3624
+ name: 'multiple',
3625
+ title: 'Multiple',
3626
+ path: 'options.multiple',
3627
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3628
+ });
3629
+ const AXP_ALLOW_CLEAR_PROPERTY = createBooleanProperty({
3630
+ name: 'allowClear',
3631
+ title: 'Allow Clear',
3632
+ path: 'options.allowClear',
3633
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3634
+ });
3635
+ const AXP_HAS_LABEL_PROPERTY = createBooleanProperty({
3636
+ name: 'hasLabel',
3637
+ title: 'Label',
3638
+ path: 'options.hasLabel',
3639
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3640
+ defaultValue: true,
3641
+ });
3642
+ const AXP_HAS_ICON_PROPERTY = createBooleanProperty({
3643
+ name: 'hasIcon',
3644
+ title: 'Icon',
3645
+ path: 'options.hasIcon',
3646
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3647
+ defaultValue: true,
3648
+ });
3649
+ const AXP_ICON_PROPERTY = createStringProperty({
3650
+ name: 'icon',
3651
+ title: 'Icon Name',
3652
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3653
+ path: 'options.icon',
3654
+ });
3655
+ const AXP_IS_LOADING_PROPERTY = createBooleanProperty({
3656
+ name: 'loading',
3657
+ title: 'Is Loading',
3658
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3659
+ path: 'options.loading',
3660
+ });
3661
+ const AXP_HAS_CLEAR_BUTTON_PROPERTY = createBooleanProperty({
3662
+ name: 'hasClearButton',
3663
+ title: 'Clear Button',
3664
+ path: 'options.hasClearButton',
3665
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3666
+ defaultValue: false,
3667
+ });
3668
+ const AXP_ALLOW_SEARCH_PROPERTY = createBooleanProperty({
3669
+ name: 'allowSearch',
3670
+ title: 'Allow Search',
3671
+ path: 'options.allowSearch',
3672
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3673
+ defaultValue: false,
3674
+ });
3675
+ const AXP_HAS_COPY_ICON_PROPERTY = createBooleanProperty({
3676
+ name: 'hasCopyIcon',
3677
+ title: 'Copy Icon',
3678
+ path: 'options.hasCopyIcon',
3679
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3680
+ defaultValue: true,
3681
+ });
3682
+ const AXP_HAS_EYE_ICON_PROPERTY = createBooleanProperty({
3683
+ name: 'hasEyeIcon',
3684
+ title: 'Eye Icon',
3685
+ path: 'options.hasEyeIcon',
3686
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3687
+ defaultValue: true,
3688
+ });
3689
+ const AXP_DOWNLOADABLE_PROPERTY = createBooleanProperty({
3690
+ name: 'downloadable',
3691
+ title: 'Downloadable',
3692
+ path: 'options.downloadable',
3693
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3694
+ defaultValue: true,
3695
+ });
3696
+ // Converted with createStringProperty
3697
+ const AXP_TRULY_TEXT_PROPERTY = createStringProperty({
3698
+ name: 'trulyText',
3699
+ title: 'Truly Text',
3700
+ path: 'options.trulyText',
3701
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3702
+ });
3703
+ const AXP_FALSY_TEXT_PROPERTY = createStringProperty({
3704
+ name: 'falsyText',
3705
+ title: 'Falsy Text',
3706
+ path: 'options.falsyText',
3707
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3708
+ });
3709
+ const AXP_TEXT_PROPERTY = createStringProperty({
3710
+ name: 'text',
3711
+ title: 'Text',
3712
+ path: 'options.text',
3713
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3714
+ });
3715
+ const AXP_TITLE_PROPERTY = createStringProperty({
3716
+ name: 'title',
3717
+ title: 'Title',
3718
+ path: 'options.title',
3719
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3720
+ });
3721
+ const AXP_LABEL_PROPERTY = createStringProperty({
3722
+ name: 'label',
3723
+ title: 'Label',
3724
+ path: 'options.label',
3725
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3726
+ defaultValue: '',
3727
+ });
3728
+ const AXP_VALUE_FIELD_PROPERTY = createStringProperty({
3729
+ name: 'valueField',
3730
+ title: 'Value Field',
3731
+ path: 'options.valueField',
3732
+ group: AXP_DATA_PROPERTY_GROUP,
3733
+ defaultValue: 'id',
3734
+ });
3735
+ const AXP_TEXT_FIELD_PROPERTY = createStringProperty({
3736
+ name: 'textField',
3737
+ title: 'Text Field',
3738
+ path: 'options.textField',
3739
+ group: AXP_DATA_PROPERTY_GROUP,
3740
+ defaultValue: 'title',
3741
+ });
3742
+ const AXP_DESCRIPTION_PROPERTY = createStringProperty({
3743
+ name: 'description',
3744
+ title: 'Description',
3745
+ path: 'options.description',
3746
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3747
+ });
3748
+ const AXP_STYLE_COLOR_PROPERTY = createSelectProperty({
3749
+ name: 'color',
3750
+ title: 'Color',
3751
+ dataSource: AX_STYLE_COLOR_TYPES,
3752
+ defaultValue: 'primary',
3753
+ path: 'options.color',
3754
+ group: AXP_STYLING_PROPERTY_GROUP,
3755
+ });
3756
+ const AXP_STYLE_LOOK_PROPERTY = createSelectProperty({
3757
+ name: 'look',
3758
+ title: 'Look',
3759
+ dataSource: AX_STYLE_LOOK_TYPES,
3760
+ defaultValue: 'solid',
3761
+ path: 'options.look',
3762
+ group: AXP_STYLING_PROPERTY_GROUP,
3763
+ });
3764
+ const AXP_TEXT_ALIGN_PROPERTY = createSelectProperty({
3765
+ name: 'textAlign',
3766
+ title: 'Text Align',
3767
+ path: 'options.textAlign',
3768
+ group: AXP_STYLING_PROPERTY_GROUP,
3769
+ defaultValue: { id: 'left', title: 'Left' },
3770
+ dataSource: [
3771
+ { id: 'left', title: 'Left' },
3772
+ { id: 'center', title: 'Center' },
3773
+ { id: 'right', title: 'Right' },
3774
+ { id: 'justify', title: 'Justify' },
3775
+ ],
3776
+ });
3777
+ const AXP_VERTICAL_ALIGN_PROPERTY = createSelectProperty({
3778
+ name: 'verticalAlign',
3779
+ title: 'Vertical Align',
3780
+ path: 'options.verticalAlign',
3781
+ group: AXP_STYLING_PROPERTY_GROUP,
3782
+ defaultValue: { id: 'top', title: 'Top' },
3783
+ dataSource: [
3784
+ { id: 'top', title: 'Top' },
3785
+ { id: 'middle', title: 'Middle' },
3786
+ { id: 'bottom', title: 'Bottom' },
3787
+ { id: 'baseline', title: 'Baseline' },
3788
+ ],
3789
+ });
3790
+ const AXP_DATE_FORMAT_PROPERTY = createSelectProperty({
3791
+ name: 'format',
3792
+ title: 'Format',
3793
+ dataSource: [
3794
+ { id: 'date', title: 'Date' },
3795
+ { id: 'datetime', title: 'DateTime' },
3796
+ { id: 'time', title: 'Time' },
3797
+ ],
3798
+ defaultValue: { id: 'date', title: 'Date' },
3799
+ path: 'options.format',
3800
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3801
+ });
3802
+ const AXP_DATE_DEPTH_PROPERTY = createSelectProperty({
3803
+ name: 'depth',
3804
+ title: 'Input Depth',
3805
+ dataSource: [
3806
+ { id: 'year', title: 'Year' },
3807
+ { id: 'month', title: 'Month' },
3808
+ { id: 'day', title: 'Day' },
3809
+ ],
3810
+ path: 'options.depth',
3811
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3812
+ defaultValue: { id: 'day', title: 'Day' },
3813
+ });
3814
+ /** Max span in days between from/to when filter operation is `between`. */
3815
+ const AXP_DATE_RANGE_LIMIT_PROPERTY = createNumberProperty({
3816
+ name: 'limit',
3817
+ title: 'Range Limit (Days)',
3818
+ path: 'options.limit',
3819
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3820
+ });
3821
+ function booleanDefaultProperty(defaultValue = false) {
3822
+ return {
3823
+ name: 'defaultValue',
3824
+ title: 'Default Value',
3825
+ group: AXP_DATA_PROPERTY_GROUP,
3826
+ schema: {
3827
+ dataType: 'boolean',
3828
+ defaultValue: defaultValue,
3829
+ interface: {
3830
+ name: 'defaultValue',
3831
+ path: 'defaultValue',
3832
+ type: AXPWidgetsCatalog.toggle,
3833
+ },
3834
+ },
3835
+ visible: true,
3836
+ };
3837
+ }
3838
+ function plainTextDefaultProperty() {
3839
+ return {
3840
+ name: 'defaultValue',
3841
+ title: 'Default Value',
3842
+ group: AXP_DATA_PROPERTY_GROUP,
3843
+ schema: {
3844
+ dataType: 'string',
3845
+ interface: {
3846
+ name: 'defaultValue',
3847
+ path: 'defaultValue',
3848
+ type: AXPWidgetsCatalog.text,
3849
+ options: {
3850
+ placeholder: '@layout-designer:property-editor.placeholders.default-value-plain-text',
3851
+ },
3852
+ },
3853
+ },
3854
+ visible: true,
3855
+ };
3856
+ }
3857
+ function largeTextDefaultProperty() {
3858
+ return {
3859
+ name: 'defaultValue',
3860
+ title: 'Default Value',
3861
+ group: AXP_DATA_PROPERTY_GROUP,
3862
+ schema: {
3863
+ dataType: 'string',
3864
+ interface: {
3865
+ name: 'defaultValue',
3866
+ path: 'defaultValue',
3867
+ type: AXPWidgetsCatalog.largeText,
3868
+ options: {
3869
+ placeholder: '@layout-designer:property-editor.placeholders.default-value-large-text',
3870
+ },
3871
+ },
3872
+ },
3873
+ visible: true,
3874
+ };
3875
+ }
3876
+ function richTextDefaultProperty() {
3877
+ return {
3878
+ name: 'defaultValue',
3879
+ title: 'Default Value',
3880
+ group: AXP_DATA_PROPERTY_GROUP,
3881
+ schema: {
3882
+ dataType: 'string',
3883
+ interface: {
3884
+ name: 'defaultValue',
3885
+ path: 'defaultValue',
3886
+ type: AXPWidgetsCatalog.richText,
3887
+ options: {
3888
+ placeholder: '@layout-designer:property-editor.placeholders.default-value-rich-text',
3889
+ },
3890
+ },
3891
+ },
3892
+ visible: true,
3893
+ };
3894
+ }
3895
+ /**
3896
+ * Default value editor for select-editor: uses `context.options(key)` so the default picker reads
3897
+ * the **host** widget's options from the shared context (not the nested property field's `widget`).
3898
+ */
3899
+ function selectEditorDefaultValueProperty() {
3900
+ return {
3901
+ name: 'defaultValue',
3902
+ title: 'Default Value',
3903
+ group: AXP_DATA_PROPERTY_GROUP,
3904
+ schema: {
3905
+ dataType: 'object',
3906
+ interface: {
3907
+ name: 'defaultValue',
3908
+ path: 'defaultValue',
3909
+ type: AXPWidgetsCatalog.select,
3910
+ options: {
3911
+ placeholder: '@layout-designer:property-editor.placeholders.default-value-select',
3912
+ dataSource: '{{ context.options("dataSource") }}',
3913
+ valueField: '{{ context.options("valueField") }}',
3914
+ textField: '{{ context.options("textField") }}',
3915
+ multiple: '{{ context.options("multiple") }}',
3916
+ hasClearButton: true,
3917
+ },
3918
+ },
3919
+ },
3920
+ visible: true,
3921
+ };
3922
+ }
3923
+ /**
3924
+ * Default value editor for selection-list-editor: uses the select widget in the designer so picking
3925
+ * a default matches select UX while still binding to the host's dataSource / fields via `context.options`.
3926
+ */
3927
+ function selectionListEditorDefaultValueProperty() {
3928
+ return {
3929
+ name: 'defaultValue',
3930
+ title: 'Default Value',
3931
+ group: AXP_DATA_PROPERTY_GROUP,
3932
+ schema: {
3933
+ dataType: 'object',
3934
+ interface: {
3935
+ name: 'defaultValue',
3936
+ path: 'defaultValue',
3937
+ type: AXPWidgetsCatalog.select,
3938
+ options: {
3939
+ placeholder: '@layout-designer:property-editor.placeholders.default-value-select',
3940
+ dataSource: '{{ context.options("dataSource") }}',
3941
+ valueField: '{{ context.options("valueField") }}',
3942
+ textField: '{{ context.options("textField") }}',
3943
+ multiple: '{{ context.options("multiple") }}',
3944
+ hasClearButton: true,
3945
+ },
3946
+ },
3947
+ },
3948
+ visible: true,
3949
+ };
3950
+ }
3951
+ function numberDefaultProperty() {
3952
+ return {
3953
+ name: 'defaultValue',
3954
+ title: 'Default Value',
3955
+ group: AXP_DATA_PROPERTY_GROUP,
3956
+ schema: {
3957
+ dataType: 'number',
3958
+ interface: {
3959
+ name: 'defaultValue',
3960
+ path: 'defaultValue',
3961
+ type: AXPWidgetsCatalog.number,
3962
+ options: {
3963
+ placeholder: '@layout-designer:property-editor.placeholders.default-value-number',
3964
+ },
3965
+ },
3966
+ },
3967
+ visible: true,
3968
+ };
3969
+ }
3970
+ function numberMinValueProperty(value) {
3971
+ return {
3972
+ name: 'minValue',
3973
+ title: 'Min Value',
3974
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3975
+ order: 9,
3976
+ schema: {
3977
+ dataType: 'number',
3978
+ defaultValue: value,
3979
+ interface: {
3980
+ name: 'minValue',
3981
+ path: 'options.minValue',
3982
+ type: AXPWidgetsCatalog.number,
3983
+ options: {
3984
+ placeholder: '@layout-designer:property-editor.placeholders.number-min-value',
3985
+ },
3986
+ },
3987
+ },
3988
+ visible: true,
3989
+ };
3990
+ }
3991
+ function numberMaxValueProperty(value) {
3992
+ return {
3993
+ name: 'maxValue',
3994
+ title: 'Max Value',
3995
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
3996
+ order: 10,
3997
+ schema: {
3998
+ dataType: 'number',
3999
+ defaultValue: value,
4000
+ interface: {
4001
+ name: 'maxValue',
4002
+ path: 'options.maxValue',
4003
+ type: AXPWidgetsCatalog.number,
4004
+ options: {
4005
+ placeholder: '@layout-designer:property-editor.placeholders.number-max-value',
4006
+ },
4007
+ },
4008
+ },
4009
+ visible: true,
4010
+ };
4011
+ }
4012
+ const AXP_MULTI_LANGUAGE_PROPERTY = createBooleanProperty({
4013
+ name: 'multiLanguage',
4014
+ title: 'Multi Language',
4015
+ path: 'options.multiLanguage',
4016
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4017
+ defaultValue: false,
4018
+ });
4019
+ const AXP_SPIN_BUTTON_PROPERTY = createBooleanProperty({
4020
+ name: 'spinButton',
4021
+ title: 'Spin Button',
4022
+ path: 'options.spinButton',
4023
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4024
+ });
4025
+ const AXP_NUMBER_SEPARATOR_PROPERTY = createStringProperty({
4026
+ name: 'seprator',
4027
+ title: 'Thousands Separator',
4028
+ path: 'options.seprator',
4029
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4030
+ });
4031
+ const AXP_DEFAULT_ROW_COUNT_PROPERTY = createNumberProperty({
4032
+ name: 'defaultRowCount',
4033
+ title: 'Default Row Count',
4034
+ path: 'options.defaultRowCount',
4035
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4036
+ });
4037
+ const AXP_MIN_LINE_COUNT_PROPERTY = createNumberProperty({
4038
+ name: 'minLineCount',
4039
+ title: 'Min Line Count',
4040
+ path: 'options.minLineCount',
4041
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4042
+ });
4043
+ const AXP_MAX_LINE_COUNT_PROPERTY = createNumberProperty({
4044
+ name: 'maxLineCount',
4045
+ title: 'Max Line Count',
4046
+ path: 'options.maxLineCount',
4047
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4048
+ });
4049
+ const AXP_FIT_LINE_COUNT_PROPERTY = createBooleanProperty({
4050
+ name: 'fitLineCount',
4051
+ title: 'Fit Line Count',
4052
+ path: 'options.fitLineCount',
4053
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4054
+ });
4055
+ const AXP_SHOW_PASSWORD_PROPERTY = createBooleanProperty({
4056
+ name: 'showPassword',
4057
+ title: 'Show Password',
4058
+ path: 'options.showPassword',
4059
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4060
+ });
4061
+ const AXP_TRIGGERS_PROPERTY = {
4062
+ name: 'triggers',
4063
+ title: 'Triggers',
4064
+ group: AXP_TRIGGERS_PROPERTY_GROUP,
4065
+ showLabel: false,
4066
+ schema: {
4067
+ dataType: 'object',
4068
+ interface: {
4069
+ name: 'triggers',
4070
+ path: 'triggers',
4071
+ type: 'triggers-editor',
4072
+ },
4073
+ },
4074
+ visible: true,
4075
+ };
4076
+
4077
+ const AXP_LAYOUT_GRID_PROPERTY_GROUP = {
4078
+ name: 'grid',
4079
+ order: 1,
4080
+ title: 'Grid Layout',
4081
+ };
4082
+ const AXP_LAYOUT_FLEX_PROPERTY_GROUP = {
4083
+ name: 'flex',
4084
+ order: 1,
4085
+ title: 'Flex Layout',
4086
+ };
4087
+ const AXP_BOX_MODEL_PROPERTY_GROUP = {
4088
+ name: 'box',
4089
+ order: 1,
4090
+ title: 'Box Model',
4091
+ };
4092
+ const AXP_LAYOUT_TABLE_PROPERTY_GROUP = {
4093
+ name: 'table',
4094
+ order: 1,
4095
+ title: 'Table Layout',
4096
+ };
4097
+ const AXP_LAYOUT_GAP_PROPERTY = {
4098
+ name: 'gap',
4099
+ title: 'Gap',
4100
+ group: AXP_LAYOUT_GRID_PROPERTY_GROUP,
4101
+ schema: {
4102
+ dataType: 'number',
4103
+ defaultValue: 2,
4104
+ interface: {
4105
+ name: 'gap',
4106
+ path: 'options.gap',
4107
+ type: AXPWidgetsCatalog.number,
4108
+ options: {
4109
+ minValue: 0,
4110
+ maxValue: 12,
4111
+ },
4112
+ },
4113
+ },
4114
+ visible: true,
4115
+ };
4116
+ const AXP_LAYOUT_COLUMNS_PROPERTY = {
4117
+ name: 'cols',
4118
+ title: 'Columns',
4119
+ group: AXP_LAYOUT_GRID_PROPERTY_GROUP,
4120
+ schema: {
4121
+ dataType: 'number',
4122
+ defaultValue: 1,
4123
+ interface: {
4124
+ name: 'cols',
4125
+ path: 'options.cols',
4126
+ type: AXPWidgetsCatalog.number,
4127
+ options: {
4128
+ minValue: 1,
4129
+ maxValue: 12,
4130
+ },
4131
+ },
4132
+ },
4133
+ visible: true,
4134
+ };
4135
+ const AXP_LAYOUT_ROWS_PROPERTY = {
4136
+ name: 'rows',
4137
+ title: 'Rows',
4138
+ group: AXP_LAYOUT_GRID_PROPERTY_GROUP,
4139
+ schema: {
4140
+ dataType: 'number',
4141
+ defaultValue: 1,
4142
+ interface: {
4143
+ name: 'rows',
4144
+ path: 'options.rows',
4145
+ type: AXPWidgetsCatalog.number,
4146
+ options: {
4147
+ minValue: 1,
4148
+ maxValue: 100,
4149
+ },
4150
+ },
4151
+ },
4152
+ visible: true,
4153
+ };
4154
+ const AXP_LAYOUT_GRID_PROPERTIES = [
4155
+ AXP_LAYOUT_GAP_PROPERTY,
4156
+ AXP_LAYOUT_COLUMNS_PROPERTY,
4157
+ AXP_LAYOUT_ROWS_PROPERTY,
4158
+ ];
4159
+ const AXP_LAYOUT_GRID_ROW_PROPERTIES = [
4160
+ AXP_LAYOUT_GAP_PROPERTY,
4161
+ cloneProperty(AXP_LAYOUT_COLUMNS_PROPERTY, { schema: { defaultValue: 12 } }),
4162
+ ];
4163
+ const AXP_LAYOUT_GRID_ITEM_PROPERTY = {
4164
+ name: 'gridItem',
4165
+ title: 'Grid Item',
4166
+ group: AXP_LAYOUT_GRID_PROPERTY_GROUP,
4167
+ schema: {
4168
+ dataType: 'object',
4169
+ interface: {
4170
+ name: 'gridItem',
4171
+ path: 'options',
4172
+ type: AXPWidgetsCatalog.gridItemOptions,
4173
+ options: {},
4174
+ },
4175
+ },
4176
+ visible: true,
4177
+ };
4178
+ const AXP_LAYOUT_SPACING_PROPERTY = {
4179
+ name: 'spacing',
4180
+ title: 'Spacing',
4181
+ group: AXP_BOX_MODEL_PROPERTY_GROUP,
4182
+ schema: {
4183
+ dataType: 'object',
4184
+ interface: {
4185
+ name: 'spacing',
4186
+ path: 'options.spacing',
4187
+ type: AXPWidgetsCatalog.spacing,
4188
+ options: {},
4189
+ },
4190
+ },
4191
+ visible: true,
4192
+ };
4193
+ const AXP_LAYOUT_BORDER_PROPERTY = {
4194
+ name: 'border',
4195
+ title: 'Border',
4196
+ group: AXP_BOX_MODEL_PROPERTY_GROUP,
4197
+ schema: {
4198
+ dataType: 'object',
4199
+ interface: {
4200
+ name: 'border',
4201
+ path: 'options.border',
4202
+ type: AXPWidgetsCatalog.border,
4203
+ options: {},
4204
+ },
4205
+ },
4206
+ visible: true,
4207
+ };
4208
+ const AXP_LAYOUT_FLEX_PROPERTY = {
4209
+ name: 'flex',
4210
+ title: 'Flex',
4211
+ group: AXP_LAYOUT_FLEX_PROPERTY_GROUP,
4212
+ schema: {
4213
+ dataType: 'object',
4214
+ interface: {
4215
+ name: 'flex',
4216
+ path: 'options',
4217
+ type: AXPWidgetsCatalog.flexOptions,
4218
+ options: {},
4219
+ },
4220
+ },
4221
+ visible: true,
4222
+ };
4223
+ const AXP_LAYOUT_FLEX_ITEM_PROPERTY = {
4224
+ name: 'flexItem',
4225
+ title: 'Flex Item',
4226
+ group: AXP_LAYOUT_FLEX_PROPERTY_GROUP,
4227
+ schema: {
4228
+ dataType: 'object',
4229
+ interface: {
4230
+ name: 'flexItem',
4231
+ path: 'options',
4232
+ type: AXPWidgetsCatalog.flexItemOptions,
4233
+ options: {},
4234
+ },
4235
+ },
4236
+ visible: true,
4237
+ };
4238
+ const AXP_LAYOUT_GRID_PROPERTY = {
4239
+ name: 'grid',
4240
+ title: 'Grid',
4241
+ group: AXP_LAYOUT_GRID_PROPERTY_GROUP,
4242
+ schema: {
4243
+ dataType: 'object',
4244
+ interface: {
4245
+ name: 'grid',
4246
+ path: 'options.grid',
4247
+ type: AXPWidgetsCatalog.gridOptions,
4248
+ options: {},
4249
+ },
4250
+ },
4251
+ visible: true,
4252
+ };
4253
+ const AXP_TABLE_COLUMNS_PROPERTY = {
4254
+ name: 'columns',
4255
+ title: 'Columns',
4256
+ group: AXP_LAYOUT_TABLE_PROPERTY_GROUP,
4257
+ schema: {
4258
+ dataType: 'number',
4259
+ defaultValue: 3,
4260
+ interface: {
4261
+ name: 'columns',
4262
+ path: 'options.columns',
4263
+ type: AXPWidgetsCatalog.number,
4264
+ options: {
4265
+ minValue: 1,
4266
+ maxValue: 12,
4267
+ },
4268
+ },
4269
+ },
4270
+ visible: true,
4271
+ };
4272
+ // Removed rowHeight/rows from table properties
4273
+ const AXP_TABLE_ITEM_COLSPAN_PROPERTY = {
4274
+ name: 'colSpan',
4275
+ title: 'Column Span',
4276
+ group: AXP_LAYOUT_TABLE_PROPERTY_GROUP,
4277
+ schema: {
4278
+ dataType: 'number',
4279
+ defaultValue: 1,
4280
+ interface: {
4281
+ name: 'colSpan',
4282
+ path: 'options.colSpan',
4283
+ type: AXPWidgetsCatalog.number,
4284
+ options: {
4285
+ minValue: 1,
4286
+ maxValue: 24,
4287
+ },
4288
+ },
4289
+ },
4290
+ visible: true,
4291
+ };
4292
+ const AXP_TABLE_ITEM_ROWSPAN_PROPERTY = {
4293
+ name: 'rowSpan',
4294
+ title: 'Row Span',
4295
+ group: AXP_LAYOUT_TABLE_PROPERTY_GROUP,
4296
+ schema: {
4297
+ dataType: 'number',
4298
+ defaultValue: 1,
4299
+ interface: {
4300
+ name: 'rowSpan',
4301
+ path: 'options.rowSpan',
4302
+ type: AXPWidgetsCatalog.number,
4303
+ options: {
4304
+ minValue: 1,
4305
+ maxValue: 100,
4306
+ },
4307
+ },
4308
+ },
4309
+ visible: true,
4310
+ };
4311
+ // Removed header/footer/sticky related table properties
4312
+ const AXP_LAYOUT_ADVANCED_GRID_PROPERTY = {
4313
+ name: 'advancedGrid',
4314
+ title: 'Advanced Grid',
4315
+ group: AXP_LAYOUT_GRID_PROPERTY_GROUP,
4316
+ schema: {
4317
+ dataType: 'object',
4318
+ interface: {
4319
+ name: 'advancedGrid',
4320
+ path: 'options.advancedGrid',
4321
+ type: AXPWidgetsCatalog.advancedGridOptions,
4322
+ options: {},
4323
+ },
4324
+ },
4325
+ visible: true,
4326
+ };
4327
+ const AXP_LAYOUT_SHOW_HEADER_PROPERTY = createBooleanProperty({
4328
+ name: 'showHeader',
4329
+ title: 'Show Header',
4330
+ group: AXP_BEHAVIOR_PROPERTY_GROUP,
4331
+ path: 'options.showHeader',
4332
+ defaultValue: true,
4333
+ });
4334
+ const AXP_LAYOUT_DIRECTION_PROPERTY = {
4335
+ name: 'direction',
4336
+ title: 'Direction',
4337
+ group: AXP_BOX_MODEL_PROPERTY_GROUP,
4338
+ order: 99,
4339
+ schema: {
4340
+ dataType: 'string',
4341
+ interface: {
4342
+ name: 'direction',
4343
+ path: 'options.direction',
4344
+ type: AXPWidgetsCatalog.direction,
4345
+ options: {},
4346
+ },
4347
+ },
4348
+ visible: true,
4349
+ };
4350
+
4351
+ const TABLE_COLUMN_ALIGN_DATA_SOURCE = [
4352
+ { id: 'start', title: 'Start' },
4353
+ { id: 'center', title: 'Center' },
4354
+ { id: 'end', title: 'End' },
4355
+ ];
4356
+ const AXP_TABLE_COLUMN_HEADER_ALIGN_PROPERTY = {
4357
+ name: 'alignHeader',
4358
+ title: 'Header alignment',
4359
+ group: AXP_STYLING_PROPERTY_GROUP,
4360
+ schema: {
4361
+ dataType: 'string',
4362
+ defaultValue: 'start',
4363
+ interface: {
4364
+ name: 'alignHeader',
4365
+ path: 'options.align.header',
4366
+ type: AXPWidgetsCatalog.select,
4367
+ options: {
4368
+ dataSource: [...TABLE_COLUMN_ALIGN_DATA_SOURCE],
4369
+ },
4370
+ },
4371
+ },
4372
+ visible: true,
4373
+ };
4374
+ const AXP_TABLE_COLUMN_CELL_ALIGN_PROPERTY = {
4375
+ name: 'alignCell',
4376
+ title: 'Cell alignment',
4377
+ group: AXP_STYLING_PROPERTY_GROUP,
4378
+ schema: {
4379
+ dataType: 'string',
4380
+ defaultValue: 'start',
4381
+ interface: {
4382
+ name: 'alignCell',
4383
+ path: 'options.align.cell',
4384
+ type: AXPWidgetsCatalog.select,
4385
+ options: {
4386
+ dataSource: [...TABLE_COLUMN_ALIGN_DATA_SOURCE],
4387
+ },
4388
+ },
4389
+ },
4390
+ visible: true,
4391
+ };
4392
+ /** Optional column designer fields; spread next to `AXP_TABLE_COLUMN_WIDTH_PROPERTY` where needed. */
4393
+ const AXP_TABLE_COLUMN_ALIGNMENT_PROPERTIES = [
4394
+ AXP_TABLE_COLUMN_HEADER_ALIGN_PROPERTY,
4395
+ AXP_TABLE_COLUMN_CELL_ALIGN_PROPERTY,
4396
+ ];
4397
+ const AXP_TABLE_COLUMN_WIDTH_PROPERTY = {
4398
+ name: 'width',
4399
+ title: 'Width',
4400
+ group: AXP_STYLING_PROPERTY_GROUP,
4401
+ schema: {
4402
+ dataType: 'string',
4403
+ defaultValue: '300px',
4404
+ interface: {
4405
+ name: 'width',
4406
+ path: 'options.width',
4407
+ type: AXPWidgetsCatalog.text,
4408
+ },
4409
+ },
4410
+ visible: true,
4411
+ };
4412
+ const AXP_TABLE_COLUMN_HEIGHT_PROPERTY = {
4413
+ name: 'height',
4414
+ title: 'Height',
4415
+ group: AXP_STYLING_PROPERTY_GROUP,
4416
+ schema: {
4417
+ dataType: 'string',
4418
+ defaultValue: '300px',
4419
+ interface: {
4420
+ name: 'height',
4421
+ path: 'options.height',
4422
+ type: AXPWidgetsCatalog.text,
4423
+ },
4424
+ },
4425
+ visible: true,
4426
+ };
4427
+
4428
+ const AXP_REQUIRED_VALIDATION_PROPERTY = {
4429
+ name: 'requiredValidation',
4430
+ title: 'Required',
4431
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4432
+ schema: {
4433
+ dataType: 'object',
4434
+ interface: {
4435
+ name: 'requiredValidation',
4436
+ path: 'options.validations.required',
4437
+ type: AXPWidgetsCatalog.requiredValidation,
4438
+ defaultValue: false,
4439
+ },
4440
+ },
4441
+ visible: true,
4442
+ };
4443
+ const AXP_MIN_LENGTH_VALIDATION_PROPERTY = {
4444
+ name: 'minLengthValidation',
4445
+ title: 'Minimum Length',
4446
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4447
+ schema: {
4448
+ dataType: 'object',
4449
+ interface: {
4450
+ name: 'minLengthValidation',
4451
+ path: 'options.validations.minLength',
4452
+ type: AXPWidgetsCatalog.minLengthValidation,
4453
+ defaultValue: null,
4454
+ },
4455
+ },
4456
+ visible: true,
4457
+ };
4458
+ const AXP_MAX_LENGTH_VALIDATION_PROPERTY = {
4459
+ name: 'maxLengthValidation',
4460
+ title: 'Maximum Length',
4461
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4462
+ schema: {
4463
+ dataType: 'object',
4464
+ interface: {
4465
+ name: 'maxLengthValidation',
4466
+ path: 'options.validations.maxLength',
4467
+ type: AXPWidgetsCatalog.maxLengthValidation,
4468
+ defaultValue: null,
4469
+ },
4470
+ },
4471
+ visible: true,
4472
+ };
4473
+ const AXP_REGULAR_EXPRESSION_VALIDATION_PROPERTY = {
4474
+ name: 'regularExpressionValidation',
4475
+ title: 'Regular Expression',
4476
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4477
+ schema: {
4478
+ dataType: 'object',
4479
+ interface: {
4480
+ name: 'regularExpressionValidation',
4481
+ path: 'options.validations.regex',
4482
+ type: AXPWidgetsCatalog.regularExpressionValidation,
4483
+ defaultValue: false,
4484
+ },
4485
+ },
4486
+ visible: true,
4487
+ };
4488
+ const AXP_LESS_THAN_VALIDATION_PROPERTY = {
4489
+ name: 'lessThanValidation',
4490
+ title: 'Less Than',
4491
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4492
+ schema: {
4493
+ dataType: 'object',
4494
+ interface: {
4495
+ name: 'lessThanValidation',
4496
+ path: 'options.validations.lessThan',
4497
+ type: AXPWidgetsCatalog.lessThanValidation,
4498
+ defaultValue: false,
4499
+ },
4500
+ },
4501
+ visible: true,
4502
+ };
4503
+ const AXP_GREATER_THAN_VALIDATION_PROPERTY = {
4504
+ name: 'greaterThanValidation',
4505
+ title: 'Greater Than',
4506
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4507
+ schema: {
4508
+ dataType: 'object',
4509
+ interface: {
4510
+ name: 'greaterThanValidation',
4511
+ path: 'options.validations.greaterThan',
4512
+ type: AXPWidgetsCatalog.greaterThanValidation,
4513
+ defaultValue: false,
4514
+ },
4515
+ },
4516
+ visible: true,
4517
+ };
4518
+ const AXP_BETWEEN_VALIDATION_PROPERTY = {
4519
+ name: 'betweenValidation',
4520
+ title: 'Between',
4521
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4522
+ schema: {
4523
+ dataType: 'object',
4524
+ interface: {
4525
+ name: 'betweenValidation',
4526
+ path: 'options.validations.between',
4527
+ type: AXPWidgetsCatalog.betweenValidation,
4528
+ defaultValue: false,
4529
+ },
4530
+ },
4531
+ visible: true,
4532
+ };
4533
+ const AXP_EQUAL_VALIDATION_PROPERTY = {
4534
+ name: 'equalValidation',
4535
+ title: 'Equal',
4536
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4537
+ schema: {
4538
+ dataType: 'object',
4539
+ interface: {
4540
+ name: 'equalValidation',
4541
+ path: 'options.validations.equal',
4542
+ type: AXPWidgetsCatalog.equalValidation,
4543
+ defaultValue: false,
4544
+ },
4545
+ },
4546
+ visible: true,
4547
+ };
4548
+ const AXP_CALLBACK_VALIDATION_PROPERTY = {
4549
+ name: 'callbackValidation',
4550
+ title: 'Callback',
4551
+ group: AXP_VALIDATION_PROPERTY_GROUP,
4552
+ schema: {
4553
+ dataType: 'object',
4554
+ interface: {
4555
+ name: 'callbackValidation',
4556
+ path: 'options.validations.callback',
4557
+ type: AXPWidgetsCatalog.callbackValidation,
4558
+ defaultValue: false,
4559
+ },
4560
+ },
4561
+ visible: true,
4562
+ };
2960
4563
 
2961
4564
  /**
2962
4565
  * Generated bundle index. Do not edit.
2963
4566
  */
2964
4567
 
2965
- 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 };
4568
+ export { AXPBaseWidgetComponent, AXPBlockBaseLayoutWidgetComponent, AXPBoxModelLayoutWidgetComponent, AXPColumnWidgetComponent, AXPDataListWidgetComponent, AXPFlexBaseLayoutWidgetComponent, AXPFlexItemBaseLayoutWidgetComponent, AXPGridBaseLayoutWidgetComponent, AXPGridItemBaseLayoutWidgetComponent, AXPInlineBaseLayoutWidgetComponent, AXPLayoutBaseWidgetComponent, AXPPageStatus, AXPPropertyEditorHelper, AXPTableBaseLayoutWidgetComponent, AXPTableItemBaseLayoutWidgetComponent, AXPTableItemOpsBaseLayoutWidgetComponent, AXPValueWidgetComponent, AXPWidgetColumnCellComponent, AXPWidgetColumnRendererComponent, AXPWidgetContainerComponent, AXPWidgetCoreElement, AXPWidgetCoreModule, AXPWidgetCoreService, AXPWidgetGroupEnum, AXPWidgetRegistryService, AXPWidgetRendererDirective, AXPWidgetSerializationHelper, AXPWidgetStatus, AXPWidgetsCatalog, AXP_ALLOW_CLEAR_PROPERTY, AXP_ALLOW_MULTIPLE_PROPERTY, AXP_ALLOW_SEARCH_PROPERTY, AXP_ANIMATION_PROPERTY_GROUP, AXP_APPEARANCE_PROPERTY_GROUP, AXP_BEHAVIOR_PROPERTY_GROUP, AXP_BETWEEN_VALIDATION_PROPERTY, AXP_BG_COLOR_PROPERTY, AXP_BOX_MODEL_PROPERTY_GROUP, AXP_CALLBACK_VALIDATION_PROPERTY, AXP_COLOR_PROPERTY, AXP_CONTENT_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_DATA_PROPERTY_GROUP, AXP_DATA_SOURCE_OPTIONS_PROPERTY, AXP_DATE_DEPTH_PROPERTY, AXP_DATE_FORMAT_PROPERTY, AXP_DATE_RANGE_LIMIT_PROPERTY, AXP_DEFAULT_ROW_COUNT_PROPERTY, AXP_DESCRIPTION_PROPERTY, AXP_DIRECTION_PROPERTY, AXP_DISABLED_PROPERTY, AXP_DOWNLOADABLE_PROPERTY, AXP_EQUAL_VALIDATION_PROPERTY, AXP_FALSY_TEXT_PROPERTY, AXP_FIT_LINE_COUNT_PROPERTY, AXP_FONT_SIZE_PROPERTY, AXP_GREATER_THAN_VALIDATION_PROPERTY, AXP_HAS_CLEAR_BUTTON_PROPERTY, AXP_HAS_COPY_ICON_PROPERTY, AXP_HAS_EYE_ICON_PROPERTY, AXP_HAS_ICON_PROPERTY, AXP_HAS_LABEL_PROPERTY, AXP_ICON_PROPERTY, AXP_IS_LOADING_PROPERTY, AXP_LABEL_PROPERTY, AXP_LAYOUT_ADVANCED_GRID_PROPERTY, AXP_LAYOUT_BORDER_PROPERTY, AXP_LAYOUT_COLUMNS_PROPERTY, AXP_LAYOUT_DIRECTION_PROPERTY, AXP_LAYOUT_FLEX_ITEM_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY, AXP_LAYOUT_FLEX_PROPERTY_GROUP, AXP_LAYOUT_GAP_PROPERTY, AXP_LAYOUT_GRID_ITEM_PROPERTY, AXP_LAYOUT_GRID_PROPERTIES, AXP_LAYOUT_GRID_PROPERTY, AXP_LAYOUT_GRID_PROPERTY_GROUP, AXP_LAYOUT_GRID_ROW_PROPERTIES, AXP_LAYOUT_ROWS_PROPERTY, AXP_LAYOUT_SHOW_HEADER_PROPERTY, AXP_LAYOUT_SPACING_PROPERTY, AXP_LAYOUT_TABLE_PROPERTY_GROUP, AXP_LESS_THAN_VALIDATION_PROPERTY, AXP_MAX_LENGTH_VALIDATION_PROPERTY, AXP_MAX_LINE_COUNT_PROPERTY, AXP_MIN_LENGTH_VALIDATION_PROPERTY, AXP_MIN_LINE_COUNT_PROPERTY, AXP_MULTI_LANGUAGE_PROPERTY, AXP_NAME_PROPERTY, AXP_NUMBER_SEPARATOR_PROPERTY, AXP_PLACEHOLDER_PROPERTY, AXP_READONLY_PROPERTY, AXP_REGULAR_EXPRESSION_VALIDATION_PROPERTY, AXP_REQUIRED_VALIDATION_PROPERTY, AXP_SHOW_PASSWORD_PROPERTY, AXP_SPIN_BUTTON_PROPERTY, AXP_STYLE_COLOR_PROPERTY, AXP_STYLE_LOOK_PROPERTY, AXP_STYLING_PROPERTY_GROUP, AXP_TABLE_COLUMNS_PROPERTY, AXP_TABLE_COLUMN_ALIGNMENT_PROPERTIES, AXP_TABLE_COLUMN_CELL_ALIGN_PROPERTY, AXP_TABLE_COLUMN_HEADER_ALIGN_PROPERTY, AXP_TABLE_COLUMN_HEIGHT_PROPERTY, AXP_TABLE_COLUMN_WIDTH_PROPERTY, AXP_TABLE_ITEM_COLSPAN_PROPERTY, AXP_TABLE_ITEM_ROWSPAN_PROPERTY, AXP_TEXT_ALIGN_PROPERTY, AXP_TEXT_FIELD_PROPERTY, AXP_TEXT_PROPERTY, AXP_THEME_PROPERTY, AXP_TITLE_PROPERTY, AXP_TRIGGERS_PROPERTY, AXP_TRIGGERS_PROPERTY_GROUP, AXP_TRULY_TEXT_PROPERTY, AXP_VALIDATION_PROPERTY_GROUP, AXP_VALUE_FIELD_PROPERTY, AXP_VERTICAL_ALIGN_PROPERTY, AXP_WIDGETS_ACTION_CATEGORY, AXP_WIDGETS_ACTION_SUB_CONTROLS, AXP_WIDGETS_ADVANCE_CATEGORY, AXP_WIDGETS_ADVANCE_SUB_DATA, AXP_WIDGETS_ADVANCE_SUB_INPUT, AXP_WIDGETS_ADVANCE_SUB_MEDIA, AXP_WIDGETS_ADVANCE_SUB_TOOLS, AXP_WIDGETS_AI_CATEGORY, AXP_WIDGETS_CATEGORIES, AXP_WIDGETS_EDITOR_CATEGORY, AXP_WIDGETS_EDITOR_SUB_CHOICE, AXP_WIDGETS_EDITOR_SUB_COMPOSITE, AXP_WIDGETS_EDITOR_SUB_CONFIG, AXP_WIDGETS_EDITOR_SUB_DATETIME, AXP_WIDGETS_EDITOR_SUB_NUMERIC, AXP_WIDGETS_EDITOR_SUB_RICH, AXP_WIDGETS_EDITOR_SUB_TEXT_INPUTS, AXP_WIDGETS_EDITOR_SUB_VISUAL, AXP_WIDGETS_LAYOUT_CATEGORY, AXP_WIDGETS_LAYOUT_SUB_GRID, AXP_WIDGETS_LAYOUT_SUB_LISTS, AXP_WIDGETS_LAYOUT_SUB_SHELL, AXP_WIDGETS_LAYOUT_SUB_SURFACES, AXP_WIDGETS_LAYOUT_SUB_TABS, AXP_WIDGETS_LAYOUT_SUB_UTILITY, AXP_WIDGET_COLUMN_TOKEN, AXP_WIDGET_DEFINITION_PROVIDER, AXP_WIDGET_PROPERTY_GROUP, AXP_WIDGET_TOKEN, booleanDefaultProperty, buildWidgetRegistryMapFromProviders, cloneProperty, createBooleanProperty, createNumberProperty, createSelectProperty, createStringProperty, findNonEmptyBreakpoints, largeTextDefaultProperty, mapAXPPropertyToWidgetProperty, normalizeWidgetCategories, numberDefaultProperty, numberMaxValueProperty, numberMinValueProperty, plainTextDefaultProperty, richTextDefaultProperty, selectEditorDefaultValueProperty, selectionListEditorDefaultValueProperty };
2966
4569
  //# sourceMappingURL=acorex-platform-layout-widget-core.mjs.map