@acorex-platform/framework-client 0.0.18 → 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 +2666 -693
- package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-core.mjs +685 -721
- 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 +124 -72
- 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 +2988 -857
- 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 -27090
- package/fesm2022/acorex-platform-framework-client-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs +382 -154
- package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +646 -280
- 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 +4868 -2548
- 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 +421 -265
- 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 +613 -87
- package/types/acorex-platform-framework-client-core.d.ts +213 -206
- package/types/acorex-platform-framework-client-layout-builder.d.ts +14 -8
- package/types/acorex-platform-framework-client-layout-components.d.ts +392 -28
- package/types/acorex-platform-framework-client-layout-entity.d.ts +667 -417
- package/types/acorex-platform-framework-client-layout-views.d.ts +31 -11
- package/types/acorex-platform-framework-client-layout-widget-core.d.ts +66 -17
- package/types/acorex-platform-framework-client-layout-widgets.d.ts +294 -67
- 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 +11 -35
- 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, AXPExpressionEvaluatorScopeProviderContext, ExpressionEvaluatorEngine, 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
|
}] });
|
|
@@ -1078,10 +1133,10 @@ class AXPExpressionEvaluatorScopeProviderService {
|
|
|
1078
1133
|
await this.load();
|
|
1079
1134
|
return this.cache || {};
|
|
1080
1135
|
}
|
|
1081
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1082
|
-
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' }); }
|
|
1083
1138
|
}
|
|
1084
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1139
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, decorators: [{
|
|
1085
1140
|
type: Injectable,
|
|
1086
1141
|
args: [{ providedIn: 'root' }]
|
|
1087
1142
|
}] });
|
|
@@ -1106,21 +1161,21 @@ class AXPExpressionEvaluatorService {
|
|
|
1106
1161
|
isExpression(expression) {
|
|
1107
1162
|
return this.engine.isExpression(expression);
|
|
1108
1163
|
}
|
|
1109
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1110
|
-
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' }); }
|
|
1111
1166
|
}
|
|
1112
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPExpressionEvaluatorService, decorators: [{
|
|
1113
1168
|
type: Injectable,
|
|
1114
1169
|
args: [{ providedIn: 'root' }]
|
|
1115
1170
|
}] });
|
|
1116
1171
|
|
|
1117
1172
|
class AXPComponentSlotPlaceholderComponent {
|
|
1118
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1119
|
-
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>
|
|
1120
1175
|
<ax-skeleton class="w-full h-10 rounded-md"></ax-skeleton>
|
|
1121
1176
|
</div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1122
1177
|
}
|
|
1123
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1178
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotPlaceholderComponent, decorators: [{
|
|
1124
1179
|
type: Component,
|
|
1125
1180
|
args: [{
|
|
1126
1181
|
selector: 'axp-component-slot-placeholder',
|
|
@@ -1149,10 +1204,10 @@ class AXPComponentSlotRegistryService {
|
|
|
1149
1204
|
get(slotName) {
|
|
1150
1205
|
return this.registry.get(slotName) || [];
|
|
1151
1206
|
}
|
|
1152
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1153
|
-
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' }); }
|
|
1154
1209
|
}
|
|
1155
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1210
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotRegistryService, decorators: [{
|
|
1156
1211
|
type: Injectable,
|
|
1157
1212
|
args: [{
|
|
1158
1213
|
providedIn: 'root'
|
|
@@ -1161,18 +1216,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
1161
1216
|
|
|
1162
1217
|
class AXPComponentSlotDirective {
|
|
1163
1218
|
constructor() {
|
|
1164
|
-
this.name = input.required(
|
|
1165
|
-
|
|
1166
|
-
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 */ []));
|
|
1167
1225
|
this.elementRef = inject(ElementRef);
|
|
1168
1226
|
this.registryService = inject(AXPComponentSlotRegistryService);
|
|
1169
1227
|
this.injector = inject(Injector);
|
|
1170
1228
|
this.evaluator = inject(AXPExpressionEvaluatorService);
|
|
1171
1229
|
this.viewContainerRef = inject(ViewContainerRef);
|
|
1172
1230
|
this.contextStore = inject(AXPContextStore);
|
|
1173
|
-
this.isEmpty = computed(() => this._viewCount() === 0,
|
|
1231
|
+
this.isEmpty = computed(() => this._viewCount() === 0, /* @ts-ignore */
|
|
1232
|
+
...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
|
|
1174
1233
|
// Create a signal to store the count of children
|
|
1175
|
-
this._viewCount = signal(0,
|
|
1234
|
+
this._viewCount = signal(0, /* @ts-ignore */
|
|
1235
|
+
...(ngDevMode ? [{ debugName: "_viewCount" }] : /* istanbul ignore next */ []));
|
|
1176
1236
|
// Track component references for updates
|
|
1177
1237
|
this.componentRefs = [];
|
|
1178
1238
|
// Track placeholder references for replacement
|
|
@@ -1293,10 +1353,10 @@ class AXPComponentSlotDirective {
|
|
|
1293
1353
|
return condition(this.contextStore.data());
|
|
1294
1354
|
//return condition(this.context());
|
|
1295
1355
|
}
|
|
1296
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1297
|
-
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 }); }
|
|
1298
1358
|
}
|
|
1299
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1359
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotDirective, decorators: [{
|
|
1300
1360
|
type: Directive,
|
|
1301
1361
|
args: [{
|
|
1302
1362
|
selector: 'axp-component-slot',
|
|
@@ -1356,11 +1416,11 @@ class AXPComponentSlotModule {
|
|
|
1356
1416
|
f();
|
|
1357
1417
|
});
|
|
1358
1418
|
}
|
|
1359
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1360
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
1361
|
-
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 }); }
|
|
1362
1422
|
}
|
|
1363
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1423
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPComponentSlotModule, decorators: [{
|
|
1364
1424
|
type: NgModule,
|
|
1365
1425
|
args: [{
|
|
1366
1426
|
declarations: [AXPComponentSlotDirective],
|
|
@@ -1373,12 +1433,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
1373
1433
|
args: ['AXPComponentSlotModuleFactory']
|
|
1374
1434
|
}] }] });
|
|
1375
1435
|
|
|
1376
|
-
/** Trace namespace for form dirty-state diagnostics (lookup/select revert, discard, baseline). */
|
|
1377
|
-
const FORM_DIRTY_TRACE_NS = 'FORM STATE';
|
|
1378
|
-
|
|
1379
|
-
//#region ---- AI metadata ----
|
|
1380
|
-
//#endregion
|
|
1381
|
-
|
|
1382
1436
|
const AXP_CONTEXT_DEFINITION_PROVIDER = new InjectionToken('AXP_CONTEXT_DEFINITION_PROVIDER');
|
|
1383
1437
|
//#endregion
|
|
1384
1438
|
|
|
@@ -1409,109 +1463,14 @@ class AXPContextDefinitionProviderService {
|
|
|
1409
1463
|
async get(name) {
|
|
1410
1464
|
return (await this.items()).find((d) => d.name === name);
|
|
1411
1465
|
}
|
|
1412
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1413
|
-
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' }); }
|
|
1414
1468
|
}
|
|
1415
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1469
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContextDefinitionProviderService, decorators: [{
|
|
1416
1470
|
type: Injectable,
|
|
1417
1471
|
args: [{ providedIn: 'root' }]
|
|
1418
1472
|
}] });
|
|
1419
1473
|
|
|
1420
|
-
//#region ---- Imports ----
|
|
1421
|
-
//#endregion
|
|
1422
|
-
//#region ---- Debug Service ----
|
|
1423
|
-
/**
|
|
1424
|
-
* Platform debug and trace logging.
|
|
1425
|
-
* Call `trace` / `traceGroup` for diagnostics (gated by tenant Debug Mode).
|
|
1426
|
-
* Call `warn` / `error` for always-on console output.
|
|
1427
|
-
*
|
|
1428
|
-
* Debug Mode is applied via `setDebugMode()` (wired from settings in platform common).
|
|
1429
|
-
*/
|
|
1430
|
-
class AXPDebugService {
|
|
1431
|
-
//#endregion
|
|
1432
|
-
//#region ---- Lifecycle ----
|
|
1433
|
-
constructor() {
|
|
1434
|
-
//#endregion
|
|
1435
|
-
//#region ---- State ----
|
|
1436
|
-
this.debugModeEnabled = false;
|
|
1437
|
-
AXPDebugService.instance = this;
|
|
1438
|
-
}
|
|
1439
|
-
//#endregion
|
|
1440
|
-
//#region ---- Debug Mode ----
|
|
1441
|
-
isDebugMode() {
|
|
1442
|
-
return this.debugModeEnabled;
|
|
1443
|
-
}
|
|
1444
|
-
setDebugMode(enabled) {
|
|
1445
|
-
this.debugModeEnabled = enabled;
|
|
1446
|
-
}
|
|
1447
|
-
//#endregion
|
|
1448
|
-
//#region ---- Trace API ----
|
|
1449
|
-
/**
|
|
1450
|
-
* @param namespace Module/feature namespace (kebab-case). Filter console with `[AXP:<namespace>]`.
|
|
1451
|
-
* @param title Short area name (component, service, middleware).
|
|
1452
|
-
* @param message What happened.
|
|
1453
|
-
* @param data Optional structured payload, or a factory evaluated only when Debug Mode is on.
|
|
1454
|
-
*/
|
|
1455
|
-
trace(namespace, title, message, data) {
|
|
1456
|
-
if (!this.debugModeEnabled) {
|
|
1457
|
-
return;
|
|
1458
|
-
}
|
|
1459
|
-
this.log('log', namespace, title, message, data);
|
|
1460
|
-
}
|
|
1461
|
-
/**
|
|
1462
|
-
* Same as {@link trace} but emits a collapsible console group (useful for multi-field payloads).
|
|
1463
|
-
*/
|
|
1464
|
-
traceGroup(namespace, title, message, data) {
|
|
1465
|
-
if (!this.debugModeEnabled) {
|
|
1466
|
-
return;
|
|
1467
|
-
}
|
|
1468
|
-
const resolved = this.resolveData(data);
|
|
1469
|
-
console.groupCollapsed(this.formatPrefix(namespace, title, message));
|
|
1470
|
-
if (resolved != null) {
|
|
1471
|
-
for (const [key, value] of Object.entries(resolved)) {
|
|
1472
|
-
if (value !== undefined) {
|
|
1473
|
-
console.log(key, value);
|
|
1474
|
-
}
|
|
1475
|
-
}
|
|
1476
|
-
}
|
|
1477
|
-
console.groupEnd();
|
|
1478
|
-
}
|
|
1479
|
-
warn(namespace, title, message, data) {
|
|
1480
|
-
this.log('warn', namespace, title, message, data);
|
|
1481
|
-
}
|
|
1482
|
-
error(namespace, title, message, data) {
|
|
1483
|
-
this.log('error', namespace, title, message, data);
|
|
1484
|
-
}
|
|
1485
|
-
//#endregion
|
|
1486
|
-
//#region ---- Utility Methods ----
|
|
1487
|
-
formatPrefix(namespace, title, message) {
|
|
1488
|
-
return `[AXP:${namespace}] ${title} — ${message}`;
|
|
1489
|
-
}
|
|
1490
|
-
resolveData(data) {
|
|
1491
|
-
if (data == null) {
|
|
1492
|
-
return undefined;
|
|
1493
|
-
}
|
|
1494
|
-
return typeof data === 'function' ? data() : data;
|
|
1495
|
-
}
|
|
1496
|
-
log(level, namespace, title, message, data) {
|
|
1497
|
-
const prefix = this.formatPrefix(namespace, title, message);
|
|
1498
|
-
const resolved = this.resolveData(data);
|
|
1499
|
-
if (resolved != null) {
|
|
1500
|
-
console[level](prefix, resolved);
|
|
1501
|
-
return;
|
|
1502
|
-
}
|
|
1503
|
-
console[level](prefix);
|
|
1504
|
-
}
|
|
1505
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDebugService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1506
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDebugService, providedIn: 'root' }); }
|
|
1507
|
-
}
|
|
1508
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDebugService, decorators: [{
|
|
1509
|
-
type: Injectable,
|
|
1510
|
-
args: [{
|
|
1511
|
-
providedIn: 'root',
|
|
1512
|
-
}]
|
|
1513
|
-
}], ctorParameters: () => [] });
|
|
1514
|
-
|
|
1515
1474
|
class AXPDataGenerator {
|
|
1516
1475
|
static uuid() {
|
|
1517
1476
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (char) => {
|
|
@@ -1693,287 +1652,18 @@ function objectKeyValueTransforms(keyName) {
|
|
|
1693
1652
|
};
|
|
1694
1653
|
}
|
|
1695
1654
|
|
|
1696
|
-
const AXP_DATASOURCE_DEFINITION_PROVIDER = new InjectionToken('AXP_DATASOURCE_TYPE_PROVIDER');
|
|
1697
|
-
class AXPDataSourceDefinitionProviderService {
|
|
1698
|
-
constructor() {
|
|
1699
|
-
this.providers = inject(AXP_DATASOURCE_DEFINITION_PROVIDER, { optional: true });
|
|
1700
|
-
}
|
|
1701
|
-
async items() {
|
|
1702
|
-
const items = [];
|
|
1703
|
-
// Load from DI tokens; resolve lazy providers (provideLazyProvider uses useFactory that returns Promise<T>)
|
|
1704
|
-
if (Array.isArray(this.providers)) {
|
|
1705
|
-
for (const raw of this.providers) {
|
|
1706
|
-
const provider = await Promise.resolve(raw);
|
|
1707
|
-
if (provider && typeof provider.items === 'function') {
|
|
1708
|
-
set(provider, '__parent__', this);
|
|
1709
|
-
items.push(...(await provider.items()));
|
|
1710
|
-
}
|
|
1711
|
-
}
|
|
1712
|
-
}
|
|
1713
|
-
return items;
|
|
1714
|
-
}
|
|
1715
|
-
async get(name) {
|
|
1716
|
-
return (await this.items()).find((c) => c.name == name);
|
|
1717
|
-
}
|
|
1718
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1719
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceDefinitionProviderService, providedIn: 'root' }); }
|
|
1720
|
-
}
|
|
1721
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceDefinitionProviderService, decorators: [{
|
|
1722
|
-
type: Injectable,
|
|
1723
|
-
args: [{ providedIn: 'root' }]
|
|
1724
|
-
}] });
|
|
1725
|
-
|
|
1726
|
-
//#region ---- Imports ----
|
|
1727
|
-
//#endregion
|
|
1728
|
-
/**
|
|
1729
|
-
* Resolves registry-backed {@link AXDataSource} instances and exposes readiness (`isReady`, `whenReady`)
|
|
1730
|
-
* so widgets do not bind selected values before the provider datasource is available.
|
|
1731
|
-
*/
|
|
1732
|
-
class AXPDataSourceQueryService {
|
|
1733
|
-
constructor() {
|
|
1734
|
-
//#region ---- Services & State ----
|
|
1735
|
-
this.definitionService = inject(AXPDataSourceDefinitionProviderService);
|
|
1736
|
-
this.entries = new Map();
|
|
1737
|
-
}
|
|
1738
|
-
//#endregion
|
|
1739
|
-
//#region ---- Public API ----
|
|
1740
|
-
/**
|
|
1741
|
-
* Returns true when the named registry datasource has been resolved for the given options.
|
|
1742
|
-
*/
|
|
1743
|
-
isReady(name, options) {
|
|
1744
|
-
const entry = this.entries.get(this.buildCacheKey(name, options));
|
|
1745
|
-
return entry?.result?.ready === true && entry.result.dataSource != null;
|
|
1746
|
-
}
|
|
1747
|
-
/**
|
|
1748
|
-
* Emits once when the registry datasource is resolved (or fails) for the given options.
|
|
1749
|
-
*/
|
|
1750
|
-
whenReady(name, options) {
|
|
1751
|
-
return this.ensureLoading(name, options).readySubject.asObservable().pipe(filter((result) => result.ready), take(1));
|
|
1752
|
-
}
|
|
1753
|
-
/**
|
|
1754
|
-
* Resolves and returns the {@link AXDataSource} for a registry name, waiting for providers when needed.
|
|
1755
|
-
*/
|
|
1756
|
-
async getDataSource(name, options) {
|
|
1757
|
-
const result = await this.resolve(name, options);
|
|
1758
|
-
return result.dataSource;
|
|
1759
|
-
}
|
|
1760
|
-
/**
|
|
1761
|
-
* Resolves the registry datasource, then looks up one or more keys via `byKey`.
|
|
1762
|
-
*/
|
|
1763
|
-
async queryByKey(name, key, options) {
|
|
1764
|
-
if (isNil(key)) {
|
|
1765
|
-
return null;
|
|
1766
|
-
}
|
|
1767
|
-
const result = await this.resolve(name, options);
|
|
1768
|
-
const dataSource = result.dataSource;
|
|
1769
|
-
if (!dataSource?.config?.byKey) {
|
|
1770
|
-
return null;
|
|
1771
|
-
}
|
|
1772
|
-
if (Array.isArray(key)) {
|
|
1773
|
-
const items = await Promise.all(key.map((k) => dataSource.config.byKey(k)));
|
|
1774
|
-
return items.filter((item) => item != null);
|
|
1775
|
-
}
|
|
1776
|
-
return (await dataSource.config.byKey(key)) ?? null;
|
|
1777
|
-
}
|
|
1778
|
-
/**
|
|
1779
|
-
* Fully resolves a registry datasource (definition + AXDataSource instance).
|
|
1780
|
-
*/
|
|
1781
|
-
async resolve(name, options) {
|
|
1782
|
-
const entry = this.ensureLoading(name, options);
|
|
1783
|
-
if (entry.result?.ready) {
|
|
1784
|
-
return entry.result;
|
|
1785
|
-
}
|
|
1786
|
-
return entry.loadPromise;
|
|
1787
|
-
}
|
|
1788
|
-
/**
|
|
1789
|
-
* Clears cached query state. Pass a registry name to invalidate one datasource, or omit to clear all.
|
|
1790
|
-
*/
|
|
1791
|
-
invalidate(name) {
|
|
1792
|
-
if (!name) {
|
|
1793
|
-
this.entries.clear();
|
|
1794
|
-
return;
|
|
1795
|
-
}
|
|
1796
|
-
const prefix = `${name}::`;
|
|
1797
|
-
for (const key of [...this.entries.keys()]) {
|
|
1798
|
-
if (key === name || key.startsWith(prefix)) {
|
|
1799
|
-
this.entries.delete(key);
|
|
1800
|
-
}
|
|
1801
|
-
}
|
|
1802
|
-
}
|
|
1803
|
-
//#endregion
|
|
1804
|
-
//#region ---- Loading ----
|
|
1805
|
-
ensureLoading(name, options) {
|
|
1806
|
-
const cacheKey = this.buildCacheKey(name, options);
|
|
1807
|
-
let entry = this.entries.get(cacheKey);
|
|
1808
|
-
if (!entry) {
|
|
1809
|
-
entry = {
|
|
1810
|
-
name,
|
|
1811
|
-
cacheKey,
|
|
1812
|
-
readySubject: new ReplaySubject(1),
|
|
1813
|
-
};
|
|
1814
|
-
this.entries.set(cacheKey, entry);
|
|
1815
|
-
entry.loadPromise = this.loadEntry(entry, name, options);
|
|
1816
|
-
}
|
|
1817
|
-
return entry;
|
|
1818
|
-
}
|
|
1819
|
-
async loadEntry(entry, name, options) {
|
|
1820
|
-
const pending = {
|
|
1821
|
-
name,
|
|
1822
|
-
ready: false,
|
|
1823
|
-
dataSource: null,
|
|
1824
|
-
valueField: options?.valueField ?? 'id',
|
|
1825
|
-
textField: 'title',
|
|
1826
|
-
};
|
|
1827
|
-
try {
|
|
1828
|
-
const definition = await this.waitForDefinition(name, options);
|
|
1829
|
-
if (!definition) {
|
|
1830
|
-
const failed = {
|
|
1831
|
-
...pending,
|
|
1832
|
-
ready: true,
|
|
1833
|
-
error: new Error(`Data source '${name}' was not found in the registry`),
|
|
1834
|
-
};
|
|
1835
|
-
entry.result = failed;
|
|
1836
|
-
entry.readySubject.next(failed);
|
|
1837
|
-
return failed;
|
|
1838
|
-
}
|
|
1839
|
-
const valueField = options?.valueField ?? definition.valueField?.name ?? 'id';
|
|
1840
|
-
const textField = definition.textField?.name ?? 'title';
|
|
1841
|
-
const dataSource = await this.createDataSource(definition, {
|
|
1842
|
-
...options,
|
|
1843
|
-
valueField,
|
|
1844
|
-
});
|
|
1845
|
-
const translated = dataSource ? this.wrapTranslatedDataSource(dataSource, textField) : null;
|
|
1846
|
-
const success = {
|
|
1847
|
-
name,
|
|
1848
|
-
ready: true,
|
|
1849
|
-
dataSource: translated,
|
|
1850
|
-
definition,
|
|
1851
|
-
valueField,
|
|
1852
|
-
textField,
|
|
1853
|
-
};
|
|
1854
|
-
entry.result = success;
|
|
1855
|
-
entry.readySubject.next(success);
|
|
1856
|
-
return success;
|
|
1857
|
-
}
|
|
1858
|
-
catch (error) {
|
|
1859
|
-
const failed = {
|
|
1860
|
-
...pending,
|
|
1861
|
-
ready: true,
|
|
1862
|
-
error,
|
|
1863
|
-
};
|
|
1864
|
-
entry.result = failed;
|
|
1865
|
-
entry.readySubject.next(failed);
|
|
1866
|
-
return failed;
|
|
1867
|
-
}
|
|
1868
|
-
}
|
|
1869
|
-
async waitForDefinition(name, options) {
|
|
1870
|
-
const waitForRegistry = options?.waitForRegistry ?? true;
|
|
1871
|
-
const maxAttempts = options?.maxRegistryAttempts ?? 20;
|
|
1872
|
-
const retryDelayMs = options?.registryRetryDelayMs ?? 50;
|
|
1873
|
-
const attempts = waitForRegistry ? maxAttempts : 1;
|
|
1874
|
-
for (let attempt = 0; attempt < attempts; attempt++) {
|
|
1875
|
-
const definition = await this.definitionService.get(name);
|
|
1876
|
-
if (definition) {
|
|
1877
|
-
return definition;
|
|
1878
|
-
}
|
|
1879
|
-
if (attempt < attempts - 1) {
|
|
1880
|
-
await this.sleep(retryDelayMs);
|
|
1881
|
-
}
|
|
1882
|
-
}
|
|
1883
|
-
return undefined;
|
|
1884
|
-
}
|
|
1885
|
-
async createDataSource(definition, options) {
|
|
1886
|
-
if (options.useSamples && definition.samples) {
|
|
1887
|
-
const samples = await this.resolveSamples(definition.samples);
|
|
1888
|
-
return convertArrayToDataSource(samples, {
|
|
1889
|
-
key: options.valueField,
|
|
1890
|
-
pageSize: 500,
|
|
1891
|
-
});
|
|
1892
|
-
}
|
|
1893
|
-
const sourceResult = definition.source();
|
|
1894
|
-
const resolved = await Promise.resolve(sourceResult);
|
|
1895
|
-
if (resolved instanceof AXDataSource) {
|
|
1896
|
-
this.applyValueFieldAsKey(resolved, options.valueField);
|
|
1897
|
-
return resolved;
|
|
1898
|
-
}
|
|
1899
|
-
if (Array.isArray(resolved)) {
|
|
1900
|
-
return convertArrayToDataSource(resolved, {
|
|
1901
|
-
key: options.valueField,
|
|
1902
|
-
pageSize: 500,
|
|
1903
|
-
});
|
|
1904
|
-
}
|
|
1905
|
-
return null;
|
|
1906
|
-
}
|
|
1907
|
-
async resolveSamples(samples) {
|
|
1908
|
-
return castArray(await Promise.resolve(samples));
|
|
1909
|
-
}
|
|
1910
|
-
applyValueFieldAsKey(dataSource, valueField) {
|
|
1911
|
-
if (dataSource.config?.key !== valueField) {
|
|
1912
|
-
dataSource.config = { ...dataSource.config, key: valueField };
|
|
1913
|
-
}
|
|
1914
|
-
}
|
|
1915
|
-
wrapTranslatedDataSource(dataSource, textField) {
|
|
1916
|
-
const config = dataSource.config;
|
|
1917
|
-
if (!config) {
|
|
1918
|
-
return dataSource;
|
|
1919
|
-
}
|
|
1920
|
-
const originalByKey = config.byKey;
|
|
1921
|
-
const originalLoad = config.load;
|
|
1922
|
-
if (originalByKey) {
|
|
1923
|
-
config.byKey = async (key) => this.translateItem(await originalByKey(key), textField);
|
|
1924
|
-
}
|
|
1925
|
-
if (originalLoad) {
|
|
1926
|
-
config.load = async (event) => {
|
|
1927
|
-
const result = await originalLoad(event);
|
|
1928
|
-
if (!result?.items?.length) {
|
|
1929
|
-
return result;
|
|
1930
|
-
}
|
|
1931
|
-
return {
|
|
1932
|
-
...result,
|
|
1933
|
-
items: result.items.map((item) => this.translateItem(item, textField)),
|
|
1934
|
-
};
|
|
1935
|
-
};
|
|
1936
|
-
}
|
|
1937
|
-
return dataSource;
|
|
1938
|
-
}
|
|
1939
|
-
translateItem(item, textField) {
|
|
1940
|
-
if (item == null || typeof item !== 'object') {
|
|
1941
|
-
return item;
|
|
1942
|
-
}
|
|
1943
|
-
const title = get(item, textField);
|
|
1944
|
-
// Keep i18n keys for UI widgets (ax-select-box translate pipe) so labels react to locale changes.
|
|
1945
|
-
if (isString(title) && title.startsWith('@')) {
|
|
1946
|
-
return item;
|
|
1947
|
-
}
|
|
1948
|
-
return item;
|
|
1949
|
-
}
|
|
1950
|
-
buildCacheKey(name, options) {
|
|
1951
|
-
const valueField = options?.valueField ?? '';
|
|
1952
|
-
const useSamples = options?.useSamples ? '1' : '0';
|
|
1953
|
-
return `${name}::${valueField}::${useSamples}`;
|
|
1954
|
-
}
|
|
1955
|
-
sleep(ms) {
|
|
1956
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1957
|
-
}
|
|
1958
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceQueryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1959
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceQueryService, providedIn: 'root' }); }
|
|
1960
|
-
}
|
|
1961
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPDataSourceQueryService, decorators: [{
|
|
1962
|
-
type: Injectable,
|
|
1963
|
-
args: [{ providedIn: 'root' }]
|
|
1964
|
-
}] });
|
|
1965
|
-
|
|
1966
1655
|
// src/app/directives/grid-layout.directive.ts
|
|
1967
1656
|
class AXPContentCheckerDirective {
|
|
1968
1657
|
constructor() {
|
|
1969
1658
|
this.viewContainerRef = inject(ViewContainerRef);
|
|
1970
1659
|
this.elementRef = inject((ElementRef));
|
|
1971
|
-
this.isEmpty = computed(() => this.viewContainerRef.length === 0,
|
|
1660
|
+
this.isEmpty = computed(() => this.viewContainerRef.length === 0, /* @ts-ignore */
|
|
1661
|
+
...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
|
|
1972
1662
|
}
|
|
1973
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1974
|
-
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 }); }
|
|
1975
1665
|
}
|
|
1976
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1666
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPContentCheckerDirective, decorators: [{
|
|
1977
1667
|
type: Directive,
|
|
1978
1668
|
args: [{
|
|
1979
1669
|
selector: '[axp-content-checker]',
|
|
@@ -2003,10 +1693,10 @@ class AXPDblClickDirective {
|
|
|
2003
1693
|
}
|
|
2004
1694
|
this.lastTap = currentTime;
|
|
2005
1695
|
}
|
|
2006
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2007
|
-
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 }); }
|
|
2008
1698
|
}
|
|
2009
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1699
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDblClickDirective, decorators: [{
|
|
2010
1700
|
type: Directive,
|
|
2011
1701
|
args: [{
|
|
2012
1702
|
selector: '[onDblClick]'
|
|
@@ -2031,7 +1721,8 @@ class AXPElementDataDirective {
|
|
|
2031
1721
|
const currentData = this.data();
|
|
2032
1722
|
const currentPath = this.path();
|
|
2033
1723
|
set(this.elementRef.nativeElement, currentPath, currentData);
|
|
2034
|
-
},
|
|
1724
|
+
}, /* @ts-ignore */
|
|
1725
|
+
...(ngDevMode ? [{ debugName: "updateEffect" }] : /* istanbul ignore next */ []));
|
|
2035
1726
|
}
|
|
2036
1727
|
ngOnInit() {
|
|
2037
1728
|
// Initial data setup
|
|
@@ -2049,10 +1740,10 @@ class AXPElementDataDirective {
|
|
|
2049
1740
|
setData(data) {
|
|
2050
1741
|
set(this.elementRef.nativeElement, this.path(), data);
|
|
2051
1742
|
}
|
|
2052
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2053
|
-
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 }); }
|
|
2054
1745
|
}
|
|
2055
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1746
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPElementDataDirective, decorators: [{
|
|
2056
1747
|
type: Directive,
|
|
2057
1748
|
args: [{
|
|
2058
1749
|
selector: '[axp-data]',
|
|
@@ -2109,10 +1800,10 @@ class AXPGridLayoutDirective {
|
|
|
2109
1800
|
}
|
|
2110
1801
|
});
|
|
2111
1802
|
}
|
|
2112
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2113
|
-
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 }); }
|
|
2114
1805
|
}
|
|
2115
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1806
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGridLayoutDirective, decorators: [{
|
|
2116
1807
|
type: Directive,
|
|
2117
1808
|
args: [{
|
|
2118
1809
|
selector: '[axp-grid-layout]',
|
|
@@ -2256,22 +1947,26 @@ class AXPDistributedEventListenerService {
|
|
|
2256
1947
|
this.listenersByKey.clear();
|
|
2257
1948
|
this.providersLoaded = false;
|
|
2258
1949
|
}
|
|
2259
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2260
|
-
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' }); }
|
|
2261
1952
|
}
|
|
2262
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1953
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDistributedEventListenerService, decorators: [{
|
|
2263
1954
|
type: Injectable,
|
|
2264
1955
|
args: [{
|
|
2265
1956
|
providedIn: 'root',
|
|
2266
1957
|
}]
|
|
2267
1958
|
}] });
|
|
2268
1959
|
|
|
1960
|
+
//#endregion
|
|
1961
|
+
//#region ---- Broadcast event service ----
|
|
2269
1962
|
class AXPBroadcastEventService {
|
|
2270
1963
|
constructor() {
|
|
2271
1964
|
this.eventSubjects = new Map();
|
|
2272
1965
|
this.pendingRequests = new Map();
|
|
2273
1966
|
this.multiTabEventHistory = new Set(); // Prevent duplicate processing of the same event
|
|
2274
1967
|
this.instanceId = AXPDataGenerator.uuid();
|
|
1968
|
+
this.publishPolicies = new Map();
|
|
1969
|
+
this.pendingPublishes = new Map();
|
|
2275
1970
|
this.channel = new BroadcastChannel('platform_global_events');
|
|
2276
1971
|
// Handle incoming messages
|
|
2277
1972
|
this.channel.onmessage = (event) => {
|
|
@@ -2301,14 +1996,35 @@ class AXPBroadcastEventService {
|
|
|
2301
1996
|
};
|
|
2302
1997
|
}
|
|
2303
1998
|
/**
|
|
2304
|
-
*
|
|
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.
|
|
2305
2012
|
*/
|
|
2306
2013
|
publish(type, payload) {
|
|
2307
|
-
this.
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2014
|
+
const policy = this.publishPolicies.get(type);
|
|
2015
|
+
if (!policy) {
|
|
2016
|
+
this.dispatchPublish(type, payload);
|
|
2017
|
+
return;
|
|
2311
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;
|
|
2026
|
+
}
|
|
2027
|
+
this.publishDebounced(type, payload, policy, pendingKey, existing);
|
|
2312
2028
|
}
|
|
2313
2029
|
/**
|
|
2314
2030
|
* Subscribe to an event
|
|
@@ -2372,6 +2088,13 @@ class AXPBroadcastEventService {
|
|
|
2372
2088
|
*/
|
|
2373
2089
|
ngOnDestroy() {
|
|
2374
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();
|
|
2375
2098
|
// Complete all subjects
|
|
2376
2099
|
this.eventSubjects.forEach((subject) => subject.complete());
|
|
2377
2100
|
this.eventSubjects.clear();
|
|
@@ -2383,16 +2106,155 @@ class AXPBroadcastEventService {
|
|
|
2383
2106
|
// Cleanup multi-tab event history
|
|
2384
2107
|
this.multiTabEventHistory.clear();
|
|
2385
2108
|
}
|
|
2386
|
-
|
|
2387
|
-
|
|
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' }); }
|
|
2388
2162
|
}
|
|
2389
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2163
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPBroadcastEventService, decorators: [{
|
|
2390
2164
|
type: Injectable,
|
|
2391
2165
|
args: [{
|
|
2392
2166
|
providedIn: 'root',
|
|
2393
2167
|
}]
|
|
2394
2168
|
}], ctorParameters: () => [] });
|
|
2395
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
|
+
|
|
2396
2258
|
class AXPHookService {
|
|
2397
2259
|
constructor() {
|
|
2398
2260
|
this.listenerProviders = inject(AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, { optional: true }) || [];
|
|
@@ -2439,10 +2301,10 @@ class AXPHookService {
|
|
|
2439
2301
|
}
|
|
2440
2302
|
return data;
|
|
2441
2303
|
}
|
|
2442
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2443
|
-
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' }); }
|
|
2444
2306
|
}
|
|
2445
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
2307
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPHookService, decorators: [{
|
|
2446
2308
|
type: Injectable,
|
|
2447
2309
|
args: [{ providedIn: 'root' }]
|
|
2448
2310
|
}] });
|
|
@@ -2944,7 +2806,8 @@ class AXPKeyboardShortcutRegistry {
|
|
|
2944
2806
|
this.activeProfile = toSignal(this.localeService.profileChanged$, {
|
|
2945
2807
|
initialValue: this.localeService.activeProfile(),
|
|
2946
2808
|
});
|
|
2947
|
-
this.registrations = signal([],
|
|
2809
|
+
this.registrations = signal([], /* @ts-ignore */
|
|
2810
|
+
...(ngDevMode ? [{ debugName: "registrations" }] : /* istanbul ignore next */ []));
|
|
2948
2811
|
this.helpDialogHandler = null;
|
|
2949
2812
|
this.listenerAttached = false;
|
|
2950
2813
|
//#endregion
|
|
@@ -2953,7 +2816,8 @@ class AXPKeyboardShortcutRegistry {
|
|
|
2953
2816
|
this.helpEntries = computed(() => {
|
|
2954
2817
|
this.activeProfile();
|
|
2955
2818
|
return this.buildHelpEntries();
|
|
2956
|
-
},
|
|
2819
|
+
}, /* @ts-ignore */
|
|
2820
|
+
...(ngDevMode ? [{ debugName: "helpEntries" }] : /* istanbul ignore next */ []));
|
|
2957
2821
|
this.onDocumentKeyDown = (event) => {
|
|
2958
2822
|
if (event.key === 'Escape' && shouldDeferEscapeToOpenOverlay(this.document)) {
|
|
2959
2823
|
return;
|
|
@@ -3135,10 +2999,10 @@ class AXPKeyboardShortcutRegistry {
|
|
|
3135
2999
|
}
|
|
3136
3000
|
return entries.sort((a, b) => b.priority - a.priority || a.bindingTitle.localeCompare(b.bindingTitle));
|
|
3137
3001
|
}
|
|
3138
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3139
|
-
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' }); }
|
|
3140
3004
|
}
|
|
3141
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3005
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPKeyboardShortcutRegistry, decorators: [{
|
|
3142
3006
|
type: Injectable,
|
|
3143
3007
|
args: [{
|
|
3144
3008
|
providedIn: 'root',
|
|
@@ -3428,7 +3292,8 @@ class AXPLogoRegistryService {
|
|
|
3428
3292
|
constructor() {
|
|
3429
3293
|
this.providers = new Map();
|
|
3430
3294
|
this.componentCache = new Map();
|
|
3431
|
-
this.revision = signal(0,
|
|
3295
|
+
this.revision = signal(0, /* @ts-ignore */
|
|
3296
|
+
...(ngDevMode ? [{ debugName: "revision" }] : /* istanbul ignore next */ []));
|
|
3432
3297
|
/** Bumps when a provider is registered or replaced. */
|
|
3433
3298
|
this.registryRevision = this.revision.asReadonly();
|
|
3434
3299
|
const injected = inject(AXP_LOGO_PROVIDER, { optional: true }) ?? [];
|
|
@@ -3466,10 +3331,10 @@ class AXPLogoRegistryService {
|
|
|
3466
3331
|
inputs: view.inputs,
|
|
3467
3332
|
};
|
|
3468
3333
|
}
|
|
3469
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3470
|
-
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' }); }
|
|
3471
3336
|
}
|
|
3472
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLogoRegistryService, decorators: [{
|
|
3473
3338
|
type: Injectable,
|
|
3474
3339
|
args: [{ providedIn: 'root' }]
|
|
3475
3340
|
}], ctorParameters: () => [] });
|
|
@@ -3511,10 +3376,10 @@ class AXPEntityLogoRegistrationService {
|
|
|
3511
3376
|
}
|
|
3512
3377
|
return { kind: 'icon', icon: 'fa-solid fa-building', color: 'neutral-400' };
|
|
3513
3378
|
}
|
|
3514
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3515
|
-
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' }); }
|
|
3516
3381
|
}
|
|
3517
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3382
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPEntityLogoRegistrationService, decorators: [{
|
|
3518
3383
|
type: Injectable,
|
|
3519
3384
|
args: [{ providedIn: 'root' }]
|
|
3520
3385
|
}] });
|
|
@@ -3538,42 +3403,54 @@ const AXP_LOGO_IMAGE_SRC_RESOLVER = new InjectionToken('AXP_LOGO_IMAGE_SRC_RESOL
|
|
|
3538
3403
|
//#region ---- Unified logo component ----
|
|
3539
3404
|
class AXPLogoComponent {
|
|
3540
3405
|
constructor() {
|
|
3541
|
-
this.logoKey = input.required(
|
|
3542
|
-
|
|
3543
|
-
this.
|
|
3544
|
-
|
|
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 */ []));
|
|
3545
3414
|
this.registry = inject(AXPLogoRegistryService);
|
|
3546
3415
|
this.imageSrcResolver = inject(AXP_LOGO_IMAGE_SRC_RESOLVER, { optional: true });
|
|
3547
3416
|
this.themeResolver = inject(AXP_LOGO_THEME_RESOLVER, { optional: true });
|
|
3548
|
-
this.resolvedView = signal(null,
|
|
3417
|
+
this.resolvedView = signal(null, /* @ts-ignore */
|
|
3418
|
+
...(ngDevMode ? [{ debugName: "resolvedView" }] : /* istanbul ignore next */ []));
|
|
3549
3419
|
this.blobObjectUrl = null;
|
|
3550
3420
|
this.resolveGeneration = 0;
|
|
3551
|
-
this.resolvedAppearance = computed(() => this.normalizeAppearance(this.appearance()),
|
|
3421
|
+
this.resolvedAppearance = computed(() => this.normalizeAppearance(this.appearance()), /* @ts-ignore */
|
|
3422
|
+
...(ngDevMode ? [{ debugName: "resolvedAppearance" }] : /* istanbul ignore next */ []));
|
|
3552
3423
|
this.request = computed(() => ({
|
|
3553
3424
|
appearance: this.resolvedAppearance(),
|
|
3554
3425
|
size: this.size(),
|
|
3555
3426
|
format: this.format(),
|
|
3556
|
-
}),
|
|
3427
|
+
}), /* @ts-ignore */
|
|
3428
|
+
...(ngDevMode ? [{ debugName: "request" }] : /* istanbul ignore next */ []));
|
|
3557
3429
|
this.imageView = computed(() => {
|
|
3558
3430
|
const view = this.resolvedView();
|
|
3559
3431
|
return view?.kind === 'image' ? view : null;
|
|
3560
|
-
},
|
|
3432
|
+
}, /* @ts-ignore */
|
|
3433
|
+
...(ngDevMode ? [{ debugName: "imageView" }] : /* istanbul ignore next */ []));
|
|
3561
3434
|
this.componentView = computed(() => {
|
|
3562
3435
|
const view = this.resolvedView();
|
|
3563
3436
|
return view?.kind === 'component' ? view : null;
|
|
3564
|
-
},
|
|
3437
|
+
}, /* @ts-ignore */
|
|
3438
|
+
...(ngDevMode ? [{ debugName: "componentView" }] : /* istanbul ignore next */ []));
|
|
3565
3439
|
this.iconView = computed(() => {
|
|
3566
3440
|
const view = this.resolvedView();
|
|
3567
3441
|
return view?.kind === 'icon' ? view : null;
|
|
3568
|
-
},
|
|
3442
|
+
}, /* @ts-ignore */
|
|
3443
|
+
...(ngDevMode ? [{ debugName: "iconView" }] : /* istanbul ignore next */ []));
|
|
3569
3444
|
this.imageWidth = computed(() => {
|
|
3570
3445
|
const view = this.resolvedView();
|
|
3571
3446
|
return view?.kind === 'image' ? (view.width ?? this.size()) : this.size();
|
|
3572
|
-
},
|
|
3447
|
+
}, /* @ts-ignore */
|
|
3448
|
+
...(ngDevMode ? [{ debugName: "imageWidth" }] : /* istanbul ignore next */ []));
|
|
3573
3449
|
this.imageHeight = computed(() => {
|
|
3574
3450
|
const view = this.resolvedView();
|
|
3575
3451
|
return view?.kind === 'image' ? (view.height ?? this.size()) : this.size();
|
|
3576
|
-
},
|
|
3452
|
+
}, /* @ts-ignore */
|
|
3453
|
+
...(ngDevMode ? [{ debugName: "imageHeight" }] : /* istanbul ignore next */ []));
|
|
3577
3454
|
this.componentInputs = computed(() => {
|
|
3578
3455
|
const view = this.resolvedView();
|
|
3579
3456
|
if (view?.kind !== 'component') {
|
|
@@ -3584,7 +3461,8 @@ class AXPLogoComponent {
|
|
|
3584
3461
|
size: this.size(),
|
|
3585
3462
|
...view.inputs,
|
|
3586
3463
|
};
|
|
3587
|
-
},
|
|
3464
|
+
}, /* @ts-ignore */
|
|
3465
|
+
...(ngDevMode ? [{ debugName: "componentInputs" }] : /* istanbul ignore next */ []));
|
|
3588
3466
|
effect((onCleanup) => {
|
|
3589
3467
|
this.registry.registryRevision();
|
|
3590
3468
|
const key = this.logoKey();
|
|
@@ -3646,14 +3524,14 @@ class AXPLogoComponent {
|
|
|
3646
3524
|
}
|
|
3647
3525
|
return this.themeResolver?.isDarkMode() ? 'dark' : 'light';
|
|
3648
3526
|
}
|
|
3649
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3650
|
-
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 }); }
|
|
3651
3529
|
}
|
|
3652
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3530
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLogoComponent, decorators: [{
|
|
3653
3531
|
type: Component,
|
|
3654
3532
|
args: [{ selector: 'axp-logo', imports: [CommonModule, AXImageModule, AXDecoratorModule], host: {
|
|
3655
3533
|
class: 'inline-flex items-center justify-center shrink-0',
|
|
3656
|
-
}, 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"] }]
|
|
3657
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 }] }] } });
|
|
3658
3536
|
|
|
3659
3537
|
/** Global overlay flag + task count ({@link AXPLayoutThemeService}). */
|
|
@@ -3665,7 +3543,63 @@ const OVERLAY_DETAILS_VIEW_TRACE_NS = 'OVERLAY-DETAILS-VIEW';
|
|
|
3665
3543
|
/** Widget tree mount / settle polling ({@link AXPWidgetContainerComponent}). */
|
|
3666
3544
|
const OVERLAY_WIDGET_SETTLE_TRACE_NS = 'OVERLAY-WIDGET-SETTLE';
|
|
3667
3545
|
|
|
3668
|
-
//#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
|
+
}
|
|
3669
3603
|
//#endregion
|
|
3670
3604
|
|
|
3671
3605
|
//#region ---- Provider Interfaces ----
|
|
@@ -3940,97 +3874,99 @@ class AXPModuleManifestRegistry {
|
|
|
3940
3874
|
}
|
|
3941
3875
|
return { missingModules, missingFeatures };
|
|
3942
3876
|
}
|
|
3943
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
3944
|
-
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' }); }
|
|
3945
3879
|
}
|
|
3946
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3880
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
|
|
3947
3881
|
type: Injectable,
|
|
3948
3882
|
args: [{ providedIn: 'root' }]
|
|
3949
3883
|
}] });
|
|
3950
3884
|
|
|
3951
|
-
//#region ---- Imports ----
|
|
3952
3885
|
//#endregion
|
|
3953
|
-
//#region
|
|
3886
|
+
//#region ----- Tokens -----
|
|
3954
3887
|
/**
|
|
3955
|
-
*
|
|
3888
|
+
* Multi provider for declarative app-startup tasks.
|
|
3889
|
+
* Collected once by {@link AXPAppStartUpProvider} — do not use APP_INITIALIZER in features.
|
|
3956
3890
|
*/
|
|
3957
|
-
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
|
|
3963
|
-
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3968
|
-
|
|
3969
|
-
|
|
3970
|
-
|
|
3971
|
-
|
|
3972
|
-
|
|
3973
|
-
|
|
3974
|
-
|
|
3975
|
-
|
|
3976
|
-
|
|
3977
|
-
|
|
3978
|
-
|
|
3979
|
-
|
|
3980
|
-
|
|
3981
|
-
|
|
3982
|
-
|
|
3983
|
-
|
|
3984
|
-
|
|
3985
|
-
|
|
3986
|
-
|
|
3987
|
-
|
|
3988
|
-
|
|
3989
|
-
|
|
3990
|
-
|
|
3991
|
-
datatype: 'string',
|
|
3992
|
-
type: 'text-editor',
|
|
3993
|
-
},
|
|
3994
|
-
{
|
|
3995
|
-
name: 'title',
|
|
3996
|
-
title: 'Title',
|
|
3997
|
-
datatype: 'string',
|
|
3998
|
-
type: 'text-editor',
|
|
3999
|
-
},
|
|
4000
|
-
],
|
|
4001
|
-
filters: [
|
|
4002
|
-
{
|
|
4003
|
-
field: 'title',
|
|
4004
|
-
title: 'Title',
|
|
4005
|
-
operator: { type: 'equal' },
|
|
4006
|
-
widget: { type: 'text-editor' },
|
|
4007
|
-
filterType: { advance: true, inline: true },
|
|
4008
|
-
},
|
|
4009
|
-
],
|
|
4010
|
-
textField: { name: 'title', title: 'Title' },
|
|
4011
|
-
valueField: { name: 'id', title: 'ID' },
|
|
4012
|
-
},
|
|
4013
|
-
];
|
|
4014
|
-
}
|
|
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
|
+
};
|
|
4015
3925
|
}
|
|
4016
3926
|
//#endregion
|
|
4017
3927
|
|
|
3928
|
+
/** Task that must still run after {@link AXPAppStartUpService.abortRemainingStartupTasks}. */
|
|
3929
|
+
const PLATFORM_SETTINGS_FAILURE_REDIRECT_TASK = 'platform-settings-failure-redirect';
|
|
4018
3930
|
class AXPAppStartUpService {
|
|
4019
3931
|
constructor() {
|
|
4020
3932
|
this.translationService = inject(AXTranslationService);
|
|
4021
3933
|
this.tasks = [];
|
|
3934
|
+
/** When true, only {@link PLATFORM_SETTINGS_FAILURE_REDIRECT_TASK} may still run. */
|
|
3935
|
+
this.bootstrapAborted = false;
|
|
4022
3936
|
}
|
|
4023
|
-
//#
|
|
4024
|
-
//#region ---- Public Methods ----
|
|
3937
|
+
//#region ----- Public Methods -----
|
|
4025
3938
|
registerTask(task) {
|
|
4026
3939
|
this.tasks.push(task);
|
|
4027
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
|
+
}
|
|
4028
3957
|
async runAllTasks() {
|
|
4029
3958
|
for (const task of this.tasks.sort((a, b) => a.priority - b.priority)) {
|
|
4030
|
-
|
|
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
|
+
}
|
|
4031
3965
|
await task.run();
|
|
4032
3966
|
}
|
|
4033
3967
|
}
|
|
3968
|
+
//#endregion
|
|
3969
|
+
//#region ----- Private -----
|
|
4034
3970
|
async updateStatus(status) {
|
|
4035
3971
|
const loadingText = document.querySelector('#loadingText');
|
|
4036
3972
|
if (loadingText) {
|
|
@@ -4038,10 +3974,10 @@ class AXPAppStartUpService {
|
|
|
4038
3974
|
loadingText.innerHTML = await this.translationService.translateAsync(translatedStatus);
|
|
4039
3975
|
}
|
|
4040
3976
|
}
|
|
4041
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4042
|
-
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' }); }
|
|
4043
3979
|
}
|
|
4044
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3980
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppStartUpService, decorators: [{
|
|
4045
3981
|
type: Injectable,
|
|
4046
3982
|
args: [{
|
|
4047
3983
|
providedIn: 'root',
|
|
@@ -4050,8 +3986,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
4050
3986
|
function initAppFactory(appInitService) {
|
|
4051
3987
|
return () => appInitService.runAllTasks();
|
|
4052
3988
|
}
|
|
3989
|
+
/**
|
|
3990
|
+
* Sole Angular APP_INITIALIZER for platform bootstrap.
|
|
3991
|
+
* Collects {@link AXP_APP_STARTUP_TASK} providers, then runs all registered tasks.
|
|
3992
|
+
*/
|
|
4053
3993
|
const AXPAppStartUpProvider = provideAppInitializer(() => {
|
|
4054
|
-
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);
|
|
4055
4000
|
return initializerFn();
|
|
4056
4001
|
});
|
|
4057
4002
|
|
|
@@ -4073,17 +4018,17 @@ class AXPModuleManifestModule {
|
|
|
4073
4018
|
appInitService.registerTask({
|
|
4074
4019
|
name: 'ModuleManifests',
|
|
4075
4020
|
statusText: '@general:app-startup.loading-module-manifests',
|
|
4076
|
-
priority:
|
|
4021
|
+
priority: AXP_APP_STARTUP_PRIORITY.moduleManifests,
|
|
4077
4022
|
run: async () => {
|
|
4078
4023
|
await manifestRegistry.initialize();
|
|
4079
4024
|
},
|
|
4080
4025
|
});
|
|
4081
4026
|
}
|
|
4082
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4083
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
4084
|
-
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 }); }
|
|
4085
4030
|
}
|
|
4086
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4031
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPModuleManifestModule, decorators: [{
|
|
4087
4032
|
type: NgModule,
|
|
4088
4033
|
args: [{
|
|
4089
4034
|
providers: [],
|
|
@@ -4104,7 +4049,8 @@ const DEFAULT_MIN_IDLE_MS = 16;
|
|
|
4104
4049
|
class AXPIdleSchedulerService {
|
|
4105
4050
|
constructor() {
|
|
4106
4051
|
//#region ---- State ----
|
|
4107
|
-
this.pausedState = signal(false,
|
|
4052
|
+
this.pausedState = signal(false, /* @ts-ignore */
|
|
4053
|
+
...(ngDevMode ? [{ debugName: "pausedState" }] : /* istanbul ignore next */ []));
|
|
4108
4054
|
this.paused = this.pausedState.asReadonly();
|
|
4109
4055
|
this.queue = [];
|
|
4110
4056
|
this.running = false;
|
|
@@ -4185,10 +4131,10 @@ class AXPIdleSchedulerService {
|
|
|
4185
4131
|
}
|
|
4186
4132
|
}
|
|
4187
4133
|
}
|
|
4188
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4189
|
-
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' }); }
|
|
4190
4136
|
}
|
|
4191
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4137
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPIdleSchedulerService, decorators: [{
|
|
4192
4138
|
type: Injectable,
|
|
4193
4139
|
args: [{ providedIn: 'root' }]
|
|
4194
4140
|
}] });
|
|
@@ -4241,36 +4187,34 @@ class AXPTagProvider {
|
|
|
4241
4187
|
const AXP_TAG_PROVIDER = new InjectionToken('AXP_TAG_PROVIDER');
|
|
4242
4188
|
//#endregion
|
|
4243
4189
|
|
|
4244
|
-
//#region
|
|
4190
|
+
//#region ----- Imports -----
|
|
4191
|
+
//#endregion
|
|
4192
|
+
//#region ----- Tag Service -----
|
|
4245
4193
|
/**
|
|
4246
|
-
*
|
|
4247
|
-
*
|
|
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).
|
|
4248
4196
|
*/
|
|
4249
4197
|
class AXPTagService {
|
|
4250
4198
|
constructor() {
|
|
4251
|
-
//#region
|
|
4199
|
+
//#region ----- Services & Dependencies -----
|
|
4252
4200
|
this.providers = inject(AXP_TAG_PROVIDER, { optional: true }) ?? [];
|
|
4253
4201
|
//#endregion
|
|
4254
|
-
//#region
|
|
4202
|
+
//#region ----- State -----
|
|
4255
4203
|
this.cache = null;
|
|
4204
|
+
/** Shared promise while providers are loading; cleared when settled. */
|
|
4205
|
+
this.loadPromise = null;
|
|
4256
4206
|
}
|
|
4257
4207
|
//#endregion
|
|
4258
|
-
//#region
|
|
4208
|
+
//#region ----- Public API -----
|
|
4259
4209
|
/**
|
|
4260
|
-
* Get all tags from all providers
|
|
4261
|
-
* @param options Filter options
|
|
4262
|
-
* @returns Promise of tags
|
|
4210
|
+
* Get all tags from all providers (memory cache after first successful load).
|
|
4263
4211
|
*/
|
|
4264
4212
|
async getTags(options) {
|
|
4265
|
-
|
|
4266
|
-
|
|
4267
|
-
}
|
|
4268
|
-
let tags = this.cache;
|
|
4269
|
-
// Apply scope filter
|
|
4213
|
+
await this.ensureCatalog();
|
|
4214
|
+
let tags = this.cache ?? [];
|
|
4270
4215
|
if (options?.scope && options.scope.length > 0) {
|
|
4271
4216
|
tags = tags.filter((tag) => tag.scope && options.scope.includes(tag.scope));
|
|
4272
4217
|
}
|
|
4273
|
-
// Apply search filter
|
|
4274
4218
|
if (options?.search) {
|
|
4275
4219
|
const searchLower = options.search.toLowerCase();
|
|
4276
4220
|
tags = tags.filter((tag) => tag.title.toLowerCase().includes(searchLower) ||
|
|
@@ -4278,11 +4222,16 @@ class AXPTagService {
|
|
|
4278
4222
|
}
|
|
4279
4223
|
return tags;
|
|
4280
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
|
+
}
|
|
4281
4233
|
/**
|
|
4282
|
-
* Create a new tag using the appropriate provider
|
|
4283
|
-
* @param tag Tag to create
|
|
4284
|
-
* @param providerName Provider to use (defaults to first writable provider)
|
|
4285
|
-
* @returns Created tag
|
|
4234
|
+
* Create a new tag using the appropriate provider.
|
|
4286
4235
|
*/
|
|
4287
4236
|
async createTag(tag, providerName) {
|
|
4288
4237
|
const provider = providerName
|
|
@@ -4292,14 +4241,11 @@ class AXPTagService {
|
|
|
4292
4241
|
throw new Error('No writable tag provider available');
|
|
4293
4242
|
}
|
|
4294
4243
|
const createdTag = await provider.create(tag);
|
|
4295
|
-
|
|
4296
|
-
this.cache = null;
|
|
4244
|
+
this.invalidateCatalog();
|
|
4297
4245
|
return createdTag;
|
|
4298
4246
|
}
|
|
4299
4247
|
/**
|
|
4300
|
-
* Update an existing tag
|
|
4301
|
-
* @param tag Tag to update
|
|
4302
|
-
* @returns Updated tag
|
|
4248
|
+
* Update an existing tag.
|
|
4303
4249
|
*/
|
|
4304
4250
|
async updateTag(tag) {
|
|
4305
4251
|
const provider = this.providers.find((p) => p.name === tag.scope && p.update);
|
|
@@ -4307,14 +4253,11 @@ class AXPTagService {
|
|
|
4307
4253
|
throw new Error(`No provider found for updating tag with scope: ${tag.scope}`);
|
|
4308
4254
|
}
|
|
4309
4255
|
const updatedTag = await provider.update(tag);
|
|
4310
|
-
|
|
4311
|
-
this.cache = null;
|
|
4256
|
+
this.invalidateCatalog();
|
|
4312
4257
|
return updatedTag;
|
|
4313
4258
|
}
|
|
4314
4259
|
/**
|
|
4315
|
-
* Delete a tag
|
|
4316
|
-
* @param tagId Tag id to delete
|
|
4317
|
-
* @param scope Tag scope
|
|
4260
|
+
* Delete a tag.
|
|
4318
4261
|
*/
|
|
4319
4262
|
async deleteTag(tagId, scope) {
|
|
4320
4263
|
const provider = this.providers.find((p) => p.name === scope && p.delete);
|
|
@@ -4322,22 +4265,33 @@ class AXPTagService {
|
|
|
4322
4265
|
throw new Error(`No provider found for deleting tag with scope: ${scope}`);
|
|
4323
4266
|
}
|
|
4324
4267
|
await provider.delete(tagId);
|
|
4325
|
-
|
|
4326
|
-
this.cache = null;
|
|
4268
|
+
this.invalidateCatalog();
|
|
4327
4269
|
}
|
|
4328
4270
|
/**
|
|
4329
|
-
*
|
|
4271
|
+
* Force reload tags from all providers.
|
|
4330
4272
|
*/
|
|
4331
4273
|
async reload() {
|
|
4332
|
-
this.
|
|
4333
|
-
await this.
|
|
4274
|
+
this.invalidateCatalog();
|
|
4275
|
+
await this.ensureCatalog();
|
|
4334
4276
|
}
|
|
4335
4277
|
//#endregion
|
|
4336
|
-
//#region
|
|
4337
|
-
|
|
4338
|
-
|
|
4339
|
-
|
|
4340
|
-
|
|
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() {
|
|
4341
4295
|
const allTags = [];
|
|
4342
4296
|
for (const provider of this.providers) {
|
|
4343
4297
|
try {
|
|
@@ -4348,14 +4302,13 @@ class AXPTagService {
|
|
|
4348
4302
|
console.error(`Error loading tags from provider ${provider.name}:`, error);
|
|
4349
4303
|
}
|
|
4350
4304
|
}
|
|
4351
|
-
// Remove duplicates based on title (case-insensitive)
|
|
4352
4305
|
const uniqueTags = allTags.filter((tag, index, self) => index === self.findIndex((t) => t.title.toLowerCase() === tag.title.toLowerCase()));
|
|
4353
4306
|
this.cache = uniqueTags;
|
|
4354
4307
|
}
|
|
4355
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4356
|
-
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' }); }
|
|
4357
4310
|
}
|
|
4358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4311
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTagService, decorators: [{
|
|
4359
4312
|
type: Injectable,
|
|
4360
4313
|
args: [{
|
|
4361
4314
|
providedIn: 'root',
|
|
@@ -4395,7 +4348,8 @@ class AXPIconLogoConfig {
|
|
|
4395
4348
|
class AXPCountdownPipe {
|
|
4396
4349
|
constructor() {
|
|
4397
4350
|
this.calendarService = inject(AXCalendarService);
|
|
4398
|
-
this.countdownSignal = signal(this.setupTimer(),
|
|
4351
|
+
this.countdownSignal = signal(this.setupTimer(), /* @ts-ignore */
|
|
4352
|
+
...(ngDevMode ? [{ debugName: "countdownSignal" }] : /* istanbul ignore next */ []));
|
|
4399
4353
|
this.targetDate = 0;
|
|
4400
4354
|
this.prevValue = 0;
|
|
4401
4355
|
}
|
|
@@ -4424,10 +4378,10 @@ class AXPCountdownPipe {
|
|
|
4424
4378
|
updateTargetDate(value) {
|
|
4425
4379
|
this.targetDate = new Date(value).getTime();
|
|
4426
4380
|
}
|
|
4427
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4428
|
-
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 }); }
|
|
4429
4383
|
}
|
|
4430
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4384
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPCountdownPipe, decorators: [{
|
|
4431
4385
|
type: Pipe,
|
|
4432
4386
|
args: [{
|
|
4433
4387
|
name: 'countdown',
|
|
@@ -4783,45 +4737,55 @@ class AXPDeviceService {
|
|
|
4783
4737
|
/**
|
|
4784
4738
|
* Current screen size (Small, Medium, Large)
|
|
4785
4739
|
*/
|
|
4786
|
-
this.screenSize = signal(getScreenSize(),
|
|
4740
|
+
this.screenSize = signal(getScreenSize(), /* @ts-ignore */
|
|
4741
|
+
...(ngDevMode ? [{ debugName: "screenSize" }] : /* istanbul ignore next */ []));
|
|
4787
4742
|
/**
|
|
4788
4743
|
* Current device type (Mobile, Tablet, Desktop)
|
|
4789
4744
|
*/
|
|
4790
|
-
this.deviceType = signal(getDeviceType(),
|
|
4745
|
+
this.deviceType = signal(getDeviceType(), /* @ts-ignore */
|
|
4746
|
+
...(ngDevMode ? [{ debugName: "deviceType" }] : /* istanbul ignore next */ []));
|
|
4791
4747
|
/**
|
|
4792
4748
|
* Whether the device supports touch input
|
|
4793
4749
|
*/
|
|
4794
|
-
this.isTouchDevice = signal(isTouchDevice(),
|
|
4750
|
+
this.isTouchDevice = signal(isTouchDevice(), /* @ts-ignore */
|
|
4751
|
+
...(ngDevMode ? [{ debugName: "isTouchDevice" }] : /* istanbul ignore next */ []));
|
|
4795
4752
|
//#endregion
|
|
4796
4753
|
//#region ---- Computed Signals ----
|
|
4797
4754
|
/**
|
|
4798
4755
|
* Whether the screen size is Small
|
|
4799
4756
|
*/
|
|
4800
|
-
this.isSmall = computed(() => this.screenSize() === AXPScreenSize.Small,
|
|
4757
|
+
this.isSmall = computed(() => this.screenSize() === AXPScreenSize.Small, /* @ts-ignore */
|
|
4758
|
+
...(ngDevMode ? [{ debugName: "isSmall" }] : /* istanbul ignore next */ []));
|
|
4801
4759
|
/**
|
|
4802
4760
|
* Whether the screen size is Medium
|
|
4803
4761
|
*/
|
|
4804
|
-
this.isMedium = computed(() => this.screenSize() === AXPScreenSize.Medium,
|
|
4762
|
+
this.isMedium = computed(() => this.screenSize() === AXPScreenSize.Medium, /* @ts-ignore */
|
|
4763
|
+
...(ngDevMode ? [{ debugName: "isMedium" }] : /* istanbul ignore next */ []));
|
|
4805
4764
|
/**
|
|
4806
4765
|
* Whether the screen size is Large
|
|
4807
4766
|
*/
|
|
4808
|
-
this.isLarge = computed(() => this.screenSize() === AXPScreenSize.Large,
|
|
4767
|
+
this.isLarge = computed(() => this.screenSize() === AXPScreenSize.Large, /* @ts-ignore */
|
|
4768
|
+
...(ngDevMode ? [{ debugName: "isLarge" }] : /* istanbul ignore next */ []));
|
|
4809
4769
|
/**
|
|
4810
4770
|
* Whether the device is Mobile
|
|
4811
4771
|
*/
|
|
4812
|
-
this.isMobileDevice = computed(() => this.deviceType() === AXPDeviceType.Mobile,
|
|
4772
|
+
this.isMobileDevice = computed(() => this.deviceType() === AXPDeviceType.Mobile, /* @ts-ignore */
|
|
4773
|
+
...(ngDevMode ? [{ debugName: "isMobileDevice" }] : /* istanbul ignore next */ []));
|
|
4813
4774
|
/**
|
|
4814
4775
|
* Whether the device is Tablet
|
|
4815
4776
|
*/
|
|
4816
|
-
this.isTabletDevice = computed(() => this.deviceType() === AXPDeviceType.Tablet,
|
|
4777
|
+
this.isTabletDevice = computed(() => this.deviceType() === AXPDeviceType.Tablet, /* @ts-ignore */
|
|
4778
|
+
...(ngDevMode ? [{ debugName: "isTabletDevice" }] : /* istanbul ignore next */ []));
|
|
4817
4779
|
/**
|
|
4818
4780
|
* Whether the device is Desktop
|
|
4819
4781
|
*/
|
|
4820
|
-
this.isDesktopDevice = computed(() => this.deviceType() === AXPDeviceType.Desktop,
|
|
4782
|
+
this.isDesktopDevice = computed(() => this.deviceType() === AXPDeviceType.Desktop, /* @ts-ignore */
|
|
4783
|
+
...(ngDevMode ? [{ debugName: "isDesktopDevice" }] : /* istanbul ignore next */ []));
|
|
4821
4784
|
/**
|
|
4822
4785
|
* Whether the device supports touch (alias for isTouchDevice)
|
|
4823
4786
|
*/
|
|
4824
|
-
this.isTouchScreen = computed(() => this.isTouchDevice(),
|
|
4787
|
+
this.isTouchScreen = computed(() => this.isTouchDevice(), /* @ts-ignore */
|
|
4788
|
+
...(ngDevMode ? [{ debugName: "isTouchScreen" }] : /* istanbul ignore next */ []));
|
|
4825
4789
|
//#endregion
|
|
4826
4790
|
//#region ---- Private Properties ----
|
|
4827
4791
|
this._resizeListener = null;
|
|
@@ -4887,10 +4851,10 @@ class AXPDeviceService {
|
|
|
4887
4851
|
destroy() {
|
|
4888
4852
|
this._removeResizeListener();
|
|
4889
4853
|
}
|
|
4890
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4891
|
-
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' }); }
|
|
4892
4856
|
}
|
|
4893
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4857
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDeviceService, decorators: [{
|
|
4894
4858
|
type: Injectable,
|
|
4895
4859
|
args: [{
|
|
4896
4860
|
providedIn: 'root',
|
|
@@ -4994,10 +4958,10 @@ class AXHighlightService {
|
|
|
4994
4958
|
resultHTML += '</span>';
|
|
4995
4959
|
return resultHTML;
|
|
4996
4960
|
}
|
|
4997
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
4998
|
-
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' }); }
|
|
4999
4963
|
}
|
|
5000
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
4964
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHighlightService, decorators: [{
|
|
5001
4965
|
type: Injectable,
|
|
5002
4966
|
args: [{
|
|
5003
4967
|
providedIn: 'root',
|
|
@@ -5010,15 +4974,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
5010
4974
|
*
|
|
5011
4975
|
* @example
|
|
5012
4976
|
* ```typescript
|
|
5013
|
-
* export class
|
|
4977
|
+
* export class AXMMyFeatureProvider {
|
|
5014
4978
|
* constructor(private readonly injector: Injector) {}
|
|
5015
4979
|
*
|
|
5016
4980
|
* async items() {
|
|
5017
|
-
* const
|
|
4981
|
+
* const nested = instantiateWithInjectionContext(
|
|
5018
4982
|
* this.injector,
|
|
5019
|
-
*
|
|
4983
|
+
* AXMNestedProvider,
|
|
5020
4984
|
* );
|
|
5021
|
-
* return [...(await
|
|
4985
|
+
* return [...(await nested.items())];
|
|
5022
4986
|
* }
|
|
5023
4987
|
* }
|
|
5024
4988
|
* ```
|
|
@@ -5064,8 +5028,8 @@ async function createProviderWithInjectionContext(injector, loader) {
|
|
|
5064
5028
|
* ```typescript
|
|
5065
5029
|
* // Multi-provider (default)
|
|
5066
5030
|
* provideLazyProvider(
|
|
5067
|
-
*
|
|
5068
|
-
* () => import('./
|
|
5031
|
+
* AXP_SOME_MULTI_TOKEN,
|
|
5032
|
+
* () => import('./feature.provider').then(m => m.AXMFeatureProvider)
|
|
5069
5033
|
* )
|
|
5070
5034
|
*
|
|
5071
5035
|
* // Single provider
|
|
@@ -5091,5 +5055,5 @@ function provideLazyProvider(token, loader, multi = true) {
|
|
|
5091
5055
|
* Generated bundle index. Do not edit.
|
|
5092
5056
|
*/
|
|
5093
5057
|
|
|
5094
|
-
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 };
|
|
5095
5059
|
//# sourceMappingURL=acorex-platform-framework-client-core.mjs.map
|