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.
Files changed (47) hide show
  1. package/esm2022/lib/components/designer/models/types.mjs +1 -1
  2. package/esm2022/lib/components/designer/services/wf-mapper.service.mjs +3 -3
  3. package/esm2022/lib/components/workflow-designer/conditions-popup/conditions-popup.component.mjs +76 -0
  4. package/esm2022/lib/components/workflow-designer/decision-popup/decision-popup.component.mjs +65 -0
  5. package/esm2022/lib/components/workflow-designer/designer-canvas/designer-canvas.component.mjs +245 -17
  6. package/esm2022/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.mjs +26 -14
  7. package/esm2022/lib/components/workflow-designer/services/connection.service.mjs +220 -0
  8. package/esm2022/lib/components/workflow-designer/services/node-management.service.mjs +288 -0
  9. package/esm2022/lib/components/workflow-designer/services/popup.service.mjs +235 -0
  10. package/esm2022/lib/components/workflow-designer/services/swimlane.service.mjs +145 -0
  11. package/esm2022/lib/components/workflow-designer/services/transformer.service.mjs +260 -0
  12. package/esm2022/lib/components/workflow-designer/stage-dialog/stage-dialog.component.mjs +67 -11
  13. package/esm2022/lib/components/workflow-designer/stage-node/stage-node.component.mjs +9 -18
  14. package/esm2022/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.mjs +30 -24
  15. package/esm2022/lib/components/workflow-designer/workflow-data.service.mjs +2 -2
  16. package/esm2022/lib/components/workflow-designer/workflow-designer.component.mjs +138 -96
  17. package/esm2022/lib/components/workflow-designer/workflow-designer.module.mjs +27 -3
  18. package/esm2022/lib/components/workflow-designer/workflow-designer.state.mjs +243 -205
  19. package/esm2022/lib/components/workflow-designer/workflow-designer.types.mjs +1 -1
  20. package/esm2022/lib/models/SwimLane.mjs +1 -1
  21. package/esm2022/lib/models/Workflow.mjs +1 -1
  22. package/esm2022/lib/models/WorkflowStage.mjs +1 -1
  23. package/esm2022/lib/services/http-web-request.service.mjs +2 -2
  24. package/fesm2022/verben-workflow-ui.mjs +2644 -1005
  25. package/fesm2022/verben-workflow-ui.mjs.map +1 -1
  26. package/lib/components/designer/models/types.d.ts +1 -1
  27. package/lib/components/workflow-designer/conditions-popup/conditions-popup.component.d.ts +34 -0
  28. package/lib/components/workflow-designer/decision-popup/decision-popup.component.d.ts +26 -0
  29. package/lib/components/workflow-designer/designer-canvas/designer-canvas.component.d.ts +35 -1
  30. package/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.d.ts +14 -3
  31. package/lib/components/workflow-designer/services/connection.service.d.ts +85 -0
  32. package/lib/components/workflow-designer/services/node-management.service.d.ts +52 -0
  33. package/lib/components/workflow-designer/services/popup.service.d.ts +139 -0
  34. package/lib/components/workflow-designer/services/swimlane.service.d.ts +51 -0
  35. package/lib/components/workflow-designer/services/transformer.service.d.ts +36 -0
  36. package/lib/components/workflow-designer/stage-dialog/stage-dialog.component.d.ts +17 -2
  37. package/lib/components/workflow-designer/stage-node/stage-node.component.d.ts +2 -2
  38. package/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.d.ts +7 -1
  39. package/lib/components/workflow-designer/workflow-designer.component.d.ts +2 -1
  40. package/lib/components/workflow-designer/workflow-designer.module.d.ts +6 -4
  41. package/lib/components/workflow-designer/workflow-designer.state.d.ts +17 -1
  42. package/lib/components/workflow-designer/workflow-designer.types.d.ts +2 -0
  43. package/lib/models/SwimLane.d.ts +1 -0
  44. package/lib/models/Workflow.d.ts +1 -0
  45. package/lib/models/WorkflowStage.d.ts +1 -1
  46. package/package.json +1 -1
  47. package/styles/styles.css +23 -0
@@ -48,7 +48,7 @@ export interface Stage extends WorkflowObject {
48
48
  isEntryPoint?: boolean;
49
49
  isExitPoint?: boolean;
50
50
  tags?: Tag[];
51
- forms?: string[];
51
+ form?: string;
52
52
  allowMultiSubProcess?: boolean;
53
53
  assignmentType?: string;
54
54
  subWorkflow?: string;
@@ -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 { WorkflowDesignerState } from '../workflow-designer.state';
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 state;
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(state: WorkflowDesignerState);
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
- constructor(fb: FormBuilder, dataService: WorkflowDataService);
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: any): void;
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 "@angular/common";
9
- import * as i8 from "verben-ng-ui";
10
- import * as i9 from "@angular/forms";
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 i7.CommonModule, typeof i8.VerbenDialogueModule, typeof i9.FormsModule, typeof i9.ReactiveFormsModule, typeof i8.VerbenPopUpModule], [typeof i1.WorkflowDesignerComponent]>;
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
  }