@acorex/platform 20.7.8 → 20.7.9
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/common/index.d.ts +8 -4
- package/fesm2022/acorex-platform-common.mjs +5 -1
- package/fesm2022/acorex-platform-common.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-builder.mjs +31 -4
- package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
- package/fesm2022/{acorex-platform-layout-components-binding-expression-editor-popup.component-ZnTG7wlJ.mjs → acorex-platform-layout-components-binding-expression-editor-popup.component-Cb6Lk4Ch.mjs} +5 -5
- package/fesm2022/{acorex-platform-layout-components-binding-expression-editor-popup.component-ZnTG7wlJ.mjs.map → acorex-platform-layout-components-binding-expression-editor-popup.component-Cb6Lk4Ch.mjs.map} +1 -1
- package/fesm2022/acorex-platform-layout-components.mjs +913 -36
- package/fesm2022/acorex-platform-layout-components.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-entity.mjs +392 -746
- package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
- package/fesm2022/acorex-platform-layout-widgets.mjs +105 -192
- package/fesm2022/acorex-platform-layout-widgets.mjs.map +1 -1
- package/layout/builder/index.d.ts +25 -14
- package/layout/components/index.d.ts +295 -2
- package/layout/entity/index.d.ts +33 -55
- package/layout/widgets/index.d.ts +32 -31
- package/package.json +5 -5
|
@@ -417,7 +417,7 @@ interface ILayoutBuilder {
|
|
|
417
417
|
page(delegate: (container: IPageContainerBuilder) => void): ILayoutBuilder;
|
|
418
418
|
tabset(delegate: (container: ITabsetContainerBuilder) => void): ILayoutBuilder;
|
|
419
419
|
fieldset(delegate: (container: IFieldsetContainerBuilder) => void): ILayoutBuilder;
|
|
420
|
-
dialog(delegate: (container: IDialogBuilder) => void): IDialogBuilder
|
|
420
|
+
dialog<T = AXPDialogRef>(delegate: (container: IDialogBuilder<T>) => void): IDialogBuilder<T>;
|
|
421
421
|
stepWizard(delegate: (wizard: IStepWizardBuilder) => void): ILayoutBuilder;
|
|
422
422
|
build(): AXPWidgetNode;
|
|
423
423
|
toJson(options?: {
|
|
@@ -564,20 +564,26 @@ interface IFieldsetContainerBuilder extends IBaseContainerBuilder<IFieldsetConta
|
|
|
564
564
|
setCols(cols: number): IFieldsetContainerBuilder;
|
|
565
565
|
formField(label: string, delegate?: (field: IFormFieldBuilder) => void): IFieldsetContainerBuilder;
|
|
566
566
|
}
|
|
567
|
-
interface IDialogBuilder {
|
|
568
|
-
}
|
|
569
|
-
interface IDialogBuilder {
|
|
570
|
-
setOptions(options: AXPDialogContainerOptions): IDialogBuilder
|
|
571
|
-
setTitle(title: string): IDialogBuilder
|
|
572
|
-
setMessage(message?: string): IDialogBuilder
|
|
573
|
-
setSize(size: AXPopupSizeType): IDialogBuilder
|
|
574
|
-
setCloseButton(closeButton: boolean): IDialogBuilder
|
|
575
|
-
setContext(context: any): IDialogBuilder
|
|
576
|
-
content(delegate: (layoutBuilder: IFlexContainerBuilder) => void): IDialogBuilder
|
|
577
|
-
setActions(delegate?: (actions: IActionBuilder) => void): IDialogBuilder
|
|
578
|
-
|
|
567
|
+
interface IDialogBuilder<T = AXPDialogRef> {
|
|
568
|
+
}
|
|
569
|
+
interface IDialogBuilder<T = AXPDialogRef> {
|
|
570
|
+
setOptions(options: AXPDialogContainerOptions): IDialogBuilder<T>;
|
|
571
|
+
setTitle(title: string): IDialogBuilder<T>;
|
|
572
|
+
setMessage(message?: string): IDialogBuilder<T>;
|
|
573
|
+
setSize(size: AXPopupSizeType): IDialogBuilder<T>;
|
|
574
|
+
setCloseButton(closeButton: boolean): IDialogBuilder<T>;
|
|
575
|
+
setContext(context: any): IDialogBuilder<T>;
|
|
576
|
+
content(delegate: (layoutBuilder: IFlexContainerBuilder) => void): IDialogBuilder<T>;
|
|
577
|
+
setActions(delegate?: (actions: IActionBuilder) => void): IDialogBuilder<T>;
|
|
578
|
+
/**
|
|
579
|
+
* Handler invoked when user clicks an action. Receives AXPDialogRef (context, action, setLoading, close).
|
|
580
|
+
* If handler throws, dialog stays open for retry.
|
|
581
|
+
* If handler returns, dialog closes and show() resolves with the return value.
|
|
582
|
+
*/
|
|
583
|
+
onAction(handler: (dialogRef: AXPDialogRef) => T | Promise<T>): IDialogBuilder<T>;
|
|
584
|
+
addCustomAction(action: AXPActionMenuItem): IDialogBuilder<T>;
|
|
579
585
|
build(): AXPWidgetNode;
|
|
580
|
-
show(): Promise<
|
|
586
|
+
show(): Promise<T>;
|
|
581
587
|
}
|
|
582
588
|
interface IListWidgetBuilder extends IBaseContainerBuilder<IListWidgetBuilder>, ILayoutContainerBuilder<IListWidgetBuilder>, IChildContainerBuilder<IListWidgetBuilder>, IWidgetContainerBuilder<IListWidgetBuilder> {
|
|
583
589
|
setOptions(options: AXPListWidgetOptions): IListWidgetBuilder;
|
|
@@ -821,6 +827,11 @@ interface DialogRendererConfig {
|
|
|
821
827
|
suffix?: any[];
|
|
822
828
|
};
|
|
823
829
|
};
|
|
830
|
+
/**
|
|
831
|
+
* When present, handler is called on action click with AXPDialogRef.
|
|
832
|
+
* Throw = stay open for retry. Return = close and resolve show() with return value.
|
|
833
|
+
*/
|
|
834
|
+
onAction?: (dialogRef: AXPDialogRef) => any | Promise<any>;
|
|
824
835
|
}
|
|
825
836
|
interface DialogRendererResult {
|
|
826
837
|
context: any;
|
|
@@ -8,6 +8,7 @@ import { AXTreeViewLegacyComponent, AXTreeItemClickBaseEventLegacy } from '@acor
|
|
|
8
8
|
import { AXTranslationService } from '@acorex/core/translation';
|
|
9
9
|
import { AXPopoverComponent } from '@acorex/components/popover';
|
|
10
10
|
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
11
|
+
import * as _acorex_platform_layout_widget_core from '@acorex/platform/layout/widget-core';
|
|
11
12
|
import { AXPWidgetNode, AXPWidgetRendererDirective, AXPWidgetCoreContextChangeEvent, AXPWidgetProperty, AXPWidgetConfig } from '@acorex/platform/layout/widget-core';
|
|
12
13
|
import * as _ngrx_signals from '@ngrx/signals';
|
|
13
14
|
import { AXDataTableComponent, AXDataTableRowDbClick, AXDataTableRowClick } from '@acorex/components/data-table';
|
|
@@ -15,10 +16,14 @@ import { AXBasePageComponent } from '@acorex/components/page';
|
|
|
15
16
|
import { AXDropListDroppedEvent } from '@acorex/cdk/drag-drop';
|
|
16
17
|
import { AXTagBoxComponent } from '@acorex/components/tag-box';
|
|
17
18
|
import { AXCalendarService } from '@acorex/core/date-time';
|
|
19
|
+
import { AXTreeViewNode, AXTreeViewDragBehavior, AXTreeViewDragArea, AXTreeViewComponent, AXTreeViewBeforeDropEvent, AXTreeViewDropEvent } from '@acorex/components/tree-view';
|
|
20
|
+
import { AXDialogService } from '@acorex/components/dialog';
|
|
21
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
18
22
|
import { AXTabStripChangedEvent, AXTabsComponent } from '@acorex/components/tabs';
|
|
19
23
|
import { AXFormComponent } from '@acorex/components/form';
|
|
20
24
|
import { AXPopupSizeType, AXPopupService } from '@acorex/components/popup';
|
|
21
25
|
import { Observable } from 'rxjs';
|
|
26
|
+
import { AXSelectBoxComponent } from '@acorex/components/select-box';
|
|
22
27
|
|
|
23
28
|
declare class AXPActivityLogComponent {
|
|
24
29
|
private readonly translateService;
|
|
@@ -765,6 +770,191 @@ declare class AXPImageEditorService {
|
|
|
765
770
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPImageEditorService>;
|
|
766
771
|
}
|
|
767
772
|
|
|
773
|
+
/**
|
|
774
|
+
* Menu item interface for customizer
|
|
775
|
+
*/
|
|
776
|
+
interface AXPMenuCustomizerItem {
|
|
777
|
+
name?: string;
|
|
778
|
+
text?: string;
|
|
779
|
+
icon?: string;
|
|
780
|
+
path?: string;
|
|
781
|
+
type?: 'menu' | 'group' | 'break';
|
|
782
|
+
priority?: number;
|
|
783
|
+
description?: string;
|
|
784
|
+
children?: AXPMenuCustomizerItem[];
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* Metadata for menu tree nodes
|
|
788
|
+
*/
|
|
789
|
+
interface AXPMenuCustomizerNodeMetadata {
|
|
790
|
+
isBuiltIn: boolean;
|
|
791
|
+
isCustom: boolean;
|
|
792
|
+
isHidden: boolean;
|
|
793
|
+
originalPriority?: number;
|
|
794
|
+
originalParentName?: string;
|
|
795
|
+
}
|
|
796
|
+
/**
|
|
797
|
+
* Data structure for tree node combining menu item with metadata
|
|
798
|
+
*/
|
|
799
|
+
interface AXPMenuCustomizerNodeData {
|
|
800
|
+
menuItem: AXPMenuCustomizerItem;
|
|
801
|
+
metadata: AXPMenuCustomizerNodeMetadata;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Available actions that can be performed on menu items
|
|
805
|
+
*/
|
|
806
|
+
type AXPMenuCustomizerAction = 'show' | 'hide' | 'edit' | 'delete' | 'add-child' | 'move';
|
|
807
|
+
/**
|
|
808
|
+
* Abstract service interface for menu customization operations.
|
|
809
|
+
* Implement this interface and provide it via AXP_MENU_CUSTOMIZER_SERVICE token.
|
|
810
|
+
*/
|
|
811
|
+
declare abstract class AXPMenuCustomizerService {
|
|
812
|
+
/**
|
|
813
|
+
* Get menu tree nodes for the given scope key
|
|
814
|
+
*/
|
|
815
|
+
abstract getMenuTree(scopeKey: string): Promise<AXTreeViewNode[]>;
|
|
816
|
+
/**
|
|
817
|
+
* Sync tree changes (reorder, move) to storage
|
|
818
|
+
*/
|
|
819
|
+
abstract syncTreeChanges(scopeKey: string, treeNodes: AXTreeViewNode[]): Promise<void>;
|
|
820
|
+
/**
|
|
821
|
+
* Show a hidden menu item
|
|
822
|
+
*/
|
|
823
|
+
abstract showMenuItem(scopeKey: string, menuName: string): Promise<void>;
|
|
824
|
+
/**
|
|
825
|
+
* Hide a menu item
|
|
826
|
+
*/
|
|
827
|
+
abstract hideMenuItem(scopeKey: string, menuName: string): Promise<void>;
|
|
828
|
+
/**
|
|
829
|
+
* Add a custom menu item
|
|
830
|
+
*/
|
|
831
|
+
abstract addCustomMenuItem(scopeKey: string, menuItem: AXPMenuCustomizerItem, parentName: string | null): Promise<void>;
|
|
832
|
+
/**
|
|
833
|
+
* Update a custom menu item
|
|
834
|
+
*/
|
|
835
|
+
abstract updateCustomMenuItem(scopeKey: string, menuName: string, menuItem: AXPMenuCustomizerItem): Promise<void>;
|
|
836
|
+
/**
|
|
837
|
+
* Update menu item properties (for built-in items)
|
|
838
|
+
*/
|
|
839
|
+
abstract updateMenuProperties(scopeKey: string, menuName: string, properties: Partial<AXPMenuCustomizerItem>): Promise<void>;
|
|
840
|
+
/**
|
|
841
|
+
* Delete a custom menu item
|
|
842
|
+
*/
|
|
843
|
+
abstract deleteCustomMenuItem(scopeKey: string, menuName: string): Promise<void>;
|
|
844
|
+
/**
|
|
845
|
+
* Reset all customizations for the scope
|
|
846
|
+
*/
|
|
847
|
+
abstract resetCustomizations(scopeKey: string): Promise<void>;
|
|
848
|
+
}
|
|
849
|
+
/**
|
|
850
|
+
* Injection token for menu customizer service
|
|
851
|
+
*/
|
|
852
|
+
declare const AXP_MENU_CUSTOMIZER_SERVICE: InjectionToken<AXPMenuCustomizerService>;
|
|
853
|
+
|
|
854
|
+
/**
|
|
855
|
+
* Reusable menu customizer component that allows users to reorder, show/hide,
|
|
856
|
+
* and manage menu items using a tree-like interface.
|
|
857
|
+
* Can be used standalone or within popups/dialogs.
|
|
858
|
+
*
|
|
859
|
+
* Requires providing AXP_MENU_CUSTOMIZER_SERVICE with an implementation of AXPMenuCustomizerService.
|
|
860
|
+
*/
|
|
861
|
+
declare class AXPMenuCustomizerComponent implements OnInit, OnDestroy {
|
|
862
|
+
private menuCustomizerService;
|
|
863
|
+
private layoutBuilder;
|
|
864
|
+
protected dialogService: AXDialogService;
|
|
865
|
+
protected toastService: AXToastService;
|
|
866
|
+
private translationService;
|
|
867
|
+
/** The scope key for loading/saving menu customizations (e.g., 'edition:{id}', 'tenant:{id}') */
|
|
868
|
+
scopeKey: _angular_core.InputSignal<string>;
|
|
869
|
+
/** Whether to show the toolbar with collapse/expand/reset actions */
|
|
870
|
+
showToolbar: _angular_core.InputSignal<boolean>;
|
|
871
|
+
/** Whether to allow adding custom menu items */
|
|
872
|
+
allowAddItems: _angular_core.InputSignal<boolean>;
|
|
873
|
+
/** Drag behavior for the tree view: 'none' | 'move' | 'copy' */
|
|
874
|
+
dragBehavior: _angular_core.InputSignal<AXTreeViewDragBehavior>;
|
|
875
|
+
/** Drag area for the tree view: 'node' | 'handler' */
|
|
876
|
+
dragArea: _angular_core.InputSignal<AXTreeViewDragArea>;
|
|
877
|
+
/** Emitted when changes are saved */
|
|
878
|
+
saved: _angular_core.OutputEmitterRef<void>;
|
|
879
|
+
/** Emitted when the customizer is closed/cancelled */
|
|
880
|
+
cancelled: _angular_core.OutputEmitterRef<void>;
|
|
881
|
+
protected tree: _angular_core.Signal<AXTreeViewComponent | undefined>;
|
|
882
|
+
protected treeNodes: _angular_core.WritableSignal<AXTreeViewNode[]>;
|
|
883
|
+
protected isLoading: _angular_core.WritableSignal<boolean>;
|
|
884
|
+
protected error: _angular_core.WritableSignal<string>;
|
|
885
|
+
private isSyncing;
|
|
886
|
+
private destroy$;
|
|
887
|
+
ngOnInit(): Promise<void>;
|
|
888
|
+
ngOnDestroy(): void;
|
|
889
|
+
/**
|
|
890
|
+
* Handle before drop validation
|
|
891
|
+
*/
|
|
892
|
+
handleBeforeDrop(e: AXTreeViewBeforeDropEvent): Promise<void>;
|
|
893
|
+
/**
|
|
894
|
+
* Handle after drop event to sync changes
|
|
895
|
+
* The event contains information about the moved node and its new position
|
|
896
|
+
*/
|
|
897
|
+
handleAfterDrop(event: AXTreeViewDropEvent): Promise<void>;
|
|
898
|
+
/**
|
|
899
|
+
* Load menu tree for current scope
|
|
900
|
+
*/
|
|
901
|
+
loadMenuItems(): Promise<void>;
|
|
902
|
+
/**
|
|
903
|
+
* Sync tree changes to backend
|
|
904
|
+
*/
|
|
905
|
+
private syncTreeChanges;
|
|
906
|
+
/**
|
|
907
|
+
* Collapse all tree nodes
|
|
908
|
+
*/
|
|
909
|
+
collapseAll(): void;
|
|
910
|
+
/**
|
|
911
|
+
* Expand all tree nodes
|
|
912
|
+
*/
|
|
913
|
+
expandAll(): void;
|
|
914
|
+
/**
|
|
915
|
+
* Reset all customizations
|
|
916
|
+
*/
|
|
917
|
+
resetCustomizations(): Promise<void>;
|
|
918
|
+
/**
|
|
919
|
+
* Add new root menu item
|
|
920
|
+
*/
|
|
921
|
+
addRootMenuItem(): Promise<void>;
|
|
922
|
+
/**
|
|
923
|
+
* Handle menu item action
|
|
924
|
+
*/
|
|
925
|
+
protected onAction(action: AXPMenuCustomizerAction, nodeData: AXPMenuCustomizerNodeData): Promise<void>;
|
|
926
|
+
/**
|
|
927
|
+
* Add new child menu item
|
|
928
|
+
*/
|
|
929
|
+
protected addChildMenuItem(parentNodeData: AXPMenuCustomizerNodeData): Promise<void>;
|
|
930
|
+
/**
|
|
931
|
+
* Show menu item
|
|
932
|
+
*/
|
|
933
|
+
private showMenuItem;
|
|
934
|
+
/**
|
|
935
|
+
* Hide menu item
|
|
936
|
+
*/
|
|
937
|
+
private hideMenuItem;
|
|
938
|
+
/**
|
|
939
|
+
* Edit menu item
|
|
940
|
+
*/
|
|
941
|
+
private editMenuItem;
|
|
942
|
+
/**
|
|
943
|
+
* Delete custom menu item
|
|
944
|
+
*/
|
|
945
|
+
private deleteMenuItem;
|
|
946
|
+
/**
|
|
947
|
+
* Show menu item dialog (add/edit)
|
|
948
|
+
*/
|
|
949
|
+
private showMenuItemDialog;
|
|
950
|
+
/**
|
|
951
|
+
* Execute a menu action with common error handling
|
|
952
|
+
*/
|
|
953
|
+
private executeMenuAction;
|
|
954
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPMenuCustomizerComponent, never>;
|
|
955
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPMenuCustomizerComponent, "axp-menu-customizer", never, { "scopeKey": { "alias": "scopeKey"; "required": true; "isSignal": true; }; "showToolbar": { "alias": "showToolbar"; "required": false; "isSignal": true; }; "allowAddItems": { "alias": "allowAddItems"; "required": false; "isSignal": true; }; "dragBehavior": { "alias": "dragBehavior"; "required": false; "isSignal": true; }; "dragArea": { "alias": "dragArea"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
|
|
956
|
+
}
|
|
957
|
+
|
|
768
958
|
/**
|
|
769
959
|
* Represents a spreadsheet item (row or column header) with id, text, and optional description
|
|
770
960
|
*/
|
|
@@ -1293,6 +1483,101 @@ declare class AXPStopwatchComponent implements OnDestroy {
|
|
|
1293
1483
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPStopwatchComponent, "axp-stopwatch", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "timeLimit": { "alias": "timeLimit"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "autoStart": { "alias": "autoStart"; "required": false; "isSignal": true; }; "showControls": { "alias": "showControls"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "timeUp": "timeUp"; }, never, never, true, never>;
|
|
1294
1484
|
}
|
|
1295
1485
|
|
|
1486
|
+
/**
|
|
1487
|
+
* Builds the AXPWidgetNode tree for the table-columns-editor when using AXPLayoutRendererComponent.
|
|
1488
|
+
* Root: repeater-layout (path: 'columns') with add/remove controls.
|
|
1489
|
+
* Each row: form-field for name (text-editor), form-field for title (text-editor), form-field for widget (widget-field-configurator).
|
|
1490
|
+
*/
|
|
1491
|
+
declare function buildTableColumnsEditorLayout(): AXPWidgetNode;
|
|
1492
|
+
|
|
1493
|
+
/**
|
|
1494
|
+
* Definition for a single table column (name, title, widget).
|
|
1495
|
+
* Used by table-columns-editor and table-data-editor.
|
|
1496
|
+
*/
|
|
1497
|
+
interface AXPTableColumnDefinition {
|
|
1498
|
+
name: string;
|
|
1499
|
+
title: string;
|
|
1500
|
+
widget: AXPWidgetNode;
|
|
1501
|
+
}
|
|
1502
|
+
|
|
1503
|
+
declare class AXPTableColumnsEditorPopupComponent extends AXBasePageComponent {
|
|
1504
|
+
protected readonly I18N: {
|
|
1505
|
+
readonly title: "@general:widgets.table-columns-editor.popup-title";
|
|
1506
|
+
readonly cancel: "@general:actions.cancel.title";
|
|
1507
|
+
readonly save: "@general:actions.save.title";
|
|
1508
|
+
};
|
|
1509
|
+
columns: _angular_core.InputSignal<AXPTableColumnDefinition[]>;
|
|
1510
|
+
localColumns: _angular_core.ModelSignal<AXPTableColumnDefinition[]>;
|
|
1511
|
+
constructor();
|
|
1512
|
+
protected handleCancel(): void;
|
|
1513
|
+
protected handleSave(): void;
|
|
1514
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPTableColumnsEditorPopupComponent, never>;
|
|
1515
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPTableColumnsEditorPopupComponent, "axp-table-columns-editor-popup", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "localColumns": { "alias": "localColumns"; "required": false; "isSignal": true; }; }, { "localColumns": "localColumnsChange"; }, never, never, true, never>;
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
declare class AXPTableColumnsEditorComponent {
|
|
1519
|
+
/** Layout tree: repeater (path: columns) with form-fields for name, title, widget. */
|
|
1520
|
+
protected readonly columnsEditorLayout: _angular_core.WritableSignal<_acorex_platform_layout_widget_core.AXPWidgetNode>;
|
|
1521
|
+
/** Two-way: list of column definitions (synced with editorContext.columns). */
|
|
1522
|
+
columns: _angular_core.ModelSignal<AXPTableColumnDefinition[]>;
|
|
1523
|
+
/** Context for the layout renderer; must hold { columns: AXPTableColumnDefinition[] }. */
|
|
1524
|
+
protected readonly editorContext: _angular_core.ModelSignal<{
|
|
1525
|
+
columns: AXPTableColumnDefinition[];
|
|
1526
|
+
}>;
|
|
1527
|
+
constructor();
|
|
1528
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPTableColumnsEditorComponent, never>;
|
|
1529
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPTableColumnsEditorComponent, "axp-table-columns-editor", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "editorContext": { "alias": "editorContext"; "required": false; "isSignal": true; }; }, { "columns": "columnsChange"; "editorContext": "editorContextChange"; }, never, never, true, never>;
|
|
1530
|
+
}
|
|
1531
|
+
|
|
1532
|
+
interface AXPTableColumnsEditorOpenOptions {
|
|
1533
|
+
title?: string;
|
|
1534
|
+
columns?: AXPTableColumnDefinition[];
|
|
1535
|
+
}
|
|
1536
|
+
declare class AXPTableColumnsEditorService {
|
|
1537
|
+
private readonly popupService;
|
|
1538
|
+
private readonly translationService;
|
|
1539
|
+
open(options?: AXPTableColumnsEditorOpenOptions): Promise<AXPTableColumnDefinition[] | null>;
|
|
1540
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPTableColumnsEditorService, never>;
|
|
1541
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPTableColumnsEditorService>;
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
declare class AXPTableDataEditorPopupComponent extends AXBasePageComponent {
|
|
1545
|
+
protected readonly I18N: {
|
|
1546
|
+
readonly title: "@general:widgets.table-data-editor.popup-title";
|
|
1547
|
+
readonly cancel: "@general:actions.cancel.title";
|
|
1548
|
+
readonly save: "@general:actions.save.title";
|
|
1549
|
+
};
|
|
1550
|
+
columns: _angular_core.InputSignal<AXPTableColumnDefinition[]>;
|
|
1551
|
+
rows: _angular_core.InputSignal<Record<string, unknown>[]>;
|
|
1552
|
+
localRows: _angular_core.ModelSignal<Record<string, unknown>[]>;
|
|
1553
|
+
constructor();
|
|
1554
|
+
protected handleCancel(): void;
|
|
1555
|
+
protected handleSave(): void;
|
|
1556
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPTableDataEditorPopupComponent, never>;
|
|
1557
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPTableDataEditorPopupComponent, "axp-table-data-editor-popup", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "localRows": { "alias": "localRows"; "required": false; "isSignal": true; }; }, { "localRows": "localRowsChange"; }, never, never, true, never>;
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
declare class AXPTableDataEditorComponent {
|
|
1561
|
+
columns: _angular_core.InputSignal<AXPTableColumnDefinition[]>;
|
|
1562
|
+
rowsModel: _angular_core.ModelSignal<Record<string, unknown>[]>;
|
|
1563
|
+
protected readonly spreadsheetColumns: _angular_core.Signal<AXPSpreadsheetColumn[]>;
|
|
1564
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPTableDataEditorComponent, never>;
|
|
1565
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPTableDataEditorComponent, "axp-table-data-editor", never, { "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "rowsModel": { "alias": "rowsModel"; "required": false; "isSignal": true; }; }, { "rowsModel": "rowsModelChange"; }, never, never, true, never>;
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
interface AXPTableDataEditorOpenOptions {
|
|
1569
|
+
title?: string;
|
|
1570
|
+
columns: AXPTableColumnDefinition[];
|
|
1571
|
+
rows?: Record<string, unknown>[];
|
|
1572
|
+
}
|
|
1573
|
+
declare class AXPTableDataEditorService {
|
|
1574
|
+
private readonly popupService;
|
|
1575
|
+
private readonly translationService;
|
|
1576
|
+
open(options: AXPTableDataEditorOpenOptions): Promise<Record<string, unknown>[] | null>;
|
|
1577
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPTableDataEditorService, never>;
|
|
1578
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPTableDataEditorService>;
|
|
1579
|
+
}
|
|
1580
|
+
|
|
1296
1581
|
interface AXPTemplateViewerConfig {
|
|
1297
1582
|
template: AXPWidgetNode | string;
|
|
1298
1583
|
title?: string;
|
|
@@ -1518,10 +1803,18 @@ declare class AXPWidgetFieldConfiguratorComponent {
|
|
|
1518
1803
|
* Whether preview button should be enabled
|
|
1519
1804
|
*/
|
|
1520
1805
|
protected canPreview: _angular_core.Signal<boolean>;
|
|
1806
|
+
/**
|
|
1807
|
+
* Reference to the widget type select box (used to open dropdown when entering edit mode)
|
|
1808
|
+
*/
|
|
1809
|
+
protected widgetSelectBox: _angular_core.Signal<AXSelectBoxComponent | undefined>;
|
|
1521
1810
|
/**
|
|
1522
1811
|
* Enter edit mode (show select box)
|
|
1523
1812
|
*/
|
|
1524
1813
|
protected enterEditMode(): void;
|
|
1814
|
+
/**
|
|
1815
|
+
* Exit edit mode when dropdown is closed (return to view mode)
|
|
1816
|
+
*/
|
|
1817
|
+
protected exitEditMode(): void;
|
|
1525
1818
|
constructor();
|
|
1526
1819
|
/**
|
|
1527
1820
|
* Handle widget type change
|
|
@@ -1703,5 +1996,5 @@ declare class AXPWidgetPropertyViewerService {
|
|
|
1703
1996
|
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXPWidgetPropertyViewerService>;
|
|
1704
1997
|
}
|
|
1705
1998
|
|
|
1706
|
-
export { AXPActivityLogComponent, AXPCategoryTreeComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPImageEditorPopupComponent, AXPImageEditorService, AXPLogoComponent, AXPMenuBadgeHelper, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPSpreadsheetComponent, AXPStateMessageComponent, AXPStopwatchComponent, 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_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER };
|
|
1707
|
-
export type { AXPCategoryTreeActions, AXPCategoryTreeConfig, AXPCategoryTreeDataSource, AXPCategoryTreeEvents, AXPCategoryTreeNode, AXPColumnItemListItem, AXPCompareViewField, AXPCompareViewInputs, AXPCompareViewMode, AXPCompareViewObject, AXPComponentSlotConfig, AXPComponentSlotModuleConfigs, AXPDataSelectorColumn, AXPDataSelectorConfig, AXPDragDropListConfig, AXPDragDropListDropEvent, AXPDragDropListItem, AXPImageEditorOpenOptions, AXPPropertyViewerChangedEvent, AXPPropertyViewerConfig, AXPPropertyViewerGroup, AXPPropertyViewerResult, AXPPropertyViewerTab, AXPSpreadsheetCellChangeEvent, AXPSpreadsheetCellValue, AXPSpreadsheetColumn, AXPSpreadsheetConfig, AXPSpreadsheetData, AXPSpreadsheetItem, AXPSpreadsheetRowChangeEvent, AXPSpreadsheetRowMode, AXPTemplateViewerConfig, AXPTemplateViewerResult, AXPUserAvatarData, AXPUserAvatarProvider, AXPUserAvatarSize, AXPUserAvatarStatus, AXPWidgetItemClickEvent, AXPWidgetItemData, AXPWidgetPropertiesChangedEvent, AXPWidgetPropertyInjection, AXPWidgetPropertyViewerConfig, AXPWidgetPropertyViewerResult, StateMode };
|
|
1999
|
+
export { AXPActivityLogComponent, AXPCategoryTreeComponent, AXPColorPalettePickerComponent, AXPColumnItemListComponent, AXPCompareViewComponent, AXPComponentSlot, AXPComponentSlotDirective, AXPComponentSlotModule, AXPComponentSlotRegistryService, AXPDataSelectorComponent, AXPDataSelectorService, AXPDragDropListComponent, AXPImageEditorPopupComponent, AXPImageEditorService, AXPLogoComponent, AXPMenuBadgeHelper, AXPMenuCustomizerComponent, AXPMenuCustomizerService, AXPPropertyViewerComponent, AXPPropertyViewerPopupComponent, AXPPropertyViewerService, AXPQueryColumnsComponent, AXPQueryFiltersComponent, AXPQuerySortsComponent, AXPQueryViewsComponent, AXPSpreadsheetComponent, AXPStateMessageComponent, AXPStopwatchComponent, AXPTableColumnsEditorComponent, AXPTableColumnsEditorPopupComponent, AXPTableColumnsEditorService, AXPTableDataEditorComponent, AXPTableDataEditorPopupComponent, AXPTableDataEditorService, AXPTaskBadgeDirective, AXPTaskBadgeProvider, AXPTaskBadgeService, AXPTemplateViewerComponent, AXPTemplateViewerService, AXPThemeLayoutActionsComponent, AXPThemeLayoutBlockComponent, AXPThemeLayoutContainerComponent, AXPThemeLayoutEndSideComponent, AXPThemeLayoutFooterComponent, AXPThemeLayoutHeaderComponent, AXPThemeLayoutListComponent, AXPThemeLayoutListItemComponent, AXPThemeLayoutListItemsGroupComponent, AXPThemeLayoutPageHeaderComponent, AXPThemeLayoutPagePrimaryActionsComponent, AXPThemeLayoutPageSecondaryActionsComponent, AXPThemeLayoutSectionComponent, AXPThemeLayoutStartSideComponent, AXPThemeLayoutToolbarComponent, AXPUserAvatarComponent, AXPUserAvatarService, AXPWidgetFieldConfiguratorComponent, AXPWidgetItemComponent, AXPWidgetPropertyViewerComponent, AXPWidgetPropertyViewerPopupComponent, AXPWidgetPropertyViewerService, AXP_MENU_CUSTOMIZER_SERVICE, AXP_TASK_BADGE_PROVIDERS, AXP_USER_AVATAR_PROVIDER, buildTableColumnsEditorLayout };
|
|
2000
|
+
export type { AXPCategoryTreeActions, AXPCategoryTreeConfig, AXPCategoryTreeDataSource, AXPCategoryTreeEvents, AXPCategoryTreeNode, AXPColumnItemListItem, AXPCompareViewField, AXPCompareViewInputs, AXPCompareViewMode, AXPCompareViewObject, AXPComponentSlotConfig, AXPComponentSlotModuleConfigs, AXPDataSelectorColumn, AXPDataSelectorConfig, AXPDragDropListConfig, AXPDragDropListDropEvent, AXPDragDropListItem, AXPImageEditorOpenOptions, AXPMenuCustomizerAction, AXPMenuCustomizerItem, AXPMenuCustomizerNodeData, AXPMenuCustomizerNodeMetadata, AXPPropertyViewerChangedEvent, AXPPropertyViewerConfig, AXPPropertyViewerGroup, AXPPropertyViewerResult, AXPPropertyViewerTab, AXPSpreadsheetCellChangeEvent, AXPSpreadsheetCellValue, AXPSpreadsheetColumn, AXPSpreadsheetConfig, AXPSpreadsheetData, AXPSpreadsheetItem, AXPSpreadsheetRowChangeEvent, AXPSpreadsheetRowMode, AXPTableColumnDefinition, AXPTableColumnsEditorOpenOptions, AXPTableDataEditorOpenOptions, AXPTemplateViewerConfig, AXPTemplateViewerResult, AXPUserAvatarData, AXPUserAvatarProvider, AXPUserAvatarSize, AXPUserAvatarStatus, AXPWidgetItemClickEvent, AXPWidgetItemData, AXPWidgetPropertiesChangedEvent, AXPWidgetPropertyInjection, AXPWidgetPropertyViewerConfig, AXPWidgetPropertyViewerResult, StateMode };
|
package/layout/entity/index.d.ts
CHANGED
|
@@ -15,10 +15,10 @@ import { Subject } from 'rxjs';
|
|
|
15
15
|
import * as i2 from '@acorex/platform/workflow';
|
|
16
16
|
import { AXPWorkflowService, AXPWorkflowAction, AXPWorkflowContext, AXPWorkflow } from '@acorex/platform/workflow';
|
|
17
17
|
import { AXPSessionService } from '@acorex/platform/auth';
|
|
18
|
-
import { AXTreeViewNode, AXTreeViewComponent,
|
|
18
|
+
import { AXTreeViewNode, AXTreeViewComponent, AXTreeViewNodeSelectEvent } from '@acorex/components/tree-view';
|
|
19
19
|
import { AXTranslationService } from '@acorex/core/translation';
|
|
20
20
|
import { AXPopupSizeType, AXPopupService } from '@acorex/components/popup';
|
|
21
|
-
import { IActionBuilder,
|
|
21
|
+
import { IActionBuilder, AXPDialogRef, IFormFieldBuilder } from '@acorex/platform/layout/builder';
|
|
22
22
|
import { AXBasePageComponent } from '@acorex/components/page';
|
|
23
23
|
import { AXFormatService } from '@acorex/core/format';
|
|
24
24
|
import { AXPColumnItemListItem, AXPCategoryTreeDataSource } from '@acorex/platform/layout/components';
|
|
@@ -27,12 +27,9 @@ import { AXPDataListWidgetComponentOptions } from '@acorex/platform/layout/widge
|
|
|
27
27
|
|
|
28
28
|
declare class AXPCreateEntityCommand implements AXPCommand<any, any> {
|
|
29
29
|
private entityForm;
|
|
30
|
-
private settingsService;
|
|
31
30
|
private entityService;
|
|
32
31
|
private toastService;
|
|
33
32
|
private translationService;
|
|
34
|
-
private eventService;
|
|
35
|
-
private platform;
|
|
36
33
|
protected context: {};
|
|
37
34
|
execute(input: any): Promise<AXPExecuteCommandResult<any>>;
|
|
38
35
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPCreateEntityCommand, never>;
|
|
@@ -1274,6 +1271,14 @@ interface IPropertyFilterStage {
|
|
|
1274
1271
|
size(size: AXPopupSizeType): IPropertyFilterStage;
|
|
1275
1272
|
/** Configure footer actions (cancel/submit/custom). If not called, defaults to cancel+submit. */
|
|
1276
1273
|
actions(delegate: (a: IActionBuilder) => void): IPropertyFilterStage;
|
|
1274
|
+
/**
|
|
1275
|
+
* Handler invoked when user clicks an action. Receives AXPDialogRef.
|
|
1276
|
+
* If handler throws, dialog stays open for retry.
|
|
1277
|
+
* If handler returns, dialog closes and show() resolves with the return value.
|
|
1278
|
+
*/
|
|
1279
|
+
onAction<T = any>(handler: (dialogRef: AXPDialogRef) => T | Promise<T>): IPropertyFilterStage & {
|
|
1280
|
+
show(): Promise<T>;
|
|
1281
|
+
};
|
|
1277
1282
|
/** Add an extra field into a specific group, using the original field builder API */
|
|
1278
1283
|
field(groupId: string, path: string, delegate?: (field: CompatFormFieldBuilder) => void): IPropertyFilterStage;
|
|
1279
1284
|
/** Build and return the widget node without showing dialog */
|
|
@@ -1408,7 +1413,6 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
|
|
|
1408
1413
|
private relevantNodeIds;
|
|
1409
1414
|
private expandedNodesBeforeSearch;
|
|
1410
1415
|
private nodesExpandedDuringSearch;
|
|
1411
|
-
private isInitializing;
|
|
1412
1416
|
ngOnInit(): void;
|
|
1413
1417
|
private initializeTree;
|
|
1414
1418
|
/**
|
|
@@ -1447,9 +1451,12 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
|
|
|
1447
1451
|
* Resets search state and restores tree to original expanded state
|
|
1448
1452
|
*/
|
|
1449
1453
|
private resetSearch;
|
|
1450
|
-
|
|
1454
|
+
/**
|
|
1455
|
+
* Restores selection state after tree reload.
|
|
1456
|
+
* Expands ancestor nodes and selects the previously selected leaf nodes.
|
|
1457
|
+
*/
|
|
1458
|
+
private restoreSelectionAfterReload;
|
|
1451
1459
|
protected onNodeSelect(event: AXTreeViewNodeSelectEvent): Promise<void>;
|
|
1452
|
-
protected onSelectionChange(event: AXTreeViewSelectionChangeEvent): Promise<void>;
|
|
1453
1460
|
/** Datasource callback for tree-view component. */
|
|
1454
1461
|
protected datasource: (id?: string) => Promise<AXTreeViewNode[]>;
|
|
1455
1462
|
protected onConfirm(): Promise<void>;
|
|
@@ -1467,55 +1474,33 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
|
|
|
1467
1474
|
*/
|
|
1468
1475
|
protected isNodeSelected(nodeId: string | number | undefined): boolean;
|
|
1469
1476
|
/**
|
|
1470
|
-
*
|
|
1471
|
-
*
|
|
1472
|
-
* Parent states are calculated based on leaf descendants
|
|
1473
|
-
*/
|
|
1474
|
-
protected handleCheckboxChange(nodeId: string | number | undefined, checked: boolean): Promise<void>;
|
|
1475
|
-
/**
|
|
1476
|
-
* Selects all leaf descendants of a node (and the node itself if it's a leaf)
|
|
1477
|
-
*/
|
|
1478
|
-
private selectLeafDescendants;
|
|
1479
|
-
/**
|
|
1480
|
-
* Deselects all leaf descendants of a node (and the node itself if it's a leaf)
|
|
1477
|
+
* Expands parent nodes, collects all LEAF descendants, and selects them visually.
|
|
1478
|
+
* If the parent itself is a leaf (no children), it will be added.
|
|
1481
1479
|
*/
|
|
1482
|
-
private
|
|
1480
|
+
private selectAllLeafDescendants;
|
|
1483
1481
|
/**
|
|
1484
|
-
*
|
|
1485
|
-
*
|
|
1482
|
+
* Removes all LEAF descendants from selectedNodeIds.
|
|
1483
|
+
* For 'all' node: clears everything and uses tree's deselectAll().
|
|
1484
|
+
* For other nodes: tree handles visual state via user click.
|
|
1486
1485
|
*/
|
|
1487
|
-
private
|
|
1486
|
+
private deselectAllLeafDescendants;
|
|
1488
1487
|
/**
|
|
1489
|
-
*
|
|
1488
|
+
* Recursively expands parent nodes and collects LEAF node IDs.
|
|
1489
|
+
* When treeComponent is provided, expands each parent node before loading children.
|
|
1490
1490
|
*/
|
|
1491
|
-
private
|
|
1491
|
+
private collectLeafNodes;
|
|
1492
1492
|
/**
|
|
1493
|
-
*
|
|
1493
|
+
* Checks if a node has children
|
|
1494
1494
|
*/
|
|
1495
|
-
private
|
|
1495
|
+
private nodeHasChildren;
|
|
1496
1496
|
/**
|
|
1497
|
-
*
|
|
1497
|
+
* Checks if a node is a leaf (has no children)
|
|
1498
1498
|
*/
|
|
1499
|
-
private
|
|
1499
|
+
private isLeafNodeCheck;
|
|
1500
1500
|
/**
|
|
1501
|
-
*
|
|
1501
|
+
* Caches node data from a tree node
|
|
1502
1502
|
*/
|
|
1503
|
-
private
|
|
1504
|
-
/**
|
|
1505
|
-
* Recursively deselects all children of a parent node
|
|
1506
|
-
*/
|
|
1507
|
-
private loadAndDeselectChildrenRecursively;
|
|
1508
|
-
/**
|
|
1509
|
-
* Updates parent states based on children selection (select/intermediate)
|
|
1510
|
-
* Called after a node is selected/deselected to update parent checkbox states
|
|
1511
|
-
*/
|
|
1512
|
-
private updateParentStates;
|
|
1513
|
-
/**
|
|
1514
|
-
* Recursively loads and selects all children of a parent node using the datasource
|
|
1515
|
-
* This method directly calls datasource without expanding/collapsing nodes to avoid UI glitches
|
|
1516
|
-
*/
|
|
1517
|
-
private loadAndSelectChildrenRecursively;
|
|
1518
|
-
private updateSelectedNodes;
|
|
1503
|
+
private cacheNodeFromTreeNode;
|
|
1519
1504
|
/**
|
|
1520
1505
|
* Builds complete ancestor chains for all selected node IDs.
|
|
1521
1506
|
* Returns a Map where key is the selected node ID and value is array of ancestor IDs from root to parent.
|
|
@@ -1560,7 +1545,8 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
|
|
|
1560
1545
|
*/
|
|
1561
1546
|
private processRootNode;
|
|
1562
1547
|
/**
|
|
1563
|
-
* Processes child nodes: marks excluded as disabled
|
|
1548
|
+
* Processes child nodes: marks excluded as disabled
|
|
1549
|
+
* Selection marking is handled in datasource callback ONLY during initial load
|
|
1564
1550
|
*/
|
|
1565
1551
|
private processChildNodes;
|
|
1566
1552
|
/**
|
|
@@ -1585,14 +1571,6 @@ declare class AXPEntityCategoryTreeSelectorComponent extends AXBasePageComponent
|
|
|
1585
1571
|
* Get the display title for a node.
|
|
1586
1572
|
*/
|
|
1587
1573
|
private getNodeTitle;
|
|
1588
|
-
/**
|
|
1589
|
-
* Checks if a node is a leaf node (has no children)
|
|
1590
|
-
*/
|
|
1591
|
-
private isLeafNode;
|
|
1592
|
-
/**
|
|
1593
|
-
* Checks if a node has children by querying the data source
|
|
1594
|
-
*/
|
|
1595
|
-
private checkIfNodeHasChildren;
|
|
1596
1574
|
private getSelectedItems;
|
|
1597
1575
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXPEntityCategoryTreeSelectorComponent, never>;
|
|
1598
1576
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXPEntityCategoryTreeSelectorComponent, "axp-entity-category-tree-selector", never, {}, {}, never, never, true, never>;
|