@acorex/platform 21.0.0-next.88 → 21.0.0-next.90

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 (55) hide show
  1. package/fesm2022/acorex-platform-auth.mjs +8 -2
  2. package/fesm2022/acorex-platform-auth.mjs.map +1 -1
  3. package/fesm2022/{acorex-platform-common-common-settings.provider-VfmZct9H.mjs → acorex-platform-common-common-settings.provider-DilV4dql.mjs} +15 -42
  4. package/fesm2022/acorex-platform-common-common-settings.provider-DilV4dql.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-common.mjs +3299 -3200
  6. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-contracts.mjs +1 -0
  8. package/fesm2022/acorex-platform-contracts.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-core.mjs +643 -30
  10. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  11. package/fesm2022/acorex-platform-layout-builder.mjs +98 -189
  12. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  13. package/fesm2022/{acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs → acorex-platform-layout-components-binding-expression-editor-popup.component-RttFwaw9.mjs} +17 -4
  14. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-RttFwaw9.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-layout-components.mjs +125 -26
  16. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  17. package/fesm2022/acorex-platform-layout-designer.mjs +4 -4
  18. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-layout-entity-contracts.mjs +106 -12
  20. package/fesm2022/acorex-platform-layout-entity-contracts.mjs.map +1 -1
  21. package/fesm2022/acorex-platform-layout-entity.mjs +512 -155
  22. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  23. package/fesm2022/acorex-platform-layout-views.mjs +921 -173
  24. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  25. package/fesm2022/acorex-platform-layout-widget-core.mjs +380 -103
  26. package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
  27. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-D4MOHEpI.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-BvFykMTH.mjs} +2 -2
  28. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-D4MOHEpI.mjs.map → acorex-platform-layout-widgets-tabular-data-edit-popup.component-BvFykMTH.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-gX-3Kx9I.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-CntopmDS.mjs} +2 -2
  30. package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component-gX-3Kx9I.mjs.map → acorex-platform-layout-widgets-tabular-data-view-popup.component-CntopmDS.mjs.map} +1 -1
  31. package/fesm2022/acorex-platform-layout-widgets.mjs +575 -239
  32. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  33. package/fesm2022/acorex-platform-themes-default.mjs +232 -25
  34. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  35. package/fesm2022/{acorex-platform-themes-shared-settings.provider-BUwPqwUS.mjs → acorex-platform-themes-shared-settings.provider-UyKdkeyk.mjs} +48 -1
  36. package/fesm2022/acorex-platform-themes-shared-settings.provider-UyKdkeyk.mjs.map +1 -0
  37. package/fesm2022/acorex-platform-themes-shared.mjs +103 -24
  38. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  39. package/package.json +1 -1
  40. package/types/acorex-platform-auth.d.ts +1 -0
  41. package/types/acorex-platform-common.d.ts +202 -151
  42. package/types/acorex-platform-contracts.d.ts +1 -0
  43. package/types/acorex-platform-core.d.ts +162 -7
  44. package/types/acorex-platform-layout-builder.d.ts +10 -20
  45. package/types/acorex-platform-layout-components.d.ts +14 -1
  46. package/types/acorex-platform-layout-entity-contracts.d.ts +31 -2
  47. package/types/acorex-platform-layout-entity.d.ts +91 -16
  48. package/types/acorex-platform-layout-views.d.ts +107 -20
  49. package/types/acorex-platform-layout-widget-core.d.ts +71 -9
  50. package/types/acorex-platform-layout-widgets.d.ts +48 -26
  51. package/types/acorex-platform-themes-default.d.ts +60 -6
  52. package/types/acorex-platform-themes-shared.d.ts +4 -0
  53. package/fesm2022/acorex-platform-common-common-settings.provider-VfmZct9H.mjs.map +0 -1
  54. package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +0 -1
  55. package/fesm2022/acorex-platform-themes-shared-settings.provider-BUwPqwUS.mjs.map +0 -1
@@ -1,9 +1,9 @@
1
1
  import * as _ngrx_signals from '@ngrx/signals';
2
2
  import * as _angular_core from '@angular/core';
3
- import { Signal, OnInit, OnDestroy } from '@angular/core';
3
+ import { Signal, InjectionToken, OnInit, OnDestroy } from '@angular/core';
4
4
  import * as _acorex_platform_themes_shared from '@acorex/platform/themes/shared';
5
5
  import { AXClickEvent } from '@acorex/cdk/common';
6
- import { AXPTabNavigationService, AXPHomePageService, AXPSettingsService, AXPTabPreviewService, AXPUnsavedChangesConfirmService, AXPEntityCommandScope } from '@acorex/platform/common';
6
+ import { AXPTabNavigationService, AXPHomePageService, AXPSettingsService, AXPTabPreviewService, AXPUnsavedChangesConfirmService, AXPBrowserTitleService, AXPEntityCommandScope } from '@acorex/platform/common';
7
7
  import * as i1 from '@acorex/cdk/drawer';
8
8
  import { AXDrawerItemDirective } from '@acorex/cdk/drawer';
9
9
  import { AXPBreadcrumbItem, AXPMultiLanguageString, AXPBadge, AXPPageStatus, AXPBackButton, AXPExecuteCommand, AXPExecuteCommandResult } from '@acorex/platform/contracts';
@@ -82,6 +82,7 @@ declare class AXPPageLayoutComponent {
82
82
  isSystemMode: _angular_core.Signal<boolean>;
83
83
  isSideMenuOpen: _angular_core.Signal<boolean>;
84
84
  isOverlayLoading: _angular_core.Signal<boolean>;
85
+ overlayTaskCount: _angular_core.Signal<number>;
85
86
  isNavigationLoading: _angular_core.Signal<boolean>;
86
87
  isMenuHorizontal: _angular_core.Signal<boolean>;
87
88
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -95,6 +96,7 @@ declare class AXPPageLayoutComponent {
95
96
  toggleSideMenu: () => void;
96
97
  setNavigationLoading: (value: boolean, delay?: number) => void;
97
98
  setOverlayLoading: (value: boolean, delay?: number) => void;
99
+ clearOverlayLoading: () => void;
98
100
  loadSettings: () => Promise<void>;
99
101
  } & _ngrx_signals.StateSource<{
100
102
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -166,6 +168,7 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
166
168
  isSystemMode: _angular_core.Signal<boolean>;
167
169
  isSideMenuOpen: _angular_core.Signal<boolean>;
168
170
  isOverlayLoading: _angular_core.Signal<boolean>;
171
+ overlayTaskCount: _angular_core.Signal<number>;
169
172
  isNavigationLoading: _angular_core.Signal<boolean>;
170
173
  isMenuHorizontal: _angular_core.Signal<boolean>;
171
174
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -179,6 +182,7 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
179
182
  toggleSideMenu: () => void;
180
183
  setNavigationLoading: (value: boolean, delay?: number) => void;
181
184
  setOverlayLoading: (value: boolean, delay?: number) => void;
185
+ clearOverlayLoading: () => void;
182
186
  loadSettings: () => Promise<void>;
183
187
  } & _ngrx_signals.StateSource<{
184
188
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -210,7 +214,9 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
210
214
  protected readonly tabNavigation: AXPTabNavigationService;
211
215
  protected readonly tabPreviewService: AXPTabPreviewService;
212
216
  protected readonly unsavedChangesConfirm: AXPUnsavedChangesConfirmService;
217
+ protected readonly browserTitleService: AXPBrowserTitleService;
213
218
  protected readonly router: Router;
219
+ private readonly pageLayoutDestroyRef;
214
220
  private _updateTrigger;
215
221
  /** Tab key captured at page init — stable while the route instance is cached. */
216
222
  private readonly pageTabKey;
@@ -219,6 +225,8 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
219
225
  ngOnInit(): Promise<void>;
220
226
  /** Maps the home-page route to the pinned home tab key instead of a path-based key. */
221
227
  private resolvePageTabKey;
228
+ /** Stable tab key for this cached page instance (tabular mode). */
229
+ protected getPageTabKey(): string | null;
222
230
  protected publishTabStructuredPreview(tabKey: string, input: {
223
231
  titleValue: AXPMultiLanguageString;
224
232
  descriptionValue: AXPMultiLanguageString | null;
@@ -235,6 +243,10 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
235
243
  protected getPageIcon(): string | null | Promise<string | null>;
236
244
  hasTitle: _angular_core.Signal<boolean>;
237
245
  hasTitleIcon: _angular_core.Signal<boolean>;
246
+ /** Publishes the page title to the browser tab when this instance is the active route. */
247
+ protected publishBrowserTitleIfActive(): Promise<void>;
248
+ /** True when this cached page instance matches the current router location. */
249
+ protected isActivePageForBrowserTitle(): boolean;
238
250
  description: _angular_core.WritableSignal<AXPMultiLanguageString | null>;
239
251
  hasDescription: _angular_core.Signal<boolean>;
240
252
  protected getPageDescription(): AXPMultiLanguageString | null | Promise<AXPMultiLanguageString | null>;
@@ -242,7 +254,9 @@ declare abstract class AXPPageLayoutBaseComponent implements AXPPageLayoutBase {
242
254
  breadcrumbs: _angular_core.WritableSignal<AXPBreadcrumbItem[]>;
243
255
  hasBreadcrumbs: _angular_core.Signal<boolean>;
244
256
  protected getPageBreadcrumbs(): AXPBreadcrumbItem[] | Promise<AXPBreadcrumbItem[]>;
245
- /** Joins all page breadcrumbs (Home is excluded upstream) as the tab label. */
257
+ /** Collects resolved breadcrumb labels (Home excluded upstream) for tab chrome. */
258
+ protected resolveBreadcrumbTabTitleSegments(pageBreadcrumbs: AXPBreadcrumbItem[]): Promise<string[]>;
259
+ /** Joins breadcrumb segments as the stored tab title string. */
246
260
  protected resolveBreadcrumbTabTitle(pageBreadcrumbs: AXPBreadcrumbItem[]): Promise<string | null>;
247
261
  /** Resolves a breadcrumb label the same way as page chrome (`t(item.title)`). */
248
262
  protected resolveBreadcrumbItemTitle(item: AXPBreadcrumbItem | undefined): Promise<string | null>;
@@ -338,6 +352,7 @@ declare class AXPPopupLayoutComponent {
338
352
  isSystemMode: _angular_core.Signal<boolean>;
339
353
  isSideMenuOpen: _angular_core.Signal<boolean>;
340
354
  isOverlayLoading: _angular_core.Signal<boolean>;
355
+ overlayTaskCount: _angular_core.Signal<number>;
341
356
  isNavigationLoading: _angular_core.Signal<boolean>;
342
357
  isMenuHorizontal: _angular_core.Signal<boolean>;
343
358
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -351,6 +366,7 @@ declare class AXPPopupLayoutComponent {
351
366
  toggleSideMenu: () => void;
352
367
  setNavigationLoading: (value: boolean, delay?: number) => void;
353
368
  setOverlayLoading: (value: boolean, delay?: number) => void;
369
+ clearOverlayLoading: () => void;
354
370
  loadSettings: () => Promise<void>;
355
371
  } & _ngrx_signals.StateSource<{
356
372
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -407,6 +423,7 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
407
423
  isSystemMode: _angular_core.Signal<boolean>;
408
424
  isSideMenuOpen: _angular_core.Signal<boolean>;
409
425
  isOverlayLoading: _angular_core.Signal<boolean>;
426
+ overlayTaskCount: _angular_core.Signal<number>;
410
427
  isNavigationLoading: _angular_core.Signal<boolean>;
411
428
  isMenuHorizontal: _angular_core.Signal<boolean>;
412
429
  effectiveMenuVerticalMode: _angular_core.Signal<_acorex_platform_themes_shared.AXPMenuVerticalMode>;
@@ -420,6 +437,7 @@ declare abstract class AXPPopupLayoutBaseComponent extends AXBasePageComponent {
420
437
  toggleSideMenu: () => void;
421
438
  setNavigationLoading: (value: boolean, delay?: number) => void;
422
439
  setOverlayLoading: (value: boolean, delay?: number) => void;
440
+ clearOverlayLoading: () => void;
423
441
  loadSettings: () => Promise<void>;
424
442
  } & _ngrx_signals.StateSource<{
425
443
  currentMode: _acorex_platform_themes_shared.AXPThemeMode;
@@ -548,9 +566,20 @@ interface AXPLayoutDetailsViewAdapter {
548
566
  getPageStatus?: (context: Record<string, unknown>, currentPage: AXPLayoutDetailsViewPage | null) => Promise<AXPPageStatus | null>;
549
567
  }
550
568
 
569
+ interface AXPLayoutDetailsViewRouteParams {
570
+ moduleName: string;
571
+ entityName: string;
572
+ id: string;
573
+ }
574
+ interface AXPLayoutDetailsViewAdapterLoader {
575
+ load(params: AXPLayoutDetailsViewRouteParams): Promise<AXPLayoutDetailsViewAdapter>;
576
+ }
577
+ declare const AXP_LAYOUT_DETAILS_VIEW_ADAPTER_LOADER: InjectionToken<AXPLayoutDetailsViewAdapterLoader>;
578
+
551
579
  declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
552
580
  adapter: _angular_core.Signal<AXPLayoutDetailsViewAdapter | null>;
553
581
  rootContext: _angular_core.Signal<Record<string, any>>;
582
+ savedContext: _angular_core.Signal<Record<string, any>>;
554
583
  previousContext: _angular_core.Signal<Record<string, any>>;
555
584
  context: _angular_core.Signal<Record<string, any>>;
556
585
  scope: _angular_core.Signal<AXPExpressionEvaluatorScope | null>;
@@ -567,6 +596,8 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
567
596
  isLarge: _angular_core.Signal<boolean>;
568
597
  isBusy: _angular_core.Signal<boolean>;
569
598
  isSaving: _angular_core.Signal<boolean>;
599
+ isOverlayBusy: _angular_core.Signal<boolean>;
600
+ isPageReady: _angular_core.Signal<boolean>;
570
601
  isDirty: _angular_core.Signal<boolean>;
571
602
  changesCount: _angular_core.Signal<1 | 0>;
572
603
  isLoaded: _angular_core.Signal<boolean>;
@@ -574,7 +605,8 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
574
605
  activeTabContent: _angular_core.Signal<AXPWidgetNode[]>;
575
606
  loadAdapter: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
576
607
  loadPage: (pageId?: string, forceRefresh?: boolean) => Promise<void>;
577
- load: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
608
+ load: (adapter: AXPLayoutDetailsViewAdapter, forceRefresh?: boolean, pageIdFromUrl?: string) => Promise<void>;
609
+ loadFromRoute: (forceRefresh?: boolean) => Promise<void>;
578
610
  updateContext: (context: any) => void;
579
611
  setFormDirty: (dirty: boolean) => void;
580
612
  updatePageSelectedRows: (rows: any[]) => void;
@@ -601,10 +633,11 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
601
633
  applySavedState: (context: Record<string, unknown>) => void;
602
634
  discard: () => Promise<void>;
603
635
  save: (command: AXPExecuteCommand, form: AXFormComponent, liveContext?: Record<string, unknown>) => Promise<boolean>;
604
- goToListPage: () => void;
636
+ goToListPage: () => Promise<void>;
605
637
  } & _ngrx_signals.StateSource<{
606
638
  adapter: AXPLayoutDetailsViewAdapter | null;
607
639
  rootContext: Record<string, any>;
640
+ savedContext: Record<string, any>;
608
641
  previousContext: Record<string, any>;
609
642
  context: Record<string, any>;
610
643
  scope: AXPExpressionEvaluatorScope | null;
@@ -619,10 +652,10 @@ declare const AXPLayoutDetailsViewViewModel: _angular_core.Type<{
619
652
 
620
653
  declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent implements OnInit, OnDestroy {
621
654
  #private;
622
- adapter: _angular_core.InputSignal<AXPLayoutDetailsViewAdapter>;
623
655
  protected vm: {
624
- adapter: _angular_core.Signal<AXPLayoutDetailsViewAdapter | null>;
656
+ adapter: _angular_core.Signal<_acorex_platform_layout_views.AXPLayoutDetailsViewAdapter | null>;
625
657
  rootContext: _angular_core.Signal<Record<string, any>>;
658
+ savedContext: _angular_core.Signal<Record<string, any>>;
626
659
  previousContext: _angular_core.Signal<Record<string, any>>;
627
660
  context: _angular_core.Signal<Record<string, any>>;
628
661
  scope: _angular_core.Signal<_acorex_platform_core.AXPExpressionEvaluatorScope | null>;
@@ -639,14 +672,17 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
639
672
  isLarge: _angular_core.Signal<boolean>;
640
673
  isBusy: _angular_core.Signal<boolean>;
641
674
  isSaving: _angular_core.Signal<boolean>;
675
+ isOverlayBusy: _angular_core.Signal<boolean>;
676
+ isPageReady: _angular_core.Signal<boolean>;
642
677
  isDirty: _angular_core.Signal<boolean>;
643
678
  changesCount: _angular_core.Signal<1 | 0>;
644
679
  isLoaded: _angular_core.Signal<boolean>;
645
680
  currentPageSelectedRows: _angular_core.Signal<any[]>;
646
681
  activeTabContent: _angular_core.Signal<_acorex_platform_layout_widget_core.AXPWidgetNode[]>;
647
- loadAdapter: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
682
+ loadAdapter: (adapter: _acorex_platform_layout_views.AXPLayoutDetailsViewAdapter) => Promise<void>;
648
683
  loadPage: (pageId?: string, forceRefresh?: boolean) => Promise<void>;
649
- load: (adapter: AXPLayoutDetailsViewAdapter) => Promise<void>;
684
+ load: (adapter: _acorex_platform_layout_views.AXPLayoutDetailsViewAdapter, forceRefresh?: boolean, pageIdFromUrl?: string) => Promise<void>;
685
+ loadFromRoute: (forceRefresh?: boolean) => Promise<void>;
650
686
  updateContext: (context: any) => void;
651
687
  setFormDirty: (dirty: boolean) => void;
652
688
  updatePageSelectedRows: (rows: any[]) => void;
@@ -673,10 +709,11 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
673
709
  applySavedState: (context: Record<string, unknown>) => void;
674
710
  discard: () => Promise<void>;
675
711
  save: (command: AXPExecuteCommand, form: AXFormComponent, liveContext?: Record<string, unknown>) => Promise<boolean>;
676
- goToListPage: () => void;
712
+ goToListPage: () => Promise<void>;
677
713
  } & _ngrx_signals.StateSource<{
678
- adapter: AXPLayoutDetailsViewAdapter | null;
714
+ adapter: _acorex_platform_layout_views.AXPLayoutDetailsViewAdapter | null;
679
715
  rootContext: Record<string, any>;
716
+ savedContext: Record<string, any>;
680
717
  previousContext: Record<string, any>;
681
718
  context: Record<string, any>;
682
719
  scope: _acorex_platform_core.AXPExpressionEvaluatorScope | null;
@@ -694,14 +731,28 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
694
731
  private readonly unsavedChangesPopstate;
695
732
  private readonly pageComponentInstanceRegistry;
696
733
  private readonly shortcutRegistry;
734
+ private readonly workflowService;
697
735
  private readonly destroyRef;
698
736
  private readonly elementRef;
737
+ private readonly debug;
699
738
  private onSelectionChangeSubscription?;
700
- /** Prevents sidebar tab init events from pushing history before {@link ngOnInit} load completes. */
701
- private detailsLayoutReady;
739
+ /** Cancels in-flight list selection bind when the sidebar page or widget tree changes. */
740
+ private pageListSelectionBindGeneration;
741
+ /** Prevents sidebar tab init events from pushing history before the first page activation completes. */
742
+ private readonly detailsLayoutReady;
702
743
  private readonly destroyed$;
703
744
  private footerActionsGeneration;
704
745
  private keyboardShortcutRegistrationGeneration;
746
+ private overlayFallbackTimer?;
747
+ /** Page id the overlay release logic is bound to; reset on sidebar/page switch. */
748
+ private overlayTargetPageId;
749
+ /** After a page switch, wait for widget registry to clear before accepting remounted widgets. */
750
+ private overlaySawZeroWidgetsAfterPageChange;
751
+ /** Cancels in-flight overlay release when the page changes. */
752
+ private overlayReleaseGeneration;
753
+ private overlayReleasePromise?;
754
+ /** Safety cap when widget ready detection does not settle. */
755
+ private static readonly overlayMaxWaitMs;
705
756
  /** Header actions with resolved shortcut chords, keyed by command name. */
706
757
  private readonly actionShortcutEntries;
707
758
  /** Save/discard use live {@link AXPLayoutDetailsViewViewModel.isDirty}; other actions use evaluated `visible`. */
@@ -741,15 +792,30 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
741
792
  protected isFooterActionDisabled(action: AXPActionMenuItem): boolean;
742
793
  protected hasFooter: _angular_core.Signal<boolean>;
743
794
  /**
744
- * Append timestamp query param to trigger router to re-run guards/resolvers
795
+ * Re-fetches the entity adapter and reloads the active page.
745
796
  */
746
797
  protected refreshLayout(): Promise<void>;
747
798
  ngOnInit(): Promise<void>;
748
- ngAfterViewInit(): Promise<void>;
799
+ /** Navigates to {@link AXPLayoutDetailsViewAdapter.exitUrl} when the open record was deleted. */
800
+ private handleEntityDeleted;
749
801
  ngOnDestroy(): void;
750
802
  private refreshFooterActions;
803
+ /** Whether the active page hosts a related-entity list (`page-list` widget). */
804
+ private pageHasEntityListWidget;
805
+ /** Subscribes to the live data-list selection stream for Selected-scope header actions. */
806
+ private attachSelectionToListWidget;
751
807
  protected handleOnContextChanged(e: AXPContextChangeEvent): void;
752
808
  private getLiveFormContext;
809
+ /** Whether the active page renders widget nodes (not only hosted components). */
810
+ private pageHasWidgetNodes;
811
+ /** Clears all overlay loading tasks once the page (or hosted view) is ready. */
812
+ private clearPageOverlay;
813
+ private scheduleOverlayFallback;
814
+ private clearOverlayFallback;
815
+ /**
816
+ * Hides overlay after the widget container reports continuous idle (same gate as saved baseline).
817
+ */
818
+ private requestOverlayRelease;
753
819
  private finalizeSave;
754
820
  private finalizeDiscard;
755
821
  /** Reverts widget form state and view-model context to the last saved baseline. */
@@ -792,6 +858,11 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
792
858
  protected pageContentTrackKey(item: AXPPageContentItem, index: number): string;
793
859
  /** Whether the active component-based entity page has unsaved edits. */
794
860
  private isActivePageComponentDirty;
861
+ /**
862
+ * Widget-form dirty state for leave guards (popstate, canDeactivate).
863
+ * Unlike {@link liveFormIsDirty}, does not suppress dirty while overlay is busy.
864
+ */
865
+ private hasWidgetFormUnsavedChanges;
795
866
  /** Whether the current details page has user-origin unsaved edits (form or component page). */
796
867
  private shouldPromptLeave;
797
868
  /** Single gate for leaving the page or switching details sub-pages when dirty. */
@@ -805,19 +876,25 @@ declare class AXPLayoutDetailsViewComponent extends AXPPageLayoutBaseComponent i
805
876
  /** Waits for builder/effect microtasks to finish after a component page command. */
806
877
  private waitForComponentDirtySettle;
807
878
  private refreshKeyboardShortcutRegistrations;
879
+ /** i18n scope label for the active details sub-page shortcut group in the help dialog. */
880
+ private getKeyboardShortcutScope;
881
+ /** Primary overview page backed by the entity widget form (not a component-hosted sub-page). */
882
+ private isWidgetFormPrimaryPage;
883
+ private registerDetailsViewShortcutScope;
808
884
  private collectActionShortcutEntries;
809
- private isHeaderActionAvailable;
810
- /** Whether save/discard core shortcuts are listed in the help dialog (page supports them). */
885
+ private isShortcutActionAvailable;
886
+ /** Whether save/discard core shortcuts are listed in the help dialog (widget overview page only). */
811
887
  private isCoreSaveShortcutAvailable;
812
888
  private isCoreDiscardShortcutAvailable;
813
889
  private canExecuteSaveShortcut;
814
890
  private canExecuteDiscardShortcut;
815
891
  private executeDiscardViaShortcut;
892
+ private executeActionShortcut;
816
893
  private isActionShortcutActive;
817
894
  private registerCoreKeyboardShortcuts;
818
895
  private registerActionKeyboardShortcuts;
819
896
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPLayoutDetailsViewComponent, never>;
820
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPLayoutDetailsViewComponent, "axp-layout-details-view", never, { "adapter": { "alias": "adapter"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
897
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPLayoutDetailsViewComponent, "axp-layout-details-view", never, {}, {}, never, never, true, never>;
821
898
  }
822
899
 
823
900
  type AXPDetailsViewActionShortcut = AXPKeyboardShortcutChord;
@@ -834,6 +911,16 @@ declare function resolveDetailsViewActionShortcuts(commandBaseName: string, expl
834
911
  * Resolves save/discard footer command shortcuts from page settings.
835
912
  */
836
913
  declare function resolveDetailsViewFooterCommandShortcuts(commandName: string, explicit?: readonly AXPKeyboardShortcut[]): AXPDetailsViewActionShortcut[] | undefined;
914
+ /**
915
+ * Platform defaults for component-page footer save/discard commands (e.g. `MetaDataBuilder:Save`).
916
+ */
917
+ declare function resolvePageFooterActionDefaultShortcuts(commandName: string): AXPDetailsViewActionShortcut[] | undefined;
918
+ declare function isSaveFooterCommand(commandName: string): boolean;
919
+ declare function isDiscardFooterCommand(commandName: string): boolean;
920
+ /**
921
+ * Resolves keyboard shortcuts for a footer action on entity detail sub-pages.
922
+ */
923
+ declare function resolvePageFooterActionShortcuts(commandName: string, explicit?: readonly AXPKeyboardShortcut[]): AXPDetailsViewActionShortcut[] | undefined;
837
924
 
838
925
  /**
839
926
  * Prompts for unsaved changes before leaving the entity details route (breadcrumbs, menu, back to list).
@@ -881,5 +968,5 @@ declare class AXPPageComponentRendererDirective implements OnInit, OnDestroy {
881
968
  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>;
882
969
  }
883
970
 
884
- export { AXPLayoutDetailsViewComponent, AXPLayoutDetailsViewViewModel, AXPPageComponentInstanceRegistryService, AXPPageComponentRendererDirective, AXPPageLayoutBase, AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPopupLayoutBase, AXPPopupLayoutBaseComponent, AXPPopupLayoutComponent, axpDetailsViewCanDeactivateGuard, buildNotSavedPageBadge, getDetailsViewActionCommandBaseName, isDiscardCommand, resolveDetailsViewActionShortcuts, resolveDetailsViewFooterCommandShortcuts };
885
- export type { AXPDetailsViewActionShortcut, AXPLayoutDetailsViewAction, AXPLayoutDetailsViewAdapter, AXPLayoutDetailsViewPage, AXPLayoutDetailsViewTabItem, AXPPageContentItem };
971
+ export { AXPLayoutDetailsViewComponent, AXPLayoutDetailsViewViewModel, AXPPageComponentInstanceRegistryService, AXPPageComponentRendererDirective, AXPPageLayoutBase, AXPPageLayoutBaseComponent, AXPPageLayoutComponent, AXPPopupLayoutBase, AXPPopupLayoutBaseComponent, AXPPopupLayoutComponent, AXP_LAYOUT_DETAILS_VIEW_ADAPTER_LOADER, axpDetailsViewCanDeactivateGuard, buildNotSavedPageBadge, getDetailsViewActionCommandBaseName, isDiscardCommand, isDiscardFooterCommand, isSaveFooterCommand, resolveDetailsViewActionShortcuts, resolveDetailsViewFooterCommandShortcuts, resolvePageFooterActionDefaultShortcuts, resolvePageFooterActionShortcuts };
972
+ export type { AXPDetailsViewActionShortcut, AXPLayoutDetailsViewAction, AXPLayoutDetailsViewAdapter, AXPLayoutDetailsViewAdapterLoader, AXPLayoutDetailsViewPage, AXPLayoutDetailsViewRouteParams, AXPLayoutDetailsViewTabItem, AXPPageContentItem };
@@ -1,11 +1,12 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Signal, InjectionToken, ComponentRef, OnInit, EventEmitter, OnChanges, TemplateRef, Injector, WritableSignal, SimpleChanges, Type } from '@angular/core';
2
+ import { Signal, InjectionToken, OnInit, ComponentRef, EventEmitter, OnChanges, TemplateRef, Injector, WritableSignal, SimpleChanges, Type } from '@angular/core';
3
3
  import * as _acorex_platform_layout_widget_core from '@acorex/platform/layout/widget-core';
4
4
  import * as _ngrx_signals from '@ngrx/signals';
5
5
  import * as _acorex_platform_core from '@acorex/platform/core';
6
6
  import { AXPContextChangeEvent, AXPExpressionEvaluatorService } from '@acorex/platform/core';
7
7
  import { AXValueChangedEvent, AXDataSource } from '@acorex/cdk/common';
8
8
  import { AXPOptionsData, AXPMultiLanguageString, AXPDefinitionCategory, AXPDataType, AXPExpression, AXPWidgetTriggers, AXPMetaData, AXPValueTransformerFunctions, AXPValidationRules, AXPPartialNested, AXPProperty } from '@acorex/platform/contracts';
9
+ import * as rxjs from 'rxjs';
9
10
  import { Subject, BehaviorSubject } from 'rxjs';
10
11
  import { AXDataTableColumnComponent } from '@acorex/components/data-table';
11
12
  import * as i7 from '@acorex/core/translation';
@@ -18,18 +19,17 @@ import * as i6 from '@acorex/components/skeleton';
18
19
  declare enum AXPPageStatus {
19
20
  Idle = "idle",// The page is idle.
20
21
  Rendering = "rendering",// The page is being rendered.
21
- Rendered = "rendered",// The rendering process is complete. should be renamed to idle
22
+ Rendered = "rendered",// The rendering process is complete.
22
23
  Processing = "processing",// The page is performing a task or interaction.
23
24
  Submitting = "submitting",// The form is being submitted.
24
25
  Submitted = "submitted",// Submission is completed.
25
26
  Validating = "validating",// The form is being validated.
26
- Validated = "validated",// Validation is completed.
27
+ Validated = "validated",// Validation is completed.
27
28
  Error = "error"
28
29
  }
29
30
  declare enum AXPWidgetStatus {
30
- Rendering = "rendering",// The widget is being rendered.
31
- Rendered = "rendered",// The rendering process is complete.
32
- Processing = "processing",// The widget is performing a task or interaction.
31
+ Rendering = "rendering",// The widget is being mounted and bound.
32
+ Rendered = "rendered",// The widget shell is ready (async hydration may still run).
33
33
  Error = "error"
34
34
  }
35
35
 
@@ -52,6 +52,7 @@ type AXPWidgetCoreElementAction = {
52
52
  declare abstract class AXPWidgetCoreElement {
53
53
  abstract get id(): string | null;
54
54
  abstract get status(): Signal<AXPWidgetStatus>;
55
+ abstract get isHydrating(): Signal<boolean>;
55
56
  api(): AXPWidgetCoreElementAPI;
56
57
  actions(): AXPWidgetCoreElementAction[];
57
58
  }
@@ -61,18 +62,45 @@ declare class AXPWidgetCoreService {
61
62
  readonly onRefresh: Subject<void>;
62
63
  private widgets;
63
64
  private readonly onWidgetRegistered;
65
+ /** Fires whenever a widget registers, including re-registration after remount (same id, new instance). */
66
+ readonly widgetRegistered$: rxjs.Observable<{
67
+ id: string;
68
+ widget: AXPWidgetCoreElement;
69
+ }>;
70
+ /** Bumps when widget render/hydration state changes so aggregate computeds re-evaluate. */
71
+ private readonly widgetsRevision;
64
72
  private readonly status$;
65
73
  readonly status: Signal<AXPPageStatus>;
74
+ readonly registeredWidgetsCount: _angular_core.WritableSignal<number>;
75
+ readonly isRendering: Signal<boolean>;
76
+ readonly isHydrating: Signal<boolean>;
66
77
  readonly isBusy: Signal<boolean>;
67
- registeredWidgetsCount: _angular_core.WritableSignal<number>;
78
+ readonly isStructureReady: Signal<boolean>;
68
79
  private readonly dirtyWidgetsRevision;
69
80
  readonly dirtyWidgetsRevisionSignal: Signal<number>;
81
+ constructor();
70
82
  get variables(): any;
71
83
  get functions(): {
72
84
  [key: string]: Function;
73
85
  };
86
+ /** Recomputes aggregate container state after a widget registers or changes status/hydration. */
87
+ notifyWidgetStateChanged(): void;
88
+ /** @deprecated Prefer {@link notifyWidgetStateChanged}. */
74
89
  updateStatus(): void;
75
- private detectStatus;
90
+ /** Debug snapshot of registered widget render/hydration state. */
91
+ getWidgetStateSnapshot(): {
92
+ count: number;
93
+ isRendering: boolean;
94
+ isHydrating: boolean;
95
+ isStructureReady: boolean;
96
+ isBusy: boolean;
97
+ widgets: Array<{
98
+ id: string;
99
+ status: AXPWidgetStatus;
100
+ isHydrating: boolean;
101
+ }>;
102
+ };
103
+ private detectAggregateStatus;
76
104
  refresh(): void;
77
105
  setStatus(status: AXPPageStatus): void;
78
106
  setVariables(keysValues: any): void;
@@ -80,6 +108,8 @@ declare class AXPWidgetCoreService {
80
108
  setFunctions(keysValues: any): void;
81
109
  setFunctions(key: string, value: any): void;
82
110
  registerWidget(id: string, widget: AXPWidgetCoreElement): void;
111
+ unregisterWidget(id: string): void;
112
+ clearWidgets(): void;
83
113
  getWidget(id: string): AXPWidgetCoreElement | undefined;
84
114
  waitForWidget(id: string, timeoutMs?: number): Promise<AXPWidgetCoreElement | undefined>;
85
115
  listRegisteredWidgetNames(): string[];
@@ -381,7 +411,7 @@ interface AXPLayoutBuilderStatusChangedEvent {
381
411
 
382
412
  type AXPClassMap = Readonly<Record<string, boolean>>;
383
413
  type AXPStyleMap = Readonly<Record<string, string | number>>;
384
- declare abstract class AXPBaseWidgetComponent<TOptions extends Record<string, unknown> = AXPOptionsData> extends AXPWidgetCoreElement {
414
+ declare abstract class AXPBaseWidgetComponent<TOptions extends Record<string, unknown> = AXPOptionsData> extends AXPWidgetCoreElement implements OnInit {
385
415
  #private;
386
416
  protected readonly token: AXPWidgetNodeToken<TOptions>;
387
417
  readonly host: HTMLDivElement;
@@ -391,12 +421,14 @@ declare abstract class AXPBaseWidgetComponent<TOptions extends Record<string, un
391
421
  state: _angular_core.Signal<_acorex_platform_core.AXPContextState>;
392
422
  savedSnapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
393
423
  previousSnapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
424
+ userEditedSinceCommit: _angular_core.Signal<boolean>;
394
425
  lastChange: _ngrx_signals.DeepSignal<_acorex_platform_core.AXPContextChangeEvent>;
395
426
  isChanged: _angular_core.Signal<boolean>;
396
427
  isReset: _angular_core.Signal<boolean>;
397
428
  isInitiated: _angular_core.Signal<boolean>;
398
429
  isEmpty: _angular_core.Signal<boolean>;
399
430
  isSavedCommitted: _angular_core.Signal<boolean>;
431
+ hasUserEditedSinceCommit: _angular_core.Signal<boolean>;
400
432
  isDirty: _angular_core.Signal<boolean>;
401
433
  snapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
402
434
  saved: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
@@ -405,6 +437,7 @@ declare abstract class AXPBaseWidgetComponent<TOptions extends Record<string, un
405
437
  changeEvent: _angular_core.Signal<_acorex_platform_core.AXPContextChangeEvent>;
406
438
  update: (path: string, value: any, options?: _acorex_platform_core.AXPContextUpdateOptions) => void;
407
439
  applyObjectPaths: (obj: Record<string, unknown>, options?: _acorex_platform_core.AXPContextUpdateOptions, prefix?: string) => void;
440
+ syncPathToSavedBaseline: (path: string, options?: _acorex_platform_core.AXPContextUpdateOptions) => void;
408
441
  patch: (context: Record<string, any>, options?: _acorex_platform_core.AXPContextPatchOptions) => void;
409
442
  revertToSaved: () => void;
410
443
  reset: () => void;
@@ -419,6 +452,7 @@ declare abstract class AXPBaseWidgetComponent<TOptions extends Record<string, un
419
452
  state: _acorex_platform_core.AXPContextState;
420
453
  savedSnapshot: _acorex_platform_core.AXPContextData;
421
454
  previousSnapshot: _acorex_platform_core.AXPContextData;
455
+ userEditedSinceCommit: boolean;
422
456
  lastChange: _acorex_platform_core.AXPContextChangeEvent;
423
457
  }>;
424
458
  readonly config: _acorex_platform_layout_widget_core.AXPWidgetConfig<any>;
@@ -435,6 +469,10 @@ declare abstract class AXPBaseWidgetComponent<TOptions extends Record<string, un
435
469
  private _status;
436
470
  status: _angular_core.Signal<AXPWidgetStatus>;
437
471
  readonly onStatusChanged: BehaviorSubject<AXPWidgetStatus>;
472
+ /** Depth counter so nested async hydration calls share one busy state. */
473
+ private hydrationDepth;
474
+ private _isHydrating;
475
+ isHydrating: _angular_core.Signal<boolean>;
438
476
  isBusy: _angular_core.Signal<boolean>;
439
477
  parent: AXPLayoutBaseWidgetComponent<any> | null | undefined;
440
478
  parentComponent: ComponentRef<any> | null | undefined;
@@ -447,6 +485,10 @@ declare abstract class AXPBaseWidgetComponent<TOptions extends Record<string, un
447
485
  })[];
448
486
  ngOnInit(): void;
449
487
  setStatus(status: AXPWidgetStatus): void;
488
+ /** Marks async data loading (lookup, select, file fetch, etc.). */
489
+ protected beginHydration(): void;
490
+ /** Clears hydration started by {@link beginHydration}. */
491
+ protected endHydration(): void;
450
492
  setOptions(values: Partial<TOptions>): void;
451
493
  output<T = any>(name: string): T;
452
494
  call(name: string, ...args: any[]): void;
@@ -478,6 +520,8 @@ declare abstract class AXPValueWidgetComponent<T = any | null, TOptions extends
478
520
  getValue: _angular_core.Signal<T>;
479
521
  protected validationRules: _angular_core.Signal<AXPValidationRules>;
480
522
  protected extractValue(path: string): any;
523
+ /** Applies schema default without marking the form as user-edited. */
524
+ protected applyDefaultValue(value: T | null | undefined): void;
481
525
  setValue(value: T | null | undefined): void;
482
526
  protected detectFullPath(): void;
483
527
  protected handleValueChanged(e: AXValueChangedEvent<T>): void;
@@ -785,12 +829,14 @@ declare class AXPWidgetContainerComponent {
785
829
  state: _angular_core.Signal<_acorex_platform_core.AXPContextState>;
786
830
  savedSnapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
787
831
  previousSnapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
832
+ userEditedSinceCommit: _angular_core.Signal<boolean>;
788
833
  lastChange: _ngrx_signals.DeepSignal<AXPContextChangeEvent>;
789
834
  isChanged: _angular_core.Signal<boolean>;
790
835
  isReset: _angular_core.Signal<boolean>;
791
836
  isInitiated: _angular_core.Signal<boolean>;
792
837
  isEmpty: _angular_core.Signal<boolean>;
793
838
  isSavedCommitted: _angular_core.Signal<boolean>;
839
+ hasUserEditedSinceCommit: _angular_core.Signal<boolean>;
794
840
  isDirty: _angular_core.Signal<boolean>;
795
841
  snapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
796
842
  saved: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
@@ -799,6 +845,7 @@ declare class AXPWidgetContainerComponent {
799
845
  changeEvent: _angular_core.Signal<AXPContextChangeEvent>;
800
846
  update: (path: string, value: any, options?: _acorex_platform_core.AXPContextUpdateOptions) => void;
801
847
  applyObjectPaths: (obj: Record<string, unknown>, options?: _acorex_platform_core.AXPContextUpdateOptions, prefix?: string) => void;
848
+ syncPathToSavedBaseline: (path: string, options?: _acorex_platform_core.AXPContextUpdateOptions) => void;
802
849
  patch: (context: Record<string, any>, options?: _acorex_platform_core.AXPContextPatchOptions) => void;
803
850
  revertToSaved: () => void;
804
851
  reset: () => void;
@@ -813,12 +860,16 @@ declare class AXPWidgetContainerComponent {
813
860
  state: _acorex_platform_core.AXPContextState;
814
861
  savedSnapshot: _acorex_platform_core.AXPContextData;
815
862
  previousSnapshot: _acorex_platform_core.AXPContextData;
863
+ userEditedSinceCommit: boolean;
816
864
  lastChange: AXPContextChangeEvent;
817
865
  }>;
818
866
  readonly builderService: AXPWidgetCoreService;
867
+ private readonly debug;
819
868
  readonly onContextChanged: EventEmitter<AXPContextChangeEvent>;
820
869
  private lastEmittedFormDirty;
821
870
  private savedBaselineTimer?;
871
+ private settlePromise?;
872
+ private wasHydrating;
822
873
  set context(value: any);
823
874
  set functions(v: any);
824
875
  readonly isSavedCommitted: _angular_core.Signal<boolean>;
@@ -826,13 +877,20 @@ declare class AXPWidgetContainerComponent {
826
877
  constructor();
827
878
  status: _angular_core.Signal<_acorex_platform_layout_widget_core.AXPPageStatus>;
828
879
  isBusy: _angular_core.Signal<boolean>;
880
+ isHydrating: _angular_core.Signal<boolean>;
881
+ /** True when registered widgets exist and none are rendering or hydrating. */
882
+ isWidgetsReady: _angular_core.Signal<boolean>;
829
883
  refresh(): void;
830
884
  find(name: string): Promise<_acorex_platform_layout_widget_core.AXPWidgetCoreElement | undefined>;
831
885
  private syncExternalContext;
832
886
  /** Commits the current data as saved after widget hydration settles. */
833
887
  settleSavedBaseline(): Promise<void>;
888
+ /** Resolves when widgets stay registered, structure-ready, and idle for {@link FORM_SAVED_BASELINE_IDLE_MS}. */
889
+ waitUntilSettled(): Promise<void>;
834
890
  replaceContext(value: unknown): Promise<void>;
835
891
  revertAndSettle(): void;
892
+ /** Re-commits baseline after post-load hydration when the user has not edited the form. */
893
+ private scheduleRebaselineAfterHydration;
836
894
  private clearSavedBaselineTimer;
837
895
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPWidgetContainerComponent, never>;
838
896
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPWidgetContainerComponent, "axp-widgets-container", never, { "context": { "alias": "context"; "required": false; }; "functions": { "alias": "functions"; "required": false; }; }, { "onContextChanged": "onContextChanged"; }, never, ["*"], false, never>;
@@ -1003,12 +1061,14 @@ declare class AXPWidgetRendererDirective {
1003
1061
  state: _angular_core.Signal<_acorex_platform_core.AXPContextState>;
1004
1062
  savedSnapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
1005
1063
  previousSnapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
1064
+ userEditedSinceCommit: _angular_core.Signal<boolean>;
1006
1065
  lastChange: _ngrx_signals.DeepSignal<_acorex_platform_core.AXPContextChangeEvent>;
1007
1066
  isChanged: _angular_core.Signal<boolean>;
1008
1067
  isReset: _angular_core.Signal<boolean>;
1009
1068
  isInitiated: _angular_core.Signal<boolean>;
1010
1069
  isEmpty: _angular_core.Signal<boolean>;
1011
1070
  isSavedCommitted: _angular_core.Signal<boolean>;
1071
+ hasUserEditedSinceCommit: _angular_core.Signal<boolean>;
1012
1072
  isDirty: _angular_core.Signal<boolean>;
1013
1073
  snapshot: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
1014
1074
  saved: _angular_core.Signal<_acorex_platform_core.AXPContextData>;
@@ -1017,6 +1077,7 @@ declare class AXPWidgetRendererDirective {
1017
1077
  changeEvent: _angular_core.Signal<_acorex_platform_core.AXPContextChangeEvent>;
1018
1078
  update: (path: string, value: any, options?: _acorex_platform_core.AXPContextUpdateOptions) => void;
1019
1079
  applyObjectPaths: (obj: Record<string, unknown>, options?: _acorex_platform_core.AXPContextUpdateOptions, prefix?: string) => void;
1080
+ syncPathToSavedBaseline: (path: string, options?: _acorex_platform_core.AXPContextUpdateOptions) => void;
1020
1081
  patch: (context: Record<string, any>, options?: _acorex_platform_core.AXPContextPatchOptions) => void;
1021
1082
  revertToSaved: () => void;
1022
1083
  reset: () => void;
@@ -1031,6 +1092,7 @@ declare class AXPWidgetRendererDirective {
1031
1092
  state: _acorex_platform_core.AXPContextState;
1032
1093
  savedSnapshot: _acorex_platform_core.AXPContextData;
1033
1094
  previousSnapshot: _acorex_platform_core.AXPContextData;
1095
+ userEditedSinceCommit: boolean;
1034
1096
  lastChange: _acorex_platform_core.AXPContextChangeEvent;
1035
1097
  }>;
1036
1098
  protected widgetRegistery: AXPWidgetRegistryService;