@acorex/platform 20.7.12 → 20.7.15

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 (49) hide show
  1. package/common/index.d.ts +10 -1
  2. package/core/index.d.ts +94 -4
  3. package/fesm2022/{acorex-platform-common-common-settings.provider-BwBLG0Hl.mjs → acorex-platform-common-common-settings.provider-gyb6ohAE.mjs} +15 -1
  4. package/fesm2022/acorex-platform-common-common-settings.provider-gyb6ohAE.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-common.mjs +3 -2
  6. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-core.mjs +428 -157
  8. package/fesm2022/acorex-platform-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-domain.mjs.map +1 -1
  10. package/fesm2022/acorex-platform-layout-builder.mjs +90 -74
  11. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-layout-components.mjs +954 -1223
  13. package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
  14. package/fesm2022/acorex-platform-layout-entity.mjs +601 -193
  15. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  16. package/fesm2022/acorex-platform-layout-views.mjs +7 -7
  17. package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
  18. package/fesm2022/{acorex-platform-layout-widgets-file-list-popup.component-BfV3spe3.mjs → acorex-platform-layout-widgets-file-list-popup.component-B0omAUil.mjs} +18 -3
  19. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-B0omAUil.mjs.map +1 -0
  20. package/fesm2022/{acorex-platform-layout-widgets-repeater-widget-column.component-DnhR00cH.mjs → acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs} +2 -2
  21. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs.map +1 -0
  22. package/fesm2022/acorex-platform-layout-widgets.mjs +165 -64
  23. package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
  24. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-CJcbkSBF.mjs → acorex-platform-themes-default-entity-master-create-view.component-CCiYPMhz.mjs} +29 -26
  25. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CCiYPMhz.mjs.map +1 -0
  26. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-HBr-ZTSt.mjs → acorex-platform-themes-default-entity-master-list-view.component-BQODc73e.mjs} +2 -2
  27. package/fesm2022/{acorex-platform-themes-default-entity-master-list-view.component-HBr-ZTSt.mjs.map → acorex-platform-themes-default-entity-master-list-view.component-BQODc73e.mjs.map} +1 -1
  28. package/fesm2022/{acorex-platform-themes-default-entity-master-modify-view.component-DAFQ4UI9.mjs → acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs} +3 -4
  29. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs.map +1 -0
  30. package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-CwHHYmiK.mjs → acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs} +4 -4
  31. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs.map +1 -0
  32. package/fesm2022/acorex-platform-themes-default.mjs +11 -11
  33. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  34. package/fesm2022/acorex-platform-themes-shared.mjs +244 -246
  35. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  36. package/fesm2022/acorex-platform-workflow.mjs +0 -3
  37. package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
  38. package/layout/components/index.d.ts +159 -248
  39. package/layout/entity/index.d.ts +42 -1
  40. package/layout/widgets/index.d.ts +43 -5
  41. package/package.json +5 -5
  42. package/themes/shared/index.d.ts +1 -1
  43. package/workflow/index.d.ts +33 -30
  44. package/fesm2022/acorex-platform-common-common-settings.provider-BwBLG0Hl.mjs.map +0 -1
  45. package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-BfV3spe3.mjs.map +0 -1
  46. package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-DnhR00cH.mjs.map +0 -1
  47. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-CJcbkSBF.mjs.map +0 -1
  48. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-DAFQ4UI9.mjs.map +0 -1
  49. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-CwHHYmiK.mjs.map +0 -1
@@ -1,7 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Signal, InjectionToken, InputSignal, TemplateRef, ElementRef, OnDestroy, OnInit, Type, ViewContainerRef, ModuleWithProviders, QueryList, OnChanges, EventEmitter, WritableSignal } from '@angular/core';
3
- import * as _acorex_platform_core from '@acorex/platform/core';
4
- import { AXPActivityLog, AXPSystemActionType, AXPCategoryEntity, AXPColumnQuery, AXPContextData, AXPOptionsData, AXPFilterDefinition, AXPFilterQuery, AXPSortDefinition, AXPSortQuery, AXPMetaData, AXPViewQuery } from '@acorex/platform/core';
2
+ import { Signal, InjectionToken, InputSignal, TemplateRef, ElementRef, OnDestroy, OnInit, QueryList, OnChanges, EventEmitter, WritableSignal } from '@angular/core';
3
+ import { AXPActivityLog, AXPSystemActionType, AXPCategoryEntity, AXPColumnQuery, AXPContextData, AXPFilterDefinition, AXPFilterQuery, AXPSortDefinition, AXPSortQuery, AXPMetaData, AXPViewQuery } from '@acorex/platform/core';
5
4
  import { AXPMenuItem } from '@acorex/platform/common';
6
5
  import { AXValueChangedEvent, AXClickEvent, AXDataSource, AXDataSourceFilterOption, AXHtmlEvent, AXEvent } from '@acorex/cdk/common';
7
6
  import { AXTreeViewLegacyComponent, AXTreeItemClickBaseEventLegacy } from '@acorex/components/tree-view-legacy';
@@ -10,7 +9,6 @@ import { AXPopoverComponent } from '@acorex/components/popover';
10
9
  import { CdkDragDrop } from '@angular/cdk/drag-drop';
11
10
  import * as _acorex_platform_layout_widget_core from '@acorex/platform/layout/widget-core';
12
11
  import { AXPWidgetNode, AXPWidgetRendererDirective, AXPWidgetCoreContextChangeEvent, AXPWidgetProperty, AXPWidgetConfig } from '@acorex/platform/layout/widget-core';
13
- import * as _ngrx_signals from '@ngrx/signals';
14
12
  import { AXDataTableComponent, AXDataTableRowDbClick, AXDataTableRowClick } from '@acorex/components/data-table';
15
13
  import { AXBasePageComponent } from '@acorex/components/page';
16
14
  import { AXDropListDroppedEvent } from '@acorex/cdk/drag-drop';
@@ -433,93 +431,6 @@ declare class AXPCompareViewComponent implements OnInit, OnDestroy {
433
431
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPCompareViewComponent, "axp-compare-view", never, { "inputs": { "alias": "inputs"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
434
432
  }
435
433
 
436
- interface AXPComponentSlotConfig {
437
- name: string;
438
- priority?: number;
439
- component?: Type<any>;
440
- condition?: ((context?: AXPContextData) => (boolean | Promise<boolean>)) | string;
441
- features?: string[];
442
- loadComponent?: () => Type<any> | Promise<Type<any>>;
443
- options?: AXPOptionsData | (() => AXPOptionsData) | (() => Promise<AXPOptionsData>);
444
- }
445
- interface AXPComponentSlotModuleConfigs {
446
- [slotName: string]: AXPComponentSlotConfig[];
447
- }
448
- declare abstract class AXPComponentSlot {
449
- host: any;
450
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPComponentSlot, never>;
451
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXPComponentSlot, never, never, {}, {}, never, never, true, never>;
452
- }
453
-
454
- declare class AXPComponentSlotDirective implements OnInit {
455
- name: _angular_core.InputSignal<string>;
456
- host: _angular_core.InputSignal<any>;
457
- context: _angular_core.InputSignal<any>;
458
- private elementRef;
459
- private registryService;
460
- private injector;
461
- private evaluator;
462
- private sessionService;
463
- viewContainerRef: ViewContainerRef;
464
- contextStore: {
465
- data: _angular_core.Signal<AXPContextData>;
466
- state: _angular_core.Signal<_acorex_platform_core.AXPContextState>;
467
- initialSnapshot: _angular_core.Signal<{}>;
468
- previousSnapshot: _angular_core.Signal<{}>;
469
- lastChange: _ngrx_signals.DeepSignal<_acorex_platform_core.AXPContextChangeEvent>;
470
- isChanged: _angular_core.Signal<boolean>;
471
- isReset: _angular_core.Signal<boolean>;
472
- isInitiated: _angular_core.Signal<boolean>;
473
- isEmpty: _angular_core.Signal<boolean>;
474
- isDirty: _angular_core.Signal<boolean>;
475
- snapshot: _angular_core.Signal<AXPContextData>;
476
- initial: _angular_core.Signal<{}>;
477
- previous: _angular_core.Signal<{}>;
478
- changeEvent: _angular_core.Signal<_acorex_platform_core.AXPContextChangeEvent>;
479
- update: (path: string, value: any) => void;
480
- patch: (context: {}) => void;
481
- reset: () => void;
482
- set: (initialData: any) => void;
483
- getValue: (path: string) => any;
484
- } & _ngrx_signals.StateSource<{
485
- data: AXPContextData;
486
- state: _acorex_platform_core.AXPContextState;
487
- initialSnapshot: {};
488
- previousSnapshot: {};
489
- lastChange: _acorex_platform_core.AXPContextChangeEvent;
490
- }>;
491
- isEmpty: _angular_core.Signal<boolean>;
492
- private _viewCount;
493
- private componentRefs;
494
- private placeholderRefs;
495
- constructor();
496
- ngOnInit(): Promise<void>;
497
- loadComponents(): Promise<void>;
498
- private evaluateCondition;
499
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPComponentSlotDirective, never>;
500
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXPComponentSlotDirective, "axp-component-slot", ["slot"], { "name": { "alias": "name"; "required": true; "isSignal": true; }; "host": { "alias": "host"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; }, {}, never, never, false, never>;
501
- }
502
-
503
- declare class AXPComponentSlotRegistryService {
504
- private registry;
505
- register(slotName: string, config: AXPComponentSlotConfig): void;
506
- get(slotName: string): AXPComponentSlotConfig[];
507
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPComponentSlotRegistryService, never>;
508
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPComponentSlotRegistryService>;
509
- }
510
-
511
- declare class AXPComponentSlotModule {
512
- static forRoot(configs?: AXPComponentSlotModuleConfigs): ModuleWithProviders<AXPComponentSlotModule>;
513
- static forChild(configs?: AXPComponentSlotModuleConfigs): ModuleWithProviders<AXPComponentSlotModule>;
514
- /**
515
- * @ignore
516
- */
517
- constructor(instances: any[]);
518
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPComponentSlotModule, [{ optional: true; }]>;
519
- static ɵmod: _angular_core.ɵɵNgModuleDeclaration<AXPComponentSlotModule, [typeof AXPComponentSlotDirective], never, [typeof AXPComponentSlotDirective]>;
520
- static ɵinj: _angular_core.ɵɵInjectorDeclaration<AXPComponentSlotModule>;
521
- }
522
-
523
434
  interface AXPDataSelectorColumn {
524
435
  name: string;
525
436
  title: string;
@@ -768,6 +679,18 @@ declare class AXPImageEditorService {
768
679
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPImageEditorService>;
769
680
  }
770
681
 
682
+ declare class AXPLogoComponent implements OnInit, OnChanges {
683
+ source: any;
684
+ protected logoType: string;
685
+ private platform;
686
+ ngOnInit(): void;
687
+ ngOnChanges(): void;
688
+ protected setLogoType(): void;
689
+ protected setLogoTheme(): void;
690
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPLogoComponent, never>;
691
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPLogoComponent, "axp-logo", never, { "source": { "alias": "source"; "required": false; }; }, {}, never, never, true, never>;
692
+ }
693
+
771
694
  /**
772
695
  * Menu item type definitions.
773
696
  * - 'menu': Standard navigable menu item
@@ -1118,6 +1041,149 @@ declare class AXPMenuCustomizerComponent implements OnInit {
1118
1041
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPMenuCustomizerComponent, "axp-menu-customizer", never, { "scopeKey": { "alias": "scopeKey"; "required": true; "isSignal": true; }; "showToolbar": { "alias": "showToolbar"; "required": false; "isSignal": true; }; "allowAddItems": { "alias": "allowAddItems"; "required": false; "isSignal": true; }; "dragBehavior": { "alias": "dragBehavior"; "required": false; "isSignal": true; }; "dragArea": { "alias": "dragArea"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
1119
1042
  }
1120
1043
 
1044
+ interface AXPPropertyViewerGroup {
1045
+ name: string;
1046
+ title: string;
1047
+ isCollapsed: boolean;
1048
+ props: AXPWidgetProperty[];
1049
+ }
1050
+ interface AXPPropertyViewerTab {
1051
+ name: string;
1052
+ title: string;
1053
+ groups: AXPPropertyViewerGroup[];
1054
+ }
1055
+ interface AXPPropertyViewerChangedEvent {
1056
+ values: any;
1057
+ mode: 'init' | 'update';
1058
+ }
1059
+
1060
+ declare class AXPPropertyViewerComponent {
1061
+ /**
1062
+ * List of tabs that should be rendered inside the property viewer.
1063
+ */
1064
+ tabsInput: _angular_core.InputSignal<AXPPropertyViewerTab[]>;
1065
+ /**
1066
+ * Determines rendering mode.
1067
+ */
1068
+ mode: _angular_core.InputSignal<"simple" | "advanced">;
1069
+ /**
1070
+ * Emits when property context changes.
1071
+ */
1072
+ onChanged: EventEmitter<AXPPropertyViewerChangedEvent>;
1073
+ protected currentTabIndex: WritableSignal<number>;
1074
+ protected tabs: _angular_core.Signal<AXPPropertyViewerTab[]>;
1075
+ protected groups: _angular_core.Signal<AXPPropertyViewerGroup[]>;
1076
+ protected context: WritableSignal<any>;
1077
+ /**
1078
+ * Per-expression-path override for "use expression" vs "use value" when binding.enabled.
1079
+ * Updated when user toggles the ax-switch; otherwise derived from isExpression(valueAtPath).
1080
+ */
1081
+ protected expressionModeState: WritableSignal<Record<string, boolean>>;
1082
+ protected groupCollapsedStates: Map<string, boolean>;
1083
+ private readonly expressionEvaluator;
1084
+ private readonly popupService;
1085
+ constructor();
1086
+ /**
1087
+ * Replaces the current context with the provided value and emits an init event.
1088
+ */
1089
+ initializeContext(value: any): void;
1090
+ /**
1091
+ * Merges the provided value into the current context and emits an update event.
1092
+ */
1093
+ update(value: any): void;
1094
+ /**
1095
+ * Handles context changes produced by rendered widgets.
1096
+ */
1097
+ protected handleContextChange(event: AXPWidgetCoreContextChangeEvent): void;
1098
+ /**
1099
+ * Handles tab selection changes.
1100
+ */
1101
+ protected handleTabChange(event: AXTabStripChangedEvent): void;
1102
+ /**
1103
+ * Stores collapsed state for a group.
1104
+ */
1105
+ protected handleCollapsedChange(groupName: string, isCollapsed: boolean): void;
1106
+ /**
1107
+ * Returns the config path used for the binding value (and expression) for a property with binding.enabled.
1108
+ */
1109
+ protected getExpressionPath(prop: AXPWidgetProperty): string;
1110
+ /**
1111
+ * True when the property is in "expression" mode: show only the expression editor button, not the widget.
1112
+ * Uses expressionModeState when set; otherwise derives from isExpression(valueAtPath).
1113
+ */
1114
+ protected isExpressionMode(prop: AXPWidgetProperty): boolean;
1115
+ /**
1116
+ * Returns the default value when switching from expression to value mode.
1117
+ * Source of truth is prop.schema.defaultValue (widget.types): plain value, or function (context) => value.
1118
+ * A minimal dataType fallback is used only when the schema provides no default.
1119
+ */
1120
+ private getDefaultValueForProperty;
1121
+ /**
1122
+ * Updates the expression/value toggle state for a binding-enabled property.
1123
+ * When switching to value: resets the value at path to a type-appropriate default so the
1124
+ * widget renderer does not receive the expression string (e.g. checkbox gets false, not a string).
1125
+ * When switching to expression: sets the value at path to '{{ }}' so the popup opens with
1126
+ * a clean expression placeholder instead of the previous literal (e.g. true/false).
1127
+ */
1128
+ protected setExpressionMode(prop: AXPWidgetProperty, useExpression: boolean): void;
1129
+ /**
1130
+ * Opens the binding/expression code editor for a property with binding.enabled.
1131
+ * Ensures the value passed to the popup is always a string to avoid code-editor crashes.
1132
+ */
1133
+ protected openBindingEditor(prop: AXPWidgetProperty): Promise<void>;
1134
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerComponent, never>;
1135
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPropertyViewerComponent, "axp-property-viewer", never, { "tabsInput": { "alias": "tabsInput"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, { "onChanged": "onChanged"; }, never, never, true, never>;
1136
+ }
1137
+
1138
+ declare class AXPPropertyViewerPopupComponent extends AXBasePageComponent {
1139
+ tabs: _angular_core.InputSignal<AXPPropertyViewerTab[]>;
1140
+ mode: _angular_core.InputSignal<"simple" | "advanced">;
1141
+ context: _angular_core.InputSignal<any>;
1142
+ protected readonly propertyViewer: _angular_core.Signal<AXPPropertyViewerComponent | undefined>;
1143
+ protected readonly currentValues: _angular_core.WritableSignal<any>;
1144
+ protected currentMode: 'init' | 'update';
1145
+ constructor();
1146
+ protected handlePropertyChanged(event: AXPPropertyViewerChangedEvent): void;
1147
+ protected handleCloseClick(): void;
1148
+ protected handleApplyClick(): void;
1149
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerPopupComponent, never>;
1150
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPropertyViewerPopupComponent, "axp-property-viewer-popup", never, { "tabs": { "alias": "tabs"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1151
+ }
1152
+
1153
+ interface AXPPropertyViewerConfig {
1154
+ title: string;
1155
+ tabs: AXPPropertyViewerTab[];
1156
+ context?: any;
1157
+ mode?: 'simple' | 'advanced';
1158
+ size?: 'sm' | 'md' | 'lg' | 'full';
1159
+ }
1160
+ interface AXPPropertyViewerResult {
1161
+ values: any;
1162
+ mode: 'init' | 'update';
1163
+ }
1164
+ declare class AXPPropertyViewerService {
1165
+ private readonly popupService;
1166
+ /**
1167
+ * Open property viewer popup with predefined tabs and context.
1168
+ */
1169
+ open(config: AXPPropertyViewerConfig): Promise<AXPPropertyViewerResult | null>;
1170
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerService, never>;
1171
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPPropertyViewerService>;
1172
+ }
1173
+
1174
+ declare class AXPQuerySortsComponent {
1175
+ sortDefinitions: _angular_core.ModelSignal<AXPSortDefinition[]>;
1176
+ sortQueries: _angular_core.WritableSignal<AXPSortQuery[]>;
1177
+ initialSortQueries: _angular_core.InputSignal<AXPSortQuery[]>;
1178
+ sortQueriesChange: _angular_core.OutputEmitterRef<AXPSortQuery[]>;
1179
+ constructor();
1180
+ protected drop(event: CdkDragDrop<unknown[]>): void;
1181
+ getSortDirection(item: AXPSortDefinition): "desc" | "asc" | undefined;
1182
+ protected changeItemSort(item: AXPSortDefinition): void;
1183
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPQuerySortsComponent, never>;
1184
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPQuerySortsComponent, "axp-query-sorts", never, { "sortDefinitions": { "alias": "sortDefinitions"; "required": false; "isSignal": true; }; "initialSortQueries": { "alias": "initialSortQueries"; "required": false; "isSignal": true; }; }, { "sortDefinitions": "sortDefinitionsChange"; "sortQueriesChange": "sortQueriesChange"; }, never, never, true, never>;
1185
+ }
1186
+
1121
1187
  /**
1122
1188
  * Represents a spreadsheet item (row or column header) with id, text, and optional description
1123
1189
  */
@@ -1454,161 +1520,6 @@ declare class AXPSpreadsheetComponent {
1454
1520
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPSpreadsheetComponent, "axp-spreadsheet", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rowMode": { "alias": "rowMode"; "required": false; "isSignal": true; }; "rowsInput": { "alias": "rowsInput"; "required": false; "isSignal": true; }; "rowsModel": { "alias": "rowsModel"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "emptyCellPlaceholder": { "alias": "emptyCellPlaceholder"; "required": false; "isSignal": true; }; "rowTitlePath": { "alias": "rowTitlePath"; "required": false; "isSignal": true; }; "rowDescriptionPath": { "alias": "rowDescriptionPath"; "required": false; "isSignal": true; }; "allowAddRows": { "alias": "allowAddRows"; "required": false; "isSignal": true; }; "allowRemoveRows": { "alias": "allowRemoveRows"; "required": false; "isSignal": true; }; }, { "rowsModel": "rowsModelChange"; "cellChange": "cellChange"; "rowChange": "rowChange"; "spreadsheetChange": "spreadsheetChange"; }, never, never, true, never>;
1455
1521
  }
1456
1522
 
1457
- declare class AXPLogoComponent implements OnInit, OnChanges {
1458
- source: any;
1459
- protected logoType: string;
1460
- private platform;
1461
- ngOnInit(): void;
1462
- ngOnChanges(): void;
1463
- protected setLogoType(): void;
1464
- protected setLogoTheme(): void;
1465
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPLogoComponent, never>;
1466
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPLogoComponent, "axp-logo", never, { "source": { "alias": "source"; "required": false; }; }, {}, never, never, true, never>;
1467
- }
1468
-
1469
- interface AXPPropertyViewerGroup {
1470
- name: string;
1471
- title: string;
1472
- isCollapsed: boolean;
1473
- props: AXPWidgetProperty[];
1474
- }
1475
- interface AXPPropertyViewerTab {
1476
- name: string;
1477
- title: string;
1478
- groups: AXPPropertyViewerGroup[];
1479
- }
1480
- interface AXPPropertyViewerChangedEvent {
1481
- values: any;
1482
- mode: 'init' | 'update';
1483
- }
1484
-
1485
- declare class AXPPropertyViewerComponent {
1486
- /**
1487
- * List of tabs that should be rendered inside the property viewer.
1488
- */
1489
- tabsInput: _angular_core.InputSignal<AXPPropertyViewerTab[]>;
1490
- /**
1491
- * Determines rendering mode.
1492
- */
1493
- mode: _angular_core.InputSignal<"simple" | "advanced">;
1494
- /**
1495
- * Emits when property context changes.
1496
- */
1497
- onChanged: EventEmitter<AXPPropertyViewerChangedEvent>;
1498
- protected currentTabIndex: WritableSignal<number>;
1499
- protected tabs: _angular_core.Signal<AXPPropertyViewerTab[]>;
1500
- protected groups: _angular_core.Signal<AXPPropertyViewerGroup[]>;
1501
- protected context: WritableSignal<any>;
1502
- /**
1503
- * Per-expression-path override for "use expression" vs "use value" when binding.enabled.
1504
- * Updated when user toggles the ax-switch; otherwise derived from isExpression(valueAtPath).
1505
- */
1506
- protected expressionModeState: WritableSignal<Record<string, boolean>>;
1507
- protected groupCollapsedStates: Map<string, boolean>;
1508
- private readonly expressionEvaluator;
1509
- private readonly popupService;
1510
- constructor();
1511
- /**
1512
- * Replaces the current context with the provided value and emits an init event.
1513
- */
1514
- initializeContext(value: any): void;
1515
- /**
1516
- * Merges the provided value into the current context and emits an update event.
1517
- */
1518
- update(value: any): void;
1519
- /**
1520
- * Handles context changes produced by rendered widgets.
1521
- */
1522
- protected handleContextChange(event: AXPWidgetCoreContextChangeEvent): void;
1523
- /**
1524
- * Handles tab selection changes.
1525
- */
1526
- protected handleTabChange(event: AXTabStripChangedEvent): void;
1527
- /**
1528
- * Stores collapsed state for a group.
1529
- */
1530
- protected handleCollapsedChange(groupName: string, isCollapsed: boolean): void;
1531
- /**
1532
- * Returns the config path used for the binding value (and expression) for a property with binding.enabled.
1533
- */
1534
- protected getExpressionPath(prop: AXPWidgetProperty): string;
1535
- /**
1536
- * True when the property is in "expression" mode: show only the expression editor button, not the widget.
1537
- * Uses expressionModeState when set; otherwise derives from isExpression(valueAtPath).
1538
- */
1539
- protected isExpressionMode(prop: AXPWidgetProperty): boolean;
1540
- /**
1541
- * Returns the default value when switching from expression to value mode.
1542
- * Source of truth is prop.schema.defaultValue (widget.types): plain value, or function (context) => value.
1543
- * A minimal dataType fallback is used only when the schema provides no default.
1544
- */
1545
- private getDefaultValueForProperty;
1546
- /**
1547
- * Updates the expression/value toggle state for a binding-enabled property.
1548
- * When switching to value: resets the value at path to a type-appropriate default so the
1549
- * widget renderer does not receive the expression string (e.g. checkbox gets false, not a string).
1550
- * When switching to expression: sets the value at path to '{{ }}' so the popup opens with
1551
- * a clean expression placeholder instead of the previous literal (e.g. true/false).
1552
- */
1553
- protected setExpressionMode(prop: AXPWidgetProperty, useExpression: boolean): void;
1554
- /**
1555
- * Opens the binding/expression code editor for a property with binding.enabled.
1556
- * Ensures the value passed to the popup is always a string to avoid code-editor crashes.
1557
- */
1558
- protected openBindingEditor(prop: AXPWidgetProperty): Promise<void>;
1559
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerComponent, never>;
1560
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPropertyViewerComponent, "axp-property-viewer", never, { "tabsInput": { "alias": "tabsInput"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; }, { "onChanged": "onChanged"; }, never, never, true, never>;
1561
- }
1562
-
1563
- declare class AXPPropertyViewerPopupComponent extends AXBasePageComponent {
1564
- tabs: _angular_core.InputSignal<AXPPropertyViewerTab[]>;
1565
- mode: _angular_core.InputSignal<"simple" | "advanced">;
1566
- context: _angular_core.InputSignal<any>;
1567
- protected readonly propertyViewer: _angular_core.Signal<AXPPropertyViewerComponent | undefined>;
1568
- protected readonly currentValues: _angular_core.WritableSignal<any>;
1569
- protected currentMode: 'init' | 'update';
1570
- constructor();
1571
- protected handlePropertyChanged(event: AXPPropertyViewerChangedEvent): void;
1572
- protected handleCloseClick(): void;
1573
- protected handleApplyClick(): void;
1574
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerPopupComponent, never>;
1575
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPropertyViewerPopupComponent, "axp-property-viewer-popup", never, { "tabs": { "alias": "tabs"; "required": true; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1576
- }
1577
-
1578
- interface AXPPropertyViewerConfig {
1579
- title: string;
1580
- tabs: AXPPropertyViewerTab[];
1581
- context?: any;
1582
- mode?: 'simple' | 'advanced';
1583
- size?: 'sm' | 'md' | 'lg' | 'full';
1584
- }
1585
- interface AXPPropertyViewerResult {
1586
- values: any;
1587
- mode: 'init' | 'update';
1588
- }
1589
- declare class AXPPropertyViewerService {
1590
- private readonly popupService;
1591
- /**
1592
- * Open property viewer popup with predefined tabs and context.
1593
- */
1594
- open(config: AXPPropertyViewerConfig): Promise<AXPPropertyViewerResult | null>;
1595
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerService, never>;
1596
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPPropertyViewerService>;
1597
- }
1598
-
1599
- declare class AXPQuerySortsComponent {
1600
- sortDefinitions: _angular_core.ModelSignal<AXPSortDefinition[]>;
1601
- sortQueries: _angular_core.WritableSignal<AXPSortQuery[]>;
1602
- initialSortQueries: _angular_core.InputSignal<AXPSortQuery[]>;
1603
- sortQueriesChange: _angular_core.OutputEmitterRef<AXPSortQuery[]>;
1604
- constructor();
1605
- protected drop(event: CdkDragDrop<unknown[]>): void;
1606
- getSortDirection(item: AXPSortDefinition): "desc" | "asc" | undefined;
1607
- protected changeItemSort(item: AXPSortDefinition): void;
1608
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPQuerySortsComponent, never>;
1609
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPQuerySortsComponent, "axp-query-sorts", never, { "sortDefinitions": { "alias": "sortDefinitions"; "required": false; "isSignal": true; }; "initialSortQueries": { "alias": "initialSortQueries"; "required": false; "isSignal": true; }; }, { "sortDefinitions": "sortDefinitionsChange"; "sortQueriesChange": "sortQueriesChange"; }, never, never, true, never>;
1610
- }
1611
-
1612
1523
  type StateMode = 'empty' | 'error' | 'loading' | 'warning' | 'info' | 'success';
1613
1524
  declare class AXPStateMessageComponent {
1614
1525
  mode: _angular_core.InputSignal<StateMode>;
@@ -2159,5 +2070,5 @@ declare class AXPWidgetPropertyViewerService {
2159
2070
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPWidgetPropertyViewerService>;
2160
2071
  }
2161
2072
 
2162
- export { AXPActivityLogComponent, AXPCategoryTreeComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPImageEditorPopupComponent, AXPImageEditorService, AXPLogoComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPSpreadsheetComponent, AXPStateMessageComponent, AXPStopwatchComponent, AXPTableColumnsEditorComponent, AXPTableColumnsEditorPopupComponent, AXPTableColumnsEditorService, AXPTableDataEditorComponent, AXPTableDataEditorPopupComponent, AXPTableDataEditorService, AXPTaskBadgeDirective, AXPTaskBadgeProvider, AXPTaskBadgeService, AXPTemplateViewerComponent, AXPTemplateViewerService, AXPThemeLayoutActionsComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutContainerComponent, AXPThemeLayoutEndSideComponent, AXPThemeLayoutFooterComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutListItemsGroupComponent, AXPThemeLayoutPageHeaderComponent, AXPThemeLayoutPagePrimaryActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutSectionComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutToolbarComponent, AXPUserAvatarComponent, AXPUserAvatarService, AXPWidgetFieldConfiguratorComponent, AXPWidgetItemComponent, AXPWidgetPropertyViewerComponent, AXPWidgetPropertyViewerPopupComponent, AXPWidgetPropertyViewerService, AXP_MENU_CUSTOMIZER_SERVICE, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, buildTableColumnsEditorLayout };
2163
- export type { AXPCategoryTreeActions, AXPCategoryTreeConfig, AXPCategoryTreeDataSource, AXPCategoryTreeEvents, AXPCategoryTreeNode, AXPColumnItemListItem, AXPCompareViewField, AXPCompareViewInputs, AXPCompareViewMode, AXPCompareViewObject, AXPComponentSlotConfig, AXPComponentSlotModuleConfigs, AXPDataSelectorColumn, AXPDataSelectorConfig, AXPDragDropListConfig, AXPDragDropListDropEvent, AXPDragDropListItem, AXPImageEditorOpenOptions, AXPMenuCustomizerAction, AXPMenuCustomizerItem, AXPMenuCustomizerItemType, AXPMenuCustomizerNodeData, AXPMenuCustomizerNodeMetadata, AXPMenuCustomizerState, AXPPropertyViewerChangedEvent, AXPPropertyViewerConfig, AXPPropertyViewerGroup, AXPPropertyViewerResult, AXPPropertyViewerTab, AXPSpreadsheetCellChangeEvent, AXPSpreadsheetCellValue, AXPSpreadsheetColumn, AXPSpreadsheetConfig, AXPSpreadsheetData, AXPSpreadsheetItem, AXPSpreadsheetRowChangeEvent, AXPSpreadsheetRowMode, AXPTableColumnDefinition, AXPTableColumnsEditorOpenOptions, AXPTableDataEditorOpenOptions, AXPTemplateViewerConfig, AXPTemplateViewerResult, AXPUserAvatarData, AXPUserAvatarProvider, AXPUserAvatarSize, AXPUserAvatarStatus, AXPWidgetItemClickEvent, AXPWidgetItemData, AXPWidgetPropertiesChangedEvent, AXPWidgetPropertyInjection, AXPWidgetPropertyViewerConfig, AXPWidgetPropertyViewerResult, StateMode };
2073
+ export { AXPActivityLogComponent, AXPCategoryTreeComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPImageEditorPopupComponent, AXPImageEditorService, AXPLogoComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPSpreadsheetComponent, AXPStateMessageComponent, AXPStopwatchComponent, AXPTableColumnsEditorComponent, AXPTableColumnsEditorPopupComponent, AXPTableColumnsEditorService, AXPTableDataEditorComponent, AXPTableDataEditorPopupComponent, AXPTableDataEditorService, AXPTaskBadgeDirective, AXPTaskBadgeProvider, AXPTaskBadgeService, AXPTemplateViewerComponent, AXPTemplateViewerService, AXPThemeLayoutActionsComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutContainerComponent, AXPThemeLayoutEndSideComponent, AXPThemeLayoutFooterComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutListItemsGroupComponent, AXPThemeLayoutPageHeaderComponent, AXPThemeLayoutPagePrimaryActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutSectionComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutToolbarComponent, AXPUserAvatarComponent, AXPUserAvatarService, AXPWidgetFieldConfiguratorComponent, AXPWidgetItemComponent, AXPWidgetPropertyViewerComponent, AXPWidgetPropertyViewerPopupComponent, AXPWidgetPropertyViewerService, AXP_MENU_CUSTOMIZER_SERVICE, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, buildTableColumnsEditorLayout };
2074
+ export type { AXPCategoryTreeActions, AXPCategoryTreeConfig, AXPCategoryTreeDataSource, AXPCategoryTreeEvents, AXPCategoryTreeNode, AXPColumnItemListItem, AXPCompareViewField, AXPCompareViewInputs, AXPCompareViewMode, AXPCompareViewObject, AXPDataSelectorColumn, AXPDataSelectorConfig, AXPDragDropListConfig, AXPDragDropListDropEvent, AXPDragDropListItem, AXPImageEditorOpenOptions, AXPMenuCustomizerAction, AXPMenuCustomizerItem, AXPMenuCustomizerItemType, AXPMenuCustomizerNodeData, AXPMenuCustomizerNodeMetadata, AXPMenuCustomizerState, AXPPropertyViewerChangedEvent, AXPPropertyViewerConfig, AXPPropertyViewerGroup, AXPPropertyViewerResult, AXPPropertyViewerTab, AXPSpreadsheetCellChangeEvent, AXPSpreadsheetCellValue, AXPSpreadsheetColumn, AXPSpreadsheetConfig, AXPSpreadsheetData, AXPSpreadsheetItem, AXPSpreadsheetRowChangeEvent, AXPSpreadsheetRowMode, AXPTableColumnDefinition, AXPTableColumnsEditorOpenOptions, AXPTableDataEditorOpenOptions, AXPTemplateViewerConfig, AXPTemplateViewerResult, AXPUserAvatarData, AXPUserAvatarProvider, AXPUserAvatarSize, AXPUserAvatarStatus, AXPWidgetItemClickEvent, AXPWidgetItemData, AXPWidgetPropertiesChangedEvent, AXPWidgetPropertyInjection, AXPWidgetPropertyViewerConfig, AXPWidgetPropertyViewerResult, StateMode };
@@ -831,6 +831,7 @@ interface AXPRecordStateInfo {
831
831
  interface AXPRecordOwnershipInfo {
832
832
  tenantId?: string;
833
833
  applicationId?: string;
834
+ userId?: string;
834
835
  }
835
836
  interface AXPEntityModel<Id> {
836
837
  id: Id;
@@ -1253,6 +1254,11 @@ declare class AXPCategoryTreeService {
1253
1254
  * Load root categories
1254
1255
  */
1255
1256
  loadRootCategories(treeData: CategoryTreeNodeData, config: CategoryTreeConfig): Promise<Record<string, unknown>[] | null>;
1257
+ /**
1258
+ * Fetches a single category item by ID. Uses byKey when available (full item with parent),
1259
+ * otherwise falls back to list query with filter so ancestor chains can be built.
1260
+ */
1261
+ fetchItemById(id: string, treeData: CategoryTreeNodeData, config: CategoryTreeConfig): Promise<Record<string, unknown> | null>;
1256
1262
  /**
1257
1263
  * Load children for a given node
1258
1264
  */
@@ -1340,6 +1346,8 @@ declare class AXPMiddlewareEntityStorageService<TKey = any, TDetailDto extends A
1340
1346
  private readonly backend;
1341
1347
  private readonly allMiddlewares;
1342
1348
  private readonly injector;
1349
+ /** In-flight read requests - identical parallel requests share one execution */
1350
+ private readonly inFlight;
1343
1351
  get dbName(): string;
1344
1352
  private filterMiddlewares;
1345
1353
  private compose;
@@ -1355,6 +1363,7 @@ declare class AXPMiddlewareEntityStorageService<TKey = any, TDetailDto extends A
1355
1363
  insertOne(entityName: string, entity: TCreateDto): Promise<TKey>;
1356
1364
  getAll(entityName: string): Promise<TListItemDto[]>;
1357
1365
  query(entityName: string, request: AXPQueryRequest): Promise<AXPPagedListResult<TListItemDto>>;
1366
+ private runWithDedup;
1358
1367
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPMiddlewareEntityStorageService<any, any, any, any, any>, never>;
1359
1368
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPMiddlewareEntityStorageService<any, any, any, any, any>>;
1360
1369
  }
@@ -1410,6 +1419,8 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
1410
1419
  valueField: _angular_core.WritableSignal<string>;
1411
1420
  allowMultiple: _angular_core.WritableSignal<boolean>;
1412
1421
  selectedValues: _angular_core.WritableSignal<string[]>;
1422
+ /** Optional input for when popup passes selected values via inputs instead of data */
1423
+ selectedValuesInput: _angular_core.WritableSignal<string[]>;
1413
1424
  searchPlaceholder: _angular_core.WritableSignal<string>;
1414
1425
  excludedNodeId: _angular_core.WritableSignal<string | undefined>;
1415
1426
  searchWithChildren: _angular_core.WritableSignal<boolean>;
@@ -1436,8 +1447,19 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
1436
1447
  private relevantNodeIds;
1437
1448
  private expandedNodesBeforeSearch;
1438
1449
  private nodesExpandedDuringSearch;
1450
+ private initialExpandSyncDone;
1451
+ constructor();
1439
1452
  ngOnInit(): void;
1440
1453
  private initializeTree;
1454
+ /**
1455
+ * Called when popup data arrives after ngOnInit: load data, set selection, expand and sync.
1456
+ */
1457
+ private runInitialExpandAndSync;
1458
+ /**
1459
+ * Runs expand path + sync selection once the tree viewChild is available.
1460
+ * Uses retry loop so we don't run before the view has rendered the tree.
1461
+ */
1462
+ private runExpandAndSyncWhenTreeReady;
1441
1463
  /**
1442
1464
  * Handles search input value changes - Uses server-side search for efficiency and reliability
1443
1465
  */
@@ -1458,7 +1480,8 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
1458
1480
  */
1459
1481
  private collectChildrenRecursively;
1460
1482
  /**
1461
- * Fetches a single item by ID from the server
1483
+ * Fetches a single item by ID. Uses category tree service so byKey is used when available
1484
+ * (returns full item with parent/parentId for building ancestor chains).
1462
1485
  */
1463
1486
  private fetchItemById;
1464
1487
  /**
@@ -1534,6 +1557,8 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
1534
1557
  * This ensures parent nodes are loaded into the tree before selecting children.
1535
1558
  */
1536
1559
  private expandAncestorNodesInOrder;
1560
+ /** Waits until the node is expanded (tree has loaded children). Polls so deep paths load. */
1561
+ private waitForNodeExpanded;
1537
1562
  /**
1538
1563
  * Syncs selection state with the tree component.
1539
1564
  * Selects leaf nodes and manually updates parent states (indeterminate/selected).
@@ -1550,6 +1575,15 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
1550
1575
  * This is critical for pre-selected values in collapsed branches.
1551
1576
  */
1552
1577
  private loadMissingNodeData;
1578
+ /**
1579
+ * For each selected id, if cached item has no parent (e.g. batch query returned minimal fields),
1580
+ * re-fetch by id so we have parent/parentId for building ancestor chains.
1581
+ */
1582
+ private ensureParentDataInCache;
1583
+ /**
1584
+ * Resolves parent ID from node data: supports nested `parent` object or flat parentId/parentKey.
1585
+ */
1586
+ private getParentIdFromNodeData;
1553
1587
  /**
1554
1588
  * Marks nodes as selected in the tree structure based on selectedNodeIds.
1555
1589
  * This ensures pre-selected nodes appear selected when the tree is rendered.
@@ -1603,6 +1637,7 @@ declare class AXPEntityCategoryWidgetColumnComponent extends AXPColumnWidgetComp
1603
1637
  protected readonly entityDetailPopoverService: AXPEntityDetailPopoverService;
1604
1638
  protected readonly formatService: AXFormatService;
1605
1639
  protected readonly entityResolver: AXPEntityDefinitionRegistryService;
1640
+ private readonly categoryBatchResolver;
1606
1641
  private readonly rawValueSignal;
1607
1642
  set rawValueInput(value: any);
1608
1643
  protected entity: _angular_core.Signal<string>;
@@ -1627,6 +1662,12 @@ declare class AXPEntityCategoryWidgetColumnComponent extends AXPColumnWidgetComp
1627
1662
  protected joinPath(path: string[]): string;
1628
1663
  protected getItemId(item: any): string;
1629
1664
  protected getBreadcrumbPath(item: any): string;
1665
+ private resolveItemsWithPaths;
1666
+ /**
1667
+ * Build path from categories array when record has full chain (id, parentId, title).
1668
+ * Used when middleware enriches categories on create/update.
1669
+ */
1670
+ private buildItemWithPathFromChain;
1630
1671
  private extractItemWithPath;
1631
1672
  /**
1632
1673
  * Calculate the full path from root to the item.