@acorex/platform 21.0.0-next.24 → 21.0.0-next.33
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/fesm2022/acorex-platform-auth.mjs +121 -27
- package/fesm2022/acorex-platform-auth.mjs.map +1 -1
- package/fesm2022/{acorex-platform-common-common-settings.provider-gyb6ohAE.mjs → acorex-platform-common-common-settings.provider-G9XcXXOG.mjs} +46 -4
- package/fesm2022/acorex-platform-common-common-settings.provider-G9XcXXOG.mjs.map +1 -0
- package/fesm2022/acorex-platform-common.mjs +677 -267
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-core.mjs +393 -111
- package/fesm2022/acorex-platform-core.mjs.map +1 -1
- package/fesm2022/acorex-platform-domain.mjs +554 -826
- package/fesm2022/acorex-platform-domain.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +345 -59
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-components-binding-expression-editor-popup.component-Cb6Lk4Ch.mjs → acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs} +9 -9
- package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-CXEdvDTf.mjs.map +1 -0
- package/fesm2022/acorex-platform-layout-components.mjs +3373 -872
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-designer.mjs +169 -154
- package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +14645 -11533
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-views.mjs +244 -170
- package/fesm2022/acorex-platform-layout-views.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widget-core.mjs +367 -408
- package/fesm2022/acorex-platform-layout-widget-core.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-widgets-button-widget-designer.component-Dnbx_uY7.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-file-list-popup.component-B0omAUil.mjs → acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs} +30 -22
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-9uCkMxcc.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-image-preview.popup-D-HFZHNZ.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-q30grR3z.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-BGQqY5Mw.mjs +111 -0
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-BGQqY5Mw.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-edit-popup.component-BJh1QJqp.mjs → acorex-platform-layout-widgets-tabular-data-edit-popup.component-DmzNTYiS.mjs} +7 -7
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-DmzNTYiS.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-tabular-data-view-popup.component--rzP7scF.mjs → acorex-platform-layout-widgets-tabular-data-view-popup.component-BNG_588B.mjs} +5 -5
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component-BNG_588B.mjs.map +1 -0
- package/fesm2022/{acorex-platform-layout-widgets-text-block-widget-designer.component-DHlgsHa7.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 +5924 -4049
- 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 +220 -169
- package/fesm2022/acorex-platform-runtime.mjs.map +1 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs +160 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-Cvvr4HnL.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs +120 -0
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-TYoLN1Jq.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs → acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs} +15 -22
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-C2z5Lq9y.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-error-401.component-D9NZ-6L_.mjs → acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs} +4 -4
- package/fesm2022/acorex-platform-themes-default-error-401.component-C7EYJzSr.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-default-error-404.component-CgB_tlPU.mjs → acorex-platform-themes-default-error-404.component-7MVLMwIa.mjs} +4 -4
- package/fesm2022/acorex-platform-themes-default-error-404.component-7MVLMwIa.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 +1667 -61
- package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
- package/fesm2022/{acorex-platform-themes-shared-icon-chooser-column.component-Cmju9l91.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-Cp5Th57U.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.map +1 -1
- package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-column.component-BQxoUmYL.mjs → acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs} +4 -4
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-CHfrTtol.mjs.map +1 -0
- package/fesm2022/{acorex-platform-themes-shared-theme-color-chooser-view.component-CTGy2kjJ.mjs → acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs} +9 -9
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-BSmvnUVq.mjs.map +1 -0
- package/fesm2022/acorex-platform-themes-shared.mjs +231 -227
- package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
- package/fesm2022/acorex-platform-workflow.mjs +208 -91
- package/fesm2022/acorex-platform-workflow.mjs.map +1 -1
- package/fesm2022/acorex-platform.mjs.map +1 -1
- package/package.json +34 -34
- package/{auth/index.d.ts → types/acorex-platform-auth.d.ts} +14 -2
- package/{common/index.d.ts → types/acorex-platform-common.d.ts} +189 -16
- package/{core/index.d.ts → types/acorex-platform-core.d.ts} +178 -15
- package/{domain/index.d.ts → types/acorex-platform-domain.d.ts} +719 -413
- package/{layout/builder/index.d.ts → types/acorex-platform-layout-builder.d.ts} +91 -42
- package/{layout/components/index.d.ts → types/acorex-platform-layout-components.d.ts} +893 -138
- package/{layout/designer/index.d.ts → types/acorex-platform-layout-designer.d.ts} +9 -3
- package/{layout/entity/index.d.ts → types/acorex-platform-layout-entity.d.ts} +515 -26
- package/{layout/views/index.d.ts → types/acorex-platform-layout-views.d.ts} +44 -9
- package/{layout/widget-core/index.d.ts → types/acorex-platform-layout-widget-core.d.ts} +146 -95
- package/{layout/widgets/index.d.ts → types/acorex-platform-layout-widgets.d.ts} +506 -98
- package/{native/index.d.ts → types/acorex-platform-native.d.ts} +0 -7
- package/{runtime/index.d.ts → types/acorex-platform-runtime.d.ts} +237 -74
- package/{themes/default/index.d.ts → types/acorex-platform-themes-default.d.ts} +104 -4
- package/{workflow/index.d.ts → types/acorex-platform-workflow.d.ts} +33 -30
- package/fesm2022/acorex-platform-common-common-settings.provider-gyb6ohAE.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-components-binding-expression-editor-popup.component-Cb6Lk4Ch.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-button-widget-designer.component-Dnbx_uY7.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-file-list-popup.component-B0omAUil.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-image-preview.popup-D-HFZHNZ.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-page-widget-designer.component-q30grR3z.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs +0 -111
- package/fesm2022/acorex-platform-layout-widgets-repeater-widget-column.component-fcCirNxz.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-edit-popup.component-BJh1QJqp.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-tabular-data-view-popup.component--rzP7scF.mjs.map +0 -1
- package/fesm2022/acorex-platform-layout-widgets-text-block-widget-designer.component-DHlgsHa7.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-D_ex0nL2.mjs +0 -160
- package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-D_ex0nL2.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BhDLyC5P.mjs +0 -1611
- package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BhDLyC5P.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs +0 -99
- package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CgLUnYRq.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-di5w_3K2.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-401.component-D9NZ-6L_.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-404.component-CgB_tlPU.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-default-error-offline.component-DlUrqVmj.mjs +0 -19
- package/fesm2022/acorex-platform-themes-default-error-offline.component-DlUrqVmj.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-column.component-Cmju9l91.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-icon-chooser-view.component-Cp5Th57U.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-column.component-BQxoUmYL.mjs.map +0 -1
- package/fesm2022/acorex-platform-themes-shared-theme-color-chooser-view.component-CTGy2kjJ.mjs.map +0 -1
- /package/{themes/shared/index.d.ts → types/acorex-platform-themes-shared.d.ts} +0 -0
- /package/{index.d.ts → types/acorex-platform.d.ts} +0 -0
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { Signal, InjectionToken, InputSignal, TemplateRef, ElementRef, OnDestroy, OnInit, Type, QueryList, OnChanges, EventEmitter, WritableSignal } from '@angular/core';
|
|
3
|
-
import { AXPActivityLog, AXPSystemActionType, AXPCategoryEntity, AXPColumnQuery, AXPContextData, AXPFilterDefinition, AXPFilterQuery, AXPSortDefinition, AXPSortQuery, AXPMetaData, AXPViewQuery } from '@acorex/platform/core';
|
|
3
|
+
import { AXPActivityLog, AXPSystemActionType, AXPCategoryEntity, AXPColumnQuery, AXPContextData, AXPFilterClause, AXPFilterDefinition, AXPFilterQuery, AXPContextChangeEvent, AXPSortDefinition, AXPSortQuery, AXPMetaData, AXPViewQuery, AXPMultiLanguageString, AXPActionMenuItem, AXPExecuteCommand, AXPExecuteCommandResult, containsHtmlMarkup } from '@acorex/platform/core';
|
|
4
4
|
import { AXPMenuItem } from '@acorex/platform/common';
|
|
5
|
-
import { AXValueChangedEvent, AXClickEvent, AXDataSource, AXDataSourceFilterOption, AXHtmlEvent, AXEvent } from '@acorex/cdk/common';
|
|
5
|
+
import { AXValueChangedEvent, AXClickEvent, AXDataSource, AXDataSourceFilterOption, AXDataSourceOperator, AXFilterLogic, AXHtmlEvent, AXEvent, AXRange } from '@acorex/cdk/common';
|
|
6
6
|
import { AXTreeViewLegacyComponent, AXTreeItemClickBaseEventLegacy } from '@acorex/components/tree-view-legacy';
|
|
7
|
-
import { AXTranslationService } from '@acorex/core/translation';
|
|
8
7
|
import { AXPopoverComponent } from '@acorex/components/popover';
|
|
9
8
|
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
10
9
|
import * as _acorex_platform_layout_widget_core from '@acorex/platform/layout/widget-core';
|
|
11
|
-
import { AXPWidgetNode, AXPWidgetRendererDirective,
|
|
10
|
+
import { AXPWidgetNode, AXPWidgetRendererDirective, AXPWidgetProperty, AXPWidgetConfig } from '@acorex/platform/layout/widget-core';
|
|
12
11
|
import { AXDataTableComponent, AXDataTableRowDbClick, AXDataTableRowClick } from '@acorex/components/data-table';
|
|
13
12
|
import { AXBasePageComponent } from '@acorex/components/page';
|
|
14
13
|
import { AXDropListDroppedEvent } from '@acorex/cdk/drag-drop';
|
|
15
14
|
import { AXTagBoxComponent } from '@acorex/components/tag-box';
|
|
16
15
|
import { AXCalendarService } from '@acorex/core/date-time';
|
|
16
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
17
|
+
import { AXFormComponent } from '@acorex/components/form';
|
|
17
18
|
import { AXTreeViewNode, AXTreeViewDragBehavior, AXTreeViewDragArea, AXTreeViewComponent, AXTreeViewBeforeDropEvent, AXTreeViewDropEvent } from '@acorex/components/tree-view';
|
|
18
19
|
import { AXTabStripChangedEvent, AXTabsComponent } from '@acorex/components/tabs';
|
|
19
|
-
import {
|
|
20
|
+
import { AXValidationSummary } from '@acorex/core/validation';
|
|
20
21
|
import { AXPopupSizeType, AXPopupService } from '@acorex/components/popup';
|
|
21
|
-
import { Observable } from 'rxjs';
|
|
22
|
+
import { Observable, Subject } from 'rxjs';
|
|
22
23
|
import { AXSelectBoxComponent } from '@acorex/components/select-box';
|
|
24
|
+
import { AXContextMenuOpeningEvent, AXContextMenuItemsClickEvent } from '@acorex/components/menu';
|
|
25
|
+
import { AXSchedulerComponent, AXSchedulerView, AXSchedulerResource, AXSchedulerAppointment, AXSchedulerDateRange } from '@acorex/components/scheduler';
|
|
26
|
+
import * as _acorex_platform_layout_components from '@acorex/platform/layout/components';
|
|
23
27
|
|
|
24
28
|
declare class AXPActivityLogComponent {
|
|
25
29
|
private readonly translateService;
|
|
@@ -250,7 +254,8 @@ interface AXPCategoryTreeDataSource {
|
|
|
250
254
|
}
|
|
251
255
|
|
|
252
256
|
declare class AXPCategoryTreeComponent {
|
|
253
|
-
|
|
257
|
+
/** i18n key for the synthetic root row; resolved in the template with the translate pipe. */
|
|
258
|
+
protected readonly categoryTreeRootTitleI18nKey = "@general:terms.interface.selection.all-items";
|
|
254
259
|
dataSource: _angular_core.InputSignal<AXPCategoryTreeDataSource>;
|
|
255
260
|
config: _angular_core.InputSignal<AXPCategoryTreeConfig>;
|
|
256
261
|
actions: _angular_core.InputSignal<AXPCategoryTreeActions>;
|
|
@@ -584,23 +589,6 @@ interface AXPPageComponentProvider {
|
|
|
584
589
|
components(): Promise<AXPPageComponentDefinition[]>;
|
|
585
590
|
}
|
|
586
591
|
|
|
587
|
-
/**
|
|
588
|
-
* Injection token for page component providers
|
|
589
|
-
* Use with multi: true to register multiple providers
|
|
590
|
-
*
|
|
591
|
-
* @example
|
|
592
|
-
* ```typescript
|
|
593
|
-
* providers: [
|
|
594
|
-
* {
|
|
595
|
-
* provide: AXP_PAGE_COMPONENT_PROVIDER,
|
|
596
|
-
* useClass: MyPageComponentProvider,
|
|
597
|
-
* multi: true,
|
|
598
|
-
* }
|
|
599
|
-
* ]
|
|
600
|
-
* ```
|
|
601
|
-
*/
|
|
602
|
-
declare const AXP_PAGE_COMPONENT_PROVIDER: InjectionToken<AXPPageComponentProvider[]>;
|
|
603
|
-
|
|
604
592
|
/**
|
|
605
593
|
* Service for managing page components from multiple providers
|
|
606
594
|
* Similar to AXPDataSourceDefinitionProviderService pattern
|
|
@@ -656,6 +644,23 @@ declare class AXPPageComponentRegistryService {
|
|
|
656
644
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPPageComponentRegistryService>;
|
|
657
645
|
}
|
|
658
646
|
|
|
647
|
+
/**
|
|
648
|
+
* Injection token for page component providers
|
|
649
|
+
* Use with multi: true to register multiple providers
|
|
650
|
+
*
|
|
651
|
+
* @example
|
|
652
|
+
* ```typescript
|
|
653
|
+
* providers: [
|
|
654
|
+
* {
|
|
655
|
+
* provide: AXP_PAGE_COMPONENT_PROVIDER,
|
|
656
|
+
* useClass: MyPageComponentProvider,
|
|
657
|
+
* multi: true,
|
|
658
|
+
* }
|
|
659
|
+
* ]
|
|
660
|
+
* ```
|
|
661
|
+
*/
|
|
662
|
+
declare const AXP_PAGE_COMPONENT_PROVIDER: InjectionToken<AXPPageComponentProvider[]>;
|
|
663
|
+
|
|
659
664
|
interface AXPDragDropListItem {
|
|
660
665
|
id: string;
|
|
661
666
|
content: string;
|
|
@@ -691,12 +696,202 @@ declare class AXPDragDropListComponent {
|
|
|
691
696
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPDragDropListComponent, "axp-drag-drop-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "listId": { "alias": "listId"; "required": false; "isSignal": true; }; "dropListGroup": { "alias": "dropListGroup"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "disable": { "alias": "disable"; "required": false; "isSignal": true; }; }, { "items": "itemsChange"; "itemClick": "itemClick"; "dropListDropped": "dropListDropped"; }, never, never, true, never>;
|
|
692
697
|
}
|
|
693
698
|
|
|
699
|
+
/**
|
|
700
|
+
* Shared types for expression builders (expression-builder, sort-builder, group-builder, etc.)
|
|
701
|
+
*/
|
|
702
|
+
/** Unique identifier for expression nodes */
|
|
703
|
+
type AXPExpressionNodeId = string;
|
|
704
|
+
/** Logical operator type (AND, OR, etc.) */
|
|
705
|
+
type AXPExpressionLogicType = 'and' | 'or' | 'not';
|
|
706
|
+
/** Operation type (add, multiply, equal, etc.) */
|
|
707
|
+
type AXPExpressionOperationType = string;
|
|
708
|
+
/** Value source type (literal, field, parameter, etc.) */
|
|
709
|
+
type AXPExpressionValueSourceType = 'literal' | 'field' | 'parameter';
|
|
710
|
+
/** Field definition for value selectors */
|
|
711
|
+
interface AXPExpressionFieldDefinition {
|
|
712
|
+
id: string;
|
|
713
|
+
title: string;
|
|
714
|
+
dataType?: string;
|
|
715
|
+
path?: string;
|
|
716
|
+
/** Optional: for nested/related fields */
|
|
717
|
+
children?: AXPExpressionFieldDefinition[];
|
|
718
|
+
}
|
|
719
|
+
/** Value operand in an expression */
|
|
720
|
+
interface AXPExpressionValueOperand {
|
|
721
|
+
sourceType: AXPExpressionValueSourceType;
|
|
722
|
+
/** For field: field id; for literal: the value; for parameter: param key */
|
|
723
|
+
value?: unknown;
|
|
724
|
+
fieldId?: string;
|
|
725
|
+
}
|
|
726
|
+
/** Single operation node (leftOperand operator rightOperand) */
|
|
727
|
+
interface AXPExpressionOperationNode {
|
|
728
|
+
id: AXPExpressionNodeId;
|
|
729
|
+
type: 'operation';
|
|
730
|
+
operator: AXPExpressionOperationType;
|
|
731
|
+
leftOperand: AXPExpressionValueOperand;
|
|
732
|
+
rightOperand: AXPExpressionValueOperand;
|
|
733
|
+
order?: number;
|
|
734
|
+
}
|
|
735
|
+
/** Group of operations with logical connective */
|
|
736
|
+
interface AXPExpressionGroupNode {
|
|
737
|
+
id: AXPExpressionNodeId;
|
|
738
|
+
type: 'group';
|
|
739
|
+
logic: AXPExpressionLogicType;
|
|
740
|
+
children: AXPExpressionNode[];
|
|
741
|
+
order?: number;
|
|
742
|
+
}
|
|
743
|
+
/** Union of expression node types */
|
|
744
|
+
type AXPExpressionNode = AXPExpressionOperationNode | AXPExpressionGroupNode;
|
|
745
|
+
/** Root expression tree */
|
|
746
|
+
interface AXPExpressionTree {
|
|
747
|
+
id: AXPExpressionNodeId;
|
|
748
|
+
logic: AXPExpressionLogicType;
|
|
749
|
+
children: AXPExpressionNode[];
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
/**
|
|
753
|
+
* Field definitions for expression builders.
|
|
754
|
+
* Used by expression-builder, sort-builder, group-builder for value/field selection.
|
|
755
|
+
*/
|
|
756
|
+
|
|
757
|
+
/** Registry of available field definitions per context */
|
|
758
|
+
declare const AXPExpressionFieldDefinitions: Record<string, AXPExpressionFieldDefinition[]>;
|
|
759
|
+
/** Add field definitions for a given context */
|
|
760
|
+
declare function registerFieldDefinitions(context: string, fields: AXPExpressionFieldDefinition[]): void;
|
|
761
|
+
/** Get field definitions for a context */
|
|
762
|
+
declare function getFieldDefinitions(context: string): AXPExpressionFieldDefinition[];
|
|
763
|
+
|
|
764
|
+
/**
|
|
765
|
+
* Logic operator definitions (AND, OR, NOT) for expression groups.
|
|
766
|
+
*/
|
|
767
|
+
|
|
768
|
+
interface AXPExpressionLogicDefinition {
|
|
769
|
+
value: AXPExpressionLogicType;
|
|
770
|
+
text: string;
|
|
771
|
+
/** Optional icon/key for UI */
|
|
772
|
+
icon?: string;
|
|
773
|
+
}
|
|
774
|
+
declare const AXP_EXPRESSION_LOGIC_DEFINITIONS: AXPExpressionLogicDefinition[];
|
|
775
|
+
declare function getLogicDefinition(logic: AXPExpressionLogicType): AXPExpressionLogicDefinition | undefined;
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* Operation definitions (arithmetic, comparison, logical) for expression builder.
|
|
779
|
+
*/
|
|
780
|
+
|
|
781
|
+
interface AXPExpressionOperationDefinition {
|
|
782
|
+
value: AXPExpressionOperationType;
|
|
783
|
+
text: string;
|
|
784
|
+
/** Optional icon/symbol for UI */
|
|
785
|
+
symbol?: string;
|
|
786
|
+
/** Category for grouping in UI */
|
|
787
|
+
category?: 'arithmetic' | 'comparison' | 'logical' | 'string';
|
|
788
|
+
}
|
|
789
|
+
declare const AXP_EXPRESSION_OPERATION_DEFINITIONS: AXPExpressionOperationDefinition[];
|
|
790
|
+
declare function getOperationDefinition(operation: AXPExpressionOperationType): AXPExpressionOperationDefinition | undefined;
|
|
791
|
+
|
|
792
|
+
/**
|
|
793
|
+
* Selected field data emitted when condition changes
|
|
794
|
+
*/
|
|
795
|
+
type ConditionBuilderSelectedField = {
|
|
796
|
+
id: string;
|
|
797
|
+
field: string;
|
|
798
|
+
operator: AXDataSourceOperator['type'];
|
|
799
|
+
value: unknown;
|
|
800
|
+
isParametric?: boolean;
|
|
801
|
+
};
|
|
802
|
+
declare class AXPConditionBuilderConditionComponent implements OnInit {
|
|
803
|
+
item: _angular_core.InputSignal<AXPFilterClause>;
|
|
804
|
+
filterDefinitions: _angular_core.InputSignal<AXPFilterDefinition[]>;
|
|
805
|
+
onResolveWidget: _angular_core.InputSignal<((fieldId: string) => string) | undefined>;
|
|
806
|
+
showFillByUser: _angular_core.InputSignal<boolean>;
|
|
807
|
+
itemChange: _angular_core.OutputEmitterRef<ConditionBuilderSelectedField>;
|
|
808
|
+
removeItem: _angular_core.OutputEmitterRef<string>;
|
|
809
|
+
protected selectedField: _angular_core.WritableSignal<ConditionBuilderSelectedField | null>;
|
|
810
|
+
protected filterNode: _angular_core.WritableSignal<AXPWidgetNode>;
|
|
811
|
+
protected context: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
812
|
+
protected readonly availableFields: _angular_core.Signal<{
|
|
813
|
+
value: string | undefined;
|
|
814
|
+
text: string;
|
|
815
|
+
definition: AXPFilterDefinition;
|
|
816
|
+
}[]>;
|
|
817
|
+
protected readonly currentFilterDefinition: _angular_core.Signal<AXPFilterDefinition | undefined>;
|
|
818
|
+
protected readonly selectedFieldValue: _angular_core.Signal<string>;
|
|
819
|
+
ngOnInit(): void;
|
|
820
|
+
constructor();
|
|
821
|
+
private updateFilterWidgetNode;
|
|
822
|
+
private updateContext;
|
|
823
|
+
onFieldChange(event: AXValueChangedEvent): void;
|
|
824
|
+
onContextChange(event: {
|
|
825
|
+
data?: {
|
|
826
|
+
filter?: {
|
|
827
|
+
value?: unknown;
|
|
828
|
+
operation?: {
|
|
829
|
+
type?: string;
|
|
830
|
+
};
|
|
831
|
+
};
|
|
832
|
+
};
|
|
833
|
+
}): void;
|
|
834
|
+
onFillByUserChange(checked: boolean): void;
|
|
835
|
+
onRemoveClick(): void;
|
|
836
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPConditionBuilderConditionComponent, never>;
|
|
837
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPConditionBuilderConditionComponent, "axp-condition-builder-condition", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "filterDefinitions": { "alias": "filterDefinitions"; "required": false; "isSignal": true; }; "onResolveWidget": { "alias": "onResolveWidget"; "required": false; "isSignal": true; }; "showFillByUser": { "alias": "showFillByUser"; "required": false; "isSignal": true; }; }, { "itemChange": "itemChange"; "removeItem": "removeItem"; }, never, never, true, never>;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* Generic condition builder component.
|
|
842
|
+
* Builds AXPFilterClause (logic/filters, field/operator/value) for use in outcome rules,
|
|
843
|
+
* outcome actions, query builders, etc.
|
|
844
|
+
*
|
|
845
|
+
* Same structure as axp-where-builder: groups, AND/OR logic, add condition/group, drag-drop, move/remove.
|
|
846
|
+
*/
|
|
847
|
+
declare class AXPConditionBuilderComponent {
|
|
848
|
+
private readonly widgetRegistry;
|
|
849
|
+
private readonly elementRef;
|
|
850
|
+
private readonly destroyRef;
|
|
851
|
+
private readonly platformId;
|
|
852
|
+
private readonly isBrowser;
|
|
853
|
+
value: _angular_core.InputSignal<AXPFilterClause>;
|
|
854
|
+
filterDefinitions: _angular_core.InputSignal<AXPFilterDefinition[]>;
|
|
855
|
+
/** When true, show "Fill by user" checkbox on each condition (e.g. for query parameters) */
|
|
856
|
+
showFillByUser: _angular_core.InputSignal<boolean>;
|
|
857
|
+
valueChange: _angular_core.OutputEmitterRef<AXPFilterClause>;
|
|
858
|
+
protected queryData: _angular_core.WritableSignal<AXPFilterClause>;
|
|
859
|
+
protected readonly logicalOperatorsItems: {
|
|
860
|
+
value: AXFilterLogic;
|
|
861
|
+
text: string;
|
|
862
|
+
}[];
|
|
863
|
+
protected getLogicDisplayText(logic: AXFilterLogic | undefined): string;
|
|
864
|
+
private connectorLayoutRafId;
|
|
865
|
+
private connectorResizeObserver;
|
|
866
|
+
private initConnectorAutoLayout;
|
|
867
|
+
private scheduleConnectorLayoutUpdate;
|
|
868
|
+
private updateConnectorCssVars;
|
|
869
|
+
constructor();
|
|
870
|
+
private generateId;
|
|
871
|
+
private updateValue;
|
|
872
|
+
private normalizeOrder;
|
|
873
|
+
protected getSortedFilters(filters: AXPFilterClause[]): AXPFilterClause[];
|
|
874
|
+
private findGroupById;
|
|
875
|
+
protected getFilterDefinition(fieldId: string): AXPFilterDefinition | undefined;
|
|
876
|
+
resolveDefaultFilterWidget(fieldId: string): string;
|
|
877
|
+
addConditionToGroup(groupId: string): void;
|
|
878
|
+
addGroupToGroup(parentGroupId: string): void;
|
|
879
|
+
removeItem(id: string): void;
|
|
880
|
+
updateCondition(condition: ConditionBuilderSelectedField): void;
|
|
881
|
+
updateGroupLogicalOperator(groupId: string, operator: AXFilterLogic): void;
|
|
882
|
+
reorderGroupItemsEvent(groupId: string, event: AXDropListDroppedEvent): void;
|
|
883
|
+
reorderGroupItems(groupId: string, previousIndex: number, currentIndex: number): void;
|
|
884
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPConditionBuilderComponent, never>;
|
|
885
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPConditionBuilderComponent, "axp-condition-builder", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "filterDefinitions": { "alias": "filterDefinitions"; "required": false; "isSignal": true; }; "showFillByUser": { "alias": "showFillByUser"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
886
|
+
}
|
|
887
|
+
|
|
694
888
|
declare class AXPQueryFiltersComponent {
|
|
695
889
|
#private;
|
|
696
890
|
protected translate: AXTranslationService;
|
|
697
891
|
protected calendarService: AXCalendarService;
|
|
698
892
|
private filterOperatorMiddleware;
|
|
699
893
|
private settingsService;
|
|
894
|
+
private readonly expressionEvaluator;
|
|
700
895
|
filtersDefinitions: _angular_core.InputSignal<AXPFilterDefinition[]>;
|
|
701
896
|
initialFilters: _angular_core.InputSignal<AXPFilterQuery[]>;
|
|
702
897
|
onFiltersChanged: _angular_core.OutputEmitterRef<AXPFilterQuery[]>;
|
|
@@ -712,6 +907,11 @@ declare class AXPQueryFiltersComponent {
|
|
|
712
907
|
protected asyncTags: _angular_core.WritableSignal<any[]>;
|
|
713
908
|
protected popover: _angular_core.Signal<AXPopoverComponent | undefined>;
|
|
714
909
|
inputValue: _angular_core.WritableSignal<string>;
|
|
910
|
+
protected readonly disabledByField: _angular_core.WritableSignal<Record<string, boolean>>;
|
|
911
|
+
/** Emits when a filter context entry changes (aligned with `widget-renderer` `events.context`). */
|
|
912
|
+
private readonly filterContextPath$;
|
|
913
|
+
private filterContextPathSnapshotReady;
|
|
914
|
+
private previousFilterContextSnapshot;
|
|
715
915
|
inlineFilters: () => AXPFilterDefinition[];
|
|
716
916
|
protected getDisplayValue: (filter: AXPFilterDefinition, val: any) => Promise<any>;
|
|
717
917
|
protected convertIfISOStringDate: (val: string) => string;
|
|
@@ -721,7 +921,7 @@ declare class AXPQueryFiltersComponent {
|
|
|
721
921
|
ngOnInit(): void;
|
|
722
922
|
handleSelectField(field: AXPFilterDefinition): void;
|
|
723
923
|
handleFieldKeyDown(e: KeyboardEvent, field: AXPFilterDefinition): void;
|
|
724
|
-
onContextChanged(e:
|
|
924
|
+
onContextChanged(e: AXPContextChangeEvent): void;
|
|
725
925
|
handleApplyFilter(): void;
|
|
726
926
|
handleButtonKeyDown(e: Event): void;
|
|
727
927
|
handleKeyDown(e: AXHtmlEvent<KeyboardEvent>): void;
|
|
@@ -736,11 +936,67 @@ declare class AXPQueryFiltersComponent {
|
|
|
736
936
|
handlePopoverClosed(e: AXEvent): void;
|
|
737
937
|
protected onPopoverOpened(e: AXEvent): void;
|
|
738
938
|
protected deactivateAllListItems(): void;
|
|
939
|
+
protected isFilterDisabled(definition: AXPFilterDefinition): boolean;
|
|
940
|
+
private createExpressionScope;
|
|
941
|
+
private isObservableLike;
|
|
942
|
+
private buildFilterTriggerScope;
|
|
943
|
+
private getFilterEventScope;
|
|
944
|
+
private getFilterWidgetScopeForDefinition;
|
|
945
|
+
private removeFilterFieldByName;
|
|
739
946
|
protected handleKeyboardEvent(event: KeyboardEvent): Promise<void>;
|
|
740
947
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPQueryFiltersComponent, never>;
|
|
741
948
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPQueryFiltersComponent, "axp-query-filters", never, { "filtersDefinitions": { "alias": "filtersDefinitions"; "required": false; "isSignal": true; }; "initialFilters": { "alias": "initialFilters"; "required": false; "isSignal": true; }; }, { "onFiltersChanged": "onFiltersChanged"; }, never, never, true, never>;
|
|
742
949
|
}
|
|
743
950
|
|
|
951
|
+
interface AXPPreloadFiltersApplyEvent {
|
|
952
|
+
filterValues: Record<string, any>;
|
|
953
|
+
}
|
|
954
|
+
declare class AXPPreloadFiltersComponent {
|
|
955
|
+
/**
|
|
956
|
+
* Filter definitions to display
|
|
957
|
+
*/
|
|
958
|
+
filterDefinitions: _angular_core.InputSignal<AXPFilterDefinition[]>;
|
|
959
|
+
/**
|
|
960
|
+
* Whether to show the "Show All" button
|
|
961
|
+
*/
|
|
962
|
+
showAllButton: _angular_core.InputSignal<boolean>;
|
|
963
|
+
/**
|
|
964
|
+
* Emitted when user applies filters
|
|
965
|
+
*/
|
|
966
|
+
apply: _angular_core.OutputEmitterRef<AXPPreloadFiltersApplyEvent>;
|
|
967
|
+
/**
|
|
968
|
+
* Emitted when user clicks "Show All"
|
|
969
|
+
*/
|
|
970
|
+
showAll: _angular_core.OutputEmitterRef<void>;
|
|
971
|
+
/**
|
|
972
|
+
* Context for widgets container
|
|
973
|
+
*/
|
|
974
|
+
context: _angular_core.WritableSignal<any>;
|
|
975
|
+
/**
|
|
976
|
+
* On context changed
|
|
977
|
+
*/
|
|
978
|
+
onContextChanged(event: AXPContextChangeEvent): void;
|
|
979
|
+
/**
|
|
980
|
+
* Handle apply filters
|
|
981
|
+
*/
|
|
982
|
+
handleApply(form: AXFormComponent): Promise<void>;
|
|
983
|
+
/**
|
|
984
|
+
* Handle form keydown events
|
|
985
|
+
*/
|
|
986
|
+
onFormKeyDown(event: KeyboardEvent, form: AXFormComponent): void;
|
|
987
|
+
/**
|
|
988
|
+
* Handle show all (skip filters and go to list).
|
|
989
|
+
* Prevents implicit form submit when the control renders as a submit button inside ax-form.
|
|
990
|
+
*/
|
|
991
|
+
handleShowAll(event?: AXClickEvent): void;
|
|
992
|
+
/**
|
|
993
|
+
* Check if field is required
|
|
994
|
+
*/
|
|
995
|
+
isFieldRequired(filterDef: AXPFilterDefinition): boolean;
|
|
996
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPreloadFiltersComponent, never>;
|
|
997
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPreloadFiltersComponent, "axp-preload-filters", never, { "filterDefinitions": { "alias": "filterDefinitions"; "required": true; "isSignal": true; }; "showAllButton": { "alias": "showAllButton"; "required": false; "isSignal": true; }; }, { "apply": "apply"; "showAll": "showAll"; }, never, never, true, never>;
|
|
998
|
+
}
|
|
999
|
+
|
|
744
1000
|
declare class AXPImageEditorPopupComponent extends AXBasePageComponent {
|
|
745
1001
|
private readonly fileStorage;
|
|
746
1002
|
image: _angular_core.InputSignal<Blob>;
|
|
@@ -1154,8 +1410,20 @@ interface AXPPropertyViewerChangedEvent {
|
|
|
1154
1410
|
values: any;
|
|
1155
1411
|
mode: 'init' | 'update';
|
|
1156
1412
|
}
|
|
1413
|
+
/** Payload when the property viewer popup closes after Apply. */
|
|
1414
|
+
type AXPPropertyViewerResult = AXPPropertyViewerChangedEvent;
|
|
1415
|
+
/**
|
|
1416
|
+
* Dialog-style ref passed to property viewer `onAction` (same shape as the layout dialog `AXPDialogRef`).
|
|
1417
|
+
*/
|
|
1418
|
+
interface AXPPropertyViewerActionRef {
|
|
1419
|
+
close(): void;
|
|
1420
|
+
context(): any;
|
|
1421
|
+
action(): string | undefined;
|
|
1422
|
+
setLoading(loading: boolean): void;
|
|
1423
|
+
}
|
|
1157
1424
|
|
|
1158
1425
|
declare class AXPPropertyViewerComponent {
|
|
1426
|
+
private readonly defaultMultiLanguageConfig;
|
|
1159
1427
|
/**
|
|
1160
1428
|
* List of tabs that should be rendered inside the property viewer.
|
|
1161
1429
|
*/
|
|
@@ -1164,6 +1432,11 @@ declare class AXPPropertyViewerComponent {
|
|
|
1164
1432
|
* Determines rendering mode.
|
|
1165
1433
|
*/
|
|
1166
1434
|
mode: _angular_core.InputSignal<"simple" | "advanced">;
|
|
1435
|
+
/**
|
|
1436
|
+
* When a property uses binding expressions, controls how the expression is edited:
|
|
1437
|
+
* `inline` — code editor in the panel (default); `popup` — button that opens the dialog editor.
|
|
1438
|
+
*/
|
|
1439
|
+
bindingExpressionEditorMode: _angular_core.InputSignal<"inline" | "popup">;
|
|
1167
1440
|
/**
|
|
1168
1441
|
* Emits when property context changes.
|
|
1169
1442
|
*/
|
|
@@ -1177,9 +1450,15 @@ declare class AXPPropertyViewerComponent {
|
|
|
1177
1450
|
* Updated when user toggles the ax-switch; otherwise derived from isExpression(valueAtPath).
|
|
1178
1451
|
*/
|
|
1179
1452
|
protected expressionModeState: WritableSignal<Record<string, boolean>>;
|
|
1453
|
+
/**
|
|
1454
|
+
* Evaluated visibility for properties whose {@link AXPWidgetProperty.visible} is a `{{ }}` expression.
|
|
1455
|
+
* Keys match {@link AXPPropertyViewerComponent.propertyVisibilityKey}.
|
|
1456
|
+
*/
|
|
1457
|
+
private propertyVisibility;
|
|
1180
1458
|
protected groupCollapsedStates: Map<string, boolean>;
|
|
1181
1459
|
private readonly expressionEvaluator;
|
|
1182
1460
|
private readonly popupService;
|
|
1461
|
+
private readonly form;
|
|
1183
1462
|
constructor();
|
|
1184
1463
|
/**
|
|
1185
1464
|
* Replaces the current context with the provided value and emits an init event.
|
|
@@ -1189,10 +1468,24 @@ declare class AXPPropertyViewerComponent {
|
|
|
1189
1468
|
* Merges the provided value into the current context and emits an update event.
|
|
1190
1469
|
*/
|
|
1191
1470
|
update(value: any): void;
|
|
1471
|
+
/**
|
|
1472
|
+
* Runs registered validation rules on fields inside this viewer (requires {@link AXFormModule} host).
|
|
1473
|
+
*/
|
|
1474
|
+
validate(): Promise<AXValidationSummary>;
|
|
1475
|
+
/**
|
|
1476
|
+
* Stable key for visibility map entries (avoids collisions when the same `name` appears twice).
|
|
1477
|
+
*/
|
|
1478
|
+
protected propertyVisibilityKey(prop: AXPWidgetProperty): string;
|
|
1479
|
+
/**
|
|
1480
|
+
* Whether a property row should render. Booleans are static; `{{ }}` strings are evaluated against
|
|
1481
|
+
* {@link context} with `context.eval(path)` like {@link AXPWidgetRendererDirective.updateVisibility}.
|
|
1482
|
+
*/
|
|
1483
|
+
protected isPropertyVisible(prop: AXPWidgetProperty): boolean;
|
|
1484
|
+
private recomputePropertyVisibility;
|
|
1192
1485
|
/**
|
|
1193
1486
|
* Handles context changes produced by rendered widgets.
|
|
1194
1487
|
*/
|
|
1195
|
-
protected handleContextChange(event:
|
|
1488
|
+
protected handleContextChange(event: AXPContextChangeEvent): void;
|
|
1196
1489
|
/**
|
|
1197
1490
|
* Handles tab selection changes.
|
|
1198
1491
|
*/
|
|
@@ -1207,7 +1500,8 @@ declare class AXPPropertyViewerComponent {
|
|
|
1207
1500
|
protected getExpressionPath(prop: AXPWidgetProperty): string;
|
|
1208
1501
|
/**
|
|
1209
1502
|
* True when the property is in "expression" mode: show only the expression editor button, not the widget.
|
|
1210
|
-
* Uses expressionModeState when set; otherwise derives from
|
|
1503
|
+
* Uses expressionModeState when set; otherwise derives from template `{{ }}` expressions and, when
|
|
1504
|
+
* {@link AXPWidgetProperty.binding} is enabled, bare scripts persisted without wrappers.
|
|
1211
1505
|
*/
|
|
1212
1506
|
protected isExpressionMode(prop: AXPWidgetProperty): boolean;
|
|
1213
1507
|
/**
|
|
@@ -1220,55 +1514,156 @@ declare class AXPPropertyViewerComponent {
|
|
|
1220
1514
|
* Updates the expression/value toggle state for a binding-enabled property.
|
|
1221
1515
|
* When switching to value: resets the value at path to a type-appropriate default so the
|
|
1222
1516
|
* widget renderer does not receive the expression string (e.g. checkbox gets false, not a string).
|
|
1223
|
-
* When switching to expression: sets the value at path to
|
|
1224
|
-
*
|
|
1517
|
+
* When switching to expression: sets the value at path to an empty string so the editor starts
|
|
1518
|
+
* blank instead of keeping the previous literal (e.g. true/false).
|
|
1225
1519
|
*/
|
|
1226
1520
|
protected setExpressionMode(prop: AXPWidgetProperty, useExpression: boolean): void;
|
|
1521
|
+
/**
|
|
1522
|
+
* Current binding expression string at the property path (for inline editor ngModel).
|
|
1523
|
+
*/
|
|
1524
|
+
protected getBindingExpressionValue(prop: AXPWidgetProperty): string;
|
|
1525
|
+
/**
|
|
1526
|
+
* Persists inline code editor changes into context.
|
|
1527
|
+
*/
|
|
1528
|
+
protected setBindingExpressionValue(prop: AXPWidgetProperty, value: string): void;
|
|
1227
1529
|
/**
|
|
1228
1530
|
* Opens the binding/expression code editor for a property with binding.enabled.
|
|
1229
1531
|
* Ensures the value passed to the popup is always a string to avoid code-editor crashes.
|
|
1230
1532
|
*/
|
|
1231
1533
|
protected openBindingEditor(prop: AXPWidgetProperty): Promise<void>;
|
|
1232
1534
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerComponent, never>;
|
|
1233
|
-
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>;
|
|
1535
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPPropertyViewerComponent, "axp-property-viewer", never, { "tabsInput": { "alias": "tabsInput"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "bindingExpressionEditorMode": { "alias": "bindingExpressionEditorMode"; "required": false; "isSignal": true; }; }, { "onChanged": "onChanged"; }, never, never, true, never>;
|
|
1234
1536
|
}
|
|
1235
1537
|
|
|
1538
|
+
/**
|
|
1539
|
+
* Whether a binding-enabled property should show expression UI (toggle to code + open editor)
|
|
1540
|
+
* instead of the literal widget.
|
|
1541
|
+
*
|
|
1542
|
+
* - Values already wrapped in `{{ ... }}` are expressions (see `AXPExpressionEvaluatorService.isExpression`).
|
|
1543
|
+
* - Persisted domain data often stores **bare** scripts; for `dataType: 'boolean'` (typical toggle + binding),
|
|
1544
|
+
* any non-empty string that is not a boolean literal is treated as an expression.
|
|
1545
|
+
* - For `number`, strings that are not plain numeric literals are treated as expressions.
|
|
1546
|
+
* - For other types, `isLikelyBareBindingScript` reduces false positives for plain text.
|
|
1547
|
+
*/
|
|
1548
|
+
declare function isPropertyBindingExpressionFormValue(property: AXPWidgetProperty, value: unknown, isTemplateExpression: (s: string) => boolean): boolean;
|
|
1549
|
+
|
|
1236
1550
|
declare class AXPPropertyViewerPopupComponent extends AXBasePageComponent {
|
|
1551
|
+
private readonly toastService;
|
|
1552
|
+
private readonly translationService;
|
|
1237
1553
|
tabs: _angular_core.InputSignal<AXPPropertyViewerTab[]>;
|
|
1238
1554
|
mode: _angular_core.InputSignal<"simple" | "advanced">;
|
|
1239
1555
|
context: _angular_core.InputSignal<any>;
|
|
1556
|
+
/**
|
|
1557
|
+
* Optional hook from `data.onApply`. Throw or reject to keep the popup open.
|
|
1558
|
+
* Return a value (not `undefined`) to use as the `close()` payload; otherwise `{ values, mode }` is used.
|
|
1559
|
+
*/
|
|
1560
|
+
onApply?: (result: AXPPropertyViewerResult) => void | Promise<unknown>;
|
|
1240
1561
|
protected readonly propertyViewer: _angular_core.Signal<AXPPropertyViewerComponent | undefined>;
|
|
1241
|
-
protected readonly currentValues: _angular_core.WritableSignal<
|
|
1562
|
+
protected readonly currentValues: _angular_core.WritableSignal<Record<string, unknown>>;
|
|
1563
|
+
protected readonly isApplying: _angular_core.WritableSignal<boolean>;
|
|
1242
1564
|
protected currentMode: 'init' | 'update';
|
|
1243
1565
|
constructor();
|
|
1244
1566
|
protected handlePropertyChanged(event: AXPPropertyViewerChangedEvent): void;
|
|
1245
1567
|
protected handleCloseClick(): void;
|
|
1246
|
-
protected handleApplyClick(): void
|
|
1568
|
+
protected handleApplyClick(): Promise<void>;
|
|
1569
|
+
private showValidationErrorToast;
|
|
1247
1570
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerPopupComponent, never>;
|
|
1248
1571
|
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>;
|
|
1249
1572
|
}
|
|
1250
1573
|
|
|
1574
|
+
interface IAXPPropertyViewerRoot {
|
|
1575
|
+
dialog<T = unknown>(delegate: (container: IAXPPropertyViewerDialogBuilder<T>) => void): IAXPPropertyViewerDialogBuilder<T>;
|
|
1576
|
+
}
|
|
1577
|
+
interface IAXPPropertyViewerDialogBuilder<T = unknown> {
|
|
1578
|
+
setTitle(title: string): IAXPPropertyViewerDialogBuilder<T>;
|
|
1579
|
+
setSize(size: AXPopupSizeType): IAXPPropertyViewerDialogBuilder<T>;
|
|
1580
|
+
setCloseButton(closeButton: boolean): IAXPPropertyViewerDialogBuilder<T>;
|
|
1581
|
+
setContext(context: any): IAXPPropertyViewerDialogBuilder<T>;
|
|
1582
|
+
setTabs(tabs: AXPPropertyViewerTab[]): IAXPPropertyViewerDialogBuilder<T>;
|
|
1583
|
+
setMode(mode: 'simple' | 'advanced'): IAXPPropertyViewerDialogBuilder<T>;
|
|
1584
|
+
/**
|
|
1585
|
+
* Runs on Save. Throw or reject to keep the popup open (same idea as layout dialog `onAction`).
|
|
1586
|
+
* Return a value to resolve `show()`; omit return (or return void) to resolve with `{ values, mode }`.
|
|
1587
|
+
*/
|
|
1588
|
+
onAction(handler: (dialogRef: AXPPropertyViewerActionRef) => T | Promise<T> | void | Promise<void>): IAXPPropertyViewerDialogBuilder<T>;
|
|
1589
|
+
show(): Promise<T | AXPPropertyViewerResult | null>;
|
|
1590
|
+
}
|
|
1251
1591
|
interface AXPPropertyViewerConfig {
|
|
1252
1592
|
title: string;
|
|
1253
1593
|
tabs: AXPPropertyViewerTab[];
|
|
1254
1594
|
context?: any;
|
|
1255
1595
|
mode?: 'simple' | 'advanced';
|
|
1256
|
-
size?:
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1596
|
+
size?: AXPopupSizeType;
|
|
1597
|
+
/**
|
|
1598
|
+
* When set, runs before close on Save. Throw or reject to keep the popup open.
|
|
1599
|
+
*/
|
|
1600
|
+
onApply?: (result: AXPPropertyViewerResult) => void | Promise<void>;
|
|
1261
1601
|
}
|
|
1262
1602
|
declare class AXPPropertyViewerService {
|
|
1263
1603
|
private readonly popupService;
|
|
1604
|
+
private readonly defaultMultiLanguageConfig;
|
|
1605
|
+
/**
|
|
1606
|
+
* Same entry shape as `layoutBuilder.create()` — use `.dialog((d) => { ... }).show()`.
|
|
1607
|
+
*/
|
|
1608
|
+
create(): IAXPPropertyViewerRoot;
|
|
1264
1609
|
/**
|
|
1265
|
-
*
|
|
1610
|
+
* Opens the property viewer popup in one call (delegates to {@link #create} `.dialog().show()`).
|
|
1266
1611
|
*/
|
|
1267
1612
|
open(config: AXPPropertyViewerConfig): Promise<AXPPropertyViewerResult | null>;
|
|
1268
1613
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPPropertyViewerService, never>;
|
|
1269
1614
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPPropertyViewerService>;
|
|
1270
1615
|
}
|
|
1271
1616
|
|
|
1617
|
+
/**
|
|
1618
|
+
* Copies {@link AXPWidgetProperty.validations} onto `schema.interface.options` so the property
|
|
1619
|
+
* viewer binds a stable widget node.
|
|
1620
|
+
*/
|
|
1621
|
+
declare function withValidationsOnEditorNode(prop: AXPWidgetProperty): AXPWidgetProperty;
|
|
1622
|
+
declare function preparePropertyForViewer(prop: AXPWidgetProperty, applyDefaultMultiLanguage: boolean): AXPWidgetProperty;
|
|
1623
|
+
/**
|
|
1624
|
+
* Deep-clone-safe: mutates cloned tab trees only when caller passes a fresh clone.
|
|
1625
|
+
* Applies the same widget-property pipeline as {@link AXPPropertyViewerComponent}.
|
|
1626
|
+
*/
|
|
1627
|
+
declare function preparePropertyViewerTabs(tabs: AXPPropertyViewerTab[], applyDefaultMultiLanguage: boolean): AXPPropertyViewerTab[];
|
|
1628
|
+
/**
|
|
1629
|
+
* Builds a single "General" tab for {@link AXPPropertyViewerService} from {@link AXPWidgetProperty} rows
|
|
1630
|
+
* (schema shape is shared with widget metadata; the edited payload is arbitrary context, not an {@link AXPWidgetNode}).
|
|
1631
|
+
*/
|
|
1632
|
+
declare function buildPropertyViewerTabsFromProperties(properties: AXPWidgetProperty[]): AXPPropertyViewerTab[];
|
|
1633
|
+
/**
|
|
1634
|
+
* Initial {@link AXPPropertyViewerService#setContext} value: property default paths merged with the current saved values.
|
|
1635
|
+
*/
|
|
1636
|
+
declare function buildPropertyViewerInitialContextFromProperties(properties: AXPWidgetProperty[], existing: Record<string, unknown>): Record<string, unknown>;
|
|
1637
|
+
|
|
1638
|
+
/**
|
|
1639
|
+
* Presentational layout for indexed rows: optional drag-and-drop, remove controls,
|
|
1640
|
+
* empty state, and add action. Row body is provided via {@link rowTemplate}.
|
|
1641
|
+
*/
|
|
1642
|
+
declare class AXPRepeaterRowsLayoutComponent {
|
|
1643
|
+
count: _angular_core.InputSignal<number>;
|
|
1644
|
+
disabled: _angular_core.InputSignal<boolean>;
|
|
1645
|
+
hasControls: _angular_core.InputSignal<boolean>;
|
|
1646
|
+
allowReorder: _angular_core.InputSignal<boolean>;
|
|
1647
|
+
rowTemplate: _angular_core.InputSignal<TemplateRef<{
|
|
1648
|
+
index: number;
|
|
1649
|
+
}>>;
|
|
1650
|
+
/** i18n keys (e.g. `@general:...`) for labels; override per usage. */
|
|
1651
|
+
addItemLabelKey: _angular_core.InputSignal<string>;
|
|
1652
|
+
emptyTitleKey: _angular_core.InputSignal<string>;
|
|
1653
|
+
emptyDescriptionKey: _angular_core.InputSignal<string>;
|
|
1654
|
+
addFirstItemLabelKey: _angular_core.InputSignal<string>;
|
|
1655
|
+
addClick: _angular_core.OutputEmitterRef<void>;
|
|
1656
|
+
removeClick: _angular_core.OutputEmitterRef<number>;
|
|
1657
|
+
drop: _angular_core.OutputEmitterRef<AXDropListDroppedEvent>;
|
|
1658
|
+
protected readonly rowIndices: _angular_core.Signal<number[]>;
|
|
1659
|
+
protected readonly rowRowClass: _angular_core.Signal<string>;
|
|
1660
|
+
protected onDrop(e: AXDropListDroppedEvent): void;
|
|
1661
|
+
protected onAddClick(): void;
|
|
1662
|
+
protected onRemoveClick(index: number): void;
|
|
1663
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPRepeaterRowsLayoutComponent, never>;
|
|
1664
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPRepeaterRowsLayoutComponent, "axp-repeater-rows-layout", never, { "count": { "alias": "count"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "hasControls": { "alias": "hasControls"; "required": false; "isSignal": true; }; "allowReorder": { "alias": "allowReorder"; "required": false; "isSignal": true; }; "rowTemplate": { "alias": "rowTemplate"; "required": true; "isSignal": true; }; "addItemLabelKey": { "alias": "addItemLabelKey"; "required": false; "isSignal": true; }; "emptyTitleKey": { "alias": "emptyTitleKey"; "required": false; "isSignal": true; }; "emptyDescriptionKey": { "alias": "emptyDescriptionKey"; "required": false; "isSignal": true; }; "addFirstItemLabelKey": { "alias": "addFirstItemLabelKey"; "required": false; "isSignal": true; }; }, { "addClick": "addClick"; "removeClick": "removeClick"; "drop": "drop"; }, never, never, true, never>;
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1272
1667
|
declare class AXPQuerySortsComponent {
|
|
1273
1668
|
sortDefinitions: _angular_core.ModelSignal<AXPSortDefinition[]>;
|
|
1274
1669
|
sortQueries: _angular_core.WritableSignal<AXPSortQuery[]>;
|
|
@@ -1572,12 +1967,12 @@ declare class AXPSpreadsheetComponent {
|
|
|
1572
1967
|
* Handle cell value change from widget
|
|
1573
1968
|
* The widget sets the value at path like rows[index].column.path
|
|
1574
1969
|
*/
|
|
1575
|
-
protected handleCellValueChange(rowIndex: number, columnName: string, event:
|
|
1970
|
+
protected handleCellValueChange(rowIndex: number, columnName: string, event: AXPContextChangeEvent): void;
|
|
1576
1971
|
/**
|
|
1577
1972
|
* Handle spreadsheet context change from widgets-container
|
|
1578
1973
|
* This is called when any widget in the spreadsheet changes
|
|
1579
1974
|
*/
|
|
1580
|
-
protected handleSpreadsheetContextChange(event:
|
|
1975
|
+
protected handleSpreadsheetContextChange(event: AXPContextChangeEvent): void;
|
|
1581
1976
|
/**
|
|
1582
1977
|
* Handle blur event to stop editing (when user clicks away from cell)
|
|
1583
1978
|
*/
|
|
@@ -1775,7 +2170,7 @@ declare class AXPTemplateViewerComponent extends AXBasePageComponent {
|
|
|
1775
2170
|
protected readonly currentPage: _angular_core.Signal<AXPWidgetNode>;
|
|
1776
2171
|
protected ngOnInit(): Promise<void>;
|
|
1777
2172
|
private loadTemplate;
|
|
1778
|
-
protected handleContextChanged(e:
|
|
2173
|
+
protected handleContextChanged(e: AXPContextChangeEvent): void;
|
|
1779
2174
|
protected handleSubmit(form: AXFormComponent): Promise<void>;
|
|
1780
2175
|
protected handleCancel(): void;
|
|
1781
2176
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPTemplateViewerComponent, never>;
|
|
@@ -1800,6 +2195,37 @@ declare class AXPTemplateViewerService {
|
|
|
1800
2195
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPTemplateViewerService>;
|
|
1801
2196
|
}
|
|
1802
2197
|
|
|
2198
|
+
/**
|
|
2199
|
+
* Generic avatar renderer with image and initials fallback.
|
|
2200
|
+
*/
|
|
2201
|
+
declare class AXPAvatarComponent {
|
|
2202
|
+
/** Avatar size in pixels. */
|
|
2203
|
+
readonly size: _angular_core.InputSignal<number>;
|
|
2204
|
+
/** Optional image source for the avatar. */
|
|
2205
|
+
readonly src: _angular_core.InputSignal<string | undefined>;
|
|
2206
|
+
/** Display name used for title and initials fallback. */
|
|
2207
|
+
readonly fullName: _angular_core.InputSignal<string | undefined>;
|
|
2208
|
+
/** Optional override for fallback text shown when image is not available. */
|
|
2209
|
+
readonly fallbackText: _angular_core.InputSignal<string | undefined>;
|
|
2210
|
+
/** Forces placeholder mode and '?' fallback. */
|
|
2211
|
+
readonly placeholder: _angular_core.InputSignal<boolean>;
|
|
2212
|
+
protected readonly isAvatarLoaded: _angular_core.WritableSignal<boolean>;
|
|
2213
|
+
protected readonly normalizedName: _angular_core.Signal<string>;
|
|
2214
|
+
protected readonly resolvedSrc: _angular_core.Signal<string>;
|
|
2215
|
+
protected readonly hasAvatar: _angular_core.Signal<boolean>;
|
|
2216
|
+
protected readonly isLoading: _angular_core.Signal<boolean>;
|
|
2217
|
+
protected readonly avatarText: _angular_core.Signal<string>;
|
|
2218
|
+
protected readonly avatarColor: _angular_core.Signal<string>;
|
|
2219
|
+
protected readonly title: _angular_core.Signal<string>;
|
|
2220
|
+
protected onImageError(event: AXHtmlEvent<ErrorEvent>): void;
|
|
2221
|
+
protected onImageLoad(event: AXHtmlEvent<Event>): void;
|
|
2222
|
+
private computeInitials;
|
|
2223
|
+
private hashString;
|
|
2224
|
+
private pickColor;
|
|
2225
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPAvatarComponent, never>;
|
|
2226
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPAvatarComponent, "axp-avatar", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; "fullName": { "alias": "fullName"; "required": false; "isSignal": true; }; "fallbackText": { "alias": "fallbackText"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2227
|
+
}
|
|
2228
|
+
|
|
1803
2229
|
type AXPUserAvatarSize = 'small' | 'medium' | 'large';
|
|
1804
2230
|
type AXPUserAvatarStatus = 'online' | 'offline';
|
|
1805
2231
|
type AXPUserAvatarData = {
|
|
@@ -1868,13 +2294,6 @@ declare class AXPUserAvatarComponent implements OnInit, OnDestroy {
|
|
|
1868
2294
|
lastName: _angular_core.Signal<string>;
|
|
1869
2295
|
title: _angular_core.Signal<string>;
|
|
1870
2296
|
isOnline: _angular_core.Signal<boolean>;
|
|
1871
|
-
avatarText: _angular_core.Signal<string>;
|
|
1872
|
-
avatarColor: _angular_core.Signal<string>;
|
|
1873
|
-
protected hasAvatar: _angular_core.Signal<boolean>;
|
|
1874
|
-
protected isAvatarLoaded: _angular_core.WritableSignal<boolean>;
|
|
1875
|
-
protected isLoading: _angular_core.Signal<boolean>;
|
|
1876
|
-
protected onImageError(event: AXHtmlEvent<ErrorEvent>): void;
|
|
1877
|
-
protected onImageLoad(event: AXHtmlEvent<Event>): void;
|
|
1878
2297
|
ngOnInit(): void;
|
|
1879
2298
|
ngOnDestroy(): void;
|
|
1880
2299
|
private loadUserData;
|
|
@@ -1883,12 +2302,6 @@ declare class AXPUserAvatarComponent implements OnInit, OnDestroy {
|
|
|
1883
2302
|
* This is a placeholder - implement based on your actual requirements
|
|
1884
2303
|
*/
|
|
1885
2304
|
private generateAvatarSrc;
|
|
1886
|
-
/**
|
|
1887
|
-
* Get initials from first and last name
|
|
1888
|
-
*/
|
|
1889
|
-
private getInitials;
|
|
1890
|
-
private hashString;
|
|
1891
|
-
private pickColor;
|
|
1892
2305
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPUserAvatarComponent, never>;
|
|
1893
2306
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPUserAvatarComponent, "axp-user-avatar", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "userId": { "alias": "userId"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
1894
2307
|
}
|
|
@@ -1909,99 +2322,91 @@ declare class AXPQueryViewsComponent {
|
|
|
1909
2322
|
}
|
|
1910
2323
|
|
|
1911
2324
|
/**
|
|
1912
|
-
*
|
|
1913
|
-
*
|
|
2325
|
+
* One selectable entry for {@link AXPItemConfiguratorComponent}.
|
|
2326
|
+
* Parents map external data into this shape. {@link propertyDefinitions} drive {@link AXPPropertyViewerService} tabs.
|
|
1914
2327
|
*/
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
2328
|
+
interface ItemConfiguratorListItem {
|
|
2329
|
+
id: string;
|
|
2330
|
+
/** Shown in the list and in the configure dialog title; plain string, i18n key, or locale map. */
|
|
2331
|
+
title: AXPMultiLanguageString;
|
|
2332
|
+
icon?: string;
|
|
2333
|
+
description?: AXPMultiLanguageString;
|
|
2334
|
+
propertyDefinitions?: AXPWidgetProperty[];
|
|
2335
|
+
}
|
|
2336
|
+
interface ItemConfiguratorSelectRow {
|
|
2337
|
+
value: string;
|
|
2338
|
+
text: string;
|
|
2339
|
+
icon?: string;
|
|
2340
|
+
description?: string;
|
|
2341
|
+
}
|
|
2342
|
+
/**
|
|
2343
|
+
* Select an item from a list and edit its settings via {@link AXPPropertyViewerService}.
|
|
2344
|
+
* Bound state: {@link selectedItemId} and {@link values} (context returned from the viewer). Not tied to {@link AXPWidgetNode}.
|
|
2345
|
+
*/
|
|
2346
|
+
declare class AXPItemConfiguratorComponent {
|
|
2347
|
+
private readonly mlResolver;
|
|
2348
|
+
/** Selected list entry id ({@link ItemConfiguratorListItem.id}). */
|
|
2349
|
+
selectedItemId: _angular_core.ModelSignal<string>;
|
|
2350
|
+
/** Values edited in the property viewer (merged from dialog result). */
|
|
2351
|
+
values: _angular_core.ModelSignal<Record<string, unknown>>;
|
|
1923
2352
|
label: _angular_core.InputSignal<string>;
|
|
1924
|
-
/**
|
|
1925
|
-
* Field name (technical identifier, used for form field path)
|
|
1926
|
-
*/
|
|
1927
|
-
fieldName: _angular_core.InputSignal<string>;
|
|
1928
|
-
/**
|
|
1929
|
-
* Field title (display name, used in UI labels and titles)
|
|
1930
|
-
*/
|
|
1931
|
-
fieldTitle: _angular_core.InputSignal<string>;
|
|
1932
|
-
/**
|
|
1933
|
-
* Readonly mode
|
|
1934
|
-
*/
|
|
1935
2353
|
readonly: _angular_core.InputSignal<boolean>;
|
|
1936
|
-
|
|
1937
|
-
|
|
2354
|
+
items: _angular_core.InputSignal<ItemConfiguratorListItem[]>;
|
|
2355
|
+
headerActions: _angular_core.InputSignal<AXPActionMenuItem[]>;
|
|
2356
|
+
private readonly propertyViewerService;
|
|
1938
2357
|
private readonly translationService;
|
|
1939
|
-
private readonly
|
|
1940
|
-
|
|
1941
|
-
* Currently selected widget type
|
|
1942
|
-
*/
|
|
1943
|
-
protected selectedWidgetType: _angular_core.WritableSignal<string>;
|
|
1944
|
-
/**
|
|
1945
|
-
* Whether the component is in edit mode (showing select box)
|
|
1946
|
-
*/
|
|
2358
|
+
private readonly workflow;
|
|
2359
|
+
private readonly commandExecutor;
|
|
1947
2360
|
protected isEditMode: _angular_core.WritableSignal<boolean>;
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
protected
|
|
1952
|
-
value: string;
|
|
1953
|
-
text: string;
|
|
1954
|
-
icon: string | undefined;
|
|
1955
|
-
description: string | undefined;
|
|
1956
|
-
}[]>;
|
|
1957
|
-
/**
|
|
1958
|
-
* Current widget configuration details
|
|
1959
|
-
*/
|
|
1960
|
-
protected currentWidgetConfig: _angular_core.Signal<{
|
|
2361
|
+
protected availableItems: _angular_core.Signal<ItemConfiguratorSelectRow[]>;
|
|
2362
|
+
protected selectedListItem: _angular_core.Signal<ItemConfiguratorListItem | null>;
|
|
2363
|
+
protected resolvedPropertyDefinitions: _angular_core.Signal<AXPWidgetProperty[]>;
|
|
2364
|
+
protected currentItemConfig: _angular_core.Signal<{
|
|
1961
2365
|
title: string;
|
|
1962
|
-
description:
|
|
2366
|
+
description: AXPMultiLanguageString | undefined;
|
|
1963
2367
|
icon: string | undefined;
|
|
1964
|
-
hasProperties: boolean
|
|
2368
|
+
hasProperties: boolean;
|
|
1965
2369
|
} | null>;
|
|
1966
|
-
/**
|
|
1967
|
-
* Whether configure button should be enabled
|
|
1968
|
-
*/
|
|
1969
2370
|
protected canConfigure: _angular_core.Signal<boolean>;
|
|
1970
|
-
/**
|
|
1971
|
-
* Whether widget has been configured (has options)
|
|
1972
|
-
*/
|
|
1973
2371
|
protected isConfigured: _angular_core.Signal<boolean>;
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
*/
|
|
1977
|
-
protected canPreview: _angular_core.Signal<boolean>;
|
|
1978
|
-
/**
|
|
1979
|
-
* Reference to the widget type select box (used to open dropdown when entering edit mode)
|
|
1980
|
-
*/
|
|
1981
|
-
protected widgetSelectBox: _angular_core.Signal<AXSelectBoxComponent | undefined>;
|
|
1982
|
-
/**
|
|
1983
|
-
* Enter edit mode (show select box)
|
|
1984
|
-
*/
|
|
2372
|
+
protected visibleHeaderActions: _angular_core.Signal<AXPActionMenuItem[]>;
|
|
2373
|
+
protected itemSelectBox: _angular_core.Signal<AXSelectBoxComponent | undefined>;
|
|
1985
2374
|
protected enterEditMode(): void;
|
|
1986
|
-
/**
|
|
1987
|
-
* Exit edit mode when dropdown is closed (return to view mode)
|
|
1988
|
-
*/
|
|
1989
2375
|
protected exitEditMode(): void;
|
|
1990
2376
|
constructor();
|
|
2377
|
+
protected onSelectionChange(event: {
|
|
2378
|
+
value?: string | null;
|
|
2379
|
+
}): Promise<void>;
|
|
2380
|
+
protected openConfigureDialog(): Promise<void>;
|
|
2381
|
+
protected onHeaderActionClick(action: AXPActionMenuItem): void;
|
|
2382
|
+
protected isHeaderActionDisabled(action: AXPActionMenuItem): boolean;
|
|
2383
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPItemConfiguratorComponent, never>;
|
|
2384
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPItemConfiguratorComponent, "axp-item-configurator", never, { "selectedItemId": { "alias": "selectedItemId"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "headerActions": { "alias": "headerActions"; "required": false; "isSignal": true; }; }, { "selectedItemId": "selectedItemIdChange"; "values": "valuesChange"; }, never, never, true, never>;
|
|
2385
|
+
}
|
|
2386
|
+
|
|
2387
|
+
/**
|
|
2388
|
+
* Widget field configurator for entity forms: composes {@link AXPItemConfiguratorComponent} with
|
|
2389
|
+
* {@link AXPWidgetRegistryService} list items and widget preview.
|
|
2390
|
+
*/
|
|
2391
|
+
declare class AXPWidgetFieldConfiguratorComponent {
|
|
2392
|
+
widget: _angular_core.ModelSignal<AXPWidgetNode>;
|
|
2393
|
+
label: _angular_core.InputSignal<string>;
|
|
2394
|
+
fieldName: _angular_core.InputSignal<string>;
|
|
2395
|
+
fieldTitle: _angular_core.InputSignal<AXPMultiLanguageString>;
|
|
2396
|
+
readonly: _angular_core.InputSignal<boolean>;
|
|
2397
|
+
private readonly widgetRegistry;
|
|
2398
|
+
private readonly translation;
|
|
2399
|
+
protected selectedItemIdModel: _angular_core.ModelSignal<string>;
|
|
2400
|
+
protected valuesModel: _angular_core.ModelSignal<Record<string, unknown>>;
|
|
1991
2401
|
/**
|
|
1992
|
-
*
|
|
1993
|
-
|
|
1994
|
-
protected onWidgetTypeChange(event: any): Promise<void>;
|
|
1995
|
-
/**
|
|
1996
|
-
* Open widget property viewer
|
|
1997
|
-
*/
|
|
1998
|
-
protected openPropertyViewer(): Promise<void>;
|
|
1999
|
-
/**
|
|
2000
|
-
* Open widget preview with actual rendered widget
|
|
2402
|
+
* List entries from {@link AXPWidgetRegistryService} (form editors), with
|
|
2403
|
+
* {@link ItemConfiguratorListItem.propertyDefinitions} from each registered config.
|
|
2001
2404
|
*/
|
|
2002
|
-
protected
|
|
2405
|
+
protected configuratorItems: _angular_core.Signal<ItemConfiguratorListItem[]>;
|
|
2406
|
+
protected previewHeaderActions: _angular_core.Signal<AXPActionMenuItem[]>;
|
|
2407
|
+
constructor();
|
|
2003
2408
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPWidgetFieldConfiguratorComponent, never>;
|
|
2004
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPWidgetFieldConfiguratorComponent, "axp-widget-field-configurator", never, { "widget": { "alias": "widget"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "fieldName": { "alias": "fieldName"; "required": false; "isSignal": true; }; "fieldTitle": { "alias": "fieldTitle"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "widget": "widgetChange"; }, never, never, true, never>;
|
|
2409
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPWidgetFieldConfiguratorComponent, "axp-widget-field-configurator", never, { "widget": { "alias": "widget"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "fieldName": { "alias": "fieldName"; "required": false; "isSignal": true; }; "fieldTitle": { "alias": "fieldTitle"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "selectedItemIdModel": { "alias": "selectedItemIdModel"; "required": false; "isSignal": true; }; "valuesModel": { "alias": "valuesModel"; "required": false; "isSignal": true; }; }, { "widget": "widgetChange"; "selectedItemIdModel": "selectedItemIdModelChange"; "valuesModel": "valuesModelChange"; }, never, never, true, never>;
|
|
2005
2410
|
}
|
|
2006
2411
|
|
|
2007
2412
|
/**
|
|
@@ -2009,9 +2414,9 @@ declare class AXPWidgetFieldConfiguratorComponent {
|
|
|
2009
2414
|
*/
|
|
2010
2415
|
interface AXPWidgetItemData {
|
|
2011
2416
|
/** Display title of the widget */
|
|
2012
|
-
title:
|
|
2417
|
+
title: AXPMultiLanguageString;
|
|
2013
2418
|
/** Description text for the widget */
|
|
2014
|
-
description?:
|
|
2419
|
+
description?: AXPMultiLanguageString;
|
|
2015
2420
|
/** Icon class (e.g., FontAwesome classes) */
|
|
2016
2421
|
icon?: string;
|
|
2017
2422
|
/** Whether the widget is pinned/favorited */
|
|
@@ -2036,6 +2441,10 @@ interface AXPWidgetItemClickEvent<T = unknown> {
|
|
|
2036
2441
|
* Can be used across different modules for consistent widget display and interaction.
|
|
2037
2442
|
*/
|
|
2038
2443
|
declare class AXPWidgetItemComponent {
|
|
2444
|
+
protected readonly i18n: {
|
|
2445
|
+
readonly pin: "@general:widgets.widget-item.pin";
|
|
2446
|
+
readonly unpin: "@general:widgets.widget-item.unpin";
|
|
2447
|
+
};
|
|
2039
2448
|
/** The widget data to display */
|
|
2040
2449
|
widget: _angular_core.InputSignal<AXPWidgetItemData>;
|
|
2041
2450
|
/** Whether this widget is currently selected */
|
|
@@ -2121,6 +2530,7 @@ interface AXPWidgetPropertyViewerConfig {
|
|
|
2121
2530
|
title: string;
|
|
2122
2531
|
widget: AXPWidgetNode;
|
|
2123
2532
|
mode?: 'simple' | 'advanced';
|
|
2533
|
+
onApply?: (result: AXPWidgetPropertyViewerResult) => void | Promise<void>;
|
|
2124
2534
|
/**
|
|
2125
2535
|
* Property names to exclude from the viewer.
|
|
2126
2536
|
*/
|
|
@@ -2151,22 +2561,367 @@ interface AXPWidgetPropertyViewerConfig {
|
|
|
2151
2561
|
};
|
|
2152
2562
|
};
|
|
2153
2563
|
}
|
|
2564
|
+
/** Emitted when the dialog applies; `values` is the updated viewer context (merge into {@link AXPWidgetNode} as needed). */
|
|
2154
2565
|
interface AXPWidgetPropertyViewerResult {
|
|
2155
2566
|
values: any;
|
|
2156
2567
|
mode: 'init' | 'update';
|
|
2157
2568
|
}
|
|
2569
|
+
interface IAXPWidgetPropertyViewerRoot {
|
|
2570
|
+
dialog(delegate: (container: IAXPWidgetPropertyViewerDialogBuilder) => void): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2571
|
+
}
|
|
2572
|
+
interface IAXPWidgetPropertyViewerDialogBuilder {
|
|
2573
|
+
setTitle(title: string): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2574
|
+
/**
|
|
2575
|
+
* Initial widget state shown in the viewer (type, options, name/path, …). Call before {@link show}.
|
|
2576
|
+
*/
|
|
2577
|
+
setWidget(widget: AXPWidgetNode): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2578
|
+
setMode(mode: 'simple' | 'advanced'): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2579
|
+
setExclude(exclude: string[]): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2580
|
+
setCustom(custom: AXPWidgetPropertyViewerConfig['custom']): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2581
|
+
/**
|
|
2582
|
+
* When set to a non-empty array, builds tabs from these properties and skips registry lookup for {@link setWidget}'s type.
|
|
2583
|
+
* Omit or clear to resolve widget config from {@link AXPWidgetRegistryService} as usual.
|
|
2584
|
+
*/
|
|
2585
|
+
setPropertyDefinitions(properties: AXPWidgetProperty[] | null): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2586
|
+
onAction(handler: (dialogRef: AXPPropertyViewerActionRef) => void | Promise<void> | unknown | Promise<unknown>): IAXPWidgetPropertyViewerDialogBuilder;
|
|
2587
|
+
/**
|
|
2588
|
+
* Applies edits and returns updated context; merge {@link AXPWidgetPropertyViewerResult.values} into your widget node
|
|
2589
|
+
* (typically `options` and any top-level fields the viewer exposes).
|
|
2590
|
+
*/
|
|
2591
|
+
show(): Promise<AXPWidgetPropertyViewerResult | null>;
|
|
2592
|
+
}
|
|
2158
2593
|
declare class AXPWidgetPropertyViewerService {
|
|
2159
2594
|
private readonly widgetRegistryService;
|
|
2160
2595
|
private readonly propertyViewerService;
|
|
2161
2596
|
/**
|
|
2162
|
-
*
|
|
2597
|
+
* Same shape as `AXPPropertyViewerService.create()` — use `.dialog((d) => { ... }).show()`.
|
|
2598
|
+
*/
|
|
2599
|
+
create(): IAXPWidgetPropertyViewerRoot;
|
|
2600
|
+
/**
|
|
2601
|
+
* One-shot open (delegates to {@link #create} `.dialog().show()`).
|
|
2163
2602
|
*/
|
|
2164
2603
|
open(config: AXPWidgetPropertyViewerConfig): Promise<AXPWidgetPropertyViewerResult | null>;
|
|
2165
|
-
private buildTabs;
|
|
2166
|
-
private buildInitialContext;
|
|
2167
2604
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPWidgetPropertyViewerService, never>;
|
|
2168
2605
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPWidgetPropertyViewerService>;
|
|
2169
2606
|
}
|
|
2170
2607
|
|
|
2171
|
-
|
|
2172
|
-
|
|
2608
|
+
/** Scheduler appointment with optional provider tag for context menu routing. */
|
|
2609
|
+
type AppointmentWithProvider = AXSchedulerAppointment & {
|
|
2610
|
+
provider?: string;
|
|
2611
|
+
};
|
|
2612
|
+
declare class AXPResourceAppointmentComponent implements OnInit {
|
|
2613
|
+
/** Show resource headers in the timeline views. */
|
|
2614
|
+
showResourceHeaders: _angular_core.InputSignal<boolean>;
|
|
2615
|
+
/** Show appointments that have no resourceId. */
|
|
2616
|
+
showUnassignedAppointments: _angular_core.InputSignal<boolean>;
|
|
2617
|
+
/** Optional provider name to filter the board (e.g. from route param). */
|
|
2618
|
+
providerName: _angular_core.InputSignal<string | undefined>;
|
|
2619
|
+
private readonly resourceAppointmentService;
|
|
2620
|
+
private readonly formatService;
|
|
2621
|
+
private readonly contextMenu;
|
|
2622
|
+
protected readonly schedulerRef: _angular_core.Signal<AXSchedulerComponent | undefined>;
|
|
2623
|
+
protected readonly isReady: _angular_core.WritableSignal<boolean>;
|
|
2624
|
+
protected readonly currentDate: _angular_core.WritableSignal<Date>;
|
|
2625
|
+
protected readonly currentView: _angular_core.WritableSignal<AXSchedulerView>;
|
|
2626
|
+
private readonly currentAppointment;
|
|
2627
|
+
/** Raw resources returned by providers. */
|
|
2628
|
+
private readonly rawResources;
|
|
2629
|
+
/** Scheduler resources derived from provider data. */
|
|
2630
|
+
protected readonly schedulerResources: _angular_core.Signal<AXSchedulerResource[]>;
|
|
2631
|
+
/** Flat list of scheduler appointments derived from provider data. */
|
|
2632
|
+
protected readonly schedulerAppointments: _angular_core.Signal<AppointmentWithProvider[]>;
|
|
2633
|
+
/** Formatted date range text for the toolbar. */
|
|
2634
|
+
protected readonly timeText: _angular_core.Signal<string>;
|
|
2635
|
+
constructor();
|
|
2636
|
+
ngOnInit(): Promise<void>;
|
|
2637
|
+
private resolveProvidersAndReady;
|
|
2638
|
+
/** Fetches resource + appointment data from providers and updates signals. */
|
|
2639
|
+
private loadData;
|
|
2640
|
+
/** Re-load data when the scheduler view range changes and sync toolbar date. */
|
|
2641
|
+
protected handleRangeChanged(range: AXSchedulerDateRange): void;
|
|
2642
|
+
/** Navigate to previous/next period based on current view. */
|
|
2643
|
+
protected changeDate(forward: boolean): void;
|
|
2644
|
+
/** Fallback formatted date range when scheduler ref is not yet available. */
|
|
2645
|
+
private formatCurrentDateRange;
|
|
2646
|
+
protected handleAppointmentClick(event: {
|
|
2647
|
+
appointment: AXSchedulerAppointment;
|
|
2648
|
+
nativeEvent: MouseEvent;
|
|
2649
|
+
}): void;
|
|
2650
|
+
protected handleContextMenuOpening(event: AXContextMenuOpeningEvent): Promise<void>;
|
|
2651
|
+
protected handleContextMenuItemClick(event: AXContextMenuItemsClickEvent): void;
|
|
2652
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPResourceAppointmentComponent, never>;
|
|
2653
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPResourceAppointmentComponent, "axp-resource-appointment", never, { "showResourceHeaders": { "alias": "showResourceHeaders"; "required": false; "isSignal": true; }; "showUnassignedAppointments": { "alias": "showUnassignedAppointments"; "required": false; "isSignal": true; }; "providerName": { "alias": "providerName"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
2654
|
+
}
|
|
2655
|
+
|
|
2656
|
+
/**
|
|
2657
|
+
* Minimal appointment data for resource appointment board.
|
|
2658
|
+
* Providers return this; the component converts to scheduler/task shape as needed.
|
|
2659
|
+
*/
|
|
2660
|
+
interface AXPResourceAppointmentItem {
|
|
2661
|
+
readonly id: string | number;
|
|
2662
|
+
title: string;
|
|
2663
|
+
startDate: Date;
|
|
2664
|
+
endDate: Date;
|
|
2665
|
+
resourceId?: string | number;
|
|
2666
|
+
description?: string;
|
|
2667
|
+
allDay?: boolean;
|
|
2668
|
+
}
|
|
2669
|
+
/**
|
|
2670
|
+
* Represents a status option for the resource appointment board (e.g. column or filter).
|
|
2671
|
+
* Aligned with task board status shape for provider compatibility.
|
|
2672
|
+
*/
|
|
2673
|
+
interface AXPResourceAppointmentStatus {
|
|
2674
|
+
key: string;
|
|
2675
|
+
index: number;
|
|
2676
|
+
title: string;
|
|
2677
|
+
color?: string;
|
|
2678
|
+
}
|
|
2679
|
+
/**
|
|
2680
|
+
* Action menu item for resource appointment board with optional priority.
|
|
2681
|
+
* Primary actions are shown as icon-only buttons, secondary in a dropdown.
|
|
2682
|
+
*/
|
|
2683
|
+
type AXPResourceAppointmentActionMenuItem = AXPActionMenuItem & {
|
|
2684
|
+
priority?: 'primary' | 'secondary';
|
|
2685
|
+
};
|
|
2686
|
+
interface AXPResourceAppointmentResource {
|
|
2687
|
+
readonly id: string | number;
|
|
2688
|
+
title: string;
|
|
2689
|
+
description?: string;
|
|
2690
|
+
icon?: string;
|
|
2691
|
+
appointments: AXPResourceAppointmentItem[];
|
|
2692
|
+
}
|
|
2693
|
+
interface AXPResourceAppointmentBoardFilter {
|
|
2694
|
+
range?: AXRange<Date>;
|
|
2695
|
+
statuses?: (string | number)[];
|
|
2696
|
+
resourceIds?: (string | number)[];
|
|
2697
|
+
/** When set, only these providers are queried. */
|
|
2698
|
+
providerNames?: string[];
|
|
2699
|
+
}
|
|
2700
|
+
declare abstract class AXPResourceAppointmentBoardProvider<T = Record<string, unknown>> {
|
|
2701
|
+
abstract get name(): string;
|
|
2702
|
+
abstract get title(): string;
|
|
2703
|
+
abstract get icon(): string;
|
|
2704
|
+
abstract getList(filter?: AXPResourceAppointmentBoardFilter): Promise<AXPResourceAppointmentResource[]>;
|
|
2705
|
+
abstract getStatuses(): Promise<AXPResourceAppointmentStatus[]>;
|
|
2706
|
+
abstract getActions(context?: AXPResourceAppointmentItem): Promise<AXPResourceAppointmentActionMenuItem[]>;
|
|
2707
|
+
abstract executeCommand(command: AXPExecuteCommand): Promise<AXPExecuteCommandResult>;
|
|
2708
|
+
}
|
|
2709
|
+
declare const AXP_RESOURCE_APPOINTMENT_PROVIDER: InjectionToken<AXPResourceAppointmentBoardProvider<Record<string, unknown>>[] | Promise<AXPResourceAppointmentBoardProvider<Record<string, unknown>>>[]>;
|
|
2710
|
+
|
|
2711
|
+
declare class AXPResourceAppointmentService {
|
|
2712
|
+
private readonly calendarService;
|
|
2713
|
+
private readonly providers;
|
|
2714
|
+
private resolvedProviders;
|
|
2715
|
+
refresh$: Subject<void>;
|
|
2716
|
+
/**
|
|
2717
|
+
* Resolves providers from injected AXP_RESOURCE_APPOINTMENT_PROVIDER.
|
|
2718
|
+
* The service must be provided in an injector that has access to the token (e.g. component providers).
|
|
2719
|
+
*/
|
|
2720
|
+
resolveProviders(): Promise<AXPResourceAppointmentBoardProvider[]>;
|
|
2721
|
+
getProviderTypes(): Promise<AXPResourceAppointmentBoardProvider[]>;
|
|
2722
|
+
getProvider(name: string | undefined): AXPResourceAppointmentBoardProvider | null;
|
|
2723
|
+
getList(filter?: AXPResourceAppointmentBoardFilter): Promise<AXPResourceAppointmentResource[]>;
|
|
2724
|
+
getStatuses(providerName: string): Promise<AXPResourceAppointmentStatus[]>;
|
|
2725
|
+
getActions(context: AXPResourceAppointmentItem | undefined, providerName: string): Promise<AXPResourceAppointmentActionMenuItem[]>;
|
|
2726
|
+
executeCommand(command: AXPExecuteCommand, providerName: string): Promise<AXPExecuteCommandResult>;
|
|
2727
|
+
rangeCalculator(type: string): AXRange<Date> | undefined;
|
|
2728
|
+
private findProvider;
|
|
2729
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPResourceAppointmentService, never>;
|
|
2730
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPResourceAppointmentService>;
|
|
2731
|
+
}
|
|
2732
|
+
|
|
2733
|
+
/**
|
|
2734
|
+
* Host-owned item row. Required keys are stable; additional keys are persisted by the host mapper.
|
|
2735
|
+
*/
|
|
2736
|
+
interface AXPBuilderItem {
|
|
2737
|
+
id: string;
|
|
2738
|
+
order: number;
|
|
2739
|
+
[key: string]: unknown;
|
|
2740
|
+
}
|
|
2741
|
+
/**
|
|
2742
|
+
* Host-owned section. Items live under `items` (not nested host-specific names).
|
|
2743
|
+
*/
|
|
2744
|
+
interface AXPBuilderSection {
|
|
2745
|
+
id: string;
|
|
2746
|
+
order: number;
|
|
2747
|
+
items: AXPBuilderItem[];
|
|
2748
|
+
[key: string]: unknown;
|
|
2749
|
+
}
|
|
2750
|
+
interface AXPBuilderValue {
|
|
2751
|
+
sections: AXPBuilderSection[];
|
|
2752
|
+
}
|
|
2753
|
+
type AXPBuilderBadgeVariant = 'neutral' | 'accent' | 'warning' | 'danger' | 'success';
|
|
2754
|
+
interface AXPBuilderBadge {
|
|
2755
|
+
/** Translation key (e.g. `@general:...`) or plain text. */
|
|
2756
|
+
text: string;
|
|
2757
|
+
variant?: AXPBuilderBadgeVariant;
|
|
2758
|
+
}
|
|
2759
|
+
type AXPBuilderItemIconTone = 'default' | 'easy' | 'medium' | 'hard';
|
|
2760
|
+
/**
|
|
2761
|
+
* View model for one item row (icons, labels, badges). Built by {@link AXPBuilderDefinition.mapItemToView}.
|
|
2762
|
+
*/
|
|
2763
|
+
interface AXPBuilderItemViewModel {
|
|
2764
|
+
icon: string;
|
|
2765
|
+
iconTone?: AXPBuilderItemIconTone;
|
|
2766
|
+
title: string;
|
|
2767
|
+
name?: string;
|
|
2768
|
+
description?: string;
|
|
2769
|
+
badges: AXPBuilderBadge[];
|
|
2770
|
+
}
|
|
2771
|
+
interface AXPBuilderTexts {
|
|
2772
|
+
addSection: string;
|
|
2773
|
+
addItem: string;
|
|
2774
|
+
emptySectionsTitle: string;
|
|
2775
|
+
emptySectionsDescription: string;
|
|
2776
|
+
emptyItemsTitle: string;
|
|
2777
|
+
emptyItemsDescription: string;
|
|
2778
|
+
/** Shown when {@link AXPBuilderDefinition.isDefaultSection} is true */
|
|
2779
|
+
defaultSectionBadge?: string;
|
|
2780
|
+
}
|
|
2781
|
+
/**
|
|
2782
|
+
* Declarative configuration for {@link AXPSectionItemsBuilderComponent}.
|
|
2783
|
+
* Prompts return domain slices; the builder assigns `id` / `order` / `items` where needed.
|
|
2784
|
+
*/
|
|
2785
|
+
interface AXPBuilderDefinition {
|
|
2786
|
+
texts: AXPBuilderTexts;
|
|
2787
|
+
mapItemToView: (item: AXPBuilderItem, section: AXPBuilderSection) => AXPBuilderItemViewModel;
|
|
2788
|
+
/** When true, renders section technical `name` next to the title (parentheses). */
|
|
2789
|
+
showSectionTechnicalName?: boolean;
|
|
2790
|
+
isDefaultSection?(section: AXPBuilderSection): boolean;
|
|
2791
|
+
/** Minimum number of sections (default 1). */
|
|
2792
|
+
minSectionCount?: number;
|
|
2793
|
+
promptAddSection?(value: AXPBuilderValue): Promise<Record<string, unknown> | null>;
|
|
2794
|
+
promptEditSection?(section: AXPBuilderSection, value: AXPBuilderValue): Promise<Record<string, unknown> | null>;
|
|
2795
|
+
promptAddItems?(sectionId: string, value: AXPBuilderValue): Promise<AXPBuilderItem[] | null>;
|
|
2796
|
+
promptEditItem?(item: AXPBuilderItem, sectionId: string, value: AXPBuilderValue): Promise<AXPBuilderItem | null>;
|
|
2797
|
+
confirmRemoveSection?(section: AXPBuilderSection): Promise<boolean>;
|
|
2798
|
+
confirmRemoveItem?(item: AXPBuilderItem, sectionId: string): Promise<boolean>;
|
|
2799
|
+
}
|
|
2800
|
+
|
|
2801
|
+
declare class AXPSectionItemsBuilderComponent {
|
|
2802
|
+
/** Used in template to branch between escaped text and sanitized HTML. */
|
|
2803
|
+
protected readonly containsHtmlMarkup: typeof containsHtmlMarkup;
|
|
2804
|
+
readonly value: _angular_core.InputSignal<AXPBuilderValue>;
|
|
2805
|
+
readonly definition: _angular_core.InputSignal<AXPBuilderDefinition>;
|
|
2806
|
+
readonly readonlyMode: _angular_core.InputSignal<boolean>;
|
|
2807
|
+
readonly valueChange: _angular_core.OutputEmitterRef<AXPBuilderValue>;
|
|
2808
|
+
private readonly vm;
|
|
2809
|
+
protected readonly sectionsModel: _angular_core.Signal<AXPBuilderValue>;
|
|
2810
|
+
protected readonly sectionRows: _angular_core.Signal<{
|
|
2811
|
+
section: AXPBuilderSection;
|
|
2812
|
+
itemRows: {
|
|
2813
|
+
item: AXPBuilderItem;
|
|
2814
|
+
view: _acorex_platform_layout_components.AXPBuilderItemViewModel;
|
|
2815
|
+
}[];
|
|
2816
|
+
}[]>;
|
|
2817
|
+
protected readonly itemDropListIds: _angular_core.Signal<string[]>;
|
|
2818
|
+
protected readonly canRemoveSection: _angular_core.Signal<boolean>;
|
|
2819
|
+
constructor();
|
|
2820
|
+
/**
|
|
2821
|
+
* Opens add-section flow (same as primary "Add section" control). For page commands / ViewChild.
|
|
2822
|
+
*/
|
|
2823
|
+
addSection(): Promise<void>;
|
|
2824
|
+
protected onAddSectionClick(): Promise<void>;
|
|
2825
|
+
protected onEditSection(section: AXPBuilderSection): Promise<void>;
|
|
2826
|
+
protected onRemoveSection(section: AXPBuilderSection): Promise<void>;
|
|
2827
|
+
protected onAddItems(section: AXPBuilderSection): Promise<void>;
|
|
2828
|
+
protected onEditItem(item: AXPBuilderItem, sectionId: string): Promise<void>;
|
|
2829
|
+
protected onRemoveItem(item: AXPBuilderItem, sectionId: string): Promise<void>;
|
|
2830
|
+
protected onSectionDrop(event: CdkDragDrop<AXPBuilderSection[]>): void;
|
|
2831
|
+
protected onItemDrop(event: CdkDragDrop<AXPBuilderItem[]>, targetSectionId: string): void;
|
|
2832
|
+
protected sectionItemsListId(sectionId: string): string;
|
|
2833
|
+
protected parseSectionIdFromDropListId(listId: string): string | null;
|
|
2834
|
+
protected isDefaultSection(section: AXPBuilderSection): boolean;
|
|
2835
|
+
protected isTranslationKey(text: string): boolean;
|
|
2836
|
+
/** Tooltip for rich HTML rows: plain text, no tags. */
|
|
2837
|
+
protected tooltipPlainTextForHtml(html: string): string;
|
|
2838
|
+
/**
|
|
2839
|
+
* Prefer raw section fields for display so {@link AXPMultiLanguageString} maps are not
|
|
2840
|
+
* lost when {@link AXPBuilderDefinition#mapItemToView} stringifies them on items.
|
|
2841
|
+
*/
|
|
2842
|
+
protected sectionTitleValue(section: AXPBuilderSection): AXPMultiLanguageString | string;
|
|
2843
|
+
protected sectionNameValue(section: AXPBuilderSection): AXPMultiLanguageString | string | undefined;
|
|
2844
|
+
protected sectionDescriptionValue(section: AXPBuilderSection): AXPMultiLanguageString | string | undefined;
|
|
2845
|
+
/**
|
|
2846
|
+
* Resolves item title/name/description for display: use raw item values when present
|
|
2847
|
+
* (including ML maps); fall back to {@link AXPBuilderItemViewModel} only when needed.
|
|
2848
|
+
*/
|
|
2849
|
+
protected itemMultilingualField(item: AXPBuilderItem, field: 'title' | 'name' | 'description', viewFallback?: string | null): AXPMultiLanguageString | string;
|
|
2850
|
+
private commit;
|
|
2851
|
+
private normalizeValue;
|
|
2852
|
+
private reindexSections;
|
|
2853
|
+
private reindexItems;
|
|
2854
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPSectionItemsBuilderComponent, never>;
|
|
2855
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPSectionItemsBuilderComponent, "axp-section-items-builder", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "definition": { "alias": "definition"; "required": true; "isSignal": true; }; "readonlyMode": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
2856
|
+
}
|
|
2857
|
+
|
|
2858
|
+
/**
|
|
2859
|
+
* Host configuration for {@link AXPStandardSectionItemsBuilderComponent}.
|
|
2860
|
+
* Section add/edit UI (identity, content, visibility) and delete prompts are standardized;
|
|
2861
|
+
* item flows stay host-specific.
|
|
2862
|
+
*/
|
|
2863
|
+
interface AXPStandardSectionItemsBuilderConfig {
|
|
2864
|
+
mapItemToView: AXPBuilderDefinition['mapItemToView'];
|
|
2865
|
+
/** When set, used instead of the built-in section add dialog. */
|
|
2866
|
+
promptAddSection?: AXPBuilderDefinition['promptAddSection'];
|
|
2867
|
+
/** When set, used instead of the built-in section edit dialog. */
|
|
2868
|
+
promptEditSection?: AXPBuilderDefinition['promptEditSection'];
|
|
2869
|
+
promptAddItems?: AXPBuilderDefinition['promptAddItems'];
|
|
2870
|
+
promptEditItem?: AXPBuilderDefinition['promptEditItem'];
|
|
2871
|
+
/** Merged over built-in empty-state / action labels */
|
|
2872
|
+
texts?: Partial<AXPBuilderTexts>;
|
|
2873
|
+
showSectionTechnicalName?: boolean;
|
|
2874
|
+
isDefaultSection?: AXPBuilderDefinition['isDefaultSection'];
|
|
2875
|
+
minSectionCount?: number;
|
|
2876
|
+
/**
|
|
2877
|
+
* Property viewer tabs for section add/edit.
|
|
2878
|
+
* Default: {@link STANDARD_SECTION_ITEMS_SECTION_TABS}.
|
|
2879
|
+
*/
|
|
2880
|
+
sectionEditTabs?: AXPPropertyViewerTab[];
|
|
2881
|
+
/** Override default delete-section confirmation. */
|
|
2882
|
+
confirmRemoveSection?: AXPBuilderDefinition['confirmRemoveSection'];
|
|
2883
|
+
/** Override default delete-item confirmation. */
|
|
2884
|
+
confirmRemoveItem?: AXPBuilderDefinition['confirmRemoveItem'];
|
|
2885
|
+
}
|
|
2886
|
+
/** Context shape bound to the default section property viewer (paths match keys). */
|
|
2887
|
+
interface AXPStandardSectionFormContext {
|
|
2888
|
+
/** Unique technical name (section `name` in the builder model). */
|
|
2889
|
+
name?: string;
|
|
2890
|
+
tags?: unknown;
|
|
2891
|
+
title?: string | AXPMultiLanguageString;
|
|
2892
|
+
description?: string | AXPMultiLanguageString;
|
|
2893
|
+
isVisible?: boolean;
|
|
2894
|
+
}
|
|
2895
|
+
|
|
2896
|
+
/**
|
|
2897
|
+
* Default section editor: Identity (name, tags), Content (title, description), Visibility.
|
|
2898
|
+
*/
|
|
2899
|
+
declare const STANDARD_SECTION_ITEMS_SECTION_TABS: AXPPropertyViewerTab[];
|
|
2900
|
+
|
|
2901
|
+
declare class AXPStandardSectionItemsBuilderComponent {
|
|
2902
|
+
readonly value: _angular_core.InputSignal<AXPBuilderValue>;
|
|
2903
|
+
readonly config: _angular_core.InputSignal<AXPStandardSectionItemsBuilderConfig>;
|
|
2904
|
+
readonly readonlyMode: _angular_core.InputSignal<boolean>;
|
|
2905
|
+
readonly valueChange: _angular_core.OutputEmitterRef<AXPBuilderValue>;
|
|
2906
|
+
private readonly inner;
|
|
2907
|
+
private readonly dialogService;
|
|
2908
|
+
private readonly translationService;
|
|
2909
|
+
private readonly propertyViewerService;
|
|
2910
|
+
protected readonly mergedDefinition: _angular_core.Signal<AXPBuilderDefinition>;
|
|
2911
|
+
/** Same entry as page commands / toolbar: open standardized add-section dialog. */
|
|
2912
|
+
addSection(): Promise<void>;
|
|
2913
|
+
private isDuplicateSectionName;
|
|
2914
|
+
/**
|
|
2915
|
+
* `AXPBuilderSection` uses `[key: string]: unknown`; cast to form-bound type without resolving ML.
|
|
2916
|
+
*/
|
|
2917
|
+
private sectionFieldForForm;
|
|
2918
|
+
private buildSectionContext;
|
|
2919
|
+
private openSectionDialog;
|
|
2920
|
+
private defaultConfirmRemoveSection;
|
|
2921
|
+
private defaultConfirmRemoveItem;
|
|
2922
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPStandardSectionItemsBuilderComponent, never>;
|
|
2923
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPStandardSectionItemsBuilderComponent, "axp-standard-section-items-builder", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "config": { "alias": "config"; "required": true; "isSignal": true; }; "readonlyMode": { "alias": "readonly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
|
|
2924
|
+
}
|
|
2925
|
+
|
|
2926
|
+
export { AXPActivityLogComponent, AXPAvatarComponent, AXPCategoryTreeComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPConditionBuilderComponent, AXPConditionBuilderConditionComponent, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPExpressionFieldDefinitions, AXPImageEditorPopupComponent, AXPImageEditorService, AXPItemConfiguratorComponent, AXPLogoComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPPageComponentRegistryService, AXPPreloadFiltersComponent, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPRepeaterRowsLayoutComponent, AXPResourceAppointmentBoardProvider, AXPResourceAppointmentComponent, AXPResourceAppointmentService, AXPSectionItemsBuilderComponent, AXPSpreadsheetComponent, AXPStandardSectionItemsBuilderComponent, 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_EXPRESSION_LOGIC_DEFINITIONS, AXP_EXPRESSION_OPERATION_DEFINITIONS, AXP_MENU_CUSTOMIZER_SERVICE, AXP_PAGE_COMPONENT_PROVIDER, AXP_RESOURCE_APPOINTMENT_PROVIDER, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, STANDARD_SECTION_ITEMS_SECTION_TABS, buildPropertyViewerInitialContextFromProperties, buildPropertyViewerTabsFromProperties, buildTableColumnsEditorLayout, getFieldDefinitions, getLogicDefinition, getOperationDefinition, isPropertyBindingExpressionFormValue, preparePropertyForViewer, preparePropertyViewerTabs, registerFieldDefinitions, withValidationsOnEditorNode };
|
|
2927
|
+
export type { AXPBuilderBadge, AXPBuilderBadgeVariant, AXPBuilderDefinition, AXPBuilderItem, AXPBuilderItemIconTone, AXPBuilderItemViewModel, AXPBuilderSection, AXPBuilderTexts, AXPBuilderValue, AXPCategoryTreeActions, AXPCategoryTreeConfig, AXPCategoryTreeDataSource, AXPCategoryTreeEvents, AXPCategoryTreeNode, AXPColumnItemListItem, AXPCompareViewField, AXPCompareViewInputs, AXPCompareViewMode, AXPCompareViewObject, AXPDataSelectorAllowCreate, AXPDataSelectorColumn, AXPDataSelectorConfig, AXPDragDropListConfig, AXPDragDropListDropEvent, AXPDragDropListItem, AXPExpressionFieldDefinition, AXPExpressionGroupNode, AXPExpressionLogicDefinition, AXPExpressionLogicType, AXPExpressionNode, AXPExpressionNodeId, AXPExpressionOperationDefinition, AXPExpressionOperationNode, AXPExpressionOperationType, AXPExpressionTree, AXPExpressionValueOperand, AXPExpressionValueSourceType, AXPImageEditorOpenOptions, AXPMenuCustomizerAction, AXPMenuCustomizerItem, AXPMenuCustomizerItemType, AXPMenuCustomizerNodeData, AXPMenuCustomizerNodeMetadata, AXPMenuCustomizerState, AXPPageComponentDefinition, AXPPageComponentProvider, AXPPreloadFiltersApplyEvent, AXPPropertyViewerActionRef, AXPPropertyViewerChangedEvent, AXPPropertyViewerConfig, AXPPropertyViewerGroup, AXPPropertyViewerResult, AXPPropertyViewerTab, AXPResourceAppointmentActionMenuItem, AXPResourceAppointmentBoardFilter, AXPResourceAppointmentItem, AXPResourceAppointmentResource, AXPResourceAppointmentStatus, AXPSpreadsheetCellChangeEvent, AXPSpreadsheetCellValue, AXPSpreadsheetColumn, AXPSpreadsheetConfig, AXPSpreadsheetData, AXPSpreadsheetItem, AXPSpreadsheetRowChangeEvent, AXPSpreadsheetRowMode, AXPStandardSectionFormContext, AXPStandardSectionItemsBuilderConfig, AXPTableColumnDefinition, AXPTableColumnsEditorOpenOptions, AXPTableDataEditorOpenOptions, AXPTemplateViewerConfig, AXPTemplateViewerResult, AXPUserAvatarData, AXPUserAvatarProvider, AXPUserAvatarSize, AXPUserAvatarStatus, AXPWidgetItemClickEvent, AXPWidgetItemData, AXPWidgetPropertiesChangedEvent, AXPWidgetPropertyInjection, AXPWidgetPropertyViewerConfig, AXPWidgetPropertyViewerResult, ConditionBuilderSelectedField, IAXPPropertyViewerDialogBuilder, IAXPPropertyViewerRoot, IAXPWidgetPropertyViewerDialogBuilder, IAXPWidgetPropertyViewerRoot, ItemConfiguratorListItem, StateMode };
|