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

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 (133) hide show
  1. package/contracts/README.md +3 -0
  2. package/fesm2022/acorex-platform-auth.mjs +201 -81
  3. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  4. package/fesm2022/acorex-platform-common-common-settings.provider-Ytey9uhY.mjs +177 -0
  5. package/fesm2022/acorex-platform-common-common-settings.provider-Ytey9uhY.mjs.map +1 -0
  6. package/fesm2022/acorex-platform-common.mjs +4490 -880
  7. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  8. package/fesm2022/acorex-platform-contracts.mjs +38 -0
  9. package/fesm2022/acorex-platform-contracts.mjs.map +1 -0
  10. package/fesm2022/acorex-platform-core.mjs +2612 -667
  11. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-domain.mjs +557 -826
  13. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-builder.mjs +1255 -209
  15. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs +121 -0
  17. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +1 -0
  18. package/fesm2022/acorex-platform-layout-components.mjs +6493 -1920
  19. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  20. package/fesm2022/acorex-platform-layout-designer.mjs +612 -287
  21. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  22. package/fesm2022/acorex-platform-layout-entity-attachments-page.component-CwG6n_Yb.mjs +376 -0
  23. package/fesm2022/acorex-platform-layout-entity-attachments-page.component-CwG6n_Yb.mjs.map +1 -0
  24. package/fesm2022/acorex-platform-layout-entity-file-list-popup.component--IeMZLIr.mjs +100 -0
  25. package/fesm2022/acorex-platform-layout-entity-file-list-popup.component--IeMZLIr.mjs.map +1 -0
  26. package/fesm2022/acorex-platform-layout-entity.mjs +22502 -9964
  27. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  28. package/fesm2022/acorex-platform-layout-views.mjs +1395 -387
  29. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  30. package/fesm2022/acorex-platform-layout-widget-core.mjs +2226 -524
  31. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  32. package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs → acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs} +10 -10
  33. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs.map +1 -0
  34. package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs → acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs} +6 -7
  35. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs.map +1 -0
  36. package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs → acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs} +12 -12
  37. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs.map +1 -0
  38. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs +116 -0
  39. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs.map +1 -0
  40. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-DjpZU6gz.mjs} +6 -6
  41. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-DjpZU6gz.mjs.map +1 -0
  42. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-gX-3Kx9I.mjs} +5 -5
  43. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-gX-3Kx9I.mjs.map +1 -0
  44. package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs → acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs} +6 -6
  45. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs.map +1 -0
  46. package/fesm2022/acorex-platform-layout-widgets.mjs +18746 -16718
  47. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  48. package/fesm2022/acorex-platform-native.mjs +8 -7
  49. package/fesm2022/acorex-platform-native.mjs.map +1 -1
  50. package/fesm2022/acorex-platform-runtime.mjs +391 -166
  51. package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
  52. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs +160 -0
  53. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs.map +1 -0
  54. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs +120 -0
  55. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs.map +1 -0
  56. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs → acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs} +21 -28
  57. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs.map +1 -0
  58. package/fesm2022/acorex-platform-themes-default-error-401.component-B1nsdpTY.mjs +48 -0
  59. package/fesm2022/acorex-platform-themes-default-error-401.component-B1nsdpTY.mjs.map +1 -0
  60. package/fesm2022/acorex-platform-themes-default-error-404.component-D4UvRe8u.mjs +42 -0
  61. package/fesm2022/acorex-platform-themes-default-error-404.component-D4UvRe8u.mjs.map +1 -0
  62. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs +19 -0
  63. package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs.map +1 -0
  64. package/fesm2022/acorex-platform-themes-default.mjs +2337 -94
  65. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  66. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs → acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs} +6 -6
  67. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs.map +1 -0
  68. package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs → acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs} +6 -6
  69. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs.map +1 -0
  70. package/fesm2022/{acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs → acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs} +52 -33
  71. package/fesm2022/acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs.map +1 -0
  72. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs +94 -0
  73. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs.map +1 -0
  74. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs +86 -0
  75. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs.map +1 -0
  76. package/fesm2022/acorex-platform-themes-shared.mjs +793 -612
  77. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  78. package/fesm2022/acorex-platform-workflow.mjs +997 -274
  79. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  80. package/fesm2022/acorex-platform.mjs.map +1 -1
  81. package/package.json +41 -35
  82. package/{auth/index.d.ts → types/acorex-platform-auth.d.ts} +40 -19
  83. package/types/acorex-platform-common.d.ts +3673 -0
  84. package/types/acorex-platform-contracts.d.ts +940 -0
  85. package/{core/index.d.ts → types/acorex-platform-core.d.ts} +1029 -170
  86. package/{domain/index.d.ts → types/acorex-platform-domain.d.ts} +744 -412
  87. package/{layout/builder/index.d.ts → types/acorex-platform-layout-builder.d.ts} +262 -55
  88. package/types/acorex-platform-layout-components.d.ts +3329 -0
  89. package/{layout/designer/index.d.ts → types/acorex-platform-layout-designer.d.ts} +96 -18
  90. package/types/acorex-platform-layout-entity.d.ts +4512 -0
  91. package/{layout/views/index.d.ts → types/acorex-platform-layout-views.d.ts} +334 -91
  92. package/{layout/widget-core/index.d.ts → types/acorex-platform-layout-widget-core.d.ts} +438 -162
  93. package/{layout/widgets/index.d.ts → types/acorex-platform-layout-widgets.d.ts} +1152 -507
  94. package/{native/index.d.ts → types/acorex-platform-native.d.ts} +0 -7
  95. package/types/acorex-platform-runtime.d.ts +571 -0
  96. package/{themes/default/index.d.ts → types/acorex-platform-themes-default.d.ts} +268 -11
  97. package/{themes/shared/index.d.ts → types/acorex-platform-themes-shared.d.ts} +30 -2
  98. package/{workflow/index.d.ts → types/acorex-platform-workflow.d.ts} +436 -748
  99. package/common/index.d.ts +0 -2470
  100. package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs +0 -71
  101. package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map +0 -1
  102. package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs +0 -135
  104. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +0 -1
  105. package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map +0 -1
  106. package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +0 -1
  108. package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map +0 -1
  109. package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs.map +0 -1
  110. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs +0 -157
  111. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +0 -1
  112. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-D3qZa5fM.mjs +0 -1542
  113. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-D3qZa5fM.mjs.map +0 -1
  114. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +0 -101
  115. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
  116. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +0 -1
  117. package/fesm2022/acorex-platform-themes-default-error-401.component-cfREo88K.mjs +0 -31
  118. package/fesm2022/acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map +0 -1
  119. package/fesm2022/acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs +0 -25
  120. package/fesm2022/acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map +0 -1
  121. package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs +0 -19
  122. package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map +0 -1
  123. package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map +0 -1
  124. package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs.map +0 -1
  125. package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +0 -1
  126. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-Dz0cylyQ.mjs +0 -65
  127. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-Dz0cylyQ.mjs.map +0 -1
  128. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs +0 -64
  129. package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs.map +0 -1
  130. package/layout/components/index.d.ts +0 -1670
  131. package/layout/entity/index.d.ts +0 -2294
  132. package/runtime/index.d.ts +0 -307
  133. /package/{index.d.ts → types/acorex-platform.d.ts} +0 -0
@@ -6,19 +6,22 @@ import { AXClickEvent } from '@acorex/cdk/common';
6
6
  import * as i1 from '@acorex/cdk/drawer';
7
7
  import { AXDrawerItemDirective } from '@acorex/cdk/drawer';
8
8
  import * as _acorex_platform_core from '@acorex/platform/core';
9
- import { AXPActionMenuItem, AXPBreadcrumbItem, AXPBadge, AXPBackButton, AXPExecuteCommand, AXPDeviceService, AXPExecuteCommandResult, AXPExpressionEvaluatorScope, AXPBroadcastEventService } from '@acorex/platform/core';
9
+ import { AXPActionMenuItem, AXPBreadcrumbItem, AXPMultiLanguageString, AXPBadge, AXPPageStatus, AXPBackButton, AXPExecuteCommand, AXPDeviceService, AXPKeyboardShortcut, AXPExecuteCommandResult, AXPExpressionEvaluatorScope, AXPBroadcastEventService, AXPContextChangeEvent, AXPKeyboardShortcutChord } from '@acorex/platform/core';
10
10
  import { AXPCommandService, AXPPolicyEngineService } from '@acorex/platform/runtime';
11
11
  import { AXPWorkflowService } from '@acorex/platform/workflow';
12
+ import * as _acorex_core_translation from '@acorex/core/translation';
13
+ import { AXTranslationService } from '@acorex/core/translation';
12
14
  import { AXToastService } from '@acorex/components/toast';
13
15
  import { AXFormatService } from '@acorex/core/format';
14
- import { AXTranslationService } from '@acorex/core/translation';
15
16
  import { AXPSessionService } from '@acorex/platform/auth';
16
- import { AXPHomePageService } from '@acorex/platform/common';
17
+ import { AXPHomePageService, AXPSettingsService, AXPEntityCommandScope } from '@acorex/platform/common';
17
18
  import { AXBasePageComponent } from '@acorex/components/page';
18
19
  import * as _acorex_platform_layout_widget_core from '@acorex/platform/layout/widget-core';
19
- import { AXPWidgetNode, AXPPageStatus, AXPWidgetContainerComponent, AXPWidgetCoreContextChangeEvent } from '@acorex/platform/layout/widget-core';
20
- import { AXFormComponent } from '@acorex/components/form';
20
+ import { AXPWidgetNode, AXPPageStatus as AXPPageStatus$1, AXPWidgetContainerComponent } from '@acorex/platform/layout/widget-core';
21
21
  import * as _acorex_platform_layout_views from '@acorex/platform/layout/views';
22
+ import { AXFormComponent } from '@acorex/components/form';
23
+ import { AXTabStripChangedEvent } from '@acorex/components/tabs';
24
+ import * as _angular_router from '@angular/router';
22
25
  import { Router, ActivatedRoute } from '@angular/router';
23
26
 
24
27
  declare abstract class AXPPageLayoutBase {
@@ -30,18 +33,26 @@ declare abstract class AXPPageLayoutBase {
30
33
  abstract hasSecondaryActions: Signal<boolean>;
31
34
  abstract hasActions: Signal<boolean>;
32
35
  abstract breadcrumbs: Signal<AXPBreadcrumbItem[]>;
33
- abstract title: Signal<string>;
36
+ abstract title: Signal<AXPMultiLanguageString>;
37
+ abstract titleIcon: Signal<string | null>;
34
38
  abstract hasTitle: Signal<boolean>;
39
+ abstract hasTitleIcon: Signal<boolean>;
35
40
  abstract hasDescription: Signal<boolean>;
36
- abstract description: Signal<string>;
41
+ abstract description: Signal<AXPMultiLanguageString | null>;
37
42
  abstract hasBreadcrumbs: Signal<boolean>;
38
43
  abstract hasBadge: Signal<boolean>;
39
44
  abstract badge: Signal<AXPBadge | null>;
45
+ abstract hasStatus: Signal<boolean>;
46
+ abstract status: Signal<AXPPageStatus | null>;
40
47
  abstract hasBackButton: Signal<boolean>;
41
- abstract backButton: Signal<AXPBackButton>;
48
+ abstract backButton: Signal<AXPBackButton | null>;
42
49
  abstract onBackButtonClick: () => void | Promise<void>;
43
50
  abstract startSideToggle: () => void | Promise<void>;
44
51
  abstract execute: (command: AXPExecuteCommand) => void | Promise<void>;
52
+ /** Whether the page has user-origin edits that are not yet persisted. */
53
+ abstract hasUnsavedChanges(): boolean;
54
+ /** Resolves the page title badge (used by host layouts for nested entity pages). */
55
+ abstract resolvePageBadge(): AXPBadge | null | Promise<AXPBadge | null>;
45
56
  }
46
57
 
47
58
  declare class AXPPageLayoutComponent {
@@ -60,7 +71,10 @@ declare class AXPPageLayoutComponent {
60
71
  overlayLoadingTaskCount: _angular_core.Signal<number>;
61
72
  navigationLoadingTaskCount: _angular_core.Signal<number>;
62
73
  sideMenuState: _angular_core.Signal<_acorex_platform_themes_shared.AXPSideMenuState>;
74
+ overlaySideMenuOpen: _angular_core.Signal<boolean>;
63
75
  sideMenuWidth: _angular_core.Signal<number>;
76
+ sideMenuCompactWidth: _angular_core.Signal<number>;
77
+ menuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
64
78
  menuOrientation: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuOrientation>;
65
79
  isPrinting: _angular_core.Signal<boolean>;
66
80
  isDarkMode: _angular_core.Signal<boolean>;
@@ -70,10 +84,14 @@ declare class AXPPageLayoutComponent {
70
84
  isOverlayLoading: _angular_core.Signal<boolean>;
71
85
  isNavigationLoading: _angular_core.Signal<boolean>;
72
86
  isMenuHorizontal: _angular_core.Signal<boolean>;
87
+ effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
88
+ sideMenuDrawerWidth: _angular_core.Signal<number>;
73
89
  changeThemeMode: (theme: _acorex_platform_themes_shared.AXPThemeMode) => void;
74
90
  openSideMenu: () => void;
75
91
  closeSideMenu: () => void;
76
92
  setSideMenuWidth: (width: number) => void;
93
+ setSideMenuCompactWidth: (width: number) => void;
94
+ setSideMenuDrawerWidth: (width: number) => void;
77
95
  toggleSideMenu: () => void;
78
96
  setNavigationLoading: (value: boolean, delay?: number) => void;
79
97
  setOverlayLoading: (value: boolean, delay?: number) => void;
@@ -91,7 +109,10 @@ declare class AXPPageLayoutComponent {
91
109
  overlayLoadingTaskCount: number;
92
110
  navigationLoadingTaskCount: number;
93
111
  sideMenuState: _acorex_platform_themes_shared.AXPSideMenuState;
112
+ overlaySideMenuOpen: boolean;
94
113
  sideMenuWidth: number;
114
+ sideMenuCompactWidth: number;
115
+ menuVerticalMode: _acorex_platform_themes_shared.AXPMenuVerticalMode;
95
116
  menuOrientation: _acorex_platform_themes_shared.AXPMenuOrientation;
96
117
  isPrinting: boolean;
97
118
  }>;
@@ -106,11 +127,19 @@ declare class AXPPageLayoutComponent {
106
127
  protected handleBackdropClick(e: AXClickEvent): boolean;
107
128
  protected execute(command: AXPExecuteCommand): Promise<void>;
108
129
  protected handleOnBackdropClick(event: MouseEvent): void;
130
+ /**
131
+ * Breadcrumbs and other in-page `navigate` commands bypass `routerLink`, so prompt here
132
+ * when the hosted page implements {@link AXPUnsavedChangesCanDeactivate}.
133
+ * A successful confirm sets `leaveConfirmed` for the router guard on the subsequent navigation.
134
+ */
135
+ private canLeaveCurrentPage;
136
+ protected getEntityData(): Record<string, any> | null;
137
+ protected handleStatusTransition(transition: any): Promise<void>;
109
138
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPageLayoutComponent, never>;
110
139
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPageLayoutComponent, "axp-page-layout", never, {}, {}, never, ["axp-layout-start-side", "axp-page-toolbar", "axp-page-content", "axp-page-footer"], true, [{ directive: typeof i1.AXDrawerContainerDirective; inputs: {}; outputs: {}; }]>;
111
140
  }
112
141
 
113
- declare abstract class AXPPageLayoutBaseComponent {
142
+ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
114
143
  #private;
115
144
  protected readonly layoutService: {
116
145
  currentMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPThemeMode>;
@@ -125,7 +154,10 @@ declare abstract class AXPPageLayoutBaseComponent {
125
154
  overlayLoadingTaskCount: _angular_core.Signal<number>;
126
155
  navigationLoadingTaskCount: _angular_core.Signal<number>;
127
156
  sideMenuState: _angular_core.Signal<_acorex_platform_themes_shared.AXPSideMenuState>;
157
+ overlaySideMenuOpen: _angular_core.Signal<boolean>;
128
158
  sideMenuWidth: _angular_core.Signal<number>;
159
+ sideMenuCompactWidth: _angular_core.Signal<number>;
160
+ menuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
129
161
  menuOrientation: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuOrientation>;
130
162
  isPrinting: _angular_core.Signal<boolean>;
131
163
  isDarkMode: _angular_core.Signal<boolean>;
@@ -135,10 +167,14 @@ declare abstract class AXPPageLayoutBaseComponent {
135
167
  isOverlayLoading: _angular_core.Signal<boolean>;
136
168
  isNavigationLoading: _angular_core.Signal<boolean>;
137
169
  isMenuHorizontal: _angular_core.Signal<boolean>;
170
+ effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
171
+ sideMenuDrawerWidth: _angular_core.Signal<number>;
138
172
  changeThemeMode: (theme: _acorex_platform_themes_shared.AXPThemeMode) => void;
139
173
  openSideMenu: () => void;
140
174
  closeSideMenu: () => void;
141
175
  setSideMenuWidth: (width: number) => void;
176
+ setSideMenuCompactWidth: (width: number) => void;
177
+ setSideMenuDrawerWidth: (width: number) => void;
142
178
  toggleSideMenu: () => void;
143
179
  setNavigationLoading: (value: boolean, delay?: number) => void;
144
180
  setOverlayLoading: (value: boolean, delay?: number) => void;
@@ -156,7 +192,10 @@ declare abstract class AXPPageLayoutBaseComponent {
156
192
  overlayLoadingTaskCount: number;
157
193
  navigationLoadingTaskCount: number;
158
194
  sideMenuState: _acorex_platform_themes_shared.AXPSideMenuState;
195
+ overlaySideMenuOpen: boolean;
159
196
  sideMenuWidth: number;
197
+ sideMenuCompactWidth: number;
198
+ menuVerticalMode: _acorex_platform_themes_shared.AXPMenuVerticalMode;
160
199
  menuOrientation: _acorex_platform_themes_shared.AXPMenuOrientation;
161
200
  isPrinting: boolean;
162
201
  }>;
@@ -166,33 +205,42 @@ declare abstract class AXPPageLayoutBaseComponent {
166
205
  protected readonly toastService: AXToastService;
167
206
  protected readonly homePageService: AXPHomePageService;
168
207
  protected readonly policyService: AXPPolicyEngineService;
208
+ protected readonly settingsService: AXPSettingsService;
169
209
  private _updateTrigger;
170
210
  protected updateTrigger: _angular_core.Signal<number>;
171
211
  protected recompute(): void;
172
212
  ngOnInit(): Promise<void>;
173
- protected title: _angular_core.WritableSignal<string>;
174
- protected getPageTitle(): string | Promise<string>;
175
- private hasTitle;
176
- private description;
177
- private hasDescription;
178
- protected getPageDescription(): string | null | Promise<string | null>;
213
+ title: _angular_core.WritableSignal<_acorex_core_translation.AXMultiLanguageString>;
214
+ titleIcon: _angular_core.WritableSignal<string | null>;
215
+ protected getPageTitle(): AXPMultiLanguageString | Promise<AXPMultiLanguageString>;
216
+ protected getPageIcon(): string | null | Promise<string | null>;
217
+ hasTitle: _angular_core.Signal<boolean>;
218
+ hasTitleIcon: _angular_core.Signal<boolean>;
219
+ description: _angular_core.WritableSignal<_acorex_core_translation.AXMultiLanguageString | null>;
220
+ hasDescription: _angular_core.Signal<boolean>;
221
+ protected getPageDescription(): AXPMultiLanguageString | null | Promise<AXPMultiLanguageString | null>;
179
222
  private defaultBreadCrumbs;
180
- private breadcrumbs;
181
- private hasBreadcrumbs;
223
+ breadcrumbs: _angular_core.WritableSignal<AXPBreadcrumbItem[]>;
224
+ hasBreadcrumbs: _angular_core.Signal<boolean>;
182
225
  protected getPageBreadcrumbs(): AXPBreadcrumbItem[] | Promise<AXPBreadcrumbItem[]>;
183
- private badge;
184
- private hasBadge;
185
- protected getPageBadge(): AXPBadge | null | Promise<AXPBadge | null>;
226
+ badge: _angular_core.WritableSignal<AXPBadge | null>;
227
+ hasBadge: _angular_core.Signal<boolean>;
228
+ hasUnsavedChanges(): boolean;
229
+ protected getPageBadge(): Promise<AXPBadge | null>;
230
+ resolvePageBadge(): Promise<AXPBadge | null>;
231
+ status: _angular_core.WritableSignal<AXPPageStatus | null>;
232
+ hasStatus: _angular_core.Signal<boolean>;
233
+ protected getPageStatus(): AXPPageStatus | null | Promise<AXPPageStatus | null>;
186
234
  protected layout: _angular_core.Signal<AXPPageLayoutComponent | undefined>;
187
235
  protected toggleEndSide(): void;
188
236
  protected toggleStartSide(): void;
189
237
  primaryMenuItems: _angular_core.WritableSignal<AXPActionMenuItem[]>;
190
238
  hasPrimaryActions: _angular_core.Signal<boolean>;
191
- protected getPrimaryMenuItems(): AXPActionMenuItem[] | Promise<AXPActionMenuItem[]>;
239
+ getPrimaryMenuItems(): AXPActionMenuItem[] | Promise<AXPActionMenuItem[]>;
192
240
  secondaryMenuItems: _angular_core.WritableSignal<AXPActionMenuItem[]>;
193
241
  hasSecondaryActions: _angular_core.Signal<boolean>;
194
242
  hasActions: _angular_core.Signal<boolean>;
195
- protected getSecondaryMenuItems(): AXPActionMenuItem[] | Promise<AXPActionMenuItem[]>;
243
+ getSecondaryMenuItems(): AXPActionMenuItem[] | Promise<AXPActionMenuItem[]>;
196
244
  titleActions: _angular_core.WritableSignal<AXPActionMenuItem[]>;
197
245
  hasTitleActions: _angular_core.Signal<boolean>;
198
246
  protected getTitleActions(): AXPActionMenuItem[] | Promise<AXPActionMenuItem[]>;
@@ -200,12 +248,26 @@ declare abstract class AXPPageLayoutBaseComponent {
200
248
  hasBackButton: _angular_core.Signal<boolean>;
201
249
  protected getBackButton(): (AXPBackButton | null) | Promise<AXPBackButton | null>;
202
250
  execute(command: AXPExecuteCommand): void | Promise<void>;
251
+ /**
252
+ * Optional partial context to merge into the create/update wizard when leaving a page step.
253
+ * Override when the page keeps edits in local state instead of the shared form context.
254
+ */
255
+ getWizardStepContext(): Record<string, unknown> | null;
203
256
  startSideToggle(): void | Promise<void>;
204
257
  onBackButtonClick(): void | Promise<void>;
205
258
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPageLayoutBaseComponent, never>;
206
259
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPageLayoutBaseComponent, "ng-component", never, {}, {}, never, never, true, never>;
207
260
  }
208
261
 
262
+ /**
263
+ * Builds the standard "Not Saved" page badge when the global show-page-badge setting is enabled.
264
+ */
265
+ declare function buildNotSavedPageBadge(translateService: AXTranslationService, settingsService: AXPSettingsService): Promise<AXPBadge | null>;
266
+ /**
267
+ * Whether a command name represents a discard/revert action on a details sub-page.
268
+ */
269
+ declare function isDiscardCommand(commandName: string, rejectCommandName?: string | null): boolean;
270
+
209
271
  declare abstract class AXPPopupLayoutBase {
210
272
  abstract primaryMenuItems: Signal<AXPActionMenuItem[]>;
211
273
  abstract secondaryMenuItems: Signal<AXPActionMenuItem[]>;
@@ -235,7 +297,10 @@ declare class AXPPopupLayoutComponent {
235
297
  overlayLoadingTaskCount: _angular_core.Signal<number>;
236
298
  navigationLoadingTaskCount: _angular_core.Signal<number>;
237
299
  sideMenuState: _angular_core.Signal<_acorex_platform_themes_shared.AXPSideMenuState>;
300
+ overlaySideMenuOpen: _angular_core.Signal<boolean>;
238
301
  sideMenuWidth: _angular_core.Signal<number>;
302
+ sideMenuCompactWidth: _angular_core.Signal<number>;
303
+ menuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
239
304
  menuOrientation: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuOrientation>;
240
305
  isPrinting: _angular_core.Signal<boolean>;
241
306
  isDarkMode: _angular_core.Signal<boolean>;
@@ -245,10 +310,14 @@ declare class AXPPopupLayoutComponent {
245
310
  isOverlayLoading: _angular_core.Signal<boolean>;
246
311
  isNavigationLoading: _angular_core.Signal<boolean>;
247
312
  isMenuHorizontal: _angular_core.Signal<boolean>;
313
+ effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
314
+ sideMenuDrawerWidth: _angular_core.Signal<number>;
248
315
  changeThemeMode: (theme: _acorex_platform_themes_shared.AXPThemeMode) => void;
249
316
  openSideMenu: () => void;
250
317
  closeSideMenu: () => void;
251
318
  setSideMenuWidth: (width: number) => void;
319
+ setSideMenuCompactWidth: (width: number) => void;
320
+ setSideMenuDrawerWidth: (width: number) => void;
252
321
  toggleSideMenu: () => void;
253
322
  setNavigationLoading: (value: boolean, delay?: number) => void;
254
323
  setOverlayLoading: (value: boolean, delay?: number) => void;
@@ -266,7 +335,10 @@ declare class AXPPopupLayoutComponent {
266
335
  overlayLoadingTaskCount: number;
267
336
  navigationLoadingTaskCount: number;
268
337
  sideMenuState: _acorex_platform_themes_shared.AXPSideMenuState;
338
+ overlaySideMenuOpen: boolean;
269
339
  sideMenuWidth: number;
340
+ sideMenuCompactWidth: number;
341
+ menuVerticalMode: _acorex_platform_themes_shared.AXPMenuVerticalMode;
270
342
  menuOrientation: _acorex_platform_themes_shared.AXPMenuOrientation;
271
343
  isPrinting: boolean;
272
344
  }>;
@@ -294,7 +366,10 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
294
366
  overlayLoadingTaskCount: _angular_core.Signal<number>;
295
367
  navigationLoadingTaskCount: _angular_core.Signal<number>;
296
368
  sideMenuState: _angular_core.Signal<_acorex_platform_themes_shared.AXPSideMenuState>;
369
+ overlaySideMenuOpen: _angular_core.Signal<boolean>;
297
370
  sideMenuWidth: _angular_core.Signal<number>;
371
+ sideMenuCompactWidth: _angular_core.Signal<number>;
372
+ menuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
298
373
  menuOrientation: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuOrientation>;
299
374
  isPrinting: _angular_core.Signal<boolean>;
300
375
  isDarkMode: _angular_core.Signal<boolean>;
@@ -304,10 +379,14 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
304
379
  isOverlayLoading: _angular_core.Signal<boolean>;
305
380
  isNavigationLoading: _angular_core.Signal<boolean>;
306
381
  isMenuHorizontal: _angular_core.Signal<boolean>;
382
+ effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
383
+ sideMenuDrawerWidth: _angular_core.Signal<number>;
307
384
  changeThemeMode: (theme: _acorex_platform_themes_shared.AXPThemeMode) => void;
308
385
  openSideMenu: () => void;
309
386
  closeSideMenu: () => void;
310
387
  setSideMenuWidth: (width: number) => void;
388
+ setSideMenuCompactWidth: (width: number) => void;
389
+ setSideMenuDrawerWidth: (width: number) => void;
311
390
  toggleSideMenu: () => void;
312
391
  setNavigationLoading: (value: boolean, delay?: number) => void;
313
392
  setOverlayLoading: (value: boolean, delay?: number) => void;
@@ -325,7 +404,10 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
325
404
  overlayLoadingTaskCount: number;
326
405
  navigationLoadingTaskCount: number;
327
406
  sideMenuState: _acorex_platform_themes_shared.AXPSideMenuState;
407
+ overlaySideMenuOpen: boolean;
328
408
  sideMenuWidth: number;
409
+ sideMenuCompactWidth: number;
410
+ menuVerticalMode: _acorex_platform_themes_shared.AXPMenuVerticalMode;
329
411
  menuOrientation: _acorex_platform_themes_shared.AXPMenuOrientation;
330
412
  isPrinting: boolean;
331
413
  }>;
@@ -360,7 +442,13 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
360
442
  interface AXPLayoutDetailsViewAction extends AXPActionMenuItem {
361
443
  zone: 'header' | 'footer';
362
444
  priority: 'primary' | 'secondary';
445
+ scope?: AXPEntityCommandScope;
363
446
  }
447
+ type AXPPageContentItem = AXPWidgetNode | {
448
+ type: 'component';
449
+ componentKey: string;
450
+ pageConfig?: Record<string, unknown>;
451
+ };
364
452
  interface AXPLayoutDetailsViewTabItem {
365
453
  id: string;
366
454
  title: string;
@@ -372,28 +460,42 @@ interface AXPLayoutDetailsViewTabItem {
372
460
  }
373
461
  interface AXPLayoutDetailsViewPage {
374
462
  id: string;
375
- title: string;
376
- label: string;
377
- description?: string;
463
+ title: AXPMultiLanguageString;
464
+ label: AXPMultiLanguageString;
465
+ description?: AXPMultiLanguageString;
378
466
  icon?: string;
379
- content?: AXPWidgetNode[];
467
+ /**
468
+ * Content can be either widget nodes or component references
469
+ */
470
+ content?: AXPPageContentItem[];
380
471
  tabs?: AXPLayoutDetailsViewTabItem[];
472
+ /**
473
+ * Static actions array (legacy, use getActions for reactive actions)
474
+ */
381
475
  actions?: AXPLayoutDetailsViewAction[];
476
+ /**
477
+ * Function to get actions dynamically (supports reactive updates from component instances)
478
+ */
479
+ getActions?: () => Promise<AXPLayoutDetailsViewAction[]>;
382
480
  isPrimary?: boolean;
383
481
  isReadonly?: boolean;
384
482
  settings?: {
385
483
  commands?: {
386
484
  accept?: {
387
485
  title: string;
486
+ icon?: string;
388
487
  color: string;
389
488
  visible?: string | boolean;
390
489
  command: AXPExecuteCommand;
490
+ shortcuts?: AXPKeyboardShortcut[];
391
491
  };
392
492
  reject?: {
393
493
  title: string;
494
+ icon?: string;
394
495
  color: string;
395
496
  visible?: string | boolean;
396
497
  command: AXPExecuteCommand;
498
+ shortcuts?: AXPKeyboardShortcut[];
397
499
  };
398
500
  };
399
501
  };
@@ -402,16 +504,18 @@ interface AXPLayoutDetailsViewPage {
402
504
  }
403
505
  interface AXPLayoutDetailsViewAdapter {
404
506
  name: string;
405
- title?: string;
406
- label?: string;
407
- description?: string;
507
+ title?: AXPMultiLanguageString;
508
+ label?: AXPMultiLanguageString;
509
+ description?: AXPMultiLanguageString;
408
510
  icon?: string;
409
511
  actions?: AXPLayoutDetailsViewAction[];
410
512
  breadcrumbs?: AXPBreadcrumbItem[];
411
513
  pages: AXPLayoutDetailsViewPage[];
412
514
  execute?: (command: AXPExecuteCommand, context: {}) => Promise<AXPExecuteCommandResult>;
413
- load?: (params?: Record<string, any>) => Promise<AXPExecuteCommandResult>;
515
+ load?: (params?: Record<string, unknown>) => Promise<AXPExecuteCommandResult>;
414
516
  exitUrl?: string;
517
+ getPageBadge?: (context: Record<string, unknown>, isDirty: boolean) => Promise<AXPBadge | null>;
518
+ getPageStatus?: (context: Record<string, unknown>, currentPage: AXPLayoutDetailsViewPage | null) => Promise<AXPPageStatus | null>;
415
519
  }
416
520
 
417
521
  declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
@@ -420,57 +524,53 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
420
524
  previousContext: _angular_core.Signal<Record<string, any>>;
421
525
  context: _angular_core.Signal<Record<string, any>>;
422
526
  scope: _angular_core.Signal<AXPExpressionEvaluatorScope | null>;
423
- status: _angular_core.Signal<AXPPageStatus>;
527
+ status: _angular_core.Signal<AXPPageStatus$1>;
424
528
  currentPage: _angular_core.Signal<AXPLayoutDetailsViewPage | null>;
425
529
  currentTab: _angular_core.Signal<AXPLayoutDetailsViewTabItem | null>;
426
530
  pageSelectedRows: _angular_core.Signal<any[]>;
427
- renderedTabsCache: _angular_core.Signal<Record<string, {
428
- tabId: string;
429
- tab: AXPLayoutDetailsViewTabItem;
430
- }[]>>;
531
+ evaluatedPageContent: _angular_core.Signal<AXPWidgetNode[]>;
532
+ evaluatedTabContentsById: _angular_core.Signal<Record<string, AXPWidgetNode[]>>;
533
+ formDirty: _angular_core.Signal<boolean>;
431
534
  icon: _angular_core.Signal<string | null>;
432
- content: _angular_core.Signal<_acorex_platform_layout_widget_core.AXPWidgetNode[]>;
535
+ content: _angular_core.Signal<_acorex_platform_layout_views.AXPPageContentItem[]>;
433
536
  showPages: _angular_core.Signal<boolean>;
434
537
  isLarge: _angular_core.Signal<boolean>;
435
538
  isBusy: _angular_core.Signal<boolean>;
436
539
  isSaving: _angular_core.Signal<boolean>;
437
540
  isDirty: _angular_core.Signal<boolean>;
438
- changesCount: _angular_core.Signal<number>;
541
+ changesCount: _angular_core.Signal<1 | 0>;
439
542
  isLoaded: _angular_core.Signal<boolean>;
440
543
  currentPageSelectedRows: _angular_core.Signal<any[]>;
441
- currentPageRenderedTabs: _angular_core.Signal<{
442
- tabId: string;
443
- tab: AXPLayoutDetailsViewTabItem;
444
- }[]>;
544
+ activeTabContent: _angular_core.Signal<AXPWidgetNode[]>;
445
545
  loadAdapter: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
446
546
  loadPage: (pageId?: string, forceRefresh?: boolean) => Promise<void>;
447
547
  load: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
448
548
  updateContext: (context: any) => void;
549
+ setFormDirty: (dirty: boolean) => void;
449
550
  updatePageSelectedRows: (rows: any[]) => void;
450
- currentPageTitle: () => string | null;
451
- currentPageDescription: () => string | null;
452
551
  currentPagePrimaryActions: () => Promise<any>;
453
552
  currentPageSecondaryActions: () => Promise<any>;
454
- currentPageContent: () => _acorex_platform_layout_widget_core.AXPWidgetNode[] | undefined;
553
+ currentPageContent: () => AXPWidgetNode[];
455
554
  currentPageTabs: () => AXPLayoutDetailsViewTabItem[] | undefined;
456
555
  setCurrentPage: (page: AXPLayoutDetailsViewPage | null) => void;
457
556
  setCurrentTab: (tab: AXPLayoutDetailsViewTabItem) => void;
458
- getCurrentTabContent: () => _acorex_platform_layout_widget_core.AXPWidgetNode[];
459
- getRenderedTabContent: (tabId: string) => _acorex_platform_layout_widget_core.AXPWidgetNode[];
460
- clearPageTabCache: (pageId: string) => void;
461
- title: () => string | null;
462
- backButtonTitle: () => string | null;
463
- description: () => string | null;
557
+ backButtonTitle: () => _acorex_core_translation.AXMultiLanguageString;
558
+ getPageTitle: () => Promise<AXPMultiLanguageString>;
559
+ getPageDescription: () => Promise<AXPMultiLanguageString | null>;
560
+ getBackButton: () => Promise<AXPBackButton | null>;
561
+ getPageBadge: () => Promise<AXPBadge | null>;
562
+ getPageStatus: () => Promise<AXPPageStatus | null>;
464
563
  primaryActions: () => Promise<any>;
465
564
  secondaryActions: () => Promise<any>;
466
565
  breadcrumbs: () => Promise<{
467
- title: string;
566
+ title: _acorex_core_translation.AXMultiLanguageString;
468
567
  name?: string;
469
568
  icon?: string;
470
569
  command?: AXPExecuteCommand;
471
570
  }[]>;
571
+ applySavedState: (context: Record<string, unknown>) => void;
472
572
  discard: () => Promise<void>;
473
- save: (command: AXPExecuteCommand, form: AXFormComponent) => Promise<void>;
573
+ save: (command: AXPExecuteCommand, form: AXFormComponent, liveContext?: Record<string, unknown>) => Promise<boolean>;
474
574
  goToListPage: () => void;
475
575
  } & _ngrx_signals.StateSource<{
476
576
  adapter: AXPLayoutDetailsViewAdapter | null;
@@ -478,14 +578,13 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
478
578
  previousContext: Record<string, any>;
479
579
  context: Record<string, any>;
480
580
  scope: AXPExpressionEvaluatorScope | null;
481
- status: AXPPageStatus;
581
+ status: AXPPageStatus$1;
482
582
  currentPage: AXPLayoutDetailsViewPage | null;
483
583
  currentTab: AXPLayoutDetailsViewTabItem | null;
484
584
  pageSelectedRows: any[];
485
- renderedTabsCache: Record<string, Array<{
486
- tabId: string;
487
- tab: AXPLayoutDetailsViewTabItem;
488
- }>>;
585
+ evaluatedPageContent: AXPWidgetNode[];
586
+ evaluatedTabContentsById: Record<string, AXPWidgetNode[]>;
587
+ formDirty: boolean;
489
588
  }>>;
490
589
 
491
590
  declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent implements OnInit, OnDestroy {
@@ -501,53 +600,49 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
501
600
  currentPage: _angular_core.Signal<AXPLayoutDetailsViewPage | null>;
502
601
  currentTab: _angular_core.Signal<_acorex_platform_layout_views.AXPLayoutDetailsViewTabItem | null>;
503
602
  pageSelectedRows: _angular_core.Signal<any[]>;
504
- renderedTabsCache: _angular_core.Signal<Record<string, {
505
- tabId: string;
506
- tab: _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem;
507
- }[]>>;
603
+ evaluatedPageContent: _angular_core.Signal<_acorex_platform_layout_widget_core.AXPWidgetNode[]>;
604
+ evaluatedTabContentsById: _angular_core.Signal<Record<string, _acorex_platform_layout_widget_core.AXPWidgetNode[]>>;
605
+ formDirty: _angular_core.Signal<boolean>;
508
606
  icon: _angular_core.Signal<string | null>;
509
- content: _angular_core.Signal<_acorex_platform_layout_widget_core.AXPWidgetNode[]>;
607
+ content: _angular_core.Signal<AXPPageContentItem[]>;
510
608
  showPages: _angular_core.Signal<boolean>;
511
609
  isLarge: _angular_core.Signal<boolean>;
512
610
  isBusy: _angular_core.Signal<boolean>;
513
611
  isSaving: _angular_core.Signal<boolean>;
514
612
  isDirty: _angular_core.Signal<boolean>;
515
- changesCount: _angular_core.Signal<number>;
613
+ changesCount: _angular_core.Signal<1 | 0>;
516
614
  isLoaded: _angular_core.Signal<boolean>;
517
615
  currentPageSelectedRows: _angular_core.Signal<any[]>;
518
- currentPageRenderedTabs: _angular_core.Signal<{
519
- tabId: string;
520
- tab: _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem;
521
- }[]>;
616
+ activeTabContent: _angular_core.Signal<_acorex_platform_layout_widget_core.AXPWidgetNode[]>;
522
617
  loadAdapter: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
523
618
  loadPage: (pageId?: string, forceRefresh?: boolean) => Promise<void>;
524
619
  load: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
525
620
  updateContext: (context: any) => void;
621
+ setFormDirty: (dirty: boolean) => void;
526
622
  updatePageSelectedRows: (rows: any[]) => void;
527
- currentPageTitle: () => string | null;
528
- currentPageDescription: () => string | null;
529
623
  currentPagePrimaryActions: () => Promise<any>;
530
624
  currentPageSecondaryActions: () => Promise<any>;
531
- currentPageContent: () => _acorex_platform_layout_widget_core.AXPWidgetNode[] | undefined;
625
+ currentPageContent: () => _acorex_platform_layout_widget_core.AXPWidgetNode[];
532
626
  currentPageTabs: () => _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem[] | undefined;
533
627
  setCurrentPage: (page: AXPLayoutDetailsViewPage | null) => void;
534
628
  setCurrentTab: (tab: _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem) => void;
535
- getCurrentTabContent: () => _acorex_platform_layout_widget_core.AXPWidgetNode[];
536
- getRenderedTabContent: (tabId: string) => _acorex_platform_layout_widget_core.AXPWidgetNode[];
537
- clearPageTabCache: (pageId: string) => void;
538
- title: () => string | null;
539
- backButtonTitle: () => string | null;
540
- description: () => string | null;
629
+ backButtonTitle: () => _acorex_core_translation.AXMultiLanguageString;
630
+ getPageTitle: () => Promise<AXPMultiLanguageString>;
631
+ getPageDescription: () => Promise<AXPMultiLanguageString | null>;
632
+ getBackButton: () => Promise<AXPBackButton | null>;
633
+ getPageBadge: () => Promise<AXPBadge | null>;
634
+ getPageStatus: () => Promise<AXPPageStatus | null>;
541
635
  primaryActions: () => Promise<any>;
542
636
  secondaryActions: () => Promise<any>;
543
637
  breadcrumbs: () => Promise<{
544
- title: string;
638
+ title: _acorex_core_translation.AXMultiLanguageString;
545
639
  name?: string;
546
640
  icon?: string;
547
641
  command?: AXPExecuteCommand;
548
642
  }[]>;
643
+ applySavedState: (context: Record<string, unknown>) => void;
549
644
  discard: () => Promise<void>;
550
- save: (command: AXPExecuteCommand, form: AXFormComponent) => Promise<void>;
645
+ save: (command: AXPExecuteCommand, form: AXFormComponent, liveContext?: Record<string, unknown>) => Promise<boolean>;
551
646
  goToListPage: () => void;
552
647
  } & _ngrx_signals.StateSource<{
553
648
  adapter: AXPLayoutDetailsViewAdapter | null;
@@ -559,24 +654,63 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
559
654
  currentPage: AXPLayoutDetailsViewPage | null;
560
655
  currentTab: _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem | null;
561
656
  pageSelectedRows: any[];
562
- renderedTabsCache: Record<string, Array<{
563
- tabId: string;
564
- tab: _acorex_platform_layout_views.AXPLayoutDetailsViewTabItem;
565
- }>>;
657
+ evaluatedPageContent: _acorex_platform_layout_widget_core.AXPWidgetNode[];
658
+ evaluatedTabContentsById: Record<string, _acorex_platform_layout_widget_core.AXPWidgetNode[]>;
659
+ formDirty: boolean;
566
660
  }>;
567
661
  protected router: Router;
568
662
  protected route: ActivatedRoute;
569
663
  protected eventService: AXPBroadcastEventService;
570
664
  protected deviceService: AXPDeviceService;
665
+ private readonly unsavedChangesConfirm;
666
+ private readonly unsavedChangesPopstate;
667
+ private readonly pageComponentInstanceRegistry;
668
+ private readonly shortcutRegistry;
669
+ private readonly destroyRef;
670
+ private readonly elementRef;
571
671
  private onSelectionChangeSubscription?;
672
+ /** Prevents sidebar tab init events from pushing history before {@link ngOnInit} load completes. */
673
+ private detailsLayoutReady;
572
674
  private readonly destroyed$;
675
+ private footerActionsGeneration;
676
+ private keyboardShortcutRegistrationGeneration;
677
+ /** Header actions with resolved shortcut chords, keyed by command name. */
678
+ private readonly actionShortcutEntries;
679
+ /** Save/discard use live {@link AXPLayoutDetailsViewViewModel.isDirty}; other actions use evaluated `visible`. */
680
+ private static isTruthyActionFlag;
573
681
  protected form: _angular_core.Signal<AXFormComponent | undefined>;
574
682
  protected widgetContainer: _angular_core.Signal<AXPWidgetContainerComponent | undefined>;
683
+ private readonly sidebarTabs;
684
+ private sidebarTabChangeSuppressed;
575
685
  protected footerPrimaryActions: _angular_core.WritableSignal<AXPActionMenuItem[]>;
576
686
  protected footerSecondaryActions: _angular_core.WritableSignal<AXPActionMenuItem[]>;
577
687
  protected footerActions: _angular_core.Signal<AXPActionMenuItem[]>;
688
+ protected rejectFooterCommand: _angular_core.Signal<{
689
+ title: string;
690
+ icon?: string;
691
+ color: string;
692
+ visible?: string | boolean;
693
+ command: AXPExecuteCommand;
694
+ shortcuts?: _acorex_platform_core.AXPKeyboardShortcut[];
695
+ } | null>;
696
+ protected acceptFooterCommand: _angular_core.Signal<{
697
+ title: string;
698
+ icon?: string;
699
+ color: string;
700
+ visible?: string | boolean;
701
+ command: AXPExecuteCommand;
702
+ shortcuts?: _acorex_platform_core.AXPKeyboardShortcut[];
703
+ } | null>;
704
+ protected hasSaveDiscardFooterCommands: _angular_core.Signal<boolean>;
705
+ /** Entity save/discard — driven live by widget/container dirty state, not evaluated action metadata. */
706
+ protected showSaveDiscardFooter: _angular_core.Signal<boolean>;
707
+ /** Live dirty flag for widget-based entity forms (not component-hosted pages). */
708
+ protected liveFormIsDirty: _angular_core.Signal<boolean>;
578
709
  protected hasVisibleFooterPrimaryActions: _angular_core.Signal<boolean>;
579
710
  protected hasVisibleFooterSecondaryActions: _angular_core.Signal<boolean>;
711
+ protected isSaveDiscardFooterAction(action: AXPActionMenuItem): boolean;
712
+ protected isFooterActionVisible(action: AXPActionMenuItem): boolean;
713
+ protected isFooterActionDisabled(action: AXPActionMenuItem): boolean;
580
714
  protected hasFooter: _angular_core.Signal<boolean>;
581
715
  /**
582
716
  * Append timestamp query param to trigger router to re-run guards/resolvers
@@ -585,24 +719,133 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
585
719
  ngOnInit(): Promise<void>;
586
720
  ngAfterViewInit(): Promise<void>;
587
721
  ngOnDestroy(): void;
588
- protected handleOnContextChanged(e: AXPWidgetCoreContextChangeEvent): void;
589
- protected handleSelectPage(page: AXPLayoutDetailsViewPage): void;
722
+ private refreshFooterActions;
723
+ protected handleOnContextChanged(e: AXPContextChangeEvent): void;
724
+ private getLiveFormContext;
725
+ private finalizeSave;
726
+ private finalizeDiscard;
727
+ /**
728
+ * `ax-tabs` selects on click before we can confirm. Revert synchronously, then confirm + switch.
729
+ */
730
+ protected handleSidebarTabChanged(event: AXTabStripChangedEvent): void;
731
+ protected handleSelectPage(page: AXPLayoutDetailsViewPage): Promise<void>;
732
+ private completePageSwitch;
590
733
  protected getAllPrimaryActions(): Promise<AXPLayoutDetailsViewAction[]>;
591
- protected getPrimaryMenuItems(): Promise<AXPActionMenuItem[]>;
734
+ getPrimaryMenuItems(): Promise<AXPActionMenuItem[]>;
592
735
  protected getFooterPrimaryActions(): Promise<AXPActionMenuItem[]>;
593
736
  protected getAllSecondaryActions(): Promise<AXPLayoutDetailsViewAction[]>;
594
- protected getSecondaryMenuItems(): Promise<AXPActionMenuItem[]>;
737
+ getSecondaryMenuItems(): Promise<AXPActionMenuItem[]>;
595
738
  protected getFooterSecondaryActions(): Promise<AXPActionMenuItem[]>;
596
739
  protected getPageBreadcrumbs(): Promise<AXPBreadcrumbItem[]>;
597
- protected getPageTitle(): Promise<string>;
598
- getPageDescription(): Promise<string | null>;
740
+ protected getPageTitle(): Promise<AXPMultiLanguageString>;
741
+ getPageDescription(): Promise<AXPMultiLanguageString | null>;
599
742
  getBackButton(): Promise<AXPBackButton | null>;
743
+ getPageBadge(): Promise<AXPBadge | null>;
744
+ getPageStatus(): Promise<AXPPageStatus | null>;
745
+ /**
746
+ * Get entity data for status chip component
747
+ */
748
+ getEntityData(): Record<string, any> | null;
600
749
  onBackButtonClick(): Promise<void>;
750
+ /**
751
+ * Router guard hook — same unsaved-changes confirm as dialog builder {@link confirmCloseWhenDirty}.
752
+ */
753
+ canDeactivate(): Promise<boolean>;
754
+ /** Active entity component page instance, when the current details sub-page is component-based. */
755
+ private getActivePageComponentInstance;
756
+ /** Component key for the current details sub-page, when content is component-based. */
757
+ private getActivePageComponentKey;
758
+ private static isComponentPageContent;
759
+ /** Whether the active component-based entity page has unsaved edits. */
760
+ private isActivePageComponentDirty;
761
+ /** Whether the current details page has user-origin unsaved edits (form or component page). */
762
+ private shouldPromptLeave;
763
+ /** Single gate for leaving the page or switching details sub-pages when dirty. */
764
+ private confirmLeaveIfDirty;
601
765
  execute(command: AXPExecuteCommand): Promise<void>;
602
- protected handleKeyboardEvent(event: KeyboardEvent): Promise<void>;
766
+ /**
767
+ * After a component-based page command (e.g. custom discard/save), align view-model dirty
768
+ * state and widget context with the hosted page when it no longer reports unsaved changes.
769
+ */
770
+ private syncDirtyStateAfterPageComponentCommand;
771
+ /** Waits for builder/effect microtasks to finish after a component page command. */
772
+ private waitForComponentDirtySettle;
773
+ private refreshKeyboardShortcutRegistrations;
774
+ private collectActionShortcutEntries;
775
+ private isHeaderActionAvailable;
776
+ /** Whether save/discard core shortcuts are listed in the help dialog (page supports them). */
777
+ private isCoreSaveShortcutAvailable;
778
+ private isCoreDiscardShortcutAvailable;
779
+ private canExecuteSaveShortcut;
780
+ private canExecuteDiscardShortcut;
781
+ private executeDiscardViaShortcut;
782
+ private isActionShortcutActive;
783
+ private registerCoreKeyboardShortcuts;
784
+ private registerActionKeyboardShortcuts;
603
785
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPLayoutDetailsViewComponent, never>;
604
786
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPLayoutDetailsViewComponent, "axp-layout-details-view", never, { "adapter": { "alias": "adapter"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
605
787
  }
606
788
 
607
- export { AXPLayoutDetailsViewComponent, AXPLayoutDetailsViewViewModel, AXPPageLayoutBase, AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPopupLayoutBase, AXPPopupLayoutBaseComponent, AXPPopupLayoutComponent };
608
- export type { AXPLayoutDetailsViewAction, AXPLayoutDetailsViewAdapter, AXPLayoutDetailsViewPage, AXPLayoutDetailsViewTabItem };
789
+ type AXPDetailsViewActionShortcut = AXPKeyboardShortcutChord;
790
+ /**
791
+ * Returns the base workflow/command name from a composite entity action command id (`cmd&actionName`).
792
+ */
793
+ declare function getDetailsViewActionCommandBaseName(commandName: string | undefined): string;
794
+ /**
795
+ * Resolves keyboard shortcuts for a header entity action.
796
+ * Explicit `shortcuts` wins; pass `[]` to disable. Otherwise known commands use platform defaults.
797
+ */
798
+ declare function resolveDetailsViewActionShortcuts(commandBaseName: string, explicit?: readonly AXPKeyboardShortcut[]): AXPDetailsViewActionShortcut[] | undefined;
799
+ /**
800
+ * Resolves save/discard footer command shortcuts from page settings.
801
+ */
802
+ declare function resolveDetailsViewFooterCommandShortcuts(commandName: string, explicit?: readonly AXPKeyboardShortcut[]): AXPDetailsViewActionShortcut[] | undefined;
803
+
804
+ /**
805
+ * Prompts for unsaved changes before leaving the entity details route (breadcrumbs, menu, back to list).
806
+ */
807
+ declare const axpDetailsViewCanDeactivateGuard: _angular_router.CanDeactivateFn<AXPLayoutDetailsViewComponent>;
808
+
809
+ /**
810
+ * Registry of rendered page component instances by component key.
811
+ * Used so page execute can delegate to the actual component instance in the view.
812
+ */
813
+ declare class AXPPageComponentInstanceRegistryService {
814
+ private readonly instances;
815
+ register(key: string, instance: AXPPageLayoutBaseComponent): void;
816
+ unregister(key: string): void;
817
+ get(key: string): AXPPageLayoutBaseComponent | null;
818
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPageComponentInstanceRegistryService, never>;
819
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPPageComponentInstanceRegistryService>;
820
+ }
821
+
822
+ /**
823
+ * Directive for rendering page components dynamically
824
+ * Similar to component-slot pattern but specifically for page components
825
+ */
826
+ declare class AXPPageComponentRendererDirective implements OnInit, OnDestroy {
827
+ #private;
828
+ componentKey: _angular_core.InputSignal<string>;
829
+ rootContext: _angular_core.InputSignal<Record<string, any>>;
830
+ pageConfig: _angular_core.InputSignal<Record<string, unknown> | undefined>;
831
+ options: _angular_core.InputSignal<Record<string, any>>;
832
+ /** Emitted when the component instance is registered and ready */
833
+ componentReady: _angular_core.OutputEmitterRef<string>;
834
+ /** Returns the dynamically mounted page component instance, if loaded. */
835
+ getMountedPageInstance(): unknown;
836
+ private viewContainerRef;
837
+ private pageComponentRegistry;
838
+ private instanceRegistry;
839
+ private contextStore;
840
+ private componentRef;
841
+ ngOnInit(): Promise<void>;
842
+ ngOnDestroy(): void;
843
+ /** Persists page edits into the shared form context before the step component is destroyed. */
844
+ private syncWizardStepContextBeforeTeardown;
845
+ private loadComponent;
846
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPageComponentRendererDirective, never>;
847
+ 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
+ }
849
+
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 };