@acorex/platform 21.0.0-next.85 → 21.0.0-next.89

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 (81) hide show
  1. package/fesm2022/acorex-platform-auth.mjs +9 -3
  2. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  3. package/fesm2022/{acorex-platform-common-common-settings.provider-Ytey9uhY.mjs → acorex-platform-common-common-settings.provider-DilV4dql.mjs} +16 -3
  4. package/fesm2022/acorex-platform-common-common-settings.provider-DilV4dql.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-common.mjs +3426 -2488
  6. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-contracts.mjs +1160 -9
  8. package/fesm2022/acorex-platform-contracts.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-core.mjs +826 -152
  10. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-domain-contracts.mjs +58 -0
  12. package/fesm2022/acorex-platform-domain-contracts.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-domain.mjs +2 -50
  14. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  15. package/fesm2022/acorex-platform-layout-builder.mjs +98 -189
  16. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  17. package/fesm2022/{acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs → acorex-platform-layout-components-binding-expression-editor-popup.component-RttFwaw9.mjs} +17 -4
  18. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-RttFwaw9.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-layout-components.mjs +181 -46
  20. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  21. package/fesm2022/acorex-platform-layout-designer.mjs +7 -6
  22. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  23. package/fesm2022/acorex-platform-layout-entity-attachments-page.component-CwG6n_Yb.mjs.map +1 -1
  24. package/fesm2022/acorex-platform-layout-entity-contracts.mjs +1208 -0
  25. package/fesm2022/acorex-platform-layout-entity-contracts.mjs.map +1 -0
  26. package/fesm2022/acorex-platform-layout-entity-file-list-popup.component--IeMZLIr.mjs.map +1 -1
  27. package/fesm2022/acorex-platform-layout-entity.mjs +1080 -889
  28. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  29. package/fesm2022/acorex-platform-layout-views.mjs +1150 -247
  30. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  31. package/fesm2022/acorex-platform-layout-widget-core.mjs +388 -207
  32. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  33. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-CFyfix31.mjs +513 -0
  34. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-CFyfix31.mjs.map +1 -0
  35. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-DjpZU6gz.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-CZc2zFlg.mjs} +4 -4
  36. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-CZc2zFlg.mjs.map +1 -0
  37. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-gX-3Kx9I.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-XWRUVoL4.mjs} +2 -2
  38. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-gX-3Kx9I.mjs.map → acorex-platform-layout-widgets-tabular-data-view-popup.component-XWRUVoL4.mjs.map} +1 -1
  39. package/fesm2022/acorex-platform-layout-widgets.mjs +1541 -394
  40. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  41. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  42. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs → acorex-platform-themes-default-entity-master-single-view.component-DrUwqKKA.mjs} +2 -3
  43. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-DrUwqKKA.mjs.map +1 -0
  44. package/fesm2022/acorex-platform-themes-default.mjs +956 -115
  45. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  46. package/fesm2022/{acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs → acorex-platform-themes-shared-settings.provider-UyKdkeyk.mjs} +50 -3
  47. package/fesm2022/acorex-platform-themes-shared-settings.provider-UyKdkeyk.mjs.map +1 -0
  48. package/fesm2022/acorex-platform-themes-shared.mjs +104 -24
  49. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  50. package/fesm2022/acorex-platform-workflow.mjs +6 -8
  51. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  52. package/package.json +9 -5
  53. package/types/acorex-platform-auth.d.ts +3 -1
  54. package/types/acorex-platform-common.d.ts +655 -1268
  55. package/types/acorex-platform-contracts.d.ts +1791 -260
  56. package/types/acorex-platform-core.d.ts +2302 -2800
  57. package/types/acorex-platform-domain-contracts.d.ts +416 -0
  58. package/types/acorex-platform-domain.d.ts +4 -415
  59. package/types/acorex-platform-layout-builder.d.ts +11 -20
  60. package/types/acorex-platform-layout-components.d.ts +29 -5
  61. package/types/acorex-platform-layout-designer.d.ts +2 -1
  62. package/types/acorex-platform-layout-entity-contracts.d.ts +889 -0
  63. package/types/acorex-platform-layout-entity.d.ts +143 -275
  64. package/types/acorex-platform-layout-views.d.ts +147 -31
  65. package/types/acorex-platform-layout-widget-core.d.ts +74 -14
  66. package/types/acorex-platform-layout-widgets.d.ts +136 -38
  67. package/types/acorex-platform-runtime.d.ts +1 -1
  68. package/types/acorex-platform-themes-default.d.ts +227 -73
  69. package/types/acorex-platform-themes-shared.d.ts +4 -0
  70. package/types/acorex-platform-workflow.d.ts +5 -18
  71. package/fesm2022/acorex-platform-common-common-settings.provider-Ytey9uhY.mjs.map +0 -1
  72. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +0 -1
  73. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs +0 -116
  74. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs.map +0 -1
  75. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-DjpZU6gz.mjs.map +0 -1
  76. package/fesm2022/acorex-platform-native.mjs +0 -155
  77. package/fesm2022/acorex-platform-native.mjs.map +0 -1
  78. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs.map +0 -1
  79. package/fesm2022/acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs.map +0 -1
  80. package/native/README.md +0 -4
  81. package/types/acorex-platform-native.d.ts +0 -28
@@ -1,28 +1,28 @@
1
1
  import * as _ngrx_signals from '@ngrx/signals';
2
2
  import * as _angular_core from '@angular/core';
3
- import { Signal, OnInit, OnDestroy } from '@angular/core';
3
+ import { Signal, InjectionToken, OnInit, OnDestroy } from '@angular/core';
4
4
  import * as _acorex_platform_themes_shared from '@acorex/platform/themes/shared';
5
5
  import { AXClickEvent } from '@acorex/cdk/common';
6
+ import { AXPTabNavigationService, AXPHomePageService, AXPSettingsService, AXPTabPreviewService, AXPUnsavedChangesConfirmService, AXPBrowserTitleService, AXPEntityCommandScope } from '@acorex/platform/common';
6
7
  import * as i1 from '@acorex/cdk/drawer';
7
8
  import { AXDrawerItemDirective } from '@acorex/cdk/drawer';
9
+ import { AXPBreadcrumbItem, AXPMultiLanguageString, AXPBadge, AXPPageStatus, AXPBackButton, AXPExecuteCommand, AXPExecuteCommandResult } from '@acorex/platform/contracts';
8
10
  import * as _acorex_platform_core from '@acorex/platform/core';
9
- import { AXPActionMenuItem, AXPBreadcrumbItem, AXPMultiLanguageString, AXPBadge, AXPPageStatus, AXPBackButton, AXPExecuteCommand, AXPDeviceService, AXPKeyboardShortcut, AXPExecuteCommandResult, AXPExpressionEvaluatorScope, AXPBroadcastEventService, AXPContextChangeEvent, AXPKeyboardShortcutChord } from '@acorex/platform/core';
11
+ import { AXPActionMenuItem, AXPDeviceService, AXPKeyboardShortcut, AXPExpressionEvaluatorScope, AXPBroadcastEventService, AXPContextChangeEvent, AXPKeyboardShortcutChord } from '@acorex/platform/core';
10
12
  import { AXPCommandService, AXPPolicyEngineService } from '@acorex/platform/runtime';
11
13
  import { AXPWorkflowService } from '@acorex/platform/workflow';
12
- import * as _acorex_core_translation from '@acorex/core/translation';
13
- import { AXTranslationService } from '@acorex/core/translation';
14
14
  import { AXToastService } from '@acorex/components/toast';
15
15
  import { AXFormatService } from '@acorex/core/format';
16
+ import { AXTranslationService } from '@acorex/core/translation';
16
17
  import { AXPSessionService } from '@acorex/platform/auth';
17
- import { AXPHomePageService, AXPSettingsService, AXPEntityCommandScope } from '@acorex/platform/common';
18
+ import * as _angular_router from '@angular/router';
19
+ import { Router, ActivatedRoute } from '@angular/router';
18
20
  import { AXBasePageComponent } from '@acorex/components/page';
19
21
  import * as _acorex_platform_layout_widget_core from '@acorex/platform/layout/widget-core';
20
22
  import { AXPWidgetNode, AXPPageStatus as AXPPageStatus$1, AXPWidgetContainerComponent } from '@acorex/platform/layout/widget-core';
21
23
  import * as _acorex_platform_layout_views from '@acorex/platform/layout/views';
22
24
  import { AXFormComponent } from '@acorex/components/form';
23
25
  import { AXTabStripChangedEvent } from '@acorex/components/tabs';
24
- import * as _angular_router from '@angular/router';
25
- import { Router, ActivatedRoute } from '@angular/router';
26
26
 
27
27
  declare abstract class AXPPageLayoutBase {
28
28
  abstract primaryMenuItems: Signal<AXPActionMenuItem[]>;
@@ -82,6 +82,7 @@ declare class AXPPageLayoutComponent {
82
82
  isSystemMode: _angular_core.Signal<boolean>;
83
83
  isSideMenuOpen: _angular_core.Signal<boolean>;
84
84
  isOverlayLoading: _angular_core.Signal<boolean>;
85
+ overlayTaskCount: _angular_core.Signal<number>;
85
86
  isNavigationLoading: _angular_core.Signal<boolean>;
86
87
  isMenuHorizontal: _angular_core.Signal<boolean>;
87
88
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -95,6 +96,7 @@ declare class AXPPageLayoutComponent {
95
96
  toggleSideMenu: () => void;
96
97
  setNavigationLoading: (value: boolean, delay?: number) => void;
97
98
  setOverlayLoading: (value: boolean, delay?: number) => void;
99
+ clearOverlayLoading: () => void;
98
100
  loadSettings: () => Promise<void>;
99
101
  } & _ngrx_signals.StateSource<{
100
102
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -117,6 +119,7 @@ declare class AXPPageLayoutComponent {
117
119
  isPrinting: boolean;
118
120
  }>;
119
121
  protected deviceService: AXPDeviceService;
122
+ protected tabNavigation: AXPTabNavigationService;
120
123
  protected startSideDrawer: _angular_core.Signal<AXDrawerItemDirective | undefined>;
121
124
  protected workflow: AXPWorkflowService;
122
125
  protected commandService: AXPCommandService;
@@ -165,6 +168,7 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
165
168
  isSystemMode: _angular_core.Signal<boolean>;
166
169
  isSideMenuOpen: _angular_core.Signal<boolean>;
167
170
  isOverlayLoading: _angular_core.Signal<boolean>;
171
+ overlayTaskCount: _angular_core.Signal<number>;
168
172
  isNavigationLoading: _angular_core.Signal<boolean>;
169
173
  isMenuHorizontal: _angular_core.Signal<boolean>;
170
174
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -178,6 +182,7 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
178
182
  toggleSideMenu: () => void;
179
183
  setNavigationLoading: (value: boolean, delay?: number) => void;
180
184
  setOverlayLoading: (value: boolean, delay?: number) => void;
185
+ clearOverlayLoading: () => void;
181
186
  loadSettings: () => Promise<void>;
182
187
  } & _ngrx_signals.StateSource<{
183
188
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -206,26 +211,65 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
206
211
  protected readonly homePageService: AXPHomePageService;
207
212
  protected readonly policyService: AXPPolicyEngineService;
208
213
  protected readonly settingsService: AXPSettingsService;
214
+ protected readonly tabNavigation: AXPTabNavigationService;
215
+ protected readonly tabPreviewService: AXPTabPreviewService;
216
+ protected readonly unsavedChangesConfirm: AXPUnsavedChangesConfirmService;
217
+ protected readonly browserTitleService: AXPBrowserTitleService;
218
+ protected readonly router: Router;
219
+ private readonly pageLayoutDestroyRef;
209
220
  private _updateTrigger;
221
+ /** Tab key captured at page init — stable while the route instance is cached. */
222
+ private readonly pageTabKey;
210
223
  protected updateTrigger: _angular_core.Signal<number>;
211
224
  protected recompute(): void;
212
225
  ngOnInit(): Promise<void>;
213
- title: _angular_core.WritableSignal<_acorex_core_translation.AXMultiLanguageString>;
226
+ /** Maps the home-page route to the pinned home tab key instead of a path-based key. */
227
+ private resolvePageTabKey;
228
+ /** Stable tab key for this cached page instance (tabular mode). */
229
+ protected getPageTabKey(): string | null;
230
+ protected publishTabStructuredPreview(tabKey: string, input: {
231
+ titleValue: AXPMultiLanguageString;
232
+ descriptionValue: AXPMultiLanguageString | null;
233
+ icon: string | null;
234
+ breadcrumbItems: AXPBreadcrumbItem[];
235
+ isDirty: boolean;
236
+ }): Promise<void>;
237
+ protected resolveMultiLanguageText(value: AXPMultiLanguageString | null | undefined, fallback: string): Promise<string>;
238
+ /** Resolves i18n keys (`@scope:key`); returns plain text unchanged. */
239
+ protected translateTextIfKey(text: string): Promise<string>;
240
+ title: _angular_core.WritableSignal<AXPMultiLanguageString>;
214
241
  titleIcon: _angular_core.WritableSignal<string | null>;
215
242
  protected getPageTitle(): AXPMultiLanguageString | Promise<AXPMultiLanguageString>;
216
243
  protected getPageIcon(): string | null | Promise<string | null>;
217
244
  hasTitle: _angular_core.Signal<boolean>;
218
245
  hasTitleIcon: _angular_core.Signal<boolean>;
219
- description: _angular_core.WritableSignal<_acorex_core_translation.AXMultiLanguageString | null>;
246
+ /** Publishes the page title to the browser tab when this instance is the active route. */
247
+ protected publishBrowserTitleIfActive(): Promise<void>;
248
+ /** True when this cached page instance matches the current router location. */
249
+ protected isActivePageForBrowserTitle(): boolean;
250
+ description: _angular_core.WritableSignal<AXPMultiLanguageString | null>;
220
251
  hasDescription: _angular_core.Signal<boolean>;
221
252
  protected getPageDescription(): AXPMultiLanguageString | null | Promise<AXPMultiLanguageString | null>;
222
253
  private defaultBreadCrumbs;
223
254
  breadcrumbs: _angular_core.WritableSignal<AXPBreadcrumbItem[]>;
224
255
  hasBreadcrumbs: _angular_core.Signal<boolean>;
225
256
  protected getPageBreadcrumbs(): AXPBreadcrumbItem[] | Promise<AXPBreadcrumbItem[]>;
257
+ /** Collects resolved breadcrumb labels (Home excluded upstream) for tab chrome. */
258
+ protected resolveBreadcrumbTabTitleSegments(pageBreadcrumbs: AXPBreadcrumbItem[]): Promise<string[]>;
259
+ /** Joins breadcrumb segments as the stored tab title string. */
260
+ protected resolveBreadcrumbTabTitle(pageBreadcrumbs: AXPBreadcrumbItem[]): Promise<string | null>;
261
+ /** Resolves a breadcrumb label the same way as page chrome (`t(item.title)`). */
262
+ protected resolveBreadcrumbItemTitle(item: AXPBreadcrumbItem | undefined): Promise<string | null>;
263
+ /** Fallback tab label from the page title when breadcrumbs are not ready yet. */
264
+ protected resolvePageTitleForTab(): Promise<string | null>;
226
265
  badge: _angular_core.WritableSignal<AXPBadge | null>;
227
266
  hasBadge: _angular_core.Signal<boolean>;
228
267
  hasUnsavedChanges(): boolean;
268
+ /**
269
+ * Confirms closing this page as a background tab (no router navigation).
270
+ * Override when dirty detection differs from {@link hasUnsavedChanges}.
271
+ */
272
+ onBeforeTabClose(): boolean | Promise<boolean>;
229
273
  protected getPageBadge(): Promise<AXPBadge | null>;
230
274
  resolvePageBadge(): Promise<AXPBadge | null>;
231
275
  status: _angular_core.WritableSignal<AXPPageStatus | null>;
@@ -308,6 +352,7 @@ declare class AXPPopupLayoutComponent {
308
352
  isSystemMode: _angular_core.Signal<boolean>;
309
353
  isSideMenuOpen: _angular_core.Signal<boolean>;
310
354
  isOverlayLoading: _angular_core.Signal<boolean>;
355
+ overlayTaskCount: _angular_core.Signal<number>;
311
356
  isNavigationLoading: _angular_core.Signal<boolean>;
312
357
  isMenuHorizontal: _angular_core.Signal<boolean>;
313
358
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -321,6 +366,7 @@ declare class AXPPopupLayoutComponent {
321
366
  toggleSideMenu: () => void;
322
367
  setNavigationLoading: (value: boolean, delay?: number) => void;
323
368
  setOverlayLoading: (value: boolean, delay?: number) => void;
369
+ clearOverlayLoading: () => void;
324
370
  loadSettings: () => Promise<void>;
325
371
  } & _ngrx_signals.StateSource<{
326
372
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -377,6 +423,7 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
377
423
  isSystemMode: _angular_core.Signal<boolean>;
378
424
  isSideMenuOpen: _angular_core.Signal<boolean>;
379
425
  isOverlayLoading: _angular_core.Signal<boolean>;
426
+ overlayTaskCount: _angular_core.Signal<number>;
380
427
  isNavigationLoading: _angular_core.Signal<boolean>;
381
428
  isMenuHorizontal: _angular_core.Signal<boolean>;
382
429
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -390,6 +437,7 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
390
437
  toggleSideMenu: () => void;
391
438
  setNavigationLoading: (value: boolean, delay?: number) => void;
392
439
  setOverlayLoading: (value: boolean, delay?: number) => void;
440
+ clearOverlayLoading: () => void;
393
441
  loadSettings: () => Promise<void>;
394
442
  } & _ngrx_signals.StateSource<{
395
443
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -518,9 +566,20 @@ interface AXPLayoutDetailsViewAdapter {
518
566
  getPageStatus?: (context: Record<string, unknown>, currentPage: AXPLayoutDetailsViewPage | null) => Promise<AXPPageStatus | null>;
519
567
  }
520
568
 
569
+ interface AXPLayoutDetailsViewRouteParams {
570
+ moduleName: string;
571
+ entityName: string;
572
+ id: string;
573
+ }
574
+ interface AXPLayoutDetailsViewAdapterLoader {
575
+ load(params: AXPLayoutDetailsViewRouteParams): Promise<AXPLayoutDetailsViewAdapter>;
576
+ }
577
+ declare const AXP_LAYOUT_DETAILS_VIEW_ADAPTER_LOADER: InjectionToken<AXPLayoutDetailsViewAdapterLoader>;
578
+
521
579
  declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
522
580
  adapter: _angular_core.Signal<AXPLayoutDetailsViewAdapter | null>;
523
581
  rootContext: _angular_core.Signal<Record<string, any>>;
582
+ savedContext: _angular_core.Signal<Record<string, any>>;
524
583
  previousContext: _angular_core.Signal<Record<string, any>>;
525
584
  context: _angular_core.Signal<Record<string, any>>;
526
585
  scope: _angular_core.Signal<AXPExpressionEvaluatorScope | null>;
@@ -537,6 +596,8 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
537
596
  isLarge: _angular_core.Signal<boolean>;
538
597
  isBusy: _angular_core.Signal<boolean>;
539
598
  isSaving: _angular_core.Signal<boolean>;
599
+ isOverlayBusy: _angular_core.Signal<boolean>;
600
+ isPageReady: _angular_core.Signal<boolean>;
540
601
  isDirty: _angular_core.Signal<boolean>;
541
602
  changesCount: _angular_core.Signal<1 | 0>;
542
603
  isLoaded: _angular_core.Signal<boolean>;
@@ -544,7 +605,8 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
544
605
  activeTabContent: _angular_core.Signal<AXPWidgetNode[]>;
545
606
  loadAdapter: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
546
607
  loadPage: (pageId?: string, forceRefresh?: boolean) => Promise<void>;
547
- load: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
608
+ load: (adapter: AXPLayoutDetailsViewAdapter, forceRefresh?: boolean, pageIdFromUrl?: string) => Promise<void>;
609
+ loadFromRoute: (forceRefresh?: boolean) => Promise<void>;
548
610
  updateContext: (context: any) => void;
549
611
  setFormDirty: (dirty: boolean) => void;
550
612
  updatePageSelectedRows: (rows: any[]) => void;
@@ -554,7 +616,7 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
554
616
  currentPageTabs: () => AXPLayoutDetailsViewTabItem[] | undefined;
555
617
  setCurrentPage: (page: AXPLayoutDetailsViewPage | null) => void;
556
618
  setCurrentTab: (tab: AXPLayoutDetailsViewTabItem) => void;
557
- backButtonTitle: () => _acorex_core_translation.AXMultiLanguageString;
619
+ backButtonTitle: () => AXPMultiLanguageString;
558
620
  getPageTitle: () => Promise<AXPMultiLanguageString>;
559
621
  getPageDescription: () => Promise<AXPMultiLanguageString | null>;
560
622
  getBackButton: () => Promise<AXPBackButton | null>;
@@ -563,7 +625,7 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
563
625
  primaryActions: () => Promise<any>;
564
626
  secondaryActions: () => Promise<any>;
565
627
  breadcrumbs: () => Promise<{
566
- title: _acorex_core_translation.AXMultiLanguageString;
628
+ title: AXPMultiLanguageString;
567
629
  name?: string;
568
630
  icon?: string;
569
631
  command?: AXPExecuteCommand;
@@ -571,10 +633,11 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
571
633
  applySavedState: (context: Record<string, unknown>) => void;
572
634
  discard: () => Promise<void>;
573
635
  save: (command: AXPExecuteCommand, form: AXFormComponent, liveContext?: Record<string, unknown>) => Promise<boolean>;
574
- goToListPage: () => void;
636
+ goToListPage: () => Promise<void>;
575
637
  } & _ngrx_signals.StateSource<{
576
638
  adapter: AXPLayoutDetailsViewAdapter | null;
577
639
  rootContext: Record<string, any>;
640
+ savedContext: Record<string, any>;
578
641
  previousContext: Record<string, any>;
579
642
  context: Record<string, any>;
580
643
  scope: AXPExpressionEvaluatorScope | null;
@@ -589,10 +652,10 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
589
652
 
590
653
  declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent implements OnInit, OnDestroy {
591
654
  #private;
592
- adapter: _angular_core.InputSignal<AXPLayoutDetailsViewAdapter>;
593
655
  protected vm: {
594
- adapter: _angular_core.Signal<AXPLayoutDetailsViewAdapter | null>;
656
+ adapter: _angular_core.Signal<_acorex_platform_layout_views.AXPLayoutDetailsViewAdapter | null>;
595
657
  rootContext: _angular_core.Signal<Record<string, any>>;
658
+ savedContext: _angular_core.Signal<Record<string, any>>;
596
659
  previousContext: _angular_core.Signal<Record<string, any>>;
597
660
  context: _angular_core.Signal<Record<string, any>>;
598
661
  scope: _angular_core.Signal<_acorex_platform_core.AXPExpressionEvaluatorScope | null>;
@@ -609,14 +672,17 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
609
672
  isLarge: _angular_core.Signal<boolean>;
610
673
  isBusy: _angular_core.Signal<boolean>;
611
674
  isSaving: _angular_core.Signal<boolean>;
675
+ isOverlayBusy: _angular_core.Signal<boolean>;
676
+ isPageReady: _angular_core.Signal<boolean>;
612
677
  isDirty: _angular_core.Signal<boolean>;
613
678
  changesCount: _angular_core.Signal<1 | 0>;
614
679
  isLoaded: _angular_core.Signal<boolean>;
615
680
  currentPageSelectedRows: _angular_core.Signal<any[]>;
616
681
  activeTabContent: _angular_core.Signal<_acorex_platform_layout_widget_core.AXPWidgetNode[]>;
617
- loadAdapter: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
682
+ loadAdapter: (adapter: _acorex_platform_layout_views.AXPLayoutDetailsViewAdapter) => Promise<void>;
618
683
  loadPage: (pageId?: string, forceRefresh?: boolean) => Promise<void>;
619
- load: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
684
+ load: (adapter: _acorex_platform_layout_views.AXPLayoutDetailsViewAdapter, forceRefresh?: boolean, pageIdFromUrl?: string) => Promise<void>;
685
+ loadFromRoute: (forceRefresh?: boolean) => Promise<void>;
620
686
  updateContext: (context: any) => void;
621
687
  setFormDirty: (dirty: boolean) => void;
622
688
  updatePageSelectedRows: (rows: any[]) => void;
@@ -626,7 +692,7 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
626
692
  currentPageTabs: () => _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem[] | undefined;
627
693
  setCurrentPage: (page: AXPLayoutDetailsViewPage | null) => void;
628
694
  setCurrentTab: (tab: _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem) => void;
629
- backButtonTitle: () => _acorex_core_translation.AXMultiLanguageString;
695
+ backButtonTitle: () => AXPMultiLanguageString;
630
696
  getPageTitle: () => Promise<AXPMultiLanguageString>;
631
697
  getPageDescription: () => Promise<AXPMultiLanguageString | null>;
632
698
  getBackButton: () => Promise<AXPBackButton | null>;
@@ -635,7 +701,7 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
635
701
  primaryActions: () => Promise<any>;
636
702
  secondaryActions: () => Promise<any>;
637
703
  breadcrumbs: () => Promise<{
638
- title: _acorex_core_translation.AXMultiLanguageString;
704
+ title: AXPMultiLanguageString;
639
705
  name?: string;
640
706
  icon?: string;
641
707
  command?: AXPExecuteCommand;
@@ -643,10 +709,11 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
643
709
  applySavedState: (context: Record<string, unknown>) => void;
644
710
  discard: () => Promise<void>;
645
711
  save: (command: AXPExecuteCommand, form: AXFormComponent, liveContext?: Record<string, unknown>) => Promise<boolean>;
646
- goToListPage: () => void;
712
+ goToListPage: () => Promise<void>;
647
713
  } & _ngrx_signals.StateSource<{
648
- adapter: AXPLayoutDetailsViewAdapter | null;
714
+ adapter: _acorex_platform_layout_views.AXPLayoutDetailsViewAdapter | null;
649
715
  rootContext: Record<string, any>;
716
+ savedContext: Record<string, any>;
650
717
  previousContext: Record<string, any>;
651
718
  context: Record<string, any>;
652
719
  scope: _acorex_platform_core.AXPExpressionEvaluatorScope | null;
@@ -658,22 +725,32 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
658
725
  evaluatedTabContentsById: Record<string, _acorex_platform_layout_widget_core.AXPWidgetNode[]>;
659
726
  formDirty: boolean;
660
727
  }>;
661
- protected router: Router;
662
728
  protected route: ActivatedRoute;
663
729
  protected eventService: AXPBroadcastEventService;
664
730
  protected deviceService: AXPDeviceService;
665
- private readonly unsavedChangesConfirm;
666
731
  private readonly unsavedChangesPopstate;
667
732
  private readonly pageComponentInstanceRegistry;
668
733
  private readonly shortcutRegistry;
734
+ private readonly workflowService;
669
735
  private readonly destroyRef;
670
736
  private readonly elementRef;
737
+ private readonly debug;
671
738
  private onSelectionChangeSubscription?;
672
- /** Prevents sidebar tab init events from pushing history before {@link ngOnInit} load completes. */
673
- private detailsLayoutReady;
739
+ /** Prevents sidebar tab init events from pushing history before the first page activation completes. */
740
+ private readonly detailsLayoutReady;
674
741
  private readonly destroyed$;
675
742
  private footerActionsGeneration;
676
743
  private keyboardShortcutRegistrationGeneration;
744
+ private overlayFallbackTimer?;
745
+ /** Page id the overlay release logic is bound to; reset on sidebar/page switch. */
746
+ private overlayTargetPageId;
747
+ /** After a page switch, wait for widget registry to clear before accepting remounted widgets. */
748
+ private overlaySawZeroWidgetsAfterPageChange;
749
+ /** Cancels in-flight overlay release when the page changes. */
750
+ private overlayReleaseGeneration;
751
+ private overlayReleasePromise?;
752
+ /** Safety cap when widget ready detection does not settle. */
753
+ private static readonly overlayMaxWaitMs;
677
754
  /** Header actions with resolved shortcut chords, keyed by command name. */
678
755
  private readonly actionShortcutEntries;
679
756
  /** Save/discard use live {@link AXPLayoutDetailsViewViewModel.isDirty}; other actions use evaluated `visible`. */
@@ -713,17 +790,31 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
713
790
  protected isFooterActionDisabled(action: AXPActionMenuItem): boolean;
714
791
  protected hasFooter: _angular_core.Signal<boolean>;
715
792
  /**
716
- * Append timestamp query param to trigger router to re-run guards/resolvers
793
+ * Re-fetches the entity adapter and reloads the active page.
717
794
  */
718
795
  protected refreshLayout(): Promise<void>;
719
796
  ngOnInit(): Promise<void>;
797
+ /** Navigates to {@link AXPLayoutDetailsViewAdapter.exitUrl} when the open record was deleted. */
798
+ private handleEntityDeleted;
720
799
  ngAfterViewInit(): Promise<void>;
721
800
  ngOnDestroy(): void;
722
801
  private refreshFooterActions;
723
802
  protected handleOnContextChanged(e: AXPContextChangeEvent): void;
724
803
  private getLiveFormContext;
804
+ /** Whether the active page renders widget nodes (not only hosted components). */
805
+ private pageHasWidgetNodes;
806
+ /** Clears all overlay loading tasks once the page (or hosted view) is ready. */
807
+ private clearPageOverlay;
808
+ private scheduleOverlayFallback;
809
+ private clearOverlayFallback;
810
+ /**
811
+ * Hides overlay after the widget container reports continuous idle (same gate as saved baseline).
812
+ */
813
+ private requestOverlayRelease;
725
814
  private finalizeSave;
726
815
  private finalizeDiscard;
816
+ /** Reverts widget form state and view-model context to the last saved baseline. */
817
+ private discardUnsavedChanges;
727
818
  /**
728
819
  * `ax-tabs` selects on click before we can confirm. Revert synchronously, then confirm + switch.
729
820
  */
@@ -740,6 +831,7 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
740
831
  protected getPageTitle(): Promise<AXPMultiLanguageString>;
741
832
  getPageDescription(): Promise<AXPMultiLanguageString | null>;
742
833
  getBackButton(): Promise<AXPBackButton | null>;
834
+ hasUnsavedChanges(): boolean;
743
835
  getPageBadge(): Promise<AXPBadge | null>;
744
836
  getPageStatus(): Promise<AXPPageStatus | null>;
745
837
  /**
@@ -751,13 +843,21 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
751
843
  * Router guard hook — same unsaved-changes confirm as dialog builder {@link confirmCloseWhenDirty}.
752
844
  */
753
845
  canDeactivate(): Promise<boolean>;
846
+ /** Background tab close — confirm without discarding (the cached instance is destroyed). */
847
+ onBeforeTabClose(): Promise<boolean>;
754
848
  /** Active entity component page instance, when the current details sub-page is component-based. */
755
849
  private getActivePageComponentInstance;
756
850
  /** Component key for the current details sub-page, when content is component-based. */
757
851
  private getActivePageComponentKey;
758
852
  private static isComponentPageContent;
853
+ protected pageContentTrackKey(item: AXPPageContentItem, index: number): string;
759
854
  /** Whether the active component-based entity page has unsaved edits. */
760
855
  private isActivePageComponentDirty;
856
+ /**
857
+ * Widget-form dirty state for leave guards (popstate, canDeactivate).
858
+ * Unlike {@link liveFormIsDirty}, does not suppress dirty while overlay is busy.
859
+ */
860
+ private hasWidgetFormUnsavedChanges;
761
861
  /** Whether the current details page has user-origin unsaved edits (form or component page). */
762
862
  private shouldPromptLeave;
763
863
  /** Single gate for leaving the page or switching details sub-pages when dirty. */
@@ -771,19 +871,25 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
771
871
  /** Waits for builder/effect microtasks to finish after a component page command. */
772
872
  private waitForComponentDirtySettle;
773
873
  private refreshKeyboardShortcutRegistrations;
874
+ /** i18n scope label for the active details sub-page shortcut group in the help dialog. */
875
+ private getKeyboardShortcutScope;
876
+ /** Primary overview page backed by the entity widget form (not a component-hosted sub-page). */
877
+ private isWidgetFormPrimaryPage;
878
+ private registerDetailsViewShortcutScope;
774
879
  private collectActionShortcutEntries;
775
- private isHeaderActionAvailable;
776
- /** Whether save/discard core shortcuts are listed in the help dialog (page supports them). */
880
+ private isShortcutActionAvailable;
881
+ /** Whether save/discard core shortcuts are listed in the help dialog (widget overview page only). */
777
882
  private isCoreSaveShortcutAvailable;
778
883
  private isCoreDiscardShortcutAvailable;
779
884
  private canExecuteSaveShortcut;
780
885
  private canExecuteDiscardShortcut;
781
886
  private executeDiscardViaShortcut;
887
+ private executeActionShortcut;
782
888
  private isActionShortcutActive;
783
889
  private registerCoreKeyboardShortcuts;
784
890
  private registerActionKeyboardShortcuts;
785
891
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPLayoutDetailsViewComponent, never>;
786
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPLayoutDetailsViewComponent, "axp-layout-details-view", never, { "adapter": { "alias": "adapter"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
892
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPLayoutDetailsViewComponent, "axp-layout-details-view", never, {}, {}, never, never, true, never>;
787
893
  }
788
894
 
789
895
  type AXPDetailsViewActionShortcut = AXPKeyboardShortcutChord;
@@ -800,6 +906,16 @@ declare function resolveDetailsViewActionShortcuts(commandBaseName: string, expl
800
906
  * Resolves save/discard footer command shortcuts from page settings.
801
907
  */
802
908
  declare function resolveDetailsViewFooterCommandShortcuts(commandName: string, explicit?: readonly AXPKeyboardShortcut[]): AXPDetailsViewActionShortcut[] | undefined;
909
+ /**
910
+ * Platform defaults for component-page footer save/discard commands (e.g. `MetaDataBuilder:Save`).
911
+ */
912
+ declare function resolvePageFooterActionDefaultShortcuts(commandName: string): AXPDetailsViewActionShortcut[] | undefined;
913
+ declare function isSaveFooterCommand(commandName: string): boolean;
914
+ declare function isDiscardFooterCommand(commandName: string): boolean;
915
+ /**
916
+ * Resolves keyboard shortcuts for a footer action on entity detail sub-pages.
917
+ */
918
+ declare function resolvePageFooterActionShortcuts(commandName: string, explicit?: readonly AXPKeyboardShortcut[]): AXPDetailsViewActionShortcut[] | undefined;
803
919
 
804
920
  /**
805
921
  * Prompts for unsaved changes before leaving the entity details route (breadcrumbs, menu, back to list).
@@ -847,5 +963,5 @@ declare class AXPPageComponentRendererDirective implements OnInit, OnDestroy {
847
963
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXPPageComponentRendererDirective, "[axp-page-component-renderer]", never, { "componentKey": { "alias": "componentKey"; "required": true; "isSignal": true; }; "rootContext": { "alias": "rootContext"; "required": false; "isSignal": true; }; "pageConfig": { "alias": "pageConfig"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, { "componentReady": "componentReady"; }, never, never, true, never>;
848
964
  }
849
965
 
850
- export { AXPLayoutDetailsViewComponent, AXPLayoutDetailsViewViewModel, AXPPageComponentInstanceRegistryService, AXPPageComponentRendererDirective, AXPPageLayoutBase, AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPopupLayoutBase, AXPPopupLayoutBaseComponent, AXPPopupLayoutComponent, axpDetailsViewCanDeactivateGuard, buildNotSavedPageBadge, getDetailsViewActionCommandBaseName, isDiscardCommand, resolveDetailsViewActionShortcuts, resolveDetailsViewFooterCommandShortcuts };
851
- export type { AXPDetailsViewActionShortcut, AXPLayoutDetailsViewAction, AXPLayoutDetailsViewAdapter, AXPLayoutDetailsViewPage, AXPLayoutDetailsViewTabItem, AXPPageContentItem };
966
+ export { AXPLayoutDetailsViewComponent, AXPLayoutDetailsViewViewModel, AXPPageComponentInstanceRegistryService, AXPPageComponentRendererDirective, AXPPageLayoutBase, AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPopupLayoutBase, AXPPopupLayoutBaseComponent, AXPPopupLayoutComponent, AXP_LAYOUT_DETAILS_VIEW_ADAPTER_LOADER, axpDetailsViewCanDeactivateGuard, buildNotSavedPageBadge, getDetailsViewActionCommandBaseName, isDiscardCommand, isDiscardFooterCommand, isSaveFooterCommand, resolveDetailsViewActionShortcuts, resolveDetailsViewFooterCommandShortcuts, resolvePageFooterActionDefaultShortcuts, resolvePageFooterActionShortcuts };
967
+ export type { AXPDetailsViewActionShortcut, AXPLayoutDetailsViewAction, AXPLayoutDetailsViewAdapter, AXPLayoutDetailsViewAdapterLoader, AXPLayoutDetailsViewPage, AXPLayoutDetailsViewRouteParams, AXPLayoutDetailsViewTabItem, AXPPageContentItem };