@acorex-platform/framework-client 0.0.15 → 0.0.20

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 (108) hide show
  1. package/fesm2022/acorex-platform-framework-client-auth.mjs +872 -314
  2. package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -1
  3. package/fesm2022/{acorex-platform-framework-client-common-common-settings.provider-Euotv9l0.mjs → acorex-platform-framework-client-common-common-settings.provider-CLm2BVk-.mjs} +88 -5
  4. package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CLm2BVk-.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-framework-client-common.mjs +2685 -898
  6. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-framework-client-core.mjs +691 -823
  8. package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-framework-client-domain.mjs +16 -16
  10. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +181 -84
  11. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -1
  12. package/fesm2022/{acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-CjnQ9hAJ.mjs → acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-oE8CeLE8.mjs} +8 -6
  13. package/fesm2022/{acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-CjnQ9hAJ.mjs.map → acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-oE8CeLE8.mjs.map} +1 -1
  14. package/fesm2022/{acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-fFen8w8M.mjs → acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-BtLEUWAA.mjs} +4 -4
  15. package/fesm2022/{acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-fFen8w8M.mjs.map → acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-BtLEUWAA.mjs.map} +1 -1
  16. package/fesm2022/acorex-platform-framework-client-layout-components.mjs +3300 -1236
  17. package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
  18. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs +277 -185
  19. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BXOMs6oD.mjs +29184 -0
  21. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BXOMs6oD.mjs.map +1 -0
  22. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-BzUM-JMC.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-DCK-qb-F.mjs} +34 -20
  23. package/fesm2022/acorex-platform-framework-client-layout-entity-attachments-page.component-DCK-qb-F.mjs.map +1 -0
  24. package/fesm2022/acorex-platform-framework-client-layout-entity-bulk-entity.command-Cs3agnpF.mjs +162 -0
  25. package/fesm2022/acorex-platform-framework-client-layout-entity-bulk-entity.command-Cs3agnpF.mjs.map +1 -0
  26. package/fesm2022/{acorex-platform-framework-client-layout-entity-file-list-popup.component-Ci_CTFtq.mjs → acorex-platform-framework-client-layout-entity-file-list-popup.component-p0hxDb0W.mjs} +31 -19
  27. package/fesm2022/acorex-platform-framework-client-layout-entity-file-list-popup.component-p0hxDb0W.mjs.map +1 -0
  28. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-DmiB__JR.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-DYV9YPyw.mjs} +30 -18
  29. package/fesm2022/acorex-platform-framework-client-layout-entity-gallery-page.component-DYV9YPyw.mjs.map +1 -0
  30. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +2 -26780
  31. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs.map +1 -1
  32. package/fesm2022/acorex-platform-framework-client-layout-views.mjs +421 -151
  33. package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
  34. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +673 -287
  35. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
  36. package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-CIwpAXbL.mjs → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BiWerYcu.mjs} +16 -10
  37. package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-CIwpAXbL.mjs.map → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BiWerYcu.mjs.map} +1 -1
  38. package/fesm2022/{acorex-platform-framework-client-layout-widgets-image-preview.popup-CazpERbX.mjs → acorex-platform-framework-client-layout-widgets-image-preview.popup-BOrrMm3U.mjs} +9 -8
  39. package/fesm2022/acorex-platform-framework-client-layout-widgets-image-preview.popup-BOrrMm3U.mjs.map +1 -0
  40. package/fesm2022/{acorex-platform-framework-client-layout-widgets-page-widget-designer.component-DKkJi40s.mjs → acorex-platform-framework-client-layout-widgets-page-widget-designer.component-WzIiwnGC.mjs} +20 -12
  41. package/fesm2022/{acorex-platform-framework-client-layout-widgets-page-widget-designer.component-DKkJi40s.mjs.map → acorex-platform-framework-client-layout-widgets-page-widget-designer.component-WzIiwnGC.mjs.map} +1 -1
  42. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DtYZfA79.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-3CO4xJB3.mjs} +32 -18
  43. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-DtYZfA79.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-3CO4xJB3.mjs.map} +1 -1
  44. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-nMUtxAyy.mjs → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-CRST84ou.mjs} +8 -7
  45. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-nMUtxAyy.mjs.map → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-CRST84ou.mjs.map} +1 -1
  46. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-DvUSZ4hJ.mjs → acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-FjtSRxIX.mjs} +4 -4
  47. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-DvUSZ4hJ.mjs.map → acorex-platform-framework-client-layout-widgets-tabular-data-view-popup.component-FjtSRxIX.mjs.map} +1 -1
  48. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-BihIfkZW.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-D6HFPmGC.mjs} +10 -8
  49. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-BihIfkZW.mjs.map → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-D6HFPmGC.mjs.map} +1 -1
  50. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +4907 -2554
  51. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs.map +1 -1
  52. package/fesm2022/acorex-platform-framework-client-native.mjs +7 -7
  53. package/fesm2022/acorex-platform-framework-client-realtime-set-presence-availability.command-CetlUjnM.mjs +29 -0
  54. package/fesm2022/acorex-platform-framework-client-realtime-set-presence-availability.command-CetlUjnM.mjs.map +1 -0
  55. package/fesm2022/acorex-platform-framework-client-realtime.mjs +463 -26
  56. package/fesm2022/acorex-platform-framework-client-realtime.mjs.map +1 -1
  57. package/fesm2022/acorex-platform-framework-client-runtime.mjs +300 -137
  58. package/fesm2022/acorex-platform-framework-client-runtime.mjs.map +1 -1
  59. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-create-view.component-QIFX11dh.mjs → acorex-platform-framework-client-themes-default-entity-master-create-view.component-yeftgJ_K.mjs} +10 -7
  60. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-create-view.component-QIFX11dh.mjs.map → acorex-platform-framework-client-themes-default-entity-master-create-view.component-yeftgJ_K.mjs.map} +1 -1
  61. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-modify-view.component-BBdellyL.mjs → acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DWE3OWGm.mjs} +10 -7
  62. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-modify-view.component-BBdellyL.mjs.map → acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DWE3OWGm.mjs.map} +1 -1
  63. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-CIf1VWNW.mjs → acorex-platform-framework-client-themes-default-entity-master-single-view.component-C2Abf7Lb.mjs} +21 -19
  64. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-C2Abf7Lb.mjs.map +1 -0
  65. package/fesm2022/{acorex-platform-framework-client-themes-default-error-401.component-C_czT_JC.mjs → acorex-platform-framework-client-themes-default-error-401.component-BrTotLx1.mjs} +5 -5
  66. package/fesm2022/{acorex-platform-framework-client-themes-default-error-401.component-C_czT_JC.mjs.map → acorex-platform-framework-client-themes-default-error-401.component-BrTotLx1.mjs.map} +1 -1
  67. package/fesm2022/{acorex-platform-framework-client-themes-default-error-404.component-C2Wu0YtF.mjs → acorex-platform-framework-client-themes-default-error-404.component-DsC7_s59.mjs} +5 -5
  68. package/fesm2022/{acorex-platform-framework-client-themes-default-error-404.component-C2Wu0YtF.mjs.map → acorex-platform-framework-client-themes-default-error-404.component-DsC7_s59.mjs.map} +1 -1
  69. package/fesm2022/{acorex-platform-framework-client-themes-default-error-offline.component-DRz-kVsT.mjs → acorex-platform-framework-client-themes-default-error-offline.component-CngiQycG.mjs} +6 -6
  70. package/fesm2022/acorex-platform-framework-client-themes-default-error-offline.component-CngiQycG.mjs.map +1 -0
  71. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +448 -277
  72. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
  73. package/fesm2022/{acorex-platform-framework-client-themes-shared-icon-chooser-column.component-Ci_oH7NE.mjs → acorex-platform-framework-client-themes-shared-icon-chooser-column.component-CbZALjB5.mjs} +8 -6
  74. package/fesm2022/{acorex-platform-framework-client-themes-shared-icon-chooser-column.component-Ci_oH7NE.mjs.map → acorex-platform-framework-client-themes-shared-icon-chooser-column.component-CbZALjB5.mjs.map} +1 -1
  75. package/fesm2022/{acorex-platform-framework-client-themes-shared-icon-chooser-view.component-Lb1G2Xz7.mjs → acorex-platform-framework-client-themes-shared-icon-chooser-view.component-BRrNT6x2.mjs} +8 -6
  76. package/fesm2022/{acorex-platform-framework-client-themes-shared-icon-chooser-view.component-Lb1G2Xz7.mjs.map → acorex-platform-framework-client-themes-shared-icon-chooser-view.component-BRrNT6x2.mjs.map} +1 -1
  77. package/fesm2022/{acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-D4ubvFYf.mjs → acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-BIsQTr6B.mjs} +4 -4
  78. package/fesm2022/{acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-D4ubvFYf.mjs.map → acorex-platform-framework-client-themes-shared-theme-color-chooser-column.component-BIsQTr6B.mjs.map} +1 -1
  79. package/fesm2022/{acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-Br8j_BF_.mjs → acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-ZclmSbt9.mjs} +16 -10
  80. package/fesm2022/{acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-Br8j_BF_.mjs.map → acorex-platform-framework-client-themes-shared-theme-color-chooser-view.component-ZclmSbt9.mjs.map} +1 -1
  81. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs +538 -133
  82. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs.map +1 -1
  83. package/fesm2022/acorex-platform-framework-client-workflow.mjs +26 -66
  84. package/fesm2022/acorex-platform-framework-client-workflow.mjs.map +1 -1
  85. package/package.json +10 -10
  86. package/realtime/README.md +16 -0
  87. package/runtime/README.md +14 -0
  88. package/types/acorex-platform-framework-client-auth.d.ts +291 -52
  89. package/types/acorex-platform-framework-client-common.d.ts +615 -202
  90. package/types/acorex-platform-framework-client-core.d.ts +215 -225
  91. package/types/acorex-platform-framework-client-layout-builder.d.ts +24 -8
  92. package/types/acorex-platform-framework-client-layout-components.d.ts +407 -94
  93. package/types/acorex-platform-framework-client-layout-entity.d.ts +734 -411
  94. package/types/acorex-platform-framework-client-layout-views.d.ts +40 -15
  95. package/types/acorex-platform-framework-client-layout-widget-core.d.ts +66 -17
  96. package/types/acorex-platform-framework-client-layout-widgets.d.ts +295 -68
  97. package/types/acorex-platform-framework-client-realtime.d.ts +183 -6
  98. package/types/acorex-platform-framework-client-runtime.d.ts +134 -28
  99. package/types/acorex-platform-framework-client-themes-default.d.ts +9 -1
  100. package/types/acorex-platform-framework-client-themes-shared.d.ts +8 -2
  101. package/types/acorex-platform-framework-client-workflow.d.ts +12 -37
  102. package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-Euotv9l0.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-framework-client-layout-entity-attachments-page.component-BzUM-JMC.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-framework-client-layout-entity-file-list-popup.component-Ci_CTFtq.mjs.map +0 -1
  105. package/fesm2022/acorex-platform-framework-client-layout-entity-gallery-page.component-DmiB__JR.mjs.map +0 -1
  106. package/fesm2022/acorex-platform-framework-client-layout-widgets-image-preview.popup-CazpERbX.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-CIf1VWNW.mjs.map +0 -1
  108. package/fesm2022/acorex-platform-framework-client-themes-default-error-offline.component-DRz-kVsT.mjs.map +0 -1
@@ -1,14 +1,15 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, Injectable, Directive, computed, Injector, ChangeDetectionStrategy, Component, input, ElementRef, ViewContainerRef, signal, effect, runInInjectionContext, Optional, Inject, NgModule, EventEmitter, HostListener, Output, DestroyRef, untracked, provideAppInitializer, Pipe } from '@angular/core';
3
3
  import { AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
4
- import { AXDataSource, convertArrayToDataSource } from '@acorex/cdk/common';
5
- import { AXPPlatformCoreDataSourceKeys, isFormContextDirty, getSmart, isSelectionValueEqual, isFormValueEqual, setSmart, extractValue, AXPKeyboardShortcutPriority, getSystemActions, isLocaleStringMap } from '@acorex-platform/framework-shared/core';
6
- import { cloneDeep, isEmpty, isEqual, has, unset, isPlainObject, get, sortBy, set, isNil, castArray, isString, isUndefined, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
4
+ import { cloneDeep, isEmpty, isEqual, has, unset, isPlainObject, get, sortBy, set, isUndefined, isNil, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
7
5
  import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
6
+ import { isFormContextDirty, getSmart, isSelectionValueEqual, isFormValueEqual, setSmart, summarizeFormContextDirtyDiff, AXPExpressionEvaluatorScopeProviderContext, ExpressionEvaluatorEngine, extractValue, AXPKeyboardShortcutPriority, getSystemActions, isLocaleStringMap } from '@acorex-platform/framework-shared/core';
7
+ export { axpContextDefinitionIsAiPrompt } from '@acorex-platform/framework-shared/core';
8
8
  import { AXFormatService } from '@acorex/core/format';
9
9
  import * as i1 from '@acorex/components/skeleton';
10
10
  import { AXSkeletonModule } from '@acorex/components/skeleton';
11
- import { filter, take, ReplaySubject, Subject, interval, fromEvent } from 'rxjs';
11
+ import { Subject, interval, fromEvent } from 'rxjs';
12
+ import { AXPEntityEventsKeys } from '@acorex-platform/framework-shared/entity';
12
13
  import { toSignal } from '@angular/core/rxjs-interop';
13
14
  import * as i1$1 from '@angular/common';
14
15
  import { DOCUMENT, CommonModule } from '@angular/common';
@@ -32,10 +33,10 @@ class AXPActivityLogService {
32
33
  async getHistoryByIds(refId, refType, ids) {
33
34
  return (await Promise.all(this.providers?.map((p) => p.getHistoryByIds(refId, refType, ids)) ?? [])).flat();
34
35
  }
35
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPActivityLogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
36
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPActivityLogService, providedIn: 'root' }); }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPActivityLogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
37
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPActivityLogService, providedIn: 'root' }); }
37
38
  }
38
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPActivityLogService, decorators: [{
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPActivityLogService, decorators: [{
39
40
  type: Injectable,
40
41
  args: [{ providedIn: 'root' }]
41
42
  }] });
@@ -120,103 +121,14 @@ class AXPCatalogScopeDefinitionProviderService {
120
121
  }
121
122
  return resolveMultiLanguageString(definition.title, locale) || definition.name;
122
123
  }
123
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPCatalogScopeDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
124
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPCatalogScopeDefinitionProviderService, providedIn: 'root' }); }
124
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCatalogScopeDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
125
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCatalogScopeDefinitionProviderService, providedIn: 'root' }); }
125
126
  }
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPCatalogScopeDefinitionProviderService, decorators: [{
127
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCatalogScopeDefinitionProviderService, decorators: [{
127
128
  type: Injectable,
128
129
  args: [{ providedIn: 'root' }]
129
130
  }] });
130
131
 
131
- //#region ---- Imports ----
132
- //#endregion
133
- //#region ---- Data source definition ----
134
- /**
135
- * Registered catalog scopes for select / selection-list widgets via {@link AXPPlatformCoreDataSourceKeys.CatalogScopes}.
136
- */
137
- class AXPCatalogScopeDefinitionsDataSourceDefinition {
138
- constructor() {
139
- //#region ---- Services & Dependencies ----
140
- this.catalogScopeRegistry = inject(AXPCatalogScopeDefinitionProviderService);
141
- //#endregion
142
- }
143
- //#endregion
144
- //#region ---- Public API ----
145
- async items() {
146
- return [
147
- {
148
- name: AXPPlatformCoreDataSourceKeys.CatalogScopes,
149
- title: 'Catalog scopes',
150
- source: () => new AXDataSource({
151
- key: 'name',
152
- pageSize: 500,
153
- load: async (e) => {
154
- const all = await this.catalogScopeRegistry.items();
155
- const localeFilter = this.readTargetFilter(e?.filter);
156
- const items = all
157
- .filter((scope) => !localeFilter || scope.targets?.includes(localeFilter))
158
- .map((scope) => ({
159
- name: scope.name,
160
- title: this.catalogScopeRegistry.resolveTitle(scope),
161
- description: scope.description,
162
- targets: scope.targets,
163
- icon: scope.icon,
164
- cssClass: scope.cssClass,
165
- }));
166
- return { items, total: items.length };
167
- },
168
- byKey: async (key) => {
169
- const name = String(key ?? '').trim();
170
- if (!name) {
171
- return undefined;
172
- }
173
- const scope = await this.catalogScopeRegistry.get(name);
174
- if (!scope) {
175
- return undefined;
176
- }
177
- return {
178
- name: scope.name,
179
- title: this.catalogScopeRegistry.resolveTitle(scope),
180
- description: scope.description,
181
- targets: scope.targets,
182
- icon: scope.icon,
183
- cssClass: scope.cssClass,
184
- };
185
- },
186
- }),
187
- columns: [
188
- { name: 'name', title: 'Name', datatype: 'string', type: 'text-editor' },
189
- { name: 'title', title: 'Title', datatype: 'string', type: 'text-editor' },
190
- ],
191
- filters: [
192
- {
193
- field: 'targets',
194
- title: 'Target entity',
195
- operator: { type: 'contains' },
196
- widget: { type: 'text-editor' },
197
- filterType: { advance: false, inline: false },
198
- },
199
- ],
200
- textField: { name: 'title', title: 'Title' },
201
- valueField: { name: 'name', title: 'Name' },
202
- },
203
- ];
204
- }
205
- //#endregion
206
- //#region ---- Helpers ----
207
- readTargetFilter(filter) {
208
- if (!filter || typeof filter !== 'object') {
209
- return undefined;
210
- }
211
- const f = filter;
212
- if (f.field === 'targets' && typeof f.value === 'string' && f.value.trim()) {
213
- return f.value.trim();
214
- }
215
- return undefined;
216
- }
217
- }
218
- //#endregion
219
-
220
132
  //#region ---- Color Palette Provider ----
221
133
  /**
222
134
  * Abstract class for color palette providers
@@ -359,10 +271,10 @@ class AXPColorPaletteService {
359
271
  const uniquePalettes = allPalettes.filter((palette, index, self) => index === self.findIndex((p) => p.name === palette.name));
360
272
  this.cache = uniquePalettes;
361
273
  }
362
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
363
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorPaletteService, providedIn: 'root' }); }
274
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPColorPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
275
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPColorPaletteService, providedIn: 'root' }); }
364
276
  }
365
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColorPaletteService, decorators: [{
277
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPColorPaletteService, decorators: [{
366
278
  type: Injectable,
367
279
  args: [{
368
280
  providedIn: 'root',
@@ -477,10 +389,10 @@ class AXPDefaultColorPalettesProvider extends AXPColorPaletteProvider {
477
389
  },
478
390
  ];
479
391
  }
480
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDefaultColorPalettesProvider, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
481
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDefaultColorPalettesProvider }); }
392
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDefaultColorPalettesProvider, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
393
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDefaultColorPalettesProvider }); }
482
394
  }
483
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDefaultColorPalettesProvider, decorators: [{
395
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDefaultColorPalettesProvider, decorators: [{
484
396
  type: Injectable
485
397
  }] });
486
398
 
@@ -666,10 +578,10 @@ class AXPColumnWidthService {
666
578
  }
667
579
  return width;
668
580
  }
669
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
670
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidthService, providedIn: 'root' }); }
581
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPColumnWidthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
582
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPColumnWidthService, providedIn: 'root' }); }
671
583
  }
672
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPColumnWidthService, decorators: [{
584
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPColumnWidthService, decorators: [{
673
585
  type: Injectable,
674
586
  args: [{
675
587
  providedIn: 'root',
@@ -705,13 +617,131 @@ const defaultColumnWidthProvider = {
705
617
  //#endregion
706
618
 
707
619
  class AXPComponentSlot {
708
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
709
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: AXPComponentSlot, isStandalone: true, ngImport: i0 }); }
620
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
621
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: AXPComponentSlot, isStandalone: true, ngImport: i0 }); }
710
622
  }
711
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlot, decorators: [{
623
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlot, decorators: [{
712
624
  type: Directive
713
625
  }] });
714
626
 
627
+ //#region ---- Imports ----
628
+ //#endregion
629
+ //#region ---- Debug Service ----
630
+ /**
631
+ * Platform debug and trace logging.
632
+ * Call `trace` / `traceGroup` for diagnostics (gated by tenant Debug Mode).
633
+ * Call `warn` / `error` for always-on console output.
634
+ *
635
+ * Debug Mode is applied via `setDebugMode()` (wired from settings in platform common).
636
+ */
637
+ class AXPDebugService {
638
+ //#endregion
639
+ //#region ---- Lifecycle ----
640
+ constructor() {
641
+ //#endregion
642
+ //#region ---- State ----
643
+ this.debugModeEnabled = false;
644
+ AXPDebugService.instance = this;
645
+ }
646
+ //#endregion
647
+ //#region ---- Debug Mode ----
648
+ isDebugMode() {
649
+ return this.debugModeEnabled;
650
+ }
651
+ setDebugMode(enabled) {
652
+ this.debugModeEnabled = enabled;
653
+ }
654
+ //#endregion
655
+ //#region ---- Trace API ----
656
+ /**
657
+ * @param namespace Module/feature namespace (kebab-case). Filter console with `[AXP:<namespace>]`.
658
+ * @param title Short area name (component, service, middleware).
659
+ * @param message What happened.
660
+ * @param data Optional structured payload, or a factory evaluated only when Debug Mode is on.
661
+ */
662
+ trace(namespace, title, message, data) {
663
+ if (!this.debugModeEnabled) {
664
+ return;
665
+ }
666
+ this.log('log', namespace, title, message, data);
667
+ }
668
+ /**
669
+ * Same as {@link trace} but emits a collapsible console group (useful for multi-field payloads).
670
+ */
671
+ traceGroup(namespace, title, message, data) {
672
+ if (!this.debugModeEnabled) {
673
+ return;
674
+ }
675
+ const resolved = this.resolveData(data);
676
+ console.groupCollapsed(this.formatPrefix(namespace, title, message));
677
+ if (resolved != null) {
678
+ for (const [key, value] of Object.entries(resolved)) {
679
+ if (value !== undefined) {
680
+ console.log(key, value);
681
+ }
682
+ }
683
+ }
684
+ console.groupEnd();
685
+ }
686
+ warn(namespace, title, message, data) {
687
+ this.log('warn', namespace, title, message, data);
688
+ }
689
+ error(namespace, title, message, data) {
690
+ this.log('error', namespace, title, message, data);
691
+ }
692
+ //#endregion
693
+ //#region ---- Utility Methods ----
694
+ formatPrefix(namespace, title, message) {
695
+ return `[AXP:${namespace}] ${title} — ${message}`;
696
+ }
697
+ resolveData(data) {
698
+ if (data == null) {
699
+ return undefined;
700
+ }
701
+ return typeof data === 'function' ? data() : data;
702
+ }
703
+ log(level, namespace, title, message, data) {
704
+ const prefix = this.formatPrefix(namespace, title, message);
705
+ const resolved = this.resolveData(data);
706
+ if (resolved != null) {
707
+ console[level](prefix, resolved);
708
+ return;
709
+ }
710
+ console[level](prefix);
711
+ }
712
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDebugService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
713
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDebugService, providedIn: 'root' }); }
714
+ }
715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDebugService, decorators: [{
716
+ type: Injectable,
717
+ args: [{
718
+ providedIn: 'root',
719
+ }]
720
+ }], ctorParameters: () => [] });
721
+
722
+ /** Trace namespace for form dirty-state diagnostics (lookup/select revert, discard, baseline). */
723
+ const FORM_DIRTY_TRACE_NS = 'FORM STATE';
724
+
725
+ //#region ---- Debug helpers ----
726
+ function previewFormDebugValue(value) {
727
+ if (value == null) {
728
+ return value;
729
+ }
730
+ if (typeof value === 'string') {
731
+ return value.length > 160 ? `${value.slice(0, 160)}…` : value;
732
+ }
733
+ if (typeof value === 'number' || typeof value === 'boolean') {
734
+ return value;
735
+ }
736
+ try {
737
+ const json = JSON.stringify(value);
738
+ return json.length > 280 ? `${json.slice(0, 280)}…` : JSON.parse(json);
739
+ }
740
+ catch {
741
+ return String(value);
742
+ }
743
+ }
744
+ //#endregion
715
745
  //#region ---- Context signal store ----
716
746
  const AXPContextStore = signalStore(withState(() => ({
717
747
  data: {},
@@ -776,10 +806,11 @@ const AXPContextStore = signalStore(withState(() => ({
776
806
  }
777
807
  const updatedData = setSmart(currentData, path, value);
778
808
  const isStillDirty = hasSaved && isFormContextDirty(updatedData, saved);
809
+ const prevUserEdited = store.userEditedSinceCommit();
779
810
  const nextUserEdited = isStillDirty
780
811
  ? origin === 'user'
781
812
  ? true
782
- : store.userEditedSinceCommit()
813
+ : prevUserEdited
783
814
  : false;
784
815
  const changeEvent = {
785
816
  oldValue,
@@ -789,6 +820,24 @@ const AXPContextStore = signalStore(withState(() => ({
789
820
  data: updatedData,
790
821
  origin,
791
822
  };
823
+ if (hasSaved && (prevUserEdited !== nextUserEdited || (origin === 'user' && isStillDirty))) {
824
+ AXPDebugService.instance?.trace(FORM_DIRTY_TRACE_NS, 'context-store', 'updateValue dirty transition', () => ({
825
+ path,
826
+ origin,
827
+ prevUserEdited,
828
+ nextUserEdited,
829
+ isStillDirty,
830
+ selectionEqual: isSelectionValueEqual(value, savedAtPath),
831
+ formValueEqual: isFormValueEqual(value, savedAtPath),
832
+ lodashEqual: isEqual(value, savedAtPath),
833
+ oldPreview: previewFormDebugValue(oldValue),
834
+ newPreview: previewFormDebugValue(value),
835
+ savedPreview: previewFormDebugValue(savedAtPath),
836
+ dirtyPaths: isStillDirty
837
+ ? summarizeFormContextDirtyDiff(updatedData, saved)
838
+ : [],
839
+ }));
840
+ }
792
841
  patchState(store, {
793
842
  previousSnapshot: store.snapshot(),
794
843
  data: updatedData,
@@ -932,6 +981,12 @@ const AXPContextStore = signalStore(withState(() => ({
932
981
  /** Marks the current data as the saved baseline. */
933
982
  commitSaved() {
934
983
  const snapshot = cloneDeep(store.data());
984
+ const prevUserEdited = store.userEditedSinceCommit();
985
+ AXPDebugService.instance?.trace(FORM_DIRTY_TRACE_NS, 'context-store', 'commitSaved', () => ({
986
+ prevUserEdited,
987
+ hadSaved: !isEmpty(store.savedSnapshot()),
988
+ topKeys: Object.keys(snapshot ?? {}).slice(0, 24),
989
+ }));
935
990
  patchState(store, {
936
991
  savedSnapshot: snapshot,
937
992
  previousSnapshot: snapshot,
@@ -1022,10 +1077,10 @@ class AXPContextEvalFactory {
1022
1077
  eval: (path, options) => this.create(getData())(path, options),
1023
1078
  };
1024
1079
  }
1025
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContextEvalFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1026
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContextEvalFactory, providedIn: 'root' }); }
1080
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContextEvalFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1081
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContextEvalFactory, providedIn: 'root' }); }
1027
1082
  }
1028
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContextEvalFactory, decorators: [{
1083
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContextEvalFactory, decorators: [{
1029
1084
  type: Injectable,
1030
1085
  args: [{ providedIn: 'root' }]
1031
1086
  }] });
@@ -1048,17 +1103,6 @@ function normalizeExpressionTemplate(template) {
1048
1103
  }
1049
1104
  //#endregion
1050
1105
 
1051
- class AXPExpressionEvaluatorScopeProviderContext {
1052
- constructor() {
1053
- this.scopes = {};
1054
- }
1055
- addScope(namespace, functions) {
1056
- this.scopes[namespace] = { ...this.scopes[namespace], ...functions };
1057
- }
1058
- getScopes() {
1059
- return this.scopes;
1060
- }
1061
- }
1062
1106
  const AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER = new InjectionToken('AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER');
1063
1107
  class AXPExpressionEvaluatorScopeProviderService {
1064
1108
  constructor() {
@@ -1089,134 +1133,49 @@ class AXPExpressionEvaluatorScopeProviderService {
1089
1133
  await this.load();
1090
1134
  return this.cache || {};
1091
1135
  }
1092
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1093
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, providedIn: 'root' }); }
1136
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1137
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, providedIn: 'root' }); }
1094
1138
  }
1095
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, decorators: [{
1139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, decorators: [{
1096
1140
  type: Injectable,
1097
1141
  args: [{ providedIn: 'root' }]
1098
1142
  }] });
1099
1143
 
1100
1144
  class AXPExpressionEvaluatorService {
1101
1145
  constructor() {
1102
- // Memoization cache for compiled expressions
1103
- this.expressionCache = new Map();
1146
+ this.engine = new ExpressionEvaluatorEngine();
1104
1147
  this.providerService = inject(AXPExpressionEvaluatorScopeProviderService);
1105
1148
  }
1106
- getOrCompileFunction(expression) {
1107
- if (!this.expressionCache.has(expression)) {
1108
- // Check if expression contains multiple statements (has semicolons or newlines)
1109
- const hasMultipleStatements = expression.includes(';') || expression.includes('\n');
1110
- let fn;
1111
- if (hasMultipleStatements) {
1112
- // For multiple statements, execute them in sequence and return the last expression
1113
- fn = new Function('scope', `with (scope) { return (async function() { ${expression} })(); }`);
1114
- }
1115
- else {
1116
- // For single expressions, use return
1117
- fn = new Function('scope', `with (scope) { return (async function() { return ${expression}; })(); }`);
1118
- }
1119
- this.expressionCache.set(expression, fn);
1120
- }
1121
- return this.expressionCache.get(expression);
1122
- }
1123
1149
  async getMergedScope(userScope) {
1124
1150
  const pluginScopes = await this.providerService.getScopesAsync();
1125
1151
  // Merge pluginScopes and userScope (userScope takes precedence)
1126
1152
  return { ...pluginScopes, ...userScope };
1127
1153
  }
1128
1154
  async evaluate(source, scope = {}) {
1129
- try {
1130
- const mergedScope = await this.getMergedScope(scope);
1131
- if (typeof source === 'string' && source.includes('{{')) {
1132
- return await this.evaluateStringExpression(source, mergedScope);
1133
- }
1134
- else if (Array.isArray(source)) {
1135
- const evaluatedArray = [];
1136
- for (const item of source) {
1137
- evaluatedArray.push(await this.evaluate(item, mergedScope));
1138
- }
1139
- return evaluatedArray;
1140
- }
1141
- else if (typeof source === 'object' && source !== null) {
1142
- const evaluatedObject = {};
1143
- for (const key in source) {
1144
- if (source.hasOwnProperty(key)) {
1145
- evaluatedObject[key] = await this.evaluate(source[key], mergedScope);
1146
- }
1147
- }
1148
- return evaluatedObject;
1149
- }
1150
- else {
1151
- return source;
1152
- }
1153
- }
1154
- catch (error) {
1155
- console.error('Expression evaluator - Error evaluating expression:', source, error);
1156
- return false;
1157
- }
1158
- }
1159
- async evaluateStringExpression(templateExpression, scope) {
1160
- const normalizedTemplate = normalizeExpressionTemplate(templateExpression);
1161
- // Check if the input is exactly a single {{ ... }} expression (handle multiline)
1162
- const exactMatch = normalizedTemplate.match(/^\s*\{\{\s*([\s\S]*?)\s*\}\}\s*$/);
1163
- if (exactMatch) {
1164
- const expression = exactMatch[1];
1165
- const sandbox = this.getOrCompileFunction(expression);
1166
- const result = await sandbox(scope);
1167
- return result;
1168
- }
1169
- // Otherwise, interpolate all {{ ... }} expressions in the string
1170
- const regex = /\{\{\s*([\s\S]*?)\s*\}\}/g;
1171
- // Collect all matches and their positions
1172
- const matches = [];
1173
- let match;
1174
- while ((match = regex.exec(normalizedTemplate)) !== null) {
1175
- matches.push({
1176
- expression: match[1],
1177
- start: match.index,
1178
- end: regex.lastIndex,
1179
- raw: match[0],
1180
- });
1181
- }
1182
- // Evaluate all expressions in parallel
1183
- const values = await Promise.all(matches.map((m) => {
1184
- const sandbox = this.getOrCompileFunction(m.expression);
1185
- return sandbox(scope);
1186
- }));
1187
- // Reconstruct the string with evaluated values
1188
- let result = '';
1189
- let lastIndex = 0;
1190
- matches.forEach((m, i) => {
1191
- result += normalizedTemplate.slice(lastIndex, m.start);
1192
- const value = values[i];
1193
- result += value !== undefined && value !== null ? value : '';
1194
- lastIndex = m.end;
1155
+ const mergedScope = await this.getMergedScope(scope);
1156
+ return this.engine.evaluate(source, mergedScope, {
1157
+ normalizeTemplate: normalizeExpressionTemplate,
1158
+ swallowErrors: true,
1195
1159
  });
1196
- result += normalizedTemplate.slice(lastIndex);
1197
- return result;
1198
1160
  }
1199
1161
  isExpression(expression) {
1200
- if (typeof expression === 'string') {
1201
- return expression.trim().startsWith('{{') && expression.trim().endsWith('}}');
1202
- }
1203
- return false;
1162
+ return this.engine.isExpression(expression);
1204
1163
  }
1205
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPExpressionEvaluatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1206
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPExpressionEvaluatorService, providedIn: 'root' }); }
1164
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1165
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorService, providedIn: 'root' }); }
1207
1166
  }
1208
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPExpressionEvaluatorService, decorators: [{
1167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorService, decorators: [{
1209
1168
  type: Injectable,
1210
1169
  args: [{ providedIn: 'root' }]
1211
1170
  }] });
1212
1171
 
1213
1172
  class AXPComponentSlotPlaceholderComponent {
1214
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1215
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPComponentSlotPlaceholderComponent, isStandalone: true, selector: "axp-component-slot-placeholder", ngImport: i0, template: `<div>
1173
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1174
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPComponentSlotPlaceholderComponent, isStandalone: true, selector: "axp-component-slot-placeholder", ngImport: i0, template: `<div>
1216
1175
  <ax-skeleton class="w-full h-10 rounded-md"></ax-skeleton>
1217
1176
  </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1218
1177
  }
1219
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotPlaceholderComponent, decorators: [{
1178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotPlaceholderComponent, decorators: [{
1220
1179
  type: Component,
1221
1180
  args: [{
1222
1181
  selector: 'axp-component-slot-placeholder',
@@ -1245,10 +1204,10 @@ class AXPComponentSlotRegistryService {
1245
1204
  get(slotName) {
1246
1205
  return this.registry.get(slotName) || [];
1247
1206
  }
1248
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1249
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotRegistryService, providedIn: 'root' }); }
1207
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1208
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotRegistryService, providedIn: 'root' }); }
1250
1209
  }
1251
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotRegistryService, decorators: [{
1210
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotRegistryService, decorators: [{
1252
1211
  type: Injectable,
1253
1212
  args: [{
1254
1213
  providedIn: 'root'
@@ -1257,18 +1216,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1257
1216
 
1258
1217
  class AXPComponentSlotDirective {
1259
1218
  constructor() {
1260
- this.name = input.required(...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
1261
- this.host = input(...(ngDevMode ? [undefined, { debugName: "host" }] : /* istanbul ignore next */ []));
1262
- this.context = input(...(ngDevMode ? [undefined, { debugName: "context" }] : /* istanbul ignore next */ []));
1219
+ this.name = input.required(/* @ts-ignore */
1220
+ ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
1221
+ this.host = input(/* @ts-ignore */
1222
+ ...(ngDevMode ? [undefined, { debugName: "host" }] : /* istanbul ignore next */ []));
1223
+ this.context = input(/* @ts-ignore */
1224
+ ...(ngDevMode ? [undefined, { debugName: "context" }] : /* istanbul ignore next */ []));
1263
1225
  this.elementRef = inject(ElementRef);
1264
1226
  this.registryService = inject(AXPComponentSlotRegistryService);
1265
1227
  this.injector = inject(Injector);
1266
1228
  this.evaluator = inject(AXPExpressionEvaluatorService);
1267
1229
  this.viewContainerRef = inject(ViewContainerRef);
1268
1230
  this.contextStore = inject(AXPContextStore);
1269
- this.isEmpty = computed(() => this._viewCount() === 0, ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
1231
+ this.isEmpty = computed(() => this._viewCount() === 0, /* @ts-ignore */
1232
+ ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
1270
1233
  // Create a signal to store the count of children
1271
- this._viewCount = signal(0, ...(ngDevMode ? [{ debugName: "_viewCount" }] : /* istanbul ignore next */ []));
1234
+ this._viewCount = signal(0, /* @ts-ignore */
1235
+ ...(ngDevMode ? [{ debugName: "_viewCount" }] : /* istanbul ignore next */ []));
1272
1236
  // Track component references for updates
1273
1237
  this.componentRefs = [];
1274
1238
  // Track placeholder references for replacement
@@ -1389,10 +1353,10 @@ class AXPComponentSlotDirective {
1389
1353
  return condition(this.contextStore.data());
1390
1354
  //return condition(this.context());
1391
1355
  }
1392
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1393
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: AXPComponentSlotDirective, isStandalone: false, selector: "axp-component-slot", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, host: { classPropertyName: "host", publicName: "host", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["slot"], ngImport: i0 }); }
1356
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1357
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXPComponentSlotDirective, isStandalone: false, selector: "axp-component-slot", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null }, host: { classPropertyName: "host", publicName: "host", isSignal: true, isRequired: false, transformFunction: null }, context: { classPropertyName: "context", publicName: "context", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["slot"], ngImport: i0 }); }
1394
1358
  }
1395
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotDirective, decorators: [{
1359
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotDirective, decorators: [{
1396
1360
  type: Directive,
1397
1361
  args: [{
1398
1362
  selector: 'axp-component-slot',
@@ -1452,11 +1416,11 @@ class AXPComponentSlotModule {
1452
1416
  f();
1453
1417
  });
1454
1418
  }
1455
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotModule, deps: [{ token: 'AXPComponentSlotModuleFactory', optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
1456
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotModule, declarations: [AXPComponentSlotDirective], exports: [AXPComponentSlotDirective] }); }
1457
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotModule }); }
1419
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotModule, deps: [{ token: 'AXPComponentSlotModuleFactory', optional: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
1420
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotModule, declarations: [AXPComponentSlotDirective], exports: [AXPComponentSlotDirective] }); }
1421
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotModule }); }
1458
1422
  }
1459
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPComponentSlotModule, decorators: [{
1423
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotModule, decorators: [{
1460
1424
  type: NgModule,
1461
1425
  args: [{
1462
1426
  declarations: [AXPComponentSlotDirective],
@@ -1469,12 +1433,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1469
1433
  args: ['AXPComponentSlotModuleFactory']
1470
1434
  }] }] });
1471
1435
 
1472
- /** Trace namespace for form dirty-state diagnostics (lookup/select revert, discard, baseline). */
1473
- const FORM_DIRTY_TRACE_NS = 'FORM STATE';
1474
-
1475
- //#region ---- AI metadata ----
1476
- //#endregion
1477
-
1478
1436
  const AXP_CONTEXT_DEFINITION_PROVIDER = new InjectionToken('AXP_CONTEXT_DEFINITION_PROVIDER');
1479
1437
  //#endregion
1480
1438
 
@@ -1505,109 +1463,14 @@ class AXPContextDefinitionProviderService {
1505
1463
  async get(name) {
1506
1464
  return (await this.items()).find((d) => d.name === name);
1507
1465
  }
1508
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContextDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1509
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContextDefinitionProviderService, providedIn: 'root' }); }
1466
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContextDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1467
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContextDefinitionProviderService, providedIn: 'root' }); }
1510
1468
  }
1511
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContextDefinitionProviderService, decorators: [{
1469
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContextDefinitionProviderService, decorators: [{
1512
1470
  type: Injectable,
1513
1471
  args: [{ providedIn: 'root' }]
1514
1472
  }] });
1515
1473
 
1516
- //#region ---- Imports ----
1517
- //#endregion
1518
- //#region ---- Debug Service ----
1519
- /**
1520
- * Platform debug and trace logging.
1521
- * Call `trace` / `traceGroup` for diagnostics (gated by tenant Debug Mode).
1522
- * Call `warn` / `error` for always-on console output.
1523
- *
1524
- * Debug Mode is applied via `setDebugMode()` (wired from settings in platform common).
1525
- */
1526
- class AXPDebugService {
1527
- //#endregion
1528
- //#region ---- Lifecycle ----
1529
- constructor() {
1530
- //#endregion
1531
- //#region ---- State ----
1532
- this.debugModeEnabled = false;
1533
- AXPDebugService.instance = this;
1534
- }
1535
- //#endregion
1536
- //#region ---- Debug Mode ----
1537
- isDebugMode() {
1538
- return this.debugModeEnabled;
1539
- }
1540
- setDebugMode(enabled) {
1541
- this.debugModeEnabled = enabled;
1542
- }
1543
- //#endregion
1544
- //#region ---- Trace API ----
1545
- /**
1546
- * @param namespace Module/feature namespace (kebab-case). Filter console with `[AXP:<namespace>]`.
1547
- * @param title Short area name (component, service, middleware).
1548
- * @param message What happened.
1549
- * @param data Optional structured payload, or a factory evaluated only when Debug Mode is on.
1550
- */
1551
- trace(namespace, title, message, data) {
1552
- if (!this.debugModeEnabled) {
1553
- return;
1554
- }
1555
- this.log('log', namespace, title, message, data);
1556
- }
1557
- /**
1558
- * Same as {@link trace} but emits a collapsible console group (useful for multi-field payloads).
1559
- */
1560
- traceGroup(namespace, title, message, data) {
1561
- if (!this.debugModeEnabled) {
1562
- return;
1563
- }
1564
- const resolved = this.resolveData(data);
1565
- console.groupCollapsed(this.formatPrefix(namespace, title, message));
1566
- if (resolved != null) {
1567
- for (const [key, value] of Object.entries(resolved)) {
1568
- if (value !== undefined) {
1569
- console.log(key, value);
1570
- }
1571
- }
1572
- }
1573
- console.groupEnd();
1574
- }
1575
- warn(namespace, title, message, data) {
1576
- this.log('warn', namespace, title, message, data);
1577
- }
1578
- error(namespace, title, message, data) {
1579
- this.log('error', namespace, title, message, data);
1580
- }
1581
- //#endregion
1582
- //#region ---- Utility Methods ----
1583
- formatPrefix(namespace, title, message) {
1584
- return `[AXP:${namespace}] ${title} — ${message}`;
1585
- }
1586
- resolveData(data) {
1587
- if (data == null) {
1588
- return undefined;
1589
- }
1590
- return typeof data === 'function' ? data() : data;
1591
- }
1592
- log(level, namespace, title, message, data) {
1593
- const prefix = this.formatPrefix(namespace, title, message);
1594
- const resolved = this.resolveData(data);
1595
- if (resolved != null) {
1596
- console[level](prefix, resolved);
1597
- return;
1598
- }
1599
- console[level](prefix);
1600
- }
1601
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDebugService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1602
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDebugService, providedIn: 'root' }); }
1603
- }
1604
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDebugService, decorators: [{
1605
- type: Injectable,
1606
- args: [{
1607
- providedIn: 'root',
1608
- }]
1609
- }], ctorParameters: () => [] });
1610
-
1611
1474
  class AXPDataGenerator {
1612
1475
  static uuid() {
1613
1476
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {
@@ -1789,287 +1652,18 @@ function objectKeyValueTransforms(keyName) {
1789
1652
  };
1790
1653
  }
1791
1654
 
1792
- const AXP_DATASOURCE_DEFINITION_PROVIDER = new InjectionToken('AXP_DATASOURCE_TYPE_PROVIDER');
1793
- class AXPDataSourceDefinitionProviderService {
1794
- constructor() {
1795
- this.providers = inject(AXP_DATASOURCE_DEFINITION_PROVIDER, { optional: true });
1796
- }
1797
- async items() {
1798
- const items = [];
1799
- // Load from DI tokens; resolve lazy providers (provideLazyProvider uses useFactory that returns Promise<T>)
1800
- if (Array.isArray(this.providers)) {
1801
- for (const raw of this.providers) {
1802
- const provider = await Promise.resolve(raw);
1803
- if (provider && typeof provider.items === 'function') {
1804
- set(provider, '__parent__', this);
1805
- items.push(...(await provider.items()));
1806
- }
1807
- }
1808
- }
1809
- return items;
1810
- }
1811
- async get(name) {
1812
- return (await this.items()).find((c) => c.name == name);
1813
- }
1814
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1815
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceDefinitionProviderService, providedIn: 'root' }); }
1816
- }
1817
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceDefinitionProviderService, decorators: [{
1818
- type: Injectable,
1819
- args: [{ providedIn: 'root' }]
1820
- }] });
1821
-
1822
- //#region ---- Imports ----
1823
- //#endregion
1824
- /**
1825
- * Resolves registry-backed {@link AXDataSource} instances and exposes readiness (`isReady`, `whenReady`)
1826
- * so widgets do not bind selected values before the provider datasource is available.
1827
- */
1828
- class AXPDataSourceQueryService {
1829
- constructor() {
1830
- //#region ---- Services & State ----
1831
- this.definitionService = inject(AXPDataSourceDefinitionProviderService);
1832
- this.entries = new Map();
1833
- }
1834
- //#endregion
1835
- //#region ---- Public API ----
1836
- /**
1837
- * Returns true when the named registry datasource has been resolved for the given options.
1838
- */
1839
- isReady(name, options) {
1840
- const entry = this.entries.get(this.buildCacheKey(name, options));
1841
- return entry?.result?.ready === true && entry.result.dataSource != null;
1842
- }
1843
- /**
1844
- * Emits once when the registry datasource is resolved (or fails) for the given options.
1845
- */
1846
- whenReady(name, options) {
1847
- return this.ensureLoading(name, options).readySubject.asObservable().pipe(filter((result) => result.ready), take(1));
1848
- }
1849
- /**
1850
- * Resolves and returns the {@link AXDataSource} for a registry name, waiting for providers when needed.
1851
- */
1852
- async getDataSource(name, options) {
1853
- const result = await this.resolve(name, options);
1854
- return result.dataSource;
1855
- }
1856
- /**
1857
- * Resolves the registry datasource, then looks up one or more keys via `byKey`.
1858
- */
1859
- async queryByKey(name, key, options) {
1860
- if (isNil(key)) {
1861
- return null;
1862
- }
1863
- const result = await this.resolve(name, options);
1864
- const dataSource = result.dataSource;
1865
- if (!dataSource?.config?.byKey) {
1866
- return null;
1867
- }
1868
- if (Array.isArray(key)) {
1869
- const items = await Promise.all(key.map((k) => dataSource.config.byKey(k)));
1870
- return items.filter((item) => item != null);
1871
- }
1872
- return (await dataSource.config.byKey(key)) ?? null;
1873
- }
1874
- /**
1875
- * Fully resolves a registry datasource (definition + AXDataSource instance).
1876
- */
1877
- async resolve(name, options) {
1878
- const entry = this.ensureLoading(name, options);
1879
- if (entry.result?.ready) {
1880
- return entry.result;
1881
- }
1882
- return entry.loadPromise;
1883
- }
1884
- /**
1885
- * Clears cached query state. Pass a registry name to invalidate one datasource, or omit to clear all.
1886
- */
1887
- invalidate(name) {
1888
- if (!name) {
1889
- this.entries.clear();
1890
- return;
1891
- }
1892
- const prefix = `${name}::`;
1893
- for (const key of [...this.entries.keys()]) {
1894
- if (key === name || key.startsWith(prefix)) {
1895
- this.entries.delete(key);
1896
- }
1897
- }
1898
- }
1899
- //#endregion
1900
- //#region ---- Loading ----
1901
- ensureLoading(name, options) {
1902
- const cacheKey = this.buildCacheKey(name, options);
1903
- let entry = this.entries.get(cacheKey);
1904
- if (!entry) {
1905
- entry = {
1906
- name,
1907
- cacheKey,
1908
- readySubject: new ReplaySubject(1),
1909
- };
1910
- this.entries.set(cacheKey, entry);
1911
- entry.loadPromise = this.loadEntry(entry, name, options);
1912
- }
1913
- return entry;
1914
- }
1915
- async loadEntry(entry, name, options) {
1916
- const pending = {
1917
- name,
1918
- ready: false,
1919
- dataSource: null,
1920
- valueField: options?.valueField ?? 'id',
1921
- textField: 'title',
1922
- };
1923
- try {
1924
- const definition = await this.waitForDefinition(name, options);
1925
- if (!definition) {
1926
- const failed = {
1927
- ...pending,
1928
- ready: true,
1929
- error: new Error(`Data source '${name}' was not found in the registry`),
1930
- };
1931
- entry.result = failed;
1932
- entry.readySubject.next(failed);
1933
- return failed;
1934
- }
1935
- const valueField = options?.valueField ?? definition.valueField?.name ?? 'id';
1936
- const textField = definition.textField?.name ?? 'title';
1937
- const dataSource = await this.createDataSource(definition, {
1938
- ...options,
1939
- valueField,
1940
- });
1941
- const translated = dataSource ? this.wrapTranslatedDataSource(dataSource, textField) : null;
1942
- const success = {
1943
- name,
1944
- ready: true,
1945
- dataSource: translated,
1946
- definition,
1947
- valueField,
1948
- textField,
1949
- };
1950
- entry.result = success;
1951
- entry.readySubject.next(success);
1952
- return success;
1953
- }
1954
- catch (error) {
1955
- const failed = {
1956
- ...pending,
1957
- ready: true,
1958
- error,
1959
- };
1960
- entry.result = failed;
1961
- entry.readySubject.next(failed);
1962
- return failed;
1963
- }
1964
- }
1965
- async waitForDefinition(name, options) {
1966
- const waitForRegistry = options?.waitForRegistry ?? true;
1967
- const maxAttempts = options?.maxRegistryAttempts ?? 20;
1968
- const retryDelayMs = options?.registryRetryDelayMs ?? 50;
1969
- const attempts = waitForRegistry ? maxAttempts : 1;
1970
- for (let attempt = 0; attempt < attempts; attempt++) {
1971
- const definition = await this.definitionService.get(name);
1972
- if (definition) {
1973
- return definition;
1974
- }
1975
- if (attempt < attempts - 1) {
1976
- await this.sleep(retryDelayMs);
1977
- }
1978
- }
1979
- return undefined;
1980
- }
1981
- async createDataSource(definition, options) {
1982
- if (options.useSamples && definition.samples) {
1983
- const samples = await this.resolveSamples(definition.samples);
1984
- return convertArrayToDataSource(samples, {
1985
- key: options.valueField,
1986
- pageSize: 500,
1987
- });
1988
- }
1989
- const sourceResult = definition.source();
1990
- const resolved = await Promise.resolve(sourceResult);
1991
- if (resolved instanceof AXDataSource) {
1992
- this.applyValueFieldAsKey(resolved, options.valueField);
1993
- return resolved;
1994
- }
1995
- if (Array.isArray(resolved)) {
1996
- return convertArrayToDataSource(resolved, {
1997
- key: options.valueField,
1998
- pageSize: 500,
1999
- });
2000
- }
2001
- return null;
2002
- }
2003
- async resolveSamples(samples) {
2004
- return castArray(await Promise.resolve(samples));
2005
- }
2006
- applyValueFieldAsKey(dataSource, valueField) {
2007
- if (dataSource.config?.key !== valueField) {
2008
- dataSource.config = { ...dataSource.config, key: valueField };
2009
- }
2010
- }
2011
- wrapTranslatedDataSource(dataSource, textField) {
2012
- const config = dataSource.config;
2013
- if (!config) {
2014
- return dataSource;
2015
- }
2016
- const originalByKey = config.byKey;
2017
- const originalLoad = config.load;
2018
- if (originalByKey) {
2019
- config.byKey = async (key) => this.translateItem(await originalByKey(key), textField);
2020
- }
2021
- if (originalLoad) {
2022
- config.load = async (event) => {
2023
- const result = await originalLoad(event);
2024
- if (!result?.items?.length) {
2025
- return result;
2026
- }
2027
- return {
2028
- ...result,
2029
- items: result.items.map((item) => this.translateItem(item, textField)),
2030
- };
2031
- };
2032
- }
2033
- return dataSource;
2034
- }
2035
- translateItem(item, textField) {
2036
- if (item == null || typeof item !== 'object') {
2037
- return item;
2038
- }
2039
- const title = get(item, textField);
2040
- // Keep i18n keys for UI widgets (ax-select-box translate pipe) so labels react to locale changes.
2041
- if (isString(title) && title.startsWith('@')) {
2042
- return item;
2043
- }
2044
- return item;
2045
- }
2046
- buildCacheKey(name, options) {
2047
- const valueField = options?.valueField ?? '';
2048
- const useSamples = options?.useSamples ? '1' : '0';
2049
- return `${name}::${valueField}::${useSamples}`;
2050
- }
2051
- sleep(ms) {
2052
- return new Promise((resolve) => setTimeout(resolve, ms));
2053
- }
2054
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceQueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2055
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceQueryService, providedIn: 'root' }); }
2056
- }
2057
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceQueryService, decorators: [{
2058
- type: Injectable,
2059
- args: [{ providedIn: 'root' }]
2060
- }] });
2061
-
2062
1655
  // src/app/directives/grid-layout.directive.ts
2063
1656
  class AXPContentCheckerDirective {
2064
1657
  constructor() {
2065
1658
  this.viewContainerRef = inject(ViewContainerRef);
2066
1659
  this.elementRef = inject((ElementRef));
2067
- this.isEmpty = computed(() => this.viewContainerRef.length === 0, ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
1660
+ this.isEmpty = computed(() => this.viewContainerRef.length === 0, /* @ts-ignore */
1661
+ ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
2068
1662
  }
2069
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContentCheckerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2070
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: AXPContentCheckerDirective, isStandalone: true, selector: "[axp-content-checker]", exportAs: ["checker"], ngImport: i0 }); }
1663
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContentCheckerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1664
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: AXPContentCheckerDirective, isStandalone: true, selector: "[axp-content-checker]", exportAs: ["checker"], ngImport: i0 }); }
2071
1665
  }
2072
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPContentCheckerDirective, decorators: [{
1666
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContentCheckerDirective, decorators: [{
2073
1667
  type: Directive,
2074
1668
  args: [{
2075
1669
  selector: '[axp-content-checker]',
@@ -2099,10 +1693,10 @@ class AXPDblClickDirective {
2099
1693
  }
2100
1694
  this.lastTap = currentTime;
2101
1695
  }
2102
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDblClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
2103
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: AXPDblClickDirective, isStandalone: true, selector: "[onDblClick]", outputs: { onDblClick: "onDblClick" }, host: { listeners: { "dblclick": "handleOnDblClick($event)", "touchend": "onTouchEnd($event)" } }, ngImport: i0 }); }
1696
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDblClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1697
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: AXPDblClickDirective, isStandalone: true, selector: "[onDblClick]", outputs: { onDblClick: "onDblClick" }, host: { listeners: { "dblclick": "handleOnDblClick($event)", "touchend": "onTouchEnd($event)" } }, ngImport: i0 }); }
2104
1698
  }
2105
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDblClickDirective, decorators: [{
1699
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDblClickDirective, decorators: [{
2106
1700
  type: Directive,
2107
1701
  args: [{
2108
1702
  selector: '[onDblClick]'
@@ -2127,7 +1721,8 @@ class AXPElementDataDirective {
2127
1721
  const currentData = this.data();
2128
1722
  const currentPath = this.path();
2129
1723
  set(this.elementRef.nativeElement, currentPath, currentData);
2130
- }, ...(ngDevMode ? [{ debugName: "updateEffect" }] : /* istanbul ignore next */ []));
1724
+ }, /* @ts-ignore */
1725
+ ...(ngDevMode ? [{ debugName: "updateEffect" }] : /* istanbul ignore next */ []));
2131
1726
  }
2132
1727
  ngOnInit() {
2133
1728
  // Initial data setup
@@ -2145,10 +1740,10 @@ class AXPElementDataDirective {
2145
1740
  setData(data) {
2146
1741
  set(this.elementRef.nativeElement, this.path(), data);
2147
1742
  }
2148
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPElementDataDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
2149
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: AXPElementDataDirective, isStandalone: true, selector: "[axp-data]", inputs: { data: { classPropertyName: "data", publicName: "axp-data", isSignal: true, isRequired: false, transformFunction: null }, path: { classPropertyName: "path", publicName: "axp-data-path", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
1743
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPElementDataDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
1744
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXPElementDataDirective, isStandalone: true, selector: "[axp-data]", inputs: { data: { classPropertyName: "data", publicName: "axp-data", isSignal: true, isRequired: false, transformFunction: null }, path: { classPropertyName: "path", publicName: "axp-data-path", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
2150
1745
  }
2151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPElementDataDirective, decorators: [{
1746
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPElementDataDirective, decorators: [{
2152
1747
  type: Directive,
2153
1748
  args: [{
2154
1749
  selector: '[axp-data]',
@@ -2205,10 +1800,10 @@ class AXPGridLayoutDirective {
2205
1800
  }
2206
1801
  });
2207
1802
  }
2208
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridLayoutDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
2209
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: AXPGridLayoutDirective, isStandalone: true, selector: "[axp-grid-layout]", inputs: { options: { classPropertyName: "options", publicName: "axp-grid-layout", isSignal: true, isRequired: true, transformFunction: null } }, usesOnChanges: true, ngImport: i0 }); }
1803
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGridLayoutDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
1804
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXPGridLayoutDirective, isStandalone: true, selector: "[axp-grid-layout]", inputs: { options: { classPropertyName: "options", publicName: "axp-grid-layout", isSignal: true, isRequired: true, transformFunction: null } }, usesOnChanges: true, ngImport: i0 }); }
2210
1805
  }
2211
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPGridLayoutDirective, decorators: [{
1806
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGridLayoutDirective, decorators: [{
2212
1807
  type: Directive,
2213
1808
  args: [{
2214
1809
  selector: '[axp-grid-layout]',
@@ -2352,22 +1947,26 @@ class AXPDistributedEventListenerService {
2352
1947
  this.listenersByKey.clear();
2353
1948
  this.providersLoaded = false;
2354
1949
  }
2355
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDistributedEventListenerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2356
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDistributedEventListenerService, providedIn: 'root' }); }
1950
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDistributedEventListenerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1951
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDistributedEventListenerService, providedIn: 'root' }); }
2357
1952
  }
2358
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDistributedEventListenerService, decorators: [{
1953
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDistributedEventListenerService, decorators: [{
2359
1954
  type: Injectable,
2360
1955
  args: [{
2361
1956
  providedIn: 'root',
2362
1957
  }]
2363
1958
  }] });
2364
1959
 
1960
+ //#endregion
1961
+ //#region ---- Broadcast event service ----
2365
1962
  class AXPBroadcastEventService {
2366
1963
  constructor() {
2367
1964
  this.eventSubjects = new Map();
2368
1965
  this.pendingRequests = new Map();
2369
1966
  this.multiTabEventHistory = new Set(); // Prevent duplicate processing of the same event
2370
1967
  this.instanceId = AXPDataGenerator.uuid();
1968
+ this.publishPolicies = new Map();
1969
+ this.pendingPublishes = new Map();
2371
1970
  this.channel = new BroadcastChannel('platform_global_events');
2372
1971
  // Handle incoming messages
2373
1972
  this.channel.onmessage = (event) => {
@@ -2397,14 +1996,35 @@ class AXPBroadcastEventService {
2397
1996
  };
2398
1997
  }
2399
1998
  /**
2400
- * Publish an event without expecting a response
1999
+ * Registers a publish-side debounce/throttle policy for an event type.
2000
+ * Prevents duplicate dispatches (channel + local echo) for rapid identical/grouped publishes.
2001
+ */
2002
+ setPublishPolicy(type, policy) {
2003
+ this.publishPolicies.set(type, policy);
2004
+ }
2005
+ clearPublishPolicy(type) {
2006
+ this.publishPolicies.delete(type);
2007
+ this.clearPendingForType(type);
2008
+ }
2009
+ /**
2010
+ * Publish an event without expecting a response.
2011
+ * When a {@link setPublishPolicy} exists for `type`, rapid publishes are collapsed before dispatch.
2401
2012
  */
2402
2013
  publish(type, payload) {
2403
- this.channel.postMessage({ type, payload, sourceId: this.instanceId });
2404
- // Local echo so same-tab listeners receive the event as well
2405
- if (this.eventSubjects.has(type)) {
2406
- this.eventSubjects.get(type).next({ data: payload });
2014
+ const policy = this.publishPolicies.get(type);
2015
+ if (!policy) {
2016
+ this.dispatchPublish(type, payload);
2017
+ return;
2018
+ }
2019
+ const bucketKey = policy.key?.(payload) ?? '';
2020
+ const pendingKey = `${type}::${bucketKey}`;
2021
+ const strategy = policy.strategy ?? 'debounce';
2022
+ const existing = this.pendingPublishes.get(pendingKey);
2023
+ if (strategy === 'throttle') {
2024
+ this.publishThrottled(type, payload, policy, pendingKey, existing);
2025
+ return;
2407
2026
  }
2027
+ this.publishDebounced(type, payload, policy, pendingKey, existing);
2408
2028
  }
2409
2029
  /**
2410
2030
  * Subscribe to an event
@@ -2468,6 +2088,13 @@ class AXPBroadcastEventService {
2468
2088
  */
2469
2089
  ngOnDestroy() {
2470
2090
  this.channel.close();
2091
+ for (const entry of this.pendingPublishes.values()) {
2092
+ if (entry.timer) {
2093
+ clearTimeout(entry.timer);
2094
+ }
2095
+ }
2096
+ this.pendingPublishes.clear();
2097
+ this.publishPolicies.clear();
2471
2098
  // Complete all subjects
2472
2099
  this.eventSubjects.forEach((subject) => subject.complete());
2473
2100
  this.eventSubjects.clear();
@@ -2479,16 +2106,155 @@ class AXPBroadcastEventService {
2479
2106
  // Cleanup multi-tab event history
2480
2107
  this.multiTabEventHistory.clear();
2481
2108
  }
2482
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBroadcastEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2483
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBroadcastEventService, providedIn: 'root' }); }
2109
+ //#region ---- Publish coalesce helpers ----
2110
+ dispatchPublish(type, payload) {
2111
+ this.channel.postMessage({ type, payload, sourceId: this.instanceId });
2112
+ // Local echo so same-tab listeners receive the event as well
2113
+ if (this.eventSubjects.has(type)) {
2114
+ this.eventSubjects.get(type).next({ data: payload });
2115
+ }
2116
+ }
2117
+ publishDebounced(type, payload, policy, pendingKey, existing) {
2118
+ const merged = existing ? (policy.merge?.(existing.payload, payload) ?? payload) : payload;
2119
+ if (existing?.timer) {
2120
+ clearTimeout(existing.timer);
2121
+ }
2122
+ const entry = { payload: merged };
2123
+ entry.timer = setTimeout(() => {
2124
+ this.pendingPublishes.delete(pendingKey);
2125
+ this.dispatchPublish(type, entry.payload);
2126
+ }, policy.windowMs);
2127
+ this.pendingPublishes.set(pendingKey, entry);
2128
+ }
2129
+ publishThrottled(type, payload, policy, pendingKey, existing) {
2130
+ // Leading edge: first publish in the window dispatches immediately.
2131
+ if (!existing) {
2132
+ this.dispatchPublish(type, payload);
2133
+ const entry = { payload: undefined, throttled: true };
2134
+ entry.timer = setTimeout(() => {
2135
+ const pending = this.pendingPublishes.get(pendingKey);
2136
+ this.pendingPublishes.delete(pendingKey);
2137
+ // Trailing flush if anything arrived during the window after the lead.
2138
+ if (pending && pending.payload !== undefined) {
2139
+ this.dispatchPublish(type, pending.payload);
2140
+ }
2141
+ }, policy.windowMs);
2142
+ this.pendingPublishes.set(pendingKey, entry);
2143
+ return;
2144
+ }
2145
+ // Within window: merge into trailing slot (dispatched when window ends, if any).
2146
+ existing.payload = policy.merge?.(existing.payload, payload) ?? payload;
2147
+ this.pendingPublishes.set(pendingKey, existing);
2148
+ }
2149
+ clearPendingForType(type) {
2150
+ const prefix = `${type}::`;
2151
+ for (const [key, entry] of this.pendingPublishes.entries()) {
2152
+ if (key === type || key.startsWith(prefix)) {
2153
+ if (entry.timer) {
2154
+ clearTimeout(entry.timer);
2155
+ }
2156
+ this.pendingPublishes.delete(key);
2157
+ }
2158
+ }
2159
+ }
2160
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBroadcastEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2161
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBroadcastEventService, providedIn: 'root' }); }
2484
2162
  }
2485
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPBroadcastEventService, decorators: [{
2163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBroadcastEventService, decorators: [{
2486
2164
  type: Injectable,
2487
2165
  args: [{
2488
2166
  providedIn: 'root',
2489
2167
  }]
2490
2168
  }], ctorParameters: () => [] });
2491
2169
 
2170
+ //#region ---- Constants ----
2171
+ const DEFAULT_LAYOUT_REFRESH_COALESCE_MS = 200;
2172
+ //#endregion
2173
+ //#region ---- Refresh meta merge ----
2174
+ function mergeRefreshMeta(existing, incoming) {
2175
+ if (!existing && !incoming) {
2176
+ return undefined;
2177
+ }
2178
+ const merged = { ...existing, ...incoming };
2179
+ if (existing?.resetPagination || incoming?.resetPagination) {
2180
+ merged.resetPagination = true;
2181
+ }
2182
+ const highlight = incoming?.highlightRowId ?? existing?.highlightRowId;
2183
+ if (highlight) {
2184
+ merged.highlightRowId = highlight;
2185
+ }
2186
+ else {
2187
+ delete merged.highlightRowId;
2188
+ }
2189
+ return Object.keys(merged).length > 0 ? merged : undefined;
2190
+ }
2191
+ function mergeLayoutRefreshPayload(previous, incoming) {
2192
+ if (!previous) {
2193
+ return incoming;
2194
+ }
2195
+ if (!incoming) {
2196
+ return previous;
2197
+ }
2198
+ const meta = mergeRefreshMeta(previous.meta, incoming.meta);
2199
+ return meta !== undefined ? { name: incoming.name, meta } : { name: incoming.name };
2200
+ }
2201
+ //#endregion
2202
+ //#region ---- Entity broadcast service ----
2203
+ /**
2204
+ * Typed publish/listen helpers for entity UI events over {@link AXPBroadcastEventService}.
2205
+ * Layout refresh publishes are debounced per entity name on the broadcast service
2206
+ * so local + realtime echoes collapse before dispatch.
2207
+ */
2208
+ class AXPEntityBroadcastService {
2209
+ constructor() {
2210
+ this.broadcast = inject(AXPBroadcastEventService);
2211
+ this.broadcast.setPublishPolicy(AXPEntityEventsKeys.REFRESH_LAYOUT, {
2212
+ windowMs: DEFAULT_LAYOUT_REFRESH_COALESCE_MS,
2213
+ strategy: 'debounce',
2214
+ key: (payload) => payload?.name?.trim() || '',
2215
+ merge: mergeLayoutRefreshPayload,
2216
+ });
2217
+ }
2218
+ publishLayoutRefresh(name, meta) {
2219
+ const payload = meta !== undefined ? { name, meta } : { name };
2220
+ this.broadcast.publish(AXPEntityEventsKeys.REFRESH_LAYOUT, payload);
2221
+ }
2222
+ publishDataReload(name, meta) {
2223
+ const payload = meta !== undefined ? { name, meta } : { name };
2224
+ this.broadcast.publish(AXPEntityEventsKeys.REFRESH_DATA, payload);
2225
+ }
2226
+ publishCreated(payload) {
2227
+ this.broadcast.publish(AXPEntityEventsKeys.CREATED, payload);
2228
+ }
2229
+ publishDeleted(payload) {
2230
+ this.broadcast.publish(AXPEntityEventsKeys.DELETED, payload);
2231
+ }
2232
+ publishModified(payload) {
2233
+ this.broadcast.publish(AXPEntityEventsKeys.MODIFIED, payload);
2234
+ }
2235
+ listenLayoutRefresh() {
2236
+ return this.broadcast.listen(AXPEntityEventsKeys.REFRESH_LAYOUT);
2237
+ }
2238
+ listenDataReload() {
2239
+ return this.broadcast.listen(AXPEntityEventsKeys.REFRESH_DATA);
2240
+ }
2241
+ listenCreated() {
2242
+ return this.broadcast.listen(AXPEntityEventsKeys.CREATED);
2243
+ }
2244
+ listenDeleted() {
2245
+ return this.broadcast.listen(AXPEntityEventsKeys.DELETED);
2246
+ }
2247
+ listenModified() {
2248
+ return this.broadcast.listen(AXPEntityEventsKeys.MODIFIED);
2249
+ }
2250
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityBroadcastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2251
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityBroadcastService, providedIn: 'root' }); }
2252
+ }
2253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityBroadcastService, decorators: [{
2254
+ type: Injectable,
2255
+ args: [{ providedIn: 'root' }]
2256
+ }], ctorParameters: () => [] });
2257
+
2492
2258
  class AXPHookService {
2493
2259
  constructor() {
2494
2260
  this.listenerProviders = inject(AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, { optional: true }) || [];
@@ -2535,10 +2301,10 @@ class AXPHookService {
2535
2301
  }
2536
2302
  return data;
2537
2303
  }
2538
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPHookService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2539
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPHookService, providedIn: 'root' }); }
2304
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPHookService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2305
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPHookService, providedIn: 'root' }); }
2540
2306
  }
2541
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPHookService, decorators: [{
2307
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPHookService, decorators: [{
2542
2308
  type: Injectable,
2543
2309
  args: [{ providedIn: 'root' }]
2544
2310
  }] });
@@ -3040,7 +2806,8 @@ class AXPKeyboardShortcutRegistry {
3040
2806
  this.activeProfile = toSignal(this.localeService.profileChanged$, {
3041
2807
  initialValue: this.localeService.activeProfile(),
3042
2808
  });
3043
- this.registrations = signal([], ...(ngDevMode ? [{ debugName: "registrations" }] : /* istanbul ignore next */ []));
2809
+ this.registrations = signal([], /* @ts-ignore */
2810
+ ...(ngDevMode ? [{ debugName: "registrations" }] : /* istanbul ignore next */ []));
3044
2811
  this.helpDialogHandler = null;
3045
2812
  this.listenerAttached = false;
3046
2813
  //#endregion
@@ -3049,7 +2816,8 @@ class AXPKeyboardShortcutRegistry {
3049
2816
  this.helpEntries = computed(() => {
3050
2817
  this.activeProfile();
3051
2818
  return this.buildHelpEntries();
3052
- }, ...(ngDevMode ? [{ debugName: "helpEntries" }] : /* istanbul ignore next */ []));
2819
+ }, /* @ts-ignore */
2820
+ ...(ngDevMode ? [{ debugName: "helpEntries" }] : /* istanbul ignore next */ []));
3053
2821
  this.onDocumentKeyDown = (event) => {
3054
2822
  if (event.key === 'Escape' && shouldDeferEscapeToOpenOverlay(this.document)) {
3055
2823
  return;
@@ -3231,10 +2999,10 @@ class AXPKeyboardShortcutRegistry {
3231
2999
  }
3232
3000
  return entries.sort((a, b) => b.priority - a.priority || a.bindingTitle.localeCompare(b.bindingTitle));
3233
3001
  }
3234
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKeyboardShortcutRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3235
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKeyboardShortcutRegistry, providedIn: 'root' }); }
3002
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPKeyboardShortcutRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3003
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPKeyboardShortcutRegistry, providedIn: 'root' }); }
3236
3004
  }
3237
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPKeyboardShortcutRegistry, decorators: [{
3005
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPKeyboardShortcutRegistry, decorators: [{
3238
3006
  type: Injectable,
3239
3007
  args: [{
3240
3008
  providedIn: 'root',
@@ -3524,7 +3292,8 @@ class AXPLogoRegistryService {
3524
3292
  constructor() {
3525
3293
  this.providers = new Map();
3526
3294
  this.componentCache = new Map();
3527
- this.revision = signal(0, ...(ngDevMode ? [{ debugName: "revision" }] : /* istanbul ignore next */ []));
3295
+ this.revision = signal(0, /* @ts-ignore */
3296
+ ...(ngDevMode ? [{ debugName: "revision" }] : /* istanbul ignore next */ []));
3528
3297
  /** Bumps when a provider is registered or replaced. */
3529
3298
  this.registryRevision = this.revision.asReadonly();
3530
3299
  const injected = inject(AXP_LOGO_PROVIDER, { optional: true }) ?? [];
@@ -3562,10 +3331,10 @@ class AXPLogoRegistryService {
3562
3331
  inputs: view.inputs,
3563
3332
  };
3564
3333
  }
3565
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLogoRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3566
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLogoRegistryService, providedIn: 'root' }); }
3334
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLogoRegistryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3335
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLogoRegistryService, providedIn: 'root' }); }
3567
3336
  }
3568
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLogoRegistryService, decorators: [{
3337
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLogoRegistryService, decorators: [{
3569
3338
  type: Injectable,
3570
3339
  args: [{ providedIn: 'root' }]
3571
3340
  }], ctorParameters: () => [] });
@@ -3607,10 +3376,10 @@ class AXPEntityLogoRegistrationService {
3607
3376
  }
3608
3377
  return { kind: 'icon', icon: 'fa-solid fa-building', color: 'neutral-400' };
3609
3378
  }
3610
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEntityLogoRegistrationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3611
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEntityLogoRegistrationService, providedIn: 'root' }); }
3379
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityLogoRegistrationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3380
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityLogoRegistrationService, providedIn: 'root' }); }
3612
3381
  }
3613
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEntityLogoRegistrationService, decorators: [{
3382
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityLogoRegistrationService, decorators: [{
3614
3383
  type: Injectable,
3615
3384
  args: [{ providedIn: 'root' }]
3616
3385
  }] });
@@ -3634,42 +3403,54 @@ const AXP_LOGO_IMAGE_SRC_RESOLVER = new InjectionToken('AXP_LOGO_IMAGE_SRC_RESOL
3634
3403
  //#region ---- Unified logo component ----
3635
3404
  class AXPLogoComponent {
3636
3405
  constructor() {
3637
- this.logoKey = input.required(...(ngDevMode ? [{ debugName: "logoKey" }] : /* istanbul ignore next */ []));
3638
- this.appearance = input('auto', ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
3639
- this.size = input(20, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3640
- this.format = input('mark', ...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
3406
+ this.logoKey = input.required(/* @ts-ignore */
3407
+ ...(ngDevMode ? [{ debugName: "logoKey" }] : /* istanbul ignore next */ []));
3408
+ this.appearance = input('auto', /* @ts-ignore */
3409
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
3410
+ this.size = input(20, /* @ts-ignore */
3411
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
3412
+ this.format = input('mark', /* @ts-ignore */
3413
+ ...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
3641
3414
  this.registry = inject(AXPLogoRegistryService);
3642
3415
  this.imageSrcResolver = inject(AXP_LOGO_IMAGE_SRC_RESOLVER, { optional: true });
3643
3416
  this.themeResolver = inject(AXP_LOGO_THEME_RESOLVER, { optional: true });
3644
- this.resolvedView = signal(null, ...(ngDevMode ? [{ debugName: "resolvedView" }] : /* istanbul ignore next */ []));
3417
+ this.resolvedView = signal(null, /* @ts-ignore */
3418
+ ...(ngDevMode ? [{ debugName: "resolvedView" }] : /* istanbul ignore next */ []));
3645
3419
  this.blobObjectUrl = null;
3646
3420
  this.resolveGeneration = 0;
3647
- this.resolvedAppearance = computed(() => this.normalizeAppearance(this.appearance()), ...(ngDevMode ? [{ debugName: "resolvedAppearance" }] : /* istanbul ignore next */ []));
3421
+ this.resolvedAppearance = computed(() => this.normalizeAppearance(this.appearance()), /* @ts-ignore */
3422
+ ...(ngDevMode ? [{ debugName: "resolvedAppearance" }] : /* istanbul ignore next */ []));
3648
3423
  this.request = computed(() => ({
3649
3424
  appearance: this.resolvedAppearance(),
3650
3425
  size: this.size(),
3651
3426
  format: this.format(),
3652
- }), ...(ngDevMode ? [{ debugName: "request" }] : /* istanbul ignore next */ []));
3427
+ }), /* @ts-ignore */
3428
+ ...(ngDevMode ? [{ debugName: "request" }] : /* istanbul ignore next */ []));
3653
3429
  this.imageView = computed(() => {
3654
3430
  const view = this.resolvedView();
3655
3431
  return view?.kind === 'image' ? view : null;
3656
- }, ...(ngDevMode ? [{ debugName: "imageView" }] : /* istanbul ignore next */ []));
3432
+ }, /* @ts-ignore */
3433
+ ...(ngDevMode ? [{ debugName: "imageView" }] : /* istanbul ignore next */ []));
3657
3434
  this.componentView = computed(() => {
3658
3435
  const view = this.resolvedView();
3659
3436
  return view?.kind === 'component' ? view : null;
3660
- }, ...(ngDevMode ? [{ debugName: "componentView" }] : /* istanbul ignore next */ []));
3437
+ }, /* @ts-ignore */
3438
+ ...(ngDevMode ? [{ debugName: "componentView" }] : /* istanbul ignore next */ []));
3661
3439
  this.iconView = computed(() => {
3662
3440
  const view = this.resolvedView();
3663
3441
  return view?.kind === 'icon' ? view : null;
3664
- }, ...(ngDevMode ? [{ debugName: "iconView" }] : /* istanbul ignore next */ []));
3442
+ }, /* @ts-ignore */
3443
+ ...(ngDevMode ? [{ debugName: "iconView" }] : /* istanbul ignore next */ []));
3665
3444
  this.imageWidth = computed(() => {
3666
3445
  const view = this.resolvedView();
3667
3446
  return view?.kind === 'image' ? (view.width ?? this.size()) : this.size();
3668
- }, ...(ngDevMode ? [{ debugName: "imageWidth" }] : /* istanbul ignore next */ []));
3447
+ }, /* @ts-ignore */
3448
+ ...(ngDevMode ? [{ debugName: "imageWidth" }] : /* istanbul ignore next */ []));
3669
3449
  this.imageHeight = computed(() => {
3670
3450
  const view = this.resolvedView();
3671
3451
  return view?.kind === 'image' ? (view.height ?? this.size()) : this.size();
3672
- }, ...(ngDevMode ? [{ debugName: "imageHeight" }] : /* istanbul ignore next */ []));
3452
+ }, /* @ts-ignore */
3453
+ ...(ngDevMode ? [{ debugName: "imageHeight" }] : /* istanbul ignore next */ []));
3673
3454
  this.componentInputs = computed(() => {
3674
3455
  const view = this.resolvedView();
3675
3456
  if (view?.kind !== 'component') {
@@ -3680,7 +3461,8 @@ class AXPLogoComponent {
3680
3461
  size: this.size(),
3681
3462
  ...view.inputs,
3682
3463
  };
3683
- }, ...(ngDevMode ? [{ debugName: "componentInputs" }] : /* istanbul ignore next */ []));
3464
+ }, /* @ts-ignore */
3465
+ ...(ngDevMode ? [{ debugName: "componentInputs" }] : /* istanbul ignore next */ []));
3684
3466
  effect((onCleanup) => {
3685
3467
  this.registry.registryRevision();
3686
3468
  const key = this.logoKey();
@@ -3742,14 +3524,14 @@ class AXPLogoComponent {
3742
3524
  }
3743
3525
  return this.themeResolver?.isDarkMode() ? 'dark' : 'light';
3744
3526
  }
3745
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3746
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPLogoComponent, isStandalone: true, selector: "axp-logo", inputs: { logoKey: { classPropertyName: "logoKey", publicName: "logoKey", isSignal: true, isRequired: true, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex items-center justify-center shrink-0" }, ngImport: i0, template: "@switch (resolvedView()?.kind) {\n @case ('image') {\n @if (imageView(); as view) {\n <ax-image [width]=\"imageWidth()\" [height]=\"imageHeight()\" [src]=\"view.src\"></ax-image>\n }\n }\n @case ('component') {\n @if (componentView(); as view) {\n <ng-container *ngComponentOutlet=\"view.component; inputs: componentInputs()\"></ng-container>\n }\n }\n @case ('icon') {\n @if (iconView(); as view) {\n <ax-icon><i [class]=\"view.icon\" [style.color]=\"view.color\"></i></ax-icon>\n }\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3527
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3528
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLogoComponent, isStandalone: true, selector: "axp-logo", inputs: { logoKey: { classPropertyName: "logoKey", publicName: "logoKey", isSignal: true, isRequired: true, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "inline-flex items-center justify-center shrink-0" }, ngImport: i0, template: "@switch (resolvedView()?.kind) {\n @case ('image') {\n @if (imageView(); as view) {\n <ax-image [width]=\"imageWidth()\" [height]=\"imageHeight()\" [src]=\"view.src\"></ax-image>\n }\n }\n @case ('component') {\n @if (componentView(); as view) {\n <ng-container *ngComponentOutlet=\"view.component; inputs: componentInputs()\"></ng-container>\n }\n }\n @case ('icon') {\n @if (iconView(); as view) {\n <ax-icon><i [class]=\"view.icon\" [style.color]=\"view.color\"></i></ax-icon>\n }\n }\n}\n", styles: [":host ax-image img{object-fit:contain;image-rendering:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2.AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3747
3529
  }
3748
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLogoComponent, decorators: [{
3530
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLogoComponent, decorators: [{
3749
3531
  type: Component,
3750
3532
  args: [{ selector: 'axp-logo', imports: [CommonModule, AXImageModule, AXDecoratorModule], host: {
3751
3533
  class: 'inline-flex items-center justify-center shrink-0',
3752
- }, changeDetection: ChangeDetectionStrategy.OnPush, template: "@switch (resolvedView()?.kind) {\n @case ('image') {\n @if (imageView(); as view) {\n <ax-image [width]=\"imageWidth()\" [height]=\"imageHeight()\" [src]=\"view.src\"></ax-image>\n }\n }\n @case ('component') {\n @if (componentView(); as view) {\n <ng-container *ngComponentOutlet=\"view.component; inputs: componentInputs()\"></ng-container>\n }\n }\n @case ('icon') {\n @if (iconView(); as view) {\n <ax-icon><i [class]=\"view.icon\" [style.color]=\"view.color\"></i></ax-icon>\n }\n }\n}\n" }]
3534
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "@switch (resolvedView()?.kind) {\n @case ('image') {\n @if (imageView(); as view) {\n <ax-image [width]=\"imageWidth()\" [height]=\"imageHeight()\" [src]=\"view.src\"></ax-image>\n }\n }\n @case ('component') {\n @if (componentView(); as view) {\n <ng-container *ngComponentOutlet=\"view.component; inputs: componentInputs()\"></ng-container>\n }\n }\n @case ('icon') {\n @if (iconView(); as view) {\n <ax-icon><i [class]=\"view.icon\" [style.color]=\"view.color\"></i></ax-icon>\n }\n }\n}\n", styles: [":host ax-image img{object-fit:contain;image-rendering:auto}\n"] }]
3753
3535
  }], ctorParameters: () => [], propDecorators: { logoKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "logoKey", required: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }] } });
3754
3536
 
3755
3537
  /** Global overlay flag + task count ({@link AXPLayoutThemeService}). */
@@ -3761,7 +3543,63 @@ const OVERLAY_DETAILS_VIEW_TRACE_NS = 'OVERLAY-DETAILS-VIEW';
3761
3543
  /** Widget tree mount / settle polling ({@link AXPWidgetContainerComponent}). */
3762
3544
  const OVERLAY_WIDGET_SETTLE_TRACE_NS = 'OVERLAY-WIDGET-SETTLE';
3763
3545
 
3764
- //#region ---- Imports ----
3546
+ //#region ----- Imports -----
3547
+ //#endregion
3548
+
3549
+ //#region ----- Types -----
3550
+ /**
3551
+ * Packaging kind for edition modules checklist (view mode: By Type).
3552
+ */
3553
+ const AXP_MODULE_TYPE = {
3554
+ platform: 'platform',
3555
+ domain: 'domain',
3556
+ integration: 'integration',
3557
+ };
3558
+ /**
3559
+ * Business-area domain for edition modules checklist (view mode: By Domain).
3560
+ * Aligns with integration domain ids where applicable.
3561
+ */
3562
+ const AXP_MODULE_DOMAIN = {
3563
+ platform: 'platform',
3564
+ humanCapital: 'human-capital',
3565
+ projectManagement: 'project-management',
3566
+ assetMaintenance: 'asset-maintenance',
3567
+ workplaceSafety: 'workplace-safety',
3568
+ assessmentLearning: 'assessment-learning',
3569
+ financeCommerce: 'finance-commerce',
3570
+ customerSupplier: 'customer-supplier',
3571
+ communication: 'communication',
3572
+ ai: 'ai',
3573
+ contentDocuments: 'content-documents',
3574
+ data: 'data',
3575
+ operations: 'operations',
3576
+ weather: 'weather',
3577
+ sourceControl: 'source-control',
3578
+ general: 'general',
3579
+ };
3580
+ //#endregion
3581
+ //#region ----- Resolvers -----
3582
+ /**
3583
+ * Resolves module packaging type with fallbacks when unset on the manifest.
3584
+ */
3585
+ function resolveModuleType(manifest) {
3586
+ if (manifest.type) {
3587
+ return manifest.type;
3588
+ }
3589
+ if (manifest.required) {
3590
+ return AXP_MODULE_TYPE.platform;
3591
+ }
3592
+ if (manifest.name.endsWith('Extension')) {
3593
+ return AXP_MODULE_TYPE.integration;
3594
+ }
3595
+ return AXP_MODULE_TYPE.domain;
3596
+ }
3597
+ /**
3598
+ * Resolves module business domain with fallback when unset on the manifest.
3599
+ */
3600
+ function resolveModuleDomain(manifest) {
3601
+ return manifest.domain || AXP_MODULE_DOMAIN.general;
3602
+ }
3765
3603
  //#endregion
3766
3604
 
3767
3605
  //#region ---- Provider Interfaces ----
@@ -4036,97 +3874,99 @@ class AXPModuleManifestRegistry {
4036
3874
  }
4037
3875
  return { missingModules, missingFeatures };
4038
3876
  }
4039
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPModuleManifestRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4040
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPModuleManifestRegistry, providedIn: 'root' }); }
3877
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3878
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestRegistry, providedIn: 'root' }); }
4041
3879
  }
4042
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
3880
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
4043
3881
  type: Injectable,
4044
3882
  args: [{ providedIn: 'root' }]
4045
3883
  }] });
4046
3884
 
4047
- //#region ---- Imports ----
4048
3885
  //#endregion
4049
- //#region ---- Module manifests data source ----
3886
+ //#region ----- Tokens -----
4050
3887
  /**
4051
- * Data source definition for module names/titles from {@link AXPModuleManifestRegistry}.
3888
+ * Multi provider for declarative app-startup tasks.
3889
+ * Collected once by {@link AXPAppStartUpProvider} — do not use APP_INITIALIZER in features.
4052
3890
  */
4053
- class AXPModuleManifestsDataSourceDefinition {
4054
- constructor() {
4055
- //#region ---- Services & Dependencies ----
4056
- this.manifestRegistry = inject(AXPModuleManifestRegistry);
4057
- //#endregion
4058
- }
4059
- //#endregion
4060
- //#region ---- Public API ----
4061
- async items() {
4062
- return [
4063
- {
4064
- name: AXPPlatformCoreDataSourceKeys.ModuleManifests,
4065
- title: 'Module manifests',
4066
- source: () => new AXDataSource({
4067
- key: 'id',
4068
- load: async () => {
4069
- await this.manifestRegistry.initialize();
4070
- const list = this.manifestRegistry.getAll().map((m) => ({
4071
- id: m.name,
4072
- title: m.title || m.name,
4073
- }));
4074
- return { items: list, total: list.length };
4075
- },
4076
- byKey: async (key) => {
4077
- await this.manifestRegistry.initialize();
4078
- const m = this.manifestRegistry.getAll().find((x) => x.name === key);
4079
- return m ? { id: m.name, title: m.title || m.name } : undefined;
4080
- },
4081
- pageSize: 1000,
4082
- }),
4083
- columns: [
4084
- {
4085
- name: 'id',
4086
- title: 'ID',
4087
- datatype: 'string',
4088
- type: 'text-editor',
4089
- },
4090
- {
4091
- name: 'title',
4092
- title: 'Title',
4093
- datatype: 'string',
4094
- type: 'text-editor',
4095
- },
4096
- ],
4097
- filters: [
4098
- {
4099
- field: 'title',
4100
- title: 'Title',
4101
- operator: { type: 'equal' },
4102
- widget: { type: 'text-editor' },
4103
- filterType: { advance: true, inline: true },
4104
- },
4105
- ],
4106
- textField: { name: 'title', title: 'Title' },
4107
- valueField: { name: 'id', title: 'ID' },
4108
- },
4109
- ];
4110
- }
3891
+ /** Multi token — `inject()` yields the full task array (each provider contributes one task). */
3892
+ const AXP_APP_STARTUP_TASK = new InjectionToken('AXP_APP_STARTUP_TASK');
3893
+ //#endregion
3894
+ //#region ----- Priorities -----
3895
+ /** Suggested priority bands for client startup tasks (lower runs first). */
3896
+ const AXP_APP_STARTUP_PRIORITY = {
3897
+ sessionRestore: 0,
3898
+ moduleManifests: 1,
3899
+ /** Platform-scoped settings (no auth); runs before tenant/user settings load. */
3900
+ platformSettings: 2,
3901
+ settings: 3,
3902
+ idleLockRestore: 3,
3903
+ /** After settings: redirect when platform settings bootstrap failed. */
3904
+ platformSettingsFailureRedirect: 3.5,
3905
+ conversationSessionSync: 4,
3906
+ regionalSettings: 5,
3907
+ terms: 6,
3908
+ /** Topic handlers / bridges that must exist before the socket connects. */
3909
+ realtimeHandlers: 40,
3910
+ /** Long-lived subscriptions that listen to connection/bus streams. */
3911
+ realtimeSubscriptions: 45,
3912
+ realtimeConnect: 50,
3913
+ activityInsight: 80,
3914
+ layoutTheme: 100,
3915
+ };
3916
+ //#endregion
3917
+ //#region ----- Helpers -----
3918
+ /** Register one startup task via the multi token (preferred over APP_INITIALIZER). */
3919
+ function provideAppStartUpTask(factory) {
3920
+ return {
3921
+ provide: AXP_APP_STARTUP_TASK,
3922
+ multi: true,
3923
+ useFactory: factory,
3924
+ };
4111
3925
  }
4112
3926
  //#endregion
4113
3927
 
3928
+ /** Task that must still run after {@link AXPAppStartUpService.abortRemainingStartupTasks}. */
3929
+ const PLATFORM_SETTINGS_FAILURE_REDIRECT_TASK = 'platform-settings-failure-redirect';
4114
3930
  class AXPAppStartUpService {
4115
3931
  constructor() {
4116
3932
  this.translationService = inject(AXTranslationService);
4117
3933
  this.tasks = [];
3934
+ /** When true, only {@link PLATFORM_SETTINGS_FAILURE_REDIRECT_TASK} may still run. */
3935
+ this.bootstrapAborted = false;
4118
3936
  }
4119
- //#endregion
4120
- //#region ---- Public Methods ----
3937
+ //#region ----- Public Methods -----
4121
3938
  registerTask(task) {
4122
3939
  this.tasks.push(task);
4123
3940
  }
3941
+ /**
3942
+ * Abort remaining startup work after a fatal platform-settings failure.
3943
+ * Keeps {@link PLATFORM_SETTINGS_FAILURE_REDIRECT_TASK} so unavailable navigation can run.
3944
+ * Prevents later tasks (settings / regional / theme) from hanging APP_INITIALIZER on API calls.
3945
+ */
3946
+ abortRemainingStartupTasks() {
3947
+ this.bootstrapAborted = true;
3948
+ }
3949
+ /**
3950
+ * @deprecated Prefer {@link abortRemainingStartupTasks}.
3951
+ * Skip tasks with priority greater than {@link priority}.
3952
+ */
3953
+ skipTasksAfter(priority) {
3954
+ void priority;
3955
+ this.abortRemainingStartupTasks();
3956
+ }
4124
3957
  async runAllTasks() {
4125
3958
  for (const task of this.tasks.sort((a, b) => a.priority - b.priority)) {
4126
- await this.updateStatus(task.statusText);
3959
+ if (this.bootstrapAborted && task.name !== PLATFORM_SETTINGS_FAILURE_REDIRECT_TASK) {
3960
+ continue;
3961
+ }
3962
+ if (task.statusText != null) {
3963
+ await this.updateStatus(task.statusText);
3964
+ }
4127
3965
  await task.run();
4128
3966
  }
4129
3967
  }
3968
+ //#endregion
3969
+ //#region ----- Private -----
4130
3970
  async updateStatus(status) {
4131
3971
  const loadingText = document.querySelector('#loadingText');
4132
3972
  if (loadingText) {
@@ -4134,10 +3974,10 @@ class AXPAppStartUpService {
4134
3974
  loadingText.innerHTML = await this.translationService.translateAsync(translatedStatus);
4135
3975
  }
4136
3976
  }
4137
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPAppStartUpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4138
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPAppStartUpService, providedIn: 'root' }); }
3977
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppStartUpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3978
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppStartUpService, providedIn: 'root' }); }
4139
3979
  }
4140
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPAppStartUpService, decorators: [{
3980
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppStartUpService, decorators: [{
4141
3981
  type: Injectable,
4142
3982
  args: [{
4143
3983
  providedIn: 'root',
@@ -4146,8 +3986,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4146
3986
  function initAppFactory(appInitService) {
4147
3987
  return () => appInitService.runAllTasks();
4148
3988
  }
3989
+ /**
3990
+ * Sole Angular APP_INITIALIZER for platform bootstrap.
3991
+ * Collects {@link AXP_APP_STARTUP_TASK} providers, then runs all registered tasks.
3992
+ */
4149
3993
  const AXPAppStartUpProvider = provideAppInitializer(() => {
4150
- const initializerFn = initAppFactory(inject(AXPAppStartUpService));
3994
+ const appInitService = inject(AXPAppStartUpService);
3995
+ const providedTasks = inject(AXP_APP_STARTUP_TASK, { optional: true }) ?? [];
3996
+ for (const task of providedTasks) {
3997
+ appInitService.registerTask(task);
3998
+ }
3999
+ const initializerFn = initAppFactory(appInitService);
4151
4000
  return initializerFn();
4152
4001
  });
4153
4002
 
@@ -4169,17 +4018,17 @@ class AXPModuleManifestModule {
4169
4018
  appInitService.registerTask({
4170
4019
  name: 'ModuleManifests',
4171
4020
  statusText: '@general:app-startup.loading-module-manifests',
4172
- priority: 1, // Load early, before features/permissions
4021
+ priority: AXP_APP_STARTUP_PRIORITY.moduleManifests,
4173
4022
  run: async () => {
4174
4023
  await manifestRegistry.initialize();
4175
4024
  },
4176
4025
  });
4177
4026
  }
4178
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPModuleManifestModule, deps: [{ token: AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
4179
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXPModuleManifestModule }); }
4180
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPModuleManifestModule }); }
4027
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestModule, deps: [{ token: AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
4028
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestModule }); }
4029
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestModule }); }
4181
4030
  }
4182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPModuleManifestModule, decorators: [{
4031
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestModule, decorators: [{
4183
4032
  type: NgModule,
4184
4033
  args: [{
4185
4034
  providers: [],
@@ -4200,7 +4049,8 @@ const DEFAULT_MIN_IDLE_MS = 16;
4200
4049
  class AXPIdleSchedulerService {
4201
4050
  constructor() {
4202
4051
  //#region ---- State ----
4203
- this.pausedState = signal(false, ...(ngDevMode ? [{ debugName: "pausedState" }] : /* istanbul ignore next */ []));
4052
+ this.pausedState = signal(false, /* @ts-ignore */
4053
+ ...(ngDevMode ? [{ debugName: "pausedState" }] : /* istanbul ignore next */ []));
4204
4054
  this.paused = this.pausedState.asReadonly();
4205
4055
  this.queue = [];
4206
4056
  this.running = false;
@@ -4281,10 +4131,10 @@ class AXPIdleSchedulerService {
4281
4131
  }
4282
4132
  }
4283
4133
  }
4284
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIdleSchedulerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4285
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIdleSchedulerService, providedIn: 'root' }); }
4134
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPIdleSchedulerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4135
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPIdleSchedulerService, providedIn: 'root' }); }
4286
4136
  }
4287
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPIdleSchedulerService, decorators: [{
4137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPIdleSchedulerService, decorators: [{
4288
4138
  type: Injectable,
4289
4139
  args: [{ providedIn: 'root' }]
4290
4140
  }] });
@@ -4337,36 +4187,34 @@ class AXPTagProvider {
4337
4187
  const AXP_TAG_PROVIDER = new InjectionToken('AXP_TAG_PROVIDER');
4338
4188
  //#endregion
4339
4189
 
4340
- //#region ---- Tag Service ----
4190
+ //#region ----- Imports -----
4191
+ //#endregion
4192
+ //#region ----- Tag Service -----
4341
4193
  /**
4342
- * Service for managing tags from multiple providers
4343
- * Aggregates tags from all registered providers
4194
+ * Aggregates tags from registered providers with an in-memory catalog cache.
4195
+ * Concurrent {@link getTags} / {@link reload} share one in-flight load (no stampede).
4344
4196
  */
4345
4197
  class AXPTagService {
4346
4198
  constructor() {
4347
- //#region ---- Dependencies ----
4199
+ //#region ----- Services & Dependencies -----
4348
4200
  this.providers = inject(AXP_TAG_PROVIDER, { optional: true }) ?? [];
4349
4201
  //#endregion
4350
- //#region ---- State ----
4202
+ //#region ----- State -----
4351
4203
  this.cache = null;
4204
+ /** Shared promise while providers are loading; cleared when settled. */
4205
+ this.loadPromise = null;
4352
4206
  }
4353
4207
  //#endregion
4354
- //#region ---- Public API ----
4208
+ //#region ----- Public API -----
4355
4209
  /**
4356
- * Get all tags from all providers
4357
- * @param options Filter options
4358
- * @returns Promise of tags
4210
+ * Get all tags from all providers (memory cache after first successful load).
4359
4211
  */
4360
4212
  async getTags(options) {
4361
- if (!this.cache) {
4362
- await this.loadTags();
4363
- }
4364
- let tags = this.cache;
4365
- // Apply scope filter
4213
+ await this.ensureCatalog();
4214
+ let tags = this.cache ?? [];
4366
4215
  if (options?.scope && options.scope.length > 0) {
4367
4216
  tags = tags.filter((tag) => tag.scope && options.scope.includes(tag.scope));
4368
4217
  }
4369
- // Apply search filter
4370
4218
  if (options?.search) {
4371
4219
  const searchLower = options.search.toLowerCase();
4372
4220
  tags = tags.filter((tag) => tag.title.toLowerCase().includes(searchLower) ||
@@ -4374,11 +4222,16 @@ class AXPTagService {
4374
4222
  }
4375
4223
  return tags;
4376
4224
  }
4225
+ /** Sync snapshot of the cached catalog (empty until first successful load). */
4226
+ peekCatalog() {
4227
+ return this.cache ?? [];
4228
+ }
4229
+ /** True when the in-memory catalog has been loaded at least once. */
4230
+ isCatalogReady() {
4231
+ return this.cache != null;
4232
+ }
4377
4233
  /**
4378
- * Create a new tag using the appropriate provider
4379
- * @param tag Tag to create
4380
- * @param providerName Provider to use (defaults to first writable provider)
4381
- * @returns Created tag
4234
+ * Create a new tag using the appropriate provider.
4382
4235
  */
4383
4236
  async createTag(tag, providerName) {
4384
4237
  const provider = providerName
@@ -4388,14 +4241,11 @@ class AXPTagService {
4388
4241
  throw new Error('No writable tag provider available');
4389
4242
  }
4390
4243
  const createdTag = await provider.create(tag);
4391
- // Invalidate cache
4392
- this.cache = null;
4244
+ this.invalidateCatalog();
4393
4245
  return createdTag;
4394
4246
  }
4395
4247
  /**
4396
- * Update an existing tag
4397
- * @param tag Tag to update
4398
- * @returns Updated tag
4248
+ * Update an existing tag.
4399
4249
  */
4400
4250
  async updateTag(tag) {
4401
4251
  const provider = this.providers.find((p) => p.name === tag.scope && p.update);
@@ -4403,14 +4253,11 @@ class AXPTagService {
4403
4253
  throw new Error(`No provider found for updating tag with scope: ${tag.scope}`);
4404
4254
  }
4405
4255
  const updatedTag = await provider.update(tag);
4406
- // Invalidate cache
4407
- this.cache = null;
4256
+ this.invalidateCatalog();
4408
4257
  return updatedTag;
4409
4258
  }
4410
4259
  /**
4411
- * Delete a tag
4412
- * @param tagId Tag id to delete
4413
- * @param scope Tag scope
4260
+ * Delete a tag.
4414
4261
  */
4415
4262
  async deleteTag(tagId, scope) {
4416
4263
  const provider = this.providers.find((p) => p.name === scope && p.delete);
@@ -4418,22 +4265,33 @@ class AXPTagService {
4418
4265
  throw new Error(`No provider found for deleting tag with scope: ${scope}`);
4419
4266
  }
4420
4267
  await provider.delete(tagId);
4421
- // Invalidate cache
4422
- this.cache = null;
4268
+ this.invalidateCatalog();
4423
4269
  }
4424
4270
  /**
4425
- * Reload tags from all providers
4271
+ * Force reload tags from all providers.
4426
4272
  */
4427
4273
  async reload() {
4428
- this.cache = null;
4429
- await this.loadTags();
4274
+ this.invalidateCatalog();
4275
+ await this.ensureCatalog();
4430
4276
  }
4431
4277
  //#endregion
4432
- //#region ---- Private Methods ----
4433
- /**
4434
- * Load tags from all providers
4435
- */
4436
- async loadTags() {
4278
+ //#region ----- Private Methods -----
4279
+ invalidateCatalog() {
4280
+ this.cache = null;
4281
+ this.loadPromise = null;
4282
+ }
4283
+ async ensureCatalog() {
4284
+ if (this.cache) {
4285
+ return;
4286
+ }
4287
+ if (!this.loadPromise) {
4288
+ this.loadPromise = this.loadTagsFromProviders().finally(() => {
4289
+ this.loadPromise = null;
4290
+ });
4291
+ }
4292
+ await this.loadPromise;
4293
+ }
4294
+ async loadTagsFromProviders() {
4437
4295
  const allTags = [];
4438
4296
  for (const provider of this.providers) {
4439
4297
  try {
@@ -4444,14 +4302,13 @@ class AXPTagService {
4444
4302
  console.error(`Error loading tags from provider ${provider.name}:`, error);
4445
4303
  }
4446
4304
  }
4447
- // Remove duplicates based on title (case-insensitive)
4448
4305
  const uniqueTags = allTags.filter((tag, index, self) => index === self.findIndex((t) => t.title.toLowerCase() === tag.title.toLowerCase()));
4449
4306
  this.cache = uniqueTags;
4450
4307
  }
4451
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTagService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4452
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTagService, providedIn: 'root' }); }
4308
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTagService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4309
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTagService, providedIn: 'root' }); }
4453
4310
  }
4454
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPTagService, decorators: [{
4311
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTagService, decorators: [{
4455
4312
  type: Injectable,
4456
4313
  args: [{
4457
4314
  providedIn: 'root',
@@ -4491,7 +4348,8 @@ class AXPIconLogoConfig {
4491
4348
  class AXPCountdownPipe {
4492
4349
  constructor() {
4493
4350
  this.calendarService = inject(AXCalendarService);
4494
- this.countdownSignal = signal(this.setupTimer(), ...(ngDevMode ? [{ debugName: "countdownSignal" }] : /* istanbul ignore next */ []));
4351
+ this.countdownSignal = signal(this.setupTimer(), /* @ts-ignore */
4352
+ ...(ngDevMode ? [{ debugName: "countdownSignal" }] : /* istanbul ignore next */ []));
4495
4353
  this.targetDate = 0;
4496
4354
  this.prevValue = 0;
4497
4355
  }
@@ -4520,10 +4378,10 @@ class AXPCountdownPipe {
4520
4378
  updateTargetDate(value) {
4521
4379
  this.targetDate = new Date(value).getTime();
4522
4380
  }
4523
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPCountdownPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4524
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXPCountdownPipe, isStandalone: true, name: "countdown", pure: false }); }
4381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCountdownPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4382
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPCountdownPipe, isStandalone: true, name: "countdown", pure: false }); }
4525
4383
  }
4526
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPCountdownPipe, decorators: [{
4384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCountdownPipe, decorators: [{
4527
4385
  type: Pipe,
4528
4386
  args: [{
4529
4387
  name: 'countdown',
@@ -4879,45 +4737,55 @@ class AXPDeviceService {
4879
4737
  /**
4880
4738
  * Current screen size (Small, Medium, Large)
4881
4739
  */
4882
- this.screenSize = signal(getScreenSize(), ...(ngDevMode ? [{ debugName: "screenSize" }] : /* istanbul ignore next */ []));
4740
+ this.screenSize = signal(getScreenSize(), /* @ts-ignore */
4741
+ ...(ngDevMode ? [{ debugName: "screenSize" }] : /* istanbul ignore next */ []));
4883
4742
  /**
4884
4743
  * Current device type (Mobile, Tablet, Desktop)
4885
4744
  */
4886
- this.deviceType = signal(getDeviceType(), ...(ngDevMode ? [{ debugName: "deviceType" }] : /* istanbul ignore next */ []));
4745
+ this.deviceType = signal(getDeviceType(), /* @ts-ignore */
4746
+ ...(ngDevMode ? [{ debugName: "deviceType" }] : /* istanbul ignore next */ []));
4887
4747
  /**
4888
4748
  * Whether the device supports touch input
4889
4749
  */
4890
- this.isTouchDevice = signal(isTouchDevice(), ...(ngDevMode ? [{ debugName: "isTouchDevice" }] : /* istanbul ignore next */ []));
4750
+ this.isTouchDevice = signal(isTouchDevice(), /* @ts-ignore */
4751
+ ...(ngDevMode ? [{ debugName: "isTouchDevice" }] : /* istanbul ignore next */ []));
4891
4752
  //#endregion
4892
4753
  //#region ---- Computed Signals ----
4893
4754
  /**
4894
4755
  * Whether the screen size is Small
4895
4756
  */
4896
- this.isSmall = computed(() => this.screenSize() === AXPScreenSize.Small, ...(ngDevMode ? [{ debugName: "isSmall" }] : /* istanbul ignore next */ []));
4757
+ this.isSmall = computed(() => this.screenSize() === AXPScreenSize.Small, /* @ts-ignore */
4758
+ ...(ngDevMode ? [{ debugName: "isSmall" }] : /* istanbul ignore next */ []));
4897
4759
  /**
4898
4760
  * Whether the screen size is Medium
4899
4761
  */
4900
- this.isMedium = computed(() => this.screenSize() === AXPScreenSize.Medium, ...(ngDevMode ? [{ debugName: "isMedium" }] : /* istanbul ignore next */ []));
4762
+ this.isMedium = computed(() => this.screenSize() === AXPScreenSize.Medium, /* @ts-ignore */
4763
+ ...(ngDevMode ? [{ debugName: "isMedium" }] : /* istanbul ignore next */ []));
4901
4764
  /**
4902
4765
  * Whether the screen size is Large
4903
4766
  */
4904
- this.isLarge = computed(() => this.screenSize() === AXPScreenSize.Large, ...(ngDevMode ? [{ debugName: "isLarge" }] : /* istanbul ignore next */ []));
4767
+ this.isLarge = computed(() => this.screenSize() === AXPScreenSize.Large, /* @ts-ignore */
4768
+ ...(ngDevMode ? [{ debugName: "isLarge" }] : /* istanbul ignore next */ []));
4905
4769
  /**
4906
4770
  * Whether the device is Mobile
4907
4771
  */
4908
- this.isMobileDevice = computed(() => this.deviceType() === AXPDeviceType.Mobile, ...(ngDevMode ? [{ debugName: "isMobileDevice" }] : /* istanbul ignore next */ []));
4772
+ this.isMobileDevice = computed(() => this.deviceType() === AXPDeviceType.Mobile, /* @ts-ignore */
4773
+ ...(ngDevMode ? [{ debugName: "isMobileDevice" }] : /* istanbul ignore next */ []));
4909
4774
  /**
4910
4775
  * Whether the device is Tablet
4911
4776
  */
4912
- this.isTabletDevice = computed(() => this.deviceType() === AXPDeviceType.Tablet, ...(ngDevMode ? [{ debugName: "isTabletDevice" }] : /* istanbul ignore next */ []));
4777
+ this.isTabletDevice = computed(() => this.deviceType() === AXPDeviceType.Tablet, /* @ts-ignore */
4778
+ ...(ngDevMode ? [{ debugName: "isTabletDevice" }] : /* istanbul ignore next */ []));
4913
4779
  /**
4914
4780
  * Whether the device is Desktop
4915
4781
  */
4916
- this.isDesktopDevice = computed(() => this.deviceType() === AXPDeviceType.Desktop, ...(ngDevMode ? [{ debugName: "isDesktopDevice" }] : /* istanbul ignore next */ []));
4782
+ this.isDesktopDevice = computed(() => this.deviceType() === AXPDeviceType.Desktop, /* @ts-ignore */
4783
+ ...(ngDevMode ? [{ debugName: "isDesktopDevice" }] : /* istanbul ignore next */ []));
4917
4784
  /**
4918
4785
  * Whether the device supports touch (alias for isTouchDevice)
4919
4786
  */
4920
- this.isTouchScreen = computed(() => this.isTouchDevice(), ...(ngDevMode ? [{ debugName: "isTouchScreen" }] : /* istanbul ignore next */ []));
4787
+ this.isTouchScreen = computed(() => this.isTouchDevice(), /* @ts-ignore */
4788
+ ...(ngDevMode ? [{ debugName: "isTouchScreen" }] : /* istanbul ignore next */ []));
4921
4789
  //#endregion
4922
4790
  //#region ---- Private Properties ----
4923
4791
  this._resizeListener = null;
@@ -4983,10 +4851,10 @@ class AXPDeviceService {
4983
4851
  destroy() {
4984
4852
  this._removeResizeListener();
4985
4853
  }
4986
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDeviceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4987
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDeviceService, providedIn: 'root' }); }
4854
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDeviceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4855
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDeviceService, providedIn: 'root' }); }
4988
4856
  }
4989
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDeviceService, decorators: [{
4857
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDeviceService, decorators: [{
4990
4858
  type: Injectable,
4991
4859
  args: [{
4992
4860
  providedIn: 'root',
@@ -5090,10 +4958,10 @@ class AXHighlightService {
5090
4958
  resultHTML += '</span>';
5091
4959
  return resultHTML;
5092
4960
  }
5093
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXHighlightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5094
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXHighlightService, providedIn: 'root' }); }
4961
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHighlightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4962
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHighlightService, providedIn: 'root' }); }
5095
4963
  }
5096
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXHighlightService, decorators: [{
4964
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHighlightService, decorators: [{
5097
4965
  type: Injectable,
5098
4966
  args: [{
5099
4967
  providedIn: 'root',
@@ -5106,15 +4974,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
5106
4974
  *
5107
4975
  * @example
5108
4976
  * ```typescript
5109
- * export class AXMAuthDataSourceProvider implements AXPDataSourceDefinitionProvider {
4977
+ * export class AXMMyFeatureProvider {
5110
4978
  * constructor(private readonly injector: Injector) {}
5111
4979
  *
5112
4980
  * async items() {
5113
- * const userActivity = instantiateWithInjectionContext(
4981
+ * const nested = instantiateWithInjectionContext(
5114
4982
  * this.injector,
5115
- * AXMUserActivityDataSourceDefinition,
4983
+ * AXMNestedProvider,
5116
4984
  * );
5117
- * return [...(await userActivity.items())];
4985
+ * return [...(await nested.items())];
5118
4986
  * }
5119
4987
  * }
5120
4988
  * ```
@@ -5160,8 +5028,8 @@ async function createProviderWithInjectionContext(injector, loader) {
5160
5028
  * ```typescript
5161
5029
  * // Multi-provider (default)
5162
5030
  * provideLazyProvider(
5163
- * AXP_DATASOURCE_DEFINITION_PROVIDER,
5164
- * () => import('./datasource.provider').then(m => m.AXMDataSourceProvider)
5031
+ * AXP_SOME_MULTI_TOKEN,
5032
+ * () => import('./feature.provider').then(m => m.AXMFeatureProvider)
5165
5033
  * )
5166
5034
  *
5167
5035
  * // Single provider
@@ -5187,5 +5055,5 @@ function provideLazyProvider(token, loader, multi = true) {
5187
5055
  * Generated bundle index. Do not edit.
5188
5056
  */
5189
5057
 
5190
- export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPCatalogScopeDefinitionProviderService, AXPCatalogScopeDefinitionsDataSourceDefinition, AXPColorPaletteProvider, AXPColorPaletteService, AXPColumnWidthService, AXPComponentLogoConfig, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPContentCheckerDirective, AXPContextDefinitionProviderService, AXPContextEvalFactory, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDataSourceQueryService, AXPDblClickDirective, AXPDebugService, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPEntityLogoRegistrationService, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPIdleSchedulerService, AXPImageUrlLogoConfig, AXPKeyboardShortcutRegistry, AXPLogoComponent, AXPLogoRegistryService, AXPModuleManifestModule, AXPModuleManifestRegistry, AXPModuleManifestsDataSourceDefinition, AXPScreenSize, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_CATALOG_SCOPE_DEFINITION_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_COLUMN_WIDTH_PROVIDER, AXP_CONTEXT_DEFINITION_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_ENTITY_LOGO_FALLBACK_RESOLVER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_LOGO_IMAGE_SRC_RESOLVER, AXP_LOGO_PROVIDER, AXP_LOGO_THEME_RESOLVER, AXP_MODULE_MANIFEST_PROVIDER, AXP_PLATFORM_LOGO_KEY, AXP_SESSION_SERVICE, AXP_SETTINGS_DEFINITION_DIALOG_OPENER, AXP_TAG_PROVIDER, AX_OVERLAY_CONTAINER_SELECTOR, AX_OVERLAY_PANE_SELECTOR, DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS, DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS, FORM_DIRTY_TRACE_NS, OVERLAY_DETAILS_VIEW_TRACE_NS, OVERLAY_LAYOUT_TRACE_NS, OVERLAY_ROOT_LAYOUT_TRACE_NS, OVERLAY_WIDGET_SETTLE_TRACE_NS, applyContextEvalPipes, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, axpApplicationLogoKey, axpExtractLogoUrl, axpSsoLogoKey, axpTenantLogoKey, chordToKbdItemKeys, contextEvalWithPipes, createProviderWithInjectionContext, defaultColumnWidthProvider, findOverlayContainerAncestor, formatKeyboardShortcutChord, formatKeyboardShortcutChords, getNestedVisibleOverlayPanes, getPrimaryKeyboardShortcutChord, getTopVisibleOverlayContainer, getVisibleAnchoredOverlayPanes, getVisibleOverlayContainers, hasForegroundOverlayLayer, instantiateWithInjectionContext, isDialogShortcutAllowedInEditableField, isHorizontalDirectionalShortcutKey, isKeyboardTargetInsideEditableField, isMacPlatform, isVisibleOverlayElement, matchesDialogActionShortcut, matchesKeyboardShortcutChord, mirrorHorizontalDirectionalKey, normalizeContextEvalPipes, normalizeDialogActionShortcutChord, normalizeExpressionTemplate, normalizeKeyboardShortcut, normalizeKeyboardShortcuts, objectKeyValueTransforms, parseDialogActionShortcut, parseKeyboardShortcutChord, provideLazyProvider, registerPopupFooterKeyboardShortcuts, resolveConfiguredFooterActionShortcuts, resolveDialogActionShortcuts, resolveDisplayShortcutChord, resolveEffectiveDirectionBehavior, resolveSemanticDirectionalKey, setupPopupFooterKeyboardShortcuts, shouldDeferEscapeToOpenOverlay, shouldTriggerDialogActionShortcut };
5058
+ export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPCatalogScopeDefinitionProviderService, AXPColorPaletteProvider, AXPColorPaletteService, AXPColumnWidthService, AXPComponentLogoConfig, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPContentCheckerDirective, AXPContextDefinitionProviderService, AXPContextEvalFactory, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDblClickDirective, AXPDebugService, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPEntityBroadcastService, AXPEntityLogoRegistrationService, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPIdleSchedulerService, AXPImageUrlLogoConfig, AXPKeyboardShortcutRegistry, AXPLogoComponent, AXPLogoRegistryService, AXPModuleManifestModule, AXPModuleManifestRegistry, AXPScreenSize, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_APP_STARTUP_PRIORITY, AXP_APP_STARTUP_TASK, AXP_CATALOG_SCOPE_DEFINITION_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_COLUMN_WIDTH_PROVIDER, AXP_CONTEXT_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_ENTITY_LOGO_FALLBACK_RESOLVER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_LOGO_IMAGE_SRC_RESOLVER, AXP_LOGO_PROVIDER, AXP_LOGO_THEME_RESOLVER, AXP_MODULE_DOMAIN, AXP_MODULE_MANIFEST_PROVIDER, AXP_MODULE_TYPE, AXP_PLATFORM_LOGO_KEY, AXP_SESSION_SERVICE, AXP_SETTINGS_DEFINITION_DIALOG_OPENER, AXP_TAG_PROVIDER, AX_OVERLAY_CONTAINER_SELECTOR, AX_OVERLAY_PANE_SELECTOR, DEFAULT_CANCEL_DIALOG_ACTION_SHORTCUTS, DEFAULT_SUBMIT_DIALOG_ACTION_SHORTCUTS, FORM_DIRTY_TRACE_NS, OVERLAY_DETAILS_VIEW_TRACE_NS, OVERLAY_LAYOUT_TRACE_NS, OVERLAY_ROOT_LAYOUT_TRACE_NS, OVERLAY_WIDGET_SETTLE_TRACE_NS, applyContextEvalPipes, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, axpApplicationLogoKey, axpExtractLogoUrl, axpSsoLogoKey, axpTenantLogoKey, chordToKbdItemKeys, contextEvalWithPipes, createProviderWithInjectionContext, defaultColumnWidthProvider, findOverlayContainerAncestor, formatKeyboardShortcutChord, formatKeyboardShortcutChords, getNestedVisibleOverlayPanes, getPrimaryKeyboardShortcutChord, getTopVisibleOverlayContainer, getVisibleAnchoredOverlayPanes, getVisibleOverlayContainers, hasForegroundOverlayLayer, instantiateWithInjectionContext, isDialogShortcutAllowedInEditableField, isHorizontalDirectionalShortcutKey, isKeyboardTargetInsideEditableField, isMacPlatform, isVisibleOverlayElement, matchesDialogActionShortcut, matchesKeyboardShortcutChord, mirrorHorizontalDirectionalKey, normalizeContextEvalPipes, normalizeDialogActionShortcutChord, normalizeExpressionTemplate, normalizeKeyboardShortcut, normalizeKeyboardShortcuts, objectKeyValueTransforms, parseDialogActionShortcut, parseKeyboardShortcutChord, provideAppStartUpTask, provideLazyProvider, registerPopupFooterKeyboardShortcuts, resolveConfiguredFooterActionShortcuts, resolveDialogActionShortcuts, resolveDisplayShortcutChord, resolveEffectiveDirectionBehavior, resolveModuleDomain, resolveModuleType, resolveSemanticDirectionalKey, setupPopupFooterKeyboardShortcuts, shouldDeferEscapeToOpenOverlay, shouldTriggerDialogActionShortcut };
5191
5059
  //# sourceMappingURL=acorex-platform-framework-client-core.mjs.map