@acorex/platform 21.0.0-next.8 → 21.0.0-next.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/contracts/README.md +3 -0
- package/fesm2022/acorex-platform-auth.mjs +201 -81
- package/fesm2022/acorex-platform-auth.mjs.map +1 -1
- package/fesm2022/acorex-platform-common-common-settings.provider-Ytey9uhY.mjs +177 -0
- package/fesm2022/acorex-platform-common-common-settings.provider-Ytey9uhY.mjs.map +1 -0
- package/fesm2022/acorex-platform-common.mjs +4490 -880
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-contracts.mjs +38 -0
- package/fesm2022/acorex-platform-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-core.mjs +2612 -667
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-domain.mjs +557 -826
- package/fesm2022/acorex-platform-domain.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +1255 -209
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs +121 -0
- package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-components.mjs +6486 -1915
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +612 -287
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity-attachments-page.component-CwG6n_Yb.mjs +376 -0
- package/fesm2022/acorex-platform-layout-entity-attachments-page.component-CwG6n_Yb.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-entity-file-list-popup.component--IeMZLIr.mjs +100 -0
- package/fesm2022/acorex-platform-layout-entity-file-list-popup.component--IeMZLIr.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-entity.mjs +22502 -9964
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-views.mjs +1360 -338
- package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widget-core.mjs +2226 -524
- package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs → acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs} +10 -10
- package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dy7jF-oD.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs → acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs} +6 -7
- package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-C_EPAvCU.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs → acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs} +12 -12
- package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-D10yO28c.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs +116 -0
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-J0zcGKBX.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-DjpZU6gz.mjs} +6 -6
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-DjpZU6gz.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-gX-3Kx9I.mjs.map +1 -0
- 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
- package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Vo4fWHtX.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-widgets.mjs +18742 -16715
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- package/fesm2022/acorex-platform-native.mjs +8 -7
- package/fesm2022/acorex-platform-native.mjs.map +1 -1
- package/fesm2022/acorex-platform-runtime.mjs +391 -166
- package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs +160 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CWLfNqV0.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs +120 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-C7cT82K2.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs → acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs} +21 -28
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-Br9p5aXT.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-error-401.component-B1nsdpTY.mjs +48 -0
- package/fesm2022/acorex-platform-themes-default-error-401.component-B1nsdpTY.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-error-404.component-D4UvRe8u.mjs +42 -0
- package/fesm2022/acorex-platform-themes-default-error-404.component-D4UvRe8u.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs +19 -0
- package/fesm2022/acorex-platform-themes-default-error-offline.component-DR6G8gPC.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default.mjs +2337 -94
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs → acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs} +6 -6
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-CqkWJYdv.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs → acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs} +6 -6
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-BOTuLdWN.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs → acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs} +52 -33
- package/fesm2022/acorex-platform-themes-shared-settings.provider-BjuzSe0T.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs +94 -0
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-D566Kdvy.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs +86 -0
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-D7-rCGl7.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-shared.mjs +793 -612
- package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
- package/fesm2022/acorex-platform-workflow.mjs +997 -274
- package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
- package/fesm2022/acorex-platform.mjs.map +1 -1
- package/package.json +41 -35
- package/{auth/index.d.ts → types/acorex-platform-auth.d.ts} +40 -19
- package/types/acorex-platform-common.d.ts +3673 -0
- package/types/acorex-platform-contracts.d.ts +940 -0
- package/{core/index.d.ts → types/acorex-platform-core.d.ts} +1029 -170
- package/{domain/index.d.ts → types/acorex-platform-domain.d.ts} +744 -412
- package/{layout/builder/index.d.ts → types/acorex-platform-layout-builder.d.ts} +262 -55
- package/types/acorex-platform-layout-components.d.ts +3329 -0
- package/{layout/designer/index.d.ts → types/acorex-platform-layout-designer.d.ts} +96 -18
- package/types/acorex-platform-layout-entity.d.ts +4512 -0
- package/{layout/views/index.d.ts → types/acorex-platform-layout-views.d.ts} +334 -91
- package/{layout/widget-core/index.d.ts → types/acorex-platform-layout-widget-core.d.ts} +438 -162
- package/{layout/widgets/index.d.ts → types/acorex-platform-layout-widgets.d.ts} +1152 -507
- package/{native/index.d.ts → types/acorex-platform-native.d.ts} +0 -7
- package/types/acorex-platform-runtime.d.ts +571 -0
- package/{themes/default/index.d.ts → types/acorex-platform-themes-default.d.ts} +268 -11
- package/{themes/shared/index.d.ts → types/acorex-platform-themes-shared.d.ts} +30 -2
- package/{workflow/index.d.ts → types/acorex-platform-workflow.d.ts} +436 -748
- package/common/index.d.ts +0 -2470
- package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs +0 -71
- package/fesm2022/acorex-platform-common-common-settings.provider-zhqNP3xb.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-C3VoBb_b.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs +0 -135
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-CxrsI6Hn.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-V31OpYah.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-BtZMBxYp.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-Ck7-wpT2.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-y8vjUiVs.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-Df1BFkSa.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs +0 -157
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-VIGuU5M4.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-D3qZa5fM.mjs +0 -1542
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-D3qZa5fM.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs +0 -101
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-Ua3ZA5hk.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-eMBby9k4.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-401.component-cfREo88K.mjs +0 -31
- package/fesm2022/acorex-platform-themes-default-error-401.component-cfREo88K.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs +0 -25
- package/fesm2022/acorex-platform-themes-default-error-404.component-CdCV5ZoA.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs +0 -19
- package/fesm2022/acorex-platform-themes-default-error-offline.component-E7SzBcAt.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-C0EpfU2k.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-9W52W6Nu.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-settings.provider-DSs1o1M6.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-Dz0cylyQ.mjs +0 -65
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-Dz0cylyQ.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs +0 -64
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-DY0JtT1v.mjs.map +0 -1
- package/layout/components/index.d.ts +0 -1670
- package/layout/entity/index.d.ts +0 -2294
- package/runtime/index.d.ts +0 -307
- /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
|
|
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<
|
|
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<
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
181
|
-
|
|
223
|
+
breadcrumbs: _angular_core.WritableSignal<AXPBreadcrumbItem[]>;
|
|
224
|
+
hasBreadcrumbs: _angular_core.Signal<boolean>;
|
|
182
225
|
protected getPageBreadcrumbs(): AXPBreadcrumbItem[] | Promise<AXPBreadcrumbItem[]>;
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
376
|
-
label:
|
|
377
|
-
description?:
|
|
463
|
+
title: AXPMultiLanguageString;
|
|
464
|
+
label: AXPMultiLanguageString;
|
|
465
|
+
description?: AXPMultiLanguageString;
|
|
378
466
|
icon?: string;
|
|
379
|
-
|
|
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?:
|
|
406
|
-
label?:
|
|
407
|
-
description?:
|
|
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,
|
|
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
|
-
|
|
428
|
-
|
|
429
|
-
|
|
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<
|
|
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<
|
|
541
|
+
changesCount: _angular_core.Signal<1 | 0>;
|
|
439
542
|
isLoaded: _angular_core.Signal<boolean>;
|
|
440
543
|
currentPageSelectedRows: _angular_core.Signal<any[]>;
|
|
441
|
-
|
|
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: () =>
|
|
553
|
+
currentPageContent: () => AXPWidgetNode[];
|
|
455
554
|
currentPageTabs: () => AXPLayoutDetailsViewTabItem[] | undefined;
|
|
456
555
|
setCurrentPage: (page: AXPLayoutDetailsViewPage | null) => void;
|
|
457
556
|
setCurrentTab: (tab: AXPLayoutDetailsViewTabItem) => void;
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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:
|
|
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<
|
|
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
|
-
|
|
486
|
-
|
|
487
|
-
|
|
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
|
-
|
|
505
|
-
|
|
506
|
-
|
|
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<
|
|
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<
|
|
613
|
+
changesCount: _angular_core.Signal<1 | 0>;
|
|
516
614
|
isLoaded: _angular_core.Signal<boolean>;
|
|
517
615
|
currentPageSelectedRows: _angular_core.Signal<any[]>;
|
|
518
|
-
|
|
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[]
|
|
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
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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:
|
|
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<
|
|
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
|
-
|
|
563
|
-
|
|
564
|
-
|
|
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
|
-
|
|
589
|
-
protected
|
|
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
|
-
|
|
734
|
+
getPrimaryMenuItems(): Promise<AXPActionMenuItem[]>;
|
|
592
735
|
protected getFooterPrimaryActions(): Promise<AXPActionMenuItem[]>;
|
|
593
736
|
protected getAllSecondaryActions(): Promise<AXPLayoutDetailsViewAction[]>;
|
|
594
|
-
|
|
737
|
+
getSecondaryMenuItems(): Promise<AXPActionMenuItem[]>;
|
|
595
738
|
protected getFooterSecondaryActions(): Promise<AXPActionMenuItem[]>;
|
|
596
739
|
protected getPageBreadcrumbs(): Promise<AXPBreadcrumbItem[]>;
|
|
597
|
-
protected getPageTitle(): Promise<
|
|
598
|
-
getPageDescription(): Promise<
|
|
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
|
-
|
|
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
|
-
|
|
608
|
-
|
|
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 };
|