@acorex/platform 21.0.0-next.1 → 21.0.0-next.10
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/auth/index.d.ts +235 -5
- package/common/index.d.ts +220 -218
- package/core/index.d.ts +261 -431
- package/fesm2022/acorex-platform-auth.mjs +200 -37
- package/fesm2022/acorex-platform-auth.mjs.map +1 -1
- package/fesm2022/{acorex-platform-common-common-settings.provider-zhqNP3xb.mjs → acorex-platform-common-common-settings.provider-O8usQ0VC.mjs} +4 -4
- package/fesm2022/{acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map → acorex-platform-common-common-settings.provider-O8usQ0VC.mjs.map} +1 -1
- package/fesm2022/acorex-platform-common.mjs +215 -198
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-core.mjs +545 -585
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-domain.mjs +16 -16
- package/fesm2022/acorex-platform-domain.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +84 -35
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-components.mjs +298 -190
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +72 -72
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +2955 -1278
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-views.mjs +25 -17
- package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widget-core.mjs +189 -108
- package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs → acorex-platform-layout-widgets-button-widget-designer.component-D-NsRvRl.mjs} +4 -4
- package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs.map → acorex-platform-layout-widgets-button-widget-designer.component-D-NsRvRl.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs → acorex-platform-layout-widgets-file-list-popup.component-CCcKHSHj.mjs} +4 -4
- package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map → acorex-platform-layout-widgets-file-list-popup.component-CCcKHSHj.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs → acorex-platform-layout-widgets-image-preview.popup-IrT52Nh1.mjs} +4 -4
- package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map → acorex-platform-layout-widgets-image-preview.popup-IrT52Nh1.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs → acorex-platform-layout-widgets-page-widget-designer.component-DFbfh-OX.mjs} +4 -4
- package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs.map → acorex-platform-layout-widgets-page-widget-designer.component-DFbfh-OX.mjs.map} +1 -1
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-Dw6naXvq.mjs +111 -0
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-Dw6naXvq.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component--4R3TUdJ.mjs} +4 -4
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map → acorex-platform-layout-widgets-tabular-data-edit-popup.component--4R3TUdJ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-BeVQuHFj.mjs} +4 -4
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map → acorex-platform-layout-widgets-tabular-data-view-popup.component-BeVQuHFj.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs → acorex-platform-layout-widgets-text-block-widget-designer.component-CdQxqi0D.mjs} +4 -4
- package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs.map → acorex-platform-layout-widgets-text-block-widget-designer.component-CdQxqi0D.mjs.map} +1 -1
- package/fesm2022/acorex-platform-layout-widgets.mjs +2247 -1221
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-native.mjs +7 -7
- package/fesm2022/acorex-platform-native.mjs.map +1 -1
- package/fesm2022/acorex-platform-runtime.mjs +43 -43
- package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs → acorex-platform-themes-default-entity-master-create-view.component-D2ucwC3F.mjs} +4 -4
- package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map → acorex-platform-themes-default-entity-master-create-view.component-D2ucwC3F.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs → acorex-platform-themes-default-entity-master-list-view.component-CIV6YDDZ.mjs} +12 -12
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-CIV6YDDZ.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs → acorex-platform-themes-default-entity-master-modify-view.component-D5BYbUGK.mjs} +7 -8
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-D5BYbUGK.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs → acorex-platform-themes-default-entity-master-single-view.component-Cf4ei46_.mjs} +7 -7
- package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map → acorex-platform-themes-default-entity-master-single-view.component-Cf4ei46_.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-default-error-401.component-cfREo88K.mjs → acorex-platform-themes-default-error-401.component-DdMToZ9q.mjs} +4 -4
- package/fesm2022/{acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map → acorex-platform-themes-default-error-401.component-DdMToZ9q.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs → acorex-platform-themes-default-error-404.component-CKsa5aPE.mjs} +4 -4
- package/fesm2022/{acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map → acorex-platform-themes-default-error-404.component-CKsa5aPE.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs → acorex-platform-themes-default-error-offline.component-1gxFTAuX.mjs} +4 -4
- package/fesm2022/{acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map → acorex-platform-themes-default-error-offline.component-1gxFTAuX.mjs.map} +1 -1
- package/fesm2022/acorex-platform-themes-default.mjs +39 -42
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs → acorex-platform-themes-shared-icon-chooser-column.component-Ds8eRMuV.mjs} +4 -4
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map → acorex-platform-themes-shared-icon-chooser-column.component-Ds8eRMuV.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs → acorex-platform-themes-shared-icon-chooser-view.component-Dv38sOzr.mjs} +4 -4
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs.map → acorex-platform-themes-shared-icon-chooser-view.component-Dv38sOzr.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs → acorex-platform-themes-shared-theme-color-chooser-column.component-DcO6P6OG.mjs} +11 -11
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DcO6P6OG.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs → acorex-platform-themes-shared-theme-color-chooser-view.component-B7T2qtaI.mjs} +4 -4
- package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs.map → acorex-platform-themes-shared-theme-color-chooser-view.component-B7T2qtaI.mjs.map} +1 -1
- package/fesm2022/acorex-platform-themes-shared.mjs +41 -41
- package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
- package/fesm2022/acorex-platform-workflow.mjs +1529 -1758
- package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
- package/layout/builder/index.d.ts +15 -3
- package/layout/components/index.d.ts +23 -6
- package/layout/entity/index.d.ts +392 -144
- package/layout/views/index.d.ts +16 -11
- package/layout/widget-core/index.d.ts +47 -10
- package/layout/widgets/index.d.ts +212 -39
- package/package.json +5 -5
- package/themes/default/index.d.ts +0 -1
- package/workflow/index.d.ts +1050 -1759
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DTnfRy5f.mjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, Injectable, computed,
|
|
2
|
+
import { InjectionToken, inject, Injectable, computed, ViewContainerRef, ElementRef, Directive, EventEmitter, HostListener, Output, input, effect, Injector, runInInjectionContext, provideAppInitializer, NgModule, signal, Pipe } from '@angular/core';
|
|
3
3
|
import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';
|
|
4
|
-
import { get, isPlainObject, set, isArray, merge,
|
|
4
|
+
import { get, isPlainObject, set, isNil, isEmpty, isArray, merge, isObjectLike, transform, isEqual, differenceWith, union, cloneDeep, isUndefined, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
|
|
5
5
|
import { Subject, interval, fromEvent } from 'rxjs';
|
|
6
6
|
import { AXCalendarService } from '@acorex/core/date-time';
|
|
7
7
|
import { startWith, map, debounceTime } from 'rxjs/operators';
|
|
@@ -17,10 +17,10 @@ class AXPActivityLogService {
|
|
|
17
17
|
async getHistoryByIds(refId, refType, ids) {
|
|
18
18
|
return (await Promise.all(this.providers?.map((p) => p.getHistoryByIds(refId, refType, ids)) ?? [])).flat();
|
|
19
19
|
}
|
|
20
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
21
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
20
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPActivityLogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
21
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPActivityLogService, providedIn: 'root' }); }
|
|
22
22
|
}
|
|
23
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
23
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPActivityLogService, decorators: [{
|
|
24
24
|
type: Injectable,
|
|
25
25
|
args: [{ providedIn: 'root' }]
|
|
26
26
|
}] });
|
|
@@ -170,10 +170,10 @@ class AXPColorPaletteService {
|
|
|
170
170
|
const uniquePalettes = allPalettes.filter((palette, index, self) => index === self.findIndex((p) => p.name === palette.name));
|
|
171
171
|
this.cache = uniquePalettes;
|
|
172
172
|
}
|
|
173
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
174
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
173
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPColorPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
174
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPColorPaletteService, providedIn: 'root' }); }
|
|
175
175
|
}
|
|
176
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
176
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPColorPaletteService, decorators: [{
|
|
177
177
|
type: Injectable,
|
|
178
178
|
args: [{
|
|
179
179
|
providedIn: 'root',
|
|
@@ -288,13 +288,231 @@ class AXPDefaultColorPalettesProvider extends AXPColorPaletteProvider {
|
|
|
288
288
|
},
|
|
289
289
|
];
|
|
290
290
|
}
|
|
291
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
292
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
291
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDefaultColorPalettesProvider, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
292
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDefaultColorPalettesProvider }); }
|
|
293
293
|
}
|
|
294
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
294
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDefaultColorPalettesProvider, decorators: [{
|
|
295
295
|
type: Injectable
|
|
296
296
|
}] });
|
|
297
297
|
|
|
298
|
+
//#region ---- Column Width Provider ----
|
|
299
|
+
/**
|
|
300
|
+
* Injection token for column width providers
|
|
301
|
+
* Use this to register multiple column width providers with multi: true
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* ```typescript
|
|
305
|
+
* providers: [
|
|
306
|
+
* {
|
|
307
|
+
* provide: AXP_COLUMN_WIDTH_PROVIDER,
|
|
308
|
+
* useValue: {
|
|
309
|
+
* matchers: [
|
|
310
|
+
* { name: 'title', width: '300px', priority: 10 },
|
|
311
|
+
* { widgetType: /text-box/i, width: '200px' }
|
|
312
|
+
* ],
|
|
313
|
+
* priority: 150
|
|
314
|
+
* },
|
|
315
|
+
* multi: true
|
|
316
|
+
* }
|
|
317
|
+
* ]
|
|
318
|
+
* ```
|
|
319
|
+
*/
|
|
320
|
+
const AXP_COLUMN_WIDTH_PROVIDER = new InjectionToken('AXP_COLUMN_WIDTH_PROVIDER');
|
|
321
|
+
//#endregion
|
|
322
|
+
|
|
323
|
+
//#region ---- Column Width Service ----
|
|
324
|
+
/**
|
|
325
|
+
* Service for resolving column widths based on registered providers
|
|
326
|
+
* Supports matching by column name (priority) and widget type (fallback)
|
|
327
|
+
* Uses multi-provider pattern for extensibility
|
|
328
|
+
*/
|
|
329
|
+
class AXPColumnWidthService {
|
|
330
|
+
constructor() {
|
|
331
|
+
//#region ---- Services & Dependencies ----
|
|
332
|
+
this.providers = inject(AXP_COLUMN_WIDTH_PROVIDER, {
|
|
333
|
+
optional: true,
|
|
334
|
+
}) ?? [];
|
|
335
|
+
}
|
|
336
|
+
//#region ---- Public Methods ----
|
|
337
|
+
/**
|
|
338
|
+
* Resolve width for a column based on registered providers
|
|
339
|
+
* Only returns a width if column doesn't already have one set
|
|
340
|
+
*
|
|
341
|
+
* @param column Column to resolve width for
|
|
342
|
+
* @returns Resolved width string (normalized) or undefined if no match or column already has width
|
|
343
|
+
*/
|
|
344
|
+
resolveWidth(column) {
|
|
345
|
+
// If column already has a width set, don't override
|
|
346
|
+
const existingWidth = column.width || column.options?.width;
|
|
347
|
+
if (existingWidth) {
|
|
348
|
+
return undefined;
|
|
349
|
+
}
|
|
350
|
+
// Get widget type from column (support both widget.type and showAs.type)
|
|
351
|
+
const widgetType = column.widget?.type || column.showAs?.type;
|
|
352
|
+
// Collect all matchers from all providers
|
|
353
|
+
const allMatchers = this.collectMatchers();
|
|
354
|
+
// Try name-based matches first (higher priority)
|
|
355
|
+
const nameMatch = this.findNameMatch(column.name, allMatchers);
|
|
356
|
+
if (nameMatch) {
|
|
357
|
+
return this.normalizeWidth(nameMatch.width);
|
|
358
|
+
}
|
|
359
|
+
// Fallback to widget-type matches (case-insensitive)
|
|
360
|
+
if (widgetType) {
|
|
361
|
+
const widgetMatch = this.findWidgetTypeMatch(widgetType, allMatchers);
|
|
362
|
+
if (widgetMatch) {
|
|
363
|
+
return this.normalizeWidth(widgetMatch.width);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Apply resolved width to a column (mutates the column)
|
|
370
|
+
* Only applies if column doesn't already have a width
|
|
371
|
+
*
|
|
372
|
+
* @param column Column to apply width to
|
|
373
|
+
* @returns true if width was applied, false if column already had width or no match found
|
|
374
|
+
*/
|
|
375
|
+
applyWidth(column) {
|
|
376
|
+
const width = this.resolveWidth(column);
|
|
377
|
+
if (!width) {
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
380
|
+
// Apply to the appropriate property
|
|
381
|
+
if (column.options) {
|
|
382
|
+
column.options.width = width;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
column.width = width;
|
|
386
|
+
}
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
//#endregion
|
|
390
|
+
//#region ---- Private Methods ----
|
|
391
|
+
/**
|
|
392
|
+
* Collect all matchers from all providers, sorted by provider priority and matcher priority
|
|
393
|
+
*/
|
|
394
|
+
collectMatchers() {
|
|
395
|
+
const allMatchers = [];
|
|
396
|
+
for (const provider of this.providers) {
|
|
397
|
+
const providerPriority = provider.priority ?? 100;
|
|
398
|
+
for (const matcher of provider.matchers) {
|
|
399
|
+
allMatchers.push({
|
|
400
|
+
matcher,
|
|
401
|
+
providerPriority,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Sort by provider priority (descending), then by matcher priority (descending)
|
|
406
|
+
allMatchers.sort((a, b) => {
|
|
407
|
+
if (a.providerPriority !== b.providerPriority) {
|
|
408
|
+
return b.providerPriority - a.providerPriority; // Higher priority first
|
|
409
|
+
}
|
|
410
|
+
const priorityA = a.matcher.priority ?? 0;
|
|
411
|
+
const priorityB = b.matcher.priority ?? 0;
|
|
412
|
+
return priorityB - priorityA; // Higher priority first
|
|
413
|
+
});
|
|
414
|
+
return allMatchers;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Find first matching matcher by column name
|
|
418
|
+
* Name matches take precedence over widget type matches
|
|
419
|
+
*/
|
|
420
|
+
findNameMatch(columnName, allMatchers) {
|
|
421
|
+
for (const { matcher } of allMatchers) {
|
|
422
|
+
if (!matcher.name) {
|
|
423
|
+
continue; // Skip if no name matcher
|
|
424
|
+
}
|
|
425
|
+
if (typeof matcher.name === 'string') {
|
|
426
|
+
// Exact string match (case-sensitive for names)
|
|
427
|
+
if (matcher.name === columnName) {
|
|
428
|
+
return matcher;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
else if (matcher.name instanceof RegExp) {
|
|
432
|
+
// RegExp match
|
|
433
|
+
if (matcher.name.test(columnName)) {
|
|
434
|
+
return matcher;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return undefined;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Find first matching matcher by widget type (case-insensitive)
|
|
442
|
+
*/
|
|
443
|
+
findWidgetTypeMatch(widgetType, allMatchers) {
|
|
444
|
+
const widgetTypeLower = widgetType.toLowerCase();
|
|
445
|
+
for (const { matcher } of allMatchers) {
|
|
446
|
+
if (!matcher.widgetType) {
|
|
447
|
+
continue; // Skip if no widget type matcher
|
|
448
|
+
}
|
|
449
|
+
if (typeof matcher.widgetType === 'string') {
|
|
450
|
+
// Case-insensitive string match
|
|
451
|
+
if (matcher.widgetType.toLowerCase() === widgetTypeLower) {
|
|
452
|
+
return matcher;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
else if (matcher.widgetType instanceof RegExp) {
|
|
456
|
+
// RegExp match (should already be case-insensitive if needed, but we'll test case-insensitively)
|
|
457
|
+
// Create a new regex with case-insensitive flag if not already present
|
|
458
|
+
let regex = matcher.widgetType;
|
|
459
|
+
if (!regex.flags.includes('i')) {
|
|
460
|
+
regex = new RegExp(regex.source, regex.flags + 'i');
|
|
461
|
+
}
|
|
462
|
+
if (regex.test(widgetType)) {
|
|
463
|
+
return matcher;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return undefined;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Normalize width value to string format
|
|
471
|
+
* Numbers are converted to pixels (e.g., 150 -> '150px')
|
|
472
|
+
* Strings are preserved as-is (supports any CSS unit)
|
|
473
|
+
*/
|
|
474
|
+
normalizeWidth(width) {
|
|
475
|
+
if (typeof width === 'number') {
|
|
476
|
+
return `${width}px`;
|
|
477
|
+
}
|
|
478
|
+
return width;
|
|
479
|
+
}
|
|
480
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPColumnWidthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
481
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPColumnWidthService, providedIn: 'root' }); }
|
|
482
|
+
}
|
|
483
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPColumnWidthService, decorators: [{
|
|
484
|
+
type: Injectable,
|
|
485
|
+
args: [{
|
|
486
|
+
providedIn: 'root',
|
|
487
|
+
}]
|
|
488
|
+
}] });
|
|
489
|
+
|
|
490
|
+
//#region ---- Column Width Types ----
|
|
491
|
+
//#endregion
|
|
492
|
+
|
|
493
|
+
//#region ---- Default Column Width Provider ----
|
|
494
|
+
/**
|
|
495
|
+
* Default column width configuration
|
|
496
|
+
* Migrated from DEFAULT_COLUMN_WIDTHS in column-width.middleware.ts
|
|
497
|
+
* Provides sensible defaults for common column names
|
|
498
|
+
*/
|
|
499
|
+
const defaultColumnWidthProvider = {
|
|
500
|
+
priority: 100,
|
|
501
|
+
matchers: [
|
|
502
|
+
// Priority: name-based matches (higher priority = more specific)
|
|
503
|
+
{ name: 'code', width: '150px', priority: 10 },
|
|
504
|
+
{ name: 'name', width: '250px', priority: 10 },
|
|
505
|
+
{ name: 'title', width: '250px', priority: 10 },
|
|
506
|
+
{ name: 'description', width: '350px', priority: 10 },
|
|
507
|
+
{ name: 'note', width: '350px', priority: 10 },
|
|
508
|
+
{ name: 'notes', width: '350px', priority: 10 },
|
|
509
|
+
{ name: 'content', width: '500px', priority: 10 },
|
|
510
|
+
{ name: 'level', width: '100px', priority: 10 },
|
|
511
|
+
{ name: 'order', width: '100px', priority: 10 },
|
|
512
|
+
],
|
|
513
|
+
};
|
|
514
|
+
//#endregion
|
|
515
|
+
|
|
298
516
|
function extractNestedFieldsWildcard(obj, basePath, fields) {
|
|
299
517
|
const result = {};
|
|
300
518
|
if (fields.length === 1 && fields[0] === '*') {
|
|
@@ -313,7 +531,41 @@ function setSmart(obj, smartPath, value) {
|
|
|
313
531
|
const lastPart = pathParts[pathParts.length - 1];
|
|
314
532
|
const fieldMatch = lastPart.match(/^\{(.+)\}$/);
|
|
315
533
|
if (!fieldMatch) {
|
|
534
|
+
// Fix: If value is undefined and we're setting a nested property,
|
|
535
|
+
// check if the parent object exists and if setting this would result in
|
|
536
|
+
// all properties being undefined. If so, set the parent to null instead.
|
|
537
|
+
if (isNil(value) && pathParts.length > 1) {
|
|
538
|
+
const parentPath = pathParts.slice(0, -1).join('.');
|
|
539
|
+
const parentObj = get(obj, parentPath);
|
|
540
|
+
// If parent is already null/undefined, don't recreate the object structure
|
|
541
|
+
if (isNil(parentObj)) {
|
|
542
|
+
return obj;
|
|
543
|
+
}
|
|
544
|
+
// Check if parent is a plain object (not array, not null)
|
|
545
|
+
if (isPlainObject(parentObj)) {
|
|
546
|
+
const existingKeys = Object.keys(parentObj);
|
|
547
|
+
// Check if all existing properties are null/undefined using lodash
|
|
548
|
+
const allNil = isEmpty(existingKeys) || existingKeys.every(key => isNil(parentObj[key]));
|
|
549
|
+
if (allNil) {
|
|
550
|
+
// Set parent to null instead of creating/keeping an object with all undefined properties
|
|
551
|
+
set(obj, parentPath, null);
|
|
552
|
+
return obj;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
316
556
|
set(obj, smartPath, value);
|
|
557
|
+
// After setting, check again if parent should be null using lodash
|
|
558
|
+
if (isNil(value) && pathParts.length > 1) {
|
|
559
|
+
const parentPath = pathParts.slice(0, -1).join('.');
|
|
560
|
+
const parentObj = get(obj, parentPath);
|
|
561
|
+
if (isPlainObject(parentObj)) {
|
|
562
|
+
// Use lodash to check if all properties are null/undefined
|
|
563
|
+
const allNil = Object.keys(parentObj).every(key => isNil(parentObj[key]));
|
|
564
|
+
if (allNil) {
|
|
565
|
+
set(obj, parentPath, null);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
317
569
|
return obj;
|
|
318
570
|
}
|
|
319
571
|
const fields = fieldMatch[1].split(',').map((f) => f.trim());
|
|
@@ -822,203 +1074,51 @@ function objectKeyValueTransforms(keyName) {
|
|
|
822
1074
|
};
|
|
823
1075
|
}
|
|
824
1076
|
|
|
825
|
-
//#region ---- Imports ----
|
|
826
|
-
//#endregion
|
|
827
|
-
//#region ---- Provider Registry Service ----
|
|
828
|
-
/**
|
|
829
|
-
* Registry service for dynamically loaded module providers.
|
|
830
|
-
* Stores provider instances that are loaded conditionally based on access control.
|
|
831
|
-
*/
|
|
832
|
-
class AXPModuleProviderRegistry {
|
|
833
|
-
constructor() {
|
|
834
|
-
//#region ---- Fields ----
|
|
835
|
-
this.permissionProviders = [];
|
|
836
|
-
this.menuProviders = [];
|
|
837
|
-
this.entityProviders = [];
|
|
838
|
-
this.settingProviders = [];
|
|
839
|
-
this.searchProviders = [];
|
|
840
|
-
this.featureProviders = [];
|
|
841
|
-
this.datasourceProviders = [];
|
|
842
|
-
}
|
|
843
|
-
//#endregion
|
|
844
|
-
//#region ---- Public Methods ----
|
|
845
|
-
/**
|
|
846
|
-
* Register a permission provider.
|
|
847
|
-
*/
|
|
848
|
-
registerPermissionProvider(provider) {
|
|
849
|
-
this.permissionProviders.push(provider);
|
|
850
|
-
}
|
|
851
|
-
/**
|
|
852
|
-
* Get all registered permission providers.
|
|
853
|
-
*/
|
|
854
|
-
getPermissionProviders() {
|
|
855
|
-
return [...this.permissionProviders];
|
|
856
|
-
}
|
|
857
|
-
/**
|
|
858
|
-
* Register a menu provider.
|
|
859
|
-
*/
|
|
860
|
-
registerMenuProvider(provider) {
|
|
861
|
-
this.menuProviders.push(provider);
|
|
862
|
-
}
|
|
863
|
-
/**
|
|
864
|
-
* Get all registered menu providers.
|
|
865
|
-
*/
|
|
866
|
-
getMenuProviders() {
|
|
867
|
-
return [...this.menuProviders];
|
|
868
|
-
}
|
|
869
|
-
/**
|
|
870
|
-
* Register an entity provider.
|
|
871
|
-
*/
|
|
872
|
-
registerEntityProvider(provider) {
|
|
873
|
-
this.entityProviders.push(provider);
|
|
874
|
-
}
|
|
875
|
-
/**
|
|
876
|
-
* Get all registered entity providers.
|
|
877
|
-
*/
|
|
878
|
-
getEntityProviders() {
|
|
879
|
-
return [...this.entityProviders];
|
|
880
|
-
}
|
|
881
|
-
/**
|
|
882
|
-
* Register a settings provider.
|
|
883
|
-
*/
|
|
884
|
-
registerSettingProvider(provider) {
|
|
885
|
-
this.settingProviders.push(provider);
|
|
886
|
-
}
|
|
887
|
-
/**
|
|
888
|
-
* Get all registered settings providers.
|
|
889
|
-
*/
|
|
890
|
-
getSettingProviders() {
|
|
891
|
-
return [...this.settingProviders];
|
|
892
|
-
}
|
|
893
|
-
/**
|
|
894
|
-
* Register a search provider.
|
|
895
|
-
*/
|
|
896
|
-
registerSearchProvider(provider) {
|
|
897
|
-
this.searchProviders.push(provider);
|
|
898
|
-
}
|
|
899
|
-
/**
|
|
900
|
-
* Get all registered search providers.
|
|
901
|
-
*/
|
|
902
|
-
getSearchProviders() {
|
|
903
|
-
return [...this.searchProviders];
|
|
904
|
-
}
|
|
905
|
-
/**
|
|
906
|
-
* Register a feature provider.
|
|
907
|
-
*/
|
|
908
|
-
registerFeatureProvider(provider) {
|
|
909
|
-
this.featureProviders.push(provider);
|
|
910
|
-
}
|
|
911
|
-
/**
|
|
912
|
-
* Get all registered feature providers.
|
|
913
|
-
*/
|
|
914
|
-
getFeatureProviders() {
|
|
915
|
-
return [...this.featureProviders];
|
|
916
|
-
}
|
|
917
|
-
/**
|
|
918
|
-
* Register a datasource provider.
|
|
919
|
-
*/
|
|
920
|
-
registerDatasourceProvider(provider) {
|
|
921
|
-
this.datasourceProviders.push(provider);
|
|
922
|
-
}
|
|
923
|
-
/**
|
|
924
|
-
* Get all registered datasource providers.
|
|
925
|
-
*/
|
|
926
|
-
getDatasourceProviders() {
|
|
927
|
-
return [...this.datasourceProviders];
|
|
928
|
-
}
|
|
929
|
-
/**
|
|
930
|
-
* Clear all registered providers.
|
|
931
|
-
* Useful for testing or re-initialization.
|
|
932
|
-
*/
|
|
933
|
-
clear() {
|
|
934
|
-
this.permissionProviders.length = 0;
|
|
935
|
-
this.menuProviders.length = 0;
|
|
936
|
-
this.entityProviders.length = 0;
|
|
937
|
-
this.settingProviders.length = 0;
|
|
938
|
-
this.searchProviders.length = 0;
|
|
939
|
-
this.featureProviders.length = 0;
|
|
940
|
-
this.datasourceProviders.length = 0;
|
|
941
|
-
}
|
|
942
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleProviderRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
943
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleProviderRegistry, providedIn: 'root' }); }
|
|
944
|
-
}
|
|
945
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleProviderRegistry, decorators: [{
|
|
946
|
-
type: Injectable,
|
|
947
|
-
args: [{ providedIn: 'root' }]
|
|
948
|
-
}] });
|
|
949
|
-
|
|
950
1077
|
const AXP_DATASOURCE_DEFINITION_PROVIDER = new InjectionToken('AXP_DATASOURCE_TYPE_PROVIDER');
|
|
951
1078
|
class AXPDataSourceDefinitionProviderService {
|
|
952
1079
|
constructor() {
|
|
953
1080
|
this.providers = inject(AXP_DATASOURCE_DEFINITION_PROVIDER, { optional: true });
|
|
954
|
-
this.providerRegistry = inject(AXPModuleProviderRegistry);
|
|
955
1081
|
}
|
|
956
1082
|
async items() {
|
|
957
1083
|
const items = [];
|
|
958
|
-
// Load from DI tokens
|
|
1084
|
+
// Load from DI tokens
|
|
959
1085
|
if (Array.isArray(this.providers)) {
|
|
960
1086
|
for (const provider of this.providers) {
|
|
961
1087
|
set(provider, '__parent__', this);
|
|
962
1088
|
items.push(...(await provider.items()));
|
|
963
1089
|
}
|
|
964
1090
|
}
|
|
965
|
-
// Load from registry (manifest-based, conditionally loaded)
|
|
966
|
-
const registryProviders = this.providerRegistry.getDatasourceProviders();
|
|
967
|
-
for (const provider of registryProviders) {
|
|
968
|
-
set(provider, '__parent__', this);
|
|
969
|
-
items.push(...(await provider.items()));
|
|
970
|
-
}
|
|
971
1091
|
return items;
|
|
972
1092
|
}
|
|
973
1093
|
async get(name) {
|
|
974
1094
|
return (await this.items()).find((c) => c.name == name);
|
|
975
1095
|
}
|
|
976
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
977
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
1096
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDataSourceDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1097
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDataSourceDefinitionProviderService, providedIn: 'root' }); }
|
|
978
1098
|
}
|
|
979
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1099
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDataSourceDefinitionProviderService, decorators: [{
|
|
980
1100
|
type: Injectable,
|
|
981
1101
|
args: [{ providedIn: 'root' }]
|
|
982
1102
|
}] });
|
|
983
1103
|
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
this.
|
|
988
|
-
this.
|
|
989
|
-
|
|
990
|
-
this.updateEffect = effect(() => {
|
|
991
|
-
const currentData = this.data();
|
|
992
|
-
const currentPath = this.path();
|
|
993
|
-
set(this.elementRef.nativeElement, currentPath, currentData);
|
|
994
|
-
}, ...(ngDevMode ? [{ debugName: "updateEffect" }] : []));
|
|
995
|
-
}
|
|
996
|
-
ngOnInit() {
|
|
997
|
-
// Initial data setup
|
|
998
|
-
set(this.elementRef.nativeElement, this.path(), this.data());
|
|
999
|
-
}
|
|
1000
|
-
/**
|
|
1001
|
-
* Get data from the element
|
|
1002
|
-
*/
|
|
1003
|
-
getData() {
|
|
1004
|
-
return get(this.elementRef.nativeElement, this.path());
|
|
1005
|
-
}
|
|
1006
|
-
/**
|
|
1007
|
-
* Update data at runtime
|
|
1008
|
-
*/
|
|
1009
|
-
setData(data) {
|
|
1010
|
-
set(this.elementRef.nativeElement, this.path(), data);
|
|
1104
|
+
// src/app/directives/grid-layout.directive.ts
|
|
1105
|
+
class AXPContentCheckerDirective {
|
|
1106
|
+
constructor() {
|
|
1107
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
1108
|
+
this.elementRef = inject((ElementRef));
|
|
1109
|
+
this.isEmpty = computed(() => this.viewContainerRef.length === 0, ...(ngDevMode ? [{ debugName: "isEmpty" }] : []));
|
|
1011
1110
|
}
|
|
1012
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1013
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "
|
|
1111
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPContentCheckerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1112
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: AXPContentCheckerDirective, isStandalone: true, selector: "[axp-content-checker]", exportAs: ["checker"], ngImport: i0 }); }
|
|
1014
1113
|
}
|
|
1015
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1114
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPContentCheckerDirective, decorators: [{
|
|
1016
1115
|
type: Directive,
|
|
1017
1116
|
args: [{
|
|
1018
|
-
selector: '[axp-
|
|
1019
|
-
standalone: true
|
|
1117
|
+
selector: '[axp-content-checker]',
|
|
1118
|
+
standalone: true,
|
|
1119
|
+
exportAs: 'checker'
|
|
1020
1120
|
}]
|
|
1021
|
-
}]
|
|
1121
|
+
}] });
|
|
1022
1122
|
|
|
1023
1123
|
class AXPDblClickDirective {
|
|
1024
1124
|
constructor() {
|
|
@@ -1041,10 +1141,10 @@ class AXPDblClickDirective {
|
|
|
1041
1141
|
}
|
|
1042
1142
|
this.lastTap = currentTime;
|
|
1043
1143
|
}
|
|
1044
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1045
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.
|
|
1144
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDblClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1145
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: AXPDblClickDirective, isStandalone: true, selector: "[onDblClick]", outputs: { onDblClick: "onDblClick" }, host: { listeners: { "dblclick": "handleOnDblClick($event)", "touchend": "onTouchEnd($event)" } }, ngImport: i0 }); }
|
|
1046
1146
|
}
|
|
1047
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDblClickDirective, decorators: [{
|
|
1048
1148
|
type: Directive,
|
|
1049
1149
|
args: [{
|
|
1050
1150
|
selector: '[onDblClick]'
|
|
@@ -1059,6 +1159,45 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
1059
1159
|
args: ['touchend', ['$event']]
|
|
1060
1160
|
}] } });
|
|
1061
1161
|
|
|
1162
|
+
class AXPElementDataDirective {
|
|
1163
|
+
constructor(elementRef) {
|
|
1164
|
+
this.elementRef = elementRef;
|
|
1165
|
+
this.data = input(null, ...(ngDevMode ? [{ debugName: "data", alias: 'axp-data' }] : [{ alias: 'axp-data' }]));
|
|
1166
|
+
this.path = input('__data__', ...(ngDevMode ? [{ debugName: "path", alias: 'axp-data-path' }] : [{ alias: 'axp-data-path' }]));
|
|
1167
|
+
// Effect to update element data when inputs change
|
|
1168
|
+
this.updateEffect = effect(() => {
|
|
1169
|
+
const currentData = this.data();
|
|
1170
|
+
const currentPath = this.path();
|
|
1171
|
+
set(this.elementRef.nativeElement, currentPath, currentData);
|
|
1172
|
+
}, ...(ngDevMode ? [{ debugName: "updateEffect" }] : []));
|
|
1173
|
+
}
|
|
1174
|
+
ngOnInit() {
|
|
1175
|
+
// Initial data setup
|
|
1176
|
+
set(this.elementRef.nativeElement, this.path(), this.data());
|
|
1177
|
+
}
|
|
1178
|
+
/**
|
|
1179
|
+
* Get data from the element
|
|
1180
|
+
*/
|
|
1181
|
+
getData() {
|
|
1182
|
+
return get(this.elementRef.nativeElement, this.path());
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1185
|
+
* Update data at runtime
|
|
1186
|
+
*/
|
|
1187
|
+
setData(data) {
|
|
1188
|
+
set(this.elementRef.nativeElement, this.path(), data);
|
|
1189
|
+
}
|
|
1190
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPElementDataDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1191
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.15", 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 }); }
|
|
1192
|
+
}
|
|
1193
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPElementDataDirective, decorators: [{
|
|
1194
|
+
type: Directive,
|
|
1195
|
+
args: [{
|
|
1196
|
+
selector: '[axp-data]',
|
|
1197
|
+
standalone: true
|
|
1198
|
+
}]
|
|
1199
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "axp-data", required: false }] }], path: [{ type: i0.Input, args: [{ isSignal: true, alias: "axp-data-path", required: false }] }] } });
|
|
1200
|
+
|
|
1062
1201
|
// src/app/directives/grid-layout.directive.ts
|
|
1063
1202
|
class AXPGridLayoutDirective {
|
|
1064
1203
|
constructor(el, renderer) {
|
|
@@ -1108,10 +1247,10 @@ class AXPGridLayoutDirective {
|
|
|
1108
1247
|
}
|
|
1109
1248
|
});
|
|
1110
1249
|
}
|
|
1111
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1112
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.
|
|
1250
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPGridLayoutDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1251
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.15", 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 }); }
|
|
1113
1252
|
}
|
|
1114
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1253
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPGridLayoutDirective, decorators: [{
|
|
1115
1254
|
type: Directive,
|
|
1116
1255
|
args: [{
|
|
1117
1256
|
selector: '[axp-grid-layout]',
|
|
@@ -1119,222 +1258,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
1119
1258
|
}]
|
|
1120
1259
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "axp-grid-layout", required: true }] }] } });
|
|
1121
1260
|
|
|
1122
|
-
// src/app/directives/grid-layout.directive.ts
|
|
1123
|
-
class AXPContentCheckerDirective {
|
|
1124
|
-
constructor() {
|
|
1125
|
-
this.viewContainerRef = inject(ViewContainerRef);
|
|
1126
|
-
this.elementRef = inject((ElementRef));
|
|
1127
|
-
this.isEmpty = computed(() => this.viewContainerRef.length === 0, ...(ngDevMode ? [{ debugName: "isEmpty" }] : []));
|
|
1128
|
-
}
|
|
1129
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPContentCheckerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1130
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.12", type: AXPContentCheckerDirective, isStandalone: true, selector: "[axp-content-checker]", exportAs: ["checker"], ngImport: i0 }); }
|
|
1131
|
-
}
|
|
1132
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPContentCheckerDirective, decorators: [{
|
|
1133
|
-
type: Directive,
|
|
1134
|
-
args: [{
|
|
1135
|
-
selector: '[axp-content-checker]',
|
|
1136
|
-
standalone: true,
|
|
1137
|
-
exportAs: 'checker'
|
|
1138
|
-
}]
|
|
1139
|
-
}] });
|
|
1140
|
-
|
|
1141
|
-
//#region ---- Imports ----
|
|
1142
|
-
//#endregion
|
|
1143
|
-
//#region ---- Directive ----
|
|
1144
|
-
/**
|
|
1145
|
-
* Fullscreen directive that provides CSS-based fullscreen functionality
|
|
1146
|
-
* Usage: <element axFullscreen #fullscreen="axFullscreen"></element>
|
|
1147
|
-
* Then: fullscreen.toggle() or fullscreen.enter() or fullscreen.exit()
|
|
1148
|
-
*/
|
|
1149
|
-
class AXFullscreenDirective {
|
|
1150
|
-
constructor(elementRef) {
|
|
1151
|
-
this.elementRef = elementRef;
|
|
1152
|
-
//#region ---- Properties ----
|
|
1153
|
-
/**
|
|
1154
|
-
* Current fullscreen state
|
|
1155
|
-
*/
|
|
1156
|
-
this.isFullscreenState = signal(false, ...(ngDevMode ? [{ debugName: "isFullscreenState" }] : []));
|
|
1157
|
-
/**
|
|
1158
|
-
* Original element styles to restore
|
|
1159
|
-
*/
|
|
1160
|
-
this.originalStyles = {};
|
|
1161
|
-
/**
|
|
1162
|
-
* Original parent element reference
|
|
1163
|
-
*/
|
|
1164
|
-
this.originalParent = null;
|
|
1165
|
-
/**
|
|
1166
|
-
* Fullscreen container element
|
|
1167
|
-
*/
|
|
1168
|
-
this.fullscreenContainer = null;
|
|
1169
|
-
/**
|
|
1170
|
-
* Fullscreen change event
|
|
1171
|
-
*/
|
|
1172
|
-
this.fullscreenChange = output();
|
|
1173
|
-
//#endregion
|
|
1174
|
-
//#region ---- Constructor ----
|
|
1175
|
-
this.destroyRef = inject(DestroyRef);
|
|
1176
|
-
this.renderer = inject(Renderer2);
|
|
1177
|
-
// Sync state changes to output
|
|
1178
|
-
effect(() => {
|
|
1179
|
-
const isFullscreen = this.isFullscreenState();
|
|
1180
|
-
untracked(() => {
|
|
1181
|
-
this.fullscreenChange.emit(isFullscreen);
|
|
1182
|
-
});
|
|
1183
|
-
});
|
|
1184
|
-
}
|
|
1185
|
-
//#endregion
|
|
1186
|
-
//#region ---- Public API ----
|
|
1187
|
-
/**
|
|
1188
|
-
* Toggle fullscreen state
|
|
1189
|
-
*/
|
|
1190
|
-
async toggle() {
|
|
1191
|
-
if (this.isFullscreenState()) {
|
|
1192
|
-
await this.exit();
|
|
1193
|
-
}
|
|
1194
|
-
else {
|
|
1195
|
-
await this.enter();
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
/**
|
|
1199
|
-
* Enter fullscreen mode using CSS
|
|
1200
|
-
*/
|
|
1201
|
-
async enter() {
|
|
1202
|
-
if (this.isFullscreenState()) {
|
|
1203
|
-
return;
|
|
1204
|
-
}
|
|
1205
|
-
const element = this.elementRef.nativeElement;
|
|
1206
|
-
try {
|
|
1207
|
-
// Store original styles and parent
|
|
1208
|
-
this.storeOriginalStyles(element);
|
|
1209
|
-
this.originalParent = element.parentElement;
|
|
1210
|
-
// Create fullscreen container
|
|
1211
|
-
this.fullscreenContainer = this.renderer.createElement('div');
|
|
1212
|
-
this.renderer.setStyle(this.fullscreenContainer, 'position', 'fixed');
|
|
1213
|
-
this.renderer.setStyle(this.fullscreenContainer, 'top', '0');
|
|
1214
|
-
this.renderer.setStyle(this.fullscreenContainer, 'left', '0');
|
|
1215
|
-
this.renderer.setStyle(this.fullscreenContainer, 'width', '100vw');
|
|
1216
|
-
this.renderer.setStyle(this.fullscreenContainer, 'height', '100vh');
|
|
1217
|
-
this.renderer.setStyle(this.fullscreenContainer, 'z-index', '9999');
|
|
1218
|
-
this.renderer.setStyle(this.fullscreenContainer, 'background-color', '#ffffff');
|
|
1219
|
-
this.renderer.setStyle(this.fullscreenContainer, 'overflow', 'auto');
|
|
1220
|
-
// Move element to container
|
|
1221
|
-
this.renderer.appendChild(this.fullscreenContainer, element);
|
|
1222
|
-
// Apply fullscreen styles to element
|
|
1223
|
-
this.renderer.setStyle(element, 'position', 'relative');
|
|
1224
|
-
this.renderer.setStyle(element, 'width', '100%');
|
|
1225
|
-
this.renderer.setStyle(element, 'height', '100%');
|
|
1226
|
-
this.renderer.setStyle(element, 'margin', '0');
|
|
1227
|
-
this.renderer.setStyle(element, 'padding', '0');
|
|
1228
|
-
// Append container to body
|
|
1229
|
-
this.renderer.appendChild(document.body, this.fullscreenContainer);
|
|
1230
|
-
// Prevent body scroll
|
|
1231
|
-
this.renderer.setStyle(document.body, 'overflow', 'hidden');
|
|
1232
|
-
this.isFullscreenState.set(true);
|
|
1233
|
-
}
|
|
1234
|
-
catch (error) {
|
|
1235
|
-
console.error('Error entering fullscreen:', error);
|
|
1236
|
-
this.restoreOriginalStyles(element);
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
/**
|
|
1240
|
-
* Exit fullscreen mode
|
|
1241
|
-
*/
|
|
1242
|
-
async exit() {
|
|
1243
|
-
if (!this.isFullscreenState()) {
|
|
1244
|
-
return;
|
|
1245
|
-
}
|
|
1246
|
-
const element = this.elementRef.nativeElement;
|
|
1247
|
-
try {
|
|
1248
|
-
// Restore body scroll
|
|
1249
|
-
this.renderer.removeStyle(document.body, 'overflow');
|
|
1250
|
-
// Move element back to original parent
|
|
1251
|
-
if (this.fullscreenContainer && this.originalParent) {
|
|
1252
|
-
this.renderer.removeChild(this.fullscreenContainer, element);
|
|
1253
|
-
this.renderer.appendChild(this.originalParent, element);
|
|
1254
|
-
// Remove container
|
|
1255
|
-
this.renderer.removeChild(document.body, this.fullscreenContainer);
|
|
1256
|
-
this.fullscreenContainer = null;
|
|
1257
|
-
}
|
|
1258
|
-
// Restore original styles
|
|
1259
|
-
this.restoreOriginalStyles(element);
|
|
1260
|
-
this.isFullscreenState.set(false);
|
|
1261
|
-
}
|
|
1262
|
-
catch (error) {
|
|
1263
|
-
console.error('Error exiting fullscreen:', error);
|
|
1264
|
-
}
|
|
1265
|
-
}
|
|
1266
|
-
/**
|
|
1267
|
-
* Check if currently in fullscreen mode
|
|
1268
|
-
*/
|
|
1269
|
-
isFullscreen() {
|
|
1270
|
-
return this.isFullscreenState();
|
|
1271
|
-
}
|
|
1272
|
-
//#endregion
|
|
1273
|
-
//#region ---- Private Methods ----
|
|
1274
|
-
/**
|
|
1275
|
-
* Store original element styles
|
|
1276
|
-
*/
|
|
1277
|
-
storeOriginalStyles(element) {
|
|
1278
|
-
const computedStyle = window.getComputedStyle(element);
|
|
1279
|
-
this.originalStyles = {
|
|
1280
|
-
position: computedStyle.position,
|
|
1281
|
-
top: computedStyle.top,
|
|
1282
|
-
left: computedStyle.left,
|
|
1283
|
-
width: computedStyle.width,
|
|
1284
|
-
height: computedStyle.height,
|
|
1285
|
-
zIndex: computedStyle.zIndex,
|
|
1286
|
-
backgroundColor: computedStyle.backgroundColor,
|
|
1287
|
-
margin: computedStyle.margin,
|
|
1288
|
-
padding: computedStyle.padding,
|
|
1289
|
-
};
|
|
1290
|
-
}
|
|
1291
|
-
/**
|
|
1292
|
-
* Restore original element styles
|
|
1293
|
-
*/
|
|
1294
|
-
restoreOriginalStyles(element) {
|
|
1295
|
-
if (!this.originalStyles) {
|
|
1296
|
-
return;
|
|
1297
|
-
}
|
|
1298
|
-
// Restore each style property
|
|
1299
|
-
Object.entries(this.originalStyles).forEach(([key, value]) => {
|
|
1300
|
-
const styleKey = this.camelToKebabCase(key);
|
|
1301
|
-
if (value) {
|
|
1302
|
-
this.renderer.setStyle(element, styleKey, value);
|
|
1303
|
-
}
|
|
1304
|
-
else {
|
|
1305
|
-
this.renderer.removeStyle(element, styleKey);
|
|
1306
|
-
}
|
|
1307
|
-
});
|
|
1308
|
-
this.originalStyles = {};
|
|
1309
|
-
}
|
|
1310
|
-
/**
|
|
1311
|
-
* Convert camelCase to kebab-case for CSS properties
|
|
1312
|
-
*/
|
|
1313
|
-
camelToKebabCase(str) {
|
|
1314
|
-
return str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase();
|
|
1315
|
-
}
|
|
1316
|
-
//#endregion
|
|
1317
|
-
//#region ---- Lifecycle ----
|
|
1318
|
-
ngOnDestroy() {
|
|
1319
|
-
// Exit fullscreen if still active
|
|
1320
|
-
if (this.isFullscreenState()) {
|
|
1321
|
-
this.exit().catch(() => {
|
|
1322
|
-
// Ignore errors during cleanup
|
|
1323
|
-
});
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXFullscreenDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1327
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.12", type: AXFullscreenDirective, isStandalone: true, selector: "[axFullscreen]", outputs: { fullscreenChange: "fullscreenChange" }, exportAs: ["axFullscreen"], ngImport: i0 }); }
|
|
1328
|
-
}
|
|
1329
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXFullscreenDirective, decorators: [{
|
|
1330
|
-
type: Directive,
|
|
1331
|
-
args: [{
|
|
1332
|
-
selector: '[axFullscreen]',
|
|
1333
|
-
standalone: true,
|
|
1334
|
-
exportAs: 'axFullscreen',
|
|
1335
|
-
}]
|
|
1336
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { fullscreenChange: [{ type: i0.Output, args: ["fullscreenChange"] }] } });
|
|
1337
|
-
|
|
1338
1261
|
const AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER = new InjectionToken('AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER');
|
|
1339
1262
|
|
|
1340
1263
|
//#region ---- Imports ----
|
|
@@ -1471,10 +1394,10 @@ class AXPDistributedEventListenerService {
|
|
|
1471
1394
|
this.listenersByKey.clear();
|
|
1472
1395
|
this.providersLoaded = false;
|
|
1473
1396
|
}
|
|
1474
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1475
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
1397
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDistributedEventListenerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1398
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDistributedEventListenerService, providedIn: 'root' }); }
|
|
1476
1399
|
}
|
|
1477
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1400
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDistributedEventListenerService, decorators: [{
|
|
1478
1401
|
type: Injectable,
|
|
1479
1402
|
args: [{
|
|
1480
1403
|
providedIn: 'root',
|
|
@@ -1598,10 +1521,10 @@ class AXPBroadcastEventService {
|
|
|
1598
1521
|
// Cleanup multi-tab event history
|
|
1599
1522
|
this.multiTabEventHistory.clear();
|
|
1600
1523
|
}
|
|
1601
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1602
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
1524
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPBroadcastEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1525
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPBroadcastEventService, providedIn: 'root' }); }
|
|
1603
1526
|
}
|
|
1604
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1527
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPBroadcastEventService, decorators: [{
|
|
1605
1528
|
type: Injectable,
|
|
1606
1529
|
args: [{
|
|
1607
1530
|
providedIn: 'root',
|
|
@@ -1640,10 +1563,10 @@ class AXPExpressionEvaluatorScopeProviderService {
|
|
|
1640
1563
|
await this.load();
|
|
1641
1564
|
return this.cache || {};
|
|
1642
1565
|
}
|
|
1643
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1644
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
1566
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1567
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, providedIn: 'root' }); }
|
|
1645
1568
|
}
|
|
1646
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1569
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, decorators: [{
|
|
1647
1570
|
type: Injectable,
|
|
1648
1571
|
args: [{ providedIn: 'root' }]
|
|
1649
1572
|
}] });
|
|
@@ -1752,10 +1675,10 @@ class AXPExpressionEvaluatorService {
|
|
|
1752
1675
|
}
|
|
1753
1676
|
return false;
|
|
1754
1677
|
}
|
|
1755
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1756
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
1678
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPExpressionEvaluatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1679
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPExpressionEvaluatorService, providedIn: 'root' }); }
|
|
1757
1680
|
}
|
|
1758
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1681
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPExpressionEvaluatorService, decorators: [{
|
|
1759
1682
|
type: Injectable,
|
|
1760
1683
|
args: [{ providedIn: 'root' }]
|
|
1761
1684
|
}] });
|
|
@@ -1806,10 +1729,10 @@ class AXPHookService {
|
|
|
1806
1729
|
}
|
|
1807
1730
|
return data;
|
|
1808
1731
|
}
|
|
1809
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
1810
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
1732
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPHookService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1733
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPHookService, providedIn: 'root' }); }
|
|
1811
1734
|
}
|
|
1812
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
1735
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPHookService, decorators: [{
|
|
1813
1736
|
type: Injectable,
|
|
1814
1737
|
args: [{ providedIn: 'root' }]
|
|
1815
1738
|
}] });
|
|
@@ -1817,16 +1740,53 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
|
|
|
1817
1740
|
//#region ---- Imports ----
|
|
1818
1741
|
//#endregion
|
|
1819
1742
|
|
|
1820
|
-
//#region ----
|
|
1821
|
-
|
|
1822
|
-
|
|
1743
|
+
//#region ---- Provider Interfaces ----
|
|
1744
|
+
/**
|
|
1745
|
+
* Injection token for session service.
|
|
1746
|
+
* Implementation: @acorex/platform/auth
|
|
1747
|
+
*/
|
|
1748
|
+
const AXP_SESSION_SERVICE = new InjectionToken('AXP_SESSION_SERVICE');
|
|
1823
1749
|
/**
|
|
1824
1750
|
* Injection token for module manifest providers.
|
|
1825
1751
|
* Modules register their manifest providers using this token.
|
|
1826
1752
|
*/
|
|
1827
1753
|
const AXP_MODULE_MANIFEST_PROVIDER = new InjectionToken('AXP_MODULE_MANIFEST_PROVIDER');
|
|
1828
1754
|
//#endregion
|
|
1829
|
-
|
|
1755
|
+
|
|
1756
|
+
//#region ---- Imports ----
|
|
1757
|
+
//#endregion
|
|
1758
|
+
//#region ---- Feature Definition Provider Interface ----
|
|
1759
|
+
/**
|
|
1760
|
+
* Context for feature definition providers.
|
|
1761
|
+
* Allows providers to add additional feature definitions dynamically.
|
|
1762
|
+
*/
|
|
1763
|
+
class AXPFeatureDefinitionProviderContext {
|
|
1764
|
+
constructor() {
|
|
1765
|
+
this.features = new Map();
|
|
1766
|
+
}
|
|
1767
|
+
/**
|
|
1768
|
+
* Add a feature definition.
|
|
1769
|
+
* @param key Full feature key (ModuleName:FeatureKey format with colon separator)
|
|
1770
|
+
* @param definition Feature definition
|
|
1771
|
+
*/
|
|
1772
|
+
addFeature(key, definition) {
|
|
1773
|
+
this.features.set(key, definition);
|
|
1774
|
+
}
|
|
1775
|
+
/**
|
|
1776
|
+
* Get all feature definitions.
|
|
1777
|
+
*/
|
|
1778
|
+
getFeatures() {
|
|
1779
|
+
return this.features;
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
/**
|
|
1783
|
+
* Injection token for feature definition providers.
|
|
1784
|
+
*/
|
|
1785
|
+
const AXP_FEATURE_DEFINITION_PROVIDER = new InjectionToken('AXP_FEATURE_DEFINITION_PROVIDER', {
|
|
1786
|
+
providedIn: 'root',
|
|
1787
|
+
factory: () => [],
|
|
1788
|
+
});
|
|
1789
|
+
//#endregion
|
|
1830
1790
|
|
|
1831
1791
|
//#region ---- Imports ----
|
|
1832
1792
|
//#endregion
|
|
@@ -1893,6 +1853,8 @@ class AXPModuleManifestRegistry {
|
|
|
1893
1853
|
}
|
|
1894
1854
|
});
|
|
1895
1855
|
await Promise.all(registerPromises);
|
|
1856
|
+
// Load and register features from all feature definition providers
|
|
1857
|
+
await this.loadFeatureDefinitions();
|
|
1896
1858
|
this.isInitialized = true;
|
|
1897
1859
|
}
|
|
1898
1860
|
//#endregion
|
|
@@ -1929,6 +1891,53 @@ class AXPModuleManifestRegistry {
|
|
|
1929
1891
|
has(moduleName) {
|
|
1930
1892
|
return this.manifests.has(moduleName);
|
|
1931
1893
|
}
|
|
1894
|
+
/**
|
|
1895
|
+
* Load feature definitions from all registered feature definition providers.
|
|
1896
|
+
* Features are automatically associated with modules based on the module name in the feature key.
|
|
1897
|
+
*/
|
|
1898
|
+
async loadFeatureDefinitions() {
|
|
1899
|
+
try {
|
|
1900
|
+
const featureProviders = this.injector.get(AXP_FEATURE_DEFINITION_PROVIDER, []);
|
|
1901
|
+
if (!featureProviders || featureProviders.length === 0) {
|
|
1902
|
+
return;
|
|
1903
|
+
}
|
|
1904
|
+
const context = new AXPFeatureDefinitionProviderContext();
|
|
1905
|
+
// Call all providers to collect features
|
|
1906
|
+
for (const provider of featureProviders) {
|
|
1907
|
+
if (provider instanceof Promise) {
|
|
1908
|
+
// If provider is a promise, resolve it
|
|
1909
|
+
const resolvedProvider = await provider;
|
|
1910
|
+
await resolvedProvider.provide(context);
|
|
1911
|
+
}
|
|
1912
|
+
else {
|
|
1913
|
+
// If provider is a direct instance, use it directly
|
|
1914
|
+
await provider.provide(context);
|
|
1915
|
+
}
|
|
1916
|
+
}
|
|
1917
|
+
// Register all features and associate them with their modules
|
|
1918
|
+
const features = context.getFeatures();
|
|
1919
|
+
for (const [key, definition] of features.entries()) {
|
|
1920
|
+
// Extract module name from key (format: ModuleName:FeatureKey)
|
|
1921
|
+
const [moduleName, ...keyParts] = key.split(':');
|
|
1922
|
+
const shortKey = keyParts.join(':');
|
|
1923
|
+
// Verify that the module exists
|
|
1924
|
+
if (!this.has(moduleName)) {
|
|
1925
|
+
console.warn(`Feature '${key}' references unknown module '${moduleName}'. Skipping.`);
|
|
1926
|
+
continue;
|
|
1927
|
+
}
|
|
1928
|
+
// Register feature definition
|
|
1929
|
+
this.registerFeatureDefinition({
|
|
1930
|
+
...definition,
|
|
1931
|
+
name: key,
|
|
1932
|
+
module: moduleName,
|
|
1933
|
+
key: shortKey,
|
|
1934
|
+
});
|
|
1935
|
+
}
|
|
1936
|
+
}
|
|
1937
|
+
catch (error) {
|
|
1938
|
+
console.error('Failed to load feature definitions:', error);
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1932
1941
|
//#endregion
|
|
1933
1942
|
//#region ---- Feature Definition Management ----
|
|
1934
1943
|
/**
|
|
@@ -1965,7 +1974,7 @@ class AXPModuleManifestRegistry {
|
|
|
1965
1974
|
}
|
|
1966
1975
|
/**
|
|
1967
1976
|
* Register a feature definition dynamically (e.g., from feature definition provider).
|
|
1968
|
-
* Used to add features that are defined at runtime via
|
|
1977
|
+
* Used to add features that are defined at runtime via AXP_FEATURE_DEFINITION_PROVIDER.
|
|
1969
1978
|
*/
|
|
1970
1979
|
registerFeatureDefinition(definition) {
|
|
1971
1980
|
this.featureDefinitions.set(definition.name, definition);
|
|
@@ -1975,165 +1984,41 @@ class AXPModuleManifestRegistry {
|
|
|
1975
1984
|
/**
|
|
1976
1985
|
* Check if module dependencies are satisfied.
|
|
1977
1986
|
* Returns array of missing dependencies.
|
|
1987
|
+
* Dependencies can be module names or feature keys (ModuleName.FeatureKey format).
|
|
1978
1988
|
*/
|
|
1979
1989
|
checkDependencies(moduleName) {
|
|
1980
1990
|
const manifest = this.get(moduleName);
|
|
1981
|
-
if (!manifest?.dependencies) {
|
|
1991
|
+
if (!manifest?.dependencies || manifest.dependencies.length === 0) {
|
|
1982
1992
|
return { missingModules: [], missingFeatures: [] };
|
|
1983
1993
|
}
|
|
1984
1994
|
const missingModules = [];
|
|
1985
1995
|
const missingFeatures = [];
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1996
|
+
for (const dependency of manifest.dependencies) {
|
|
1997
|
+
// If dependency contains a dot, it's a feature (ModuleName.FeatureKey)
|
|
1998
|
+
if (dependency.includes('.')) {
|
|
1999
|
+
// Convert dependency format (ModuleName.FeatureKey) to feature name format (ModuleName:Feature:FeatureKey)
|
|
2000
|
+
const [moduleName, featureKey] = dependency.split('.');
|
|
2001
|
+
const featureName = `${moduleName}:Feature:${featureKey}`;
|
|
2002
|
+
if (!this.isFeatureDefined(featureName)) {
|
|
2003
|
+
missingFeatures.push(dependency);
|
|
1991
2004
|
}
|
|
1992
2005
|
}
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
if (!this.isFeatureDefined(featureName)) {
|
|
1998
|
-
missingFeatures.push(featureName);
|
|
2006
|
+
else {
|
|
2007
|
+
// Otherwise, it's a module name
|
|
2008
|
+
if (!this.has(dependency)) {
|
|
2009
|
+
missingModules.push(dependency);
|
|
1999
2010
|
}
|
|
2000
2011
|
}
|
|
2001
2012
|
}
|
|
2002
2013
|
return { missingModules, missingFeatures };
|
|
2003
2014
|
}
|
|
2004
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
2005
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
2006
|
-
}
|
|
2007
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
|
|
2008
|
-
type: Injectable,
|
|
2009
|
-
args: [{ providedIn: 'root' }]
|
|
2010
|
-
}] });
|
|
2011
|
-
|
|
2012
|
-
//#region ---- Imports ----
|
|
2013
|
-
//#endregion
|
|
2014
|
-
//#region ---- Initializer ----
|
|
2015
|
-
/**
|
|
2016
|
-
* Startup task to initialize module manifest registry.
|
|
2017
|
-
* Registers this task with app startup service.
|
|
2018
|
-
*/
|
|
2019
|
-
class AXPModuleManifestInitializer {
|
|
2020
|
-
constructor() {
|
|
2021
|
-
//#region ---- Fields ----
|
|
2022
|
-
this.manifestRegistry = inject(AXPModuleManifestRegistry);
|
|
2023
|
-
}
|
|
2024
|
-
//#endregion
|
|
2025
|
-
//#region ---- Public Methods ----
|
|
2026
|
-
/**
|
|
2027
|
-
* Create startup task for manifest initialization.
|
|
2028
|
-
*/
|
|
2029
|
-
createStartupTask() {
|
|
2030
|
-
return {
|
|
2031
|
-
name: 'ModuleManifests',
|
|
2032
|
-
statusText: 'Loading module manifests...',
|
|
2033
|
-
priority: 1, // Load early, before features/permissions
|
|
2034
|
-
run: async () => {
|
|
2035
|
-
await this.manifestRegistry.initialize();
|
|
2036
|
-
},
|
|
2037
|
-
};
|
|
2038
|
-
}
|
|
2039
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestInitializer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2040
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestInitializer, providedIn: 'root' }); }
|
|
2041
|
-
}
|
|
2042
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestInitializer, decorators: [{
|
|
2043
|
-
type: Injectable,
|
|
2044
|
-
args: [{ providedIn: 'root' }]
|
|
2045
|
-
}] });
|
|
2046
|
-
|
|
2047
|
-
//#region ---- Imports ----
|
|
2048
|
-
//#endregion
|
|
2049
|
-
//#region ---- Feature Definition Provider Interface ----
|
|
2050
|
-
/**
|
|
2051
|
-
* Context for feature definition providers.
|
|
2052
|
-
* Allows providers to add additional feature definitions dynamically.
|
|
2053
|
-
*/
|
|
2054
|
-
class AXPFeatureDefinitionProviderContext {
|
|
2055
|
-
constructor() {
|
|
2056
|
-
this.features = new Map();
|
|
2057
|
-
}
|
|
2058
|
-
/**
|
|
2059
|
-
* Add a feature definition.
|
|
2060
|
-
* @param key Full feature key (ModuleName:FeatureKey format with colon separator)
|
|
2061
|
-
* @param definition Feature definition
|
|
2062
|
-
*/
|
|
2063
|
-
addFeature(key, definition) {
|
|
2064
|
-
this.features.set(key, definition);
|
|
2065
|
-
}
|
|
2066
|
-
/**
|
|
2067
|
-
* Get all feature definitions.
|
|
2068
|
-
*/
|
|
2069
|
-
getFeatures() {
|
|
2070
|
-
return this.features;
|
|
2071
|
-
}
|
|
2072
|
-
}
|
|
2073
|
-
/**
|
|
2074
|
-
* Injection token for feature definition providers.
|
|
2075
|
-
*/
|
|
2076
|
-
const AXP_FEATURE_DEFINITION_PROVIDER = new InjectionToken('AXP_FEATURE_DEFINITION_PROVIDER', {
|
|
2077
|
-
providedIn: 'root',
|
|
2078
|
-
factory: () => [],
|
|
2079
|
-
});
|
|
2080
|
-
//#endregion
|
|
2081
|
-
|
|
2082
|
-
//#region ---- Provider Interfaces ----
|
|
2083
|
-
/**
|
|
2084
|
-
* Injection token for edition service.
|
|
2085
|
-
* Modules should provide their implementation using this token.
|
|
2086
|
-
*/
|
|
2087
|
-
const AXP_EDITION_SERVICE = new InjectionToken('AXP_EDITION_SERVICE', {
|
|
2088
|
-
providedIn: 'root',
|
|
2089
|
-
factory: () => {
|
|
2090
|
-
return null;
|
|
2091
|
-
},
|
|
2092
|
-
});
|
|
2093
|
-
/**
|
|
2094
|
-
* Injection token for module provider loader.
|
|
2095
|
-
* Implementation: @acorex/platform/auth
|
|
2096
|
-
*/
|
|
2097
|
-
const AXP_MODULE_PROVIDER_LOADER = new InjectionToken('AXP_MODULE_PROVIDER_LOADER');
|
|
2098
|
-
/**
|
|
2099
|
-
* Injection token for module provider initializer.
|
|
2100
|
-
* Implementation: @acorex/platform/auth
|
|
2101
|
-
*/
|
|
2102
|
-
const AXP_MODULE_PROVIDER_INITIALIZER = new InjectionToken('AXP_MODULE_PROVIDER_INITIALIZER');
|
|
2103
|
-
/**
|
|
2104
|
-
* Injection token for session service.
|
|
2105
|
-
* Implementation: @acorex/platform/auth
|
|
2106
|
-
*/
|
|
2107
|
-
const AXP_SESSION_SERVICE = new InjectionToken('AXP_SESSION_SERVICE');
|
|
2108
|
-
//#endregion
|
|
2109
|
-
|
|
2110
|
-
//#region ---- Imports ----
|
|
2111
|
-
//#endregion
|
|
2112
|
-
//#region ---- Default Implementation ----
|
|
2113
|
-
/**
|
|
2114
|
-
* Default implementation of module access control service.
|
|
2115
|
-
* Checks if module is enabled in edition.modulesAndFeatures.modules.
|
|
2116
|
-
*/
|
|
2117
|
-
class DefaultModuleAccessControlService {
|
|
2118
|
-
checkAccess(moduleName, context) {
|
|
2119
|
-
// Check if module is enabled in edition
|
|
2120
|
-
const enabledModules = context.edition.modulesAndFeatures?.modules || [];
|
|
2121
|
-
return enabledModules.includes(moduleName);
|
|
2122
|
-
}
|
|
2123
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: DefaultModuleAccessControlService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2124
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: DefaultModuleAccessControlService, providedIn: 'root' }); }
|
|
2015
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2016
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestRegistry, providedIn: 'root' }); }
|
|
2125
2017
|
}
|
|
2126
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
2018
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
|
|
2127
2019
|
type: Injectable,
|
|
2128
2020
|
args: [{ providedIn: 'root' }]
|
|
2129
2021
|
}] });
|
|
2130
|
-
//#endregion
|
|
2131
|
-
//#region ---- Injection Token ----
|
|
2132
|
-
/**
|
|
2133
|
-
* Injection token for module access control service.
|
|
2134
|
-
* If not provided, DefaultModuleAccessControlService will be used as fallback.
|
|
2135
|
-
*/
|
|
2136
|
-
const AXP_MODULE_ACCESS_CONTROL_SERVICE = new InjectionToken('AXP_MODULE_ACCESS_CONTROL_SERVICE');
|
|
2137
2022
|
|
|
2138
2023
|
class AXPAppStartUpService {
|
|
2139
2024
|
constructor() {
|
|
@@ -2154,10 +2039,10 @@ class AXPAppStartUpService {
|
|
|
2154
2039
|
loadingText.innerHTML = status;
|
|
2155
2040
|
}
|
|
2156
2041
|
}
|
|
2157
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
2158
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
2042
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPAppStartUpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2043
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPAppStartUpService, providedIn: 'root' }); }
|
|
2159
2044
|
}
|
|
2160
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
2045
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPAppStartUpService, decorators: [{
|
|
2161
2046
|
type: Injectable,
|
|
2162
2047
|
args: [{
|
|
2163
2048
|
providedIn: 'root',
|
|
@@ -2171,6 +2056,41 @@ const AXPAppStartUpProvider = provideAppInitializer(() => {
|
|
|
2171
2056
|
return initializerFn();
|
|
2172
2057
|
});
|
|
2173
2058
|
|
|
2059
|
+
//#region ---- Imports ----
|
|
2060
|
+
//#endregion
|
|
2061
|
+
//#region ---- Module ----
|
|
2062
|
+
/**
|
|
2063
|
+
* Module for managing module manifests initialization.
|
|
2064
|
+
* Handles the registration of manifest startup tasks.
|
|
2065
|
+
*/
|
|
2066
|
+
class AXPModuleManifestModule {
|
|
2067
|
+
/**
|
|
2068
|
+
* @ignore
|
|
2069
|
+
* Initializes module manifest tasks on module construction.
|
|
2070
|
+
*/
|
|
2071
|
+
constructor(appInitService, injector) {
|
|
2072
|
+
const manifestRegistry = injector.get(AXPModuleManifestRegistry);
|
|
2073
|
+
// Register manifest initialization task
|
|
2074
|
+
appInitService.registerTask({
|
|
2075
|
+
name: 'ModuleManifests',
|
|
2076
|
+
statusText: 'Loading module manifests...',
|
|
2077
|
+
priority: 1, // Load early, before features/permissions
|
|
2078
|
+
run: async () => {
|
|
2079
|
+
await manifestRegistry.initialize();
|
|
2080
|
+
},
|
|
2081
|
+
});
|
|
2082
|
+
}
|
|
2083
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestModule, deps: [{ token: AXPAppStartUpService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
2084
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestModule }); }
|
|
2085
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestModule }); }
|
|
2086
|
+
}
|
|
2087
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestModule, decorators: [{
|
|
2088
|
+
type: NgModule,
|
|
2089
|
+
args: [{
|
|
2090
|
+
providers: [],
|
|
2091
|
+
}]
|
|
2092
|
+
}], ctorParameters: () => [{ type: AXPAppStartUpService }, { type: i0.Injector }] });
|
|
2093
|
+
|
|
2174
2094
|
//#region ---- Tag Types ----
|
|
2175
2095
|
//#endregion
|
|
2176
2096
|
|
|
@@ -2322,10 +2242,10 @@ class AXPTagService {
|
|
|
2322
2242
|
const uniqueTags = allTags.filter((tag, index, self) => index === self.findIndex((t) => t.title.toLowerCase() === tag.title.toLowerCase()));
|
|
2323
2243
|
this.cache = uniqueTags;
|
|
2324
2244
|
}
|
|
2325
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
2326
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
2245
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPTagService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2246
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPTagService, providedIn: 'root' }); }
|
|
2327
2247
|
}
|
|
2328
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
2248
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPTagService, decorators: [{
|
|
2329
2249
|
type: Injectable,
|
|
2330
2250
|
args: [{
|
|
2331
2251
|
providedIn: 'root',
|
|
@@ -3288,8 +3208,6 @@ class AXPIconLogoConfig {
|
|
|
3288
3208
|
|
|
3289
3209
|
var AXPPlatformScope;
|
|
3290
3210
|
(function (AXPPlatformScope) {
|
|
3291
|
-
AXPPlatformScope["Environment"] = "C";
|
|
3292
|
-
AXPPlatformScope["Global"] = "G";
|
|
3293
3211
|
AXPPlatformScope["Platform"] = "P";
|
|
3294
3212
|
AXPPlatformScope["Tenant"] = "T";
|
|
3295
3213
|
AXPPlatformScope["User"] = "U";
|
|
@@ -3297,8 +3215,6 @@ var AXPPlatformScope;
|
|
|
3297
3215
|
;
|
|
3298
3216
|
function resolvePlatformScopeKey(name) {
|
|
3299
3217
|
const scopeMap = {
|
|
3300
|
-
environment: AXPPlatformScope.Environment,
|
|
3301
|
-
global: AXPPlatformScope.Global,
|
|
3302
3218
|
platform: AXPPlatformScope.Platform,
|
|
3303
3219
|
tenant: AXPPlatformScope.Tenant,
|
|
3304
3220
|
user: AXPPlatformScope.User,
|
|
@@ -3307,8 +3223,6 @@ function resolvePlatformScopeKey(name) {
|
|
|
3307
3223
|
}
|
|
3308
3224
|
function resolvePlatformScopeName(scope) {
|
|
3309
3225
|
const scopeMap = {
|
|
3310
|
-
C: 'environment',
|
|
3311
|
-
G: 'global',
|
|
3312
3226
|
P: 'platform',
|
|
3313
3227
|
T: 'tenant',
|
|
3314
3228
|
U: 'user',
|
|
@@ -3357,10 +3271,10 @@ class AXPCountdownPipe {
|
|
|
3357
3271
|
updateTargetDate(value) {
|
|
3358
3272
|
this.targetDate = new Date(value).getTime();
|
|
3359
3273
|
}
|
|
3360
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
3361
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.
|
|
3274
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPCountdownPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
3275
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: AXPCountdownPipe, isStandalone: true, name: "countdown", pure: false }); }
|
|
3362
3276
|
}
|
|
3363
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
3277
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPCountdownPipe, decorators: [{
|
|
3364
3278
|
type: Pipe,
|
|
3365
3279
|
args: [{
|
|
3366
3280
|
name: 'countdown',
|
|
@@ -3747,10 +3661,10 @@ class AXPDeviceService {
|
|
|
3747
3661
|
destroy() {
|
|
3748
3662
|
this._removeResizeListener();
|
|
3749
3663
|
}
|
|
3750
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
3751
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
3664
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDeviceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3665
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDeviceService, providedIn: 'root' }); }
|
|
3752
3666
|
}
|
|
3753
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
3667
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDeviceService, decorators: [{
|
|
3754
3668
|
type: Injectable,
|
|
3755
3669
|
args: [{
|
|
3756
3670
|
providedIn: 'root',
|
|
@@ -3854,16 +3768,62 @@ class AXHighlightService {
|
|
|
3854
3768
|
resultHTML += '</span>';
|
|
3855
3769
|
return resultHTML;
|
|
3856
3770
|
}
|
|
3857
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
3858
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
3771
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXHighlightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3772
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXHighlightService, providedIn: 'root' }); }
|
|
3859
3773
|
}
|
|
3860
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
3774
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXHighlightService, decorators: [{
|
|
3861
3775
|
type: Injectable,
|
|
3862
3776
|
args: [{
|
|
3863
3777
|
providedIn: 'root',
|
|
3864
3778
|
}]
|
|
3865
3779
|
}], ctorParameters: () => [] });
|
|
3866
3780
|
|
|
3781
|
+
/**
|
|
3782
|
+
* Creates a provider instance within an injection context.
|
|
3783
|
+
* Handles dynamic import, injector resolution, and provider instantiation.
|
|
3784
|
+
*
|
|
3785
|
+
* @param loader - Function that returns a promise resolving to the provider class
|
|
3786
|
+
* @returns Promise that resolves to the provider instance
|
|
3787
|
+
*
|
|
3788
|
+
* @example
|
|
3789
|
+
* ```typescript
|
|
3790
|
+
* useFactory: () => createProviderWithInjectionContext(() =>
|
|
3791
|
+
* import('./settings.provider').then(m => m.AXMSettingProvider)
|
|
3792
|
+
* )
|
|
3793
|
+
* ```
|
|
3794
|
+
*/
|
|
3795
|
+
async function createProviderWithInjectionContext(loader) {
|
|
3796
|
+
const injector = inject(Injector);
|
|
3797
|
+
const ProviderClass = await loader();
|
|
3798
|
+
return runInInjectionContext(injector, () => new ProviderClass());
|
|
3799
|
+
}
|
|
3800
|
+
/**
|
|
3801
|
+
* Creates a provider configuration for lazy-loaded providers with injection context.
|
|
3802
|
+
* Simplifies provider registration in NgModule providers array.
|
|
3803
|
+
*
|
|
3804
|
+
* @param token - The injection token to provide
|
|
3805
|
+
* @param loader - Function that returns a promise resolving to the provider class
|
|
3806
|
+
* @param multi - Whether the provider is multi-provider (defaults to true)
|
|
3807
|
+
* @returns Provider configuration object
|
|
3808
|
+
*
|
|
3809
|
+
* @example
|
|
3810
|
+
* ```typescript
|
|
3811
|
+
* providers: [
|
|
3812
|
+
* provideLazyProvider(
|
|
3813
|
+
* AXP_SETTING_DEFINITION_PROVIDER,
|
|
3814
|
+
* () => import('./settings.provider').then(m => m.AXMSettingProvider)
|
|
3815
|
+
* )
|
|
3816
|
+
* ]
|
|
3817
|
+
* ```
|
|
3818
|
+
*/
|
|
3819
|
+
function provideLazyProvider(token, loader, multi = true) {
|
|
3820
|
+
return {
|
|
3821
|
+
provide: token,
|
|
3822
|
+
useFactory: () => createProviderWithInjectionContext(loader),
|
|
3823
|
+
multi,
|
|
3824
|
+
};
|
|
3825
|
+
}
|
|
3826
|
+
|
|
3867
3827
|
function extractTextFromHtml(value) {
|
|
3868
3828
|
const div = document.createElement('div');
|
|
3869
3829
|
div.innerHTML = value;
|
|
@@ -3886,5 +3846,5 @@ function generateKebabCase(title) {
|
|
|
3886
3846
|
* Generated bundle index. Do not edit.
|
|
3887
3847
|
*/
|
|
3888
3848
|
|
|
3889
|
-
export {
|
|
3849
|
+
export { AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPColorPaletteProvider, AXPColorPaletteService, AXPColumnWidthService, AXPComponentLogoConfig, AXPContentCheckerDirective, AXPContextChangeEvent, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDblClickDirective, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPExportTemplateToken, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPImageUrlLogoConfig, AXPModuleManifestModule, AXPModuleManifestRegistry, AXPPlatformScope, AXPScreenSize, AXPSystemActionType, AXPSystemActions, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_COLUMN_WIDTH_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_MODULE_MANIFEST_PROVIDER, AXP_SESSION_SERVICE, AXP_TAG_PROVIDER, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, cleanDeep, createProviderWithInjectionContext, defaultColumnWidthProvider, extractNestedFieldsWildcard, extractTextFromHtml, extractValue, generateKebabCase, getActionButton, getChangedPaths, getDetailedChanges, getEnumValues, getNestedKeys, getSmart, getSystemActions, objectKeyValueTransforms, provideLazyProvider, resolveActionLook, resolvePlatformScopeKey, resolvePlatformScopeName, setSmart };
|
|
3890
3850
|
//# sourceMappingURL=acorex-platform-core.mjs.map
|