@acorex/platform 21.0.0-next.1 → 21.0.0-next.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/auth/index.d.ts +235 -5
  2. package/common/index.d.ts +220 -218
  3. package/core/index.d.ts +370 -434
  4. package/fesm2022/acorex-platform-auth.mjs +200 -37
  5. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  6. package/fesm2022/{acorex-platform-common-common-settings.provider-zhqNP3xb.mjs → acorex-platform-common-common-settings.provider-O8usQ0VC.mjs} +4 -4
  7. package/fesm2022/{acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map → acorex-platform-common-common-settings.provider-O8usQ0VC.mjs.map} +1 -1
  8. package/fesm2022/acorex-platform-common.mjs +215 -198
  9. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-core.mjs +548 -585
  11. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-domain.mjs +16 -16
  13. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-builder.mjs +84 -37
  15. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-components.mjs +303 -195
  17. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  18. package/fesm2022/acorex-platform-layout-designer.mjs +72 -72
  19. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-layout-entity.mjs +3528 -1698
  21. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  22. package/fesm2022/acorex-platform-layout-views.mjs +25 -17
  23. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  24. package/fesm2022/acorex-platform-layout-widget-core.mjs +190 -110
  25. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  26. 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
  27. 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
  28. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs → acorex-platform-layout-widgets-file-list-popup.component-CCcKHSHj.mjs} +4 -4
  29. 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
  30. package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs → acorex-platform-layout-widgets-image-preview.popup-IrT52Nh1.mjs} +4 -4
  31. package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map → acorex-platform-layout-widgets-image-preview.popup-IrT52Nh1.mjs.map} +1 -1
  32. 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
  33. 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
  34. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-Dw6naXvq.mjs +111 -0
  35. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-Dw6naXvq.mjs.map +1 -0
  36. 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
  37. 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
  38. 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
  39. 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
  40. 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
  41. 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
  42. package/fesm2022/acorex-platform-layout-widgets.mjs +2247 -1226
  43. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  44. package/fesm2022/acorex-platform-native.mjs +7 -7
  45. package/fesm2022/acorex-platform-native.mjs.map +1 -1
  46. package/fesm2022/acorex-platform-runtime.mjs +43 -43
  47. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  48. 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
  49. 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
  50. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs → acorex-platform-themes-default-entity-master-list-view.component-CD4Q_UIG.mjs} +13 -13
  51. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-CD4Q_UIG.mjs.map +1 -0
  52. 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
  53. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-D5BYbUGK.mjs.map +1 -0
  54. 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
  55. 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
  56. package/fesm2022/{acorex-platform-themes-default-error-401.component-cfREo88K.mjs → acorex-platform-themes-default-error-401.component-DdMToZ9q.mjs} +4 -4
  57. package/fesm2022/{acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map → acorex-platform-themes-default-error-401.component-DdMToZ9q.mjs.map} +1 -1
  58. package/fesm2022/{acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs → acorex-platform-themes-default-error-404.component-CKsa5aPE.mjs} +4 -4
  59. package/fesm2022/{acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map → acorex-platform-themes-default-error-404.component-CKsa5aPE.mjs.map} +1 -1
  60. package/fesm2022/{acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs → acorex-platform-themes-default-error-offline.component-1gxFTAuX.mjs} +4 -4
  61. package/fesm2022/{acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map → acorex-platform-themes-default-error-offline.component-1gxFTAuX.mjs.map} +1 -1
  62. package/fesm2022/acorex-platform-themes-default.mjs +39 -42
  63. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  64. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs → acorex-platform-themes-shared-icon-chooser-column.component-Ds8eRMuV.mjs} +4 -4
  65. 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
  66. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs → acorex-platform-themes-shared-icon-chooser-view.component-Dv38sOzr.mjs} +4 -4
  67. 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
  68. 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
  69. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-DcO6P6OG.mjs.map +1 -0
  70. 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
  71. 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
  72. package/fesm2022/acorex-platform-themes-shared.mjs +41 -41
  73. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  74. package/fesm2022/acorex-platform-workflow.mjs +1529 -1758
  75. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  76. package/layout/builder/index.d.ts +15 -3
  77. package/layout/components/index.d.ts +23 -6
  78. package/layout/entity/index.d.ts +438 -159
  79. package/layout/views/index.d.ts +16 -11
  80. package/layout/widget-core/index.d.ts +47 -10
  81. package/layout/widgets/index.d.ts +213 -42
  82. package/package.json +5 -5
  83. package/themes/default/index.d.ts +0 -1
  84. package/workflow/index.d.ts +1050 -1759
  85. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-DyDa_hyd.mjs.map +0 -1
  86. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
  87. 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, input, effect, Directive, EventEmitter, HostListener, Output, ViewContainerRef, ElementRef, signal, output, DestroyRef, Renderer2, untracked, Injector, runInInjectionContext, provideAppInitializer, Pipe } from '@angular/core';
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, isNil, isObjectLike, transform, isEmpty, isEqual, differenceWith, union, cloneDeep, isUndefined, endsWith, startsWith, includes, lte, gte, lt, gt, orderBy } from 'lodash-es';
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.12", ngImport: i0, type: AXPActivityLogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
21
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPActivityLogService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPActivityLogService, decorators: [{
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.12", ngImport: i0, type: AXPColorPaletteService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
174
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPColorPaletteService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPColorPaletteService, decorators: [{
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.12", ngImport: i0, type: AXPDefaultColorPalettesProvider, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
292
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDefaultColorPalettesProvider }); }
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.12", ngImport: i0, type: AXPDefaultColorPalettesProvider, decorators: [{
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 (backward compatibility)
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.12", ngImport: i0, type: AXPDataSourceDefinitionProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
977
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDataSourceDefinitionProviderService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPDataSourceDefinitionProviderService, decorators: [{
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
- class AXPElementDataDirective {
985
- constructor(elementRef) {
986
- this.elementRef = elementRef;
987
- this.data = input(null, ...(ngDevMode ? [{ debugName: "data", alias: 'axp-data' }] : [{ alias: 'axp-data' }]));
988
- this.path = input('__data__', ...(ngDevMode ? [{ debugName: "path", alias: 'axp-data-path' }] : [{ alias: 'axp-data-path' }]));
989
- // Effect to update element data when inputs change
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.12", ngImport: i0, type: AXPElementDataDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
1013
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.12", 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 }); }
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.12", ngImport: i0, type: AXPElementDataDirective, decorators: [{
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-data]',
1019
- standalone: true
1117
+ selector: '[axp-content-checker]',
1118
+ standalone: true,
1119
+ exportAs: 'checker'
1020
1120
  }]
1021
- }], 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 }] }] } });
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.12", ngImport: i0, type: AXPDblClickDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1045
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.12", type: AXPDblClickDirective, isStandalone: true, selector: "[onDblClick]", outputs: { onDblClick: "onDblClick" }, host: { listeners: { "dblclick": "handleOnDblClick($event)", "touchend": "onTouchEnd($event)" } }, ngImport: i0 }); }
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.12", ngImport: i0, type: AXPDblClickDirective, decorators: [{
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.12", ngImport: i0, type: AXPGridLayoutDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
1112
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.12", 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 }); }
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.12", ngImport: i0, type: AXPGridLayoutDirective, decorators: [{
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.12", ngImport: i0, type: AXPDistributedEventListenerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1475
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDistributedEventListenerService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPDistributedEventListenerService, decorators: [{
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.12", ngImport: i0, type: AXPBroadcastEventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1602
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPBroadcastEventService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPBroadcastEventService, decorators: [{
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.12", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1644
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPExpressionEvaluatorScopeProviderService, decorators: [{
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.12", ngImport: i0, type: AXPExpressionEvaluatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1756
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPExpressionEvaluatorService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPExpressionEvaluatorService, decorators: [{
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.12", ngImport: i0, type: AXPHookService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1810
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPHookService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPHookService, decorators: [{
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 ---- Imports ----
1821
- //#endregion
1822
- //#region ---- Injection Token ----
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
- //#region ---- Default Provider ----
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 featuresProvider.
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,166 +1984,42 @@ 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
- // Check module dependencies
1987
- if (manifest.dependencies.modules) {
1988
- for (const depModule of manifest.dependencies.modules) {
1989
- if (!this.has(depModule)) {
1990
- missingModules.push(depModule);
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
- // Check feature dependencies
1995
- if (manifest.dependencies.features) {
1996
- for (const featureName of manifest.dependencies.features) {
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.12", ngImport: i0, type: AXPModuleManifestRegistry, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2005
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestRegistry, 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' }); }
2006
2017
  }
2007
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
2018
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPModuleManifestRegistry, decorators: [{
2008
2019
  type: Injectable,
2009
2020
  args: [{ providedIn: 'root' }]
2010
2021
  }] });
2011
2022
 
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' }); }
2125
- }
2126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: DefaultModuleAccessControlService, decorators: [{
2127
- type: Injectable,
2128
- args: [{ providedIn: 'root' }]
2129
- }] });
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
-
2138
2023
  class AXPAppStartUpService {
2139
2024
  constructor() {
2140
2025
  this.tasks = [];
@@ -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.12", ngImport: i0, type: AXPAppStartUpService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2158
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPAppStartUpService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPAppStartUpService, decorators: [{
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.12", ngImport: i0, type: AXPTagService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2326
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPTagService, providedIn: 'root' }); }
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.12", ngImport: i0, type: AXPTagService, decorators: [{
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',
@@ -3257,6 +3177,9 @@ function getNestedKeys(obj, prefix = '') {
3257
3177
  return keys;
3258
3178
  }
3259
3179
 
3180
+ //#region ---- Imports ----
3181
+ //#endregion
3182
+
3260
3183
  function applySystemActionDefault(action, type) {
3261
3184
  const systemAction = getSystemActions(type);
3262
3185
  return {
@@ -3288,8 +3211,6 @@ class AXPIconLogoConfig {
3288
3211
 
3289
3212
  var AXPPlatformScope;
3290
3213
  (function (AXPPlatformScope) {
3291
- AXPPlatformScope["Environment"] = "C";
3292
- AXPPlatformScope["Global"] = "G";
3293
3214
  AXPPlatformScope["Platform"] = "P";
3294
3215
  AXPPlatformScope["Tenant"] = "T";
3295
3216
  AXPPlatformScope["User"] = "U";
@@ -3297,8 +3218,6 @@ var AXPPlatformScope;
3297
3218
  ;
3298
3219
  function resolvePlatformScopeKey(name) {
3299
3220
  const scopeMap = {
3300
- environment: AXPPlatformScope.Environment,
3301
- global: AXPPlatformScope.Global,
3302
3221
  platform: AXPPlatformScope.Platform,
3303
3222
  tenant: AXPPlatformScope.Tenant,
3304
3223
  user: AXPPlatformScope.User,
@@ -3307,8 +3226,6 @@ function resolvePlatformScopeKey(name) {
3307
3226
  }
3308
3227
  function resolvePlatformScopeName(scope) {
3309
3228
  const scopeMap = {
3310
- C: 'environment',
3311
- G: 'global',
3312
3229
  P: 'platform',
3313
3230
  T: 'tenant',
3314
3231
  U: 'user',
@@ -3357,10 +3274,10 @@ class AXPCountdownPipe {
3357
3274
  updateTargetDate(value) {
3358
3275
  this.targetDate = new Date(value).getTime();
3359
3276
  }
3360
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPCountdownPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
3361
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.12", ngImport: i0, type: AXPCountdownPipe, isStandalone: true, name: "countdown", pure: false }); }
3277
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPCountdownPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
3278
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: AXPCountdownPipe, isStandalone: true, name: "countdown", pure: false }); }
3362
3279
  }
3363
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPCountdownPipe, decorators: [{
3280
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPCountdownPipe, decorators: [{
3364
3281
  type: Pipe,
3365
3282
  args: [{
3366
3283
  name: 'countdown',
@@ -3747,10 +3664,10 @@ class AXPDeviceService {
3747
3664
  destroy() {
3748
3665
  this._removeResizeListener();
3749
3666
  }
3750
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDeviceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3751
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDeviceService, providedIn: 'root' }); }
3667
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDeviceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3668
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDeviceService, providedIn: 'root' }); }
3752
3669
  }
3753
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXPDeviceService, decorators: [{
3670
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXPDeviceService, decorators: [{
3754
3671
  type: Injectable,
3755
3672
  args: [{
3756
3673
  providedIn: 'root',
@@ -3854,16 +3771,62 @@ class AXHighlightService {
3854
3771
  resultHTML += '</span>';
3855
3772
  return resultHTML;
3856
3773
  }
3857
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXHighlightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3858
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXHighlightService, providedIn: 'root' }); }
3774
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXHighlightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3775
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXHighlightService, providedIn: 'root' }); }
3859
3776
  }
3860
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: AXHighlightService, decorators: [{
3777
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXHighlightService, decorators: [{
3861
3778
  type: Injectable,
3862
3779
  args: [{
3863
3780
  providedIn: 'root',
3864
3781
  }]
3865
3782
  }], ctorParameters: () => [] });
3866
3783
 
3784
+ /**
3785
+ * Creates a provider instance within an injection context.
3786
+ * Handles dynamic import, injector resolution, and provider instantiation.
3787
+ *
3788
+ * @param loader - Function that returns a promise resolving to the provider class
3789
+ * @returns Promise that resolves to the provider instance
3790
+ *
3791
+ * @example
3792
+ * ```typescript
3793
+ * useFactory: () => createProviderWithInjectionContext(() =>
3794
+ * import('./settings.provider').then(m => m.AXMSettingProvider)
3795
+ * )
3796
+ * ```
3797
+ */
3798
+ async function createProviderWithInjectionContext(loader) {
3799
+ const injector = inject(Injector);
3800
+ const ProviderClass = await loader();
3801
+ return runInInjectionContext(injector, () => new ProviderClass());
3802
+ }
3803
+ /**
3804
+ * Creates a provider configuration for lazy-loaded providers with injection context.
3805
+ * Simplifies provider registration in NgModule providers array.
3806
+ *
3807
+ * @param token - The injection token to provide
3808
+ * @param loader - Function that returns a promise resolving to the provider class
3809
+ * @param multi - Whether the provider is multi-provider (defaults to true)
3810
+ * @returns Provider configuration object
3811
+ *
3812
+ * @example
3813
+ * ```typescript
3814
+ * providers: [
3815
+ * provideLazyProvider(
3816
+ * AXP_SETTING_DEFINITION_PROVIDER,
3817
+ * () => import('./settings.provider').then(m => m.AXMSettingProvider)
3818
+ * )
3819
+ * ]
3820
+ * ```
3821
+ */
3822
+ function provideLazyProvider(token, loader, multi = true) {
3823
+ return {
3824
+ provide: token,
3825
+ useFactory: () => createProviderWithInjectionContext(loader),
3826
+ multi,
3827
+ };
3828
+ }
3829
+
3867
3830
  function extractTextFromHtml(value) {
3868
3831
  const div = document.createElement('div');
3869
3832
  div.innerHTML = value;
@@ -3886,5 +3849,5 @@ function generateKebabCase(title) {
3886
3849
  * Generated bundle index. Do not edit.
3887
3850
  */
3888
3851
 
3889
- export { AXFullscreenDirective, AXHighlightService, AXPActivityLogProvider, AXPActivityLogService, AXPAppStartUpProvider, AXPAppStartUpService, AXPBroadcastEventService, AXPColorPaletteProvider, AXPColorPaletteService, AXPComponentLogoConfig, AXPContentCheckerDirective, AXPContextChangeEvent, AXPContextStore, AXPCountdownPipe, AXPDataGenerator, AXPDataSourceDefinitionProviderService, AXPDblClickDirective, AXPDefaultColorPalettesProvider, AXPDeviceService, AXPDeviceType, AXPDistributedEventListenerService, AXPElementDataDirective, AXPExportTemplateToken, AXPExpressionEvaluatorScopeProviderContext, AXPExpressionEvaluatorScopeProviderService, AXPExpressionEvaluatorService, AXPFeatureDefinitionProviderContext, AXPGridLayoutDirective, AXPHookService, AXPIconLogoConfig, AXPImageUrlLogoConfig, AXPModuleManifestInitializer, AXPModuleManifestRegistry, AXPModuleProviderRegistry, AXPPlatformScope, AXPScreenSize, AXPSystemActionType, AXPSystemActions, AXPTagProvider, AXPTagService, AXP_ACTIVITY_LOG_PROVIDER, AXP_COLOR_PALETTE_PROVIDER, AXP_DATASOURCE_DEFINITION_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, AXP_EDITION_SERVICE, AXP_EXPRESSION_EVALUATOR_SCOPE_PROVIDER, AXP_FEATURE_DEFINITION_PROVIDER, AXP_MODULE_ACCESS_CONTROL_SERVICE, AXP_MODULE_MANIFEST_PROVIDER, AXP_MODULE_PROVIDER_INITIALIZER, AXP_MODULE_PROVIDER_LOADER, AXP_SESSION_SERVICE, AXP_TAG_PROVIDER, DefaultModuleAccessControlService, applyFilterArray, applyPagination, applyQueryArray, applySortArray, applySystemActionDefault, cleanDeep, extractNestedFieldsWildcard, extractTextFromHtml, extractValue, generateKebabCase, getActionButton, getChangedPaths, getDetailedChanges, getEnumValues, getNestedKeys, getSmart, getSystemActions, objectKeyValueTransforms, resolveActionLook, resolvePlatformScopeKey, resolvePlatformScopeName, setSmart };
3852
+ 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
3853
  //# sourceMappingURL=acorex-platform-core.mjs.map