verben-workflow-ui 0.5.46 → 0.5.47

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.
@@ -1 +1 @@
1
- {"version":3,"file":"verben-workflow-ui-src-lib-components-workflow-designer.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.state.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-data.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/node-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/swimlane.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-node/stage-node.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-node/stage-node.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/popup.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-dialog/stage-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-dialog/stage-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/conditions-popup/conditions-popup.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/conditions-popup/conditions-popup.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/escalation-dialog/escalation-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/escalation-dialog/escalation-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/action-dialog/action-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/action-dialog/action-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-canvas/designer-canvas.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-canvas/designer-canvas.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/actor-tags-dialog/actor-tags-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/actor-tags-dialog/actor-tags-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/decision-popup/decision-popup.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/decision-popup/decision-popup.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/connection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/transformer.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.module.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/verben-workflow-ui-src-lib-components-workflow-designer.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ObjectState, StageActorRule, Status, SwimLane, Tag, TaskAssignmentType, Workflow, WorkflowAction, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport {\n Connection,\n ConnectionPoint,\n Node,\n SwimlaneItem,\n ToolType,\n} from './workflow-designer.types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowDesignerState {\n swimlanes: SwimlaneItem[] = [];\n startNodeId: string | null = null; // Track the ID of the first/start node\n connections: Connection[] = [];\n draggingConnectionData: {\n sourcePoint?: ConnectionPoint;\n sourceSwimlaneIndex?: number;\n startX?: number;\n startY?: number;\n currentX?: number;\n currentY?: number;\n } = {};\n workflowFormId: string | null = null;\n workflowFormName: string | null = null;\n workflowId: string | null = null;\n\n workflow: Workflow | null = null;\n swimlaneRecord: Record<string, SwimLane> = {};\n stageRecord: Record<string, WorkflowStage> = {};\n actionRecord: Record<string, WorkflowAction> = {};\n\n setWorkflowId(id: string): void {\n this.workflowId = id;\n }\n\n public laneIdToIndexMap: Map<string, number> = new Map();\n\n private readonly connectionRules: Record<string, string[]> = {\n stage: ['stage', 'decision', 'subflow'],\n decision: ['stage'], // Decisions can only connect to Stages\n // 'action': ['stage', 'form', 'decision'],\n form: [],\n subflow: ['stage', 'decision'],\n };\n\n setWorkflowForm(formId: string | null, formName: string | null): void {\n this.workflowFormId = formId;\n this.workflowFormName = formName;\n console.log(this.workflowFormId, this.workflowFormName);\n }\n\n addSwimlane(name: string, tags: Tag[]) {\n // Generate a unique key for this swimlane\n const swimlaneKey = `lane-${Date.now()}-${Math.floor(\n Math.random() * 1000\n )}`;\n\n this.swimlanes = this.swimlanes.concat([\n {\n order: this.swimlanes.length,\n label: name,\n tags,\n nodes: [],\n id: swimlaneKey, // Store the generated key as id for frontend reference\n },\n ]);\n }\n\n registerLaneMapping(laneId: string, swimlaneIndex: number): void {\n this.laneIdToIndexMap.set(laneId, swimlaneIndex);\n }\n\n // Add this method to generate connection points for a node\n generateConnectionPoints(node: Node): ConnectionPoint[] {\n const points: ConnectionPoint[] = [];\n const spacing = 50; // Space between connection points\n\n if (node.type === 'stage') {\n // Rectangular shapes - add points around the rectangle\n\n // Top edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-top-${x}`,\n nodeId: node.id,\n x: x,\n y: 0,\n type: 'top',\n });\n }\n\n // Right edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-right-${y}`,\n nodeId: node.id,\n x: node.width,\n y: y,\n type: 'right',\n });\n }\n\n // Bottom edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-bottom-${x}`,\n nodeId: node.id,\n x: x,\n y: node.height,\n type: 'bottom',\n });\n }\n\n // Left edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'decision') {\n // Diamond shape - add points at the four corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-0`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 2,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-0`,\n nodeId: node.id,\n x: 0,\n y: node.height / 2,\n type: 'left',\n });\n } else if (node.type === 'form') {\n // Form only has input connection points, no output points\n\n // Left edge points (for input connections)\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'subflow') {\n // Hexagon shape - add points at the six corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-top`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-right-bottom`,\n nodeId: node.id,\n x: node.width,\n y: (node.height * 3) / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-bottom`,\n nodeId: node.id,\n x: 0,\n y: (node.height * 3) / 4,\n type: 'left',\n });\n\n points.push({\n id: `${node.id}-left-top`,\n nodeId: node.id,\n x: 0,\n y: node.height / 4,\n type: 'left',\n });\n }\n\n return points;\n }\n\n addNode(\n swimlaneIndex: number,\n type: ToolType,\n x: number,\n y: number,\n stageData?: Partial<WorkflowStage>,\n workflowData?: { id: string; name: string },\n useExistingId: boolean = false\n ) {\n if (\n !this.swimlanes[swimlaneIndex] ||\n !type ||\n (type !== 'stage' &&\n type !== 'decision' &&\n type !== 'form' &&\n type !== 'subflow')\n ) {\n return null;\n }\n\n // Adjust position relative to swimlane\n const adjustedY = y - swimlaneIndex * 263; // Subtracting header height\n\n // Generate a unique ID or use existing\n const id =\n useExistingId && stageData?.Code\n ? stageData.Code\n : `${type}-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n\n // Create node with dimensions based on type\n const node: Node = {\n id,\n type,\n x,\n y: adjustedY,\n width: type === 'subflow' ? 150 : 169, // Width from SVG\n height: 100, // Height from SVG\n isStartNode: false, // Default to false\n stageData: stageData || {}, // Store stage data\n workflowData: workflowData || null,\n };\n\n // If this is the first node in the entire workflow, mark it as the start node\n if (this.getNodeCount() === 0) {\n node.isStartNode = true;\n this.startNodeId = id;\n }\n\n // Generate connection points for the node\n node.connectionPoints = this.generateConnectionPoints(node);\n\n // Add node to the swimlane\n if (!this.swimlanes[swimlaneIndex].nodes) {\n this.swimlanes[swimlaneIndex].nodes = [];\n }\n this.swimlanes[swimlaneIndex].nodes.push(node);\n\n return node;\n }\n\n // Helper to get total node count across all swimlanes\n getNodeCount(): number {\n return this.swimlanes.reduce(\n (count, swimlane) => count + (swimlane.nodes?.length || 0),\n 0\n );\n }\n\n // Find a node by ID (useful for later operations)\n findNodeById(id: string): { node: Node; swimlaneIndex: number } | null {\n for (let i = 0; i < this.swimlanes.length; i++) {\n const swimlane = this.swimlanes[i];\n const node = swimlane.nodes?.find((n) => n.id === id);\n if (node) {\n return { node, swimlaneIndex: i };\n }\n }\n return null;\n }\n\n // Find a node by ID (useful for later operations)\n findActionById(connectionId: string): Connection | null {\n return this.connections.find(({ id }) => id === connectionId) ?? null;\n }\n\n startConnectionDrag(\n point: ConnectionPoint,\n swimlaneIndex: number,\n globalX: number,\n globalY: number\n ) {\n this.draggingConnectionData = {\n sourcePoint: point,\n sourceSwimlaneIndex: swimlaneIndex,\n startX: globalX,\n startY: globalY,\n currentX: globalX,\n currentY: globalY,\n };\n }\n\n updateConnectionDrag(currentX: number, currentY: number) {\n if (this.draggingConnectionData.sourcePoint) {\n this.draggingConnectionData.currentX = currentX;\n this.draggingConnectionData.currentY = currentY;\n }\n }\n\n endConnectionDrag() {\n console.log('Ending connection drag, clearing data');\n // Clear dragging data\n this.draggingConnectionData = {};\n }\n\n isConnectionDragging(): boolean {\n return !!this.draggingConnectionData.sourcePoint;\n }\n\n getConnectionPathData(): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n } | null {\n if (!this.draggingConnectionData.sourcePoint) return null;\n\n const { sourcePoint, sourceSwimlaneIndex, currentX, currentY } =\n this.draggingConnectionData;\n const node = this.findNodeById(sourcePoint.nodeId)?.node;\n\n if (!node || sourceSwimlaneIndex === undefined) return null;\n\n // Calculate start point in global coordinates\n const startX = node.x + sourcePoint.x;\n const startY = node.y + sourcePoint.y + sourceSwimlaneIndex * 263; // Add swimlane offset\n\n return {\n startX,\n startY,\n endX: currentX ?? startX,\n endY: currentY ?? startY,\n sourceSwimlaneIndex,\n };\n }\n\n createConnection(\n targetNodeId: string,\n targetPointId: string,\n targetSwimlaneIndex: number\n ): Connection | null {\n const { sourcePoint, sourceSwimlaneIndex } = this.draggingConnectionData;\n\n if (!sourcePoint || sourceSwimlaneIndex === undefined) {\n console.error('Missing source data for connection');\n return null;\n }\n\n const connection: Connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: targetNodeId,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPointId,\n sourceSwimlaneIndex: sourceSwimlaneIndex,\n targetSwimlaneIndex: targetSwimlaneIndex,\n label: '',\n action: null,\n };\n\n this.connections.push(connection);\n console.log('Created connection:', connection);\n console.log(\n 'Connections array now has',\n this.connections.length,\n 'connections'\n );\n return connection;\n }\n\n // Add a method to get connection data for rendering\n getConnectionData(connection: Connection): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n targetSwimlaneIndex: number;\n } | null {\n const sourceNodeInfo = this.findNodeById(connection.sourceNodeId);\n const targetNodeInfo = this.findNodeById(connection.targetNodeId);\n\n if (!sourceNodeInfo || !targetNodeInfo) {\n return null;\n }\n\n const sourceNode = sourceNodeInfo.node;\n const targetNode = targetNodeInfo.node;\n\n // Find connection points\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.id === connection.targetPointId\n );\n\n if (!sourcePoint || !targetPoint) {\n return null;\n }\n\n // Calculate global coordinates\n const startX = sourceNode.x + sourcePoint.x;\n const startY =\n sourceNode.y + sourcePoint.y + connection.sourceSwimlaneIndex * 263;\n\n const endX = targetNode.x + targetPoint.x;\n const endY =\n targetNode.y + targetPoint.y + connection.targetSwimlaneIndex * 263;\n\n return {\n startX,\n startY,\n endX,\n endY,\n sourceSwimlaneIndex: connection.sourceSwimlaneIndex,\n targetSwimlaneIndex: connection.targetSwimlaneIndex,\n };\n }\n\n // Add a method to check if a connection is allowed based on node types\n canConnect(sourceNodeType: string, targetNodeType: string): boolean {\n return (\n this.connectionRules[sourceNodeType]?.includes(targetNodeType) || false\n );\n }\n\n // Add a method to get allowed node types for the current dragging connection\n getAllowedTargetNodeTypes(): string[] {\n if (!this.draggingConnectionData.sourcePoint) {\n return [];\n }\n\n const sourceNodeInfo = this.findNodeById(\n this.draggingConnectionData.sourcePoint.nodeId\n );\n if (!sourceNodeInfo) {\n return [];\n }\n\n const sourceNodeType = sourceNodeInfo.node.type;\n\n return this.connectionRules[sourceNodeType] || [];\n }\n\n updateSwimlane(index: number, name: string, tags: Tag[]) {\n console.log(\n 'State: Updating swimlane at index',\n index,\n 'with name',\n name,\n 'and tags',\n tags\n );\n\n if (index >= 0 && index < this.swimlanes.length) {\n this.swimlanes[index] = {\n ...this.swimlanes[index],\n label: name,\n tags: tags,\n };\n console.log('Swimlane updated:', this.swimlanes[index]);\n } else {\n console.error('Invalid swimlane index:', index);\n }\n }\n\n transformToWorkflowModel(): Workflow {\n // Use stored workflow if available, otherwise create a new one\n const workflow: Workflow = this.workflow\n ? { ...this.workflow, DataState: ObjectState.Changed }\n : {\n // BaseModel properties\n Id: '',\n Code: '',\n TenantId: '',\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(this.workflowId || '')\n ? ObjectState.Changed\n : ObjectState.New,\n\n // Workflow specific properties\n Name: 'New Workflow',\n Description: '',\n StageEntryRule: '',\n Form: this.workflowFormId || undefined,\n AssignmentType: TaskAssignmentType.AutoRoute,\n Operation: '',\n Status: Status.Active,\n Actions: [],\n Lanes: [],\n Stages: [],\n };\n\n // Update workflow form if changed\n if (this.workflowFormId !== this.workflow?.Form) {\n workflow.Form = this.workflowFormId || workflow.Form;\n }\n\n // Transform swimlanes to SwimLane[]\n workflow.Lanes = this.swimlanes.map((swimlane) => {\n // Check if this is an existing swimlane\n if (swimlane.id && this.swimlaneRecord[swimlane.id]) {\n // Update existing lane with changed values\n const existingLane = this.swimlaneRecord[swimlane.id];\n return {\n ...existingLane,\n Name: swimlane.label,\n Tags: swimlane.tags,\n Position: swimlane.order,\n Coordinates: { X: 0, Y: swimlane.order * 263 },\n DataState: ObjectState.Changed,\n UpdatedAt: new Date(),\n };\n } else {\n // Generate a new ID for new swimlanes if not already set\n const laneId =\n swimlane.id ||\n `lane-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n\n // Create new lane\n return {\n Code: '',\n Id: '',\n TenantId: '',\n // id: laneId,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n Workflow: workflow.Code,\n Name: swimlane.label,\n Tags: swimlane.tags || [],\n Position: swimlane.order,\n Coordinates: { X: 0, Y: swimlane.order * 263 },\n Size: { Width: 3000, Height: 263 },\n Key: swimlane.id,\n };\n }\n });\n\n // Transform nodes to WorkflowStage[]\n const stages: WorkflowStage[] = [];\n\n this.swimlanes.forEach((swimlane, swimlaneIndex) => {\n swimlane.nodes?.forEach((node) => {\n if (node.type === 'stage' || node.type === 'subflow') {\n console.log(node);\n // Check if this is an existing stage\n if (this.stageRecord[node.id]) {\n // Update existing stage with changed values\n const existingStage = this.stageRecord[node.id];\n\n // Create a new object with updated properties\n const updatedStage: WorkflowStage = {\n ...existingStage,\n DataState: ObjectState.Changed,\n UpdatedAt: new Date(),\n };\n\n // Update properties that may have changed\n if (node.stageData?.Name !== undefined)\n updatedStage.Name =\n node.workflowData?.name ?? node.stageData.Name;\n if (node.stageData?.Description !== undefined)\n updatedStage.Description = node.stageData.Description;\n if (node.stageData?.Duration !== undefined)\n updatedStage.Duration = node.stageData.Duration;\n if (node.stageData?.PassOnRule !== undefined)\n updatedStage.PassOnRule = node.stageData.PassOnRule;\n if (node.stageData?.ActorRule !== undefined)\n updatedStage.ActorRule = node.stageData.ActorRule;\n if (node.stageData?.AssignmentType !== undefined)\n updatedStage.AssignmentType = node.stageData.AssignmentType;\n if (node.stageData?.MinNoOfActor !== undefined)\n updatedStage.MinNoOfActor = node.stageData.MinNoOfActor;\n if (node.stageData?.IsParallel !== undefined)\n updatedStage.IsParallel = node.stageData.IsParallel;\n if (node.stageData?.Tags) updatedStage.Tags = node.stageData.Tags;\n\n // Always update these properties\n updatedStage.IsEntryPoint = node.isStartNode;\n updatedStage.IsExitPoint = node.stageData?.IsExitPoint || false;\n updatedStage.Form = node.stageData?.formId || '';\n updatedStage.Coordinates = { X: node.x, Y: node.y };\n updatedStage.SwimLane = this.swimlanes[swimlaneIndex].id || '';\n\n // console.log(\"NODE_TYPE\", node.type);\n\n // Handle subflow stage\n if (node.type === 'subflow') {\n updatedStage.IsSubProcess = true;\n updatedStage.SubWorkFlow = node.workflowData?.id || '';\n updatedStage.Name = node.workflowData?.name || '';\n }\n\n // Add to stages\n stages.push(updatedStage);\n } else {\n // Create a new stage\n stages.push({\n Id: '',\n Code: '',\n TenantId: '',\n // id: node.id,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n Workflow: workflow.Code,\n Name:\n (node.type === 'subflow'\n ? node.workflowData?.name\n : node.stageData?.Name) ?? '',\n Description: node.stageData?.Description || '',\n Duration: node.stageData?.Duration || 0,\n PassOnRule: node.stageData?.PassOnRule || '',\n ActorRule: node.stageData?.ActorRule || StageActorRule.None,\n MinNoOfActor: node.stageData?.MinNoOfActor || 0,\n IsParallel: node.stageData?.IsParallel || false,\n IsEntryPoint: node.isStartNode,\n IsExitPoint: node.stageData?.IsExitPoint || false, // Will be updated below\n Tags: node.stageData?.Tags || [],\n Form: node.stageData?.formId ?? '',\n AllowMultiSubProcess: false,\n AssignmentType:\n node.stageData?.AssignmentType ||\n this.workflow?.AssignmentType ||\n TaskAssignmentType.AutoRoute,\n SubWorkFlow: node.workflowData?.id || '',\n SwimLane: this.swimlanes[swimlaneIndex].id || '',\n Coordinates: { X: node.x, Y: node.y },\n IsSubProcess: node.type === 'subflow',\n Key: node.stageData?.Key || node.id,\n });\n }\n }\n });\n });\n\n // // Determine which stages are exit points (no outgoing connections)\n // stages.forEach((stage) => {\n // const hasOutgoingConnections = this.connections.some(\n // (conn) =>\n // conn.sourceNodeId === stage.Code || conn.sourceNodeId === stage.id\n // );\n // if (!hasOutgoingConnections) {\n // stage.IsExitPoint = true;\n // }\n // });\n\n // Transform connections to WorkflowAction[]\n const actions: WorkflowAction[] = [];\n\n this.connections.forEach((conn) => {\n const sourceNode = this.findNodeById(conn.sourceNodeId)?.node;\n const targetNode = this.findNodeById(conn.targetNodeId)?.node;\n\n // Check if this is an existing action\n if (this.actionRecord[conn.id]) {\n // Update existing action with changed values\n const existingAction = this.actionRecord[conn.id];\n\n // Create updated action with changed properties\n const updatedAction: WorkflowAction = {\n ...existingAction,\n DataState: ObjectState.Changed,\n UpdatedAt: new Date(),\n };\n\n // Update properties that may have changed\n updatedAction.Name =\n conn.label ??\n `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'\n }`;\n updatedAction.OperationAction = conn.action;\n updatedAction.IsParallel = targetNode?.stageData?.IsParallel || false;\n updatedAction.PassOnRule = conn.condition || '';\n updatedAction.TargetStatus = conn.targetStatus || undefined;\n // updatedAction.SourcePointType = this.getConnectionPointType(conn.sourcePointId);\n // updatedAction.TargetPointType = this.getConnectionPointType(conn.targetPointId);\n\n actions.push(updatedAction);\n } else {\n // Create a new action\n actions.push({\n Id: '',\n Code: '',\n TenantId: '',\n // id: conn.id,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n Workflow: workflow.Code,\n Name:\n conn.label ??\n `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'\n }`,\n OperationAction: conn.action,\n TargetStatus: conn.targetStatus,\n FromStage: conn.sourceNodeId,\n ToStage: conn.targetNodeId,\n IsParallel: sourceNode?.stageData?.IsParallel || false,\n PassOnRule: conn.condition || '',\n SourcePointType: this.getConnectionPointType(conn.sourcePointId),\n TargetPointType: this.getConnectionPointType(conn.targetPointId),\n });\n }\n });\n\n // Add deleted objects with Removed state\n Object.keys(this.stageRecord).forEach((stageId) => {\n const exists = stages.some(\n (stage) => stage.Code === stageId || stage.id === stageId\n );\n\n if (!exists) {\n const stage = this.stageRecord[stageId];\n stages.push({\n ...stage,\n DataState: ObjectState.Removed,\n UpdatedAt: new Date(),\n });\n }\n });\n\n Object.keys(this.actionRecord).forEach((actionId) => {\n const exists = actions.some(\n (action) => action.Code === actionId || action.id === actionId\n );\n\n if (!exists) {\n const action = this.actionRecord[actionId];\n actions.push({\n ...action,\n DataState: ObjectState.Removed,\n UpdatedAt: new Date(),\n });\n }\n });\n\n // Handle deleted swimlanes\n Object.keys(this.swimlaneRecord).forEach((laneId) => {\n const exists = workflow.Lanes.some(\n (lane) => lane.Code === laneId || lane.id === laneId\n );\n\n if (!exists) {\n const lane = this.swimlaneRecord[laneId];\n workflow.Lanes.push({\n ...lane,\n DataState: ObjectState.Removed,\n UpdatedAt: new Date(),\n });\n }\n });\n\n workflow.Stages = stages;\n workflow.Actions = actions;\n\n return workflow;\n }\n\n getConnectionPointType(\n pointId: string\n ): 'top' | 'right' | 'bottom' | 'left' | undefined {\n // Extract the type from the connection point ID format\n // which is usually something like \"node-id-top-50\"\n const parts = pointId.split('-');\n const typeIndex = parts.findIndex(\n (part) =>\n part === 'top' ||\n part === 'right' ||\n part === 'bottom' ||\n part === 'left'\n );\n\n if (typeIndex >= 0) {\n return parts[typeIndex] as 'top' | 'right' | 'bottom' | 'left';\n }\n\n return undefined;\n }\n\n // Add a new property to track loaded objects\n loadedObjectIds: { [key: string]: string } = {}; // Format: { id: code }\n\n // Add a method to register loaded objects\n registerLoadedObject(id: string, code: string): void {\n this.loadedObjectIds[id] = code;\n }\n\n // Method to check if an object was loaded from API\n wasLoadedFromApi(id: string): boolean {\n return id in this.loadedObjectIds;\n }\n\n // Method to get the code for a loaded object\n getCodeForObject(id: string): string {\n return this.loadedObjectIds[id] || '';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActorTag, Escalation, FlowableStatus, Form, ObjectState, OperationAction, Paged, ReportSchedule, StageActorRule, Status, Tag, TaskAssignmentType, Workflow, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService, HttpWebRequestService } from 'verben-workflow-ui/src/lib/services';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowDataService {\n private readonly WORKFLOW_MODEL_BASE_PATH = 'Workflow';\n private readonly AUTH_MODEL_BASE_PATH = 'User';\n private readonly FORM_MODEL_BASE_PATH = 'Form';\n private readonly ESCALATION_MODEL_BASE_PATH = 'Escalation';\n private readonly RS_MODEL_BASE_PATH = 'Report';\n private readonly UTIL_BASE_PATH = 'Util';\n private readonly ACTOR_MODEL_BASE_PATH = 'Actor';\n private readonly FLOWABLE_STATUS_MODEL_BASE_PATH = 'Status';\n\n constructor(\n private httpService: HttpWebRequestService,\n private envSvc: EnvironmentService\n ) { }\n\n getWorkflowWithParam(\n param: string,\n skip: number = 0,\n limit: number = 1,\n sortParam: string = 'CreatedAt',\n sortOrder: string = 'Asc'\n ): Promise<Paged<Workflow>> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/GetWorkflowsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;\n return this.httpService.get(url) as Promise<Paged<Workflow>>;\n }\n\n getWorkflows(skip: number = 0, limit: number = 0): Promise<Paged<Workflow>> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/GetWorkflows/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.WorkFlowAPI\n ) as Promise<Paged<Workflow>>;\n }\n\n getForms(skip: number = 0, limit: number = 0): Promise<Paged<Form>> {\n const url = `${this.FORM_MODEL_BASE_PATH}/GetForms/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.WorkFlowAPI\n ) as Promise<Paged<Form>>;\n }\n\n getTags(skip: number = 0, limit: number = 0): Promise<Paged<Tag>> {\n const url = `${this.AUTH_MODEL_BASE_PATH}/GetTags/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.AuthAPI\n ) as Promise<Paged<Tag>>;\n }\n\n saveWorkflows(requests: Partial<Workflow>[]): Promise<any> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/SaveWorkflows`;\n // console.log('Saving workflows', requests);\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n deleteWorkflowStages(requests: WorkflowStage['Code'][]): Promise<any> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/DeleteWorkflowStage`;\n // console.log('Saving workflows', requests);\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n saveEscalations(requests: Partial<Escalation>[]): Promise<any> {\n const url = `${this.ESCALATION_MODEL_BASE_PATH}/SaveEscalations`;\n // console.log('Saving workflows', requests);\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n searchEscalationWithParam(\n params: Pick<Escalation, 'Workflow' | 'Stage' | 'Type'>,\n skip: number = 0,\n limit: number = 1,\n sortOrder: string = 'Asc'\n ): Promise<Paged<Escalation>> {\n const url = `${this.ESCALATION_MODEL_BASE_PATH}/SearchEscalations/${skip}/${limit}`;\n const payload = Object.entries(params).map(([key, value]) => ({\n IsAutoFromDate: true,\n IsAutoEndDate: true,\n PropertyName: key,\n EntityValue: value,\n Type: 'String',\n Operator: 'And',\n Sign: 'EQ',\n Sort: sortOrder,\n // Fields: ['string'],\n }));\n return this.httpService.post(url, payload) as Promise<Paged<Escalation>>;\n }\n\n getEscalationWithParam(\n param: string,\n skip: number = 0,\n limit: number = 1,\n sortParam: string = 'CreatedAt',\n sortOrder: string = 'Asc'\n ): Promise<Paged<Escalation>> {\n const url = `${this.ESCALATION_MODEL_BASE_PATH}/GetEscalationsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;\n return this.httpService.get(url) as Promise<Paged<Escalation>>;\n }\n\n getReportSchedules(\n skip: number = 0,\n limit: number = 0\n ): Promise<Paged<ReportSchedule>> {\n const url = `${this.RS_MODEL_BASE_PATH}/GetReportSchedules/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.ReportingAPI\n ) as Promise<Paged<ReportSchedule>>;\n }\n\n getOperationActions(\n skip: number = 0,\n limit: number = 0\n ): Promise<Paged<OperationAction>> {\n const url = `${this.UTIL_BASE_PATH}/GetOperationAction`;\n return this.httpService.get(\n url,\n // this.envSvc.environment.GLAPI\n ) as Promise<Paged<OperationAction>>;\n }\n\n saveActorTags(requests: ActorTag[]): Promise<any> {\n const url = `${this.ACTOR_MODEL_BASE_PATH}/SaveActorTags`;\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n getFlowableStatuses(\n skip: number = 0,\n limit: number = 0\n ): Promise<Paged<FlowableStatus>> {\n const url = `${this.FLOWABLE_STATUS_MODEL_BASE_PATH}/GetFlowableStatus/${skip}/${limit}/CreatedAt/Desc`;\n return this.httpService.get(url) as Promise<Paged<FlowableStatus>>;\n }\n\n // Helper to create a mock workflow (just for demo)\n private createMockWorkflow(code: string): Workflow {\n // Return a simple workflow with one lane and one stage\n const workflow: Workflow = {\n Id: 'workflow-123',\n Code: code,\n TenantId: 'tenant-1',\n id: 'workflow-123',\n ServiceName: 'workflow-service',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.Unchanged,\n Name: 'Sample Workflow',\n Description: 'A sample workflow loaded from API',\n StageEntryRule: '',\n AssignmentType: TaskAssignmentType.AutoRoute,\n Status: Status.Active,\n Actions: [],\n Lanes: [\n {\n Id: 'lane-0',\n Code: 'lane-0',\n TenantId: 'tenant-1',\n id: 'lane-0',\n ServiceName: 'workflow-service',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.Unchanged,\n Workflow: 'workflow-123',\n Tags: [],\n Position: 0,\n Coordinates: { X: 0, Y: 0 },\n Size: { Width: 3000, Height: 263 },\n },\n ],\n Stages: [\n {\n Id: 'stage-123',\n Code: 'stage-123',\n TenantId: 'tenant-1',\n id: 'stage-123',\n ServiceName: 'workflow-service',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.Unchanged,\n Workflow: 'workflow-123',\n Name: 'Initial Stage',\n Description: 'Starting point',\n Duration: 24,\n PassOnRule: '',\n ActorRule: StageActorRule.None,\n MinNoOfActor: 1,\n IsParallel: false,\n IsEntryPoint: true,\n IsExitPoint: false,\n Tags: [],\n Form: '',\n AllowMultiSubProcess: false,\n AssignmentType: TaskAssignmentType.AutoRoute,\n SubWorkFlow: '',\n SwimLane: 'lane-0',\n Coordinates: { X: 100, Y: 50 },\n IsSubProcess: false,\n },\n ],\n };\n\n return workflow;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Node, ToolType, ConnectionPoint } from '../workflow-designer.types';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeManagementService {\n constructor(private state: WorkflowDesignerState) {}\n\n /**\n * Adds a new node to the specified swimlane\n */\n addNode(\n swimlaneIndex: number,\n type: ToolType,\n x: number,\n y: number,\n stageData?: Partial<WorkflowStage>,\n workflowData?: { id: string; name: string }\n ): Node | null {\n if (\n !this.state.swimlanes[swimlaneIndex] ||\n !type ||\n (type !== 'stage' &&\n type !== 'decision' &&\n type !== 'form' &&\n type !== 'subflow')\n ) {\n return null;\n }\n\n // Adjust position relative to swimlane\n const adjustedY = y - swimlaneIndex * 263 - 40; // Subtracting header height\n\n // Generate a unique ID\n const id = `${type}-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n\n // Create node with dimensions based on type\n const node: Node = {\n id,\n type,\n x,\n y: adjustedY,\n width: type === 'subflow' ? 150 : 169, // Width from SVG\n height: 100, // Height from SVG\n isStartNode: false, // Default to false\n stageData: stageData || {}, // Store stage data\n workflowData: workflowData || null,\n };\n\n // If this is the first node in the entire workflow, mark it as the start node\n if (this.getNodeCount() === 0) {\n node.isStartNode = true;\n this.state.startNodeId = id;\n }\n\n // Generate connection points for the node\n node.connectionPoints = this.generateConnectionPoints(node);\n\n // Add node to the swimlane\n if (!this.state.swimlanes[swimlaneIndex].nodes) {\n this.state.swimlanes[swimlaneIndex].nodes = [];\n }\n this.state.swimlanes[swimlaneIndex].nodes.push(node);\n\n return node;\n }\n\n /**\n * Gets the total count of nodes across all swimlanes\n */\n getNodeCount(): number {\n return this.state.swimlanes.reduce(\n (count, swimlane) => count + (swimlane.nodes?.length || 0),\n 0\n );\n }\n\n /**\n * Find a node by ID\n */\n findNodeById(id: string): { node: Node; swimlaneIndex: number } | null {\n for (let i = 0; i < this.state.swimlanes.length; i++) {\n const swimlane = this.state.swimlanes[i];\n const node = swimlane.nodes?.find((n) => n.id === id);\n if (node) {\n return { node, swimlaneIndex: i };\n }\n }\n return null;\n }\n\n /**\n * Generate connection points for a node\n */\n generateConnectionPoints(node: Node): ConnectionPoint[] {\n const points: ConnectionPoint[] = [];\n const spacing = 50; // Space between connection points\n\n if (node.type === 'stage') {\n // Rectangular shapes - add points around the rectangle\n\n // Top edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-top-${x}`,\n nodeId: node.id,\n x: x,\n y: 0,\n type: 'top',\n });\n }\n\n // Right edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-right-${y}`,\n nodeId: node.id,\n x: node.width,\n y: y,\n type: 'right',\n });\n }\n\n // Bottom edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-bottom-${x}`,\n nodeId: node.id,\n x: x,\n y: node.height,\n type: 'bottom',\n });\n }\n\n // Left edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'decision') {\n // Diamond shape - add points at the four corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-0`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 2,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-0`,\n nodeId: node.id,\n x: 0,\n y: node.height / 2,\n type: 'left',\n });\n } else if (node.type === 'form') {\n // Form only has input connection points, no output points\n\n // Left edge points (for input connections)\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'subflow') {\n // Hexagon shape - add points at the six corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-top`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-right-bottom`,\n nodeId: node.id,\n x: node.width,\n y: (node.height * 3) / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-bottom`,\n nodeId: node.id,\n x: 0,\n y: (node.height * 3) / 4,\n type: 'left',\n });\n\n points.push({\n id: `${node.id}-left-top`,\n nodeId: node.id,\n x: 0,\n y: node.height / 4,\n type: 'left',\n });\n }\n\n return points;\n }\n\n /**\n * Update node properties\n */\n updateNodeProperties(nodeId: string, properties: Partial<Node>): boolean {\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n const { node, swimlaneIndex } = nodeInfo;\n\n // Update the node with new properties\n Object.assign(node, properties);\n\n return true;\n }\n\n /**\n * Update stage data for a node\n */\n updateStageData(nodeId: string, stageData: Partial<WorkflowStage>): boolean {\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n const { node } = nodeInfo;\n\n // Update the stage data\n node.stageData = {\n ...node.stageData,\n ...stageData,\n };\n\n return true;\n }\n\n /**\n * Set a node as a start node\n */\n setAsStartNode(nodeId: string): boolean {\n // First, clear any existing start nodes\n this.state.swimlanes.forEach((swimlane) => {\n swimlane.nodes?.forEach((node) => {\n if (node.isStartNode) {\n node.isStartNode = false;\n }\n });\n });\n\n // Then set the new start node\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n nodeInfo.node.isStartNode = true;\n this.state.startNodeId = nodeId;\n\n return true;\n }\n\n /**\n * Delete a node\n */\n deleteNode(nodeId: string): boolean {\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n const { swimlaneIndex } = nodeInfo;\n\n // Find the node index in the swimlane\n const nodeIndex = this.state.swimlanes[swimlaneIndex].nodes?.findIndex(\n (n) => n.id === nodeId\n );\n\n if (nodeIndex === undefined || nodeIndex === -1) return false;\n\n // Remove the node\n this.state.swimlanes[swimlaneIndex].nodes?.splice(nodeIndex, 1);\n\n // If this was the start node, clear the start node ID\n if (this.state.startNodeId === nodeId) {\n this.state.startNodeId = null;\n }\n\n // Remove any connections associated with this node\n this.state.connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId !== nodeId && conn.targetNodeId !== nodeId\n );\n\n // Remove connection points associated with this node\n this.state.swimlanes[swimlaneIndex].nodes?.forEach((node) => {\n if (node.connectionPoints) {\n node.connectionPoints = node.connectionPoints.filter(\n (point) => point.nodeId !== nodeId\n );\n }\n });\n\n return true;\n }\n\n /**\n * Check if a node has outgoing connections\n */\n hasOutgoingConnections(nodeId: string): boolean {\n return this.state.connections.some((conn) => conn.sourceNodeId === nodeId);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SwimlaneItem } from '../workflow-designer.types';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SwimlaneService {\n readonly swimlaneHeight = 263;\n\n constructor(private state: WorkflowDesignerState) {}\n\n /**\n * Add a new swimlane\n */\n addSwimlane(name: string, tags: Tag[]): SwimlaneItem {\n const newSwimlane: SwimlaneItem = {\n order: this.state.swimlanes.length,\n label: name,\n tags,\n nodes: [],\n };\n\n this.state.swimlanes.push(newSwimlane);\n return newSwimlane;\n }\n\n /**\n * Update an existing swimlane\n */\n updateSwimlane(index: number, name: string, tags: Tag[]): boolean {\n if (index < 0 || index >= this.state.swimlanes.length) {\n console.error('Invalid swimlane index:', index);\n return false;\n }\n\n this.state.swimlanes[index] = {\n ...this.state.swimlanes[index],\n label: name,\n tags: tags,\n };\n\n return true;\n }\n\n /**\n * Reorder swimlanes (move a swimlane up or down in the list)\n */\n reorderSwimlane(fromIndex: number, toIndex: number): boolean {\n if (\n fromIndex < 0 ||\n fromIndex >= this.state.swimlanes.length ||\n toIndex < 0 ||\n toIndex >= this.state.swimlanes.length\n ) {\n return false;\n }\n\n // Remove the swimlane from its current position\n const [swimlane] = this.state.swimlanes.splice(fromIndex, 1);\n\n // Insert it at the new position\n this.state.swimlanes.splice(toIndex, 0, swimlane);\n\n // Update order properties for all swimlanes\n this.state.swimlanes.forEach((lane, idx) => {\n lane.order = idx;\n });\n\n return true;\n }\n\n /**\n * Delete a swimlane by index\n */\n deleteSwimlane(index: number): boolean {\n if (index < 0 || index >= this.state.swimlanes.length) {\n return false;\n }\n\n // Check if the swimlane has nodes\n if (this.state.swimlanes[index].nodes?.length) {\n console.error('Cannot delete swimlane with nodes');\n return false;\n }\n\n // Remove the swimlane\n this.state.swimlanes.splice(index, 1);\n\n // Update order properties for all swimlanes\n this.state.swimlanes.forEach((lane, idx) => {\n lane.order = idx;\n });\n\n return true;\n }\n\n /**\n * Get all swimlanes\n */\n getSwimlanes(): SwimlaneItem[] {\n return this.state.swimlanes;\n }\n\n /**\n * Get swimlane by index\n */\n getSwimlane(index: number): SwimlaneItem | null {\n if (index < 0 || index >= this.state.swimlanes.length) {\n return null;\n }\n return this.state.swimlanes[index];\n }\n\n /**\n * Calculate total canvas height needed for all swimlanes\n */\n calculateCanvasHeight(minHeight: number = 2000): number {\n const requiredHeight =\n (this.state.swimlanes.length + 1) * this.swimlaneHeight;\n return Math.max(minHeight, requiredHeight);\n }\n\n /**\n * Check if a Y position is within any swimlane\n */\n isPositionInsideSwimlane(y: number): boolean {\n // Check if y position is within any swimlane\n const swimlaneCount = this.state.swimlanes.length;\n if (swimlaneCount === 0) return false;\n\n // Each swimlane has a height of 263px\n const totalSwimlaneHeight = swimlaneCount * this.swimlaneHeight;\n\n // Check if y is within the total height of all swimlanes\n return y >= 0 && y < totalSwimlaneHeight;\n }\n\n /**\n * Calculate swimlane index from Y position\n */\n getSwimlaneIndexFromPosition(y: number): number {\n if (!this.isPositionInsideSwimlane(y)) return -1;\n return Math.floor(y / this.swimlaneHeight);\n }\n\n /**\n * Find swimlane index by Lane ID\n */\n findSwimlaneIndexByLaneId(laneId: string): number {\n // In a real implementation, you would maintain a mapping between API lane IDs and UI swimlane indices\n // For now we'll just return the index based on position\n const parts = laneId.split('-');\n if (parts.length > 1) {\n const index = parseInt(parts[1]);\n if (!isNaN(index) && index < this.state.swimlanes.length) {\n return index;\n }\n }\n return -1;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { NodeManagementService } from '../services/node-management.service';\nimport { SwimlaneService } from '../services/swimlane.service';\nimport { ToolType } from '../workflow-designer.types';\nimport { ToolbarItem } from './designer-toolbar.types';\n\n@Component({\n selector: 'lib-designer-toolbar',\n templateUrl: './designer-toolbar.component.html',\n styleUrl: './designer-toolbar.component.css',\n})\nexport class DesignerToolbarComponent {\n @Input() selectedTool: ToolType = null;\n @Input() isSaving: boolean = false;\n @Input() workflowCode: string | null = null;\n @Output() openActorTags = new EventEmitter<void>();\n @Output() toolSelected = new EventEmitter<ToolType>();\n @Output() saveWorkflow = new EventEmitter<void>();\n\n // Simple array of toolbar items\n toolbarItems: ToolbarItem[] = [\n { id: 'swimlane', label: 'Swimlane' },\n { id: 'stage', label: 'Stage' },\n // { id: 'action', label: 'Action' },\n // { id: 'form', label: 'Form' },\n { id: 'decision', label: 'Decision' },\n // { id: 'subflow', label: 'Subflow' },\n ];\n\n constructor(\n private nodeService: NodeManagementService,\n private swimlaneService: SwimlaneService\n ) { }\n\n /**\n * Handle tool button click\n */\n onToolClick(tool: ToolType): void {\n this.toolSelected.emit(tool);\n }\n\n /**\n * Check if a tool should be enabled\n */\n isEnabled(type: ToolType): boolean {\n switch (type) {\n case 'swimlane':\n return true; // Always enabled\n case 'stage':\n case 'decision':\n // Enabled if there are swimlanes available\n return this.swimlaneService.getSwimlanes().length > 0;\n case 'form':\n case 'action':\n case 'subflow':\n // Only enabled if there are nodes in the workflow\n return this.nodeService.getNodeCount() > 0;\n default:\n return false;\n }\n }\n\n /**\n * Handle save button click\n */\n onSaveClick(): void {\n this.saveWorkflow.emit();\n }\n\n onActorTagsClick(): void {\n this.openActorTags.emit();\n }\n}\n","<div class=\"designer-toolbar\">\n <div class=\"toolbar-container\">\n <button\n *ngFor=\"let item of toolbarItems\"\n class=\"tool-button\"\n [class.active]=\"selectedTool === item.id\"\n [class.disabled]=\"!isEnabled(item.id)\"\n (click)=\"onToolClick(item.id)\"\n [title]=\"item.label\"\n [disabled]=\"!isEnabled(item.id)\"\n style=\"width: 60px; height: auto\"\n >\n <!-- {{ item.label }} -->\n <img\n [src]=\"'icons/' + item.id + '.svg'\"\n [alt]=\"item.label\"\n class=\"tool-icon\"\n />\n </button>\n </div>\n\n <verbena-button\n *ngIf=\"workflowCode\"\n buttonClass=\"actor-tags-button\"\n (click)=\"onActorTagsClick()\"\n type=\"button\"\n text=\"+ Actor Tags\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n height=\"39px\"\n class=\"ml-2\"\n ></verbena-button>\n\n <verbena-button\n buttonClass=\"save-button\"\n (click)=\"onSaveClick()\"\n [isLoading]=\"isSaving\"\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n ></verbena-button>\n</div>\n","import {\n Component,\n EventEmitter,\n Input,\n Output,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { Node } from '../workflow-designer.types';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { Form } from 'verben-workflow-ui/src/lib/models';\nimport { EscalationType } from 'verben-workflow-ui/src/lib/models';\n\n@Component({\n selector: 'svg:g[lib-stage-node]',\n templateUrl: './stage-node.component.html',\n styleUrls: ['./stage-node.component.css'],\n})\nexport class StageNodeComponent {\n @Input() node!: Node;\n @Input() isStartNode: boolean = false;\n @Input() stageData: Partial<WorkflowStage> = {};\n @Output() stagePropertiesUpdated = new EventEmitter<{\n nodeId: string;\n stageData: Partial<WorkflowStage>;\n }>();\n @Output() parallelExecutionToggled = new EventEmitter<{\n sourceNodeId: string;\n isParallel: boolean;\n }>();\n @Output() showShieldDialog = new EventEmitter<string>();\n @Output() showEscalationDialog = new EventEmitter<{\n stageId: string;\n type: EscalationType;\n }>();\n @Output() showFormDialog = new EventEmitter<MouseEvent>();\n\n // Properties for icon click events\n showFormPopup: boolean = false;\n showTimerPopup: boolean = false;\n showActionPopupLeft: boolean = false;\n showActionPopupRight: boolean = false;\n showCodePopup: boolean = false;\n\n formsList: Form[] = [];\n isLoadingForms: boolean = false;\n\n formPopupX: number = 0;\n formPopupY: number = 0;\n\n constructor(\n private state: WorkflowDesignerState,\n private dataService: WorkflowDataService\n ) {}\n\n ngOnInit(): void {\n console.log('Stage node initialized with:', this.node);\n this.updateConnectedStagesInfo();\n }\n\n // Method to check if this stage has multiple outgoing connections to other stages\n updateConnectedStagesInfo(): void {\n // Count the number of outgoing connections that connect to stages\n const outgoingConnections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === this.node.id\n );\n\n // Check if the target nodes are stages\n const connectedStageNodes = outgoingConnections\n .map((conn) => this.state.findNodeById(conn.targetNodeId))\n .filter((nodeInfo) => nodeInfo && nodeInfo.node.type === 'stage');\n\n this.node.hasMultipleConnectedStages = connectedStageNodes.length > 1;\n this.node.hasParallelStages = connectedStageNodes.every(\n (nd) => nd?.node.stageData?.IsParallel\n );\n }\n\n get hasMultipleConnectedStages(): boolean {\n return this.node.hasMultipleConnectedStages === true;\n }\n\n get isParallelExecution(): boolean {\n return this.node.hasParallelStages === true;\n }\n\n selectForm(form: Form | null) {\n // If form is null, we're clearing the selection\n if (!this.node.stageData) {\n this.node.stageData = {};\n }\n\n if (form) {\n this.node.stageData.formId = form.Code;\n this.node.stageData.formName = form.Name;\n } else {\n // Clear form selection\n delete this.node.stageData.formId;\n delete this.node.stageData.formName;\n }\n\n // Close the popup\n this.showFormPopup = false;\n\n // Emit an event to update the stage data\n this.stagePropertiesUpdated.emit({\n nodeId: this.node.id,\n stageData: this.node.stageData,\n });\n }\n\n toggleFormPopup(event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n\n // Calculate absolute position for the popup\n // const rect = (event.target as Element).getBoundingClientRect();\n // this.formPopupX = rect.left + window.scrollX;\n // this.formPopupY = rect.top + window.scrollY;\n }\n\n this.showFormDialog.emit(event);\n\n // // If we're opening the popup, load forms\n // if (!this.showFormPopup) {\n // this.isLoadingForms = true;\n // this.dataService\n // .getForms()\n // .then((response) => {\n // this.formsList = response.Result;\n // this.isLoadingForms = false;\n // })\n // .catch((error) => {\n // console.error('Error loading forms:', error);\n // this.isLoadingForms = false;\n // });\n // }\n\n // this.showFormPopup = !this.showFormPopup;\n }\n\n toggleShieldPopup(event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n console.log('Shield icon clicked for node:', this.node.id);\n console.log(this.stageData, this.node);\n this.showShieldDialog.emit(this.node.id);\n }\n\n toggleTimerPopup(event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.showTimerPopup = !this.showTimerPopup;\n }\n\n toggleActionPopup(side: 'left' | 'right', event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (side === 'left') {\n this.showActionPopupLeft = !this.showActionPopupLeft;\n this.showEscalationDialog.emit({\n stageId: this.node.id,\n type: EscalationType.OnEntry,\n });\n } else {\n this.showActionPopupRight = !this.showActionPopupRight;\n this.showEscalationDialog.emit({\n stageId: this.node.id,\n type: EscalationType.OnExit,\n });\n }\n }\n\n toggleCodePopup(event?: MouseEvent): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n // Toggle parallel execution state\n const newParallelState = !this.isParallelExecution;\n\n // Update this node's stage data\n if (!this.node.stageData) {\n this.node.stageData = {};\n }\n this.node.hasParallelStages = newParallelState;\n\n const outgoingConnections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === this.node.id\n );\n\n // Check if the target nodes are stages\n const connectedStageNodes = outgoingConnections\n .map((conn) => this.state.findNodeById(conn.targetNodeId))\n .filter((nodeInfo) => nodeInfo && nodeInfo.node.type === 'stage');\n\n this.state.swimlanes = this.state.swimlanes.map((sw, i) => {\n sw.nodes = sw?.nodes?.map((swNode) => {\n const foundNode = connectedStageNodes\n .map((connected) => connected?.node)\n .find((nde) => nde?.id === swNode.id);\n if (foundNode?.stageData) {\n foundNode.stageData.IsParallel = newParallelState;\n }\n return swNode;\n });\n\n return sw;\n });\n\n console.log(\n `Parallel execution ${\n newParallelState ? 'enabled' : 'disabled'\n } for node:`,\n this.node.id\n );\n }\n\n // This method should be called whenever connections change\n refreshState(): void {\n this.updateConnectedStagesInfo();\n }\n\n onStagePropertiesSaved(stageData: Partial<WorkflowStage>) {\n // Emit the event to the parent component with the node id and updated data\n this.stagePropertiesUpdated.emit({\n nodeId: this.node.id,\n stageData: stageData,\n });\n\n console.log('Stage properties updated:', stageData);\n }\n}\n","<svg:g>\n <!-- Stage node -->\n <svg:rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"transparent\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n style=\"pointer-events: all\"\n ></svg:rect>\n\n <!-- Top-left icon: Stage form -->\n <svg:g\n (click)=\"toggleFormPopup($event)\"\n class=\"stage-icon\"\n transform=\"translate(6, 6)\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"node.stageData?.formId ? '#D36CFF' : 'black'\"\n />\n </svg:g>\n\n <!-- Top-right icon: Shield -->\n <svg:g\n (click)=\"toggleShieldPopup($event)\"\n class=\"stage-icon\"\n [attr.transform]=\"'translate(' + (node.width - 30) + ', 6)'\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n\n <svg:path\n d=\"M7.5 12H16.5V13.5H7.5V12ZM7.5 7.5H16.5V9H7.5V7.5Z\"\n fill=\"black\"\n />\n <svg:path\n d=\"M12 22.5L7.36801 20.0303C6.0474 19.3279 4.94303 18.2791 4.17348 16.9964C3.40393 15.7138 2.99825 14.2458 3.00001 12.75V3C3.00001 2.60218 3.15804 2.22064 3.43935 1.93934C3.72065 1.65804 4.10218 1.5 4.50001 1.5H19.5C19.8978 1.5 20.2794 1.65804 20.5607 1.93934C20.842 2.22064 21 2.60218 21 3V12.75C21.0018 14.2458 20.5961 15.7138 19.8265 16.9964C19.057 18.2791 17.9526 19.3279 16.632 20.0303L12 22.5ZM4.50001 3V12.75C4.49917 13.9738 4.83141 15.1747 5.46111 16.224C6.09082 17.2733 6.99423 18.1315 8.07451 18.7065L12 20.7997L15.9255 18.7073C17.0059 18.1322 17.9094 17.2739 18.5391 16.2244C19.1688 15.175 19.501 13.9739 19.5 12.75V3H4.50001Z\"\n fill=\"black\"\n />\n </svg:g>\n\n @if (node.stageData?.Code) {\n <!-- Left-center icon: Thunderbolt -->\n <svg:g\n (click)=\"toggleActionPopup('left', $event)\"\n class=\"stage-icon\"\n transform=\"translate(6, 38)\"\n >\n <svg:path d=\"M11 15H6L13 1V9H18L11 23V15Z\" fill=\"black\" />\n </svg:g>\n\n <!-- Right-center icon: Thunderbolt -->\n <svg:g\n (click)=\"toggleActionPopup('right', $event)\"\n class=\"stage-icon\"\n [attr.transform]=\"'translate(' + (node.width - 30) + ', 38)'\"\n >\n <svg:path d=\"M11 15H6L13 1V9H18L11 23V15Z\" fill=\"black\" />\n </svg:g>\n }\n\n <!-- Bottom-left icon: Double slash text -->\n <svg:g\n *ngIf=\"hasMultipleConnectedStages\"\n (click)=\"toggleCodePopup($event)\"\n class=\"stage-icon\"\n [attr.transform]=\"'translate(6, ' + (node.height - 16) + ')'\"\n >\n <svg:text\n font-family=\"'Plus Jakarta Sans', sans-serif\"\n font-weight=\"500\"\n font-size=\"16px\"\n dominant-baseline=\"middle\"\n [attr.fill]=\"isParallelExecution ? '#D36CFF' : 'black'\"\n >\n //\n </svg:text>\n </svg:g>\n\n <!-- Bottom-right icon: Timer -->\n <svg:g\n (click)=\"toggleTimerPopup($event)\"\n class=\"stage-icon\"\n [attr.transform]=\"\n 'translate(' + (node.width - 30) + ', ' + (node.height - 30) + ')'\n \"\n >\n <svg:path\n d=\"M11.5 3C14.0196 3 16.4359 4.00089 18.2175 5.78249C19.9991 7.56408 21 9.98044 21 12.5C21 15.0196 19.9991 17.4359 18.2175 19.2175C16.4359 20.9991 14.0196 22 11.5 22C8.98044 22 6.56408 20.9991 4.78249 19.2175C3.00089 17.4359 2 15.0196 2 12.5C2 9.98044 3.00089 7.56408 4.78249 5.78249C6.56408 4.00089 8.98044 3 11.5 3ZM11.5 4C9.24566 4 7.08365 4.89553 5.48959 6.48959C3.89553 8.08365 3 10.2457 3 12.5C3 14.7543 3.89553 16.9163 5.48959 18.5104C7.08365 20.1045 9.24566 21 11.5 21C12.6162 21 13.7215 20.7801 14.7528 20.353C15.7841 19.9258 16.7211 19.2997 17.5104 18.5104C18.2997 17.7211 18.9258 16.7841 19.353 15.7528C19.7801 14.7215 20 13.6162 20 12.5C20 10.2457 19.1045 8.08365 17.5104 6.48959C15.9163 4.89553 13.7543 4 11.5 4ZM11 7H12V12.42L16.7 15.13L16.2 16L11 13V7Z\"\n fill=\"black\"\n />\n </svg:g>\n\n <!-- Label in the center -->\n <svg:text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-size=\"14\"\n fill=\"#000000\"\n >\n {{\n (node.stageData?.Name || \"Stage\").length > 12\n ? node.stageData?.Name?.substring(0, 10) + \"...\"\n : node.stageData?.Name || \"Stage\"\n }}\n </svg:text>\n</svg:g>\n\n<!-- <lib-stage-dialog\n [visible]=\"showShieldPopup()\"\n [stageData]=\"node.stageData || {}\"\n (closed)=\"showShieldPopup.set(false)\"\n (saved)=\"onStagePropertiesSaved($event)\"\n></lib-stage-dialog> -->\n","import { Injectable } from '@angular/core';\nimport { Form } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { ConnectionPoint } from '../workflow-designer.types';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Service for managing various popups in the workflow designer\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PopupService {\n // Connection creation popup\n private _connectionPopupVisible = new BehaviorSubject<boolean>(false);\n private _connectionPopupPosition = new BehaviorSubject<{\n x: number;\n y: number;\n }>({ x: 0, y: 0 });\n private _allowedNodeTypes = new BehaviorSubject<string[]>([]);\n\n // Form selection popup for stages\n private _formPopupVisible = new BehaviorSubject<boolean>(false);\n private _formPopupPosition = new BehaviorSubject<{ x: number; y: number }>({\n x: 0,\n y: 0,\n });\n private _formsList = new BehaviorSubject<Form[]>([]);\n private _isLoadingForms = new BehaviorSubject<boolean>(false);\n private _selectedNodeForForm = new BehaviorSubject<string | null>(null);\n\n // Workflow form selection popup for start node\n private _startNodeFormPopupVisible = new BehaviorSubject<boolean>(false);\n private _startNodeFormPopupPosition = new BehaviorSubject<{\n x: number;\n y: number;\n }>({ x: 0, y: 0 });\n\n // Subflow selection popup\n private _subflowPopupVisible = new BehaviorSubject<boolean>(false);\n private _subflowPopupPosition = new BehaviorSubject<{ x: number; y: number }>(\n { x: 0, y: 0 }\n );\n private _workflowsList = new BehaviorSubject<Workflow[]>([]);\n private _isLoadingWorkflows = new BehaviorSubject<boolean>(false);\n private _pendingSubflowPosition = new BehaviorSubject<{\n swimlaneIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Connection data for popups\n private _pendingConnectionSourcePoint =\n new BehaviorSubject<ConnectionPoint | null>(null);\n private _pendingConnectionSourceSwimlaneIndex = new BehaviorSubject<\n number | null\n >(null);\n\n constructor(private dataService: WorkflowDataService) {}\n\n // Connection popup observables\n get connectionPopupVisible() {\n return this._connectionPopupVisible.asObservable();\n }\n get connectionPopupPosition() {\n return this._connectionPopupPosition.asObservable();\n }\n get allowedNodeTypes() {\n return this._allowedNodeTypes.asObservable();\n }\n\n // Form popup observables\n get formPopupVisible() {\n return this._formPopupVisible.asObservable();\n }\n get formPopupPosition() {\n return this._formPopupPosition.asObservable();\n }\n get formsList() {\n return this._formsList.asObservable();\n }\n get isLoadingForms() {\n return this._isLoadingForms.asObservable();\n }\n get selectedNodeForForm() {\n return this._selectedNodeForForm.asObservable();\n }\n\n // Start node form popup observables\n get startNodeFormPopupVisible() {\n return this._startNodeFormPopupVisible.asObservable();\n }\n get startNodeFormPopupPosition() {\n return this._startNodeFormPopupPosition.asObservable();\n }\n\n // Subflow popup observables\n get subflowPopupVisible() {\n return this._subflowPopupVisible.asObservable();\n }\n get subflowPopupPosition() {\n return this._subflowPopupPosition.asObservable();\n }\n get workflowsList() {\n return this._workflowsList.asObservable();\n }\n get isLoadingWorkflows() {\n return this._isLoadingWorkflows.asObservable();\n }\n get pendingSubflowPosition() {\n return this._pendingSubflowPosition.asObservable();\n }\n\n // Connection data observables\n get pendingConnectionSourcePoint() {\n return this._pendingConnectionSourcePoint.asObservable();\n }\n get pendingConnectionSourceSwimlaneIndex() {\n return this._pendingConnectionSourceSwimlaneIndex.asObservable();\n }\n\n /**\n * Show connection creation popup\n */\n showConnectionPopup(x: number, y: number, allowedNodeTypes: string[]): void {\n this._connectionPopupPosition.next({ x, y });\n this._allowedNodeTypes.next(allowedNodeTypes);\n this._connectionPopupVisible.next(true);\n }\n\n /**\n * Hide connection creation popup\n */\n hideConnectionPopup(): void {\n this._connectionPopupVisible.next(false);\n }\n\n /**\n * Store connection source data for use in other popups\n */\n storeConnectionSourceData(\n point: ConnectionPoint,\n swimlaneIndex: number\n ): void {\n this._pendingConnectionSourcePoint.next(point);\n this._pendingConnectionSourceSwimlaneIndex.next(swimlaneIndex);\n }\n\n /**\n * Clear connection source data\n */\n clearConnectionSourceData(): void {\n this._pendingConnectionSourcePoint.next(null);\n this._pendingConnectionSourceSwimlaneIndex.next(null);\n }\n\n /**\n * Show form selection popup for a stage\n */\n async showFormPopup(x: number, y: number, nodeId: string): Promise<void> {\n this._formPopupPosition.next({ x, y });\n this._selectedNodeForForm.next(nodeId);\n this._formPopupVisible.next(true);\n\n // Load forms\n this._isLoadingForms.next(true);\n try {\n const response = await this.dataService.getForms();\n this._formsList.next(response.Result);\n } catch (error) {\n console.error('Error loading forms:', error);\n this._formsList.next([]);\n } finally {\n this._isLoadingForms.next(false);\n }\n }\n\n /**\n * Hide form selection popup\n */\n hideFormPopup(): void {\n this._formPopupVisible.next(false);\n this._selectedNodeForForm.next(null);\n }\n\n /**\n * Show workflow form selection popup for start node\n */\n async showStartNodeFormPopup(x: number, y: number): Promise<void> {\n this._startNodeFormPopupPosition.next({ x, y });\n this._startNodeFormPopupVisible.next(true);\n\n // Load forms\n this._isLoadingForms.next(true);\n try {\n const response = await this.dataService.getForms();\n this._formsList.next(response.Result);\n } catch (error) {\n console.error('Error loading forms:', error);\n this._formsList.next([]);\n } finally {\n this._isLoadingForms.next(false);\n }\n }\n\n /**\n * Hide workflow form selection popup\n */\n hideStartNodeFormPopup(): void {\n this._startNodeFormPopupVisible.next(false);\n }\n\n /**\n * Show subflow selection popup\n */\n async showSubflowPopup(\n x: number,\n y: number,\n swimlaneIndex: number\n ): Promise<void> {\n this._subflowPopupPosition.next({ x, y });\n this._pendingSubflowPosition.next({ swimlaneIndex, x, y });\n this._subflowPopupVisible.next(true);\n\n // Load workflows\n this._isLoadingWorkflows.next(true);\n try {\n const response = await this.dataService.getWorkflows();\n this._workflowsList.next(response.Result);\n } catch (error) {\n console.error('Error loading workflows:', error);\n this._workflowsList.next([]);\n } finally {\n this._isLoadingWorkflows.next(false);\n }\n }\n\n /**\n * Hide subflow selection popup\n */\n hideSubflowPopup(): void {\n this._subflowPopupVisible.next(false);\n this._pendingSubflowPosition.next(null);\n }\n\n // Current values for internal use\n getCurrentValues() {\n return {\n connectionPopupVisible: this._connectionPopupVisible.getValue(),\n connectionPopupPosition: this._connectionPopupPosition.getValue(),\n allowedNodeTypes: this._allowedNodeTypes.getValue(),\n formPopupVisible: this._formPopupVisible.getValue(),\n formPopupPosition: this._formPopupPosition.getValue(),\n formsList: this._formsList.getValue(),\n isLoadingForms: this._isLoadingForms.getValue(),\n selectedNodeForForm: this._selectedNodeForForm.getValue(),\n startNodeFormPopupVisible: this._startNodeFormPopupVisible.getValue(),\n startNodeFormPopupPosition: this._startNodeFormPopupPosition.getValue(),\n subflowPopupVisible: this._subflowPopupVisible.getValue(),\n subflowPopupPosition: this._subflowPopupPosition.getValue(),\n workflowsList: this._workflowsList.getValue(),\n isLoadingWorkflows: this._isLoadingWorkflows.getValue(),\n pendingSubflowPosition: this._pendingSubflowPosition.getValue(),\n pendingConnectionSourcePoint:\n this._pendingConnectionSourcePoint.getValue(),\n pendingConnectionSourceSwimlaneIndex:\n this._pendingConnectionSourceSwimlaneIndex.getValue(),\n };\n }\n}\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n Input,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { StageActorRule } from 'verben-workflow-ui/src/lib/models';\nimport { TaskAssignmentType } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { NodeManagementService } from '../services/node-management.service';\nimport { PopupService } from '../services/popup.service';\n\n@Component({\n selector: 'lib-stage-dialog',\n templateUrl: './stage-dialog.component.html',\n styleUrls: ['./stage-dialog.component.css'],\n})\nexport class StageDialogComponent implements OnInit {\n // Use Angular's signal-based input\n visible = input<boolean>(false);\n stageData = input.required<Partial<WorkflowStage>>({}); // For editing existing stages\n @Output() closed = new EventEmitter();\n @Output() saved = new EventEmitter<Partial<WorkflowStage>>();\n\n stageForm: FormGroup;\n tags: Tag[] = [];\n actorRules = Object.values(StageActorRule);\n assignmentTypes = Object.values(TaskAssignmentType);\n selectedTagIds: string[] = [];\n\n hasOutgoingConnections: boolean = false;\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService,\n private nodeService: NodeManagementService,\n private popupService: PopupService\n ) {\n this.stageForm = this.fb.group({\n Name: ['', Validators.required],\n Description: [''],\n MinNoOfActor: [0],\n Duration: [0],\n PassOnRule: [''],\n ActorRule: [StageActorRule.None],\n AssignmentType: [TaskAssignmentType.AutoRoute],\n IsExitPoint: [false],\n Tags: [[]],\n });\n\n effect(() => {\n // If stageData changes, update the form\n const stageData = this.stageData();\n if (stageData) {\n this.stageForm.patchValue({\n Name: stageData.Name || '',\n Description: stageData.Description || '',\n MinNoOfActor: stageData.MinNoOfActor || 0,\n Duration: stageData.Duration || 0,\n PassOnRule: stageData.PassOnRule || '',\n ActorRule: stageData.ActorRule || StageActorRule.None,\n AssignmentType:\n stageData.AssignmentType || TaskAssignmentType.AutoRoute,\n IsExitPoint: stageData.IsExitPoint || false,\n });\n\n // Update selected tags\n if (stageData.Tags && stageData.Tags.length > 0) {\n this.selectedTagIds = stageData.Tags.map((tag) => tag.Code);\n } else {\n this.selectedTagIds = [];\n }\n }\n });\n }\n\n ngOnInit(): void {\n // Load tags\n this.loadTags();\n\n // If editing an existing stage, populate form\n this.initFormWithStageData();\n }\n\n ngOnChanges(changes: SimpleChanges) {}\n\n /**\n * Load tags from data service\n */\n private loadTags(): void {\n this.dataService.getTags().then((data) => {\n this.tags = data.Result;\n\n const stageData = this.stageData();\n // If we have stage data with tags, update selectedTagIds after tags are loaded\n if (stageData && stageData.Tags && stageData.Tags.length > 0) {\n this.selectedTagIds = stageData.Tags.map((tag) => tag.Code);\n }\n });\n }\n\n /**\n * Initialize form with stage data if provided\n */\n private initFormWithStageData(): void {\n if (this.stageData()) {\n console.log('Initializing form with stage data:', this.stageData());\n this.stageForm.patchValue({\n Name: this.stageData().Name || '',\n Description: this.stageData().Description || '',\n MinNoOfActor: this.stageData().MinNoOfActor || 0,\n Duration: this.stageData().Duration || 0,\n PassOnRule: this.stageData().PassOnRule || '',\n ActorRule: this.stageData().ActorRule || StageActorRule.None,\n IsExitPoint: this.stageData().IsExitPoint || false,\n });\n }\n }\n\n private checkOutgoingConnections(): void {\n const stageData = this.stageData();\n\n if (stageData && stageData.Code) {\n // Check if there are outgoing connections from this stage\n this.hasOutgoingConnections = this.nodeService.hasOutgoingConnections(\n stageData.Code\n );\n\n // If there are outgoing connections, disable IsExitPoint\n if (this.hasOutgoingConnections) {\n this.stageForm.get('IsExitPoint')?.disable();\n } else {\n this.stageForm.get('IsExitPoint')?.enable();\n }\n }\n }\n\n onDialogClose(event: any): void {\n this.closed.emit();\n }\n\n saveStage(): void {\n if (this.stageForm.valid) {\n const selectedTags = this.tags.filter((tag) =>\n this.selectedTagIds.includes(tag.Code)\n );\n\n const stageData: Partial<WorkflowStage> = {\n ...this.stageForm.value,\n Tags: selectedTags,\n };\n\n // Reset form after saving\n this.stageForm.reset();\n\n // Emit the saved data to the parent component\n this.saved.emit(stageData);\n }\n }\n\n toggleTagSelection(tagId: string): void {\n const index = this.selectedTagIds.indexOf(tagId);\n if (index > -1) {\n this.selectedTagIds.splice(index, 1);\n } else {\n this.selectedTagIds.push(tagId);\n }\n }\n\n isTagSelected(tagId: string): boolean {\n return this.selectedTagIds.includes(tagId);\n }\n\n onDialogOpen(event: any): void {\n console.log('Dialog opened:', event);\n }\n\n deleteStage(): void {\n const stageData = this.stageData();\n console.log(stageData);\n if (stageData) {\n const stageCode = stageData.Code;\n if (stageCode) {\n this.dataService\n .deleteWorkflowStages([stageCode])\n .then((response) => {\n console.log('Stage deleted successfully:', response);\n // Call the node service to delete the stage\n const deleted = this.nodeService.deleteNode(stageCode);\n if (deleted) {\n // Emit an event to notify parent component\n this.closed.emit();\n } else {\n console.error('Failed to delete stage:', stageCode);\n }\n })\n .catch((error) => {\n console.error('Error deleting stage:', error);\n });\n } else if (stageData.id) {\n // Call the node service to delete the stage\n const deleted = this.nodeService.deleteNode(stageData.id);\n if (deleted) {\n // Emit an event to notify parent component\n this.closed.emit();\n } else {\n console.error('Failed to delete stage:', stageData.Code);\n }\n }\n }\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible()\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div class=\"p-4 border-b border-gray-200\">\n <h2 class=\"text-xl font-medium m-0\">Stage Properties</h2>\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"p-4\">\n <form [formGroup]=\"stageForm\" class=\"space-y-4\">\n <!-- Stage Name -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Stage Name</label>\n <input\n type=\"text\"\n formControlName=\"Name\"\n placeholder=\"Enter Stage Name\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Description -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Description</label>\n <textarea\n formControlName=\"Description\"\n placeholder=\"Enter Description\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Recipient Count -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Recipient Count</label>\n <input\n type=\"number\"\n formControlName=\"MinNoOfActor\"\n placeholder=\"Enter Count\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Pass On Rule -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Pass On Rule</label>\n <input\n type=\"text\"\n formControlName=\"PassOnRule\"\n placeholder=\"Select Rule\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Duration -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Duration</label>\n <input\n type=\"number\"\n formControlName=\"Duration\"\n placeholder=\"Set Duration\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Actor Rule -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Actor Rule</label>\n <select\n formControlName=\"ActorRule\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n >\n <option *ngFor=\"let rule of actorRules\" [value]=\"rule\">\n {{ rule }}\n </option>\n </select>\n </div>\n\n <!-- Assignment Type -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Assignment Type</label>\n\n <verben-drop-down\n label=\"Assignment\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select\"\n [options]=\"assignmentTypes\"\n id=\"assignment\"\n formControlName=\"AssignmentType\"\n class=\"form-control\"\n >\n </verben-drop-down>\n </div>\n\n <!-- Is Exit Point -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Exit Point</label>\n <div class=\"flex items-center\">\n <input\n type=\"checkbox\"\n formControlName=\"IsExitPoint\"\n [disabled]=\"hasOutgoingConnections\"\n class=\"mr-2 h-4 w-4\"\n />\n <span class=\"text-sm text-gray-600\">Mark as workflow end point</span>\n </div>\n </div>\n\n <!-- Tags -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Tags</label>\n <div\n class=\"border border-gray-200 rounded p-2 max-h-40 overflow-y-auto\"\n >\n <div *ngFor=\"let tag of tags\" class=\"py-1\">\n <label class=\"flex items-center\">\n <input\n type=\"checkbox\"\n [checked]=\"isTagSelected(tag.Code)\"\n (change)=\"toggleTagSelection(tag.Code)\"\n class=\"mr-2\"\n />\n <span>{{ tag.Name }}</span>\n </label>\n </div>\n </div>\n </div>\n </form>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"flex justify-end p-4 border-t border-gray-200\">\n <!-- <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"onDialogClose($event)\"\n >\n Cancel\n </button>\n <button\n class=\"px-4 py-2 bg-yellow-300 text-black rounded text-sm font-medium\"\n (click)=\"saveStage()\"\n [disabled]=\"stageForm.invalid\"\n >\n Save\n </button>\n <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"deleteStage()\"\n >\n Delete\n </button> -->\n\n <verbena-button\n (click)=\"onDialogClose($event)\"\n text=\"Cancel\"\n styleType=\"ylw-outline\"\n class=\"ml-auto\"\n ></verbena-button>\n <verbena-button\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n (click)=\"saveStage()\"\n [disable]=\"stageForm.invalid\"\n ></verbena-button>\n <verbena-button\n width=\"114px\"\n height=\"39px\"\n text=\"Delete\"\n bgColor=\"#999999\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n (click)=\"deleteStage()\"\n ></verbena-button>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\ninterface ConnectionCondition {\n connectionId: string;\n sourceNodeId: string;\n targetNodeId: string;\n targetNodeName: string;\n condition: string;\n isActive: boolean;\n}\n\n@Component({\n selector: 'lib-conditions-popup',\n templateUrl: './conditions-popup.component.html',\n styleUrl: './conditions-popup.component.css',\n})\nexport class ConditionsPopupComponent {\n @Input() visible: boolean = false;\n @Input() decisionNodeId: string = '';\n @Input() newConnectionId: string = '';\n @Input() popupX: number = 0;\n @Input() popupY: number = 0;\n @Output() closed = new EventEmitter();\n @Output() saved = new EventEmitter<{\n connectionId: string;\n condition: string;\n }>();\n\n connectionConditions: ConnectionCondition[] = [];\n currentCondition: string = '';\n\n constructor(private state: WorkflowDesignerState) {}\n\n ngOnInit(): void {\n this.loadConnectionConditions();\n }\n\n loadConnectionConditions(): void {\n if (!this.decisionNodeId) return;\n\n // Get all connections from this decision node\n const connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === this.decisionNodeId\n );\n\n this.connectionConditions = connections.map((conn) => {\n const targetNode = this.state.findNodeById(conn.targetNodeId)?.node;\n return {\n connectionId: conn.id,\n sourceNodeId: conn.sourceNodeId,\n targetNodeId: conn.targetNodeId,\n targetNodeName: targetNode?.stageData?.Name || 'Unknown Stage',\n condition: conn.condition || '',\n isActive: conn.id === this.newConnectionId,\n };\n });\n\n // Find the current connection being edited\n const activeCondition = this.connectionConditions.find((c) => c.isActive);\n if (activeCondition) {\n this.currentCondition = activeCondition.condition;\n }\n }\n\n saveCondition(): void {\n this.saved.emit({\n connectionId: this.newConnectionId,\n condition: this.currentCondition,\n });\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","<div\n *ngIf=\"visible\"\n [style.position]=\"'fixed'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n>\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-4 bg-white border border-purple-300 rounded shadow-md w-80\"\n dropdown-content\n >\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"text-lg font-medium\">Decision Conditions</h3>\n <button class=\"text-gray-500 hover:text-gray-700\" (click)=\"onClose()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <div class=\"mb-3\">\n <p class=\"text-sm text-gray-600\">Define a condition for this branch.</p>\n </div>\n\n <div class=\"mb-4\">\n <label class=\"block text-sm font-medium mb-1\">Condition</label>\n <input\n type=\"text\"\n [(ngModel)]=\"currentCondition\"\n placeholder=\"e.g., order.amount > 500,000\"\n class=\"w-full px-3 py-2 rounded border border-gray-200 text-sm\"\n />\n </div>\n\n <div\n class=\"space-y-3 max-h-60 overflow-y-auto\"\n *ngIf=\"connectionConditions.length > 1\"\n >\n <h4 class=\"text-sm font-medium\">Existing Conditions:</h4>\n @for (conn of connectionConditions; track conn.connectionId) { @if\n (!conn.isActive) {\n <div class=\"border rounded p-3\">\n <div class=\"mb-2\">\n <span class=\"font-medium\">{{ conn.targetNodeName }}</span>\n </div>\n <div>\n <input\n type=\"text\"\n [value]=\"conn.condition\"\n placeholder=\"No condition\"\n class=\"w-full px-3 py-2 rounded border border-gray-200 bg-gray-50 text-sm\"\n readonly\n />\n </div>\n </div>\n } }\n </div>\n\n <div class=\"flex justify-end mt-4 pt-3 border-t border-gray-200\">\n <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"onClose()\"\n >\n Cancel\n </button>\n <button\n class=\"px-4 py-2 bg-yellow-300 text-black rounded text-sm font-medium\"\n (click)=\"saveCondition()\"\n >\n Save\n </button>\n </div>\n </div>\n </verben-pop-Up>\n</div>\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n Input,\n OnInit,\n Output,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport { EditorConfig, EditorMode, EditorState } from 'verben-reporting-ui';\nimport { Escalation, EscalationType, ObjectState, ReportSchedule, TaskNotification, TaskNotificationType } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\n\n@Component({\n selector: 'lib-escalation-dialog',\n templateUrl: './escalation-dialog.component.html',\n styleUrl: './escalation-dialog.component.css',\n})\nexport class EscalationDialogComponent implements OnInit {\n @Input() visible: boolean = false;\n workflowCode = input.required<string>();\n stageCode = input.required<string>();\n type = input<EscalationType>();\n\n @Output() closed = new EventEmitter();\n @Output() created = new EventEmitter<{}>();\n\n escalation: WritableSignal<Escalation | null> = signal(null);\n\n // escalationForm;\n reportSchedules: WritableSignal<ReportSchedule[]> = signal([]);\n // operationActions: WritableSignal<OperationAction[]> = signal([]);\n\n // selectedOperationAction: BehaviorSubject<OperationAction[\"Code\"] | null> = new BehaviorSubject<OperationAction[\"Code\"] | null>(null);\n\n // selectedMessages: WritableSignal<\n // ((ReportSchedule & { IsTaskDataSource: boolean }) | null)[]\n // > = signal([]);\n\n selectedMessages: ((ReportSchedule & { IsTaskDataSource: boolean }) | null)[] = [];\n\n editorMode: EditorMode = EditorMode.Designer;\n editorConfig: EditorConfig = {\n editable: true,\n height: '',\n width: '',\n showToolbar: true,\n menuItems: [\n {\n Label: 'ToggleView',\n Icon: 'code-toggle',\n IconWidth: 20,\n IconHeight: 20,\n IsStroke: false,\n GroupBy: 'local',\n OnClick: (event: EditorState | undefined) => {\n this.editorMode =\n this.editorMode == EditorMode.Designer\n ? EditorMode.Code\n : EditorMode.Designer;\n },\n IsDisabled: (event: EditorState | undefined) => {\n return false;\n },\n IsEnabled: (event: EditorState | undefined) => {\n return this.editorMode == EditorMode.Code;\n },\n },\n ],\n };\n\n // IsTaskDataSource: WritableSignal<boolean[]> = signal([]);\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService\n ) {\n effect(() => {\n const stageCode = this.stageCode();\n const workflowCode = this.workflowCode();\n const type = this.type();\n console.log('Stage code changed:', stageCode);\n if (workflowCode && stageCode && type) {\n // this.loadEscalation(stageCode);\n this.searchEscalation(workflowCode, stageCode, type);\n }\n });\n\n effect(() => {\n const escalation = this.escalation();\n const reportSchedules = this.reportSchedules();\n\n if (escalation && reportSchedules) {\n this.selectedMessages = escalation.Messages.map((code) => {\n const found = reportSchedules.find((rs) => rs.Code === code);\n return found ? { ...found, IsTaskDataSource: true } : null;\n });\n // this.selectedOperationAction.next(escalation.OperationAction ?? null);\n // console.log(\"SETTING OP\", this.selectedOperationAction);\n }\n });\n\n // this.escalationForm = this.fb.group({\n // Messages: this.fb.array([]),\n // });\n }\n\n ngOnInit(): void {\n this.loadReportSchedules();\n // this.loadOperationActions();\n\n if (this.selectedMessages.length === 0) {\n this.addMessage();\n }\n\n console.log(\n 'EscalationDialogComponent initialized with stageCode:',\n this.stageCode\n );\n // console.log('EscalationDialogComponent type:', this.type);\n }\n\n // get messages() {\n // return this.escalationForm.controls['Messages'] as FormArray;\n // }\n\n addMessage() {\n this.selectedMessages = this.selectedMessages.concat([null]);\n }\n\n deleteMessage(lessonIndex: number) {\n this.selectedMessages = this.selectedMessages.splice(lessonIndex, 1);\n }\n\n onMessageSelected(reportSchedule: ReportSchedule, index: number) {\n console.log('Selected message:', reportSchedule, 'at index:', index);\n this.selectedMessages = this.selectedMessages.map((msg, i) => {\n if (i === index) {\n return { ...reportSchedule, IsTaskDataSource: true };\n }\n return msg;\n });\n }\n\n isValidSelection(): boolean {\n return this.selectedMessages.every((msg) => !!msg);\n }\n\n async saveMessages() {\n console.log(this.selectedMessages);\n const taskNotifications: TaskNotification[] = this.selectedMessages\n .filter((msg) => !!msg)\n .map((msg) => ({\n Id: '',\n Code: '',\n TenantId: 'PDLTC6',\n Message: msg.Code,\n Name: msg.Name,\n Subject: msg.Subject,\n SenderConfig: msg.MessageConfig,\n Medium: msg.Medium,\n NotificationType: TaskNotificationType.Escalation,\n IsMessageId: false,\n IsTaskDataSource: msg.IsTaskDataSource,\n MessageDataSource: !msg.IsTaskDataSource ? msg.ReportDataSource : '',\n DataState: ObjectState.New,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n }));\n\n // if (taskNotifications.length) {\n // this.created.emit(taskNotifications);\n console.log(taskNotifications);\n this.onDialogClose(null);\n const data: Partial<Escalation> = {\n ...(this.escalation() ?? {\n Id: '',\n Code: '',\n TenantId: 'PDLTC6',\n Workflow: this.workflowCode(),\n Stage: this.stageCode(),\n Type: this.type(),\n ExpirationWarning: 0,\n Duration: 0,\n NotifyAfter: 0,\n Position: 1,\n DataState: ObjectState.New,\n }),\n // OperationAction: this.selectedOperationAction.getValue(),\n Messages: taskNotifications.map(({ Code }) => Code),\n FullMessages: taskNotifications,\n };\n console.log(data);\n await this.dataService.saveEscalations([data]);\n // }\n }\n\n private loadEscalation(stageCode: string): void {\n this.dataService.getEscalationWithParam(stageCode).then((data) => {\n this.escalation.set(data.Result[0] ?? null);\n });\n }\n\n private searchEscalation(\n Workflow: string,\n Stage: string,\n Type: EscalationType\n ): void {\n this.dataService\n .searchEscalationWithParam({\n Workflow,\n Stage,\n Type,\n })\n .then((data) => {\n this.escalation.set(data.Result[0] ?? null);\n // this.selectedOperationAction.next(data.Result[0]?.OperationAction ?? null);\n });\n }\n\n private loadReportSchedules(): void {\n this.dataService.getReportSchedules().then((data) => {\n this.reportSchedules.set(data.Result);\n });\n }\n\n // private loadOperationActions(): void {\n // this.dataService.getOperationActions().then((data) => {\n // this.operationActions.set(data.Result);\n // });\n // }\n\n onDialogClose(eventData: any) {\n console.log('Dialog closed, received data:', eventData);\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n console.log('Dialog opened, received data:', eventData);\n }\n\n isNotNew(): boolean {\n const escalation = this.escalation();\n return escalation !== null && escalation.DataState !== 'New';\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div\n class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\"\n >\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span\n class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"\n ></span>\n </button>\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div>\n <div class=\"mb-4 space-y-4\">\n <div class=\"space-y-1\">\n <label\n for=\"operation-action\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Operation Action\n </label>\n <!-- <verben-drop-down\n id=\"operation-action\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select Operation Action\"\n [options]=\"operationActions()\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n [ngModel]=\"selectedOperationAction | async\"\n (ngModelChange)=\"selectedOperationAction.next($event)\"\n class=\"form-control\"\n ></verben-drop-down> -->\n </div>\n\n <div *ngFor=\"let message of selectedMessages; let i = index\">\n <div class=\"space-y-1\">\n <label\n [for]=\"message + '-' + i\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Message {{ i + 1 }}\n </label>\n <verben-drop-down\n [id]=\"message + '-' + i\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select Message\"\n [options]=\"reportSchedules()\"\n optionLabel=\"Name\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageSelected($event, i)\"\n class=\"form-control\"\n ></verben-drop-down>\n </div>\n\n @if (message) {\n <div class=\"flex items-center gap-4\">\n <label\n [for]=\"'is-' + message + '-' + i + 'task-data-source'\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Is Task Data Source?\n </label>\n <verbena-switch\n [id]=\"'is-' + message + '-' + i + 'task-data-source'\"\n onText=\"Yes\"\n offText=\"No\"\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"message.IsTaskDataSource\"\n ></verbena-switch>\n </div>\n }\n\n <div\n class=\"border border-primary -m-2 rounded-lg flex flex-col gap-3\"\n *ngIf=\"message\"\n >\n <div class=\"space-y-3 border-b border-primary px-2 py-3\">\n <verbena-input\n name=\"Subject\"\n [(ngModel)]=\"message.Subject\"\n [readOnly]=\"true\"\n />\n <verbena-input\n name=\"Recipients\"\n [(ngModel)]=\"message.Recipients\"\n [readOnly]=\"true\"\n />\n </div>\n <lib-editor\n [editorConfig]=\"editorConfig\"\n [editorMode]=\"editorMode\"\n [(ngModel)]=\"message.PlainMessage\"\n ></lib-editor>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"flex justify-between items-center gap-8 w-full\">\n <verbena-button\n style=\"cursor: pointer\"\n type=\"button\"\n text=\"Add Message\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"8px\"\n pd=\"10px 20px\"\n height=\"39px\"\n fontWeight=\"600\"\n fontSize=\"12px\"\n svg=\"add\"\n [svgHeight]=\"14\"\n [svgWidth]=\"14\"\n [svgSize]=\"'sm'\"\n (click)=\"addMessage()\"\n ></verbena-button>\n\n <div class=\"flex gap-2 items-center\">\n <verbena-button\n style=\"cursor: pointer\"\n type=\"button\"\n text=\"Delete\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"8px\"\n pd=\"10px 20px\"\n width=\"110px\"\n height=\"39px\"\n fontWeight=\"600\"\n fontSize=\"12px\"\n svg=\"delete\"\n [svgHeight]=\"14\"\n [svgWidth]=\"14\"\n [svgSize]=\"'sm'\"\n (click)=\"onDialogClose($event)\"\n ></verbena-button>\n\n <verbena-button\n style=\"cursor: pointer\"\n type=\"button\"\n text=\"Send\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"8px\"\n pd=\"10px 20px\"\n width=\"160px\"\n height=\"39px\"\n fontWeight=\"600\"\n fontSize=\"12px\"\n svg=\"send\"\n [svgHeight]=\"14\"\n [svgWidth]=\"14\"\n [svgSize]=\"'sm'\"\n (click)=\"saveMessages()\"\n ></verbena-button>\n </div>\n </div>\n</ng-template>\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n OnInit,\n Output,\n signal,\n WritableSignal\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { FlowableStatus, OperationAction, WorkflowAction } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport {\n Connection,\n} from '../workflow-designer.types';\n\n@Component({\n selector: 'lib-action-dialog',\n templateUrl: './action-dialog.component.html',\n styleUrl: './action-dialog.component.css',\n})\nexport class ActionDialogComponent implements OnInit {\n visible = input<boolean>(false);\n actionData = input.required<Connection | null>(); // For editing existing stages\n @Output() closed = new EventEmitter();\n @Output() saved = new EventEmitter<Connection>();\n\n actionForm: FormGroup;\n\n operationActions: WritableSignal<OperationAction[]> = signal([]);\n flowableStatuses: WritableSignal<FlowableStatus[]> = signal([]);\n\n // selectedOperationAction: BehaviorSubject<OperationAction[\"Code\"] | null> = new BehaviorSubject<OperationAction[\"Code\"] | null>(null);\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService\n ) {\n this.actionForm = this.fb.group({\n Name: ['', Validators.required],\n OperationAction: [null],\n TargetStatus: [null],\n });\n\n effect(() => {\n // If actionData changes, update the form\n const actionData = this.actionData();\n if (actionData) {\n console.log(\"ACTION_DATA\", actionData);\n this.actionForm.patchValue({\n Name: actionData.label || '',\n OperationAction: actionData.action || null,\n TargetStatus: actionData.targetStatus || null,\n });\n }\n });\n }\n\n ngOnInit(): void {\n this.loadOperationActions();\n this.loadFlowableStatuses();\n }\n\n saveAction(): void {\n if (this.actionForm.valid) {\n\n const formData = this.actionForm.value as Pick<WorkflowAction, \"Name\" | \"OperationAction\" | \"TargetStatus\">;\n\n // Reset form after saving\n this.actionForm.reset();\n\n // Emit the saved data to the parent component\n\n const prevData = this.actionData();\n\n console.log(\"PREV_DATA\", prevData);\n console.log(\"FORM_DATA\", formData);\n\n if (prevData) {\n this.saved.emit({\n ...prevData,\n label: formData.Name,\n action: formData.OperationAction,\n targetStatus: formData.TargetStatus\n });\n }\n }\n }\n\n private loadOperationActions(): void {\n this.dataService.getOperationActions().then((data) => {\n this.operationActions.set(data.Result);\n });\n }\n\n private loadFlowableStatuses(): void {\n this.dataService.getFlowableStatuses().then((data) => {\n this.flowableStatuses.set(data.Result);\n });\n }\n\n onDialogClose(eventData: any) {\n console.log('Dialog closed, received data:', eventData);\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n console.log('Dialog opened, received data:', eventData);\n }\n}\n","<verben-dialogue [showCloseIcon]=\"true\" [dismissOutsideClick]=\"true\" [closeOnEscape]=\"true\" [size]=\"'medium'\"\n [mode]=\"'drawer'\" [disableFooter]=\"false\" [isVisible]=\"visible()\" [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\" [footerTemplate]=\"footerTemplate\" (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\">\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\">\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"></span>\n </button>\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <form [formGroup]=\"actionForm\" class=\"mb-4 space-y-4\">\n <verbena-input name=\"Name\" label=\"Name\" formControlName=\"Name\" placeHolder=\"Enter Name\" />\n\n <div class=\"space-y-1\">\n <label for=\"operation-action\" class=\"text-sm font-semibold text-[#3E3E3E]\">\n Operation Action\n </label>\n <verben-drop-down id=\"operation-action\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n placeholder=\"Select Operation Action\" [options]=\"operationActions()\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"OperationAction\" class=\"form-control\"></verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"target-status\" class=\"text-sm font-semibold text-[#3E3E3E]\">\n Target Status\n </label>\n <verben-drop-down id=\"target-status\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n placeholder=\"Select Target Status\" [options]=\"flowableStatuses()\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"TargetStatus\" class=\"form-control\"></verben-drop-down>\n </div>\n </form>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"flex gap-2 items-center justify-end\">\n <verbena-button (click)=\"onDialogClose($event)\" text=\"Cancel\" styleType=\"ylw-outline\"\n class=\"ml-auto\"></verbena-button>\n <verbena-button type=\"submit\" text=\"Save\" bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\" pd=\"10px 20px\"\n width=\"114px\" height=\"39px\" (click)=\"saveAction()\" [disable]=\"actionForm.invalid\"></verbena-button>\n </div>\n</ng-template>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnInit,\n Output,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { EscalationType, Form, Workflow, WorkflowAction, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport {\n Connection,\n ConnectionPoint,\n Node,\n SwimlaneItem,\n ToolType,\n Node as WFNode,\n} from '../workflow-designer.types';\n\n@Component({\n selector: 'lib-designer-canvas',\n templateUrl: './designer-canvas.component.html',\n styleUrl: './designer-canvas.component.css',\n})\nexport class DesignerCanvasComponent implements OnInit {\n @Input() selectedTool: ToolType = null;\n @Output() clickedPosition = new EventEmitter<{ x: number; y: number }>();\n @Output() subflowSelected = new EventEmitter();\n pendingStagePosition: { swimlaneIndex: number; x: number; y: number } | null =\n null;\n @Output() showStageDialog = new EventEmitter<{\n position: any;\n isFromConnection: boolean;\n isFromDecision?: boolean;\n nodeId: string;\n }>();\n @Output() stagePropertiesUpdated = new EventEmitter<{\n nodeId: string;\n stageData: Partial<WorkflowStage>;\n }>();\n @Output() actionPropertiesUpdated = new EventEmitter<{\n connectionId: string;\n actionData: Partial<WorkflowAction>;\n }>();\n\n // Reference to the SVG element\n @ViewChild('canvas', { static: true }) canvasRef!: ElementRef<SVGElement>;\n\n @HostListener('window:mouseup', ['$event'])\n onWindowMouseUp(event: MouseEvent): void {\n // If we have a popup open but the mouse is released outside, clean up\n if (\n !this.showSubflowPopup &&\n !this.showStartNodeFormPopup &&\n !this.popupVisible && // Only end drag if no popup is visible\n this.state.isConnectionDragging()\n ) {\n console.log('External mouseup detected - cleaning up connection drag');\n this.state.endConnectionDrag();\n }\n }\n\n // Canvas dimensions\n canvasWidth = 3000;\n canvasHeight = 2000;\n\n // Grid size\n gridSize = 20;\n\n swimlaneHeight = 263;\n visibleConnectionPointsNodeId: string | null = null;\n popupVisible = false;\n popupX = 0;\n popupY = 0;\n allowedNodeTypes: string[] = [];\n\n showStartNodeFormPopup: boolean = false;\n startNodeFormsList: Form[] = [];\n isLoadingStartNodeForms: boolean = false;\n startNodeFormPopupX: number = 0;\n startNodeFormPopupY: number = 0;\n activeNodeForFormSelection: Node | null = null;\n nodeForms: WritableSignal<\n Record<string, { formId: string; formName: string }>\n > = signal({});\n\n showSubflowPopup: boolean = false;\n workflowsList: Workflow[] = [];\n isLoadingWorkflows: boolean = false;\n subflowPopupX: number = 0;\n subflowPopupY: number = 0;\n pendingSubflowPosition: {\n swimlaneIndex: number;\n x: number;\n y: number;\n } | null = null;\n\n pendingDecisionConnection: {\n decisionNodeId: string;\n swimlaneIndex: number;\n x: number;\n y: number;\n } | null = null;\n\n pendingConnectionSourcePoint: ConnectionPoint | null = null;\n pendingConnectionSourceSwimlaneIndex: number | null = null;\n\n showDecisionConditionDialog: boolean = false;\n showConditionsDialog: boolean = false;\n activeDecisionNodeId: string = '';\n activeConnectionId: string = '';\n decisionConditionPopupX: number = 0;\n decisionConditionPopupY: number = 0;\n\n isCreatingStageFromDecision: boolean = false;\n pendingDecisionCondition: string = '';\n activeStageId: string | null = null;\n activeActionId: string | null = null;\n\n showStageDialogLocal: boolean = false;\n showEscalationDialogLocal: boolean = false;\n activeEscalationType: WritableSignal<EscalationType | null> = signal(null);\n activeStageCode: WritableSignal<string | null> = signal(null);\n activeStageData: Partial<WorkflowStage> = {};\n activeActionData: Connection | null = null;\n\n showActionDialogLocal: boolean = false;\n\n potentialTargetPointId: string | null = null;\n\n constructor(\n public state: WorkflowDesignerState,\n private dataService: WorkflowDataService\n ) { }\n\n ngOnInit(): void {\n this.updateCanvasSize();\n }\n\n // Handle mouse click on canvas\n onCanvasClick(event: MouseEvent): void {\n // Only process canvas clicks if a tool is selected\n if (!this.selectedTool) {\n return;\n }\n\n // Get the position where the click occurred\n const position = this.getMousePosition(event);\n console.log(\n 'Canvas clicked at:',\n position,\n 'with tool:',\n this.selectedTool\n );\n\n // Calculate the swimlane index based on position\n // const swimlaneIndex = Math.floor(position.y / this.swimlaneHeight);\n\n // Only emit the position if we have a tool selected and it's a valid click area\n if (this.selectedTool) {\n this.clickedPosition.emit({\n x: position.x,\n y: position.y,\n });\n }\n }\n\n onShowShieldDialog(stageId: string): void {\n // Find the node\n const nodeInfo = this.state.findNodeById(stageId);\n if (nodeInfo) {\n this.activeStageId = stageId;\n this.activeStageData = { ...nodeInfo.node.stageData, id: stageId };\n console.log(this.activeStageData);\n this.showStageDialogLocal = true;\n }\n }\n\n onShowActionDialog(connectionInfo: Connection): void {\n console.log(\"CONECTION\", connectionInfo);\n // Find the node\n // const connectionInfo = this.state.findActionById(actionId);\n if (connectionInfo) {\n this.activeActionId = connectionInfo.id;\n this.activeActionData = connectionInfo;\n console.log(this.activeActionData);\n this.showActionDialogLocal = true;\n }\n }\n\n onShowEscalationDialog(event: {\n stageId: string;\n type: EscalationType;\n }): void {\n // Find the node\n const nodeInfo = this.state.findNodeById(event.stageId);\n if (nodeInfo) {\n this.activeStageId = event.stageId;\n this.activeStageData = nodeInfo.node.stageData || {\n id: this.activeStageId,\n };\n this.activeEscalationType.set(event.type);\n this.activeStageCode.set(this.activeStageData?.Code || '');\n console.log('Active Stage Data:', this.activeStageData);\n console.log('Escalation Type:', this.activeEscalationType());\n this.showEscalationDialogLocal = true;\n }\n }\n\n // Add this method to handle dialog closure\n onStageDialogClosed(): void {\n this.showStageDialogLocal = false;\n this.activeStageId = null;\n this.activeStageData = {};\n }\n\n onActionDialogClosed(): void {\n this.showActionDialogLocal = false;\n this.activeActionId = null;\n this.activeActionData = null;\n }\n\n // Add this method to handle dialog closure\n onEscalationDialogClosed(): void {\n this.showEscalationDialogLocal = false;\n this.activeStageId = null;\n this.activeEscalationType.set(null);\n this.activeStageCode.set(null);\n this.activeStageData = {};\n }\n\n // Add this method to handle saving stage data\n onStageDialogSaved(stageData: Partial<WorkflowStage>): void {\n if (this.activeStageId) {\n // Editing an existing stage\n const nodeInfo = this.state.findNodeById(this.activeStageId);\n if (nodeInfo) {\n // Update the stage data\n nodeInfo.node.stageData = {\n ...nodeInfo.node.stageData,\n ...stageData,\n };\n console.log('Updated stage data:', nodeInfo.node.stageData);\n\n // Emit event for parent component to know about the update\n this.stagePropertiesUpdated.emit({\n nodeId: this.activeStageId,\n stageData: nodeInfo.node.stageData,\n });\n }\n }\n\n // Close the dialog\n this.onStageDialogClosed();\n }\n\n onActionDialogSaved(actionData: Connection): void {\n if (this.activeActionId) {\n // Editing an existing stage\n // let connectionInfo = this.state.findActionById(this.activeActionId);\n this.state.connections = this.state.connections.map((connection, index) => {\n if (connection.id === this.activeActionId) {\n connection.label = actionData.label;\n connection.action = actionData.action;\n connection.targetStatus = actionData.targetStatus;\n console.log('Updated action data:', connection);\n }\n return connection;\n })\n }\n\n // Close the dialog\n this.onActionDialogClosed();\n }\n\n updateCanvasSize(): void {\n const requiredHeight =\n (this.state.swimlanes.length + 1) * this.swimlaneHeight;\n this.canvasHeight = Math.max(2000, requiredHeight); // Ensure we have at least our default height\n\n // Update all the swimlane clip paths when size changes\n setTimeout(() => {\n this.state.swimlanes.forEach((swimlane, index) => {\n const clipPathId = `swimlane-clip-${index}`;\n const clipPathElement = document.getElementById(clipPathId);\n if (clipPathElement) {\n const rectElement = clipPathElement.querySelector('rect');\n if (rectElement) {\n rectElement.setAttribute('width', this.canvasWidth.toString());\n }\n }\n });\n }, 0);\n }\n\n // Helper method to get the mouse position relative to the SVG canvas\n private getMousePosition(event: MouseEvent): { x: number; y: number } {\n // Use clientX/Y and getBoundingClientRect() for cross-browser compatibility\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n }\n\n showConnectionPoints(nodeId: string, swimlaneIndex: number): void {\n this.visibleConnectionPointsNodeId = nodeId;\n }\n\n isMouseOverNode(\n event: MouseEvent,\n node: WFNode,\n swimlaneIndex: number\n ): boolean {\n const position = this.getMousePosition(event);\n const nodeBounds = this.getNodeBoundsWithPadding(node, swimlaneIndex);\n\n return (\n position.x >= nodeBounds.x &&\n position.x <= nodeBounds.x + nodeBounds.width &&\n position.y >= nodeBounds.y &&\n position.y <= nodeBounds.y + nodeBounds.height\n );\n }\n\n // helper method to calculate node bounds with padding\n getNodeBoundsWithPadding(\n node: WFNode,\n swimlaneIndex: number\n ): { x: number; y: number; width: number; height: number } {\n const padding = 10; // Add 10px padding around nodes for easier hover detection\n\n // Calculate the absolute Y position including swimlane offset\n const absoluteY = node.y + swimlaneIndex * 263;\n\n return {\n x: node.x - padding,\n y: absoluteY - padding,\n width: node.width + padding * 2,\n height: node.height + padding * 2,\n };\n }\n\n hideConnectionPoints(nodeId: string): void {\n if (\n this.visibleConnectionPointsNodeId === nodeId &&\n !this.state.isConnectionDragging()\n ) {\n this.visibleConnectionPointsNodeId = null;\n }\n }\n\n isConnectionPointVisible(nodeId: string): boolean {\n return this.visibleConnectionPointsNodeId === nodeId;\n }\n\n startConnectionDrag(\n event: MouseEvent,\n point: ConnectionPoint,\n swimlaneIndex: number\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Check if this is an exit point node\n const nodeInfo = this.state.findNodeById(point.nodeId);\n if (\n nodeInfo &&\n nodeInfo.node.type === 'stage' &&\n nodeInfo.node.stageData?.IsExitPoint\n ) {\n // Don't allow connections from exit points\n console.log('Cannot create connections from exit points');\n return;\n }\n\n const position = this.getMousePosition(event);\n this.state.startConnectionDrag(\n point,\n swimlaneIndex,\n position.x,\n position.y\n );\n\n // Add mouse move and mouse up event listeners to the document\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('mouseup', this.onMouseUp);\n }\n\n highlightPotentialTargets(event: MouseEvent): void {\n if (!this.state.isConnectionDragging()) return;\n\n const position = this.getMousePosition(event);\n const targetPointInfo = this.findConnectionPointAtPosition(\n position.x,\n position.y\n );\n\n if (\n targetPointInfo &&\n targetPointInfo.point.id !== this.potentialTargetPointId\n ) {\n // We have a new target point\n this.potentialTargetPointId = targetPointInfo.point.id;\n } else if (!targetPointInfo && this.potentialTargetPointId) {\n // We're no longer over a target point\n this.potentialTargetPointId = null;\n }\n }\n\n // Use arrow functions to preserve 'this' context\n onMouseMove = (event: MouseEvent) => {\n const position = this.getMousePosition(event);\n this.updateConnectionDrag(position.x, position.y);\n this.highlightPotentialTargets(event);\n };\n\n updateConnectionDrag(currentX: number, currentY: number) {\n if (this.state.draggingConnectionData.sourcePoint) {\n this.state.draggingConnectionData.currentX = currentX;\n this.state.draggingConnectionData.currentY = currentY;\n\n // Calculate which swimlane the cursor is over\n const swimlaneIndex = Math.floor(currentY / this.swimlaneHeight);\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n // Ensure the target swimlane is fully visible\n this.ensureSwimlaneInView(swimlaneIndex);\n }\n }\n }\n\n onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n\n const position = this.getMousePosition(event);\n console.log('Mouse up at position:', position);\n console.log('Is connection dragging:', this.state.isConnectionDragging());\n\n // Only proceed if we are dragging a connection\n if (!this.state.isConnectionDragging()) {\n return;\n }\n\n // Check if we're dropping onto a connection point\n const targetPointInfo = this.findConnectionPointAtPosition(\n position.x,\n position.y\n );\n\n if (targetPointInfo) {\n // We found a target connection point\n console.log('Found target connection point:', targetPointInfo);\n\n // Get the source point and swimlane index\n const sourcePoint = this.state.draggingConnectionData.sourcePoint;\n const sourceSwimlaneIndex =\n this.state.draggingConnectionData.sourceSwimlaneIndex;\n\n if (sourcePoint && sourceSwimlaneIndex !== undefined) {\n // Prevent connecting a node to itself\n if (sourcePoint.nodeId !== targetPointInfo.nodeId) {\n // Get source and target node types to check if connection is allowed\n const sourceNodeInfo = this.state.findNodeById(sourcePoint.nodeId);\n const targetNodeInfo = this.state.findNodeById(\n targetPointInfo.nodeId\n );\n\n if (\n sourceNodeInfo &&\n targetNodeInfo &&\n this.state.canConnect(\n sourceNodeInfo.node.type,\n targetNodeInfo.node.type\n )\n ) {\n // Create the connection\n const connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: targetPointInfo.nodeId,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPointInfo.point.id,\n sourceSwimlaneIndex: sourceSwimlaneIndex,\n targetSwimlaneIndex: targetPointInfo.swimlaneIndex,\n label: '',\n action: null,\n };\n\n // Add to connections array\n this.state.connections.push(connection);\n console.log('Created direct connection between nodes:', connection);\n\n // Notify about connection creation\n this.onConnectionCreated(connection);\n } else {\n console.log(\n 'Cannot connect these node types:',\n sourceNodeInfo?.node.type,\n '->',\n targetNodeInfo?.node.type\n );\n }\n } else {\n console.log('Cannot connect a node to itself');\n }\n }\n\n // End the connection drag\n this.state.endConnectionDrag();\n return;\n }\n\n // Check if the position is within any swimlane\n const isInsideSwimlane = this.isPositionInsideSwimlane(position.y);\n console.log('Is inside swimlane:', isInsideSwimlane);\n\n // Only show popup if within a swimlane\n if (isInsideSwimlane && this.state.isConnectionDragging()) {\n console.log('Showing connection popup');\n this.showConnectionPopup(position.x, position.y);\n } else {\n // End the connection drag if outside a swimlane\n console.log('Ending connection drag without showing popup');\n this.state.endConnectionDrag();\n }\n };\n\n findConnectionPointAtPosition(\n x: number,\n y: number,\n tolerance: number = 10\n ): {\n point: ConnectionPoint;\n nodeId: string;\n swimlaneIndex: number;\n } | null {\n // Iterate through all swimlanes and nodes to find connection points\n for (\n let swimlaneIndex = 0;\n swimlaneIndex < this.state.swimlanes.length;\n swimlaneIndex++\n ) {\n const swimlane = this.state.swimlanes[swimlaneIndex];\n\n if (!swimlane.nodes) continue;\n\n for (const node of swimlane.nodes) {\n if (!node.connectionPoints) continue;\n\n // Calculate the absolute position of the node (including swimlane offset)\n const absoluteNodeX = node.x;\n const absoluteNodeY = node.y + swimlaneIndex * this.swimlaneHeight;\n\n for (const point of node.connectionPoints) {\n // Calculate absolute position of the connection point\n const pointX = absoluteNodeX + point.x;\n const pointY = absoluteNodeY + point.y;\n\n // Check if the given position is within tolerance of this point\n if (\n Math.abs(x - pointX) <= tolerance &&\n Math.abs(y - pointY) <= tolerance\n ) {\n return {\n point: point,\n nodeId: node.id,\n swimlaneIndex: swimlaneIndex,\n };\n }\n }\n }\n }\n\n return null;\n }\n\n isPositionInsideSwimlane(y: number): boolean {\n // Check if y position is within any swimlane\n const swimlaneCount = this.state.swimlanes.length;\n if (swimlaneCount === 0) return false;\n\n // Each swimlane has a height of 263px\n const totalSwimlaneHeight = swimlaneCount * this.swimlaneHeight;\n\n // Check if y is within the total height of all swimlanes\n return y >= 0 && y < totalSwimlaneHeight;\n }\n\n showConnectionPopup(x: number, y: number): void {\n console.log('Showing connection popup at:', x, y);\n this.popupX = x;\n this.popupY = y;\n\n // Get allowed node types based on the source node type\n this.allowedNodeTypes = this.state.getAllowedTargetNodeTypes();\n console.log('Allowed node types:', this.allowedNodeTypes);\n\n // Only show the popup if we have allowed node types\n if (this.allowedNodeTypes.length > 0) {\n this.popupVisible = true;\n console.log('Popup visibility set to true');\n\n // Force the popup to be visible in the next tick\n setTimeout(() => {\n console.log('Is popup visible in next tick:', this.popupVisible);\n }, 0);\n } else {\n // No allowed node types, just end the drag\n console.log('No allowed node types, ending drag');\n this.state.endConnectionDrag();\n }\n }\n\n hideConnectionPopup(): void {\n console.log('Call to hide');\n this.popupVisible = false;\n this.state.endConnectionDrag();\n }\n\n // Add this handler to close the popup when clicking outside\n // @HostListener('document:click', ['$event'])\n // onDocumentClick(event: MouseEvent): void {\n // if (this.popupVisible) {\n // const popupElement = document.querySelector('verben-pop-Up');\n // if (popupElement && !popupElement.contains(event.target as Node)) {\n // this.hideConnectionPopup();\n // }\n // }\n // }\n\n createNodeConnection(nodeType: string): void {\n const pathData = this.state.getConnectionPathData();\n if (!pathData) {\n this.hideConnectionPopup();\n return;\n }\n\n // Check if this node type is allowed to be created\n const allowedTypes = this.state.getAllowedTargetNodeTypes();\n if (!allowedTypes.includes(nodeType)) {\n console.error(\n `Cannot create connection to ${nodeType} from current node type`\n );\n this.hideConnectionPopup();\n return;\n }\n\n const { endX, endY, sourceSwimlaneIndex } = pathData;\n\n // Get source node info\n const sourcePoint = this.state.draggingConnectionData.sourcePoint;\n if (!sourcePoint) {\n this.hideConnectionPopup();\n return;\n }\n\n const sourceNodeInfo = this.state.findNodeById(sourcePoint.nodeId);\n if (!sourceNodeInfo) {\n this.hideConnectionPopup();\n return;\n }\n\n // If connecting from a decision to a stage, show condition popup first\n if (sourceNodeInfo.node.type === 'decision' && nodeType === 'stage') {\n // Store information for later stage creation\n this.pendingDecisionConnection = {\n decisionNodeId: sourceNodeInfo.node.id,\n swimlaneIndex: sourceSwimlaneIndex,\n x: endX,\n y: endY,\n };\n\n // Calculate popup position - position it near the decision node\n const swimlaneOffsetY = sourceSwimlaneIndex * 263;\n\n // Center the popup over the connection endpoint\n this.decisionConditionPopupX = endX;\n this.decisionConditionPopupY = endY - 150; // Position above the endpoint\n\n // Set decision node ID\n this.activeDecisionNodeId = sourceNodeInfo.node.id;\n this.showDecisionConditionDialog = true;\n\n // End the connection drag\n this.hideConnectionPopup();\n return;\n }\n\n const swimlaneIndex = Math.floor(endY / this.swimlaneHeight);\n const swimlaneTop = swimlaneIndex * this.swimlaneHeight;\n // Calculate swimlane-relative position\n const swimlaneOffsetY = sourceSwimlaneIndex * 263;\n let relativeY = endY - swimlaneOffsetY - 50; // Add half node height for better alignment\n const swimlaneBottom = swimlaneTop + 263;\n\n // Clamp nodeY so node stays within swimlane\n\n console.log(endY, swimlaneIndex, swimlaneOffsetY, swimlaneBottom);\n\n if (endY - 50 < swimlaneTop) {\n console.log('Less');\n relativeY = swimlaneTop; // Node would overflow above, so align to top\n } else if (endY + 50 > swimlaneBottom) {\n console.log('More');\n relativeY = swimlaneBottom - 100; // Node would overflow below, so align to bottom\n }\n\n // Handle preconditions based on node type\n if (nodeType === 'stage') {\n // Create the stage directly with default properties\n const newNode = this.state.addNode(\n sourceSwimlaneIndex,\n 'stage',\n endX,\n relativeY,\n { Name: 'New Stage' } // Add default properties\n );\n\n if (\n newNode &&\n newNode.connectionPoints &&\n newNode.connectionPoints.length > 0 &&\n sourcePoint\n ) {\n // Handle connection creation\n const opposingType = {\n right: 'left',\n left: 'right',\n top: 'bottom',\n bottom: 'top',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n const targetPoint = newNode.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create the connection\n const connection = this.state.createConnection(\n newNode.id,\n targetPoint.id,\n sourceSwimlaneIndex\n );\n\n if (connection) {\n this.onConnectionCreated(connection);\n }\n }\n }\n\n this.hideConnectionPopup();\n return;\n } else if (nodeType === 'subflow') {\n console.log(\n 'Creating subflow from connection at:',\n endX,\n endY,\n 'swimlane:',\n sourceSwimlaneIndex\n );\n // Show workflow selection popup and store connection data for later use\n this.showSubflowSelectionPopup(endX, endY, sourceSwimlaneIndex);\n this.hideConnectionPopup();\n return;\n }\n\n // For other nodes Create the new node at the end position of the connection\n const newNode = this.state.addNode(\n sourceSwimlaneIndex,\n nodeType as ToolType,\n endX,\n relativeY\n );\n\n if (\n newNode &&\n newNode.connectionPoints &&\n newNode.connectionPoints.length > 0\n ) {\n // Find the most appropriate connection point (closest to the source)\n if (sourcePoint) {\n // For simplicity, use the first connection point of opposing type\n // In a real implementation, you'd find the closest or most appropriate point\n let targetPoint;\n\n // If source is on right, target should be on left, etc.\n const opposingType = {\n right: 'left',\n left: 'right',\n top: 'bottom',\n bottom: 'top',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n targetPoint = newNode.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create the connection\n const connection = this.state.createConnection(\n newNode.id,\n targetPoint.id,\n sourceSwimlaneIndex\n );\n\n if (connection) {\n this.onConnectionCreated(connection);\n }\n }\n }\n }\n\n if (sourceNodeInfo) {\n this.updateNodeConnections(sourceNodeInfo.node);\n }\n\n // End the connection drag\n this.hideConnectionPopup();\n }\n\n // Method to handle saving the condition\n onDecisionConditionSaved(event: {\n connectionId: string;\n condition: string;\n }): void {\n if (!this.pendingDecisionConnection) {\n this.showDecisionConditionDialog = false;\n return;\n }\n\n const { decisionNodeId, swimlaneIndex, x, y } =\n this.pendingDecisionConnection;\n\n // Create the stage directly with default properties\n const node = this.state.addNode(\n swimlaneIndex,\n 'stage',\n x,\n y,\n { Name: 'New Stage' } // Add default properties\n );\n\n if (node) {\n const decisionNodeInfo = this.state.findNodeById(decisionNodeId);\n\n if (\n decisionNodeInfo &&\n node.connectionPoints &&\n node.connectionPoints.length > 0\n ) {\n // Find a suitable connection point from the decision node\n const decisionNode = decisionNodeInfo.node;\n const decisionNodePoints = decisionNode.connectionPoints || [];\n const sourcePoint = decisionNodePoints.find(\n (p) => p.type === 'right' || p.type === 'bottom'\n );\n\n if (sourcePoint) {\n // Find opposing type connection point on the new stage\n const opposingType = {\n right: 'left',\n bottom: 'top',\n left: 'right',\n top: 'bottom',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n const targetPoint = node.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create connection with condition\n const connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: decisionNode.id,\n targetNodeId: node.id,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPoint.id,\n sourceSwimlaneIndex: decisionNodeInfo.swimlaneIndex,\n targetSwimlaneIndex: swimlaneIndex,\n condition: event.condition,\n label: '',\n action: null,\n };\n\n // Add connection to the state\n this.state.connections.push(connection);\n console.log(\n 'Created decision connection with condition:',\n connection\n );\n }\n }\n }\n }\n\n // Clear pending data\n this.pendingDecisionConnection = null;\n this.pendingDecisionCondition = '';\n\n // Hide the condition popup\n this.showDecisionConditionDialog = false;\n }\n\n onDecisionConditionCancelled(): void {\n this.showDecisionConditionDialog = false;\n // Don't create the stage or connection\n }\n\n getConnectionPath(): string {\n const pathData = this.state.getConnectionPathData();\n if (!pathData) return '';\n\n const { startX, startY, endX, endY } = pathData;\n const sourcePoint = this.state.draggingConnectionData.sourcePoint;\n\n if (!sourcePoint) return '';\n\n return this.getOrthogonalPath(startX, startY, endX, endY, sourcePoint.type);\n }\n\n getConnectionPathForSavedConnection(connection: Connection): string {\n try {\n const pathData = this.state.getConnectionData(connection);\n if (!pathData) {\n console.error('No path data for connection:', connection);\n return '';\n }\n\n const { startX, startY, endX, endY } = pathData;\n\n const sourceNodeInfo = this.state.findNodeById(connection.sourceNodeId);\n if (!sourceNodeInfo) {\n console.error('Source node not found for connection:', connection);\n return '';\n }\n\n const sourceNode = sourceNodeInfo.node;\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n\n if (!sourcePoint) {\n console.error('Source point not found for connection:', connection);\n return '';\n }\n\n return this.getOrthogonalPath(\n startX,\n startY,\n endX,\n endY,\n sourcePoint.type\n );\n } catch (error) {\n console.error('Error generating path for connection:', connection, error);\n return '';\n }\n }\n\n getOrthogonalPath(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n pointType: 'top' | 'right' | 'bottom' | 'left'\n ): string {\n // Determine initial direction based on connection point type\n let path = '';\n\n // For side points (left/right), start with horizontal line\n if (pointType === 'left' || pointType === 'right') {\n // Calculate horizontal distance\n const horizontalDist = endX - startX;\n\n // If the end point is very close horizontally, use a simple 3-segment path\n if (Math.abs(horizontalDist) < 30) {\n const midY = (startY + endY) / 2;\n path = `M ${startX} ${startY} H ${endX} V ${midY} V ${endY}`;\n }\n // Otherwise, create a path with horizontal segment first, then vertical, then horizontal\n else {\n path = `M ${startX} ${startY} H ${startX + horizontalDist / 2\n } V ${endY} H ${endX}`;\n }\n }\n // For top/bottom points, start with vertical line\n else if (pointType === 'top' || pointType === 'bottom') {\n // Calculate vertical distance\n const verticalDist = endY - startY;\n\n // If the end point is very close vertically, use a simple 3-segment path\n if (Math.abs(verticalDist) < 30) {\n const midX = (startX + endX) / 2;\n path = `M ${startX} ${startY} V ${endY} H ${midX} H ${endX}`;\n }\n // Otherwise, create a path with vertical segment first, then horizontal, then vertical\n else {\n path = `M ${startX} ${startY} V ${startY + verticalDist / 2\n } H ${endX} V ${endY}`;\n }\n }\n\n return path;\n }\n\n selectFormForStage(form: Form | null, node: Node) {\n // If form is null, we're clearing the selection\n if (node) {\n if (!node.stageData) {\n node.stageData = {};\n }\n\n if (form) {\n node.stageData.formId = form.Code;\n node.stageData.formName = form.Name;\n } else {\n // Clear form selection\n delete node.stageData.formId;\n delete node.stageData.formName;\n }\n\n // Emit an event to update the stage data\n this.onStagePropertiesUpdated({\n nodeId: node.id,\n stageData: node.stageData,\n });\n }\n }\n\n onStagePropertiesUpdated(event: {\n nodeId: string;\n stageData: Partial<WorkflowStage>;\n }): void {\n // Find the node in the swimlanes\n for (let i = 0; i < this.state.swimlanes.length; i++) {\n const swimlane = this.state.swimlanes[i];\n const nodeIndex = swimlane.nodes?.findIndex((n) => n.id === event.nodeId);\n\n if (nodeIndex !== undefined && nodeIndex >= 0) {\n // Update the stage data\n if (swimlane.nodes) {\n swimlane.nodes[nodeIndex].stageData = {\n ...swimlane.nodes[nodeIndex].stageData,\n ...event.stageData,\n };\n console.log(\n 'Updated stage data in swimlane:',\n i,\n 'node:',\n nodeIndex,\n 'data:',\n swimlane.nodes[nodeIndex].stageData\n );\n }\n break;\n }\n }\n }\n\n onConnectionCreated(connection: Connection): void {\n // After a connection is created, refresh the source node to update its state\n const sourceNodeInfo = this.state.findNodeById(connection.sourceNodeId);\n if (sourceNodeInfo && sourceNodeInfo.node.type === 'stage') {\n // Refresh node state\n this.updateNodeConnections(sourceNodeInfo.node);\n }\n }\n\n // Helper method to update node's connection status\n updateNodeConnections(node: WFNode): void {\n // Count the number of outgoing connections that connect to stages\n const outgoingConnections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === node.id\n );\n\n // Check if the target nodes are stages\n const connectedStageNodes = outgoingConnections\n .map((conn) => this.state.findNodeById(conn.targetNodeId))\n .filter((nodeInfo) => nodeInfo && nodeInfo.node.type === 'stage');\n\n node.hasMultipleConnectedStages = connectedStageNodes.length > 1;\n node.hasParallelStages = connectedStageNodes.every(\n (nd) => nd?.node.stageData?.IsParallel\n );\n }\n\n onEditSwimlane(\n event: MouseEvent,\n swimlane: SwimlaneItem,\n swimlaneIndex: number\n ): void {\n event.stopPropagation(); // Prevent the canvas click event from firing\n event.preventDefault();\n console.log('Edit swimlane button clicked for swimlane:', swimlaneIndex);\n\n // Emit a special event for editing a swimlane\n this.clickedPosition.emit({\n x: -1, // Special value to indicate edit mode\n y: swimlaneIndex,\n });\n }\n\n // showStartNodeFormPopup(event: MouseEvent): void {\n // event.preventDefault();\n // event.stopPropagation();\n\n // // Implementation will be similar to the stage form popup\n // // We'll need to add UI elements for this\n // console.log('Start node form popup requested');\n\n // // For now, this is a placeholder\n // // The actual implementation would load forms and add them to the workflow\n // }\n\n toggleStartNodeFormPopup(\n event: MouseEvent,\n nodeX: number,\n nodeY: number,\n swimlaneIndex: number,\n node?: Node\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Set popup position\n const swimlaneOffset = swimlaneIndex * 263;\n this.startNodeFormPopupX = nodeX - (!node ? 30 : 0); // Position near the start node\n this.startNodeFormPopupY = nodeY + swimlaneOffset;\n\n // If we're opening the popup, load forms\n if (!this.showStartNodeFormPopup) {\n this.isLoadingStartNodeForms = true;\n this.dataService\n .getForms()\n .then((response) => {\n this.startNodeFormsList = response.Result;\n this.isLoadingStartNodeForms = false;\n })\n .catch((error) => {\n console.error('Error loading forms:', error);\n this.isLoadingStartNodeForms = false;\n });\n }\n\n if (node) {\n this.activeNodeForFormSelection = node;\n console.log('Active node for form selection:', node);\n } else {\n this.activeNodeForFormSelection = null;\n }\n\n this.showStartNodeFormPopup = !this.showStartNodeFormPopup;\n }\n\n selectStartNodeForm(form: Form | null): void {\n if (this.activeNodeForFormSelection) {\n this.selectFormForStage(form, this.activeNodeForFormSelection);\n } else {\n if (form) {\n this.state.setWorkflowForm(form.Code, form.Name);\n } else {\n this.state.setWorkflowForm(null, null);\n }\n }\n\n // Close the popup\n this.showStartNodeFormPopup = false;\n }\n\n showSubflowSelectionPopup(x: number, y: number, swimlaneIndex: number): void {\n this.subflowPopupX = x;\n this.subflowPopupY = y;\n this.pendingSubflowPosition = { swimlaneIndex, x, y };\n\n // Store connection data if we're creating from a connection\n if (this.state.isConnectionDragging()) {\n // Store the source connection data\n this.pendingConnectionSourcePoint =\n this.state.draggingConnectionData.sourcePoint ?? null;\n this.pendingConnectionSourceSwimlaneIndex =\n this.state.draggingConnectionData.sourceSwimlaneIndex ?? null;\n console.log('Stored connection data for subflow:', {\n sourcePoint: this.pendingConnectionSourcePoint,\n sourceSwimlaneIndex: this.pendingConnectionSourceSwimlaneIndex,\n });\n }\n\n // Load workflows\n this.isLoadingWorkflows = true;\n this.dataService\n .getWorkflows()\n .then((response) => {\n this.workflowsList = response.Result;\n this.isLoadingWorkflows = false;\n })\n .catch((error) => {\n console.error('Error loading workflows:', error);\n this.isLoadingWorkflows = false;\n });\n\n this.showSubflowPopup = true;\n }\n\n selectSubflowWorkflow(workflow: Workflow): void {\n console.log('Selecting workflow for subflow:', workflow.Name);\n console.log('Pending connection data:', {\n sourcePoint: this.pendingConnectionSourcePoint,\n sourceSwimlaneIndex: this.pendingConnectionSourceSwimlaneIndex,\n position: this.pendingSubflowPosition,\n });\n\n if (this.pendingSubflowPosition) {\n const { swimlaneIndex, x, y } = this.pendingSubflowPosition;\n\n // Create the subflow node with the selected workflow data\n const node = this.state.addNode(\n swimlaneIndex,\n 'subflow',\n x,\n y,\n undefined, // No stage data\n { id: workflow.Code, name: workflow.Name }\n );\n\n console.log('Created subflow node:', node);\n\n // If this was created from a connection, create the connection\n if (node && this.pendingConnectionSourcePoint) {\n console.log('Creating connection to new subflow node');\n\n // Find a suitable connection point on the new node\n if (node.connectionPoints && node.connectionPoints.length > 0) {\n const sourcePoint = this.pendingConnectionSourcePoint;\n\n // Find opposing type connection point\n const opposingType = {\n right: 'left',\n left: 'right',\n top: 'bottom',\n bottom: 'top',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n const targetPoint = node.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create connection\n const connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: node.id,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPoint.id,\n sourceSwimlaneIndex: this.pendingConnectionSourceSwimlaneIndex!,\n targetSwimlaneIndex: swimlaneIndex,\n label: '',\n action: null,\n };\n\n // Add connection directly to the state's connections array\n this.state.connections.push(connection);\n console.log('Added connection to state:', connection);\n console.log('Connections after adding:', this.state.connections);\n this.onConnectionCreated(connection);\n }\n }\n this.state.endConnectionDrag();\n }\n\n // Reset selection tool in parent component\n this.subflowSelected.emit();\n }\n\n // Clean up\n this.showSubflowPopup = false;\n this.pendingSubflowPosition = null;\n this.pendingConnectionSourcePoint = null;\n this.pendingConnectionSourceSwimlaneIndex = null;\n }\n\n showDecisionConditionsPopup(\n event: MouseEvent,\n node: WFNode,\n swimlaneIndex: number\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Get the position for the popup\n const position = this.getMousePosition(event);\n const globalX = position.x;\n const globalY = position.y;\n\n // Find all connections from this decision node\n const connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === node.id\n );\n\n if (connections.length === 0) {\n // No connections to show\n return;\n }\n\n // Show the decision conditions popup\n this.activeDecisionNodeId = node.id;\n this.decisionConditionPopupX = globalX;\n this.decisionConditionPopupY = globalY;\n\n // Set the correct popup visibility flag - this is likely the issue\n this.showDecisionConditionDialog = true;\n\n console.log('Showing decision popup:', {\n x: globalX,\n y: globalY,\n nodeId: node.id,\n isVisible: this.showDecisionConditionDialog,\n });\n }\n\n ensureSwimlaneInView(swimlaneIndex: number): void {\n // Ensure we have enough swimlanes visible\n const requiredHeight = (swimlaneIndex + 1) * this.swimlaneHeight;\n if (this.canvasHeight < requiredHeight) {\n this.canvasHeight = requiredHeight;\n }\n }\n\n getLabelPosition(connection: Connection): { x: number; y: number } {\n try {\n const pathData = this.state.getConnectionData(connection);\n if (!pathData) {\n console.error('No path data for connection:', connection);\n return { x: 0, y: 0 };\n }\n\n const { startX, startY, endX, endY } = pathData;\n\n const sourceNodeInfo = this.state.findNodeById(connection.sourceNodeId);\n if (!sourceNodeInfo) {\n console.error('Source node not found for connection:', connection);\n return { x: 0, y: 0 };\n }\n\n const sourceNode = sourceNodeInfo.node;\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n\n if (!sourcePoint) {\n console.error('Source point not found for connection:', connection);\n return { x: 0, y: 0 };\n }\n\n // Calculate midpoint based on the connection point type\n if (sourcePoint.type === 'left' || sourcePoint.type === 'right') {\n const horizontalDist = endX - startX;\n\n if (Math.abs(horizontalDist) < 30) {\n // For short horizontal connections\n const midY = (startY + endY) / 2;\n return {\n x: startX + (endX - startX) / 2,\n y: midY,\n };\n } else {\n // For regular connections starting horizontally\n const midX = startX + horizontalDist / 2;\n const midY = endY;\n return {\n x: midX,\n y: (startY + endY) / 2,\n };\n }\n } else {\n // 'top' or 'bottom'\n const verticalDist = endY - startY;\n\n if (Math.abs(verticalDist) < 30) {\n // For short vertical connections\n const midX = (startX + endX) / 2;\n return {\n x: midX - 75, // Minus 75 - which is half the width of the label itself\n y: startY + (endY - startY) / 2,\n };\n } else {\n // For regular connections starting vertically\n const midX = endX;\n const midY = startY + verticalDist / 2;\n return {\n x: ((startX + endX) / 2) - 75, // Minus 75 - which is half the width of the label itself\n y: midY,\n };\n }\n }\n } catch (error) {\n console.error(\n 'Error calculating label position for connection:',\n connection,\n error\n );\n return { x: 0, y: 0 };\n }\n }\n\n saveConnectionLabel(connection: Connection, label: string) {\n // Update the connection label in the state\n this.state.connections = this.state.connections.map((conn) => {\n if (conn.id === connection.id) {\n return {\n ...conn,\n label: label,\n };\n }\n return conn;\n });\n }\n}\n","<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <clipPath [attr.id]=\"'swimlane-clip-' + swimlane.order\">\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" height=\"263\" />\n </clipPath>\n }\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- <g\n [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\"\n [attr.clip-path]=\"'url(#swimlane-clip-' + swimlane.order + ')'\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n </g> -->\n\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container - remove stroke to make it purely background -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n [attr.fill]=\"swimlane.order % 2 === 0 ? '#FCF3FF' : '#ECFFF5'\"\n stroke=\"none\"\n ></rect>\n\n <!-- Vertical swimlane label on the left -->\n <g class=\"swimlane-label\">\n <!-- Purple background for the label -->\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"43\"\n height=\"215\"\n rx=\"10.5\"\n fill=\"white\"\n stroke=\"#D36CFF\"\n ></rect>\n\n <!-- Plus button at the top -->\n <g\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"12.5\"\n y=\"10\"\n width=\"18\"\n height=\"18\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n ></rect>\n\n <path\n d=\"M22.52 12.174V17.08H27.47V18.51H22.52V23.394H21.2V18.51H16.25V17.08H21.2V12.174H22.52Z\"\n fill=\"#0000FF\"\n class=\"plus-icon\"\n style=\"cursor: pointer\"\n ></path>\n </g>\n\n <!-- Swimlane label -->\n <text\n x=\"22\"\n y=\"106\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 100)\"\n >\n {{\n swimlane.label.length > 12\n ? swimlane.label.substring(0, 10) + \"...\"\n : swimlane.label\n }}\n </text>\n\n <!-- Tag count indicator at the bottom -->\n <rect\n x=\"11.5\"\n y=\"187\"\n width=\"21\"\n height=\"19\"\n rx=\"9.5\"\n fill=\"#9E9E9E\"\n ></rect>\n <text\n x=\"24\"\n y=\"206\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"black\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 200)\"\n >\n {{ swimlane.tags.length }}\n </text>\n </g>\n </g>\n\n }\n\n <!-- Nodes -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n class=\"node-element\"\n [attr.transform]=\"\n 'translate(' + node.x + ',' + (node.y - swimlane.order * 263) + ')'\n \"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Exit point indicator (circle and arrow) -->\n @if (node.stageData?.IsExitPoint) {\n <!-- Arrow from node to circle -->\n <path\n [attr.d]=\"'M ' + node.width + ' 50 L ' + (node.width + 20) + ' 50'\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n <!-- Circle -->\n <circle\n [attr.cx]=\"node.width + 50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n ></circle>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n (showShieldDialog)=\"onShowShieldDialog($event)\"\n (showEscalationDialog)=\"onShowEscalationDialog($event)\"\n (showFormDialog)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n \"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n\n <!-- Decision node condition indicator icon -->\n <svg:g\n (click)=\"showDecisionConditionsPopup($event, node, swimlane.order)\"\n class=\"decision-condition-icon\"\n [attr.transform]=\"\n 'translate(' +\n (node.width / 2 - 10) +\n ',' +\n (node.height / 2 - 10) +\n ')'\n \"\n >\n <svg:rect\n x=\"-5\"\n y=\"-5\"\n width=\"30\"\n height=\"30\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M10 0H20V2H10V0ZM10 8H20V10H10V8ZM10 4H20V6H10V4ZM0 0H8V2H0V0ZM0 8H8V10H0V8ZM0 4H8V6H0V4Z\"\n fill=\"#D36CFF\"\n />\n </svg:g>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n alignment-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"10\"\n fill=\"#000000\"\n >\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n } }\n\n <!-- Connections -->\n @for (connection of state.connections; track connection.id) {\n <g class=\"connection-element\">\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n\n <!-- Connection Label -->\n @if (connection.sourceNodeId && connection.targetNodeId) {\n <foreignObject\n [attr.x]=\"getLabelPosition(connection).x\"\n [attr.y]=\"getLabelPosition(connection).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible; pointer-events: all;\"\n [attr.transform]=\"'translate(-75, -10)'\"\n >\n <wf-label-editor\n [label]=\"connection.label || 'New Action'\"\n [x]=\"0\"\n [y]=\"0\"\n [isConnection]=\"true\"\n (labelChange)=\"saveConnectionLabel(connection, $event)\"\n (openDialog)=\"onShowActionDialog(connection)\"\n />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n (dropdownOpenChange)=\"$event ? null : hideConnectionPopup()\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <lib-conditions-popup\n [visible]=\"showDecisionConditionDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [newConnectionId]=\"activeConnectionId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n (saved)=\"onDecisionConditionSaved($event)\"\n ></lib-conditions-popup>\n\n <!-- <lib-decision-popup\n [visible]=\"showConditionsDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n ></lib-decision-popup> -->\n\n <lib-stage-dialog\n [visible]=\"showStageDialogLocal\"\n [stageData]=\"activeStageData || {}\"\n (closed)=\"onStageDialogClosed()\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n\n <lib-action-dialog\n [visible]=\"showActionDialogLocal\"\n [actionData]=\"activeActionData\"\n (closed)=\"onActionDialogClosed()\"\n (saved)=\"onActionDialogSaved($event)\"\n ></lib-action-dialog>\n\n <lib-escalation-dialog\n [visible]=\"showEscalationDialogLocal\"\n [type]=\"activeEscalationType()!\"\n [stageCode]=\"activeStageCode() || ''\"\n [workflowCode]=\"state.workflow?.Code || ''\"\n (closed)=\"onEscalationDialogClosed()\"\n ></lib-escalation-dialog>\n</div>\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { SwimlaneService } from '../services/swimlane.service';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n\n@Component({\n selector: 'lib-swimlane-dialog',\n templateUrl: './swimlane-dialog.component.html',\n styleUrl: './swimlane-dialog.component.css',\n})\nexport class SwimlaneDialogComponent implements OnInit {\n @Input() visible: boolean = false;\n swimlaneData = input<{ name: string; tags: Tag[] } | null>(null);\n @Output() closed = new EventEmitter();\n @Output() created = new EventEmitter<{ tags: Tag[]; name: string }>();\n\n searchQuery: string = '';\n workflowName: string = '';\n\n // Track selected tags in a separate array\n selectedTagNames: string[] = [];\n selectedTags: Tag[] = [];\n\n // Tags list\n tags: Tag[] = [];\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService,\n private swimlaneService: SwimlaneService\n ) {\n effect(() => {\n const sData = this.swimlaneData();\n // If editing an existing swimlane, populate the form\n if (sData) {\n this.workflowName = sData.name || '';\n // Set selected tags\n this.selectedTags = sData.tags;\n }\n });\n }\n\n ngOnInit(): void {\n console.log('Swimlane dialog initialized with data:', this.swimlaneData);\n\n // Reset form fields when dialog opens\n // this.selectedTagNames = [];\n this.workflowName = '';\n this.searchQuery = '';\n\n // Load tags from the data service\n this.loadTags();\n }\n\n /**\n * Load tags from the data service\n */\n private loadTags(): void {\n this.dataService.getTags().then((data) => {\n this.tags = data.Result;\n });\n }\n\n get allSelected(): boolean {\n return (\n this.tags.length > 0 && this.selectedTagNames.length === this.tags.length\n );\n }\n\n set allSelected(value: boolean) {\n if (value) {\n this.selectedTagNames = this.tags.map((tag) => tag.Name);\n } else {\n this.selectedTagNames = [];\n }\n }\n\n get filteredTags(): Tag[] {\n if (!this.searchQuery) {\n return this.tags;\n }\n\n return this.tags.filter((tag) =>\n tag.Name.toLowerCase().includes(this.searchQuery.toLowerCase())\n );\n }\n\n isTagSelected(tagName: string): boolean {\n return this.selectedTagNames.includes(tagName);\n }\n\n toggleTagSelection(tagName: string): void {\n const index = this.selectedTagNames.indexOf(tagName);\n if (index > -1) {\n this.selectedTagNames.splice(index, 1);\n } else {\n this.selectedTagNames.push(tagName);\n }\n }\n\n onDialogClose(eventData: any) {\n console.log('Dialog closed, received data:', eventData);\n this.searchQuery = '';\n this.workflowName = '';\n this.selectedTagNames = [];\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n console.log('Dialog opened, received data:', eventData);\n }\n\n applySelection() {\n const selectedTags = this.tags.filter((tag) =>\n this.selectedTagNames.includes(tag.Name)\n );\n\n console.log('Submitting swimlane data:', {\n name: this.workflowName,\n tags: selectedTags,\n });\n\n this.created.emit({\n tags: this.selectedTags,\n name: this.workflowName,\n });\n\n // Reset form fields when dialog opens\n this.selectedTagNames = [];\n this.selectedTags = [];\n this.workflowName = '';\n this.searchQuery = '';\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div\n class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\"\n >\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span\n class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"\n ></span>\n </button>\n <div class=\"text-center\">\n <h2 class=\"text-sm font-medium\">Select Tags</h2>\n <span class=\"text-xs text-[#3E3E3E]/70\"\n >{{ this.selectedTags.length }}/{{ tags.length }}</span\n >\n </div>\n <span\n class=\"font-medium cursor-pointer text-[#3E3E3E]/70\"\n (click)=\"applySelection()\"\n >Create</span\n >\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"p-3\">\n <div class=\"mb-4 grid gap-4\">\n <!-- <input\n type=\"text\"\n placeholder=\"Enter Name\"\n class=\"w-full px-4 py-2 rounded-lg border border-[#E7C10B] outline-none\"\n [(ngModel)]=\"workflowName\"\n />\n\n <input\n type=\"search\"\n placeholder=\"Filter Tags\"\n class=\"w-full px-4 py-2 rounded-lg border border-[#E7C10B] outline-none\"\n [(ngModel)]=\"searchQuery\"\n />\n </div>\n\n <div class=\"\">\n <div class=\"py-3\">\n <label class=\"flex items-center\">\n <input type=\"checkbox\" class=\"mr-3\" [(ngModel)]=\"allSelected\" />\n <span class=\"text-sm\">Select All</span>\n </label>\n </div>\n\n <div *ngFor=\"let tag of filteredTags\" class=\"py-3\">\n <label class=\"flex items-center\">\n <input\n type=\"checkbox\"\n class=\"mr-3\"\n [checked]=\"isTagSelected(tag.Name)\"\n (change)=\"toggleTagSelection(tag.Name)\"\n />\n <span class=\"text-sm\">{{ tag.Name }}</span>\n <span *ngIf=\"!tag.IsOptional\" class=\"ml-2 text-xs text-red-500\"\n >(Required)</span\n >\n </label>\n </div> -->\n\n <verbena-input\n [(ngModel)]=\"workflowName\"\n [border]=\"'1px solid #9A9FBF66'\"\n placeHolder=\"Enter Swimlane Label\"\n [bgColor]=\"'white'\"\n ></verbena-input>\n\n <verben-drop-down\n selectKey=\"Code\"\n label=\"Tags\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"true\"\n placeholder=\"Select\"\n [options]=\"tags\"\n optionLabel=\"Name\"\n id=\"tags\"\n [(ngModel)]=\"selectedTags\"\n class=\"form-control\"\n >\n </verben-drop-down>\n </div>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div\n class=\"flex justify-between w-full items-center p-4 border-t border-gray-200\"\n >\n <!-- <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"onDialogClose($event)\"\n >\n Cancel\n </button> -->\n\n <verbena-button\n (click)=\"onDialogClose($event)\"\n text=\"Cancel\"\n styleType=\"ylw-outline\"\n ></verbena-button>\n\n <verbena-button\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n [disable]=\"selectedTags.length < 1\"\n (click)=\"applySelection()\"\n ></verbena-button>\n\n <!-- <verbena-button\n width=\"114px\"\n height=\"39px\"\n text=\"Delete\"\n bgColor=\"#999999\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n ></verbena-button> -->\n </div>\n</ng-template>\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { ActorTag, Tag } from 'verben-workflow-ui/src/lib/models';\nimport { UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { WorkflowDataService } from '../workflow-data.service';\n\n@Component({\n selector: 'lib-actor-tags-dialog',\n templateUrl: './actor-tags-dialog.component.html',\n styleUrl: './actor-tags-dialog.component.css',\n})\nexport class ActorTagsDialogComponent implements OnInit {\n @Input() visible: boolean = false;\n @Input() workflowCode: string | null = null;\n @Output() closed = new EventEmitter();\n\n tags: Tag[] = [];\n selectedTag: Tag | null = null;\n isViewOnly: boolean = false;\n\n constructor(\n private dataService: WorkflowDataService,\n private utilService: UtilService\n ) { }\n\n ngOnInit(): void {\n this.loadTags();\n }\n\n private loadTags(): void {\n this.dataService.getTags().then((data) => {\n this.tags = data.Result;\n });\n }\n\n onDialogClose(eventData: any) {\n this.resetForm();\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n // console.log('Dialog opened');\n }\n\n onSave() {\n if (!this.selectedTag || !this.workflowCode) {\n return;\n }\n\n const actorTag: ActorTag = {\n Name: this.selectedTag.Name,\n IsViewOnly: this.isViewOnly,\n Workflow: this.workflowCode,\n // Add required BaseModel properties if needed, or rely on backend to generate them\n // Assuming BaseModel has Id, CreatedAt, etc. which might be optional or generated\n // For now, casting as any to avoid strict type checks if BaseModel has mandatory fields not relevant for creation\n } as any;\n\n this.dataService.saveActorTags([actorTag]).then(() => {\n console.log('Actor tag saved');\n this.utilService.showSuccess('Actor tags saved successfully');\n this.onDialogClose(null);\n });\n }\n\n private resetForm() {\n this.selectedTag = null;\n this.isViewOnly = false;\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div\n class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\"\n >\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span\n class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"\n ></span>\n </button>\n <div class=\"text-center\">\n <h2 class=\"text-sm font-medium\">Select Actor Tag</h2>\n </div>\n <span\n class=\"font-medium cursor-pointer text-[#3E3E3E]/70\"\n (click)=\"onSave()\"\n >Save</span\n >\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"p-3\">\n <div class=\"mb-4 grid gap-4\">\n <verben-drop-down\n selectKey=\"Code\"\n label=\"Tag\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select Tag\"\n [options]=\"tags\"\n optionLabel=\"Name\"\n id=\"tag\"\n [(ngModel)]=\"selectedTag\"\n class=\"form-control\"\n >\n </verben-drop-down>\n\n <div class=\"flex items-center gap-4 mt-4\">\n <label\n for=\"is-view-only\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Is View Only?\n </label>\n <verbena-switch\n id=\"is-view-only\"\n onText=\"Yes\"\n offText=\"No\"\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"isViewOnly\"\n ></verbena-switch>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div\n class=\"flex justify-between w-full items-center p-4 border-t border-gray-200\"\n >\n <verbena-button\n (click)=\"onDialogClose($event)\"\n text=\"Cancel\"\n styleType=\"ylw-outline\"\n ></verbena-button>\n\n <verbena-button\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n [disable]=\"!selectedTag\"\n (click)=\"onSave()\"\n ></verbena-button>\n </div>\n</ng-template>\n","import {\n Component,\n Input,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { Tag, Workflow, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { DesignerCanvasComponent } from './designer-canvas/designer-canvas.component';\nimport { WorkflowDataService } from './workflow-data.service';\nimport { WorkflowDesignerState } from './workflow-designer.state';\nimport { ConnectionPoint, Node, ToolType } from './workflow-designer.types';\n\n@Component({\n selector: 'lib-workflow-designer',\n templateUrl: './workflow-designer.component.html',\n styleUrl: './workflow-designer.component.css',\n})\nexport class WorkflowDesignerComponent {\n @ViewChild('canvasRef') canvasRef!: DesignerCanvasComponent;\n @Input() workflowCode: string | null = null;\n\n // Currently selected toolWOR-N9H5CL\n selectedTool: ToolType = null;\n showSwimlaneDialog: boolean = false;\n showActorTagsDialog: boolean = false;\n\n // New properties for stage dialog\n showStageDialog: boolean = false;\n pendingStagePosition: { swimlaneIndex: number; x: number; y: number } | null =\n null;\n pendingStageData: Partial<WorkflowStage> = {};\n\n editingSwimlaneIndex: number | null = null;\n editingSwimlane: WritableSignal<{ name: string; tags: Tag[] } | null> =\n signal(null);\n isCreatingStageFromConnection: boolean = false;\n\n pendingConnectionSourcePoint: ConnectionPoint | null = null;\n pendingConnectionSourceSwimlaneIndex: number | null = null;\n\n isLoading: boolean = false;\n isSaving: boolean = false;\n\n constructor(\n public state: WorkflowDesignerState,\n private dataService: WorkflowDataService,\n private utilService: UtilService\n ) { }\n\n ngOnInit(): void {\n // Load workflow data if code is provided\n if (this.workflowCode) {\n this.loadWorkflow(this.workflowCode);\n }\n }\n\n saveWorkflow(): void {\n if (this.isSaving) return;\n\n this.isSaving = true;\n\n // Transform the UI model to the API model\n const workflowModel = this.state.transformToWorkflowModel();\n\n if (workflowModel) {\n // Save to the backend\n this.dataService\n .saveWorkflows([workflowModel])\n .then((response) => {\n console.log('Workflow saved successfully:', response);\n this.utilService.showSuccess('Workflow saved successfully');\n // If the API returns an updated workflow, we might want to reload it\n const updatedWorkflow = response[0];\n if (updatedWorkflow) {\n this.state.setWorkflowId(updatedWorkflow.Code);\n this.parseWorkflowData(updatedWorkflow);\n }\n this.isSaving = false;\n })\n .catch((error) => {\n console.error('Error saving workflow:', error);\n this.isSaving = false;\n // Handle error - show a notification, etc.\n });\n }\n }\n\n loadWorkflow(code: string): void {\n this.isLoading = true;\n this.dataService\n .getWorkflowWithParam(code)\n .then((response) => {\n if (response && response.Result) {\n // Store the workflow ID\n const wf = response.Result[0];\n this.state.setWorkflowId(wf.Code);\n this.parseWorkflowData(wf);\n }\n this.isLoading = false;\n })\n .catch((error) => {\n console.error('Error loading workflow:', error);\n this.isLoading = false;\n });\n }\n\n // Method to parse workflow data from API and populate the designer\n parseWorkflowData(workflow: Workflow): void {\n // Store the complete workflow\n this.state.workflow = workflow;\n\n // Clear existing state\n this.state.swimlanes = [];\n this.state.connections = [];\n this.state.swimlaneRecord = {};\n this.state.stageRecord = {};\n this.state.actionRecord = {};\n\n // Set workflow form if exists\n if (workflow.Form) {\n this.state.setWorkflowForm(\n workflow.Form,\n workflow.FormName || 'Workflow Form'\n );\n }\n\n // Store the workflow ID\n this.state.setWorkflowId(workflow.Code);\n\n // Process swimlanes first\n if (workflow.Lanes && workflow.Lanes.length) {\n workflow.Lanes.sort((a, b) => a.Position - b.Position).forEach((lane) => {\n // Store original lane in record\n this.state.swimlaneRecord[lane.Code] = lane;\n\n // Add swimlane to UI model with the original ID\n const swimlane = {\n order: lane.Position,\n label: lane.Name || `Lane ${lane.Position}`,\n tags: lane.Tags || [],\n nodes: [],\n id: lane.Code, // Store the original ID\n };\n\n this.state.swimlanes.push(swimlane);\n\n // Register loaded object\n this.state.registerLoadedObject(lane.Id, lane.Code);\n });\n }\n\n // Process stages\n if (workflow.Stages && workflow.Stages.length) {\n workflow.Stages.forEach((stage) => {\n // Store original stage in record\n this.state.stageRecord[stage.Code] = stage;\n\n // Find swimlane index by SwimLane ID\n const swimlaneIndex = this.state.swimlanes.findIndex(\n (lane) => lane.id === stage.SwimLane\n );\n\n if (swimlaneIndex !== -1) {\n const x = stage.Coordinates?.X || 100;\n const y = stage.Coordinates?.Y || 50;\n\n // Create node with original ID\n const node: Node = {\n id: stage.Code, // Use original ID\n type: stage.SubWorkFlow ? 'subflow' : ('stage' as const),\n x: x,\n y: y,\n width: 169,\n height: 100,\n isStartNode: stage.IsEntryPoint,\n stageData: {\n Name: stage.Name,\n Description: stage.Description,\n Duration: stage.Duration,\n PassOnRule: stage.PassOnRule,\n ActorRule: stage.ActorRule,\n MinNoOfActor: stage.MinNoOfActor,\n Tags: stage.Tags || [],\n IsParallel: stage.IsParallel,\n IsEntryPoint: stage.IsEntryPoint,\n IsExitPoint: stage.IsExitPoint,\n IsSubProcess: stage.SubWorkFlow ? true : false,\n Id: stage.Id, // Keep original ID\n Code: stage.Code,\n Form: stage.Form,\n formId: stage.Form,\n },\n connectionPoints: [], // Initialize with empty array\n };\n\n // Generate connection points\n node.connectionPoints = this.state.generateConnectionPoints(node);\n\n // Add node to swimlane\n this.state.swimlanes[swimlaneIndex].nodes =\n this.state.swimlanes[swimlaneIndex].nodes || [];\n this.state.swimlanes[swimlaneIndex].nodes.push(node);\n\n // If this is a start node, update state\n if (stage.IsEntryPoint) {\n this.state.startNodeId = stage.Code;\n }\n\n // Register loaded stage\n this.state.registerLoadedObject(stage.Id, stage.Code);\n }\n });\n }\n\n // Process connections/actions\n if (workflow.Actions && workflow.Actions.length) {\n workflow.Actions.forEach((action) => {\n // Store original action in record\n this.state.actionRecord[action.Code] = action;\n\n // Find source and target nodes\n const sourceNodeInfo = this.state.findNodeById(action.FromStage);\n const targetNodeInfo = this.state.findNodeById(action.ToStage);\n\n console.log(sourceNodeInfo, targetNodeInfo);\n\n if (sourceNodeInfo && targetNodeInfo) {\n // Find suitable connection points\n // const sourceNode = sourceNodeInfo.node;\n // const targetNode = targetNodeInfo.node;\n\n // const sourcePoint = sourceNode.connectionPoints?.find(\n // (p) => p.type === 'right' || p.type === 'bottom'\n // );\n\n // const targetPoint = targetNode.connectionPoints?.find(\n // (p) => p.type === 'left' || p.type === 'top'\n // );\n\n const sourceNode = sourceNodeInfo.node;\n const targetNode = targetNodeInfo.node;\n\n let sourcePointId, targetPointId;\n\n console.log(action.SourcePointType, action.TargetPointType);\n\n if (action.SourcePointType) {\n // Find a point with matching type\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.type === action.SourcePointType?.toLowerCase()\n );\n sourcePointId = sourcePoint?.id;\n } else {\n // Fallback to finding a suitable point\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.type === 'right' || p.type === 'bottom'\n );\n sourcePointId = sourcePoint?.id;\n }\n\n if (action.TargetPointType) {\n // Find a point with matching type\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.type === action.TargetPointType?.toLowerCase()\n );\n targetPointId = targetPoint?.id;\n } else {\n // Fallback to finding a suitable point\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.type === 'left' || p.type === 'top'\n );\n targetPointId = targetPoint?.id;\n }\n\n console.log('Source point:', sourcePointId);\n console.log('Target point:', targetPointId);\n\n if (sourcePointId && targetPointId) {\n const connection = {\n id: action.Code, // Use original ID\n sourceNodeId: action.FromStage,\n targetNodeId: action.ToStage,\n sourcePointId: sourcePointId,\n targetPointId: targetPointId,\n sourceSwimlaneIndex: sourceNodeInfo.swimlaneIndex,\n targetSwimlaneIndex: targetNodeInfo.swimlaneIndex,\n condition: action.PassOnRule || '',\n label: action.Name || '',\n action: action.OperationAction || null,\n targetStatus: action.TargetStatus || undefined,\n };\n\n this.state.connections.push(connection);\n\n // Register loaded action\n this.state.registerLoadedObject(action.Id, action.Code);\n }\n }\n });\n }\n }\n\n // Helper method to find swimlane index by Lane ID\n findSwimlaneIndexByLaneId(laneId: string): number {\n // First check our mapping\n if (this.state.laneIdToIndexMap.has(laneId)) {\n return this.state.laneIdToIndexMap.get(laneId)!;\n }\n\n // Fallback to the original logic (for backward compatibility)\n const parts = laneId.split('-');\n if (parts.length > 1) {\n const index = parseInt(parts[1]);\n if (!isNaN(index) && index < this.state.swimlanes.length) {\n return index;\n }\n }\n\n return -1;\n }\n\n // Handle tool selection from toolbar\n onToolSelected(tool: ToolType): void {\n // Toggle selection if the same tool is clicked again\n this.selectedTool = this.selectedTool === tool ? null : tool;\n console.log('Selected tool:', this.selectedTool);\n }\n\n openSwimlaneDialog() {\n console.log('SML INDEX', this.editingSwimlaneIndex);\n if (this.editingSwimlaneIndex !== null) {\n console.log('SML', this.state.swimlanes[this.editingSwimlaneIndex]);\n this.editingSwimlane.set({\n name: this.state.swimlanes[this.editingSwimlaneIndex].label,\n tags: this.state.swimlanes[this.editingSwimlaneIndex].tags,\n });\n console.log('SML_EDT', this.editingSwimlane());\n }\n this.showSwimlaneDialog = true;\n }\n\n onShowStageDialog(event: { position: any; isFromConnection: boolean }) {\n console.log('Received showStageDialog event:', event);\n this.pendingStagePosition = event.position;\n this.showStageDialog = true;\n\n // If this is from a connection creation, store that info\n this.isCreatingStageFromConnection = event.isFromConnection;\n\n // Store the source point data before it gets lost\n if (\n event.isFromConnection &&\n this.state.draggingConnectionData.sourcePoint\n ) {\n this.pendingConnectionSourcePoint =\n this.state.draggingConnectionData.sourcePoint;\n this.pendingConnectionSourceSwimlaneIndex =\n this.state.draggingConnectionData.sourceSwimlaneIndex ?? null;\n console.log(\n 'Stored source point for connection:',\n this.pendingConnectionSourcePoint\n );\n }\n\n console.log('Stage dialog state:', {\n pendingPosition: this.pendingStagePosition,\n isVisible: this.showStageDialog,\n });\n }\n\n handleCanvasPositionClick(event: { x: number; y: number }) {\n console.log(event);\n\n // Check if this is an edit swimlane event\n if (\n event.x === -1 &&\n event.y >= 0 &&\n event.y < this.state.swimlanes.length\n ) {\n console.log('Editing swimlane', event.y);\n this.editingSwimlaneIndex = event.y;\n this.openSwimlaneDialog();\n return;\n }\n\n // Normal canvas click handling\n const swimlaneIndex = Math.floor(event.y / 263);\n\n switch (this.selectedTool) {\n case 'swimlane':\n console.log('Opening swimlane dialog for new swimlane');\n this.editingSwimlaneIndex = null; // Set to null to indicate creating a new swimlane\n this.openSwimlaneDialog();\n this.selectedTool = null;\n break;\n case 'stage':\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n console.log(\n `Adding ${this.selectedTool} to swimlane ${swimlaneIndex}`\n );\n\n // Create the stage directly with default properties\n const node = this.state.addNode(\n swimlaneIndex,\n 'stage',\n event.x,\n event.y,\n { Name: 'New Stage' } // Add default properties\n );\n\n if (node) {\n // Reset the selected tool after placing a node\n this.selectedTool = null;\n }\n }\n break;\n case 'decision':\n case 'form':\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n console.log(\n `Adding ${this.selectedTool} to swimlane ${swimlaneIndex}`\n );\n const node = this.state.addNode(\n swimlaneIndex,\n this.selectedTool,\n event.x,\n event.y\n );\n if (node) {\n // Reset the selected tool after placing a node\n this.selectedTool = null;\n }\n }\n break;\n case 'subflow':\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n console.log(\n `Adding ${this.selectedTool} to swimlane ${swimlaneIndex}`\n );\n // Show subflow workflow selection popup\n this.canvasRef.showSubflowSelectionPopup(\n event.x,\n event.y,\n swimlaneIndex\n );\n }\n break;\n default:\n break;\n }\n }\n\n onSwimlaneDialogFilled(event: { tags: Tag[]; name: string }) {\n console.log(\n 'Swimlane dialog filled:',\n event,\n 'Editing index:',\n this.editingSwimlaneIndex\n );\n\n if (this.editingSwimlaneIndex !== null) {\n // Update existing swimlane\n console.log(\n 'Updating existing swimlane at index:',\n this.editingSwimlaneIndex\n );\n this.state.updateSwimlane(\n this.editingSwimlaneIndex,\n event.name,\n event.tags\n );\n } else {\n // Create new swimlane\n console.log('Creating new swimlane');\n this.state.addSwimlane(event.name, event.tags);\n }\n\n this.showSwimlaneDialog = false;\n this.editingSwimlaneIndex = null;\n }\n\n onStageDialogSaved(stageData: Partial<WorkflowStage>) {\n if (this.canvasRef.activeStageId) {\n // Editing an existing stage\n const nodeInfo = this.state.findNodeById(this.canvasRef.activeStageId);\n if (nodeInfo) {\n // Update the stage data\n nodeInfo.node.stageData = {\n ...nodeInfo.node.stageData,\n ...stageData,\n };\n console.log('Updated stage data:', nodeInfo.node.stageData);\n }\n this.canvasRef.activeStageId = null;\n } else if (this.pendingStagePosition) {\n if (this.canvasRef.activeStageId) {\n // Editing an existing stage\n const nodeInfo = this.state.findNodeById(this.canvasRef.activeStageId);\n if (nodeInfo) {\n // Update the stage data\n nodeInfo.node.stageData = {\n ...nodeInfo.node.stageData,\n ...stageData,\n };\n console.log('Updated stage data:', nodeInfo.node.stageData);\n }\n this.canvasRef.activeStageId = null;\n } else if (this.pendingStagePosition) {\n // Creating a new stage (keep existing logic for this case)\n // ...existing code...\n }\n\n this.showStageDialog = false;\n }\n\n this.showStageDialog = false;\n }\n\n onSubflowSelected() {\n // Reset the selected tool after placing a subflow node\n this.selectedTool = null;\n }\n\n openActorTagsDialog() {\n this.showActorTagsDialog = true;\n }\n}\n","<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>{{ state.workflow?.Name }}</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar\n [selectedTool]=\"selectedTool\"\n [isSaving]=\"isSaving\"\n [workflowCode]=\"state.workflow?.Code || null\"\n (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\"\n (openActorTags)=\"openActorTagsDialog()\"\n >\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas\n [selectedTool]=\"selectedTool\"\n (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\"\n (showStageDialog)=\"onShowStageDialog($event)\"\n #canvasRef\n >\n </lib-designer-canvas>\n\n <lib-swimlane-dialog\n [visible]=\"showSwimlaneDialog\"\n [swimlaneData]=\"editingSwimlane()\"\n (created)=\"onSwimlaneDialogFilled($event)\"\n (closed)=\"showSwimlaneDialog = false\"\n ></lib-swimlane-dialog>\n\n <lib-stage-dialog\n [visible]=\"showStageDialog\"\n [stageData]=\"pendingStageData\"\n (closed)=\"showStageDialog = false\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n\n <lib-actor-tags-dialog\n [visible]=\"showActorTagsDialog\"\n [workflowCode]=\"state.workflow?.Code || null\"\n (closed)=\"showActorTagsDialog = false\"\n ></lib-actor-tags-dialog>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\ninterface ConnectionCondition {\n connectionId: string;\n sourceNodeId: string;\n targetNodeId: string;\n condition: string;\n}\n\n@Component({\n selector: 'lib-decision-popup',\n templateUrl: './decision-popup.component.html',\n styleUrl: './decision-popup.component.css',\n})\nexport class DecisionPopupComponent {\n @Input() visible: boolean = false;\n @Input() decisionNodeId: string = '';\n @Input() popupX: number = 0;\n @Input() popupY: number = 0;\n @Output() closed = new EventEmitter();\n\n showDuration: boolean = true;\n\n constructor(private state: WorkflowDesignerState) {}\n\n getConnectionConditions(): ConnectionCondition[] {\n if (!this.decisionNodeId) return [];\n\n // Get all connections from this decision node\n return this.state.connections\n .filter((conn) => conn.sourceNodeId === this.decisionNodeId)\n .map((conn) => ({\n connectionId: conn.id,\n sourceNodeId: conn.sourceNodeId,\n targetNodeId: conn.targetNodeId,\n condition: conn.condition || 'order.amount > 500,000', // Default or actual condition\n }));\n }\n\n getTargetNodeName(nodeId: string): string {\n const nodeInfo = this.state.findNodeById(nodeId);\n if (nodeInfo && nodeInfo.node) {\n return nodeInfo.node.stageData?.Name || 'Stage';\n }\n return 'Unknown Stage';\n }\n\n getDuration(): number {\n // Get duration from the decision node or default to 120 days\n const nodeInfo = this.state.findNodeById(this.decisionNodeId);\n if (nodeInfo && nodeInfo.node && nodeInfo.node.stageData) {\n return nodeInfo.node.stageData.Duration || 120;\n }\n return 120;\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","<div\n *ngIf=\"visible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n class=\"decision-conditions-popup\"\n>\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-4 bg-white border border-purple-300 rounded shadow-md w-80\"\n dropdown-content\n >\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"text-lg font-medium\">Decision Conditions</h3>\n <button class=\"text-gray-500 hover:text-gray-700\" (click)=\"onClose()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <div class=\"space-y-3\">\n @for (condition of getConnectionConditions(); track\n condition.connectionId) {\n <div class=\"p-3 border rounded\">\n <div class=\"mb-2\">\n <span class=\"font-medium\">Action {{ $index + 1 }}:</span>\n </div>\n <div class=\"flex items-center\">\n <input\n type=\"text\"\n [value]=\"condition.condition\"\n readonly\n class=\"w-full px-3 py-2 bg-gray-50 border rounded\"\n placeholder=\"No condition\"\n />\n <span class=\"ml-2\">&gt;</span>\n </div>\n <div class=\"mt-1 text-xs text-gray-500\">\n {{ getTargetNodeName(condition.targetNodeId) }}\n </div>\n </div>\n }\n </div>\n\n @if (getConnectionConditions().length === 0) {\n <div class=\"text-center py-3 text-gray-500\">\n No conditions defined for this decision node\n </div>\n } @if (showDuration) {\n <div class=\"mt-4 pt-3 border-t border-gray-200\">\n <div class=\"flex items-center\">\n <span class=\"font-medium\">Duration:</span>\n <span class=\"ml-2\">{{ getDuration() }} days</span>\n </div>\n </div>\n }\n </div>\n </verben-pop-Up>\n</div>\n","import { Injectable } from '@angular/core';\nimport { Connection, ConnectionPoint } from '../workflow-designer.types';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport { NodeManagementService } from './node-management.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConnectionService {\n private draggingConnectionData: {\n sourcePoint?: ConnectionPoint;\n sourceSwimlaneIndex?: number;\n startX?: number;\n startY?: number;\n currentX?: number;\n currentY?: number;\n } = {};\n\n // The rules defining which node types can connect to which other node types\n private readonly connectionRules: Record<string, string[]> = {\n stage: ['stage', 'decision', 'subflow', 'form'],\n decision: ['stage'], // Decisions can only connect to Stages\n form: [],\n subflow: ['stage', 'decision'],\n };\n\n constructor(\n private state: WorkflowDesignerState,\n private nodeService: NodeManagementService\n ) {}\n\n /**\n * Start a new connection drag operation\n */\n startConnectionDrag(\n point: ConnectionPoint,\n swimlaneIndex: number,\n globalX: number,\n globalY: number\n ): void {\n this.draggingConnectionData = {\n sourcePoint: point,\n sourceSwimlaneIndex: swimlaneIndex,\n startX: globalX,\n startY: globalY,\n currentX: globalX,\n currentY: globalY,\n };\n }\n\n /**\n * Update the position of the dragging connection\n */\n updateConnectionDrag(currentX: number, currentY: number): void {\n if (this.draggingConnectionData.sourcePoint) {\n this.draggingConnectionData.currentX = currentX;\n this.draggingConnectionData.currentY = currentY;\n }\n }\n\n /**\n * End the current connection drag operation\n */\n endConnectionDrag(): void {\n this.draggingConnectionData = {};\n }\n\n /**\n * Check if a connection drag is in progress\n */\n isConnectionDragging(): boolean {\n return !!this.draggingConnectionData.sourcePoint;\n }\n\n /**\n * Get the current connection path data for rendering\n */\n getConnectionPathData(): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n } | null {\n if (!this.draggingConnectionData.sourcePoint) return null;\n\n const { sourcePoint, sourceSwimlaneIndex, currentX, currentY } =\n this.draggingConnectionData;\n const nodeInfo = this.nodeService.findNodeById(sourcePoint.nodeId);\n\n if (!nodeInfo || sourceSwimlaneIndex === undefined) return null;\n\n const node = nodeInfo.node;\n\n // Calculate start point in global coordinates\n const startX = node.x + sourcePoint.x;\n const startY = node.y + sourcePoint.y + (sourceSwimlaneIndex * 263 + 40); // Add swimlane offset\n\n return {\n startX,\n startY,\n endX: currentX ?? startX,\n endY: currentY ?? startY,\n sourceSwimlaneIndex,\n };\n }\n\n /**\n * Create a new connection between nodes\n */\n createConnection(\n targetNodeId: string,\n targetPointId: string,\n targetSwimlaneIndex: number\n ): Connection | null {\n const { sourcePoint, sourceSwimlaneIndex } = this.draggingConnectionData;\n\n if (!sourcePoint || sourceSwimlaneIndex === undefined) {\n console.error('Missing source data for connection');\n return null;\n }\n\n const connection: Connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: targetNodeId,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPointId,\n sourceSwimlaneIndex: sourceSwimlaneIndex,\n targetSwimlaneIndex: targetSwimlaneIndex,\n label: '', // Default label, can be set later\n action: null,\n };\n\n // Add the connection to the state\n this.state.connections.push(connection);\n\n return connection;\n }\n\n /**\n * Get the path data for rendering a saved connection\n */\n getConnectionData(connection: Connection): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n targetSwimlaneIndex: number;\n } | null {\n const sourceNodeInfo = this.nodeService.findNodeById(\n connection.sourceNodeId\n );\n const targetNodeInfo = this.nodeService.findNodeById(\n connection.targetNodeId\n );\n\n if (!sourceNodeInfo || !targetNodeInfo) {\n return null;\n }\n\n const sourceNode = sourceNodeInfo.node;\n const targetNode = targetNodeInfo.node;\n\n // Find connection points\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.id === connection.targetPointId\n );\n\n if (!sourcePoint || !targetPoint) {\n return null;\n }\n\n // Calculate global coordinates\n const startX = sourceNode.x + sourcePoint.x;\n const startY =\n sourceNode.y +\n sourcePoint.y +\n (connection.sourceSwimlaneIndex * 263 + 40);\n\n const endX = targetNode.x + targetPoint.x;\n const endY =\n targetNode.y +\n targetPoint.y +\n (connection.targetSwimlaneIndex * 263 + 40);\n\n return {\n startX,\n startY,\n endX,\n endY,\n sourceSwimlaneIndex: connection.sourceSwimlaneIndex,\n targetSwimlaneIndex: connection.targetSwimlaneIndex,\n };\n }\n\n /**\n * Calculate a path for orthogonal connection rendering\n */\n getOrthogonalPath(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n pointType: 'top' | 'right' | 'bottom' | 'left'\n ): string {\n // Determine initial direction based on connection point type\n let path = '';\n\n // For side points (left/right), start with horizontal line\n if (pointType === 'left' || pointType === 'right') {\n // Calculate horizontal distance\n const horizontalDist = endX - startX;\n\n // If the end point is very close horizontally, use a simple 3-segment path\n if (Math.abs(horizontalDist) < 30) {\n const midY = (startY + endY) / 2;\n path = `M ${startX} ${startY} H ${endX} V ${midY} V ${endY}`;\n }\n // Otherwise, create a path with horizontal segment first, then vertical, then horizontal\n else {\n path = `M ${startX} ${startY} H ${\n startX + horizontalDist / 2\n } V ${endY} H ${endX}`;\n }\n }\n // For top/bottom points, start with vertical line\n else if (pointType === 'top' || pointType === 'bottom') {\n // Calculate vertical distance\n const verticalDist = endY - startY;\n\n // If the end point is very close vertically, use a simple 3-segment path\n if (Math.abs(verticalDist) < 30) {\n const midX = (startX + endX) / 2;\n path = `M ${startX} ${startY} V ${endY} H ${midX} H ${endX}`;\n }\n // Otherwise, create a path with vertical segment first, then horizontal, then vertical\n else {\n path = `M ${startX} ${startY} V ${\n startY + verticalDist / 2\n } H ${endX} V ${endY}`;\n }\n }\n\n return path;\n }\n\n /**\n * Check if a connection is allowed between node types\n */\n canConnect(sourceNodeType: string, targetNodeType: string): boolean {\n return (\n this.connectionRules[sourceNodeType]?.includes(targetNodeType) || false\n );\n }\n\n /**\n * Get allowed node types for the current dragging connection\n */\n getAllowedTargetNodeTypes(): string[] {\n if (!this.draggingConnectionData.sourcePoint) {\n return [];\n }\n\n const sourceNodeInfo = this.nodeService.findNodeById(\n this.draggingConnectionData.sourcePoint.nodeId\n );\n if (!sourceNodeInfo) {\n return [];\n }\n\n const sourceNodeType = sourceNodeInfo.node.type;\n\n return this.connectionRules[sourceNodeType] || [];\n }\n\n /**\n * Delete a connection by ID\n */\n deleteConnection(connectionId: string): boolean {\n const index = this.state.connections.findIndex(\n (conn) => conn.id === connectionId\n );\n if (index === -1) return false;\n\n this.state.connections.splice(index, 1);\n return true;\n }\n\n /**\n * Delete all connections associated with a node\n */\n deleteConnectionsForNode(nodeId: string): void {\n this.state.connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId !== nodeId && conn.targetNodeId !== nodeId\n );\n }\n\n /**\n * Get the current connection drag data\n */\n getConnectionDragData() {\n return this.draggingConnectionData;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { ObjectState } from 'verben-workflow-ui/src/lib/models';\nimport { Status } from 'verben-workflow-ui/src/lib/models';\nimport { TaskAssignmentType } from 'verben-workflow-ui/src/lib/models';\nimport { StageActorRule } from 'verben-workflow-ui/src/lib/models';\nimport { SwimlaneService } from './swimlane.service';\nimport { NodeManagementService } from './node-management.service';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TransformerService {\n // Map to track loaded objects\n private loadedObjectIds: { [key: string]: string } = {}; // Format: { id: code }\n\n constructor(\n private state: WorkflowDesignerState,\n private swimlaneService: SwimlaneService,\n private nodeService: NodeManagementService,\n private connectionService: ConnectionService\n ) {}\n\n /**\n * Transform the UI model to a Workflow API model\n */\n transformToWorkflowModel(): Workflow {\n // Create base workflow object\n const workflow: Workflow = {\n // BaseModel properties\n Id: this.wasLoadedFromApi(this.state.workflowId || '')\n ? this.state.workflowId || ''\n : '',\n Code: this.getCodeForObject(this.state.workflowId || ''),\n TenantId: '',\n id: this.wasLoadedFromApi(this.state.workflowId || '')\n ? this.state.workflowId || ''\n : '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(this.state.workflowId || '')\n ? ObjectState.Changed\n : ObjectState.New,\n\n // Workflow specific properties\n Name: 'New Workflow', // Default name\n Description: '', // Default description\n StageEntryRule: '',\n Form: this.state.workflowFormId || undefined,\n AssignmentType: TaskAssignmentType.AutoRoute,\n Operation: '',\n Status: Status.Active,\n Actions: [],\n Lanes: [],\n Stages: [],\n };\n\n // Transform swimlanes to SwimLane[]\n workflow.Lanes = this.state.swimlanes.map((swimlane, index) => {\n const laneId = `lane-${index}`;\n\n return {\n // BaseModel properties\n Id: '',\n Code: '',\n TenantId: '',\n id: laneId,\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n\n // SwimLane specific properties\n Workflow: workflow.Id,\n Tags: swimlane.tags || [],\n Position: swimlane.order,\n Coordinates: { X: 0, Y: swimlane.order * 263 },\n Size: { Width: 3000, Height: 263 },\n };\n });\n\n // Transform nodes to WorkflowStage[]\n const stages: WorkflowStage[] = [];\n\n this.state.swimlanes.forEach((swimlane, swimlaneIndex) => {\n swimlane.nodes?.forEach((node) => {\n if (node.type === 'stage') {\n // Create a stage from the node\n const stage: WorkflowStage = {\n // BaseModel properties\n Id: node.id,\n Code: this.getCodeForObject(node.id),\n TenantId: '',\n id: node.id,\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(node.id)\n ? ObjectState.Changed\n : ObjectState.New,\n\n // WorkflowStage specific properties\n Workflow: workflow.Id,\n Name: node.stageData?.Name || 'Unnamed Stage',\n Description: node.stageData?.Description || '',\n Duration: node.stageData?.Duration || 0,\n PassOnRule: node.stageData?.PassOnRule || '',\n ActorRule: node.stageData?.ActorRule || StageActorRule.None,\n MinNoOfActor: node.stageData?.MinNoOfActor || 0,\n IsParallel: node.stageData?.IsParallel || false,\n IsEntryPoint: node.isStartNode,\n IsExitPoint: false, // Will be updated below\n Tags: node.stageData?.Tags || [],\n Form: node.stageData?.formId ? node.stageData.formId : '',\n AllowMultiSubProcess: false,\n AssignmentType: TaskAssignmentType.AutoRoute,\n SubWorkFlow: '',\n SwimLane: workflow.Lanes[swimlaneIndex].Id,\n Coordinates: { X: node.x, Y: node.y },\n IsSubProcess: false,\n Key: node.stageData?.Key || undefined,\n };\n\n stages.push(stage);\n }\n });\n });\n\n // Determine which stages are exit points (no outgoing connections)\n stages.forEach((stage) => {\n const hasOutgoingConnections = this.state.connections.some(\n (conn) => conn.sourceNodeId === stage.Id\n );\n if (!hasOutgoingConnections) {\n stage.IsExitPoint = true;\n }\n });\n\n // Transform connections to WorkflowAction[]\n workflow.Actions = this.state.connections.map((conn) => {\n const sourceNode = this.nodeService.findNodeById(conn.sourceNodeId)?.node;\n const targetNode = this.nodeService.findNodeById(conn.targetNodeId)?.node;\n\n return {\n // BaseModel properties\n Id: conn.id,\n Code: this.getCodeForObject(conn.id),\n TenantId: '',\n id: conn.id,\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(conn.id)\n ? ObjectState.Changed\n : ObjectState.New,\n\n // WorkflowAction specific properties\n Workflow: workflow.Id,\n Name: `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${\n targetNode?.stageData?.Name || 'Unknown'\n }`,\n OperationAction: conn.action,\n FromStage: conn.sourceNodeId,\n ToStage: conn.targetNodeId,\n IsParallel: sourceNode?.stageData?.IsParallel || false,\n PassOnRule: '', // Optional property\n };\n });\n\n workflow.Stages = stages;\n\n return workflow;\n }\n\n /**\n * Parse API workflow model and convert to UI model\n */\n parseWorkflowData(workflow: Workflow): void {\n // Clear existing state\n this.state.swimlanes = [];\n this.state.connections = [];\n\n // Set workflow form if exists\n if (workflow.Form) {\n this.state.setWorkflowForm(\n workflow.Form,\n workflow.FormName || 'Workflow Form'\n );\n }\n\n // Store the workflow ID\n this.state.setWorkflowId(workflow.Id);\n\n // Register the workflow itself\n this.registerLoadedObject(workflow.Id, workflow.Code);\n\n // Process swimlanes first\n if (workflow.Lanes && workflow.Lanes.length) {\n workflow.Lanes.sort((a: any, b: any) => a.Position - b.Position).forEach(\n (lane: any) => {\n this.swimlaneService.addSwimlane(\n lane.Name || `Lane ${lane.Position}`,\n lane.Tags || []\n );\n\n // Register loaded lane\n this.registerLoadedObject(lane.Id, lane.Code);\n }\n );\n }\n\n // Process stages\n if (workflow.Stages && workflow.Stages.length) {\n workflow.Stages.forEach((stage: any) => {\n // Find swimlane index\n const swimlaneIndex = this.swimlaneService.findSwimlaneIndexByLaneId(\n stage.SwimLane\n );\n if (swimlaneIndex !== -1) {\n const x = stage.Coordinates?.X || 100;\n const y = stage.Coordinates?.Y || 50;\n\n this.nodeService.addNode(swimlaneIndex, 'stage', x, y, {\n Name: stage.Name,\n Description: stage.Description,\n Duration: stage.Duration,\n PassOnRule: stage.PassOnRule,\n ActorRule: stage.ActorRule,\n MinNoOfActor: stage.MinNoOfActor,\n Tags: stage.Tags || [],\n IsParallel: stage.IsParallel,\n IsEntryPoint: stage.IsEntryPoint,\n IsExitPoint: stage.IsExitPoint,\n Id: stage.Id,\n });\n\n // Register loaded stage\n this.registerLoadedObject(stage.Id, stage.Code);\n }\n });\n }\n\n // Process connections/actions\n if (workflow.Actions && workflow.Actions.length) {\n workflow.Actions.forEach((action: any) => {\n // Find source and target nodes\n const sourceNodeInfo = this.nodeService.findNodeById(action.FromStage);\n const targetNodeInfo = this.nodeService.findNodeById(action.ToStage);\n\n if (sourceNodeInfo && targetNodeInfo) {\n // Find suitable connection points\n const sourcePoint = sourceNodeInfo.node.connectionPoints?.[0];\n const targetPoint = targetNodeInfo.node.connectionPoints?.[0];\n\n if (sourcePoint && targetPoint) {\n const connection = {\n id: action.Id,\n sourceNodeId: action.FromStage,\n targetNodeId: action.ToStage,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPoint.id,\n sourceSwimlaneIndex: sourceNodeInfo.swimlaneIndex,\n targetSwimlaneIndex: targetNodeInfo.swimlaneIndex,\n label: action.Name,\n action: action.OperationAction,\n };\n this.state.connections.push(connection);\n\n // Register loaded action\n this.registerLoadedObject(action.Id, action.Code);\n }\n }\n });\n }\n }\n\n /**\n * Register a loaded object from the API\n */\n registerLoadedObject(id: string, code: string): void {\n this.loadedObjectIds[id] = code;\n }\n\n /**\n * Check if an object was loaded from API\n */\n wasLoadedFromApi(id: string): boolean {\n return id in this.loadedObjectIds;\n }\n\n /**\n * Get the code for a loaded object\n */\n getCodeForObject(id: string): string {\n return this.loadedObjectIds[id] || '';\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n DropDownModule,\n VerbenaButtonModule,\n VerbenaInputModule,\n VerbenaSwitchModule,\n VerbenDialogueModule,\n VerbenPopUpModule,\n} from 'verben-ng-ui';\nimport { EditorModule } from 'verben-reporting-ui';\nimport { LabelEditorComponent } from 'verben-workflow-ui/src/lib/components/designer';\nimport { ActionDialogComponent } from './action-dialog/action-dialog.component';\nimport { ActorTagsDialogComponent } from './actor-tags-dialog/actor-tags-dialog.component';\nimport { ConditionsPopupComponent } from './conditions-popup/conditions-popup.component';\nimport { DecisionPopupComponent } from './decision-popup/decision-popup.component';\nimport { DesignerCanvasComponent } from './designer-canvas/designer-canvas.component';\nimport { DesignerToolbarComponent } from './designer-toolbar/designer-toolbar.component';\nimport { EscalationDialogComponent } from './escalation-dialog/escalation-dialog.component';\nimport { ConnectionService } from './services/connection.service';\nimport { NodeManagementService } from './services/node-management.service';\nimport { PopupService } from './services/popup.service';\nimport { SwimlaneService } from './services/swimlane.service';\nimport { TransformerService } from './services/transformer.service';\nimport { StageDialogComponent } from './stage-dialog/stage-dialog.component';\nimport { StageNodeComponent } from './stage-node/stage-node.component';\nimport { SwimlaneDialogComponent } from './swimlane-dialog/swimlane-dialog.component';\nimport { WorkflowDesignerComponent } from './workflow-designer.component';\n\n@NgModule({\n declarations: [\n WorkflowDesignerComponent,\n DesignerToolbarComponent,\n DesignerCanvasComponent,\n SwimlaneDialogComponent,\n StageNodeComponent,\n StageDialogComponent,\n ConditionsPopupComponent,\n DecisionPopupComponent,\n EscalationDialogComponent,\n ActionDialogComponent,\n ActorTagsDialogComponent,\n ],\n imports: [\n CommonModule,\n VerbenDialogueModule,\n FormsModule,\n ReactiveFormsModule,\n VerbenPopUpModule,\n VerbenaButtonModule,\n DropDownModule,\n LabelEditorComponent,\n EditorModule,\n VerbenaInputModule,\n VerbenaSwitchModule,\n ],\n providers: [\n NodeManagementService,\n ConnectionService,\n SwimlaneService,\n TransformerService,\n PopupService,\n ],\n exports: [WorkflowDesignerComponent],\n})\nexport class WorkflowDesignerModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.WorkflowDesignerState","i1.NodeManagementService","i2.SwimlaneService","i2.WorkflowDataService","i1.WorkflowDataService","i1","i3.NodeManagementService","i4.PopupService","i5","i6","i2","i3","i6.StageNodeComponent","i7.StageDialogComponent","i8.ConditionsPopupComponent","i9.EscalationDialogComponent","i10.ActionDialogComponent","i3.SwimlaneService","i4","i5.DesignerToolbarComponent","i6.DesignerCanvasComponent","i7.SwimlaneDialogComponent","i8.StageDialogComponent","i9.ActorTagsDialogComponent","i2.NodeManagementService","i4.ConnectionService"],"mappings":"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"}
1
+ {"version":3,"file":"verben-workflow-ui-src-lib-components-workflow-designer.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.state.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-data.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/node-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/swimlane.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-toolbar/designer-toolbar.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-node/stage-node.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-node/stage-node.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/popup.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-dialog/stage-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/stage-dialog/stage-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/conditions-popup/conditions-popup.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/conditions-popup/conditions-popup.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/escalation-dialog/escalation-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/escalation-dialog/escalation-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/action-dialog/action-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/action-dialog/action-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-canvas/designer-canvas.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/designer-canvas/designer-canvas.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/swimlane-dialog/swimlane-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/actor-tags-dialog/actor-tags-dialog.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/actor-tags-dialog/actor-tags-dialog.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/decision-popup/decision-popup.component.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/decision-popup/decision-popup.component.html","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/connection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/services/transformer.service.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/workflow-designer.module.ts","../../../projects/verben-workflow-ui/src/lib/components/workflow-designer/verben-workflow-ui-src-lib-components-workflow-designer.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ObjectState, StageActorRule, Status, SwimLane, Tag, TaskAssignmentType, Workflow, WorkflowAction, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport {\n Connection,\n ConnectionPoint,\n Node,\n SwimlaneItem,\n ToolType,\n} from './workflow-designer.types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowDesignerState {\n swimlanes: SwimlaneItem[] = [];\n startNodeId: string | null = null; // Track the ID of the first/start node\n connections: Connection[] = [];\n draggingConnectionData: {\n sourcePoint?: ConnectionPoint;\n sourceSwimlaneIndex?: number;\n startX?: number;\n startY?: number;\n currentX?: number;\n currentY?: number;\n } = {};\n workflowFormId: string | null = null;\n workflowFormName: string | null = null;\n workflowId: string | null = null;\n\n workflow: Workflow | null = null;\n swimlaneRecord: Record<string, SwimLane> = {};\n stageRecord: Record<string, WorkflowStage> = {};\n actionRecord: Record<string, WorkflowAction> = {};\n\n setWorkflowId(id: string): void {\n this.workflowId = id;\n }\n\n public laneIdToIndexMap: Map<string, number> = new Map();\n\n private readonly connectionRules: Record<string, string[]> = {\n stage: ['stage', 'decision', 'subflow'],\n decision: ['stage'], // Decisions can only connect to Stages\n // 'action': ['stage', 'form', 'decision'],\n form: [],\n subflow: ['stage', 'decision'],\n };\n\n setWorkflowForm(formId: string | null, formName: string | null): void {\n this.workflowFormId = formId;\n this.workflowFormName = formName;\n console.log(this.workflowFormId, this.workflowFormName);\n }\n\n addSwimlane(name: string, tags: Tag[]) {\n // Generate a unique key for this swimlane\n const swimlaneKey = `lane-${Date.now()}-${Math.floor(\n Math.random() * 1000\n )}`;\n\n this.swimlanes = this.swimlanes.concat([\n {\n order: this.swimlanes.length,\n label: name,\n tags,\n nodes: [],\n id: swimlaneKey, // Store the generated key as id for frontend reference\n },\n ]);\n }\n\n registerLaneMapping(laneId: string, swimlaneIndex: number): void {\n this.laneIdToIndexMap.set(laneId, swimlaneIndex);\n }\n\n // Add this method to generate connection points for a node\n generateConnectionPoints(node: Node): ConnectionPoint[] {\n const points: ConnectionPoint[] = [];\n const spacing = 50; // Space between connection points\n\n if (node.type === 'stage') {\n // Rectangular shapes - add points around the rectangle\n\n // Top edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-top-${x}`,\n nodeId: node.id,\n x: x,\n y: 0,\n type: 'top',\n });\n }\n\n // Right edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-right-${y}`,\n nodeId: node.id,\n x: node.width,\n y: y,\n type: 'right',\n });\n }\n\n // Bottom edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-bottom-${x}`,\n nodeId: node.id,\n x: x,\n y: node.height,\n type: 'bottom',\n });\n }\n\n // Left edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'decision') {\n // Diamond shape - add points at the four corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-0`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 2,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-0`,\n nodeId: node.id,\n x: 0,\n y: node.height / 2,\n type: 'left',\n });\n } else if (node.type === 'form') {\n // Form only has input connection points, no output points\n\n // Left edge points (for input connections)\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'subflow') {\n // Hexagon shape - add points at the six corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-top`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-right-bottom`,\n nodeId: node.id,\n x: node.width,\n y: (node.height * 3) / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-bottom`,\n nodeId: node.id,\n x: 0,\n y: (node.height * 3) / 4,\n type: 'left',\n });\n\n points.push({\n id: `${node.id}-left-top`,\n nodeId: node.id,\n x: 0,\n y: node.height / 4,\n type: 'left',\n });\n }\n\n return points;\n }\n\n addNode(\n swimlaneIndex: number,\n type: ToolType,\n x: number,\n y: number,\n stageData?: Partial<WorkflowStage>,\n workflowData?: { id: string; name: string },\n useExistingId: boolean = false\n ) {\n if (\n !this.swimlanes[swimlaneIndex] ||\n !type ||\n (type !== 'stage' &&\n type !== 'decision' &&\n type !== 'form' &&\n type !== 'subflow')\n ) {\n return null;\n }\n\n // Adjust position relative to swimlane\n const adjustedY = y - swimlaneIndex * 263; // Subtracting header height\n\n // Generate a unique ID or use existing\n const id =\n useExistingId && stageData?.Code\n ? stageData.Code\n : `${type}-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n\n // Create node with dimensions based on type\n const node: Node = {\n id,\n type,\n x,\n y: adjustedY,\n width: type === 'subflow' ? 150 : 169, // Width from SVG\n height: 100, // Height from SVG\n isStartNode: false, // Default to false\n stageData: stageData || {}, // Store stage data\n workflowData: workflowData || null,\n };\n\n // If this is the first node in the entire workflow, mark it as the start node\n if (this.getNodeCount() === 0) {\n node.isStartNode = true;\n this.startNodeId = id;\n }\n\n // Generate connection points for the node\n node.connectionPoints = this.generateConnectionPoints(node);\n\n // Add node to the swimlane\n if (!this.swimlanes[swimlaneIndex].nodes) {\n this.swimlanes[swimlaneIndex].nodes = [];\n }\n this.swimlanes[swimlaneIndex].nodes.push(node);\n\n return node;\n }\n\n // Helper to get total node count across all swimlanes\n getNodeCount(): number {\n return this.swimlanes.reduce(\n (count, swimlane) => count + (swimlane.nodes?.length || 0),\n 0\n );\n }\n\n // Find a node by ID (useful for later operations)\n findNodeById(id: string): { node: Node; swimlaneIndex: number } | null {\n for (let i = 0; i < this.swimlanes.length; i++) {\n const swimlane = this.swimlanes[i];\n const node = swimlane.nodes?.find((n) => n.id === id);\n if (node) {\n return { node, swimlaneIndex: i };\n }\n }\n return null;\n }\n\n // Find a node by ID (useful for later operations)\n findActionById(connectionId: string): Connection | null {\n return this.connections.find(({ id }) => id === connectionId) ?? null;\n }\n\n startConnectionDrag(\n point: ConnectionPoint,\n swimlaneIndex: number,\n globalX: number,\n globalY: number\n ) {\n this.draggingConnectionData = {\n sourcePoint: point,\n sourceSwimlaneIndex: swimlaneIndex,\n startX: globalX,\n startY: globalY,\n currentX: globalX,\n currentY: globalY,\n };\n }\n\n updateConnectionDrag(currentX: number, currentY: number) {\n if (this.draggingConnectionData.sourcePoint) {\n this.draggingConnectionData.currentX = currentX;\n this.draggingConnectionData.currentY = currentY;\n }\n }\n\n endConnectionDrag() {\n console.log('Ending connection drag, clearing data');\n // Clear dragging data\n this.draggingConnectionData = {};\n }\n\n isConnectionDragging(): boolean {\n return !!this.draggingConnectionData.sourcePoint;\n }\n\n getConnectionPathData(): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n } | null {\n if (!this.draggingConnectionData.sourcePoint) return null;\n\n const { sourcePoint, sourceSwimlaneIndex, currentX, currentY } =\n this.draggingConnectionData;\n const node = this.findNodeById(sourcePoint.nodeId)?.node;\n\n if (!node || sourceSwimlaneIndex === undefined) return null;\n\n // Calculate start point in global coordinates\n const startX = node.x + sourcePoint.x;\n const startY = node.y + sourcePoint.y + sourceSwimlaneIndex * 263; // Add swimlane offset\n\n return {\n startX,\n startY,\n endX: currentX ?? startX,\n endY: currentY ?? startY,\n sourceSwimlaneIndex,\n };\n }\n\n createConnection(\n targetNodeId: string,\n targetPointId: string,\n targetSwimlaneIndex: number\n ): Connection | null {\n const { sourcePoint, sourceSwimlaneIndex } = this.draggingConnectionData;\n\n if (!sourcePoint || sourceSwimlaneIndex === undefined) {\n console.error('Missing source data for connection');\n return null;\n }\n\n const connection: Connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: targetNodeId,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPointId,\n sourceSwimlaneIndex: sourceSwimlaneIndex,\n targetSwimlaneIndex: targetSwimlaneIndex,\n label: '',\n action: null,\n };\n\n this.connections.push(connection);\n console.log('Created connection:', connection);\n console.log(\n 'Connections array now has',\n this.connections.length,\n 'connections'\n );\n return connection;\n }\n\n // Add a method to get connection data for rendering\n getConnectionData(connection: Connection): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n targetSwimlaneIndex: number;\n } | null {\n const sourceNodeInfo = this.findNodeById(connection.sourceNodeId);\n const targetNodeInfo = this.findNodeById(connection.targetNodeId);\n\n if (!sourceNodeInfo || !targetNodeInfo) {\n return null;\n }\n\n const sourceNode = sourceNodeInfo.node;\n const targetNode = targetNodeInfo.node;\n\n // Find connection points\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.id === connection.targetPointId\n );\n\n if (!sourcePoint || !targetPoint) {\n return null;\n }\n\n // Calculate global coordinates\n const startX = sourceNode.x + sourcePoint.x;\n const startY =\n sourceNode.y + sourcePoint.y + connection.sourceSwimlaneIndex * 263;\n\n const endX = targetNode.x + targetPoint.x;\n const endY =\n targetNode.y + targetPoint.y + connection.targetSwimlaneIndex * 263;\n\n return {\n startX,\n startY,\n endX,\n endY,\n sourceSwimlaneIndex: connection.sourceSwimlaneIndex,\n targetSwimlaneIndex: connection.targetSwimlaneIndex,\n };\n }\n\n // Add a method to check if a connection is allowed based on node types\n canConnect(sourceNodeType: string, targetNodeType: string): boolean {\n return (\n this.connectionRules[sourceNodeType]?.includes(targetNodeType) || false\n );\n }\n\n // Add a method to get allowed node types for the current dragging connection\n getAllowedTargetNodeTypes(): string[] {\n if (!this.draggingConnectionData.sourcePoint) {\n return [];\n }\n\n const sourceNodeInfo = this.findNodeById(\n this.draggingConnectionData.sourcePoint.nodeId\n );\n if (!sourceNodeInfo) {\n return [];\n }\n\n const sourceNodeType = sourceNodeInfo.node.type;\n\n return this.connectionRules[sourceNodeType] || [];\n }\n\n updateSwimlane(index: number, name: string, tags: Tag[]) {\n console.log(\n 'State: Updating swimlane at index',\n index,\n 'with name',\n name,\n 'and tags',\n tags\n );\n\n if (index >= 0 && index < this.swimlanes.length) {\n this.swimlanes[index] = {\n ...this.swimlanes[index],\n label: name,\n tags: tags,\n };\n console.log('Swimlane updated:', this.swimlanes[index]);\n } else {\n console.error('Invalid swimlane index:', index);\n }\n }\n\n transformToWorkflowModel(): Workflow {\n // Use stored workflow if available, otherwise create a new one\n const workflow: Workflow = this.workflow\n ? { ...this.workflow, DataState: ObjectState.Changed }\n : {\n // BaseModel properties\n Id: '',\n Code: '',\n TenantId: '',\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(this.workflowId || '')\n ? ObjectState.Changed\n : ObjectState.New,\n\n // Workflow specific properties\n Name: 'New Workflow',\n Description: '',\n StageEntryRule: '',\n Form: this.workflowFormId || undefined,\n AssignmentType: TaskAssignmentType.AutoRoute,\n Operation: '',\n Status: Status.Active,\n Actions: [],\n Lanes: [],\n Stages: [],\n };\n\n // Update workflow form if changed\n if (this.workflowFormId !== this.workflow?.Form) {\n workflow.Form = this.workflowFormId || workflow.Form;\n }\n\n // Transform swimlanes to SwimLane[]\n workflow.Lanes = this.swimlanes.map((swimlane) => {\n // Check if this is an existing swimlane\n if (swimlane.id && this.swimlaneRecord[swimlane.id]) {\n // Update existing lane with changed values\n const existingLane = this.swimlaneRecord[swimlane.id];\n return {\n ...existingLane,\n Name: swimlane.label,\n Tags: swimlane.tags,\n Position: swimlane.order,\n Coordinates: { X: 0, Y: swimlane.order * 263 },\n DataState: ObjectState.Changed,\n UpdatedAt: new Date(),\n };\n } else {\n // Generate a new ID for new swimlanes if not already set\n const laneId =\n swimlane.id ||\n `lane-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n\n // Create new lane\n return {\n Code: '',\n Id: '',\n TenantId: '',\n // id: laneId,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n Workflow: workflow.Code,\n Name: swimlane.label,\n Tags: swimlane.tags || [],\n Position: swimlane.order,\n Coordinates: { X: 0, Y: swimlane.order * 263 },\n Size: { Width: 3000, Height: 263 },\n Key: swimlane.id,\n };\n }\n });\n\n // Transform nodes to WorkflowStage[]\n const stages: WorkflowStage[] = [];\n\n this.swimlanes.forEach((swimlane, swimlaneIndex) => {\n swimlane.nodes?.forEach((node) => {\n if (node.type === 'stage' || node.type === 'subflow') {\n console.log(node);\n // Check if this is an existing stage\n if (this.stageRecord[node.id]) {\n // Update existing stage with changed values\n const existingStage = this.stageRecord[node.id];\n\n // Create a new object with updated properties\n const updatedStage: WorkflowStage = {\n ...existingStage,\n DataState: ObjectState.Changed,\n UpdatedAt: new Date(),\n };\n\n // Update properties that may have changed\n if (node.stageData?.Name !== undefined)\n updatedStage.Name =\n node.workflowData?.name ?? node.stageData.Name;\n if (node.stageData?.Description !== undefined)\n updatedStage.Description = node.stageData.Description;\n if (node.stageData?.Duration !== undefined)\n updatedStage.Duration = node.stageData.Duration;\n if (node.stageData?.PassOnRule !== undefined)\n updatedStage.PassOnRule = node.stageData.PassOnRule;\n if (node.stageData?.ActorRule !== undefined)\n updatedStage.ActorRule = node.stageData.ActorRule;\n if (node.stageData?.AssignmentType !== undefined)\n updatedStage.AssignmentType = node.stageData.AssignmentType;\n if (node.stageData?.MinNoOfActor !== undefined)\n updatedStage.MinNoOfActor = node.stageData.MinNoOfActor;\n if (node.stageData?.IsParallel !== undefined)\n updatedStage.IsParallel = node.stageData.IsParallel;\n if (node.stageData?.Tags) updatedStage.Tags = node.stageData.Tags;\n\n // Always update these properties\n updatedStage.IsEntryPoint = node.isStartNode;\n updatedStage.IsExitPoint = node.stageData?.IsExitPoint || false;\n updatedStage.Form = node.stageData?.formId || '';\n updatedStage.Coordinates = { X: node.x, Y: node.y };\n updatedStage.SwimLane = this.swimlanes[swimlaneIndex].id || '';\n\n // console.log(\"NODE_TYPE\", node.type);\n\n // Handle subflow stage\n if (node.type === 'subflow') {\n updatedStage.IsSubProcess = true;\n updatedStage.SubWorkFlow = node.workflowData?.id || '';\n updatedStage.Name = node.workflowData?.name || '';\n }\n\n // Add to stages\n stages.push(updatedStage);\n } else {\n // Create a new stage\n stages.push({\n Id: '',\n Code: '',\n TenantId: '',\n // id: node.id,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n Workflow: workflow.Code,\n Name:\n (node.type === 'subflow'\n ? node.workflowData?.name\n : node.stageData?.Name) ?? '',\n Description: node.stageData?.Description || '',\n Duration: node.stageData?.Duration || 0,\n PassOnRule: node.stageData?.PassOnRule || '',\n ActorRule: node.stageData?.ActorRule || StageActorRule.None,\n MinNoOfActor: node.stageData?.MinNoOfActor || 0,\n IsParallel: node.stageData?.IsParallel || false,\n IsEntryPoint: node.isStartNode,\n IsExitPoint: node.stageData?.IsExitPoint || false, // Will be updated below\n Tags: node.stageData?.Tags || [],\n Form: node.stageData?.formId ?? '',\n AllowMultiSubProcess: false,\n AssignmentType:\n node.stageData?.AssignmentType ||\n this.workflow?.AssignmentType ||\n TaskAssignmentType.AutoRoute,\n SubWorkFlow: node.workflowData?.id || '',\n SwimLane: this.swimlanes[swimlaneIndex].id || '',\n Coordinates: { X: node.x, Y: node.y },\n IsSubProcess: node.type === 'subflow',\n Key: node.stageData?.Key || node.id,\n });\n }\n }\n });\n });\n\n // // Determine which stages are exit points (no outgoing connections)\n // stages.forEach((stage) => {\n // const hasOutgoingConnections = this.connections.some(\n // (conn) =>\n // conn.sourceNodeId === stage.Code || conn.sourceNodeId === stage.id\n // );\n // if (!hasOutgoingConnections) {\n // stage.IsExitPoint = true;\n // }\n // });\n\n // Transform connections to WorkflowAction[]\n const actions: WorkflowAction[] = [];\n\n this.connections.forEach((conn) => {\n const sourceNode = this.findNodeById(conn.sourceNodeId)?.node;\n const targetNode = this.findNodeById(conn.targetNodeId)?.node;\n\n // Check if this is an existing action\n if (this.actionRecord[conn.id]) {\n // Update existing action with changed values\n const existingAction = this.actionRecord[conn.id];\n\n // Create updated action with changed properties\n const updatedAction: WorkflowAction = {\n ...existingAction,\n DataState: ObjectState.Changed,\n UpdatedAt: new Date(),\n };\n\n // Update properties that may have changed\n updatedAction.Name =\n conn.label ??\n `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'\n }`;\n updatedAction.OperationAction = conn.action;\n updatedAction.IsParallel = targetNode?.stageData?.IsParallel || false;\n updatedAction.PassOnRule = conn.condition || '';\n updatedAction.TargetStatus = conn.targetStatus || undefined;\n // updatedAction.SourcePointType = this.getConnectionPointType(conn.sourcePointId);\n // updatedAction.TargetPointType = this.getConnectionPointType(conn.targetPointId);\n\n actions.push(updatedAction);\n } else {\n // Create a new action\n actions.push({\n Id: '',\n Code: '',\n TenantId: '',\n // id: conn.id,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n Workflow: workflow.Code,\n Name:\n conn.label ??\n `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${targetNode?.stageData?.Name || 'Unknown'\n }`,\n OperationAction: conn.action,\n TargetStatus: conn.targetStatus,\n FromStage: conn.sourceNodeId,\n ToStage: conn.targetNodeId,\n IsParallel: sourceNode?.stageData?.IsParallel || false,\n PassOnRule: conn.condition || '',\n SourcePointType: this.getConnectionPointType(conn.sourcePointId),\n TargetPointType: this.getConnectionPointType(conn.targetPointId),\n });\n }\n });\n\n // Add deleted objects with Removed state\n Object.keys(this.stageRecord).forEach((stageId) => {\n const exists = stages.some(\n (stage) => stage.Code === stageId || stage.id === stageId\n );\n\n if (!exists) {\n const stage = this.stageRecord[stageId];\n stages.push({\n ...stage,\n DataState: ObjectState.Removed,\n UpdatedAt: new Date(),\n });\n }\n });\n\n Object.keys(this.actionRecord).forEach((actionId) => {\n const exists = actions.some(\n (action) => action.Code === actionId || action.id === actionId\n );\n\n if (!exists) {\n const action = this.actionRecord[actionId];\n actions.push({\n ...action,\n DataState: ObjectState.Removed,\n UpdatedAt: new Date(),\n });\n }\n });\n\n // Handle deleted swimlanes\n Object.keys(this.swimlaneRecord).forEach((laneId) => {\n const exists = workflow.Lanes.some(\n (lane) => lane.Code === laneId || lane.id === laneId\n );\n\n if (!exists) {\n const lane = this.swimlaneRecord[laneId];\n workflow.Lanes.push({\n ...lane,\n DataState: ObjectState.Removed,\n UpdatedAt: new Date(),\n });\n }\n });\n\n workflow.Stages = stages;\n workflow.Actions = actions;\n\n return workflow;\n }\n\n getConnectionPointType(\n pointId: string\n ): 'top' | 'right' | 'bottom' | 'left' | undefined {\n // Extract the type from the connection point ID format\n // which is usually something like \"node-id-top-50\"\n const parts = pointId.split('-');\n const typeIndex = parts.findIndex(\n (part) =>\n part === 'top' ||\n part === 'right' ||\n part === 'bottom' ||\n part === 'left'\n );\n\n if (typeIndex >= 0) {\n return parts[typeIndex] as 'top' | 'right' | 'bottom' | 'left';\n }\n\n return undefined;\n }\n\n // Add a new property to track loaded objects\n loadedObjectIds: { [key: string]: string } = {}; // Format: { id: code }\n\n // Add a method to register loaded objects\n registerLoadedObject(id: string, code: string): void {\n this.loadedObjectIds[id] = code;\n }\n\n // Method to check if an object was loaded from API\n wasLoadedFromApi(id: string): boolean {\n return id in this.loadedObjectIds;\n }\n\n // Method to get the code for a loaded object\n getCodeForObject(id: string): string {\n return this.loadedObjectIds[id] || '';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActorTag, Escalation, FlowableStatus, Form, ObjectState, OperationAction, Paged, ReportSchedule, StageActorRule, Status, Tag, TaskAssignmentType, Workflow, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService, HttpWebRequestService } from 'verben-workflow-ui/src/lib/services';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowDataService {\n private readonly WORKFLOW_MODEL_BASE_PATH = 'Workflow';\n private readonly AUTH_MODEL_BASE_PATH = 'User';\n private readonly FORM_MODEL_BASE_PATH = 'Form';\n private readonly ESCALATION_MODEL_BASE_PATH = 'Escalation';\n private readonly RS_MODEL_BASE_PATH = 'Report';\n private readonly UTIL_BASE_PATH = 'Util';\n private readonly ACTOR_MODEL_BASE_PATH = 'Actor';\n private readonly FLOWABLE_STATUS_MODEL_BASE_PATH = 'Status';\n\n constructor(\n private httpService: HttpWebRequestService,\n private envSvc: EnvironmentService\n ) { }\n\n getWorkflowWithParam(\n param: string,\n skip: number = 0,\n limit: number = 1,\n sortParam: string = 'CreatedAt',\n sortOrder: string = 'Asc'\n ): Promise<Paged<Workflow>> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/GetWorkflowsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;\n return this.httpService.get(url) as Promise<Paged<Workflow>>;\n }\n\n getWorkflows(skip: number = 0, limit: number = 0): Promise<Paged<Workflow>> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/GetWorkflows/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.WorkFlowAPI\n ) as Promise<Paged<Workflow>>;\n }\n\n getForms(skip: number = 0, limit: number = 0): Promise<Paged<Form>> {\n const url = `${this.FORM_MODEL_BASE_PATH}/GetForms/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.WorkFlowAPI\n ) as Promise<Paged<Form>>;\n }\n\n getTags(skip: number = 0, limit: number = 0): Promise<Paged<Tag>> {\n const url = `${this.AUTH_MODEL_BASE_PATH}/GetTags/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.AuthAPI\n ) as Promise<Paged<Tag>>;\n }\n\n saveWorkflows(requests: Partial<Workflow>[]): Promise<any> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/SaveWorkflows`;\n // console.log('Saving workflows', requests);\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n deleteWorkflowStages(requests: WorkflowStage['Code'][]): Promise<any> {\n const url = `${this.WORKFLOW_MODEL_BASE_PATH}/DeleteWorkflowStage`;\n // console.log('Saving workflows', requests);\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n saveEscalations(requests: Partial<Escalation>[]): Promise<any> {\n const url = `${this.ESCALATION_MODEL_BASE_PATH}/SaveEscalations`;\n // console.log('Saving workflows', requests);\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n searchEscalationWithParam(\n params: Pick<Escalation, 'Workflow' | 'Stage' | 'Type'>,\n skip: number = 0,\n limit: number = 1,\n sortOrder: string = 'Asc'\n ): Promise<Paged<Escalation>> {\n const url = `${this.ESCALATION_MODEL_BASE_PATH}/SearchEscalations/${skip}/${limit}`;\n const payload = Object.entries(params).map(([key, value]) => ({\n IsAutoFromDate: true,\n IsAutoEndDate: true,\n PropertyName: key,\n EntityValue: value,\n Type: 'String',\n Operator: 'And',\n Sign: 'EQ',\n Sort: sortOrder,\n // Fields: ['string'],\n }));\n return this.httpService.post(url, payload) as Promise<Paged<Escalation>>;\n }\n\n getEscalationWithParam(\n param: string,\n skip: number = 0,\n limit: number = 1,\n sortParam: string = 'CreatedAt',\n sortOrder: string = 'Asc'\n ): Promise<Paged<Escalation>> {\n const url = `${this.ESCALATION_MODEL_BASE_PATH}/GetEscalationsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;\n return this.httpService.get(url) as Promise<Paged<Escalation>>;\n }\n\n getReportSchedules(\n skip: number = 0,\n limit: number = 0\n ): Promise<Paged<ReportSchedule>> {\n const url = `${this.RS_MODEL_BASE_PATH}/GetReportSchedules/${skip}/${limit}`;\n return this.httpService.get(\n url,\n this.envSvc.environment.ReportingAPI\n ) as Promise<Paged<ReportSchedule>>;\n }\n\n getOperationActions(\n skip: number = 0,\n limit: number = 0\n ): Promise<Paged<OperationAction>> {\n const url = `${this.UTIL_BASE_PATH}/GetOperationAction`;\n return this.httpService.get(\n url,\n // this.envSvc.environment.GLAPI\n ) as Promise<Paged<OperationAction>>;\n }\n\n saveActorTags(requests: ActorTag[]): Promise<any> {\n const url = `${this.ACTOR_MODEL_BASE_PATH}/SaveActorTags`;\n return this.httpService.post(\n url,\n requests,\n this.envSvc.environment.WorkFlowAPI\n );\n }\n\n getFlowableStatuses(\n skip: number = 0,\n limit: number = 0\n ): Promise<Paged<FlowableStatus>> {\n const url = `${this.FLOWABLE_STATUS_MODEL_BASE_PATH}/GetFlowableStatus/${skip}/${limit}/CreatedAt/Desc`;\n return this.httpService.get(url) as Promise<Paged<FlowableStatus>>;\n }\n\n // Helper to create a mock workflow (just for demo)\n private createMockWorkflow(code: string): Workflow {\n // Return a simple workflow with one lane and one stage\n const workflow: Workflow = {\n Id: 'workflow-123',\n Code: code,\n TenantId: 'tenant-1',\n id: 'workflow-123',\n ServiceName: 'workflow-service',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.Unchanged,\n Name: 'Sample Workflow',\n Description: 'A sample workflow loaded from API',\n StageEntryRule: '',\n AssignmentType: TaskAssignmentType.AutoRoute,\n Status: Status.Active,\n Actions: [],\n Lanes: [\n {\n Id: 'lane-0',\n Code: 'lane-0',\n TenantId: 'tenant-1',\n id: 'lane-0',\n ServiceName: 'workflow-service',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.Unchanged,\n Workflow: 'workflow-123',\n Tags: [],\n Position: 0,\n Coordinates: { X: 0, Y: 0 },\n Size: { Width: 3000, Height: 263 },\n },\n ],\n Stages: [\n {\n Id: 'stage-123',\n Code: 'stage-123',\n TenantId: 'tenant-1',\n id: 'stage-123',\n ServiceName: 'workflow-service',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.Unchanged,\n Workflow: 'workflow-123',\n Name: 'Initial Stage',\n Description: 'Starting point',\n Duration: 24,\n PassOnRule: '',\n ActorRule: StageActorRule.None,\n MinNoOfActor: 1,\n IsParallel: false,\n IsEntryPoint: true,\n IsExitPoint: false,\n Tags: [],\n Form: '',\n AllowMultiSubProcess: false,\n AssignmentType: TaskAssignmentType.AutoRoute,\n SubWorkFlow: '',\n SwimLane: 'lane-0',\n Coordinates: { X: 100, Y: 50 },\n IsSubProcess: false,\n },\n ],\n };\n\n return workflow;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Node, ToolType, ConnectionPoint } from '../workflow-designer.types';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeManagementService {\n constructor(private state: WorkflowDesignerState) {}\n\n /**\n * Adds a new node to the specified swimlane\n */\n addNode(\n swimlaneIndex: number,\n type: ToolType,\n x: number,\n y: number,\n stageData?: Partial<WorkflowStage>,\n workflowData?: { id: string; name: string }\n ): Node | null {\n if (\n !this.state.swimlanes[swimlaneIndex] ||\n !type ||\n (type !== 'stage' &&\n type !== 'decision' &&\n type !== 'form' &&\n type !== 'subflow')\n ) {\n return null;\n }\n\n // Adjust position relative to swimlane\n const adjustedY = y - swimlaneIndex * 263 - 40; // Subtracting header height\n\n // Generate a unique ID\n const id = `${type}-${Date.now()}-${Math.floor(Math.random() * 1000)}`;\n\n // Create node with dimensions based on type\n const node: Node = {\n id,\n type,\n x,\n y: adjustedY,\n width: type === 'subflow' ? 150 : 169, // Width from SVG\n height: 100, // Height from SVG\n isStartNode: false, // Default to false\n stageData: stageData || {}, // Store stage data\n workflowData: workflowData || null,\n };\n\n // If this is the first node in the entire workflow, mark it as the start node\n if (this.getNodeCount() === 0) {\n node.isStartNode = true;\n this.state.startNodeId = id;\n }\n\n // Generate connection points for the node\n node.connectionPoints = this.generateConnectionPoints(node);\n\n // Add node to the swimlane\n if (!this.state.swimlanes[swimlaneIndex].nodes) {\n this.state.swimlanes[swimlaneIndex].nodes = [];\n }\n this.state.swimlanes[swimlaneIndex].nodes.push(node);\n\n return node;\n }\n\n /**\n * Gets the total count of nodes across all swimlanes\n */\n getNodeCount(): number {\n return this.state.swimlanes.reduce(\n (count, swimlane) => count + (swimlane.nodes?.length || 0),\n 0\n );\n }\n\n /**\n * Find a node by ID\n */\n findNodeById(id: string): { node: Node; swimlaneIndex: number } | null {\n for (let i = 0; i < this.state.swimlanes.length; i++) {\n const swimlane = this.state.swimlanes[i];\n const node = swimlane.nodes?.find((n) => n.id === id);\n if (node) {\n return { node, swimlaneIndex: i };\n }\n }\n return null;\n }\n\n /**\n * Generate connection points for a node\n */\n generateConnectionPoints(node: Node): ConnectionPoint[] {\n const points: ConnectionPoint[] = [];\n const spacing = 50; // Space between connection points\n\n if (node.type === 'stage') {\n // Rectangular shapes - add points around the rectangle\n\n // Top edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-top-${x}`,\n nodeId: node.id,\n x: x,\n y: 0,\n type: 'top',\n });\n }\n\n // Right edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-right-${y}`,\n nodeId: node.id,\n x: node.width,\n y: y,\n type: 'right',\n });\n }\n\n // Bottom edge points\n for (let x = spacing; x < node.width; x += spacing) {\n points.push({\n id: `${node.id}-bottom-${x}`,\n nodeId: node.id,\n x: x,\n y: node.height,\n type: 'bottom',\n });\n }\n\n // Left edge points\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'decision') {\n // Diamond shape - add points at the four corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-0`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 2,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-0`,\n nodeId: node.id,\n x: 0,\n y: node.height / 2,\n type: 'left',\n });\n } else if (node.type === 'form') {\n // Form only has input connection points, no output points\n\n // Left edge points (for input connections)\n for (let y = spacing; y < node.height; y += spacing) {\n points.push({\n id: `${node.id}-left-${y}`,\n nodeId: node.id,\n x: 0,\n y: y,\n type: 'left',\n });\n }\n } else if (node.type === 'subflow') {\n // Hexagon shape - add points at the six corners\n points.push({\n id: `${node.id}-top-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: 0,\n type: 'top',\n });\n\n points.push({\n id: `${node.id}-right-top`,\n nodeId: node.id,\n x: node.width,\n y: node.height / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-right-bottom`,\n nodeId: node.id,\n x: node.width,\n y: (node.height * 3) / 4,\n type: 'right',\n });\n\n points.push({\n id: `${node.id}-bottom-0`,\n nodeId: node.id,\n x: node.width / 2,\n y: node.height,\n type: 'bottom',\n });\n\n points.push({\n id: `${node.id}-left-bottom`,\n nodeId: node.id,\n x: 0,\n y: (node.height * 3) / 4,\n type: 'left',\n });\n\n points.push({\n id: `${node.id}-left-top`,\n nodeId: node.id,\n x: 0,\n y: node.height / 4,\n type: 'left',\n });\n }\n\n return points;\n }\n\n /**\n * Update node properties\n */\n updateNodeProperties(nodeId: string, properties: Partial<Node>): boolean {\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n const { node, swimlaneIndex } = nodeInfo;\n\n // Update the node with new properties\n Object.assign(node, properties);\n\n return true;\n }\n\n /**\n * Update stage data for a node\n */\n updateStageData(nodeId: string, stageData: Partial<WorkflowStage>): boolean {\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n const { node } = nodeInfo;\n\n // Update the stage data\n node.stageData = {\n ...node.stageData,\n ...stageData,\n };\n\n return true;\n }\n\n /**\n * Set a node as a start node\n */\n setAsStartNode(nodeId: string): boolean {\n // First, clear any existing start nodes\n this.state.swimlanes.forEach((swimlane) => {\n swimlane.nodes?.forEach((node) => {\n if (node.isStartNode) {\n node.isStartNode = false;\n }\n });\n });\n\n // Then set the new start node\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n nodeInfo.node.isStartNode = true;\n this.state.startNodeId = nodeId;\n\n return true;\n }\n\n /**\n * Delete a node\n */\n deleteNode(nodeId: string): boolean {\n const nodeInfo = this.findNodeById(nodeId);\n if (!nodeInfo) return false;\n\n const { swimlaneIndex } = nodeInfo;\n\n // Find the node index in the swimlane\n const nodeIndex = this.state.swimlanes[swimlaneIndex].nodes?.findIndex(\n (n) => n.id === nodeId\n );\n\n if (nodeIndex === undefined || nodeIndex === -1) return false;\n\n // Remove the node\n this.state.swimlanes[swimlaneIndex].nodes?.splice(nodeIndex, 1);\n\n // If this was the start node, clear the start node ID\n if (this.state.startNodeId === nodeId) {\n this.state.startNodeId = null;\n }\n\n // Remove any connections associated with this node\n this.state.connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId !== nodeId && conn.targetNodeId !== nodeId\n );\n\n // Remove connection points associated with this node\n this.state.swimlanes[swimlaneIndex].nodes?.forEach((node) => {\n if (node.connectionPoints) {\n node.connectionPoints = node.connectionPoints.filter(\n (point) => point.nodeId !== nodeId\n );\n }\n });\n\n return true;\n }\n\n /**\n * Check if a node has outgoing connections\n */\n hasOutgoingConnections(nodeId: string): boolean {\n return this.state.connections.some((conn) => conn.sourceNodeId === nodeId);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { SwimlaneItem } from '../workflow-designer.types';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SwimlaneService {\n readonly swimlaneHeight = 263;\n\n constructor(private state: WorkflowDesignerState) {}\n\n /**\n * Add a new swimlane\n */\n addSwimlane(name: string, tags: Tag[]): SwimlaneItem {\n const newSwimlane: SwimlaneItem = {\n order: this.state.swimlanes.length,\n label: name,\n tags,\n nodes: [],\n };\n\n this.state.swimlanes.push(newSwimlane);\n return newSwimlane;\n }\n\n /**\n * Update an existing swimlane\n */\n updateSwimlane(index: number, name: string, tags: Tag[]): boolean {\n if (index < 0 || index >= this.state.swimlanes.length) {\n console.error('Invalid swimlane index:', index);\n return false;\n }\n\n this.state.swimlanes[index] = {\n ...this.state.swimlanes[index],\n label: name,\n tags: tags,\n };\n\n return true;\n }\n\n /**\n * Reorder swimlanes (move a swimlane up or down in the list)\n */\n reorderSwimlane(fromIndex: number, toIndex: number): boolean {\n if (\n fromIndex < 0 ||\n fromIndex >= this.state.swimlanes.length ||\n toIndex < 0 ||\n toIndex >= this.state.swimlanes.length\n ) {\n return false;\n }\n\n // Remove the swimlane from its current position\n const [swimlane] = this.state.swimlanes.splice(fromIndex, 1);\n\n // Insert it at the new position\n this.state.swimlanes.splice(toIndex, 0, swimlane);\n\n // Update order properties for all swimlanes\n this.state.swimlanes.forEach((lane, idx) => {\n lane.order = idx;\n });\n\n return true;\n }\n\n /**\n * Delete a swimlane by index\n */\n deleteSwimlane(index: number): boolean {\n if (index < 0 || index >= this.state.swimlanes.length) {\n return false;\n }\n\n // Check if the swimlane has nodes\n if (this.state.swimlanes[index].nodes?.length) {\n console.error('Cannot delete swimlane with nodes');\n return false;\n }\n\n // Remove the swimlane\n this.state.swimlanes.splice(index, 1);\n\n // Update order properties for all swimlanes\n this.state.swimlanes.forEach((lane, idx) => {\n lane.order = idx;\n });\n\n return true;\n }\n\n /**\n * Get all swimlanes\n */\n getSwimlanes(): SwimlaneItem[] {\n return this.state.swimlanes;\n }\n\n /**\n * Get swimlane by index\n */\n getSwimlane(index: number): SwimlaneItem | null {\n if (index < 0 || index >= this.state.swimlanes.length) {\n return null;\n }\n return this.state.swimlanes[index];\n }\n\n /**\n * Calculate total canvas height needed for all swimlanes\n */\n calculateCanvasHeight(minHeight: number = 2000): number {\n const requiredHeight =\n (this.state.swimlanes.length + 1) * this.swimlaneHeight;\n return Math.max(minHeight, requiredHeight);\n }\n\n /**\n * Check if a Y position is within any swimlane\n */\n isPositionInsideSwimlane(y: number): boolean {\n // Check if y position is within any swimlane\n const swimlaneCount = this.state.swimlanes.length;\n if (swimlaneCount === 0) return false;\n\n // Each swimlane has a height of 263px\n const totalSwimlaneHeight = swimlaneCount * this.swimlaneHeight;\n\n // Check if y is within the total height of all swimlanes\n return y >= 0 && y < totalSwimlaneHeight;\n }\n\n /**\n * Calculate swimlane index from Y position\n */\n getSwimlaneIndexFromPosition(y: number): number {\n if (!this.isPositionInsideSwimlane(y)) return -1;\n return Math.floor(y / this.swimlaneHeight);\n }\n\n /**\n * Find swimlane index by Lane ID\n */\n findSwimlaneIndexByLaneId(laneId: string): number {\n // In a real implementation, you would maintain a mapping between API lane IDs and UI swimlane indices\n // For now we'll just return the index based on position\n const parts = laneId.split('-');\n if (parts.length > 1) {\n const index = parseInt(parts[1]);\n if (!isNaN(index) && index < this.state.swimlanes.length) {\n return index;\n }\n }\n return -1;\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { NodeManagementService } from '../services/node-management.service';\nimport { SwimlaneService } from '../services/swimlane.service';\nimport { ToolType } from '../workflow-designer.types';\nimport { ToolbarItem } from './designer-toolbar.types';\n\n@Component({\n selector: 'lib-designer-toolbar',\n templateUrl: './designer-toolbar.component.html',\n styleUrl: './designer-toolbar.component.css',\n})\nexport class DesignerToolbarComponent {\n @Input() selectedTool: ToolType = null;\n @Input() isSaving: boolean = false;\n @Input() workflowCode: string | null = null;\n @Output() openActorTags = new EventEmitter<void>();\n @Output() toolSelected = new EventEmitter<ToolType>();\n @Output() saveWorkflow = new EventEmitter<void>();\n\n // Simple array of toolbar items\n toolbarItems: ToolbarItem[] = [\n { id: 'swimlane', label: 'Swimlane' },\n { id: 'stage', label: 'Stage' },\n // { id: 'action', label: 'Action' },\n // { id: 'form', label: 'Form' },\n { id: 'decision', label: 'Decision' },\n // { id: 'subflow', label: 'Subflow' },\n ];\n\n constructor(\n private nodeService: NodeManagementService,\n private swimlaneService: SwimlaneService\n ) { }\n\n /**\n * Handle tool button click\n */\n onToolClick(tool: ToolType): void {\n this.toolSelected.emit(tool);\n }\n\n /**\n * Check if a tool should be enabled\n */\n isEnabled(type: ToolType): boolean {\n switch (type) {\n case 'swimlane':\n return true; // Always enabled\n case 'stage':\n case 'decision':\n // Enabled if there are swimlanes available\n return this.swimlaneService.getSwimlanes().length > 0;\n case 'form':\n case 'action':\n case 'subflow':\n // Only enabled if there are nodes in the workflow\n return this.nodeService.getNodeCount() > 0;\n default:\n return false;\n }\n }\n\n /**\n * Handle save button click\n */\n onSaveClick(): void {\n this.saveWorkflow.emit();\n }\n\n onActorTagsClick(): void {\n this.openActorTags.emit();\n }\n}\n","<div class=\"designer-toolbar\">\n <div class=\"toolbar-container\">\n <button\n *ngFor=\"let item of toolbarItems\"\n class=\"tool-button\"\n [class.active]=\"selectedTool === item.id\"\n [class.disabled]=\"!isEnabled(item.id)\"\n (click)=\"onToolClick(item.id)\"\n [title]=\"item.label\"\n [disabled]=\"!isEnabled(item.id)\"\n style=\"width: 60px; height: auto\"\n >\n <!-- {{ item.label }} -->\n <img\n [src]=\"'icons/' + item.id + '.svg'\"\n [alt]=\"item.label\"\n class=\"tool-icon\"\n />\n </button>\n </div>\n\n <verbena-button\n *ngIf=\"workflowCode\"\n buttonClass=\"actor-tags-button\"\n (click)=\"onActorTagsClick()\"\n type=\"button\"\n text=\"+ Actor Tags\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n height=\"39px\"\n class=\"ml-2\"\n ></verbena-button>\n\n <verbena-button\n buttonClass=\"save-button\"\n (click)=\"onSaveClick()\"\n [isLoading]=\"isSaving\"\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n ></verbena-button>\n</div>\n","import {\n Component,\n EventEmitter,\n Input,\n Output,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { Node } from '../workflow-designer.types';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { Form } from 'verben-workflow-ui/src/lib/models';\nimport { EscalationType } from 'verben-workflow-ui/src/lib/models';\n\n@Component({\n selector: 'svg:g[lib-stage-node]',\n templateUrl: './stage-node.component.html',\n styleUrls: ['./stage-node.component.css'],\n})\nexport class StageNodeComponent {\n @Input() node!: Node;\n @Input() isStartNode: boolean = false;\n @Input() stageData: Partial<WorkflowStage> = {};\n @Output() stagePropertiesUpdated = new EventEmitter<{\n nodeId: string;\n stageData: Partial<WorkflowStage>;\n }>();\n @Output() parallelExecutionToggled = new EventEmitter<{\n sourceNodeId: string;\n isParallel: boolean;\n }>();\n @Output() showShieldDialog = new EventEmitter<string>();\n @Output() showEscalationDialog = new EventEmitter<{\n stageId: string;\n type: EscalationType;\n }>();\n @Output() showFormDialog = new EventEmitter<MouseEvent>();\n\n // Properties for icon click events\n showFormPopup: boolean = false;\n showTimerPopup: boolean = false;\n showActionPopupLeft: boolean = false;\n showActionPopupRight: boolean = false;\n showCodePopup: boolean = false;\n\n formsList: Form[] = [];\n isLoadingForms: boolean = false;\n\n formPopupX: number = 0;\n formPopupY: number = 0;\n\n constructor(\n private state: WorkflowDesignerState,\n private dataService: WorkflowDataService\n ) {}\n\n ngOnInit(): void {\n console.log('Stage node initialized with:', this.node);\n this.updateConnectedStagesInfo();\n }\n\n // Method to check if this stage has multiple outgoing connections to other stages\n updateConnectedStagesInfo(): void {\n // Count the number of outgoing connections that connect to stages\n const outgoingConnections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === this.node.id\n );\n\n // Check if the target nodes are stages\n const connectedStageNodes = outgoingConnections\n .map((conn) => this.state.findNodeById(conn.targetNodeId))\n .filter((nodeInfo) => nodeInfo && nodeInfo.node.type === 'stage');\n\n this.node.hasMultipleConnectedStages = connectedStageNodes.length > 1;\n this.node.hasParallelStages = connectedStageNodes.every(\n (nd) => nd?.node.stageData?.IsParallel\n );\n }\n\n get hasMultipleConnectedStages(): boolean {\n return this.node.hasMultipleConnectedStages === true;\n }\n\n get isParallelExecution(): boolean {\n return this.node.hasParallelStages === true;\n }\n\n selectForm(form: Form | null) {\n // If form is null, we're clearing the selection\n if (!this.node.stageData) {\n this.node.stageData = {};\n }\n\n if (form) {\n this.node.stageData.formId = form.Code;\n this.node.stageData.formName = form.Name;\n } else {\n // Clear form selection\n delete this.node.stageData.formId;\n delete this.node.stageData.formName;\n }\n\n // Close the popup\n this.showFormPopup = false;\n\n // Emit an event to update the stage data\n this.stagePropertiesUpdated.emit({\n nodeId: this.node.id,\n stageData: this.node.stageData,\n });\n }\n\n toggleFormPopup(event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n\n // Calculate absolute position for the popup\n // const rect = (event.target as Element).getBoundingClientRect();\n // this.formPopupX = rect.left + window.scrollX;\n // this.formPopupY = rect.top + window.scrollY;\n }\n\n this.showFormDialog.emit(event);\n\n // // If we're opening the popup, load forms\n // if (!this.showFormPopup) {\n // this.isLoadingForms = true;\n // this.dataService\n // .getForms()\n // .then((response) => {\n // this.formsList = response.Result;\n // this.isLoadingForms = false;\n // })\n // .catch((error) => {\n // console.error('Error loading forms:', error);\n // this.isLoadingForms = false;\n // });\n // }\n\n // this.showFormPopup = !this.showFormPopup;\n }\n\n toggleShieldPopup(event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n console.log('Shield icon clicked for node:', this.node.id);\n console.log(this.stageData, this.node);\n this.showShieldDialog.emit(this.node.id);\n }\n\n toggleTimerPopup(event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.showTimerPopup = !this.showTimerPopup;\n }\n\n toggleActionPopup(side: 'left' | 'right', event?: MouseEvent) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n if (side === 'left') {\n this.showActionPopupLeft = !this.showActionPopupLeft;\n this.showEscalationDialog.emit({\n stageId: this.node.id,\n type: EscalationType.OnEntry,\n });\n } else {\n this.showActionPopupRight = !this.showActionPopupRight;\n this.showEscalationDialog.emit({\n stageId: this.node.id,\n type: EscalationType.OnExit,\n });\n }\n }\n\n toggleCodePopup(event?: MouseEvent): void {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n // Toggle parallel execution state\n const newParallelState = !this.isParallelExecution;\n\n // Update this node's stage data\n if (!this.node.stageData) {\n this.node.stageData = {};\n }\n this.node.hasParallelStages = newParallelState;\n\n const outgoingConnections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === this.node.id\n );\n\n // Check if the target nodes are stages\n const connectedStageNodes = outgoingConnections\n .map((conn) => this.state.findNodeById(conn.targetNodeId))\n .filter((nodeInfo) => nodeInfo && nodeInfo.node.type === 'stage');\n\n this.state.swimlanes = this.state.swimlanes.map((sw, i) => {\n sw.nodes = sw?.nodes?.map((swNode) => {\n const foundNode = connectedStageNodes\n .map((connected) => connected?.node)\n .find((nde) => nde?.id === swNode.id);\n if (foundNode?.stageData) {\n foundNode.stageData.IsParallel = newParallelState;\n }\n return swNode;\n });\n\n return sw;\n });\n\n console.log(\n `Parallel execution ${\n newParallelState ? 'enabled' : 'disabled'\n } for node:`,\n this.node.id\n );\n }\n\n // This method should be called whenever connections change\n refreshState(): void {\n this.updateConnectedStagesInfo();\n }\n\n onStagePropertiesSaved(stageData: Partial<WorkflowStage>) {\n // Emit the event to the parent component with the node id and updated data\n this.stagePropertiesUpdated.emit({\n nodeId: this.node.id,\n stageData: stageData,\n });\n\n console.log('Stage properties updated:', stageData);\n }\n}\n","<svg:g>\n <!-- Stage node -->\n <svg:rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"transparent\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n style=\"pointer-events: all\"\n ></svg:rect>\n\n <!-- Top-left icon: Stage form -->\n <svg:g\n (click)=\"toggleFormPopup($event)\"\n class=\"stage-icon\"\n transform=\"translate(6, 6)\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"node.stageData?.formId ? '#D36CFF' : 'black'\"\n />\n </svg:g>\n\n <!-- Top-right icon: Shield -->\n <svg:g\n (click)=\"toggleShieldPopup($event)\"\n class=\"stage-icon\"\n [attr.transform]=\"'translate(' + (node.width - 30) + ', 6)'\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n\n <svg:path\n d=\"M7.5 12H16.5V13.5H7.5V12ZM7.5 7.5H16.5V9H7.5V7.5Z\"\n fill=\"black\"\n />\n <svg:path\n d=\"M12 22.5L7.36801 20.0303C6.0474 19.3279 4.94303 18.2791 4.17348 16.9964C3.40393 15.7138 2.99825 14.2458 3.00001 12.75V3C3.00001 2.60218 3.15804 2.22064 3.43935 1.93934C3.72065 1.65804 4.10218 1.5 4.50001 1.5H19.5C19.8978 1.5 20.2794 1.65804 20.5607 1.93934C20.842 2.22064 21 2.60218 21 3V12.75C21.0018 14.2458 20.5961 15.7138 19.8265 16.9964C19.057 18.2791 17.9526 19.3279 16.632 20.0303L12 22.5ZM4.50001 3V12.75C4.49917 13.9738 4.83141 15.1747 5.46111 16.224C6.09082 17.2733 6.99423 18.1315 8.07451 18.7065L12 20.7997L15.9255 18.7073C17.0059 18.1322 17.9094 17.2739 18.5391 16.2244C19.1688 15.175 19.501 13.9739 19.5 12.75V3H4.50001Z\"\n fill=\"black\"\n />\n </svg:g>\n\n @if (node.stageData?.Code) {\n <!-- Left-center icon: Thunderbolt -->\n <svg:g\n (click)=\"toggleActionPopup('left', $event)\"\n class=\"stage-icon\"\n transform=\"translate(6, 38)\"\n >\n <svg:path d=\"M11 15H6L13 1V9H18L11 23V15Z\" fill=\"black\" />\n </svg:g>\n\n <!-- Right-center icon: Thunderbolt -->\n <svg:g\n (click)=\"toggleActionPopup('right', $event)\"\n class=\"stage-icon\"\n [attr.transform]=\"'translate(' + (node.width - 30) + ', 38)'\"\n >\n <svg:path d=\"M11 15H6L13 1V9H18L11 23V15Z\" fill=\"black\" />\n </svg:g>\n }\n\n <!-- Bottom-left icon: Double slash text -->\n <svg:g\n *ngIf=\"hasMultipleConnectedStages\"\n (click)=\"toggleCodePopup($event)\"\n class=\"stage-icon\"\n [attr.transform]=\"'translate(6, ' + (node.height - 16) + ')'\"\n >\n <svg:text\n font-family=\"'Plus Jakarta Sans', sans-serif\"\n font-weight=\"500\"\n font-size=\"16px\"\n dominant-baseline=\"middle\"\n [attr.fill]=\"isParallelExecution ? '#D36CFF' : 'black'\"\n >\n //\n </svg:text>\n </svg:g>\n\n <!-- Bottom-right icon: Timer -->\n <svg:g\n (click)=\"toggleTimerPopup($event)\"\n class=\"stage-icon\"\n [attr.transform]=\"\n 'translate(' + (node.width - 30) + ', ' + (node.height - 30) + ')'\n \"\n >\n <svg:path\n d=\"M11.5 3C14.0196 3 16.4359 4.00089 18.2175 5.78249C19.9991 7.56408 21 9.98044 21 12.5C21 15.0196 19.9991 17.4359 18.2175 19.2175C16.4359 20.9991 14.0196 22 11.5 22C8.98044 22 6.56408 20.9991 4.78249 19.2175C3.00089 17.4359 2 15.0196 2 12.5C2 9.98044 3.00089 7.56408 4.78249 5.78249C6.56408 4.00089 8.98044 3 11.5 3ZM11.5 4C9.24566 4 7.08365 4.89553 5.48959 6.48959C3.89553 8.08365 3 10.2457 3 12.5C3 14.7543 3.89553 16.9163 5.48959 18.5104C7.08365 20.1045 9.24566 21 11.5 21C12.6162 21 13.7215 20.7801 14.7528 20.353C15.7841 19.9258 16.7211 19.2997 17.5104 18.5104C18.2997 17.7211 18.9258 16.7841 19.353 15.7528C19.7801 14.7215 20 13.6162 20 12.5C20 10.2457 19.1045 8.08365 17.5104 6.48959C15.9163 4.89553 13.7543 4 11.5 4ZM11 7H12V12.42L16.7 15.13L16.2 16L11 13V7Z\"\n fill=\"black\"\n />\n </svg:g>\n\n <!-- Label in the center -->\n <svg:text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-size=\"14\"\n fill=\"#000000\"\n >\n {{\n (node.stageData?.Name || \"Stage\").length > 12\n ? node.stageData?.Name?.substring(0, 10) + \"...\"\n : node.stageData?.Name || \"Stage\"\n }}\n </svg:text>\n</svg:g>\n\n<!-- <lib-stage-dialog\n [visible]=\"showShieldPopup()\"\n [stageData]=\"node.stageData || {}\"\n (closed)=\"showShieldPopup.set(false)\"\n (saved)=\"onStagePropertiesSaved($event)\"\n></lib-stage-dialog> -->\n","import { Injectable } from '@angular/core';\nimport { Form } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { ConnectionPoint } from '../workflow-designer.types';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { BehaviorSubject } from 'rxjs';\n\n/**\n * Service for managing various popups in the workflow designer\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class PopupService {\n // Connection creation popup\n private _connectionPopupVisible = new BehaviorSubject<boolean>(false);\n private _connectionPopupPosition = new BehaviorSubject<{\n x: number;\n y: number;\n }>({ x: 0, y: 0 });\n private _allowedNodeTypes = new BehaviorSubject<string[]>([]);\n\n // Form selection popup for stages\n private _formPopupVisible = new BehaviorSubject<boolean>(false);\n private _formPopupPosition = new BehaviorSubject<{ x: number; y: number }>({\n x: 0,\n y: 0,\n });\n private _formsList = new BehaviorSubject<Form[]>([]);\n private _isLoadingForms = new BehaviorSubject<boolean>(false);\n private _selectedNodeForForm = new BehaviorSubject<string | null>(null);\n\n // Workflow form selection popup for start node\n private _startNodeFormPopupVisible = new BehaviorSubject<boolean>(false);\n private _startNodeFormPopupPosition = new BehaviorSubject<{\n x: number;\n y: number;\n }>({ x: 0, y: 0 });\n\n // Subflow selection popup\n private _subflowPopupVisible = new BehaviorSubject<boolean>(false);\n private _subflowPopupPosition = new BehaviorSubject<{ x: number; y: number }>(\n { x: 0, y: 0 }\n );\n private _workflowsList = new BehaviorSubject<Workflow[]>([]);\n private _isLoadingWorkflows = new BehaviorSubject<boolean>(false);\n private _pendingSubflowPosition = new BehaviorSubject<{\n swimlaneIndex: number;\n x: number;\n y: number;\n } | null>(null);\n\n // Connection data for popups\n private _pendingConnectionSourcePoint =\n new BehaviorSubject<ConnectionPoint | null>(null);\n private _pendingConnectionSourceSwimlaneIndex = new BehaviorSubject<\n number | null\n >(null);\n\n constructor(private dataService: WorkflowDataService) {}\n\n // Connection popup observables\n get connectionPopupVisible() {\n return this._connectionPopupVisible.asObservable();\n }\n get connectionPopupPosition() {\n return this._connectionPopupPosition.asObservable();\n }\n get allowedNodeTypes() {\n return this._allowedNodeTypes.asObservable();\n }\n\n // Form popup observables\n get formPopupVisible() {\n return this._formPopupVisible.asObservable();\n }\n get formPopupPosition() {\n return this._formPopupPosition.asObservable();\n }\n get formsList() {\n return this._formsList.asObservable();\n }\n get isLoadingForms() {\n return this._isLoadingForms.asObservable();\n }\n get selectedNodeForForm() {\n return this._selectedNodeForForm.asObservable();\n }\n\n // Start node form popup observables\n get startNodeFormPopupVisible() {\n return this._startNodeFormPopupVisible.asObservable();\n }\n get startNodeFormPopupPosition() {\n return this._startNodeFormPopupPosition.asObservable();\n }\n\n // Subflow popup observables\n get subflowPopupVisible() {\n return this._subflowPopupVisible.asObservable();\n }\n get subflowPopupPosition() {\n return this._subflowPopupPosition.asObservable();\n }\n get workflowsList() {\n return this._workflowsList.asObservable();\n }\n get isLoadingWorkflows() {\n return this._isLoadingWorkflows.asObservable();\n }\n get pendingSubflowPosition() {\n return this._pendingSubflowPosition.asObservable();\n }\n\n // Connection data observables\n get pendingConnectionSourcePoint() {\n return this._pendingConnectionSourcePoint.asObservable();\n }\n get pendingConnectionSourceSwimlaneIndex() {\n return this._pendingConnectionSourceSwimlaneIndex.asObservable();\n }\n\n /**\n * Show connection creation popup\n */\n showConnectionPopup(x: number, y: number, allowedNodeTypes: string[]): void {\n this._connectionPopupPosition.next({ x, y });\n this._allowedNodeTypes.next(allowedNodeTypes);\n this._connectionPopupVisible.next(true);\n }\n\n /**\n * Hide connection creation popup\n */\n hideConnectionPopup(): void {\n this._connectionPopupVisible.next(false);\n }\n\n /**\n * Store connection source data for use in other popups\n */\n storeConnectionSourceData(\n point: ConnectionPoint,\n swimlaneIndex: number\n ): void {\n this._pendingConnectionSourcePoint.next(point);\n this._pendingConnectionSourceSwimlaneIndex.next(swimlaneIndex);\n }\n\n /**\n * Clear connection source data\n */\n clearConnectionSourceData(): void {\n this._pendingConnectionSourcePoint.next(null);\n this._pendingConnectionSourceSwimlaneIndex.next(null);\n }\n\n /**\n * Show form selection popup for a stage\n */\n async showFormPopup(x: number, y: number, nodeId: string): Promise<void> {\n this._formPopupPosition.next({ x, y });\n this._selectedNodeForForm.next(nodeId);\n this._formPopupVisible.next(true);\n\n // Load forms\n this._isLoadingForms.next(true);\n try {\n const response = await this.dataService.getForms();\n this._formsList.next(response.Result);\n } catch (error) {\n console.error('Error loading forms:', error);\n this._formsList.next([]);\n } finally {\n this._isLoadingForms.next(false);\n }\n }\n\n /**\n * Hide form selection popup\n */\n hideFormPopup(): void {\n this._formPopupVisible.next(false);\n this._selectedNodeForForm.next(null);\n }\n\n /**\n * Show workflow form selection popup for start node\n */\n async showStartNodeFormPopup(x: number, y: number): Promise<void> {\n this._startNodeFormPopupPosition.next({ x, y });\n this._startNodeFormPopupVisible.next(true);\n\n // Load forms\n this._isLoadingForms.next(true);\n try {\n const response = await this.dataService.getForms();\n this._formsList.next(response.Result);\n } catch (error) {\n console.error('Error loading forms:', error);\n this._formsList.next([]);\n } finally {\n this._isLoadingForms.next(false);\n }\n }\n\n /**\n * Hide workflow form selection popup\n */\n hideStartNodeFormPopup(): void {\n this._startNodeFormPopupVisible.next(false);\n }\n\n /**\n * Show subflow selection popup\n */\n async showSubflowPopup(\n x: number,\n y: number,\n swimlaneIndex: number\n ): Promise<void> {\n this._subflowPopupPosition.next({ x, y });\n this._pendingSubflowPosition.next({ swimlaneIndex, x, y });\n this._subflowPopupVisible.next(true);\n\n // Load workflows\n this._isLoadingWorkflows.next(true);\n try {\n const response = await this.dataService.getWorkflows();\n this._workflowsList.next(response.Result);\n } catch (error) {\n console.error('Error loading workflows:', error);\n this._workflowsList.next([]);\n } finally {\n this._isLoadingWorkflows.next(false);\n }\n }\n\n /**\n * Hide subflow selection popup\n */\n hideSubflowPopup(): void {\n this._subflowPopupVisible.next(false);\n this._pendingSubflowPosition.next(null);\n }\n\n // Current values for internal use\n getCurrentValues() {\n return {\n connectionPopupVisible: this._connectionPopupVisible.getValue(),\n connectionPopupPosition: this._connectionPopupPosition.getValue(),\n allowedNodeTypes: this._allowedNodeTypes.getValue(),\n formPopupVisible: this._formPopupVisible.getValue(),\n formPopupPosition: this._formPopupPosition.getValue(),\n formsList: this._formsList.getValue(),\n isLoadingForms: this._isLoadingForms.getValue(),\n selectedNodeForForm: this._selectedNodeForForm.getValue(),\n startNodeFormPopupVisible: this._startNodeFormPopupVisible.getValue(),\n startNodeFormPopupPosition: this._startNodeFormPopupPosition.getValue(),\n subflowPopupVisible: this._subflowPopupVisible.getValue(),\n subflowPopupPosition: this._subflowPopupPosition.getValue(),\n workflowsList: this._workflowsList.getValue(),\n isLoadingWorkflows: this._isLoadingWorkflows.getValue(),\n pendingSubflowPosition: this._pendingSubflowPosition.getValue(),\n pendingConnectionSourcePoint:\n this._pendingConnectionSourcePoint.getValue(),\n pendingConnectionSourceSwimlaneIndex:\n this._pendingConnectionSourceSwimlaneIndex.getValue(),\n };\n }\n}\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n Input,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { StageActorRule } from 'verben-workflow-ui/src/lib/models';\nimport { TaskAssignmentType } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { NodeManagementService } from '../services/node-management.service';\nimport { PopupService } from '../services/popup.service';\n\n@Component({\n selector: 'lib-stage-dialog',\n templateUrl: './stage-dialog.component.html',\n styleUrls: ['./stage-dialog.component.css'],\n})\nexport class StageDialogComponent implements OnInit {\n // Use Angular's signal-based input\n visible = input<boolean>(false);\n stageData = input.required<Partial<WorkflowStage>>({}); // For editing existing stages\n @Output() closed = new EventEmitter();\n @Output() saved = new EventEmitter<Partial<WorkflowStage>>();\n\n stageForm: FormGroup;\n tags: Tag[] = [];\n actorRules = Object.values(StageActorRule);\n assignmentTypes = Object.values(TaskAssignmentType);\n selectedTagIds: string[] = [];\n\n hasOutgoingConnections: boolean = false;\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService,\n private nodeService: NodeManagementService,\n private popupService: PopupService\n ) {\n this.stageForm = this.fb.group({\n Name: ['', Validators.required],\n Description: [''],\n MinNoOfActor: [0],\n Duration: [0],\n PassOnRule: [''],\n ActorRule: [StageActorRule.None],\n AssignmentType: [TaskAssignmentType.AutoRoute],\n IsExitPoint: [false],\n Tags: [[]],\n });\n\n effect(() => {\n // If stageData changes, update the form\n const stageData = this.stageData();\n if (stageData) {\n this.stageForm.patchValue({\n Name: stageData.Name || '',\n Description: stageData.Description || '',\n MinNoOfActor: stageData.MinNoOfActor || 0,\n Duration: stageData.Duration || 0,\n PassOnRule: stageData.PassOnRule || '',\n ActorRule: stageData.ActorRule || StageActorRule.None,\n AssignmentType:\n stageData.AssignmentType || TaskAssignmentType.AutoRoute,\n IsExitPoint: stageData.IsExitPoint || false,\n });\n\n // Update selected tags\n if (stageData.Tags && stageData.Tags.length > 0) {\n this.selectedTagIds = stageData.Tags.map((tag) => tag.Code);\n } else {\n this.selectedTagIds = [];\n }\n }\n });\n }\n\n ngOnInit(): void {\n // Load tags\n this.loadTags();\n\n // If editing an existing stage, populate form\n this.initFormWithStageData();\n }\n\n ngOnChanges(changes: SimpleChanges) {}\n\n /**\n * Load tags from data service\n */\n private loadTags(): void {\n this.dataService.getTags().then((data) => {\n this.tags = data.Result;\n\n const stageData = this.stageData();\n // If we have stage data with tags, update selectedTagIds after tags are loaded\n if (stageData && stageData.Tags && stageData.Tags.length > 0) {\n this.selectedTagIds = stageData.Tags.map((tag) => tag.Code);\n }\n });\n }\n\n /**\n * Initialize form with stage data if provided\n */\n private initFormWithStageData(): void {\n if (this.stageData()) {\n console.log('Initializing form with stage data:', this.stageData());\n this.stageForm.patchValue({\n Name: this.stageData().Name || '',\n Description: this.stageData().Description || '',\n MinNoOfActor: this.stageData().MinNoOfActor || 0,\n Duration: this.stageData().Duration || 0,\n PassOnRule: this.stageData().PassOnRule || '',\n ActorRule: this.stageData().ActorRule || StageActorRule.None,\n IsExitPoint: this.stageData().IsExitPoint || false,\n });\n }\n }\n\n private checkOutgoingConnections(): void {\n const stageData = this.stageData();\n\n if (stageData && stageData.Code) {\n // Check if there are outgoing connections from this stage\n this.hasOutgoingConnections = this.nodeService.hasOutgoingConnections(\n stageData.Code\n );\n\n // If there are outgoing connections, disable IsExitPoint\n if (this.hasOutgoingConnections) {\n this.stageForm.get('IsExitPoint')?.disable();\n } else {\n this.stageForm.get('IsExitPoint')?.enable();\n }\n }\n }\n\n onDialogClose(event: any): void {\n this.closed.emit();\n }\n\n saveStage(): void {\n if (this.stageForm.valid) {\n const selectedTags = this.tags.filter((tag) =>\n this.selectedTagIds.includes(tag.Code)\n );\n\n const stageData: Partial<WorkflowStage> = {\n ...this.stageForm.value,\n Tags: selectedTags,\n };\n\n // Reset form after saving\n this.stageForm.reset();\n\n // Emit the saved data to the parent component\n this.saved.emit(stageData);\n }\n }\n\n toggleTagSelection(tagId: string): void {\n const index = this.selectedTagIds.indexOf(tagId);\n if (index > -1) {\n this.selectedTagIds.splice(index, 1);\n } else {\n this.selectedTagIds.push(tagId);\n }\n }\n\n isTagSelected(tagId: string): boolean {\n return this.selectedTagIds.includes(tagId);\n }\n\n onDialogOpen(event: any): void {\n console.log('Dialog opened:', event);\n }\n\n deleteStage(): void {\n const stageData = this.stageData();\n console.log(stageData);\n if (stageData) {\n const stageCode = stageData.Code;\n if (stageCode) {\n this.dataService\n .deleteWorkflowStages([stageCode])\n .then((response) => {\n console.log('Stage deleted successfully:', response);\n // Call the node service to delete the stage\n const deleted = this.nodeService.deleteNode(stageCode);\n if (deleted) {\n // Emit an event to notify parent component\n this.closed.emit();\n } else {\n console.error('Failed to delete stage:', stageCode);\n }\n })\n .catch((error) => {\n console.error('Error deleting stage:', error);\n });\n } else if (stageData.id) {\n // Call the node service to delete the stage\n const deleted = this.nodeService.deleteNode(stageData.id);\n if (deleted) {\n // Emit an event to notify parent component\n this.closed.emit();\n } else {\n console.error('Failed to delete stage:', stageData.Code);\n }\n }\n }\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible()\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div class=\"p-4 border-b border-gray-200\">\n <h2 class=\"text-xl font-medium m-0\">Stage Properties</h2>\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"p-4\">\n <form [formGroup]=\"stageForm\" class=\"space-y-4\">\n <!-- Stage Name -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Stage Name</label>\n <input\n type=\"text\"\n formControlName=\"Name\"\n placeholder=\"Enter Stage Name\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Description -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Description</label>\n <textarea\n formControlName=\"Description\"\n placeholder=\"Enter Description\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n rows=\"3\"\n ></textarea>\n </div>\n\n <!-- Recipient Count -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Recipient Count</label>\n <input\n type=\"number\"\n formControlName=\"MinNoOfActor\"\n placeholder=\"Enter Count\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Pass On Rule -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Pass On Rule</label>\n <input\n type=\"text\"\n formControlName=\"PassOnRule\"\n placeholder=\"Select Rule\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Duration -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Duration</label>\n <input\n type=\"number\"\n formControlName=\"Duration\"\n placeholder=\"Set Duration\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n />\n </div>\n\n <!-- Actor Rule -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Actor Rule</label>\n <select\n formControlName=\"ActorRule\"\n class=\"w-full px-4 py-2 rounded border border-gray-200\"\n >\n <option *ngFor=\"let rule of actorRules\" [value]=\"rule\">\n {{ rule }}\n </option>\n </select>\n </div>\n\n <!-- Assignment Type -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Assignment Type</label>\n\n <verben-drop-down\n label=\"Assignment\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select\"\n [options]=\"assignmentTypes\"\n id=\"assignment\"\n formControlName=\"AssignmentType\"\n class=\"form-control\"\n >\n </verben-drop-down>\n </div>\n\n <!-- Is Exit Point -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Exit Point</label>\n <div class=\"flex items-center\">\n <input\n type=\"checkbox\"\n formControlName=\"IsExitPoint\"\n [disabled]=\"hasOutgoingConnections\"\n class=\"mr-2 h-4 w-4\"\n />\n <span class=\"text-sm text-gray-600\">Mark as workflow end point</span>\n </div>\n </div>\n\n <!-- Tags -->\n <div>\n <label class=\"block text-sm font-medium mb-1\">Tags</label>\n <div\n class=\"border border-gray-200 rounded p-2 max-h-40 overflow-y-auto\"\n >\n <div *ngFor=\"let tag of tags\" class=\"py-1\">\n <label class=\"flex items-center\">\n <input\n type=\"checkbox\"\n [checked]=\"isTagSelected(tag.Code)\"\n (change)=\"toggleTagSelection(tag.Code)\"\n class=\"mr-2\"\n />\n <span>{{ tag.Name }}</span>\n </label>\n </div>\n </div>\n </div>\n </form>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"flex justify-end p-4 border-t border-gray-200\">\n <!-- <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"onDialogClose($event)\"\n >\n Cancel\n </button>\n <button\n class=\"px-4 py-2 bg-yellow-300 text-black rounded text-sm font-medium\"\n (click)=\"saveStage()\"\n [disabled]=\"stageForm.invalid\"\n >\n Save\n </button>\n <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"deleteStage()\"\n >\n Delete\n </button> -->\n\n <verbena-button\n (click)=\"onDialogClose($event)\"\n text=\"Cancel\"\n styleType=\"ylw-outline\"\n class=\"ml-auto\"\n ></verbena-button>\n <verbena-button\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n (click)=\"saveStage()\"\n [disable]=\"stageForm.invalid\"\n ></verbena-button>\n <verbena-button\n width=\"114px\"\n height=\"39px\"\n text=\"Delete\"\n bgColor=\"#999999\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n (click)=\"deleteStage()\"\n ></verbena-button>\n </div>\n</ng-template>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\ninterface ConnectionCondition {\n connectionId: string;\n sourceNodeId: string;\n targetNodeId: string;\n targetNodeName: string;\n condition: string;\n isActive: boolean;\n}\n\n@Component({\n selector: 'lib-conditions-popup',\n templateUrl: './conditions-popup.component.html',\n styleUrl: './conditions-popup.component.css',\n})\nexport class ConditionsPopupComponent {\n @Input() visible: boolean = false;\n @Input() decisionNodeId: string = '';\n @Input() newConnectionId: string = '';\n @Input() popupX: number = 0;\n @Input() popupY: number = 0;\n @Output() closed = new EventEmitter();\n @Output() saved = new EventEmitter<{\n connectionId: string;\n condition: string;\n }>();\n\n connectionConditions: ConnectionCondition[] = [];\n currentCondition: string = '';\n\n constructor(private state: WorkflowDesignerState) {}\n\n ngOnInit(): void {\n this.loadConnectionConditions();\n }\n\n loadConnectionConditions(): void {\n if (!this.decisionNodeId) return;\n\n // Get all connections from this decision node\n const connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === this.decisionNodeId\n );\n\n this.connectionConditions = connections.map((conn) => {\n const targetNode = this.state.findNodeById(conn.targetNodeId)?.node;\n return {\n connectionId: conn.id,\n sourceNodeId: conn.sourceNodeId,\n targetNodeId: conn.targetNodeId,\n targetNodeName: targetNode?.stageData?.Name || 'Unknown Stage',\n condition: conn.condition || '',\n isActive: conn.id === this.newConnectionId,\n };\n });\n\n // Find the current connection being edited\n const activeCondition = this.connectionConditions.find((c) => c.isActive);\n if (activeCondition) {\n this.currentCondition = activeCondition.condition;\n }\n }\n\n saveCondition(): void {\n this.saved.emit({\n connectionId: this.newConnectionId,\n condition: this.currentCondition,\n });\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","<div\n *ngIf=\"visible\"\n [style.position]=\"'fixed'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n>\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-4 bg-white border border-purple-300 rounded shadow-md w-80\"\n dropdown-content\n >\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"text-lg font-medium\">Decision Conditions</h3>\n <button class=\"text-gray-500 hover:text-gray-700\" (click)=\"onClose()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <div class=\"mb-3\">\n <p class=\"text-sm text-gray-600\">Define a condition for this branch.</p>\n </div>\n\n <div class=\"mb-4\">\n <label class=\"block text-sm font-medium mb-1\">Condition</label>\n <input\n type=\"text\"\n [(ngModel)]=\"currentCondition\"\n placeholder=\"e.g., order.amount > 500,000\"\n class=\"w-full px-3 py-2 rounded border border-gray-200 text-sm\"\n />\n </div>\n\n <div\n class=\"space-y-3 max-h-60 overflow-y-auto\"\n *ngIf=\"connectionConditions.length > 1\"\n >\n <h4 class=\"text-sm font-medium\">Existing Conditions:</h4>\n @for (conn of connectionConditions; track conn.connectionId) { @if\n (!conn.isActive) {\n <div class=\"border rounded p-3\">\n <div class=\"mb-2\">\n <span class=\"font-medium\">{{ conn.targetNodeName }}</span>\n </div>\n <div>\n <input\n type=\"text\"\n [value]=\"conn.condition\"\n placeholder=\"No condition\"\n class=\"w-full px-3 py-2 rounded border border-gray-200 bg-gray-50 text-sm\"\n readonly\n />\n </div>\n </div>\n } }\n </div>\n\n <div class=\"flex justify-end mt-4 pt-3 border-t border-gray-200\">\n <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"onClose()\"\n >\n Cancel\n </button>\n <button\n class=\"px-4 py-2 bg-yellow-300 text-black rounded text-sm font-medium\"\n (click)=\"saveCondition()\"\n >\n Save\n </button>\n </div>\n </div>\n </verben-pop-Up>\n</div>\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n Input,\n OnInit,\n Output,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport { EditorConfig, EditorMode, EditorState } from 'verben-reporting-ui';\nimport { Escalation, EscalationType, ObjectState, ReportSchedule, TaskNotification, TaskNotificationType } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\n\n@Component({\n selector: 'lib-escalation-dialog',\n templateUrl: './escalation-dialog.component.html',\n styleUrl: './escalation-dialog.component.css',\n})\nexport class EscalationDialogComponent implements OnInit {\n @Input() visible: boolean = false;\n workflowCode = input.required<string>();\n stageCode = input.required<string>();\n type = input<EscalationType>();\n\n @Output() closed = new EventEmitter();\n @Output() created = new EventEmitter<{}>();\n\n escalation: WritableSignal<Escalation | null> = signal(null);\n\n // escalationForm;\n reportSchedules: WritableSignal<ReportSchedule[]> = signal([]);\n // operationActions: WritableSignal<OperationAction[]> = signal([]);\n\n // selectedOperationAction: BehaviorSubject<OperationAction[\"Code\"] | null> = new BehaviorSubject<OperationAction[\"Code\"] | null>(null);\n\n // selectedMessages: WritableSignal<\n // ((ReportSchedule & { IsTaskDataSource: boolean }) | null)[]\n // > = signal([]);\n\n selectedMessages: ((ReportSchedule & { IsTaskDataSource: boolean }) | null)[] = [];\n\n editorMode: EditorMode = EditorMode.Designer;\n editorConfig: EditorConfig = {\n editable: true,\n height: '',\n width: '',\n showToolbar: true,\n menuItems: [\n {\n Label: 'ToggleView',\n Icon: 'code-toggle',\n IconWidth: 20,\n IconHeight: 20,\n IsStroke: false,\n GroupBy: 'local',\n OnClick: (event: EditorState | undefined) => {\n this.editorMode =\n this.editorMode == EditorMode.Designer\n ? EditorMode.Code\n : EditorMode.Designer;\n },\n IsDisabled: (event: EditorState | undefined) => {\n return false;\n },\n IsEnabled: (event: EditorState | undefined) => {\n return this.editorMode == EditorMode.Code;\n },\n },\n ],\n };\n\n // IsTaskDataSource: WritableSignal<boolean[]> = signal([]);\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService\n ) {\n effect(() => {\n const stageCode = this.stageCode();\n const workflowCode = this.workflowCode();\n const type = this.type();\n console.log('Stage code changed:', stageCode);\n if (workflowCode && stageCode && type) {\n // this.loadEscalation(stageCode);\n this.searchEscalation(workflowCode, stageCode, type);\n }\n });\n\n effect(() => {\n const escalation = this.escalation();\n const reportSchedules = this.reportSchedules();\n\n if (escalation && reportSchedules) {\n this.selectedMessages = escalation.Messages.map((code) => {\n const found = reportSchedules.find((rs) => rs.Code === code);\n return found ? { ...found, IsTaskDataSource: true } : null;\n });\n // this.selectedOperationAction.next(escalation.OperationAction ?? null);\n // console.log(\"SETTING OP\", this.selectedOperationAction);\n }\n });\n\n // this.escalationForm = this.fb.group({\n // Messages: this.fb.array([]),\n // });\n }\n\n ngOnInit(): void {\n this.loadReportSchedules();\n // this.loadOperationActions();\n\n if (this.selectedMessages.length === 0) {\n this.addMessage();\n }\n\n console.log(\n 'EscalationDialogComponent initialized with stageCode:',\n this.stageCode\n );\n // console.log('EscalationDialogComponent type:', this.type);\n }\n\n // get messages() {\n // return this.escalationForm.controls['Messages'] as FormArray;\n // }\n\n addMessage() {\n this.selectedMessages = this.selectedMessages.concat([null]);\n }\n\n deleteMessage(lessonIndex: number) {\n this.selectedMessages = this.selectedMessages.splice(lessonIndex, 1);\n }\n\n onMessageSelected(reportSchedule: ReportSchedule, index: number) {\n console.log('Selected message:', reportSchedule, 'at index:', index);\n this.selectedMessages = this.selectedMessages.map((msg, i) => {\n if (i === index) {\n return { ...reportSchedule, IsTaskDataSource: true };\n }\n return msg;\n });\n }\n\n isValidSelection(): boolean {\n return this.selectedMessages.every((msg) => !!msg);\n }\n\n async saveMessages() {\n console.log(this.selectedMessages);\n const taskNotifications: TaskNotification[] = this.selectedMessages\n .filter((msg) => !!msg)\n .map((msg) => ({\n Id: '',\n Code: '',\n TenantId: 'PDLTC6',\n Message: msg.Code,\n Name: msg.Name,\n Subject: msg.Subject,\n SenderConfig: msg.MessageConfig,\n Medium: msg.Medium,\n NotificationType: TaskNotificationType.Escalation,\n IsMessageId: false,\n IsTaskDataSource: msg.IsTaskDataSource,\n MessageDataSource: !msg.IsTaskDataSource ? msg.ReportDataSource : '',\n DataState: ObjectState.New,\n id: '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n }));\n\n // if (taskNotifications.length) {\n // this.created.emit(taskNotifications);\n console.log(taskNotifications);\n this.onDialogClose(null);\n const data: Partial<Escalation> = {\n ...(this.escalation() ?? {\n Id: '',\n Code: '',\n TenantId: 'PDLTC6',\n Workflow: this.workflowCode(),\n Stage: this.stageCode(),\n Type: this.type(),\n ExpirationWarning: 0,\n Duration: 0,\n NotifyAfter: 0,\n Position: 1,\n DataState: ObjectState.New,\n }),\n // OperationAction: this.selectedOperationAction.getValue(),\n Messages: taskNotifications.map(({ Code }) => Code),\n FullMessages: taskNotifications,\n };\n console.log(data);\n await this.dataService.saveEscalations([data]);\n // }\n }\n\n private loadEscalation(stageCode: string): void {\n this.dataService.getEscalationWithParam(stageCode).then((data) => {\n this.escalation.set(data.Result[0] ?? null);\n });\n }\n\n private searchEscalation(\n Workflow: string,\n Stage: string,\n Type: EscalationType\n ): void {\n this.dataService\n .searchEscalationWithParam({\n Workflow,\n Stage,\n Type,\n })\n .then((data) => {\n this.escalation.set(data.Result[0] ?? null);\n // this.selectedOperationAction.next(data.Result[0]?.OperationAction ?? null);\n });\n }\n\n private loadReportSchedules(): void {\n this.dataService.getReportSchedules().then((data) => {\n this.reportSchedules.set(data.Result);\n });\n }\n\n // private loadOperationActions(): void {\n // this.dataService.getOperationActions().then((data) => {\n // this.operationActions.set(data.Result);\n // });\n // }\n\n onDialogClose(eventData: any) {\n console.log('Dialog closed, received data:', eventData);\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n console.log('Dialog opened, received data:', eventData);\n }\n\n isNotNew(): boolean {\n const escalation = this.escalation();\n return escalation !== null && escalation.DataState !== 'New';\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div\n class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\"\n >\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span\n class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"\n ></span>\n </button>\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div>\n <div class=\"mb-4 space-y-4\">\n <div class=\"space-y-1\">\n <label\n for=\"operation-action\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Operation Action\n </label>\n <!-- <verben-drop-down\n id=\"operation-action\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select Operation Action\"\n [options]=\"operationActions()\"\n optionLabel=\"Name\"\n optionValue=\"Code\"\n [ngModel]=\"selectedOperationAction | async\"\n (ngModelChange)=\"selectedOperationAction.next($event)\"\n class=\"form-control\"\n ></verben-drop-down> -->\n </div>\n\n <div *ngFor=\"let message of selectedMessages; let i = index\">\n <div class=\"space-y-1\">\n <label\n [for]=\"message + '-' + i\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Message {{ i + 1 }}\n </label>\n <verben-drop-down\n [id]=\"message + '-' + i\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select Message\"\n [options]=\"reportSchedules()\"\n optionLabel=\"Name\"\n [ngModel]=\"message\"\n (ngModelChange)=\"onMessageSelected($event, i)\"\n class=\"form-control\"\n ></verben-drop-down>\n </div>\n\n @if (message) {\n <div class=\"flex items-center gap-4\">\n <label\n [for]=\"'is-' + message + '-' + i + 'task-data-source'\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Is Task Data Source?\n </label>\n <verbena-switch\n [id]=\"'is-' + message + '-' + i + 'task-data-source'\"\n onText=\"Yes\"\n offText=\"No\"\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"message.IsTaskDataSource\"\n ></verbena-switch>\n </div>\n }\n\n <div\n class=\"border border-primary -m-2 rounded-lg flex flex-col gap-3\"\n *ngIf=\"message\"\n >\n <div class=\"space-y-3 border-b border-primary px-2 py-3\">\n <verbena-input\n name=\"Subject\"\n [(ngModel)]=\"message.Subject\"\n [readOnly]=\"true\"\n />\n <verbena-input\n name=\"Recipients\"\n [(ngModel)]=\"message.Recipients\"\n [readOnly]=\"true\"\n />\n </div>\n <lib-editor\n [editorConfig]=\"editorConfig\"\n [editorMode]=\"editorMode\"\n [(ngModel)]=\"message.PlainMessage\"\n ></lib-editor>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"flex justify-between items-center gap-8 w-full\">\n <verbena-button\n style=\"cursor: pointer\"\n type=\"button\"\n text=\"Add Message\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"8px\"\n pd=\"10px 20px\"\n height=\"39px\"\n fontWeight=\"600\"\n fontSize=\"12px\"\n svg=\"add\"\n [svgHeight]=\"14\"\n [svgWidth]=\"14\"\n [svgSize]=\"'sm'\"\n (click)=\"addMessage()\"\n ></verbena-button>\n\n <div class=\"flex gap-2 items-center\">\n <verbena-button\n style=\"cursor: pointer\"\n type=\"button\"\n text=\"Delete\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"8px\"\n pd=\"10px 20px\"\n width=\"110px\"\n height=\"39px\"\n fontWeight=\"600\"\n fontSize=\"12px\"\n svg=\"delete\"\n [svgHeight]=\"14\"\n [svgWidth]=\"14\"\n [svgSize]=\"'sm'\"\n (click)=\"onDialogClose($event)\"\n ></verbena-button>\n\n <verbena-button\n style=\"cursor: pointer\"\n type=\"button\"\n text=\"Send\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"8px\"\n pd=\"10px 20px\"\n width=\"160px\"\n height=\"39px\"\n fontWeight=\"600\"\n fontSize=\"12px\"\n svg=\"send\"\n [svgHeight]=\"14\"\n [svgWidth]=\"14\"\n [svgSize]=\"'sm'\"\n (click)=\"saveMessages()\"\n ></verbena-button>\n </div>\n </div>\n</ng-template>\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n OnInit,\n Output,\n signal,\n WritableSignal\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { FlowableStatus, OperationAction, WorkflowAction } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport {\n Connection,\n} from '../workflow-designer.types';\n\n@Component({\n selector: 'lib-action-dialog',\n templateUrl: './action-dialog.component.html',\n styleUrl: './action-dialog.component.css',\n})\nexport class ActionDialogComponent implements OnInit {\n visible = input<boolean>(false);\n actionData = input.required<Connection | null>(); // For editing existing stages\n @Output() closed = new EventEmitter();\n @Output() saved = new EventEmitter<Connection>();\n\n actionForm: FormGroup;\n\n operationActions: WritableSignal<OperationAction[]> = signal([]);\n flowableStatuses: WritableSignal<FlowableStatus[]> = signal([]);\n\n // selectedOperationAction: BehaviorSubject<OperationAction[\"Code\"] | null> = new BehaviorSubject<OperationAction[\"Code\"] | null>(null);\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService\n ) {\n this.actionForm = this.fb.group({\n Name: ['', Validators.required],\n OperationAction: [null],\n TargetStatus: [null],\n });\n\n effect(() => {\n // If actionData changes, update the form\n const actionData = this.actionData();\n if (actionData) {\n console.log(\"ACTION_DATA\", actionData);\n this.actionForm.patchValue({\n Name: actionData.label || '',\n OperationAction: actionData.action || null,\n TargetStatus: actionData.targetStatus || null,\n });\n }\n });\n }\n\n ngOnInit(): void {\n this.loadOperationActions();\n this.loadFlowableStatuses();\n }\n\n saveAction(): void {\n if (this.actionForm.valid) {\n\n const formData = this.actionForm.value as Pick<WorkflowAction, \"Name\" | \"OperationAction\" | \"TargetStatus\">;\n\n // Reset form after saving\n this.actionForm.reset();\n\n // Emit the saved data to the parent component\n\n const prevData = this.actionData();\n\n console.log(\"PREV_DATA\", prevData);\n console.log(\"FORM_DATA\", formData);\n\n if (prevData) {\n this.saved.emit({\n ...prevData,\n label: formData.Name,\n action: formData.OperationAction,\n targetStatus: formData.TargetStatus\n });\n }\n }\n }\n\n private loadOperationActions(): void {\n this.dataService.getOperationActions().then((data) => {\n this.operationActions.set(data.Result);\n });\n }\n\n private loadFlowableStatuses(): void {\n this.dataService.getFlowableStatuses().then((data) => {\n this.flowableStatuses.set(data.Result);\n });\n }\n\n onDialogClose(eventData: any) {\n console.log('Dialog closed, received data:', eventData);\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n console.log('Dialog opened, received data:', eventData);\n }\n}\n","<verben-dialogue [showCloseIcon]=\"true\" [dismissOutsideClick]=\"true\" [closeOnEscape]=\"true\" [size]=\"'medium'\"\n [mode]=\"'drawer'\" [disableFooter]=\"false\" [isVisible]=\"visible()\" [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\" [footerTemplate]=\"footerTemplate\" (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\">\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\">\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"></span>\n </button>\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <form [formGroup]=\"actionForm\" class=\"mb-4 space-y-4\">\n <verbena-input name=\"Name\" label=\"Name\" formControlName=\"Name\" placeHolder=\"Enter Name\" />\n\n <div class=\"space-y-1\">\n <label for=\"operation-action\" class=\"text-sm font-semibold text-[#3E3E3E]\">\n Operation Action\n </label>\n <verben-drop-down id=\"operation-action\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n placeholder=\"Select Operation Action\" [options]=\"operationActions()\" optionLabel=\"Name\" optionValue=\"Code\"\n formControlName=\"OperationAction\" class=\"form-control\"></verben-drop-down>\n </div>\n\n <div class=\"space-y-1\">\n <label for=\"target-status\" class=\"text-sm font-semibold text-[#3E3E3E]\">\n Target Status\n </label>\n <verben-drop-down id=\"target-status\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n placeholder=\"Select Target Status\" [options]=\"flowableStatuses()\" optionLabel=\"Description\" optionValue=\"Name\"\n formControlName=\"TargetStatus\" class=\"form-control\"></verben-drop-down>\n </div>\n </form>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div class=\"flex gap-2 items-center justify-end\">\n <verbena-button (click)=\"onDialogClose($event)\" text=\"Cancel\" styleType=\"ylw-outline\"\n class=\"ml-auto\"></verbena-button>\n <verbena-button type=\"submit\" text=\"Save\" bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\" pd=\"10px 20px\"\n width=\"114px\" height=\"39px\" (click)=\"saveAction()\" [disable]=\"actionForm.invalid\"></verbena-button>\n </div>\n</ng-template>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnInit,\n Output,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { EscalationType, Form, Workflow, WorkflowAction, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport {\n Connection,\n ConnectionPoint,\n Node,\n SwimlaneItem,\n ToolType,\n Node as WFNode,\n} from '../workflow-designer.types';\n\n@Component({\n selector: 'lib-designer-canvas',\n templateUrl: './designer-canvas.component.html',\n styleUrl: './designer-canvas.component.css',\n})\nexport class DesignerCanvasComponent implements OnInit {\n @Input() selectedTool: ToolType = null;\n @Output() clickedPosition = new EventEmitter<{ x: number; y: number }>();\n @Output() subflowSelected = new EventEmitter();\n pendingStagePosition: { swimlaneIndex: number; x: number; y: number } | null =\n null;\n @Output() showStageDialog = new EventEmitter<{\n position: any;\n isFromConnection: boolean;\n isFromDecision?: boolean;\n nodeId: string;\n }>();\n @Output() stagePropertiesUpdated = new EventEmitter<{\n nodeId: string;\n stageData: Partial<WorkflowStage>;\n }>();\n @Output() actionPropertiesUpdated = new EventEmitter<{\n connectionId: string;\n actionData: Partial<WorkflowAction>;\n }>();\n\n // Reference to the SVG element\n @ViewChild('canvas', { static: true }) canvasRef!: ElementRef<SVGElement>;\n\n @HostListener('window:mouseup', ['$event'])\n onWindowMouseUp(event: MouseEvent): void {\n // If we have a popup open but the mouse is released outside, clean up\n if (\n !this.showSubflowPopup &&\n !this.showStartNodeFormPopup &&\n !this.popupVisible && // Only end drag if no popup is visible\n this.state.isConnectionDragging()\n ) {\n console.log('External mouseup detected - cleaning up connection drag');\n this.state.endConnectionDrag();\n }\n }\n\n // Canvas dimensions\n canvasWidth = 3000;\n canvasHeight = 2000;\n\n // Grid size\n gridSize = 20;\n\n swimlaneHeight = 263;\n visibleConnectionPointsNodeId: string | null = null;\n popupVisible = false;\n popupX = 0;\n popupY = 0;\n allowedNodeTypes: string[] = [];\n\n showStartNodeFormPopup: boolean = false;\n startNodeFormsList: Form[] = [];\n isLoadingStartNodeForms: boolean = false;\n startNodeFormPopupX: number = 0;\n startNodeFormPopupY: number = 0;\n activeNodeForFormSelection: Node | null = null;\n nodeForms: WritableSignal<\n Record<string, { formId: string; formName: string }>\n > = signal({});\n\n showSubflowPopup: boolean = false;\n workflowsList: Workflow[] = [];\n isLoadingWorkflows: boolean = false;\n subflowPopupX: number = 0;\n subflowPopupY: number = 0;\n pendingSubflowPosition: {\n swimlaneIndex: number;\n x: number;\n y: number;\n } | null = null;\n\n pendingDecisionConnection: {\n decisionNodeId: string;\n swimlaneIndex: number;\n x: number;\n y: number;\n } | null = null;\n\n pendingConnectionSourcePoint: ConnectionPoint | null = null;\n pendingConnectionSourceSwimlaneIndex: number | null = null;\n\n showDecisionConditionDialog: boolean = false;\n showConditionsDialog: boolean = false;\n activeDecisionNodeId: string = '';\n activeConnectionId: string = '';\n decisionConditionPopupX: number = 0;\n decisionConditionPopupY: number = 0;\n\n isCreatingStageFromDecision: boolean = false;\n pendingDecisionCondition: string = '';\n activeStageId: string | null = null;\n activeActionId: string | null = null;\n\n showStageDialogLocal: boolean = false;\n showEscalationDialogLocal: boolean = false;\n activeEscalationType: WritableSignal<EscalationType | null> = signal(null);\n activeStageCode: WritableSignal<string | null> = signal(null);\n activeStageData: Partial<WorkflowStage> = {};\n activeActionData: Connection | null = null;\n\n showActionDialogLocal: boolean = false;\n\n potentialTargetPointId: string | null = null;\n\n constructor(\n public state: WorkflowDesignerState,\n private dataService: WorkflowDataService\n ) { }\n\n ngOnInit(): void {\n this.updateCanvasSize();\n }\n\n // Handle mouse click on canvas\n onCanvasClick(event: MouseEvent): void {\n // Only process canvas clicks if a tool is selected\n if (!this.selectedTool) {\n return;\n }\n\n // Get the position where the click occurred\n const position = this.getMousePosition(event);\n console.log(\n 'Canvas clicked at:',\n position,\n 'with tool:',\n this.selectedTool\n );\n\n // Calculate the swimlane index based on position\n // const swimlaneIndex = Math.floor(position.y / this.swimlaneHeight);\n\n // Only emit the position if we have a tool selected and it's a valid click area\n if (this.selectedTool) {\n this.clickedPosition.emit({\n x: position.x,\n y: position.y,\n });\n }\n }\n\n onShowShieldDialog(stageId: string): void {\n // Find the node\n const nodeInfo = this.state.findNodeById(stageId);\n if (nodeInfo) {\n this.activeStageId = stageId;\n this.activeStageData = { ...nodeInfo.node.stageData, id: stageId };\n console.log(this.activeStageData);\n this.showStageDialogLocal = true;\n }\n }\n\n onShowActionDialog(connectionInfo: Connection): void {\n console.log(\"CONECTION\", connectionInfo);\n // Find the node\n // const connectionInfo = this.state.findActionById(actionId);\n if (connectionInfo) {\n this.activeActionId = connectionInfo.id;\n this.activeActionData = connectionInfo;\n console.log(this.activeActionData);\n this.showActionDialogLocal = true;\n }\n }\n\n onShowEscalationDialog(event: {\n stageId: string;\n type: EscalationType;\n }): void {\n // Find the node\n const nodeInfo = this.state.findNodeById(event.stageId);\n if (nodeInfo) {\n this.activeStageId = event.stageId;\n this.activeStageData = nodeInfo.node.stageData || {\n id: this.activeStageId,\n };\n this.activeEscalationType.set(event.type);\n this.activeStageCode.set(this.activeStageData?.Code || '');\n console.log('Active Stage Data:', this.activeStageData);\n console.log('Escalation Type:', this.activeEscalationType());\n this.showEscalationDialogLocal = true;\n }\n }\n\n // Add this method to handle dialog closure\n onStageDialogClosed(): void {\n this.showStageDialogLocal = false;\n this.activeStageId = null;\n this.activeStageData = {};\n }\n\n onActionDialogClosed(): void {\n this.showActionDialogLocal = false;\n this.activeActionId = null;\n this.activeActionData = null;\n }\n\n // Add this method to handle dialog closure\n onEscalationDialogClosed(): void {\n this.showEscalationDialogLocal = false;\n this.activeStageId = null;\n this.activeEscalationType.set(null);\n this.activeStageCode.set(null);\n this.activeStageData = {};\n }\n\n // Add this method to handle saving stage data\n onStageDialogSaved(stageData: Partial<WorkflowStage>): void {\n if (this.activeStageId) {\n // Editing an existing stage\n const nodeInfo = this.state.findNodeById(this.activeStageId);\n if (nodeInfo) {\n // Update the stage data\n nodeInfo.node.stageData = {\n ...nodeInfo.node.stageData,\n ...stageData,\n };\n console.log('Updated stage data:', nodeInfo.node.stageData);\n\n // Emit event for parent component to know about the update\n this.stagePropertiesUpdated.emit({\n nodeId: this.activeStageId,\n stageData: nodeInfo.node.stageData,\n });\n }\n }\n\n // Close the dialog\n this.onStageDialogClosed();\n }\n\n onActionDialogSaved(actionData: Connection): void {\n if (this.activeActionId) {\n // Editing an existing stage\n // let connectionInfo = this.state.findActionById(this.activeActionId);\n this.state.connections = this.state.connections.map((connection, index) => {\n if (connection.id === this.activeActionId) {\n connection.label = actionData.label;\n connection.action = actionData.action;\n connection.targetStatus = actionData.targetStatus;\n console.log('Updated action data:', connection);\n }\n return connection;\n })\n }\n\n // Close the dialog\n this.onActionDialogClosed();\n }\n\n updateCanvasSize(): void {\n const requiredHeight =\n (this.state.swimlanes.length + 1) * this.swimlaneHeight;\n this.canvasHeight = Math.max(2000, requiredHeight); // Ensure we have at least our default height\n\n // Update all the swimlane clip paths when size changes\n setTimeout(() => {\n this.state.swimlanes.forEach((swimlane, index) => {\n const clipPathId = `swimlane-clip-${index}`;\n const clipPathElement = document.getElementById(clipPathId);\n if (clipPathElement) {\n const rectElement = clipPathElement.querySelector('rect');\n if (rectElement) {\n rectElement.setAttribute('width', this.canvasWidth.toString());\n }\n }\n });\n }, 0);\n }\n\n // Helper method to get the mouse position relative to the SVG canvas\n private getMousePosition(event: MouseEvent): { x: number; y: number } {\n // Use clientX/Y and getBoundingClientRect() for cross-browser compatibility\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n }\n\n showConnectionPoints(nodeId: string, swimlaneIndex: number): void {\n this.visibleConnectionPointsNodeId = nodeId;\n }\n\n isMouseOverNode(\n event: MouseEvent,\n node: WFNode,\n swimlaneIndex: number\n ): boolean {\n const position = this.getMousePosition(event);\n const nodeBounds = this.getNodeBoundsWithPadding(node, swimlaneIndex);\n\n return (\n position.x >= nodeBounds.x &&\n position.x <= nodeBounds.x + nodeBounds.width &&\n position.y >= nodeBounds.y &&\n position.y <= nodeBounds.y + nodeBounds.height\n );\n }\n\n // helper method to calculate node bounds with padding\n getNodeBoundsWithPadding(\n node: WFNode,\n swimlaneIndex: number\n ): { x: number; y: number; width: number; height: number } {\n const padding = 10; // Add 10px padding around nodes for easier hover detection\n\n // Calculate the absolute Y position including swimlane offset\n const absoluteY = node.y + swimlaneIndex * 263;\n\n return {\n x: node.x - padding,\n y: absoluteY - padding,\n width: node.width + padding * 2,\n height: node.height + padding * 2,\n };\n }\n\n hideConnectionPoints(nodeId: string): void {\n if (\n this.visibleConnectionPointsNodeId === nodeId &&\n !this.state.isConnectionDragging()\n ) {\n this.visibleConnectionPointsNodeId = null;\n }\n }\n\n isConnectionPointVisible(nodeId: string): boolean {\n return this.visibleConnectionPointsNodeId === nodeId;\n }\n\n startConnectionDrag(\n event: MouseEvent,\n point: ConnectionPoint,\n swimlaneIndex: number\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Check if this is an exit point node\n const nodeInfo = this.state.findNodeById(point.nodeId);\n if (\n nodeInfo &&\n nodeInfo.node.type === 'stage' &&\n nodeInfo.node.stageData?.IsExitPoint\n ) {\n // Don't allow connections from exit points\n console.log('Cannot create connections from exit points');\n return;\n }\n\n const position = this.getMousePosition(event);\n this.state.startConnectionDrag(\n point,\n swimlaneIndex,\n position.x,\n position.y\n );\n\n // Add mouse move and mouse up event listeners to the document\n document.addEventListener('mousemove', this.onMouseMove);\n document.addEventListener('mouseup', this.onMouseUp);\n }\n\n highlightPotentialTargets(event: MouseEvent): void {\n if (!this.state.isConnectionDragging()) return;\n\n const position = this.getMousePosition(event);\n const targetPointInfo = this.findConnectionPointAtPosition(\n position.x,\n position.y\n );\n\n if (\n targetPointInfo &&\n targetPointInfo.point.id !== this.potentialTargetPointId\n ) {\n // We have a new target point\n this.potentialTargetPointId = targetPointInfo.point.id;\n } else if (!targetPointInfo && this.potentialTargetPointId) {\n // We're no longer over a target point\n this.potentialTargetPointId = null;\n }\n }\n\n // Use arrow functions to preserve 'this' context\n onMouseMove = (event: MouseEvent) => {\n const position = this.getMousePosition(event);\n this.updateConnectionDrag(position.x, position.y);\n this.highlightPotentialTargets(event);\n };\n\n updateConnectionDrag(currentX: number, currentY: number) {\n if (this.state.draggingConnectionData.sourcePoint) {\n this.state.draggingConnectionData.currentX = currentX;\n this.state.draggingConnectionData.currentY = currentY;\n\n // Calculate which swimlane the cursor is over\n const swimlaneIndex = Math.floor(currentY / this.swimlaneHeight);\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n // Ensure the target swimlane is fully visible\n this.ensureSwimlaneInView(swimlaneIndex);\n }\n }\n }\n\n onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', this.onMouseMove);\n document.removeEventListener('mouseup', this.onMouseUp);\n\n const position = this.getMousePosition(event);\n console.log('Mouse up at position:', position);\n console.log('Is connection dragging:', this.state.isConnectionDragging());\n\n // Only proceed if we are dragging a connection\n if (!this.state.isConnectionDragging()) {\n return;\n }\n\n // Check if we're dropping onto a connection point\n const targetPointInfo = this.findConnectionPointAtPosition(\n position.x,\n position.y\n );\n\n if (targetPointInfo) {\n // We found a target connection point\n console.log('Found target connection point:', targetPointInfo);\n\n // Get the source point and swimlane index\n const sourcePoint = this.state.draggingConnectionData.sourcePoint;\n const sourceSwimlaneIndex =\n this.state.draggingConnectionData.sourceSwimlaneIndex;\n\n if (sourcePoint && sourceSwimlaneIndex !== undefined) {\n // Prevent connecting a node to itself\n if (sourcePoint.nodeId !== targetPointInfo.nodeId) {\n // Get source and target node types to check if connection is allowed\n const sourceNodeInfo = this.state.findNodeById(sourcePoint.nodeId);\n const targetNodeInfo = this.state.findNodeById(\n targetPointInfo.nodeId\n );\n\n if (\n sourceNodeInfo &&\n targetNodeInfo &&\n this.state.canConnect(\n sourceNodeInfo.node.type,\n targetNodeInfo.node.type\n )\n ) {\n // Create the connection\n const connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: targetPointInfo.nodeId,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPointInfo.point.id,\n sourceSwimlaneIndex: sourceSwimlaneIndex,\n targetSwimlaneIndex: targetPointInfo.swimlaneIndex,\n label: '',\n action: null,\n };\n\n // Add to connections array\n this.state.connections.push(connection);\n console.log('Created direct connection between nodes:', connection);\n\n // Notify about connection creation\n this.onConnectionCreated(connection);\n } else {\n console.log(\n 'Cannot connect these node types:',\n sourceNodeInfo?.node.type,\n '->',\n targetNodeInfo?.node.type\n );\n }\n } else {\n console.log('Cannot connect a node to itself');\n }\n }\n\n // End the connection drag\n this.state.endConnectionDrag();\n return;\n }\n\n // Check if the position is within any swimlane\n const isInsideSwimlane = this.isPositionInsideSwimlane(position.y);\n console.log('Is inside swimlane:', isInsideSwimlane);\n\n // Only show popup if within a swimlane\n if (isInsideSwimlane && this.state.isConnectionDragging()) {\n console.log('Showing connection popup');\n this.showConnectionPopup(position.x, position.y);\n } else {\n // End the connection drag if outside a swimlane\n console.log('Ending connection drag without showing popup');\n this.state.endConnectionDrag();\n }\n };\n\n findConnectionPointAtPosition(\n x: number,\n y: number,\n tolerance: number = 10\n ): {\n point: ConnectionPoint;\n nodeId: string;\n swimlaneIndex: number;\n } | null {\n // Iterate through all swimlanes and nodes to find connection points\n for (\n let swimlaneIndex = 0;\n swimlaneIndex < this.state.swimlanes.length;\n swimlaneIndex++\n ) {\n const swimlane = this.state.swimlanes[swimlaneIndex];\n\n if (!swimlane.nodes) continue;\n\n for (const node of swimlane.nodes) {\n if (!node.connectionPoints) continue;\n\n // Calculate the absolute position of the node (including swimlane offset)\n const absoluteNodeX = node.x;\n const absoluteNodeY = node.y + swimlaneIndex * this.swimlaneHeight;\n\n for (const point of node.connectionPoints) {\n // Calculate absolute position of the connection point\n const pointX = absoluteNodeX + point.x;\n const pointY = absoluteNodeY + point.y;\n\n // Check if the given position is within tolerance of this point\n if (\n Math.abs(x - pointX) <= tolerance &&\n Math.abs(y - pointY) <= tolerance\n ) {\n return {\n point: point,\n nodeId: node.id,\n swimlaneIndex: swimlaneIndex,\n };\n }\n }\n }\n }\n\n return null;\n }\n\n isPositionInsideSwimlane(y: number): boolean {\n // Check if y position is within any swimlane\n const swimlaneCount = this.state.swimlanes.length;\n if (swimlaneCount === 0) return false;\n\n // Each swimlane has a height of 263px\n const totalSwimlaneHeight = swimlaneCount * this.swimlaneHeight;\n\n // Check if y is within the total height of all swimlanes\n return y >= 0 && y < totalSwimlaneHeight;\n }\n\n showConnectionPopup(x: number, y: number): void {\n console.log('Showing connection popup at:', x, y);\n this.popupX = x;\n this.popupY = y;\n\n // Get allowed node types based on the source node type\n this.allowedNodeTypes = this.state.getAllowedTargetNodeTypes();\n console.log('Allowed node types:', this.allowedNodeTypes);\n\n // Only show the popup if we have allowed node types\n if (this.allowedNodeTypes.length > 0) {\n this.popupVisible = true;\n console.log('Popup visibility set to true');\n\n // Force the popup to be visible in the next tick\n setTimeout(() => {\n console.log('Is popup visible in next tick:', this.popupVisible);\n }, 0);\n } else {\n // No allowed node types, just end the drag\n console.log('No allowed node types, ending drag');\n this.state.endConnectionDrag();\n }\n }\n\n hideConnectionPopup(): void {\n console.log('Call to hide');\n this.popupVisible = false;\n this.state.endConnectionDrag();\n }\n\n // Add this handler to close the popup when clicking outside\n // @HostListener('document:click', ['$event'])\n // onDocumentClick(event: MouseEvent): void {\n // if (this.popupVisible) {\n // const popupElement = document.querySelector('verben-pop-Up');\n // if (popupElement && !popupElement.contains(event.target as Node)) {\n // this.hideConnectionPopup();\n // }\n // }\n // }\n\n createNodeConnection(nodeType: string): void {\n const pathData = this.state.getConnectionPathData();\n if (!pathData) {\n this.hideConnectionPopup();\n return;\n }\n\n // Check if this node type is allowed to be created\n const allowedTypes = this.state.getAllowedTargetNodeTypes();\n if (!allowedTypes.includes(nodeType)) {\n console.error(\n `Cannot create connection to ${nodeType} from current node type`\n );\n this.hideConnectionPopup();\n return;\n }\n\n const { endX, endY, sourceSwimlaneIndex } = pathData;\n\n // Get source node info\n const sourcePoint = this.state.draggingConnectionData.sourcePoint;\n if (!sourcePoint) {\n this.hideConnectionPopup();\n return;\n }\n\n const sourceNodeInfo = this.state.findNodeById(sourcePoint.nodeId);\n if (!sourceNodeInfo) {\n this.hideConnectionPopup();\n return;\n }\n\n // If connecting from a decision to a stage, show condition popup first\n if (sourceNodeInfo.node.type === 'decision' && nodeType === 'stage') {\n // Store information for later stage creation\n this.pendingDecisionConnection = {\n decisionNodeId: sourceNodeInfo.node.id,\n swimlaneIndex: sourceSwimlaneIndex,\n x: endX,\n y: endY,\n };\n\n // Calculate popup position - position it near the decision node\n const swimlaneOffsetY = sourceSwimlaneIndex * 263;\n\n // Center the popup over the connection endpoint\n this.decisionConditionPopupX = endX;\n this.decisionConditionPopupY = endY - 150; // Position above the endpoint\n\n // Set decision node ID\n this.activeDecisionNodeId = sourceNodeInfo.node.id;\n this.showDecisionConditionDialog = true;\n\n // End the connection drag\n this.hideConnectionPopup();\n return;\n }\n\n const swimlaneIndex = Math.floor(endY / this.swimlaneHeight);\n const swimlaneTop = swimlaneIndex * this.swimlaneHeight;\n // Calculate swimlane-relative position\n const swimlaneOffsetY = sourceSwimlaneIndex * 263;\n let relativeY = endY - swimlaneOffsetY - 50; // Add half node height for better alignment\n const swimlaneBottom = swimlaneTop + 263;\n\n // Clamp nodeY so node stays within swimlane\n\n console.log(endY, swimlaneIndex, swimlaneOffsetY, swimlaneBottom);\n\n if (endY - 50 < swimlaneTop) {\n console.log('Less');\n relativeY = swimlaneTop; // Node would overflow above, so align to top\n } else if (endY + 50 > swimlaneBottom) {\n console.log('More');\n relativeY = swimlaneBottom - 100; // Node would overflow below, so align to bottom\n }\n\n // Handle preconditions based on node type\n if (nodeType === 'stage') {\n // Create the stage directly with default properties\n const newNode = this.state.addNode(\n sourceSwimlaneIndex,\n 'stage',\n endX,\n relativeY,\n { Name: 'New Stage' } // Add default properties\n );\n\n if (\n newNode &&\n newNode.connectionPoints &&\n newNode.connectionPoints.length > 0 &&\n sourcePoint\n ) {\n // Handle connection creation\n const opposingType = {\n right: 'left',\n left: 'right',\n top: 'bottom',\n bottom: 'top',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n const targetPoint = newNode.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create the connection\n const connection = this.state.createConnection(\n newNode.id,\n targetPoint.id,\n sourceSwimlaneIndex\n );\n\n if (connection) {\n this.onConnectionCreated(connection);\n }\n }\n }\n\n this.hideConnectionPopup();\n return;\n } else if (nodeType === 'subflow') {\n console.log(\n 'Creating subflow from connection at:',\n endX,\n endY,\n 'swimlane:',\n sourceSwimlaneIndex\n );\n // Show workflow selection popup and store connection data for later use\n this.showSubflowSelectionPopup(endX, endY, sourceSwimlaneIndex);\n this.hideConnectionPopup();\n return;\n }\n\n // For other nodes Create the new node at the end position of the connection\n const newNode = this.state.addNode(\n sourceSwimlaneIndex,\n nodeType as ToolType,\n endX,\n relativeY\n );\n\n if (\n newNode &&\n newNode.connectionPoints &&\n newNode.connectionPoints.length > 0\n ) {\n // Find the most appropriate connection point (closest to the source)\n if (sourcePoint) {\n // For simplicity, use the first connection point of opposing type\n // In a real implementation, you'd find the closest or most appropriate point\n let targetPoint;\n\n // If source is on right, target should be on left, etc.\n const opposingType = {\n right: 'left',\n left: 'right',\n top: 'bottom',\n bottom: 'top',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n targetPoint = newNode.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create the connection\n const connection = this.state.createConnection(\n newNode.id,\n targetPoint.id,\n sourceSwimlaneIndex\n );\n\n if (connection) {\n this.onConnectionCreated(connection);\n }\n }\n }\n }\n\n if (sourceNodeInfo) {\n this.updateNodeConnections(sourceNodeInfo.node);\n }\n\n // End the connection drag\n this.hideConnectionPopup();\n }\n\n // Method to handle saving the condition\n onDecisionConditionSaved(event: {\n connectionId: string;\n condition: string;\n }): void {\n if (!this.pendingDecisionConnection) {\n this.showDecisionConditionDialog = false;\n return;\n }\n\n const { decisionNodeId, swimlaneIndex, x, y } =\n this.pendingDecisionConnection;\n\n // Create the stage directly with default properties\n const node = this.state.addNode(\n swimlaneIndex,\n 'stage',\n x,\n y,\n { Name: 'New Stage' } // Add default properties\n );\n\n if (node) {\n const decisionNodeInfo = this.state.findNodeById(decisionNodeId);\n\n if (\n decisionNodeInfo &&\n node.connectionPoints &&\n node.connectionPoints.length > 0\n ) {\n // Find a suitable connection point from the decision node\n const decisionNode = decisionNodeInfo.node;\n const decisionNodePoints = decisionNode.connectionPoints || [];\n const sourcePoint = decisionNodePoints.find(\n (p) => p.type === 'right' || p.type === 'bottom'\n );\n\n if (sourcePoint) {\n // Find opposing type connection point on the new stage\n const opposingType = {\n right: 'left',\n bottom: 'top',\n left: 'right',\n top: 'bottom',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n const targetPoint = node.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create connection with condition\n const connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: decisionNode.id,\n targetNodeId: node.id,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPoint.id,\n sourceSwimlaneIndex: decisionNodeInfo.swimlaneIndex,\n targetSwimlaneIndex: swimlaneIndex,\n condition: event.condition,\n label: '',\n action: null,\n };\n\n // Add connection to the state\n this.state.connections.push(connection);\n console.log(\n 'Created decision connection with condition:',\n connection\n );\n }\n }\n }\n }\n\n // Clear pending data\n this.pendingDecisionConnection = null;\n this.pendingDecisionCondition = '';\n\n // Hide the condition popup\n this.showDecisionConditionDialog = false;\n }\n\n onDecisionConditionCancelled(): void {\n this.showDecisionConditionDialog = false;\n // Don't create the stage or connection\n }\n\n getConnectionPath(): string {\n const pathData = this.state.getConnectionPathData();\n if (!pathData) return '';\n\n const { startX, startY, endX, endY } = pathData;\n const sourcePoint = this.state.draggingConnectionData.sourcePoint;\n\n if (!sourcePoint) return '';\n\n return this.getOrthogonalPath(startX, startY, endX, endY, sourcePoint.type);\n }\n\n getConnectionPathForSavedConnection(connection: Connection): string {\n try {\n const pathData = this.state.getConnectionData(connection);\n if (!pathData) {\n console.error('No path data for connection:', connection);\n return '';\n }\n\n const { startX, startY, endX, endY } = pathData;\n\n const sourceNodeInfo = this.state.findNodeById(connection.sourceNodeId);\n if (!sourceNodeInfo) {\n console.error('Source node not found for connection:', connection);\n return '';\n }\n\n const sourceNode = sourceNodeInfo.node;\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n\n if (!sourcePoint) {\n console.error('Source point not found for connection:', connection);\n return '';\n }\n\n return this.getOrthogonalPath(\n startX,\n startY,\n endX,\n endY,\n sourcePoint.type\n );\n } catch (error) {\n console.error('Error generating path for connection:', connection, error);\n return '';\n }\n }\n\n getOrthogonalPath(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n pointType: 'top' | 'right' | 'bottom' | 'left'\n ): string {\n // Determine initial direction based on connection point type\n let path = '';\n\n // For side points (left/right), start with horizontal line\n if (pointType === 'left' || pointType === 'right') {\n // Calculate horizontal distance\n const horizontalDist = endX - startX;\n\n // If the end point is very close horizontally, use a simple 3-segment path\n if (Math.abs(horizontalDist) < 30) {\n const midY = (startY + endY) / 2;\n path = `M ${startX} ${startY} H ${endX} V ${midY} V ${endY}`;\n }\n // Otherwise, create a path with horizontal segment first, then vertical, then horizontal\n else {\n path = `M ${startX} ${startY} H ${startX + horizontalDist / 2\n } V ${endY} H ${endX}`;\n }\n }\n // For top/bottom points, start with vertical line\n else if (pointType === 'top' || pointType === 'bottom') {\n // Calculate vertical distance\n const verticalDist = endY - startY;\n\n // If the end point is very close vertically, use a simple 3-segment path\n if (Math.abs(verticalDist) < 30) {\n const midX = (startX + endX) / 2;\n path = `M ${startX} ${startY} V ${endY} H ${midX} H ${endX}`;\n }\n // Otherwise, create a path with vertical segment first, then horizontal, then vertical\n else {\n path = `M ${startX} ${startY} V ${startY + verticalDist / 2\n } H ${endX} V ${endY}`;\n }\n }\n\n return path;\n }\n\n selectFormForStage(form: Form | null, node: Node) {\n // If form is null, we're clearing the selection\n if (node) {\n if (!node.stageData) {\n node.stageData = {};\n }\n\n if (form) {\n node.stageData.formId = form.Code;\n node.stageData.formName = form.Name;\n } else {\n // Clear form selection\n delete node.stageData.formId;\n delete node.stageData.formName;\n }\n\n // Emit an event to update the stage data\n this.onStagePropertiesUpdated({\n nodeId: node.id,\n stageData: node.stageData,\n });\n }\n }\n\n onStagePropertiesUpdated(event: {\n nodeId: string;\n stageData: Partial<WorkflowStage>;\n }): void {\n // Find the node in the swimlanes\n for (let i = 0; i < this.state.swimlanes.length; i++) {\n const swimlane = this.state.swimlanes[i];\n const nodeIndex = swimlane.nodes?.findIndex((n) => n.id === event.nodeId);\n\n if (nodeIndex !== undefined && nodeIndex >= 0) {\n // Update the stage data\n if (swimlane.nodes) {\n swimlane.nodes[nodeIndex].stageData = {\n ...swimlane.nodes[nodeIndex].stageData,\n ...event.stageData,\n };\n console.log(\n 'Updated stage data in swimlane:',\n i,\n 'node:',\n nodeIndex,\n 'data:',\n swimlane.nodes[nodeIndex].stageData\n );\n }\n break;\n }\n }\n }\n\n onConnectionCreated(connection: Connection): void {\n // After a connection is created, refresh the source node to update its state\n const sourceNodeInfo = this.state.findNodeById(connection.sourceNodeId);\n if (sourceNodeInfo && sourceNodeInfo.node.type === 'stage') {\n // Refresh node state\n this.updateNodeConnections(sourceNodeInfo.node);\n }\n }\n\n // Helper method to update node's connection status\n updateNodeConnections(node: WFNode): void {\n // Count the number of outgoing connections that connect to stages\n const outgoingConnections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === node.id\n );\n\n // Check if the target nodes are stages\n const connectedStageNodes = outgoingConnections\n .map((conn) => this.state.findNodeById(conn.targetNodeId))\n .filter((nodeInfo) => nodeInfo && nodeInfo.node.type === 'stage');\n\n node.hasMultipleConnectedStages = connectedStageNodes.length > 1;\n node.hasParallelStages = connectedStageNodes.every(\n (nd) => nd?.node.stageData?.IsParallel\n );\n }\n\n onEditSwimlane(\n event: MouseEvent,\n swimlane: SwimlaneItem,\n swimlaneIndex: number\n ): void {\n event.stopPropagation(); // Prevent the canvas click event from firing\n event.preventDefault();\n console.log('Edit swimlane button clicked for swimlane:', swimlaneIndex);\n\n // Emit a special event for editing a swimlane\n this.clickedPosition.emit({\n x: -1, // Special value to indicate edit mode\n y: swimlaneIndex,\n });\n }\n\n // showStartNodeFormPopup(event: MouseEvent): void {\n // event.preventDefault();\n // event.stopPropagation();\n\n // // Implementation will be similar to the stage form popup\n // // We'll need to add UI elements for this\n // console.log('Start node form popup requested');\n\n // // For now, this is a placeholder\n // // The actual implementation would load forms and add them to the workflow\n // }\n\n toggleStartNodeFormPopup(\n event: MouseEvent,\n nodeX: number,\n nodeY: number,\n swimlaneIndex: number,\n node?: Node\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Set popup position\n const swimlaneOffset = swimlaneIndex * 263;\n this.startNodeFormPopupX = nodeX - (!node ? 30 : 0); // Position near the start node\n this.startNodeFormPopupY = nodeY + swimlaneOffset;\n\n // If we're opening the popup, load forms\n if (!this.showStartNodeFormPopup) {\n this.isLoadingStartNodeForms = true;\n this.dataService\n .getForms()\n .then((response) => {\n this.startNodeFormsList = response.Result;\n this.isLoadingStartNodeForms = false;\n })\n .catch((error) => {\n console.error('Error loading forms:', error);\n this.isLoadingStartNodeForms = false;\n });\n }\n\n if (node) {\n this.activeNodeForFormSelection = node;\n console.log('Active node for form selection:', node);\n } else {\n this.activeNodeForFormSelection = null;\n }\n\n this.showStartNodeFormPopup = !this.showStartNodeFormPopup;\n }\n\n selectStartNodeForm(form: Form | null): void {\n if (this.activeNodeForFormSelection) {\n this.selectFormForStage(form, this.activeNodeForFormSelection);\n } else {\n if (form) {\n this.state.setWorkflowForm(form.Code, form.Name);\n } else {\n this.state.setWorkflowForm(null, null);\n }\n }\n\n // Close the popup\n this.showStartNodeFormPopup = false;\n }\n\n showSubflowSelectionPopup(x: number, y: number, swimlaneIndex: number): void {\n this.subflowPopupX = x;\n this.subflowPopupY = y;\n this.pendingSubflowPosition = { swimlaneIndex, x, y };\n\n // Store connection data if we're creating from a connection\n if (this.state.isConnectionDragging()) {\n // Store the source connection data\n this.pendingConnectionSourcePoint =\n this.state.draggingConnectionData.sourcePoint ?? null;\n this.pendingConnectionSourceSwimlaneIndex =\n this.state.draggingConnectionData.sourceSwimlaneIndex ?? null;\n console.log('Stored connection data for subflow:', {\n sourcePoint: this.pendingConnectionSourcePoint,\n sourceSwimlaneIndex: this.pendingConnectionSourceSwimlaneIndex,\n });\n }\n\n // Load workflows\n this.isLoadingWorkflows = true;\n this.dataService\n .getWorkflows()\n .then((response) => {\n this.workflowsList = response.Result;\n this.isLoadingWorkflows = false;\n })\n .catch((error) => {\n console.error('Error loading workflows:', error);\n this.isLoadingWorkflows = false;\n });\n\n this.showSubflowPopup = true;\n }\n\n selectSubflowWorkflow(workflow: Workflow): void {\n console.log('Selecting workflow for subflow:', workflow.Name);\n console.log('Pending connection data:', {\n sourcePoint: this.pendingConnectionSourcePoint,\n sourceSwimlaneIndex: this.pendingConnectionSourceSwimlaneIndex,\n position: this.pendingSubflowPosition,\n });\n\n if (this.pendingSubflowPosition) {\n const { swimlaneIndex, x, y } = this.pendingSubflowPosition;\n\n // Create the subflow node with the selected workflow data\n const node = this.state.addNode(\n swimlaneIndex,\n 'subflow',\n x,\n y,\n undefined, // No stage data\n { id: workflow.Code, name: workflow.Name }\n );\n\n console.log('Created subflow node:', node);\n\n // If this was created from a connection, create the connection\n if (node && this.pendingConnectionSourcePoint) {\n console.log('Creating connection to new subflow node');\n\n // Find a suitable connection point on the new node\n if (node.connectionPoints && node.connectionPoints.length > 0) {\n const sourcePoint = this.pendingConnectionSourcePoint;\n\n // Find opposing type connection point\n const opposingType = {\n right: 'left',\n left: 'right',\n top: 'bottom',\n bottom: 'top',\n }[sourcePoint.type] as 'top' | 'right' | 'bottom' | 'left';\n\n const targetPoint = node.connectionPoints.find(\n (p) => p.type === opposingType\n );\n\n if (targetPoint) {\n // Create connection\n const connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: node.id,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPoint.id,\n sourceSwimlaneIndex: this.pendingConnectionSourceSwimlaneIndex!,\n targetSwimlaneIndex: swimlaneIndex,\n label: '',\n action: null,\n };\n\n // Add connection directly to the state's connections array\n this.state.connections.push(connection);\n console.log('Added connection to state:', connection);\n console.log('Connections after adding:', this.state.connections);\n this.onConnectionCreated(connection);\n }\n }\n this.state.endConnectionDrag();\n }\n\n // Reset selection tool in parent component\n this.subflowSelected.emit();\n }\n\n // Clean up\n this.showSubflowPopup = false;\n this.pendingSubflowPosition = null;\n this.pendingConnectionSourcePoint = null;\n this.pendingConnectionSourceSwimlaneIndex = null;\n }\n\n showDecisionConditionsPopup(\n event: MouseEvent,\n node: WFNode,\n swimlaneIndex: number\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n // Get the position for the popup\n const position = this.getMousePosition(event);\n const globalX = position.x;\n const globalY = position.y;\n\n // Find all connections from this decision node\n const connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId === node.id\n );\n\n if (connections.length === 0) {\n // No connections to show\n return;\n }\n\n // Show the decision conditions popup\n this.activeDecisionNodeId = node.id;\n this.decisionConditionPopupX = globalX;\n this.decisionConditionPopupY = globalY;\n\n // Set the correct popup visibility flag - this is likely the issue\n this.showDecisionConditionDialog = true;\n\n console.log('Showing decision popup:', {\n x: globalX,\n y: globalY,\n nodeId: node.id,\n isVisible: this.showDecisionConditionDialog,\n });\n }\n\n ensureSwimlaneInView(swimlaneIndex: number): void {\n // Ensure we have enough swimlanes visible\n const requiredHeight = (swimlaneIndex + 1) * this.swimlaneHeight;\n if (this.canvasHeight < requiredHeight) {\n this.canvasHeight = requiredHeight;\n }\n }\n\n getLabelPosition(connection: Connection): { x: number; y: number } {\n try {\n const pathData = this.state.getConnectionData(connection);\n if (!pathData) {\n console.error('No path data for connection:', connection);\n return { x: 0, y: 0 };\n }\n\n const { startX, startY, endX, endY } = pathData;\n\n const sourceNodeInfo = this.state.findNodeById(connection.sourceNodeId);\n if (!sourceNodeInfo) {\n console.error('Source node not found for connection:', connection);\n return { x: 0, y: 0 };\n }\n\n const sourceNode = sourceNodeInfo.node;\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n\n if (!sourcePoint) {\n console.error('Source point not found for connection:', connection);\n return { x: 0, y: 0 };\n }\n\n // Calculate midpoint based on the connection point type\n if (sourcePoint.type === 'left' || sourcePoint.type === 'right') {\n const horizontalDist = endX - startX;\n\n if (Math.abs(horizontalDist) < 30) {\n // For short horizontal connections\n const midY = (startY + endY) / 2;\n return {\n x: startX + (endX - startX) / 2,\n y: midY,\n };\n } else {\n // For regular connections starting horizontally\n const midX = startX + horizontalDist / 2;\n const midY = endY;\n return {\n x: midX,\n y: (startY + endY) / 2,\n };\n }\n } else {\n // 'top' or 'bottom'\n const verticalDist = endY - startY;\n\n if (Math.abs(verticalDist) < 30) {\n // For short vertical connections\n const midX = (startX + endX) / 2;\n return {\n x: midX - 75, // Minus 75 - which is half the width of the label itself\n y: startY + (endY - startY) / 2,\n };\n } else {\n // For regular connections starting vertically\n const midX = endX;\n const midY = startY + verticalDist / 2;\n return {\n x: ((startX + endX) / 2) - 75, // Minus 75 - which is half the width of the label itself\n y: midY,\n };\n }\n }\n } catch (error) {\n console.error(\n 'Error calculating label position for connection:',\n connection,\n error\n );\n return { x: 0, y: 0 };\n }\n }\n\n saveConnectionLabel(connection: Connection, label: string) {\n // Update the connection label in the state\n this.state.connections = this.state.connections.map((conn) => {\n if (conn.id === connection.id) {\n return {\n ...conn,\n label: label,\n };\n }\n return conn;\n });\n }\n}\n","<div class=\"canvas-container\">\n <svg\n #canvas\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"canvasHeight\"\n class=\"designer-canvas\"\n (click)=\"onCanvasClick($event)\"\n >\n <defs>\n <!-- Grid pattern definition -->\n\n <pattern\n id=\"grid\"\n [attr.width]=\"gridSize\"\n [attr.height]=\"gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n d=\"M 20 0 L 0 0 0 20\"\n fill=\"none\"\n stroke=\"#e2e8f0\"\n stroke-width=\"0.5\"\n />\n </pattern>\n\n <!-- Arrow head marker definition -->\n <marker\n id=\"arrowhead\"\n markerWidth=\"10\"\n markerHeight=\"7\"\n refX=\"9\"\n refY=\"3.5\"\n orient=\"auto\"\n >\n <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n </marker>\n\n <!-- Connection point styles -->\n <circle\n id=\"connection-point-template\"\n r=\"5\"\n fill=\"#D36CFF\"\n stroke=\"#FFFFFF\"\n stroke-width=\"1\"\n />\n\n <!-- Dashed line style for connection preview -->\n <pattern\n id=\"dashed-line\"\n width=\"10\"\n height=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"5\"\n x2=\"10\"\n y2=\"5\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n />\n </pattern>\n\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <clipPath [attr.id]=\"'swimlane-clip-' + swimlane.order\">\n <rect x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" height=\"263\" />\n </clipPath>\n }\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Display a message when no swimlanes exist -->\n @if (state.swimlanes.length === 0) {\n <text\n x=\"50%\"\n y=\"50%\"\n font-family=\"sans-serif\"\n font-size=\"16\"\n fill=\"#94a3b8\"\n text-anchor=\"middle\"\n >\n Select the Swimlane tool and click on the canvas to add a swimlane\n </text>\n }\n\n <!-- This is where workflow elements will be added later -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- <g\n [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\"\n [attr.clip-path]=\"'url(#swimlane-clip-' + swimlane.order + ')'\"\n >\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n fill=\"#ffffff\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n height=\"40\"\n fill=\"#f8fafc\"\n stroke=\"#e2e8f0\"\n stroke-width=\"1\"\n ></rect>\n\n <text\n x=\"20\"\n y=\"25\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n font-weight=\"bold\"\n >\n {{ swimlane.label }}\n </text>\n\n <g\n class=\"edit-swimlane-button\"\n [attr.transform]=\"'translate(100, 20)'\"\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"-5\"\n y=\"-15\"\n width=\"40\"\n height=\"20\"\n fill=\"#f3e8ff\"\n rx=\"3\"\n ry=\"3\"\n stroke=\"#d8b4fe\"\n stroke-width=\"1\"\n ></rect>\n <text\n x=\"15\"\n y=\"0\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#7e22ce\"\n text-anchor=\"middle\"\n >\n Edit\n </text>\n </g>\n\n <g [attr.transform]=\"'translate(200, 20)'\">\n @for (tag of swimlane.tags.slice(0, 3); track tag.Name; let i = $index)\n {\n <text\n [attr.x]=\"i * 100\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n {{ tag.Name }}\n </text>\n } @if (swimlane.tags.length > 3) {\n <text\n [attr.x]=\"3 * 100 + 10\"\n y=\"5\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"#666666\"\n >\n +{{ swimlane.tags.length - 3 }} more\n </text>\n }\n </g>\n </g> -->\n\n <g [attr.transform]=\"'translate(0,' + swimlane.order * 263 + ')'\">\n <!-- Swimlane container - remove stroke to make it purely background -->\n <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"canvasWidth\"\n [attr.height]=\"263\"\n [attr.fill]=\"swimlane.order % 2 === 0 ? '#FCF3FF' : '#ECFFF5'\"\n stroke=\"none\"\n ></rect>\n\n <!-- Vertical swimlane label on the left -->\n <g class=\"swimlane-label\">\n <!-- Purple background for the label -->\n <rect\n x=\"0.5\"\n y=\"0.5\"\n width=\"43\"\n height=\"215\"\n rx=\"10.5\"\n fill=\"white\"\n stroke=\"#D36CFF\"\n ></rect>\n\n <!-- Plus button at the top -->\n <g\n (click)=\"\n onEditSwimlane($event, swimlane, swimlane.order);\n $event.stopPropagation()\n \"\n >\n <rect\n x=\"12.5\"\n y=\"10\"\n width=\"18\"\n height=\"18\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n ></rect>\n\n <path\n d=\"M22.52 12.174V17.08H27.47V18.51H22.52V23.394H21.2V18.51H16.25V17.08H21.2V12.174H22.52Z\"\n fill=\"#0000FF\"\n class=\"plus-icon\"\n style=\"cursor: pointer\"\n ></path>\n </g>\n\n <!-- Swimlane label -->\n <text\n x=\"22\"\n y=\"106\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#333333\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 100)\"\n >\n {{\n swimlane.label.length > 12\n ? swimlane.label.substring(0, 10) + \"...\"\n : swimlane.label\n }}\n </text>\n\n <!-- Tag count indicator at the bottom -->\n <rect\n x=\"11.5\"\n y=\"187\"\n width=\"21\"\n height=\"19\"\n rx=\"9.5\"\n fill=\"#9E9E9E\"\n ></rect>\n <text\n x=\"24\"\n y=\"206\"\n font-family=\"sans-serif\"\n font-size=\"12\"\n fill=\"black\"\n text-anchor=\"middle\"\n transform=\"rotate(-90, 22, 200)\"\n >\n {{ swimlane.tags.length }}\n </text>\n </g>\n </g>\n\n }\n\n <!-- Nodes -->\n @for (swimlane of state.swimlanes; track swimlane.order) {\n <!-- Render nodes in this swimlane -->\n @for (node of swimlane.nodes; track node.id) {\n <g\n class=\"node-element\"\n [attr.transform]=\"\n 'translate(' + node.x + ',' + (node.y - swimlane.order * 263) + ')'\n \"\n (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseleave)=\"hideConnectionPoints(node.id)\"\n >\n <!-- Start node indicator (circle and arrow) for the first node -->\n @if (node.isStartNode) {\n <!-- Circle -->\n <circle\n cx=\"-50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></circle>\n <!-- Form icon for start node -->\n <svg:g\n (click)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n \"\n class=\"stage-icon\"\n transform=\"translate(-45, 42)\"\n style=\"cursor: pointer; pointer-events: all\"\n >\n <!-- Transparent rectangle to capture clicks -->\n <svg:rect\n x=\"-2\"\n y=\"-2\"\n width=\"24\"\n height=\"24\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M16.5 20.475V17.475H13.5V16.475H16.5V13.475H17.5V16.475H20.5V17.475H17.5V20.475H16.5ZM3.5 17.5V16.5H4.5V17.5H3.5ZM6.5 17.5V16.5H11.517C11.5057 16.6767 11.5043 16.845 11.513 17.005C11.521 17.165 11.531 17.33 11.543 17.5H6.5ZM3.5 13.5V12.5H4.5V13.5H3.5ZM6.5 13.5V12.5H13.804C13.6127 12.6387 13.4333 12.7913 13.266 12.958C13.0993 13.1247 12.9377 13.3053 12.781 13.5H6.5ZM3.5 9.5V8.5H4.5V9.5H3.5ZM6.5 9.5V8.5H18.5V9.5H6.5ZM3.5 5.5V4.5H4.5V5.5H3.5ZM6.5 5.5V4.5H18.5V5.5H6.5Z\"\n [attr.fill]=\"state.workflowFormId ? '#D36CFF' : 'black'\"\n transform=\"scale(0.7)\"\n />\n </svg:g>\n <!-- Arrow from circle to node -->\n <path\n d=\"M -20 50 L 0 50\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n }\n\n <!-- Exit point indicator (circle and arrow) -->\n @if (node.stageData?.IsExitPoint) {\n <!-- Arrow from node to circle -->\n <path\n [attr.d]=\"'M ' + node.width + ' 50 L ' + (node.width + 20) + ' 50'\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n <!-- Circle -->\n <circle\n [attr.cx]=\"node.width + 50\"\n cy=\"50\"\n r=\"30\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n ></circle>\n }\n\n <!-- Stage node -->\n @if (node.type === 'stage') {\n <!-- <rect\n x=\"0\"\n y=\"0\"\n [attr.width]=\"node.width\"\n [attr.height]=\"node.height\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></rect> -->\n <svg:g\n lib-stage-node\n [node]=\"node\"\n [isStartNode]=\"node.isStartNode\"\n (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\"\n (showShieldDialog)=\"onShowShieldDialog($event)\"\n (showEscalationDialog)=\"onShowEscalationDialog($event)\"\n (showFormDialog)=\"\n toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n \"\n ></svg:g>\n }\n\n <!-- Decision node -->\n @if (node.type === 'decision') {\n <path\n [attr.d]=\"\n 'M 0 ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' 0' +\n ' L ' +\n node.width +\n ' ' +\n node.height / 2 +\n ' L ' +\n node.width / 2 +\n ' ' +\n node.height +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n\n <!-- Decision node condition indicator icon -->\n <svg:g\n (click)=\"showDecisionConditionsPopup($event, node, swimlane.order)\"\n class=\"decision-condition-icon\"\n [attr.transform]=\"\n 'translate(' +\n (node.width / 2 - 10) +\n ',' +\n (node.height / 2 - 10) +\n ')'\n \"\n >\n <svg:rect\n x=\"-5\"\n y=\"-5\"\n width=\"30\"\n height=\"30\"\n fill=\"transparent\"\n style=\"cursor: pointer\"\n />\n <svg:path\n d=\"M10 0H20V2H10V0ZM10 8H20V10H10V8ZM10 4H20V6H10V4ZM0 0H8V2H0V0ZM0 8H8V10H0V8ZM0 4H8V6H0V4Z\"\n fill=\"#D36CFF\"\n />\n </svg:g>\n }\n\n <!-- Form node -->\n @if (node.type === 'form') {\n <path\n d=\"M95.0625 50.5591V95.0625C95.0625 97.9716 93.9069 100.762 91.8498 102.819C89.7928 104.876 87.0028 106.031 84.0938 106.031H32.9062C29.9972 106.031 27.2072 104.876 25.1502 102.819C23.0931 100.762 21.9375 97.9716 21.9375 95.0625V21.9375C21.9375 19.0284 23.0931 16.2385 25.1502 14.1814C27.2072 12.1244 29.9972 10.9688 32.9062 10.9688H55.4722C57.4109 10.969 59.2701 11.7392 60.6412 13.1099L92.9213 45.3901C94.292 46.7611 95.0622 48.6204 95.0625 50.5591Z\"\n transform=\"scale(0.7)\"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M58.5 12.7969V40.2188C58.5 42.1581 59.2704 44.0181 60.6418 45.3895C62.0131 46.7608 63.8731 47.5312 65.8125 47.5312H93.2344\"\n transform=\"scale(0.7)\"\n stroke=\"#D36CFF\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <text\n x=\"50%\"\n y=\"50%\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"14\"\n fill=\"#D36CFF\"\n >\n Form\n </text>\n }\n\n <!-- Subflow node -->\n @if (node.type === 'subflow') {\n <path\n [attr.d]=\"\n 'M 1 ' +\n node.height / 4 +\n ' L ' +\n node.width / 2 +\n ' 1 L ' +\n (node.width - 1) +\n ' ' +\n node.height / 4 +\n ' V ' +\n (node.height * 3) / 4 +\n ' L ' +\n node.width / 2 +\n ' ' +\n (node.height - 1) +\n ' L 1 ' +\n (node.height * 3) / 4 +\n ' Z'\n \"\n fill=\"none\"\n stroke=\"#D36CFF\"\n stroke-width=\"1\"\n ></path>\n <text\n [attr.x]=\"node.width / 2\"\n [attr.y]=\"node.height / 2\"\n text-anchor=\"middle\"\n alignment-baseline=\"middle\"\n font-family=\"sans-serif\"\n font-size=\"10\"\n fill=\"#000000\"\n >\n <!-- Limit text length -->\n {{\n (node.workflowData?.name || \"Subflow\").length > 12\n ? (node.workflowData?.name || \"Subflow\").substring(0, 10) + \"...\"\n : node.workflowData?.name || \"Subflow\"\n }}\n </text>\n }\n\n <!-- Connection points for this node -->\n @for (point of node.connectionPoints || []; track point.id) { @if\n (isConnectionPointVisible(node.id)) {\n <use\n [attr.href]=\"'#connection-point-template'\"\n [attr.x]=\"point.x\"\n [attr.y]=\"point.y\"\n [attr.id]=\"point.id\"\n (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\"\n />\n } }\n </g>\n <!-- A transparent hover area for improved hover detection -->\n <rect\n [attr.x]=\"node.x - 10\"\n [attr.y]=\"node.y - 10\"\n [attr.width]=\"node.width + 20\"\n [attr.height]=\"node.height + 20\"\n fill=\"transparent\"\n (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n (mouseout)=\"hideConnectionPoints(node.id)\"\n style=\"pointer-events: none\"\n />\n } }\n\n <!-- Connections -->\n @for (connection of state.connections; track connection.id) {\n <g class=\"connection-element\">\n <path\n [attr.d]=\"getConnectionPathForSavedConnection(connection)\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n fill=\"none\"\n marker-end=\"url(#arrowhead)\"\n ></path>\n\n <!-- Connection Label -->\n @if (connection.sourceNodeId && connection.targetNodeId) {\n <foreignObject\n [attr.x]=\"getLabelPosition(connection).x\"\n [attr.y]=\"getLabelPosition(connection).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible; pointer-events: all;\"\n [attr.transform]=\"'translate(-75, -10)'\"\n >\n <wf-label-editor\n [label]=\"connection.label || 'New Action'\"\n [x]=\"0\"\n [y]=\"0\"\n [isConnection]=\"true\"\n (labelChange)=\"saveConnectionLabel(connection, $event)\"\n (openDialog)=\"onShowActionDialog(connection)\"\n />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Connection preview line -->\n @if (state.isConnectionDragging()) {\n <g>\n <path\n [attr.d]=\"getConnectionPath()\"\n stroke=\"#D36CFF\"\n stroke-width=\"2\"\n stroke-dasharray=\"5,5\"\n fill=\"none\"\n ></path>\n </g>\n }\n </svg>\n\n <div\n *ngIf=\"popupVisible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n >\n <verben-pop-Up\n [dropdownOpen]=\"true\"\n [customStyles]=\"{ 'z-index': '99' }\"\n [enableMouseLeave]=\"false\"\n (dropdownOpenChange)=\"$event ? null : hideConnectionPopup()\"\n >\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md\"\n dropdown-content\n >\n <h4 class=\"mb-2 font-medium\">Create Connection</h4>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngFor=\"let type of allowedNodeTypes\">\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"createNodeConnection(type)\"\n >\n Create {{ type | titlecase }}\n </button>\n </ng-container>\n <button\n class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n (click)=\"hideConnectionPopup()\"\n >\n Cancel\n </button>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showStartNodeFormPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"startNodeFormPopupX\"\n [style.top.px]=\"startNodeFormPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow Form</h4>\n <div *ngIf=\"isLoadingStartNodeForms\" class=\"text-center py-2\">\n Loading forms...\n </div>\n <div *ngIf=\"!isLoadingStartNodeForms\" class=\"max-h-48 overflow-y-auto\">\n <div class=\"mb-2\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(null)\"\n >\n Clear form selection\n </button>\n </div>\n <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectStartNodeForm(form)\"\n >\n {{ form.Name }}\n </button>\n </div>\n <div\n *ngIf=\"startNodeFormsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No forms available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <div\n *ngIf=\"showSubflowPopup\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"subflowPopupX\"\n [style.top.px]=\"subflowPopupY\"\n >\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\"\n dropdown-content\n style=\"background-color: white; z-index: 1000\"\n >\n <h4 class=\"mb-2 font-medium\">Select Workflow</h4>\n <div *ngIf=\"isLoadingWorkflows\" class=\"text-center py-2\">\n Loading workflows...\n </div>\n <div *ngIf=\"!isLoadingWorkflows\" class=\"max-h-48 overflow-y-auto\">\n <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n <button\n class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n (click)=\"selectSubflowWorkflow(workflow)\"\n >\n {{ workflow.Name }}\n </button>\n </div>\n <div\n *ngIf=\"workflowsList.length === 0\"\n class=\"text-center py-2 text-gray-500\"\n >\n No workflows available\n </div>\n </div>\n </div>\n </verben-pop-Up>\n </div>\n\n <lib-conditions-popup\n [visible]=\"showDecisionConditionDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [newConnectionId]=\"activeConnectionId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n (saved)=\"onDecisionConditionSaved($event)\"\n ></lib-conditions-popup>\n\n <!-- <lib-decision-popup\n [visible]=\"showConditionsDialog\"\n [decisionNodeId]=\"activeDecisionNodeId\"\n [popupX]=\"decisionConditionPopupX\"\n [popupY]=\"decisionConditionPopupY\"\n (closed)=\"onDecisionConditionCancelled()\"\n ></lib-decision-popup> -->\n\n <lib-stage-dialog\n [visible]=\"showStageDialogLocal\"\n [stageData]=\"activeStageData || {}\"\n (closed)=\"onStageDialogClosed()\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n\n <lib-action-dialog\n [visible]=\"showActionDialogLocal\"\n [actionData]=\"activeActionData\"\n (closed)=\"onActionDialogClosed()\"\n (saved)=\"onActionDialogSaved($event)\"\n ></lib-action-dialog>\n\n <lib-escalation-dialog\n [visible]=\"showEscalationDialogLocal\"\n [type]=\"activeEscalationType()!\"\n [stageCode]=\"activeStageCode() || ''\"\n [workflowCode]=\"state.workflow?.Code || ''\"\n (closed)=\"onEscalationDialogClosed()\"\n ></lib-escalation-dialog>\n</div>\n","import {\n Component,\n effect,\n EventEmitter,\n input,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { SwimlaneService } from '../services/swimlane.service';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n\n@Component({\n selector: 'lib-swimlane-dialog',\n templateUrl: './swimlane-dialog.component.html',\n styleUrl: './swimlane-dialog.component.css',\n})\nexport class SwimlaneDialogComponent implements OnInit {\n @Input() visible: boolean = false;\n swimlaneData = input<{ name: string; tags: Tag[] } | null>(null);\n @Output() closed = new EventEmitter();\n @Output() created = new EventEmitter<{ tags: Tag[]; name: string }>();\n\n searchQuery: string = '';\n workflowName: string = '';\n\n // Track selected tags in a separate array\n selectedTagNames: string[] = [];\n selectedTags: Tag[] = [];\n\n // Tags list\n tags: Tag[] = [];\n\n constructor(\n private fb: FormBuilder,\n private dataService: WorkflowDataService,\n private swimlaneService: SwimlaneService\n ) {\n effect(() => {\n const sData = this.swimlaneData();\n // If editing an existing swimlane, populate the form\n if (sData) {\n this.workflowName = sData.name || '';\n // Set selected tags\n this.selectedTags = sData.tags;\n }\n });\n }\n\n ngOnInit(): void {\n console.log('Swimlane dialog initialized with data:', this.swimlaneData);\n\n // Reset form fields when dialog opens\n // this.selectedTagNames = [];\n this.workflowName = '';\n this.searchQuery = '';\n\n // Load tags from the data service\n this.loadTags();\n }\n\n /**\n * Load tags from the data service\n */\n private loadTags(): void {\n this.dataService.getTags().then((data) => {\n this.tags = data.Result;\n });\n }\n\n get allSelected(): boolean {\n return (\n this.tags.length > 0 && this.selectedTagNames.length === this.tags.length\n );\n }\n\n set allSelected(value: boolean) {\n if (value) {\n this.selectedTagNames = this.tags.map((tag) => tag.Name);\n } else {\n this.selectedTagNames = [];\n }\n }\n\n get filteredTags(): Tag[] {\n if (!this.searchQuery) {\n return this.tags;\n }\n\n return this.tags.filter((tag) =>\n tag.Name.toLowerCase().includes(this.searchQuery.toLowerCase())\n );\n }\n\n isTagSelected(tagName: string): boolean {\n return this.selectedTagNames.includes(tagName);\n }\n\n toggleTagSelection(tagName: string): void {\n const index = this.selectedTagNames.indexOf(tagName);\n if (index > -1) {\n this.selectedTagNames.splice(index, 1);\n } else {\n this.selectedTagNames.push(tagName);\n }\n }\n\n onDialogClose(eventData: any) {\n console.log('Dialog closed, received data:', eventData);\n this.searchQuery = '';\n this.workflowName = '';\n this.selectedTagNames = [];\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n console.log('Dialog opened, received data:', eventData);\n }\n\n applySelection() {\n const selectedTags = this.tags.filter((tag) =>\n this.selectedTagNames.includes(tag.Name)\n );\n\n console.log('Submitting swimlane data:', {\n name: this.workflowName,\n tags: selectedTags,\n });\n\n this.created.emit({\n tags: this.selectedTags,\n name: this.workflowName,\n });\n\n // Reset form fields when dialog opens\n this.selectedTagNames = [];\n this.selectedTags = [];\n this.workflowName = '';\n this.searchQuery = '';\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div\n class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\"\n >\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span\n class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"\n ></span>\n </button>\n <div class=\"text-center\">\n <h2 class=\"text-sm font-medium\">Select Tags</h2>\n <span class=\"text-xs text-[#3E3E3E]/70\"\n >{{ this.selectedTags.length }}/{{ tags.length }}</span\n >\n </div>\n <span\n class=\"font-medium cursor-pointer text-[#3E3E3E]/70\"\n (click)=\"applySelection()\"\n >Create</span\n >\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"p-3\">\n <div class=\"mb-4 grid gap-4\">\n <!-- <input\n type=\"text\"\n placeholder=\"Enter Name\"\n class=\"w-full px-4 py-2 rounded-lg border border-[#E7C10B] outline-none\"\n [(ngModel)]=\"workflowName\"\n />\n\n <input\n type=\"search\"\n placeholder=\"Filter Tags\"\n class=\"w-full px-4 py-2 rounded-lg border border-[#E7C10B] outline-none\"\n [(ngModel)]=\"searchQuery\"\n />\n </div>\n\n <div class=\"\">\n <div class=\"py-3\">\n <label class=\"flex items-center\">\n <input type=\"checkbox\" class=\"mr-3\" [(ngModel)]=\"allSelected\" />\n <span class=\"text-sm\">Select All</span>\n </label>\n </div>\n\n <div *ngFor=\"let tag of filteredTags\" class=\"py-3\">\n <label class=\"flex items-center\">\n <input\n type=\"checkbox\"\n class=\"mr-3\"\n [checked]=\"isTagSelected(tag.Name)\"\n (change)=\"toggleTagSelection(tag.Name)\"\n />\n <span class=\"text-sm\">{{ tag.Name }}</span>\n <span *ngIf=\"!tag.IsOptional\" class=\"ml-2 text-xs text-red-500\"\n >(Required)</span\n >\n </label>\n </div> -->\n\n <verbena-input\n [(ngModel)]=\"workflowName\"\n [border]=\"'1px solid #9A9FBF66'\"\n placeHolder=\"Enter Swimlane Label\"\n [bgColor]=\"'white'\"\n ></verbena-input>\n\n <verben-drop-down\n selectKey=\"Code\"\n label=\"Tags\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"true\"\n placeholder=\"Select\"\n [options]=\"tags\"\n optionLabel=\"Name\"\n id=\"tags\"\n [(ngModel)]=\"selectedTags\"\n class=\"form-control\"\n >\n </verben-drop-down>\n </div>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div\n class=\"flex justify-between w-full items-center p-4 border-t border-gray-200\"\n >\n <!-- <button\n class=\"px-4 py-2 mr-2 bg-white border border-gray-200 rounded text-sm font-medium\"\n (click)=\"onDialogClose($event)\"\n >\n Cancel\n </button> -->\n\n <verbena-button\n (click)=\"onDialogClose($event)\"\n text=\"Cancel\"\n styleType=\"ylw-outline\"\n ></verbena-button>\n\n <verbena-button\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n [disable]=\"selectedTags.length < 1\"\n (click)=\"applySelection()\"\n ></verbena-button>\n\n <!-- <verbena-button\n width=\"114px\"\n height=\"39px\"\n text=\"Delete\"\n bgColor=\"#999999\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n ></verbena-button> -->\n </div>\n</ng-template>\n","import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n} from '@angular/core';\nimport { ActorTag, Tag } from 'verben-workflow-ui/src/lib/models';\nimport { UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { WorkflowDataService } from '../workflow-data.service';\n\n@Component({\n selector: 'lib-actor-tags-dialog',\n templateUrl: './actor-tags-dialog.component.html',\n styleUrl: './actor-tags-dialog.component.css',\n})\nexport class ActorTagsDialogComponent implements OnInit {\n @Input() visible: boolean = false;\n @Input() workflowCode: string | null = null;\n @Output() closed = new EventEmitter();\n\n tags: Tag[] = [];\n selectedTag: Tag | null = null;\n isViewOnly: boolean = false;\n\n constructor(\n private dataService: WorkflowDataService,\n private utilService: UtilService\n ) { }\n\n ngOnInit(): void {\n this.loadTags();\n }\n\n private loadTags(): void {\n this.dataService.getTags().then((data) => {\n this.tags = data.Result;\n });\n }\n\n onDialogClose(eventData: any) {\n this.resetForm();\n this.closed.emit();\n }\n\n onDialogOpen(eventData: any) {\n // console.log('Dialog opened');\n }\n\n onSave() {\n if (!this.selectedTag || !this.workflowCode) {\n return;\n }\n\n const actorTag: ActorTag = {\n Name: this.selectedTag.Name,\n IsViewOnly: this.isViewOnly,\n Workflow: this.workflowCode,\n // Add required BaseModel properties if needed, or rely on backend to generate them\n // Assuming BaseModel has Id, CreatedAt, etc. which might be optional or generated\n // For now, casting as any to avoid strict type checks if BaseModel has mandatory fields not relevant for creation\n } as any;\n\n this.dataService.saveActorTags([actorTag]).then(() => {\n console.log('Actor tag saved');\n this.utilService.showSuccess('Actor tags saved successfully');\n this.onDialogClose(null);\n });\n }\n\n private resetForm() {\n this.selectedTag = null;\n this.isViewOnly = false;\n }\n}\n","<verben-dialogue\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'medium'\"\n [mode]=\"'drawer'\"\n [disableFooter]=\"false\"\n [isVisible]=\"visible\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n [footerTemplate]=\"footerTemplate\"\n (openModal)=\"onDialogOpen($event)\"\n (closeModal)=\"onDialogClose($event)\"\n>\n</verben-dialogue>\n\n<ng-template #headerTemplate>\n <div\n class=\"flex items-center justify-between p-3 text-xs border-b-4 border-[#FFE681]\"\n >\n <button class=\"mr-4\" type=\"button\" (click)=\"onDialogClose($event)\">\n <span\n class=\"block w-2.5 h-2.5 border-t border-l border-[#3E3E3E]/70 transform -rotate-45\"\n ></span>\n </button>\n <div class=\"text-center\">\n <h2 class=\"text-sm font-medium\">Select Actor Tag</h2>\n </div>\n <span\n class=\"font-medium cursor-pointer text-[#3E3E3E]/70\"\n (click)=\"onSave()\"\n >Save</span\n >\n </div>\n</ng-template>\n\n<ng-template #bodyTemplate>\n <div class=\"p-3\">\n <div class=\"mb-4 grid gap-4\">\n <verben-drop-down\n selectKey=\"Code\"\n label=\"Tag\"\n styleClass=\"w-full\"\n width=\"100%\"\n [multiselect]=\"false\"\n placeholder=\"Select Tag\"\n [options]=\"tags\"\n optionLabel=\"Name\"\n id=\"tag\"\n [(ngModel)]=\"selectedTag\"\n class=\"form-control\"\n >\n </verben-drop-down>\n\n <div class=\"flex items-center gap-4 mt-4\">\n <label\n for=\"is-view-only\"\n class=\"text-sm font-semibold text-[#3E3E3E]\"\n >\n Is View Only?\n </label>\n <verbena-switch\n id=\"is-view-only\"\n onText=\"Yes\"\n offText=\"No\"\n [onColor]=\"'#1A237E'\"\n [(ngModel)]=\"isViewOnly\"\n ></verbena-switch>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n <div\n class=\"flex justify-between w-full items-center p-4 border-t border-gray-200\"\n >\n <verbena-button\n (click)=\"onDialogClose($event)\"\n text=\"Cancel\"\n styleType=\"ylw-outline\"\n ></verbena-button>\n\n <verbena-button\n type=\"submit\"\n text=\"Save\"\n bgColor=\"#FFE681\"\n textColor=\"#404040\"\n borderRadius=\"10px\"\n pd=\"10px 20px\"\n width=\"114px\"\n height=\"39px\"\n [disable]=\"!selectedTag\"\n (click)=\"onSave()\"\n ></verbena-button>\n </div>\n</ng-template>\n","import {\n Component,\n Input,\n signal,\n ViewChild,\n WritableSignal,\n} from '@angular/core';\nimport { Tag, Workflow, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { DesignerCanvasComponent } from './designer-canvas/designer-canvas.component';\nimport { WorkflowDataService } from './workflow-data.service';\nimport { WorkflowDesignerState } from './workflow-designer.state';\nimport { ConnectionPoint, Node, ToolType } from './workflow-designer.types';\n\n@Component({\n selector: 'lib-workflow-designer',\n templateUrl: './workflow-designer.component.html',\n styleUrl: './workflow-designer.component.css',\n})\nexport class WorkflowDesignerComponent {\n @ViewChild('canvasRef') canvasRef!: DesignerCanvasComponent;\n @Input() workflowCode: string | null = null;\n\n // Currently selected toolWOR-N9H5CL\n selectedTool: ToolType = null;\n showSwimlaneDialog: boolean = false;\n showActorTagsDialog: boolean = false;\n\n // New properties for stage dialog\n showStageDialog: boolean = false;\n pendingStagePosition: { swimlaneIndex: number; x: number; y: number } | null =\n null;\n pendingStageData: Partial<WorkflowStage> = {};\n\n editingSwimlaneIndex: number | null = null;\n editingSwimlane: WritableSignal<{ name: string; tags: Tag[] } | null> =\n signal(null);\n isCreatingStageFromConnection: boolean = false;\n\n pendingConnectionSourcePoint: ConnectionPoint | null = null;\n pendingConnectionSourceSwimlaneIndex: number | null = null;\n\n isLoading: boolean = false;\n isSaving: boolean = false;\n\n constructor(\n public state: WorkflowDesignerState,\n private dataService: WorkflowDataService,\n private utilService: UtilService\n ) { }\n\n ngOnInit(): void {\n // Load workflow data if code is provided\n if (this.workflowCode) {\n this.loadWorkflow(this.workflowCode);\n }\n }\n\n saveWorkflow(): void {\n if (this.isSaving) return;\n\n this.isSaving = true;\n\n // Transform the UI model to the API model\n const workflowModel = this.state.transformToWorkflowModel();\n\n if (workflowModel) {\n // Save to the backend\n this.dataService\n .saveWorkflows([workflowModel])\n .then((response) => {\n console.log('Workflow saved successfully:', response);\n this.utilService.showSuccess('Workflow saved successfully');\n // If the API returns an updated workflow, we might want to reload it\n const updatedWorkflow = response[0];\n if (updatedWorkflow) {\n this.state.setWorkflowId(updatedWorkflow.Code);\n this.parseWorkflowData(updatedWorkflow);\n }\n this.isSaving = false;\n })\n .catch((error) => {\n console.error('Error saving workflow:', error);\n this.isSaving = false;\n // Handle error - show a notification, etc.\n });\n }\n }\n\n loadWorkflow(code: string): void {\n this.isLoading = true;\n this.dataService\n .getWorkflowWithParam(code)\n .then((response) => {\n if (response && response.Result) {\n // Store the workflow ID\n const wf = response.Result[0];\n this.state.setWorkflowId(wf.Code);\n this.parseWorkflowData(wf);\n }\n this.isLoading = false;\n })\n .catch((error) => {\n console.error('Error loading workflow:', error);\n this.isLoading = false;\n });\n }\n\n // Method to parse workflow data from API and populate the designer\n parseWorkflowData(workflow: Workflow): void {\n // Store the complete workflow\n this.state.workflow = workflow;\n\n // Clear existing state\n this.state.swimlanes = [];\n this.state.connections = [];\n this.state.swimlaneRecord = {};\n this.state.stageRecord = {};\n this.state.actionRecord = {};\n\n // Set workflow form if exists\n if (workflow.Form) {\n this.state.setWorkflowForm(\n workflow.Form,\n workflow.FormName || 'Workflow Form'\n );\n }\n\n // Store the workflow ID\n this.state.setWorkflowId(workflow.Code);\n\n // Process swimlanes first\n if (workflow.Lanes && workflow.Lanes.length) {\n workflow.Lanes.sort((a, b) => a.Position - b.Position).forEach((lane) => {\n // Store original lane in record\n this.state.swimlaneRecord[lane.Code] = lane;\n\n // Add swimlane to UI model with the original ID\n const swimlane = {\n order: lane.Position,\n label: lane.Name || `Lane ${lane.Position}`,\n tags: lane.Tags || [],\n nodes: [],\n id: lane.Code, // Store the original ID\n };\n\n this.state.swimlanes.push(swimlane);\n\n // Register loaded object\n this.state.registerLoadedObject(lane.Id, lane.Code);\n });\n }\n\n // Process stages\n if (workflow.Stages && workflow.Stages.length) {\n workflow.Stages.forEach((stage) => {\n // Store original stage in record\n this.state.stageRecord[stage.Code] = stage;\n\n // Find swimlane index by SwimLane ID\n const swimlaneIndex = this.state.swimlanes.findIndex(\n (lane) => lane.id === stage.SwimLane\n );\n\n if (swimlaneIndex !== -1) {\n const x = stage.Coordinates?.X || 100;\n const y = stage.Coordinates?.Y || 50;\n\n // Create node with original ID\n const node: Node = {\n id: stage.Code, // Use original ID\n type: stage.SubWorkFlow ? 'subflow' : ('stage' as const),\n x: x,\n y: y,\n width: 169,\n height: 100,\n isStartNode: stage.IsEntryPoint,\n stageData: {\n Name: stage.Name,\n Description: stage.Description,\n Duration: stage.Duration,\n PassOnRule: stage.PassOnRule,\n ActorRule: stage.ActorRule,\n MinNoOfActor: stage.MinNoOfActor,\n Tags: stage.Tags || [],\n IsParallel: stage.IsParallel,\n IsEntryPoint: stage.IsEntryPoint,\n IsExitPoint: stage.IsExitPoint,\n IsSubProcess: stage.SubWorkFlow ? true : false,\n Id: stage.Id, // Keep original ID\n Code: stage.Code,\n Form: stage.Form,\n formId: stage.Form,\n },\n connectionPoints: [], // Initialize with empty array\n };\n\n // Generate connection points\n node.connectionPoints = this.state.generateConnectionPoints(node);\n\n // Add node to swimlane\n this.state.swimlanes[swimlaneIndex].nodes =\n this.state.swimlanes[swimlaneIndex].nodes || [];\n this.state.swimlanes[swimlaneIndex].nodes.push(node);\n\n // If this is a start node, update state\n if (stage.IsEntryPoint) {\n this.state.startNodeId = stage.Code;\n }\n\n // Register loaded stage\n this.state.registerLoadedObject(stage.Id, stage.Code);\n }\n });\n }\n\n // Process connections/actions\n if (workflow.Actions && workflow.Actions.length) {\n workflow.Actions.forEach((action) => {\n // Store original action in record\n this.state.actionRecord[action.Code] = action;\n\n // Find source and target nodes\n const sourceNodeInfo = this.state.findNodeById(action.FromStage);\n const targetNodeInfo = this.state.findNodeById(action.ToStage);\n\n console.log(sourceNodeInfo, targetNodeInfo);\n\n if (sourceNodeInfo && targetNodeInfo) {\n // Find suitable connection points\n // const sourceNode = sourceNodeInfo.node;\n // const targetNode = targetNodeInfo.node;\n\n // const sourcePoint = sourceNode.connectionPoints?.find(\n // (p) => p.type === 'right' || p.type === 'bottom'\n // );\n\n // const targetPoint = targetNode.connectionPoints?.find(\n // (p) => p.type === 'left' || p.type === 'top'\n // );\n\n const sourceNode = sourceNodeInfo.node;\n const targetNode = targetNodeInfo.node;\n\n let sourcePointId, targetPointId;\n\n console.log(action.SourcePointType, action.TargetPointType);\n\n if (action.SourcePointType) {\n // Find a point with matching type\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.type === action.SourcePointType?.toLowerCase()\n );\n sourcePointId = sourcePoint?.id;\n } else {\n // Fallback to finding a suitable point\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.type === 'right' || p.type === 'bottom'\n );\n sourcePointId = sourcePoint?.id;\n }\n\n if (action.TargetPointType) {\n // Find a point with matching type\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.type === action.TargetPointType?.toLowerCase()\n );\n targetPointId = targetPoint?.id;\n } else {\n // Fallback to finding a suitable point\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.type === 'left' || p.type === 'top'\n );\n targetPointId = targetPoint?.id;\n }\n\n console.log('Source point:', sourcePointId);\n console.log('Target point:', targetPointId);\n\n if (sourcePointId && targetPointId) {\n const connection = {\n id: action.Code, // Use original ID\n sourceNodeId: action.FromStage,\n targetNodeId: action.ToStage,\n sourcePointId: sourcePointId,\n targetPointId: targetPointId,\n sourceSwimlaneIndex: sourceNodeInfo.swimlaneIndex,\n targetSwimlaneIndex: targetNodeInfo.swimlaneIndex,\n condition: action.PassOnRule || '',\n label: action.Name || '',\n action: action.OperationAction || null,\n targetStatus: action.TargetStatus || undefined,\n };\n\n this.state.connections.push(connection);\n\n // Register loaded action\n this.state.registerLoadedObject(action.Id, action.Code);\n }\n }\n });\n }\n }\n\n // Helper method to find swimlane index by Lane ID\n findSwimlaneIndexByLaneId(laneId: string): number {\n // First check our mapping\n if (this.state.laneIdToIndexMap.has(laneId)) {\n return this.state.laneIdToIndexMap.get(laneId)!;\n }\n\n // Fallback to the original logic (for backward compatibility)\n const parts = laneId.split('-');\n if (parts.length > 1) {\n const index = parseInt(parts[1]);\n if (!isNaN(index) && index < this.state.swimlanes.length) {\n return index;\n }\n }\n\n return -1;\n }\n\n // Handle tool selection from toolbar\n onToolSelected(tool: ToolType): void {\n // Toggle selection if the same tool is clicked again\n this.selectedTool = this.selectedTool === tool ? null : tool;\n console.log('Selected tool:', this.selectedTool);\n }\n\n openSwimlaneDialog() {\n console.log('SML INDEX', this.editingSwimlaneIndex);\n if (this.editingSwimlaneIndex !== null) {\n console.log('SML', this.state.swimlanes[this.editingSwimlaneIndex]);\n this.editingSwimlane.set({\n name: this.state.swimlanes[this.editingSwimlaneIndex].label,\n tags: this.state.swimlanes[this.editingSwimlaneIndex].tags,\n });\n console.log('SML_EDT', this.editingSwimlane());\n }\n this.showSwimlaneDialog = true;\n }\n\n onShowStageDialog(event: { position: any; isFromConnection: boolean }) {\n console.log('Received showStageDialog event:', event);\n this.pendingStagePosition = event.position;\n this.showStageDialog = true;\n\n // If this is from a connection creation, store that info\n this.isCreatingStageFromConnection = event.isFromConnection;\n\n // Store the source point data before it gets lost\n if (\n event.isFromConnection &&\n this.state.draggingConnectionData.sourcePoint\n ) {\n this.pendingConnectionSourcePoint =\n this.state.draggingConnectionData.sourcePoint;\n this.pendingConnectionSourceSwimlaneIndex =\n this.state.draggingConnectionData.sourceSwimlaneIndex ?? null;\n console.log(\n 'Stored source point for connection:',\n this.pendingConnectionSourcePoint\n );\n }\n\n console.log('Stage dialog state:', {\n pendingPosition: this.pendingStagePosition,\n isVisible: this.showStageDialog,\n });\n }\n\n handleCanvasPositionClick(event: { x: number; y: number }) {\n console.log(event);\n\n // Check if this is an edit swimlane event\n if (\n event.x === -1 &&\n event.y >= 0 &&\n event.y < this.state.swimlanes.length\n ) {\n console.log('Editing swimlane', event.y);\n this.editingSwimlaneIndex = event.y;\n this.openSwimlaneDialog();\n return;\n }\n\n // Normal canvas click handling\n const swimlaneIndex = Math.floor(event.y / 263);\n\n switch (this.selectedTool) {\n case 'swimlane':\n console.log('Opening swimlane dialog for new swimlane');\n this.editingSwimlaneIndex = null; // Set to null to indicate creating a new swimlane\n this.openSwimlaneDialog();\n this.selectedTool = null;\n break;\n case 'stage':\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n console.log(\n `Adding ${this.selectedTool} to swimlane ${swimlaneIndex}`\n );\n\n // Create the stage directly with default properties\n const node = this.state.addNode(\n swimlaneIndex,\n 'stage',\n event.x,\n event.y,\n { Name: 'New Stage' } // Add default properties\n );\n\n if (node) {\n // Reset the selected tool after placing a node\n this.selectedTool = null;\n }\n }\n break;\n case 'decision':\n case 'form':\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n console.log(\n `Adding ${this.selectedTool} to swimlane ${swimlaneIndex}`\n );\n const node = this.state.addNode(\n swimlaneIndex,\n this.selectedTool,\n event.x,\n event.y\n );\n if (node) {\n // Reset the selected tool after placing a node\n this.selectedTool = null;\n }\n }\n break;\n case 'subflow':\n if (swimlaneIndex >= 0 && swimlaneIndex < this.state.swimlanes.length) {\n console.log(\n `Adding ${this.selectedTool} to swimlane ${swimlaneIndex}`\n );\n // Show subflow workflow selection popup\n this.canvasRef.showSubflowSelectionPopup(\n event.x,\n event.y,\n swimlaneIndex\n );\n }\n break;\n default:\n break;\n }\n }\n\n onSwimlaneDialogFilled(event: { tags: Tag[]; name: string }) {\n console.log(\n 'Swimlane dialog filled:',\n event,\n 'Editing index:',\n this.editingSwimlaneIndex\n );\n\n if (this.editingSwimlaneIndex !== null) {\n // Update existing swimlane\n console.log(\n 'Updating existing swimlane at index:',\n this.editingSwimlaneIndex\n );\n this.state.updateSwimlane(\n this.editingSwimlaneIndex,\n event.name,\n event.tags\n );\n } else {\n // Create new swimlane\n console.log('Creating new swimlane');\n this.state.addSwimlane(event.name, event.tags);\n }\n\n this.showSwimlaneDialog = false;\n this.editingSwimlaneIndex = null;\n }\n\n onStageDialogSaved(stageData: Partial<WorkflowStage>) {\n if (this.canvasRef.activeStageId) {\n // Editing an existing stage\n const nodeInfo = this.state.findNodeById(this.canvasRef.activeStageId);\n if (nodeInfo) {\n // Update the stage data\n nodeInfo.node.stageData = {\n ...nodeInfo.node.stageData,\n ...stageData,\n };\n console.log('Updated stage data:', nodeInfo.node.stageData);\n }\n this.canvasRef.activeStageId = null;\n } else if (this.pendingStagePosition) {\n if (this.canvasRef.activeStageId) {\n // Editing an existing stage\n const nodeInfo = this.state.findNodeById(this.canvasRef.activeStageId);\n if (nodeInfo) {\n // Update the stage data\n nodeInfo.node.stageData = {\n ...nodeInfo.node.stageData,\n ...stageData,\n };\n console.log('Updated stage data:', nodeInfo.node.stageData);\n }\n this.canvasRef.activeStageId = null;\n } else if (this.pendingStagePosition) {\n // Creating a new stage (keep existing logic for this case)\n // ...existing code...\n }\n\n this.showStageDialog = false;\n }\n\n this.showStageDialog = false;\n }\n\n onSubflowSelected() {\n // Reset the selected tool after placing a subflow node\n this.selectedTool = null;\n }\n\n openActorTagsDialog() {\n this.showActorTagsDialog = true;\n }\n}\n","<div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1>{{ state.workflow?.Name }}</h1>\n </div>\n\n <!-- Toolbar Component -->\n <lib-designer-toolbar\n [selectedTool]=\"selectedTool\"\n [isSaving]=\"isSaving\"\n [workflowCode]=\"state.workflow?.Code || null\"\n (toolSelected)=\"onToolSelected($event)\"\n (saveWorkflow)=\"saveWorkflow()\"\n (openActorTags)=\"openActorTagsDialog()\"\n >\n </lib-designer-toolbar>\n\n <!-- Show loading indicator if needed -->\n <div *ngIf=\"isLoading\" class=\"loading-overlay\">\n <div class=\"loading-spinner\"></div>\n <div class=\"loading-text\">Loading workflow...</div>\n </div>\n\n <!-- Canvas Component -->\n <lib-designer-canvas\n [selectedTool]=\"selectedTool\"\n (clickedPosition)=\"handleCanvasPositionClick($event)\"\n (subflowSelected)=\"onSubflowSelected()\"\n (showStageDialog)=\"onShowStageDialog($event)\"\n #canvasRef\n >\n </lib-designer-canvas>\n\n <lib-swimlane-dialog\n [visible]=\"showSwimlaneDialog\"\n [swimlaneData]=\"editingSwimlane()\"\n (created)=\"onSwimlaneDialogFilled($event)\"\n (closed)=\"showSwimlaneDialog = false\"\n ></lib-swimlane-dialog>\n\n <lib-stage-dialog\n [visible]=\"showStageDialog\"\n [stageData]=\"pendingStageData\"\n (closed)=\"showStageDialog = false\"\n (saved)=\"onStageDialogSaved($event)\"\n ></lib-stage-dialog>\n\n <lib-actor-tags-dialog\n [visible]=\"showActorTagsDialog\"\n [workflowCode]=\"state.workflow?.Code || null\"\n (closed)=\"showActorTagsDialog = false\"\n ></lib-actor-tags-dialog>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\n\ninterface ConnectionCondition {\n connectionId: string;\n sourceNodeId: string;\n targetNodeId: string;\n condition: string;\n}\n\n@Component({\n selector: 'lib-decision-popup',\n templateUrl: './decision-popup.component.html',\n styleUrl: './decision-popup.component.css',\n})\nexport class DecisionPopupComponent {\n @Input() visible: boolean = false;\n @Input() decisionNodeId: string = '';\n @Input() popupX: number = 0;\n @Input() popupY: number = 0;\n @Output() closed = new EventEmitter();\n\n showDuration: boolean = true;\n\n constructor(private state: WorkflowDesignerState) {}\n\n getConnectionConditions(): ConnectionCondition[] {\n if (!this.decisionNodeId) return [];\n\n // Get all connections from this decision node\n return this.state.connections\n .filter((conn) => conn.sourceNodeId === this.decisionNodeId)\n .map((conn) => ({\n connectionId: conn.id,\n sourceNodeId: conn.sourceNodeId,\n targetNodeId: conn.targetNodeId,\n condition: conn.condition || 'order.amount > 500,000', // Default or actual condition\n }));\n }\n\n getTargetNodeName(nodeId: string): string {\n const nodeInfo = this.state.findNodeById(nodeId);\n if (nodeInfo && nodeInfo.node) {\n return nodeInfo.node.stageData?.Name || 'Stage';\n }\n return 'Unknown Stage';\n }\n\n getDuration(): number {\n // Get duration from the decision node or default to 120 days\n const nodeInfo = this.state.findNodeById(this.decisionNodeId);\n if (nodeInfo && nodeInfo.node && nodeInfo.node.stageData) {\n return nodeInfo.node.stageData.Duration || 120;\n }\n return 120;\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}\n","<div\n *ngIf=\"visible\"\n [style.position]=\"'absolute'\"\n [style.left.px]=\"popupX\"\n [style.top.px]=\"popupY\"\n class=\"decision-conditions-popup\"\n>\n <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '100' }\">\n <div dropdown-trigger style=\"display: none\">\n <!-- Hidden trigger element -->\n </div>\n <div\n class=\"p-4 bg-white border border-purple-300 rounded shadow-md w-80\"\n dropdown-content\n >\n <div class=\"flex justify-between items-center mb-3\">\n <h3 class=\"text-lg font-medium\">Decision Conditions</h3>\n <button class=\"text-gray-500 hover:text-gray-700\" (click)=\"onClose()\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n </div>\n\n <div class=\"space-y-3\">\n @for (condition of getConnectionConditions(); track\n condition.connectionId) {\n <div class=\"p-3 border rounded\">\n <div class=\"mb-2\">\n <span class=\"font-medium\">Action {{ $index + 1 }}:</span>\n </div>\n <div class=\"flex items-center\">\n <input\n type=\"text\"\n [value]=\"condition.condition\"\n readonly\n class=\"w-full px-3 py-2 bg-gray-50 border rounded\"\n placeholder=\"No condition\"\n />\n <span class=\"ml-2\">&gt;</span>\n </div>\n <div class=\"mt-1 text-xs text-gray-500\">\n {{ getTargetNodeName(condition.targetNodeId) }}\n </div>\n </div>\n }\n </div>\n\n @if (getConnectionConditions().length === 0) {\n <div class=\"text-center py-3 text-gray-500\">\n No conditions defined for this decision node\n </div>\n } @if (showDuration) {\n <div class=\"mt-4 pt-3 border-t border-gray-200\">\n <div class=\"flex items-center\">\n <span class=\"font-medium\">Duration:</span>\n <span class=\"ml-2\">{{ getDuration() }} days</span>\n </div>\n </div>\n }\n </div>\n </verben-pop-Up>\n</div>\n","import { Injectable } from '@angular/core';\nimport { Connection, ConnectionPoint } from '../workflow-designer.types';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport { NodeManagementService } from './node-management.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConnectionService {\n private draggingConnectionData: {\n sourcePoint?: ConnectionPoint;\n sourceSwimlaneIndex?: number;\n startX?: number;\n startY?: number;\n currentX?: number;\n currentY?: number;\n } = {};\n\n // The rules defining which node types can connect to which other node types\n private readonly connectionRules: Record<string, string[]> = {\n stage: ['stage', 'decision', 'subflow', 'form'],\n decision: ['stage'], // Decisions can only connect to Stages\n form: [],\n subflow: ['stage', 'decision'],\n };\n\n constructor(\n private state: WorkflowDesignerState,\n private nodeService: NodeManagementService\n ) {}\n\n /**\n * Start a new connection drag operation\n */\n startConnectionDrag(\n point: ConnectionPoint,\n swimlaneIndex: number,\n globalX: number,\n globalY: number\n ): void {\n this.draggingConnectionData = {\n sourcePoint: point,\n sourceSwimlaneIndex: swimlaneIndex,\n startX: globalX,\n startY: globalY,\n currentX: globalX,\n currentY: globalY,\n };\n }\n\n /**\n * Update the position of the dragging connection\n */\n updateConnectionDrag(currentX: number, currentY: number): void {\n if (this.draggingConnectionData.sourcePoint) {\n this.draggingConnectionData.currentX = currentX;\n this.draggingConnectionData.currentY = currentY;\n }\n }\n\n /**\n * End the current connection drag operation\n */\n endConnectionDrag(): void {\n this.draggingConnectionData = {};\n }\n\n /**\n * Check if a connection drag is in progress\n */\n isConnectionDragging(): boolean {\n return !!this.draggingConnectionData.sourcePoint;\n }\n\n /**\n * Get the current connection path data for rendering\n */\n getConnectionPathData(): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n } | null {\n if (!this.draggingConnectionData.sourcePoint) return null;\n\n const { sourcePoint, sourceSwimlaneIndex, currentX, currentY } =\n this.draggingConnectionData;\n const nodeInfo = this.nodeService.findNodeById(sourcePoint.nodeId);\n\n if (!nodeInfo || sourceSwimlaneIndex === undefined) return null;\n\n const node = nodeInfo.node;\n\n // Calculate start point in global coordinates\n const startX = node.x + sourcePoint.x;\n const startY = node.y + sourcePoint.y + (sourceSwimlaneIndex * 263 + 40); // Add swimlane offset\n\n return {\n startX,\n startY,\n endX: currentX ?? startX,\n endY: currentY ?? startY,\n sourceSwimlaneIndex,\n };\n }\n\n /**\n * Create a new connection between nodes\n */\n createConnection(\n targetNodeId: string,\n targetPointId: string,\n targetSwimlaneIndex: number\n ): Connection | null {\n const { sourcePoint, sourceSwimlaneIndex } = this.draggingConnectionData;\n\n if (!sourcePoint || sourceSwimlaneIndex === undefined) {\n console.error('Missing source data for connection');\n return null;\n }\n\n const connection: Connection = {\n id: `conn-${Date.now()}-${Math.floor(Math.random() * 1000)}`,\n sourceNodeId: sourcePoint.nodeId,\n targetNodeId: targetNodeId,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPointId,\n sourceSwimlaneIndex: sourceSwimlaneIndex,\n targetSwimlaneIndex: targetSwimlaneIndex,\n label: '', // Default label, can be set later\n action: null,\n };\n\n // Add the connection to the state\n this.state.connections.push(connection);\n\n return connection;\n }\n\n /**\n * Get the path data for rendering a saved connection\n */\n getConnectionData(connection: Connection): {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n sourceSwimlaneIndex: number;\n targetSwimlaneIndex: number;\n } | null {\n const sourceNodeInfo = this.nodeService.findNodeById(\n connection.sourceNodeId\n );\n const targetNodeInfo = this.nodeService.findNodeById(\n connection.targetNodeId\n );\n\n if (!sourceNodeInfo || !targetNodeInfo) {\n return null;\n }\n\n const sourceNode = sourceNodeInfo.node;\n const targetNode = targetNodeInfo.node;\n\n // Find connection points\n const sourcePoint = sourceNode.connectionPoints?.find(\n (p) => p.id === connection.sourcePointId\n );\n const targetPoint = targetNode.connectionPoints?.find(\n (p) => p.id === connection.targetPointId\n );\n\n if (!sourcePoint || !targetPoint) {\n return null;\n }\n\n // Calculate global coordinates\n const startX = sourceNode.x + sourcePoint.x;\n const startY =\n sourceNode.y +\n sourcePoint.y +\n (connection.sourceSwimlaneIndex * 263 + 40);\n\n const endX = targetNode.x + targetPoint.x;\n const endY =\n targetNode.y +\n targetPoint.y +\n (connection.targetSwimlaneIndex * 263 + 40);\n\n return {\n startX,\n startY,\n endX,\n endY,\n sourceSwimlaneIndex: connection.sourceSwimlaneIndex,\n targetSwimlaneIndex: connection.targetSwimlaneIndex,\n };\n }\n\n /**\n * Calculate a path for orthogonal connection rendering\n */\n getOrthogonalPath(\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n pointType: 'top' | 'right' | 'bottom' | 'left'\n ): string {\n // Determine initial direction based on connection point type\n let path = '';\n\n // For side points (left/right), start with horizontal line\n if (pointType === 'left' || pointType === 'right') {\n // Calculate horizontal distance\n const horizontalDist = endX - startX;\n\n // If the end point is very close horizontally, use a simple 3-segment path\n if (Math.abs(horizontalDist) < 30) {\n const midY = (startY + endY) / 2;\n path = `M ${startX} ${startY} H ${endX} V ${midY} V ${endY}`;\n }\n // Otherwise, create a path with horizontal segment first, then vertical, then horizontal\n else {\n path = `M ${startX} ${startY} H ${\n startX + horizontalDist / 2\n } V ${endY} H ${endX}`;\n }\n }\n // For top/bottom points, start with vertical line\n else if (pointType === 'top' || pointType === 'bottom') {\n // Calculate vertical distance\n const verticalDist = endY - startY;\n\n // If the end point is very close vertically, use a simple 3-segment path\n if (Math.abs(verticalDist) < 30) {\n const midX = (startX + endX) / 2;\n path = `M ${startX} ${startY} V ${endY} H ${midX} H ${endX}`;\n }\n // Otherwise, create a path with vertical segment first, then horizontal, then vertical\n else {\n path = `M ${startX} ${startY} V ${\n startY + verticalDist / 2\n } H ${endX} V ${endY}`;\n }\n }\n\n return path;\n }\n\n /**\n * Check if a connection is allowed between node types\n */\n canConnect(sourceNodeType: string, targetNodeType: string): boolean {\n return (\n this.connectionRules[sourceNodeType]?.includes(targetNodeType) || false\n );\n }\n\n /**\n * Get allowed node types for the current dragging connection\n */\n getAllowedTargetNodeTypes(): string[] {\n if (!this.draggingConnectionData.sourcePoint) {\n return [];\n }\n\n const sourceNodeInfo = this.nodeService.findNodeById(\n this.draggingConnectionData.sourcePoint.nodeId\n );\n if (!sourceNodeInfo) {\n return [];\n }\n\n const sourceNodeType = sourceNodeInfo.node.type;\n\n return this.connectionRules[sourceNodeType] || [];\n }\n\n /**\n * Delete a connection by ID\n */\n deleteConnection(connectionId: string): boolean {\n const index = this.state.connections.findIndex(\n (conn) => conn.id === connectionId\n );\n if (index === -1) return false;\n\n this.state.connections.splice(index, 1);\n return true;\n }\n\n /**\n * Delete all connections associated with a node\n */\n deleteConnectionsForNode(nodeId: string): void {\n this.state.connections = this.state.connections.filter(\n (conn) => conn.sourceNodeId !== nodeId && conn.targetNodeId !== nodeId\n );\n }\n\n /**\n * Get the current connection drag data\n */\n getConnectionDragData() {\n return this.draggingConnectionData;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { ObjectState } from 'verben-workflow-ui/src/lib/models';\nimport { Status } from 'verben-workflow-ui/src/lib/models';\nimport { TaskAssignmentType } from 'verben-workflow-ui/src/lib/models';\nimport { StageActorRule } from 'verben-workflow-ui/src/lib/models';\nimport { SwimlaneService } from './swimlane.service';\nimport { NodeManagementService } from './node-management.service';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TransformerService {\n // Map to track loaded objects\n private loadedObjectIds: { [key: string]: string } = {}; // Format: { id: code }\n\n constructor(\n private state: WorkflowDesignerState,\n private swimlaneService: SwimlaneService,\n private nodeService: NodeManagementService,\n private connectionService: ConnectionService\n ) {}\n\n /**\n * Transform the UI model to a Workflow API model\n */\n transformToWorkflowModel(): Workflow {\n // Create base workflow object\n const workflow: Workflow = {\n // BaseModel properties\n Id: this.wasLoadedFromApi(this.state.workflowId || '')\n ? this.state.workflowId || ''\n : '',\n Code: this.getCodeForObject(this.state.workflowId || ''),\n TenantId: '',\n id: this.wasLoadedFromApi(this.state.workflowId || '')\n ? this.state.workflowId || ''\n : '',\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(this.state.workflowId || '')\n ? ObjectState.Changed\n : ObjectState.New,\n\n // Workflow specific properties\n Name: 'New Workflow', // Default name\n Description: '', // Default description\n StageEntryRule: '',\n Form: this.state.workflowFormId || undefined,\n AssignmentType: TaskAssignmentType.AutoRoute,\n Operation: '',\n Status: Status.Active,\n Actions: [],\n Lanes: [],\n Stages: [],\n };\n\n // Transform swimlanes to SwimLane[]\n workflow.Lanes = this.state.swimlanes.map((swimlane, index) => {\n const laneId = `lane-${index}`;\n\n return {\n // BaseModel properties\n Id: '',\n Code: '',\n TenantId: '',\n id: laneId,\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: ObjectState.New,\n\n // SwimLane specific properties\n Workflow: workflow.Id,\n Tags: swimlane.tags || [],\n Position: swimlane.order,\n Coordinates: { X: 0, Y: swimlane.order * 263 },\n Size: { Width: 3000, Height: 263 },\n };\n });\n\n // Transform nodes to WorkflowStage[]\n const stages: WorkflowStage[] = [];\n\n this.state.swimlanes.forEach((swimlane, swimlaneIndex) => {\n swimlane.nodes?.forEach((node) => {\n if (node.type === 'stage') {\n // Create a stage from the node\n const stage: WorkflowStage = {\n // BaseModel properties\n Id: node.id,\n Code: this.getCodeForObject(node.id),\n TenantId: '',\n id: node.id,\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(node.id)\n ? ObjectState.Changed\n : ObjectState.New,\n\n // WorkflowStage specific properties\n Workflow: workflow.Id,\n Name: node.stageData?.Name || 'Unnamed Stage',\n Description: node.stageData?.Description || '',\n Duration: node.stageData?.Duration || 0,\n PassOnRule: node.stageData?.PassOnRule || '',\n ActorRule: node.stageData?.ActorRule || StageActorRule.None,\n MinNoOfActor: node.stageData?.MinNoOfActor || 0,\n IsParallel: node.stageData?.IsParallel || false,\n IsEntryPoint: node.isStartNode,\n IsExitPoint: false, // Will be updated below\n Tags: node.stageData?.Tags || [],\n Form: node.stageData?.formId ? node.stageData.formId : '',\n AllowMultiSubProcess: false,\n AssignmentType: TaskAssignmentType.AutoRoute,\n SubWorkFlow: '',\n SwimLane: workflow.Lanes[swimlaneIndex].Id,\n Coordinates: { X: node.x, Y: node.y },\n IsSubProcess: false,\n Key: node.stageData?.Key || undefined,\n };\n\n stages.push(stage);\n }\n });\n });\n\n // Determine which stages are exit points (no outgoing connections)\n stages.forEach((stage) => {\n const hasOutgoingConnections = this.state.connections.some(\n (conn) => conn.sourceNodeId === stage.Id\n );\n if (!hasOutgoingConnections) {\n stage.IsExitPoint = true;\n }\n });\n\n // Transform connections to WorkflowAction[]\n workflow.Actions = this.state.connections.map((conn) => {\n const sourceNode = this.nodeService.findNodeById(conn.sourceNodeId)?.node;\n const targetNode = this.nodeService.findNodeById(conn.targetNodeId)?.node;\n\n return {\n // BaseModel properties\n Id: conn.id,\n Code: this.getCodeForObject(conn.id),\n TenantId: '',\n id: conn.id,\n ServiceName: '',\n CreatedAt: new Date(),\n UpdatedAt: new Date(),\n DataState: this.wasLoadedFromApi(conn.id)\n ? ObjectState.Changed\n : ObjectState.New,\n\n // WorkflowAction specific properties\n Workflow: workflow.Id,\n Name: `Action from ${sourceNode?.stageData?.Name || 'Unknown'} to ${\n targetNode?.stageData?.Name || 'Unknown'\n }`,\n OperationAction: conn.action,\n FromStage: conn.sourceNodeId,\n ToStage: conn.targetNodeId,\n IsParallel: sourceNode?.stageData?.IsParallel || false,\n PassOnRule: '', // Optional property\n };\n });\n\n workflow.Stages = stages;\n\n return workflow;\n }\n\n /**\n * Parse API workflow model and convert to UI model\n */\n parseWorkflowData(workflow: Workflow): void {\n // Clear existing state\n this.state.swimlanes = [];\n this.state.connections = [];\n\n // Set workflow form if exists\n if (workflow.Form) {\n this.state.setWorkflowForm(\n workflow.Form,\n workflow.FormName || 'Workflow Form'\n );\n }\n\n // Store the workflow ID\n this.state.setWorkflowId(workflow.Id);\n\n // Register the workflow itself\n this.registerLoadedObject(workflow.Id, workflow.Code);\n\n // Process swimlanes first\n if (workflow.Lanes && workflow.Lanes.length) {\n workflow.Lanes.sort((a: any, b: any) => a.Position - b.Position).forEach(\n (lane: any) => {\n this.swimlaneService.addSwimlane(\n lane.Name || `Lane ${lane.Position}`,\n lane.Tags || []\n );\n\n // Register loaded lane\n this.registerLoadedObject(lane.Id, lane.Code);\n }\n );\n }\n\n // Process stages\n if (workflow.Stages && workflow.Stages.length) {\n workflow.Stages.forEach((stage: any) => {\n // Find swimlane index\n const swimlaneIndex = this.swimlaneService.findSwimlaneIndexByLaneId(\n stage.SwimLane\n );\n if (swimlaneIndex !== -1) {\n const x = stage.Coordinates?.X || 100;\n const y = stage.Coordinates?.Y || 50;\n\n this.nodeService.addNode(swimlaneIndex, 'stage', x, y, {\n Name: stage.Name,\n Description: stage.Description,\n Duration: stage.Duration,\n PassOnRule: stage.PassOnRule,\n ActorRule: stage.ActorRule,\n MinNoOfActor: stage.MinNoOfActor,\n Tags: stage.Tags || [],\n IsParallel: stage.IsParallel,\n IsEntryPoint: stage.IsEntryPoint,\n IsExitPoint: stage.IsExitPoint,\n Id: stage.Id,\n });\n\n // Register loaded stage\n this.registerLoadedObject(stage.Id, stage.Code);\n }\n });\n }\n\n // Process connections/actions\n if (workflow.Actions && workflow.Actions.length) {\n workflow.Actions.forEach((action: any) => {\n // Find source and target nodes\n const sourceNodeInfo = this.nodeService.findNodeById(action.FromStage);\n const targetNodeInfo = this.nodeService.findNodeById(action.ToStage);\n\n if (sourceNodeInfo && targetNodeInfo) {\n // Find suitable connection points\n const sourcePoint = sourceNodeInfo.node.connectionPoints?.[0];\n const targetPoint = targetNodeInfo.node.connectionPoints?.[0];\n\n if (sourcePoint && targetPoint) {\n const connection = {\n id: action.Id,\n sourceNodeId: action.FromStage,\n targetNodeId: action.ToStage,\n sourcePointId: sourcePoint.id,\n targetPointId: targetPoint.id,\n sourceSwimlaneIndex: sourceNodeInfo.swimlaneIndex,\n targetSwimlaneIndex: targetNodeInfo.swimlaneIndex,\n label: action.Name,\n action: action.OperationAction,\n };\n this.state.connections.push(connection);\n\n // Register loaded action\n this.registerLoadedObject(action.Id, action.Code);\n }\n }\n });\n }\n }\n\n /**\n * Register a loaded object from the API\n */\n registerLoadedObject(id: string, code: string): void {\n this.loadedObjectIds[id] = code;\n }\n\n /**\n * Check if an object was loaded from API\n */\n wasLoadedFromApi(id: string): boolean {\n return id in this.loadedObjectIds;\n }\n\n /**\n * Get the code for a loaded object\n */\n getCodeForObject(id: string): string {\n return this.loadedObjectIds[id] || '';\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport {\n DropDownModule,\n VerbenaButtonModule,\n VerbenaInputModule,\n VerbenaSwitchModule,\n VerbenDialogueModule,\n VerbenPopUpModule,\n} from 'verben-ng-ui';\nimport { EditorModule } from 'verben-reporting-ui';\nimport { LabelEditorComponent } from 'verben-workflow-ui/src/lib/components/designer';\nimport { ActionDialogComponent } from './action-dialog/action-dialog.component';\nimport { ActorTagsDialogComponent } from './actor-tags-dialog/actor-tags-dialog.component';\nimport { ConditionsPopupComponent } from './conditions-popup/conditions-popup.component';\nimport { DecisionPopupComponent } from './decision-popup/decision-popup.component';\nimport { DesignerCanvasComponent } from './designer-canvas/designer-canvas.component';\nimport { DesignerToolbarComponent } from './designer-toolbar/designer-toolbar.component';\nimport { EscalationDialogComponent } from './escalation-dialog/escalation-dialog.component';\nimport { ConnectionService } from './services/connection.service';\nimport { NodeManagementService } from './services/node-management.service';\nimport { PopupService } from './services/popup.service';\nimport { SwimlaneService } from './services/swimlane.service';\nimport { TransformerService } from './services/transformer.service';\nimport { StageDialogComponent } from './stage-dialog/stage-dialog.component';\nimport { StageNodeComponent } from './stage-node/stage-node.component';\nimport { SwimlaneDialogComponent } from './swimlane-dialog/swimlane-dialog.component';\nimport { WorkflowDesignerComponent } from './workflow-designer.component';\n\n@NgModule({\n declarations: [\n WorkflowDesignerComponent,\n DesignerToolbarComponent,\n DesignerCanvasComponent,\n SwimlaneDialogComponent,\n StageNodeComponent,\n StageDialogComponent,\n ConditionsPopupComponent,\n DecisionPopupComponent,\n EscalationDialogComponent,\n ActionDialogComponent,\n ActorTagsDialogComponent,\n ],\n imports: [\n CommonModule,\n VerbenDialogueModule,\n FormsModule,\n ReactiveFormsModule,\n VerbenPopUpModule,\n VerbenaButtonModule,\n DropDownModule,\n LabelEditorComponent,\n EditorModule,\n VerbenaInputModule,\n VerbenaSwitchModule,\n ],\n providers: [\n NodeManagementService,\n ConnectionService,\n SwimlaneService,\n TransformerService,\n PopupService,\n ],\n exports: [WorkflowDesignerComponent],\n})\nexport class WorkflowDesignerModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.WorkflowDesignerState","i1.NodeManagementService","i2.SwimlaneService","i2.WorkflowDataService","i1.WorkflowDataService","i1","i3.NodeManagementService","i4.PopupService","i5","i6","i2","i3","i6.StageNodeComponent","i7.StageDialogComponent","i8.ConditionsPopupComponent","i9.EscalationDialogComponent","i10.ActionDialogComponent","i3.SwimlaneService","i4","i5.DesignerToolbarComponent","i6.DesignerCanvasComponent","i7.SwimlaneDialogComponent","i8.StageDialogComponent","i9.ActorTagsDialogComponent","i2.NodeManagementService","i4.ConnectionService"],"mappings":"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"}