verben-workflow-ui 0.2.2 → 0.2.4
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/esm2022/lib/components/designer/models/types.mjs +1 -1
- package/esm2022/lib/components/designer/services/wf-mapper.service.mjs +3 -3
- package/esm2022/lib/components/workflow-designer/conditions-popup/conditions-popup.component.mjs +76 -0
- package/esm2022/lib/components/workflow-designer/decision-popup/decision-popup.component.mjs +65 -0
- package/esm2022/lib/components/workflow-designer/designer-canvas/designer-canvas.component.mjs +245 -17
- package/esm2022/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.mjs +26 -14
- package/esm2022/lib/components/workflow-designer/services/connection.service.mjs +220 -0
- package/esm2022/lib/components/workflow-designer/services/node-management.service.mjs +288 -0
- package/esm2022/lib/components/workflow-designer/services/popup.service.mjs +235 -0
- package/esm2022/lib/components/workflow-designer/services/swimlane.service.mjs +145 -0
- package/esm2022/lib/components/workflow-designer/services/transformer.service.mjs +260 -0
- package/esm2022/lib/components/workflow-designer/stage-dialog/stage-dialog.component.mjs +67 -11
- package/esm2022/lib/components/workflow-designer/stage-node/stage-node.component.mjs +9 -18
- package/esm2022/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.mjs +30 -24
- package/esm2022/lib/components/workflow-designer/workflow-data.service.mjs +2 -2
- package/esm2022/lib/components/workflow-designer/workflow-designer.component.mjs +138 -96
- package/esm2022/lib/components/workflow-designer/workflow-designer.module.mjs +27 -3
- package/esm2022/lib/components/workflow-designer/workflow-designer.state.mjs +243 -205
- package/esm2022/lib/components/workflow-designer/workflow-designer.types.mjs +1 -1
- package/esm2022/lib/models/SwimLane.mjs +1 -1
- package/esm2022/lib/models/Workflow.mjs +1 -1
- package/esm2022/lib/models/WorkflowStage.mjs +1 -1
- package/esm2022/lib/services/http-web-request.service.mjs +2 -2
- package/fesm2022/verben-workflow-ui.mjs +2644 -1005
- package/fesm2022/verben-workflow-ui.mjs.map +1 -1
- package/lib/components/designer/models/types.d.ts +1 -1
- package/lib/components/workflow-designer/conditions-popup/conditions-popup.component.d.ts +34 -0
- package/lib/components/workflow-designer/decision-popup/decision-popup.component.d.ts +26 -0
- package/lib/components/workflow-designer/designer-canvas/designer-canvas.component.d.ts +35 -1
- package/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.d.ts +14 -3
- package/lib/components/workflow-designer/services/connection.service.d.ts +85 -0
- package/lib/components/workflow-designer/services/node-management.service.d.ts +52 -0
- package/lib/components/workflow-designer/services/popup.service.d.ts +139 -0
- package/lib/components/workflow-designer/services/swimlane.service.d.ts +51 -0
- package/lib/components/workflow-designer/services/transformer.service.d.ts +36 -0
- package/lib/components/workflow-designer/stage-dialog/stage-dialog.component.d.ts +17 -2
- package/lib/components/workflow-designer/stage-node/stage-node.component.d.ts +2 -2
- package/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.d.ts +7 -1
- package/lib/components/workflow-designer/workflow-designer.component.d.ts +2 -1
- package/lib/components/workflow-designer/workflow-designer.module.d.ts +6 -4
- package/lib/components/workflow-designer/workflow-designer.state.d.ts +17 -1
- package/lib/components/workflow-designer/workflow-designer.types.d.ts +2 -0
- package/lib/models/SwimLane.d.ts +1 -0
- package/lib/models/Workflow.d.ts +1 -0
- package/lib/models/WorkflowStage.d.ts +1 -1
- package/package.json +1 -1
- package/styles/styles.css +23 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { WorkflowDesignerState } from '../workflow-designer.state';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
interface ConnectionCondition {
|
|
5
|
+
connectionId: string;
|
|
6
|
+
sourceNodeId: string;
|
|
7
|
+
targetNodeId: string;
|
|
8
|
+
targetNodeName: string;
|
|
9
|
+
condition: string;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class ConditionsPopupComponent {
|
|
13
|
+
private state;
|
|
14
|
+
visible: boolean;
|
|
15
|
+
decisionNodeId: string;
|
|
16
|
+
newConnectionId: string;
|
|
17
|
+
popupX: number;
|
|
18
|
+
popupY: number;
|
|
19
|
+
closed: EventEmitter<any>;
|
|
20
|
+
saved: EventEmitter<{
|
|
21
|
+
connectionId: string;
|
|
22
|
+
condition: string;
|
|
23
|
+
}>;
|
|
24
|
+
connectionConditions: ConnectionCondition[];
|
|
25
|
+
currentCondition: string;
|
|
26
|
+
constructor(state: WorkflowDesignerState);
|
|
27
|
+
ngOnInit(): void;
|
|
28
|
+
loadConnectionConditions(): void;
|
|
29
|
+
saveCondition(): void;
|
|
30
|
+
onClose(): void;
|
|
31
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ConditionsPopupComponent, never>;
|
|
32
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ConditionsPopupComponent, "lib-conditions-popup", never, { "visible": { "alias": "visible"; "required": false; }; "decisionNodeId": { "alias": "decisionNodeId"; "required": false; }; "newConnectionId": { "alias": "newConnectionId"; "required": false; }; "popupX": { "alias": "popupX"; "required": false; }; "popupY": { "alias": "popupY"; "required": false; }; }, { "closed": "closed"; "saved": "saved"; }, never, never, false, never>;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { WorkflowDesignerState } from '../workflow-designer.state';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
interface ConnectionCondition {
|
|
5
|
+
connectionId: string;
|
|
6
|
+
sourceNodeId: string;
|
|
7
|
+
targetNodeId: string;
|
|
8
|
+
condition: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class DecisionPopupComponent {
|
|
11
|
+
private state;
|
|
12
|
+
visible: boolean;
|
|
13
|
+
decisionNodeId: string;
|
|
14
|
+
popupX: number;
|
|
15
|
+
popupY: number;
|
|
16
|
+
closed: EventEmitter<any>;
|
|
17
|
+
showDuration: boolean;
|
|
18
|
+
constructor(state: WorkflowDesignerState);
|
|
19
|
+
getConnectionConditions(): ConnectionCondition[];
|
|
20
|
+
getTargetNodeName(nodeId: string): string;
|
|
21
|
+
getDuration(): number;
|
|
22
|
+
onClose(): void;
|
|
23
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<DecisionPopupComponent, never>;
|
|
24
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DecisionPopupComponent, "lib-decision-popup", never, { "visible": { "alias": "visible"; "required": false; }; "decisionNodeId": { "alias": "decisionNodeId"; "required": false; }; "popupX": { "alias": "popupX"; "required": false; }; "popupY": { "alias": "popupY"; "required": false; }; }, { "closed": "closed"; }, never, never, false, never>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -23,6 +23,12 @@ export declare class DesignerCanvasComponent implements OnInit {
|
|
|
23
23
|
showStageDialog: EventEmitter<{
|
|
24
24
|
position: any;
|
|
25
25
|
isFromConnection: boolean;
|
|
26
|
+
isFromDecision?: boolean;
|
|
27
|
+
nodeId: string;
|
|
28
|
+
}>;
|
|
29
|
+
stagePropertiesUpdated: EventEmitter<{
|
|
30
|
+
nodeId: string;
|
|
31
|
+
stageData: Partial<WorkflowStage>;
|
|
26
32
|
}>;
|
|
27
33
|
canvasRef: ElementRef<SVGElement>;
|
|
28
34
|
onWindowMouseUp(event: MouseEvent): void;
|
|
@@ -50,11 +56,31 @@ export declare class DesignerCanvasComponent implements OnInit {
|
|
|
50
56
|
x: number;
|
|
51
57
|
y: number;
|
|
52
58
|
} | null;
|
|
59
|
+
pendingDecisionConnection: {
|
|
60
|
+
decisionNodeId: string;
|
|
61
|
+
swimlaneIndex: number;
|
|
62
|
+
x: number;
|
|
63
|
+
y: number;
|
|
64
|
+
} | null;
|
|
53
65
|
pendingConnectionSourcePoint: ConnectionPoint | null;
|
|
54
66
|
pendingConnectionSourceSwimlaneIndex: number | null;
|
|
67
|
+
showDecisionConditionDialog: boolean;
|
|
68
|
+
showConditionsDialog: boolean;
|
|
69
|
+
activeDecisionNodeId: string;
|
|
70
|
+
activeConnectionId: string;
|
|
71
|
+
decisionConditionPopupX: number;
|
|
72
|
+
decisionConditionPopupY: number;
|
|
73
|
+
isCreatingStageFromDecision: boolean;
|
|
74
|
+
pendingDecisionCondition: string;
|
|
75
|
+
activeStageId: string | null;
|
|
76
|
+
showStageDialogLocal: boolean;
|
|
77
|
+
activeStageData: Partial<WorkflowStage>;
|
|
55
78
|
constructor(state: WorkflowDesignerState, dataService: WorkflowDataService);
|
|
56
79
|
ngOnInit(): void;
|
|
57
80
|
onCanvasClick(event: MouseEvent): void;
|
|
81
|
+
onShowShieldDialog(stageId: string): void;
|
|
82
|
+
onStageDialogClosed(): void;
|
|
83
|
+
onStageDialogSaved(stageData: Partial<WorkflowStage>): void;
|
|
58
84
|
updateCanvasSize(): void;
|
|
59
85
|
private getMousePosition;
|
|
60
86
|
showConnectionPoints(nodeId: string, swimlaneIndex: number): void;
|
|
@@ -69,12 +95,18 @@ export declare class DesignerCanvasComponent implements OnInit {
|
|
|
69
95
|
isConnectionPointVisible(nodeId: string): boolean;
|
|
70
96
|
startConnectionDrag(event: MouseEvent, point: ConnectionPoint, swimlaneIndex: number): void;
|
|
71
97
|
onMouseMove: (event: MouseEvent) => void;
|
|
98
|
+
updateConnectionDrag(currentX: number, currentY: number): void;
|
|
72
99
|
onMouseUp: (event: MouseEvent) => void;
|
|
73
100
|
isPositionInsideSwimlane(y: number): boolean;
|
|
74
101
|
showConnectionPopup(x: number, y: number): void;
|
|
75
102
|
hideConnectionPopup(): void;
|
|
76
103
|
onDocumentClick(event: MouseEvent): void;
|
|
77
104
|
createNodeConnection(nodeType: string): void;
|
|
105
|
+
onDecisionConditionSaved(event: {
|
|
106
|
+
connectionId: string;
|
|
107
|
+
condition: string;
|
|
108
|
+
}): void;
|
|
109
|
+
onDecisionConditionCancelled(): void;
|
|
78
110
|
getConnectionPath(): string;
|
|
79
111
|
getConnectionPathForSavedConnection(connection: Connection): string;
|
|
80
112
|
getOrthogonalPath(startX: number, startY: number, endX: number, endY: number, pointType: 'top' | 'right' | 'bottom' | 'left'): string;
|
|
@@ -89,6 +121,8 @@ export declare class DesignerCanvasComponent implements OnInit {
|
|
|
89
121
|
selectStartNodeForm(form: FormEntity | null): void;
|
|
90
122
|
showSubflowSelectionPopup(x: number, y: number, swimlaneIndex: number): void;
|
|
91
123
|
selectSubflowWorkflow(workflow: Workflow): void;
|
|
124
|
+
showDecisionConditionsPopup(event: MouseEvent, node: WFNode, swimlaneIndex: number): void;
|
|
125
|
+
ensureSwimlaneInView(swimlaneIndex: number): void;
|
|
92
126
|
static ɵfac: i0.ɵɵFactoryDeclaration<DesignerCanvasComponent, never>;
|
|
93
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DesignerCanvasComponent, "lib-designer-canvas", never, { "selectedTool": { "alias": "selectedTool"; "required": false; }; }, { "clickedPosition": "clickedPosition"; "subflowSelected": "subflowSelected"; "showStageDialog": "showStageDialog"; }, never, never, false, never>;
|
|
127
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DesignerCanvasComponent, "lib-designer-canvas", never, { "selectedTool": { "alias": "selectedTool"; "required": false; }; }, { "clickedPosition": "clickedPosition"; "subflowSelected": "subflowSelected"; "showStageDialog": "showStageDialog"; "stagePropertiesUpdated": "stagePropertiesUpdated"; }, never, never, false, never>;
|
|
94
128
|
}
|
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
import { EventEmitter } from '@angular/core';
|
|
2
2
|
import { ToolType } from '../workflow-designer.types';
|
|
3
3
|
import { ToolbarItem } from './designer-toolbar.types';
|
|
4
|
-
import {
|
|
4
|
+
import { NodeManagementService } from '../services/node-management.service';
|
|
5
|
+
import { SwimlaneService } from '../services/swimlane.service';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
7
|
export declare class DesignerToolbarComponent {
|
|
7
|
-
private
|
|
8
|
+
private nodeService;
|
|
9
|
+
private swimlaneService;
|
|
8
10
|
selectedTool: ToolType;
|
|
9
11
|
isSaving: boolean;
|
|
10
12
|
toolSelected: EventEmitter<ToolType>;
|
|
11
13
|
saveWorkflow: EventEmitter<void>;
|
|
12
14
|
toolbarItems: ToolbarItem[];
|
|
13
|
-
constructor(
|
|
15
|
+
constructor(nodeService: NodeManagementService, swimlaneService: SwimlaneService);
|
|
16
|
+
/**
|
|
17
|
+
* Handle tool button click
|
|
18
|
+
*/
|
|
14
19
|
onToolClick(tool: ToolType): void;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a tool should be enabled
|
|
22
|
+
*/
|
|
15
23
|
isEnabled(type: ToolType): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Handle save button click
|
|
26
|
+
*/
|
|
16
27
|
onSaveClick(): void;
|
|
17
28
|
static ɵfac: i0.ɵɵFactoryDeclaration<DesignerToolbarComponent, never>;
|
|
18
29
|
static ɵcmp: i0.ɵɵComponentDeclaration<DesignerToolbarComponent, "lib-designer-toolbar", never, { "selectedTool": { "alias": "selectedTool"; "required": false; }; "isSaving": { "alias": "isSaving"; "required": false; }; }, { "toolSelected": "toolSelected"; "saveWorkflow": "saveWorkflow"; }, never, never, false, never>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Connection, ConnectionPoint } from '../workflow-designer.types';
|
|
2
|
+
import { WorkflowDesignerState } from '../workflow-designer.state';
|
|
3
|
+
import { NodeManagementService } from './node-management.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class ConnectionService {
|
|
6
|
+
private state;
|
|
7
|
+
private nodeService;
|
|
8
|
+
private draggingConnectionData;
|
|
9
|
+
private readonly connectionRules;
|
|
10
|
+
constructor(state: WorkflowDesignerState, nodeService: NodeManagementService);
|
|
11
|
+
/**
|
|
12
|
+
* Start a new connection drag operation
|
|
13
|
+
*/
|
|
14
|
+
startConnectionDrag(point: ConnectionPoint, swimlaneIndex: number, globalX: number, globalY: number): void;
|
|
15
|
+
/**
|
|
16
|
+
* Update the position of the dragging connection
|
|
17
|
+
*/
|
|
18
|
+
updateConnectionDrag(currentX: number, currentY: number): void;
|
|
19
|
+
/**
|
|
20
|
+
* End the current connection drag operation
|
|
21
|
+
*/
|
|
22
|
+
endConnectionDrag(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Check if a connection drag is in progress
|
|
25
|
+
*/
|
|
26
|
+
isConnectionDragging(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get the current connection path data for rendering
|
|
29
|
+
*/
|
|
30
|
+
getConnectionPathData(): {
|
|
31
|
+
startX: number;
|
|
32
|
+
startY: number;
|
|
33
|
+
endX: number;
|
|
34
|
+
endY: number;
|
|
35
|
+
sourceSwimlaneIndex: number;
|
|
36
|
+
} | null;
|
|
37
|
+
/**
|
|
38
|
+
* Create a new connection between nodes
|
|
39
|
+
*/
|
|
40
|
+
createConnection(targetNodeId: string, targetPointId: string, targetSwimlaneIndex: number): Connection | null;
|
|
41
|
+
/**
|
|
42
|
+
* Get the path data for rendering a saved connection
|
|
43
|
+
*/
|
|
44
|
+
getConnectionData(connection: Connection): {
|
|
45
|
+
startX: number;
|
|
46
|
+
startY: number;
|
|
47
|
+
endX: number;
|
|
48
|
+
endY: number;
|
|
49
|
+
sourceSwimlaneIndex: number;
|
|
50
|
+
targetSwimlaneIndex: number;
|
|
51
|
+
} | null;
|
|
52
|
+
/**
|
|
53
|
+
* Calculate a path for orthogonal connection rendering
|
|
54
|
+
*/
|
|
55
|
+
getOrthogonalPath(startX: number, startY: number, endX: number, endY: number, pointType: 'top' | 'right' | 'bottom' | 'left'): string;
|
|
56
|
+
/**
|
|
57
|
+
* Check if a connection is allowed between node types
|
|
58
|
+
*/
|
|
59
|
+
canConnect(sourceNodeType: string, targetNodeType: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Get allowed node types for the current dragging connection
|
|
62
|
+
*/
|
|
63
|
+
getAllowedTargetNodeTypes(): string[];
|
|
64
|
+
/**
|
|
65
|
+
* Delete a connection by ID
|
|
66
|
+
*/
|
|
67
|
+
deleteConnection(connectionId: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Delete all connections associated with a node
|
|
70
|
+
*/
|
|
71
|
+
deleteConnectionsForNode(nodeId: string): void;
|
|
72
|
+
/**
|
|
73
|
+
* Get the current connection drag data
|
|
74
|
+
*/
|
|
75
|
+
getConnectionDragData(): {
|
|
76
|
+
sourcePoint?: ConnectionPoint;
|
|
77
|
+
sourceSwimlaneIndex?: number;
|
|
78
|
+
startX?: number;
|
|
79
|
+
startY?: number;
|
|
80
|
+
currentX?: number;
|
|
81
|
+
currentY?: number;
|
|
82
|
+
};
|
|
83
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ConnectionService, never>;
|
|
84
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<ConnectionService>;
|
|
85
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Node, ToolType, ConnectionPoint } from '../workflow-designer.types';
|
|
2
|
+
import { WorkflowStage } from '../../../models/WorkflowStage';
|
|
3
|
+
import { WorkflowDesignerState } from '../workflow-designer.state';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class NodeManagementService {
|
|
6
|
+
private state;
|
|
7
|
+
constructor(state: WorkflowDesignerState);
|
|
8
|
+
/**
|
|
9
|
+
* Adds a new node to the specified swimlane
|
|
10
|
+
*/
|
|
11
|
+
addNode(swimlaneIndex: number, type: ToolType, x: number, y: number, stageData?: Partial<WorkflowStage>, workflowData?: {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
}): Node | null;
|
|
15
|
+
/**
|
|
16
|
+
* Gets the total count of nodes across all swimlanes
|
|
17
|
+
*/
|
|
18
|
+
getNodeCount(): number;
|
|
19
|
+
/**
|
|
20
|
+
* Find a node by ID
|
|
21
|
+
*/
|
|
22
|
+
findNodeById(id: string): {
|
|
23
|
+
node: Node;
|
|
24
|
+
swimlaneIndex: number;
|
|
25
|
+
} | null;
|
|
26
|
+
/**
|
|
27
|
+
* Generate connection points for a node
|
|
28
|
+
*/
|
|
29
|
+
generateConnectionPoints(node: Node): ConnectionPoint[];
|
|
30
|
+
/**
|
|
31
|
+
* Update node properties
|
|
32
|
+
*/
|
|
33
|
+
updateNodeProperties(nodeId: string, properties: Partial<Node>): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Update stage data for a node
|
|
36
|
+
*/
|
|
37
|
+
updateStageData(nodeId: string, stageData: Partial<WorkflowStage>): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Set a node as a start node
|
|
40
|
+
*/
|
|
41
|
+
setAsStartNode(nodeId: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Delete a node
|
|
44
|
+
*/
|
|
45
|
+
deleteNode(nodeId: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a node has outgoing connections
|
|
48
|
+
*/
|
|
49
|
+
hasOutgoingConnections(nodeId: string): boolean;
|
|
50
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NodeManagementService, never>;
|
|
51
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<NodeManagementService>;
|
|
52
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { FormEntity } from '../../../models/FormEntity';
|
|
2
|
+
import { Workflow } from '../../../models/Workflow';
|
|
3
|
+
import { ConnectionPoint } from '../workflow-designer.types';
|
|
4
|
+
import { WorkflowDataService } from '../workflow-data.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Service for managing various popups in the workflow designer
|
|
8
|
+
*/
|
|
9
|
+
export declare class PopupService {
|
|
10
|
+
private dataService;
|
|
11
|
+
private _connectionPopupVisible;
|
|
12
|
+
private _connectionPopupPosition;
|
|
13
|
+
private _allowedNodeTypes;
|
|
14
|
+
private _formPopupVisible;
|
|
15
|
+
private _formPopupPosition;
|
|
16
|
+
private _formsList;
|
|
17
|
+
private _isLoadingForms;
|
|
18
|
+
private _selectedNodeForForm;
|
|
19
|
+
private _startNodeFormPopupVisible;
|
|
20
|
+
private _startNodeFormPopupPosition;
|
|
21
|
+
private _subflowPopupVisible;
|
|
22
|
+
private _subflowPopupPosition;
|
|
23
|
+
private _workflowsList;
|
|
24
|
+
private _isLoadingWorkflows;
|
|
25
|
+
private _pendingSubflowPosition;
|
|
26
|
+
private _pendingConnectionSourcePoint;
|
|
27
|
+
private _pendingConnectionSourceSwimlaneIndex;
|
|
28
|
+
constructor(dataService: WorkflowDataService);
|
|
29
|
+
get connectionPopupVisible(): import("rxjs").Observable<boolean>;
|
|
30
|
+
get connectionPopupPosition(): import("rxjs").Observable<{
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
}>;
|
|
34
|
+
get allowedNodeTypes(): import("rxjs").Observable<string[]>;
|
|
35
|
+
get formPopupVisible(): import("rxjs").Observable<boolean>;
|
|
36
|
+
get formPopupPosition(): import("rxjs").Observable<{
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
}>;
|
|
40
|
+
get formsList(): import("rxjs").Observable<FormEntity[]>;
|
|
41
|
+
get isLoadingForms(): import("rxjs").Observable<boolean>;
|
|
42
|
+
get selectedNodeForForm(): import("rxjs").Observable<string | null>;
|
|
43
|
+
get startNodeFormPopupVisible(): import("rxjs").Observable<boolean>;
|
|
44
|
+
get startNodeFormPopupPosition(): import("rxjs").Observable<{
|
|
45
|
+
x: number;
|
|
46
|
+
y: number;
|
|
47
|
+
}>;
|
|
48
|
+
get subflowPopupVisible(): import("rxjs").Observable<boolean>;
|
|
49
|
+
get subflowPopupPosition(): import("rxjs").Observable<{
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
}>;
|
|
53
|
+
get workflowsList(): import("rxjs").Observable<Workflow[]>;
|
|
54
|
+
get isLoadingWorkflows(): import("rxjs").Observable<boolean>;
|
|
55
|
+
get pendingSubflowPosition(): import("rxjs").Observable<{
|
|
56
|
+
swimlaneIndex: number;
|
|
57
|
+
x: number;
|
|
58
|
+
y: number;
|
|
59
|
+
} | null>;
|
|
60
|
+
get pendingConnectionSourcePoint(): import("rxjs").Observable<ConnectionPoint | null>;
|
|
61
|
+
get pendingConnectionSourceSwimlaneIndex(): import("rxjs").Observable<number | null>;
|
|
62
|
+
/**
|
|
63
|
+
* Show connection creation popup
|
|
64
|
+
*/
|
|
65
|
+
showConnectionPopup(x: number, y: number, allowedNodeTypes: string[]): void;
|
|
66
|
+
/**
|
|
67
|
+
* Hide connection creation popup
|
|
68
|
+
*/
|
|
69
|
+
hideConnectionPopup(): void;
|
|
70
|
+
/**
|
|
71
|
+
* Store connection source data for use in other popups
|
|
72
|
+
*/
|
|
73
|
+
storeConnectionSourceData(point: ConnectionPoint, swimlaneIndex: number): void;
|
|
74
|
+
/**
|
|
75
|
+
* Clear connection source data
|
|
76
|
+
*/
|
|
77
|
+
clearConnectionSourceData(): void;
|
|
78
|
+
/**
|
|
79
|
+
* Show form selection popup for a stage
|
|
80
|
+
*/
|
|
81
|
+
showFormPopup(x: number, y: number, nodeId: string): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Hide form selection popup
|
|
84
|
+
*/
|
|
85
|
+
hideFormPopup(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Show workflow form selection popup for start node
|
|
88
|
+
*/
|
|
89
|
+
showStartNodeFormPopup(x: number, y: number): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Hide workflow form selection popup
|
|
92
|
+
*/
|
|
93
|
+
hideStartNodeFormPopup(): void;
|
|
94
|
+
/**
|
|
95
|
+
* Show subflow selection popup
|
|
96
|
+
*/
|
|
97
|
+
showSubflowPopup(x: number, y: number, swimlaneIndex: number): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Hide subflow selection popup
|
|
100
|
+
*/
|
|
101
|
+
hideSubflowPopup(): void;
|
|
102
|
+
getCurrentValues(): {
|
|
103
|
+
connectionPopupVisible: boolean;
|
|
104
|
+
connectionPopupPosition: {
|
|
105
|
+
x: number;
|
|
106
|
+
y: number;
|
|
107
|
+
};
|
|
108
|
+
allowedNodeTypes: string[];
|
|
109
|
+
formPopupVisible: boolean;
|
|
110
|
+
formPopupPosition: {
|
|
111
|
+
x: number;
|
|
112
|
+
y: number;
|
|
113
|
+
};
|
|
114
|
+
formsList: FormEntity[];
|
|
115
|
+
isLoadingForms: boolean;
|
|
116
|
+
selectedNodeForForm: string | null;
|
|
117
|
+
startNodeFormPopupVisible: boolean;
|
|
118
|
+
startNodeFormPopupPosition: {
|
|
119
|
+
x: number;
|
|
120
|
+
y: number;
|
|
121
|
+
};
|
|
122
|
+
subflowPopupVisible: boolean;
|
|
123
|
+
subflowPopupPosition: {
|
|
124
|
+
x: number;
|
|
125
|
+
y: number;
|
|
126
|
+
};
|
|
127
|
+
workflowsList: Workflow[];
|
|
128
|
+
isLoadingWorkflows: boolean;
|
|
129
|
+
pendingSubflowPosition: {
|
|
130
|
+
swimlaneIndex: number;
|
|
131
|
+
x: number;
|
|
132
|
+
y: number;
|
|
133
|
+
} | null;
|
|
134
|
+
pendingConnectionSourcePoint: ConnectionPoint | null;
|
|
135
|
+
pendingConnectionSourceSwimlaneIndex: number | null;
|
|
136
|
+
};
|
|
137
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PopupService, never>;
|
|
138
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<PopupService>;
|
|
139
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { SwimlaneItem } from '../workflow-designer.types';
|
|
2
|
+
import { Tag } from '../../../models/Tag';
|
|
3
|
+
import { WorkflowDesignerState } from '../workflow-designer.state';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class SwimlaneService {
|
|
6
|
+
private state;
|
|
7
|
+
readonly swimlaneHeight = 263;
|
|
8
|
+
constructor(state: WorkflowDesignerState);
|
|
9
|
+
/**
|
|
10
|
+
* Add a new swimlane
|
|
11
|
+
*/
|
|
12
|
+
addSwimlane(name: string, tags: Tag[]): SwimlaneItem;
|
|
13
|
+
/**
|
|
14
|
+
* Update an existing swimlane
|
|
15
|
+
*/
|
|
16
|
+
updateSwimlane(index: number, name: string, tags: Tag[]): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Reorder swimlanes (move a swimlane up or down in the list)
|
|
19
|
+
*/
|
|
20
|
+
reorderSwimlane(fromIndex: number, toIndex: number): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Delete a swimlane by index
|
|
23
|
+
*/
|
|
24
|
+
deleteSwimlane(index: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get all swimlanes
|
|
27
|
+
*/
|
|
28
|
+
getSwimlanes(): SwimlaneItem[];
|
|
29
|
+
/**
|
|
30
|
+
* Get swimlane by index
|
|
31
|
+
*/
|
|
32
|
+
getSwimlane(index: number): SwimlaneItem | null;
|
|
33
|
+
/**
|
|
34
|
+
* Calculate total canvas height needed for all swimlanes
|
|
35
|
+
*/
|
|
36
|
+
calculateCanvasHeight(minHeight?: number): number;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a Y position is within any swimlane
|
|
39
|
+
*/
|
|
40
|
+
isPositionInsideSwimlane(y: number): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate swimlane index from Y position
|
|
43
|
+
*/
|
|
44
|
+
getSwimlaneIndexFromPosition(y: number): number;
|
|
45
|
+
/**
|
|
46
|
+
* Find swimlane index by Lane ID
|
|
47
|
+
*/
|
|
48
|
+
findSwimlaneIndexByLaneId(laneId: string): number;
|
|
49
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SwimlaneService, never>;
|
|
50
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SwimlaneService>;
|
|
51
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { WorkflowDesignerState } from '../workflow-designer.state';
|
|
2
|
+
import { Workflow } from '../../../models/Workflow';
|
|
3
|
+
import { SwimlaneService } from './swimlane.service';
|
|
4
|
+
import { NodeManagementService } from './node-management.service';
|
|
5
|
+
import { ConnectionService } from './connection.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export declare class TransformerService {
|
|
8
|
+
private state;
|
|
9
|
+
private swimlaneService;
|
|
10
|
+
private nodeService;
|
|
11
|
+
private connectionService;
|
|
12
|
+
private loadedObjectIds;
|
|
13
|
+
constructor(state: WorkflowDesignerState, swimlaneService: SwimlaneService, nodeService: NodeManagementService, connectionService: ConnectionService);
|
|
14
|
+
/**
|
|
15
|
+
* Transform the UI model to a Workflow API model
|
|
16
|
+
*/
|
|
17
|
+
transformToWorkflowModel(): Workflow;
|
|
18
|
+
/**
|
|
19
|
+
* Parse API workflow model and convert to UI model
|
|
20
|
+
*/
|
|
21
|
+
parseWorkflowData(workflow: Workflow): void;
|
|
22
|
+
/**
|
|
23
|
+
* Register a loaded object from the API
|
|
24
|
+
*/
|
|
25
|
+
registerLoadedObject(id: string, code: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* Check if an object was loaded from API
|
|
28
|
+
*/
|
|
29
|
+
wasLoadedFromApi(id: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get the code for a loaded object
|
|
32
|
+
*/
|
|
33
|
+
getCodeForObject(id: string): string;
|
|
34
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TransformerService, never>;
|
|
35
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<TransformerService>;
|
|
36
|
+
}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import { EventEmitter, OnInit } from '@angular/core';
|
|
1
|
+
import { EventEmitter, OnInit, SimpleChanges } from '@angular/core';
|
|
2
2
|
import { FormBuilder, FormGroup } from '@angular/forms';
|
|
3
3
|
import { Tag } from '../../../models/Tag';
|
|
4
4
|
import { WorkflowStage } from '../../../models/WorkflowStage';
|
|
5
5
|
import { StageActorRule } from '../../../models/StageActorRule';
|
|
6
6
|
import { WorkflowDataService } from '../workflow-data.service';
|
|
7
|
+
import { NodeManagementService } from '../services/node-management.service';
|
|
8
|
+
import { PopupService } from '../services/popup.service';
|
|
7
9
|
import * as i0 from "@angular/core";
|
|
8
10
|
export declare class StageDialogComponent implements OnInit {
|
|
9
11
|
private fb;
|
|
10
12
|
private dataService;
|
|
13
|
+
private nodeService;
|
|
14
|
+
private popupService;
|
|
11
15
|
visible: import("@angular/core").InputSignal<boolean>;
|
|
12
16
|
stageData: Partial<WorkflowStage>;
|
|
13
17
|
closed: EventEmitter<any>;
|
|
@@ -16,8 +20,19 @@ export declare class StageDialogComponent implements OnInit {
|
|
|
16
20
|
tags: Tag[];
|
|
17
21
|
actorRules: StageActorRule[];
|
|
18
22
|
selectedTagIds: string[];
|
|
19
|
-
|
|
23
|
+
hasOutgoingConnections: boolean;
|
|
24
|
+
constructor(fb: FormBuilder, dataService: WorkflowDataService, nodeService: NodeManagementService, popupService: PopupService);
|
|
20
25
|
ngOnInit(): void;
|
|
26
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
27
|
+
/**
|
|
28
|
+
* Load tags from data service
|
|
29
|
+
*/
|
|
30
|
+
private loadTags;
|
|
31
|
+
/**
|
|
32
|
+
* Initialize form with stage data if provided
|
|
33
|
+
*/
|
|
34
|
+
private initFormWithStageData;
|
|
35
|
+
private checkOutgoingConnections;
|
|
21
36
|
onDialogClose(event: any): void;
|
|
22
37
|
saveStage(): void;
|
|
23
38
|
toggleTagSelection(tagId: string): void;
|
|
@@ -19,8 +19,8 @@ export declare class StageNodeComponent {
|
|
|
19
19
|
sourceNodeId: string;
|
|
20
20
|
isParallel: boolean;
|
|
21
21
|
}>;
|
|
22
|
+
showShieldDialog: EventEmitter<string>;
|
|
22
23
|
showFormPopup: boolean;
|
|
23
|
-
showShieldPopup: boolean;
|
|
24
24
|
showTimerPopup: boolean;
|
|
25
25
|
showActionPopupLeft: boolean;
|
|
26
26
|
showActionPopupRight: boolean;
|
|
@@ -43,5 +43,5 @@ export declare class StageNodeComponent {
|
|
|
43
43
|
refreshState(): void;
|
|
44
44
|
onStagePropertiesSaved(stageData: Partial<WorkflowStage>): void;
|
|
45
45
|
static ɵfac: i0.ɵɵFactoryDeclaration<StageNodeComponent, never>;
|
|
46
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<StageNodeComponent, "svg:g[lib-stage-node]", never, { "node": { "alias": "node"; "required": false; }; "isStartNode": { "alias": "isStartNode"; "required": false; }; "stageData": { "alias": "stageData"; "required": false; }; }, { "stagePropertiesUpdated": "stagePropertiesUpdated"; "parallelExecutionToggled": "parallelExecutionToggled"; }, never, never, false, never>;
|
|
46
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StageNodeComponent, "svg:g[lib-stage-node]", never, { "node": { "alias": "node"; "required": false; }; "isStartNode": { "alias": "isStartNode"; "required": false; }; "stageData": { "alias": "stageData"; "required": false; }; }, { "stagePropertiesUpdated": "stagePropertiesUpdated"; "parallelExecutionToggled": "parallelExecutionToggled"; "showShieldDialog": "showShieldDialog"; }, never, never, false, never>;
|
|
47
47
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
2
|
import { Tag } from '../../../models/Tag';
|
|
3
3
|
import { WorkflowDataService } from '../workflow-data.service';
|
|
4
|
+
import { SwimlaneService } from '../services/swimlane.service';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
export declare class SwimlaneDialogComponent implements OnInit {
|
|
6
7
|
private dataService;
|
|
8
|
+
private swimlaneService;
|
|
7
9
|
visible: boolean;
|
|
8
10
|
swimlaneData: {
|
|
9
11
|
name: string;
|
|
@@ -18,8 +20,12 @@ export declare class SwimlaneDialogComponent implements OnInit {
|
|
|
18
20
|
workflowName: string;
|
|
19
21
|
selectedTagNames: string[];
|
|
20
22
|
tags: Tag[];
|
|
21
|
-
constructor(dataService: WorkflowDataService);
|
|
23
|
+
constructor(dataService: WorkflowDataService, swimlaneService: SwimlaneService);
|
|
22
24
|
ngOnInit(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Load tags from the data service
|
|
27
|
+
*/
|
|
28
|
+
private loadTags;
|
|
23
29
|
get allSelected(): boolean;
|
|
24
30
|
set allSelected(value: boolean);
|
|
25
31
|
get filteredTags(): Tag[];
|
|
@@ -4,6 +4,7 @@ import { Tag } from '../../models/Tag';
|
|
|
4
4
|
import { WorkflowStage } from '../../models/WorkflowStage';
|
|
5
5
|
import { DesignerCanvasComponent } from './designer-canvas/designer-canvas.component';
|
|
6
6
|
import { WorkflowDataService } from './workflow-data.service';
|
|
7
|
+
import { Workflow } from '../../models/Workflow';
|
|
7
8
|
import * as i0 from "@angular/core";
|
|
8
9
|
export declare class WorkflowDesignerComponent {
|
|
9
10
|
state: WorkflowDesignerState;
|
|
@@ -29,7 +30,7 @@ export declare class WorkflowDesignerComponent {
|
|
|
29
30
|
ngOnInit(): void;
|
|
30
31
|
saveWorkflow(): void;
|
|
31
32
|
loadWorkflow(code: string): void;
|
|
32
|
-
parseWorkflowData(workflow:
|
|
33
|
+
parseWorkflowData(workflow: Workflow): void;
|
|
33
34
|
findSwimlaneIndexByLaneId(laneId: string): number;
|
|
34
35
|
onToolSelected(tool: ToolType): void;
|
|
35
36
|
openSwimlaneDialog(): void;
|
|
@@ -5,11 +5,13 @@ import * as i3 from "./designer-canvas/designer-canvas.component";
|
|
|
5
5
|
import * as i4 from "./swimlane-dialog/swimlane-dialog.component";
|
|
6
6
|
import * as i5 from "./stage-node/stage-node.component";
|
|
7
7
|
import * as i6 from "./stage-dialog/stage-dialog.component";
|
|
8
|
-
import * as i7 from "
|
|
9
|
-
import * as i8 from "
|
|
10
|
-
import * as i9 from "@angular/
|
|
8
|
+
import * as i7 from "./conditions-popup/conditions-popup.component";
|
|
9
|
+
import * as i8 from "./decision-popup/decision-popup.component";
|
|
10
|
+
import * as i9 from "@angular/common";
|
|
11
|
+
import * as i10 from "verben-ng-ui";
|
|
12
|
+
import * as i11 from "@angular/forms";
|
|
11
13
|
export declare class WorkflowDesignerModule {
|
|
12
14
|
static ɵfac: i0.ɵɵFactoryDeclaration<WorkflowDesignerModule, never>;
|
|
13
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<WorkflowDesignerModule, [typeof i1.WorkflowDesignerComponent, typeof i2.DesignerToolbarComponent, typeof i3.DesignerCanvasComponent, typeof i4.SwimlaneDialogComponent, typeof i5.StageNodeComponent, typeof i6.StageDialogComponent], [typeof
|
|
15
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<WorkflowDesignerModule, [typeof i1.WorkflowDesignerComponent, typeof i2.DesignerToolbarComponent, typeof i3.DesignerCanvasComponent, typeof i4.SwimlaneDialogComponent, typeof i5.StageNodeComponent, typeof i6.StageDialogComponent, typeof i7.ConditionsPopupComponent, typeof i8.DecisionPopupComponent], [typeof i9.CommonModule, typeof i10.VerbenDialogueModule, typeof i11.FormsModule, typeof i11.ReactiveFormsModule, typeof i10.VerbenPopUpModule], [typeof i1.WorkflowDesignerComponent]>;
|
|
14
16
|
static ɵinj: i0.ɵɵInjectorDeclaration<WorkflowDesignerModule>;
|
|
15
17
|
}
|