@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.
- package/fesm2022/acorex-platform-framework-client-auth.mjs +872 -314
- package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -1
- package/fesm2022/{acorex-platform-framework-client-common-common-settings.provider-Euotv9l0.mjs → acorex-platform-framework-client-common-common-settings.provider-CLm2BVk-.mjs} +88 -5
- package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CLm2BVk-.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-common.mjs +2685 -898
- package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-core.mjs +691 -823
- package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-domain.mjs +16 -16
- package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +181 -84
- package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -1
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs +3300 -1236
- package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-designer.mjs +277 -185
- package/fesm2022/acorex-platform-framework-client-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BXOMs6oD.mjs +29184 -0
- package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-BXOMs6oD.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-framework-client-layout-entity-attachments-page.component-DCK-qb-F.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-entity-bulk-entity.command-Cs3agnpF.mjs +162 -0
- package/fesm2022/acorex-platform-framework-client-layout-entity-bulk-entity.command-Cs3agnpF.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-framework-client-layout-entity-file-list-popup.component-p0hxDb0W.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-framework-client-layout-entity-gallery-page.component-DYV9YPyw.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +2 -26780
- package/fesm2022/acorex-platform-framework-client-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs +421 -151
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +673 -287
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
- 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
- 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
- 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
- package/fesm2022/acorex-platform-framework-client-layout-widgets-image-preview.popup-BOrrMm3U.mjs.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +4907 -2554
- package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-native.mjs +7 -7
- package/fesm2022/acorex-platform-framework-client-realtime-set-presence-availability.command-CetlUjnM.mjs +29 -0
- package/fesm2022/acorex-platform-framework-client-realtime-set-presence-availability.command-CetlUjnM.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-realtime.mjs +463 -26
- package/fesm2022/acorex-platform-framework-client-realtime.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-runtime.mjs +300 -137
- package/fesm2022/acorex-platform-framework-client-runtime.mjs.map +1 -1
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-C2Abf7Lb.mjs.map +1 -0
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-platform-framework-client-themes-default-error-offline.component-CngiQycG.mjs.map +1 -0
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs +448 -277
- package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/fesm2022/acorex-platform-framework-client-themes-shared.mjs +538 -133
- package/fesm2022/acorex-platform-framework-client-themes-shared.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-workflow.mjs +26 -66
- package/fesm2022/acorex-platform-framework-client-workflow.mjs.map +1 -1
- package/package.json +10 -10
- package/realtime/README.md +16 -0
- package/runtime/README.md +14 -0
- package/types/acorex-platform-framework-client-auth.d.ts +291 -52
- package/types/acorex-platform-framework-client-common.d.ts +615 -202
- package/types/acorex-platform-framework-client-core.d.ts +215 -225
- package/types/acorex-platform-framework-client-layout-builder.d.ts +24 -8
- package/types/acorex-platform-framework-client-layout-components.d.ts +407 -94
- package/types/acorex-platform-framework-client-layout-entity.d.ts +734 -411
- package/types/acorex-platform-framework-client-layout-views.d.ts +40 -15
- package/types/acorex-platform-framework-client-layout-widget-core.d.ts +66 -17
- package/types/acorex-platform-framework-client-layout-widgets.d.ts +295 -68
- package/types/acorex-platform-framework-client-realtime.d.ts +183 -6
- package/types/acorex-platform-framework-client-runtime.d.ts +134 -28
- package/types/acorex-platform-framework-client-themes-default.d.ts +9 -1
- package/types/acorex-platform-framework-client-themes-shared.d.ts +8 -2
- package/types/acorex-platform-framework-client-workflow.d.ts +12 -37
- package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-Euotv9l0.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity-attachments-page.component-BzUM-JMC.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity-file-list-popup.component-Ci_CTFtq.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-entity-gallery-page.component-DmiB__JR.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-layout-widgets-image-preview.popup-CazpERbX.mjs.map +0 -1
- package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-CIf1VWNW.mjs.map +0 -1
- 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 {
|
|
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 {
|
|
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: "
|
|
36
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
124
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
363
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
481
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
670
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
709
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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
|
-
:
|
|
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: "
|
|
1026
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
1093
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
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
|
-
|
|
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: "
|
|
1206
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
1215
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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: "
|
|
1249
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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(
|
|
1261
|
-
|
|
1262
|
-
this.
|
|
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,
|
|
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,
|
|
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: "
|
|
1393
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
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: "
|
|
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: "
|
|
1456
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
1457
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
1509
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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,
|
|
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: "
|
|
2070
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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: "
|
|
2103
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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
|
-
},
|
|
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: "
|
|
2149
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
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: "
|
|
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: "
|
|
2209
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
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: "
|
|
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: "
|
|
2356
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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
|
-
*
|
|
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.
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
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
|
-
|
|
2483
|
-
|
|
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: "
|
|
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: "
|
|
2539
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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([],
|
|
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
|
-
},
|
|
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: "
|
|
3235
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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,
|
|
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: "
|
|
3566
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
3611
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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(
|
|
3638
|
-
|
|
3639
|
-
this.
|
|
3640
|
-
|
|
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,
|
|
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()),
|
|
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
|
-
}),
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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: "
|
|
3746
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
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: "
|
|
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
|
|
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: "
|
|
4040
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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
|
|
3886
|
+
//#region ----- Tokens -----
|
|
4050
3887
|
/**
|
|
4051
|
-
*
|
|
3888
|
+
* Multi provider for declarative app-startup tasks.
|
|
3889
|
+
* Collected once by {@link AXPAppStartUpProvider} — do not use APP_INITIALIZER in features.
|
|
4052
3890
|
*/
|
|
4053
|
-
|
|
4054
|
-
|
|
4055
|
-
|
|
4056
|
-
|
|
4057
|
-
|
|
4058
|
-
|
|
4059
|
-
|
|
4060
|
-
|
|
4061
|
-
|
|
4062
|
-
|
|
4063
|
-
|
|
4064
|
-
|
|
4065
|
-
|
|
4066
|
-
|
|
4067
|
-
|
|
4068
|
-
|
|
4069
|
-
|
|
4070
|
-
|
|
4071
|
-
|
|
4072
|
-
|
|
4073
|
-
|
|
4074
|
-
|
|
4075
|
-
|
|
4076
|
-
|
|
4077
|
-
|
|
4078
|
-
|
|
4079
|
-
|
|
4080
|
-
|
|
4081
|
-
|
|
4082
|
-
|
|
4083
|
-
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
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
|
-
//#
|
|
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
|
-
|
|
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: "
|
|
4138
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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
|
|
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:
|
|
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: "
|
|
4179
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
4180
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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,
|
|
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: "
|
|
4285
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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
|
|
4190
|
+
//#region ----- Imports -----
|
|
4191
|
+
//#endregion
|
|
4192
|
+
//#region ----- Tag Service -----
|
|
4341
4193
|
/**
|
|
4342
|
-
*
|
|
4343
|
-
*
|
|
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
|
|
4199
|
+
//#region ----- Services & Dependencies -----
|
|
4348
4200
|
this.providers = inject(AXP_TAG_PROVIDER, { optional: true }) ?? [];
|
|
4349
4201
|
//#endregion
|
|
4350
|
-
//#region
|
|
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
|
|
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
|
-
|
|
4362
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4422
|
-
this.cache = null;
|
|
4268
|
+
this.invalidateCatalog();
|
|
4423
4269
|
}
|
|
4424
4270
|
/**
|
|
4425
|
-
*
|
|
4271
|
+
* Force reload tags from all providers.
|
|
4426
4272
|
*/
|
|
4427
4273
|
async reload() {
|
|
4428
|
-
this.
|
|
4429
|
-
await this.
|
|
4274
|
+
this.invalidateCatalog();
|
|
4275
|
+
await this.ensureCatalog();
|
|
4430
4276
|
}
|
|
4431
4277
|
//#endregion
|
|
4432
|
-
//#region
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
|
|
4436
|
-
|
|
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: "
|
|
4452
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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(),
|
|
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: "
|
|
4524
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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(),
|
|
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: "
|
|
4987
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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: "
|
|
5094
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
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: "
|
|
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
|
|
4977
|
+
* export class AXMMyFeatureProvider {
|
|
5110
4978
|
* constructor(private readonly injector: Injector) {}
|
|
5111
4979
|
*
|
|
5112
4980
|
* async items() {
|
|
5113
|
-
* const
|
|
4981
|
+
* const nested = instantiateWithInjectionContext(
|
|
5114
4982
|
* this.injector,
|
|
5115
|
-
*
|
|
4983
|
+
* AXMNestedProvider,
|
|
5116
4984
|
* );
|
|
5117
|
-
* return [...(await
|
|
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
|
-
*
|
|
5164
|
-
* () => import('./
|
|
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,
|
|
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
|