{"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/**\n * The designer's single source of truth — and, in practice, its domain-logic\n * god object. Holds the entire editing model plus most of the behaviour that\n * operates on it: node placement, connection creation and routing, connection\n * rules, swimlane management, and the whole save-time transform.\n *\n * ## How mutation works here\n *\n * This is a `providedIn: 'root'` singleton injected **by reference** into every\n * component that touches the model. Components mutate its arrays directly\n * (`state.connections.push(...)`) — there is no store, reducer, or action\n * indirection. Change detection works because templates iterate\n * `state.swimlanes` / `state.connections` with `@for`.\n *\n * The one deliberate exception is {@link moveNodeToSwimlane}, which reassigns\n * arrays immutably so `@for` re-renders **both** the source and target lanes.\n * In-place mutation is fine everywhere else, but not across two lanes at once.\n *\n * ## Before you change this class\n *\n * A parallel implementation exists under `services/` (`NodeManagementService`,\n * `ConnectionService`, `TransformerService`, ...) that duplicates much of this\n * logic. It is only partially wired in, and the copies have **drifted** — the\n * two disagree on node placement offsets, connection endpoint offsets, and\n * which node types may connect. This class is the live path; the services are\n * mostly not. Change this one.\n *\n * @see ./docs/01-architecture.md — the split-brain problem in full\n * @see ./docs/02-coordinate-system.md — read before touching any coordinate math\n * @see ./docs/06-known-issues.md — the catalogued divergences\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class WorkflowDesignerState {\n  /** Ordered lanes. Each owns its own nodes; there is no flat node list. */\n  swimlanes: SwimlaneItem[] = [];\n  /** Id of the workflow's entry-point node. */\n  startNodeId: string | null = null;\n  /** All edges, flat across lanes. */\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  /**\n   * The workflow exactly as loaded from the API.\n   *\n   * This and the three `*Record` maps below are kept so that save can tell new\n   * objects from changed ones and emit the correct `ObjectState`. Losing them\n   * makes every entity look new on the next save.\n   */\n  workflow: Workflow | null = null;\n  /** Originally-loaded lanes, keyed by id. */\n  swimlaneRecord: Record<string, SwimLane> = {};\n  /** Originally-loaded stages, keyed by id. */\n  stageRecord: Record<string, WorkflowStage> = {};\n  /** Originally-loaded actions, keyed by id. */\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  /**\n   * Which node types each source type may connect to. Consulted by\n   * {@link canConnect} and {@link getAllowedTargetNodeTypes}.\n   *\n   * Forms are terminal sinks — they accept incoming edges but have no outgoing\n   * ones, which is why `form` maps to an empty list.\n   *\n   * ⚠️ `ConnectionService` holds a **different** copy of this table that also\n   * allows `stage → form`. The two have drifted; this one is the live path.\n   * See `./docs/06-known-issues.md` section A.\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  }\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  /**\n   * Builds the attachment points for a node, laid out to match its rendered\n   * shape. Returned coordinates are **relative to the node's own origin**.\n   *\n   * Layout per type:\n   * - **stage** — points every 50px along all four edges.\n   * - **decision** — one point at each of the diamond's four edge midpoints.\n   * - **form** — `left` (input) points only; forms are terminal sinks.\n   * - **subflow** — top, bottom, and two points on each of left and right.\n   *\n   * Regenerate these whenever a node's size or type changes, or connections\n   * will reference point ids that no longer exist.\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   * Creates a node in a swimlane and returns it (or `null` if the lane or type\n   * is invalid).\n   *\n   * ## Coordinate contract — callers must obey both halves\n   *\n   * 1. `y` must be an **absolute canvas Y**, not lane-relative. This method\n   *    converts it internally (`y - swimlaneIndex * 263`).\n   * 2. `swimlaneIndex` must be the **drop-target** lane — the lane the node is\n   *    landing in — not the lane a drag started from.\n   *\n   * Violating either half double-subtracts the lane offset and the node renders\n   * roughly one lane too high, attached to the wrong swimlane. That was the\n   * connection-drop bug; `designer-canvas.connection-drop.spec.ts` pins it.\n   *\n   * The canonical correct caller is toolbar placement in\n   * `workflow-designer.component.ts`:\n   *\n   * ```ts\n   * const swimlaneIndex = Math.floor(event.y / 263);   // target lane from drop Y\n   * this.state.addNode(swimlaneIndex, 'stage', event.x, event.y /* absolute *\\/);\n   * ```\n   *\n   * The first node created in an empty workflow is automatically marked as the\n   * start node.\n   *\n   * ⚠️ `NodeManagementService.addNode` applies an extra `- 40` that this method\n   * and the render template do not. See `./docs/06-known-issues.md` section A.\n   *\n   * @param swimlaneIndex Target lane index (the lane the node lands in).\n   * @param type Node type; `'swimlane'` and `'action'` are rejected.\n   * @param x Canvas X.\n   * @param y **Absolute** canvas Y.\n   * @param useExistingId Reuse `stageData.Code` as the node id instead of\n   *   generating one — used when rebuilding nodes from a loaded workflow so\n   *   they keep their backend identity.\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    // Clear dragging data\n    this.draggingConnectionData = {};\n  }\n\n  isConnectionDragging(): boolean {\n    return !!this.draggingConnectionData.sourcePoint;\n  }\n\n  /**\n   * Endpoints for the **in-progress** connection preview line: from the source\n   * point (resolved to absolute canvas space) to the current cursor position.\n   *\n   * Returns `null` when no drag is active. For a *saved* connection's\n   * endpoints, use {@link getConnectionData} instead.\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  /**\n   * Completes the in-progress drag by pushing a `Connection` from the recorded\n   * source point to the given target, and returns it.\n   *\n   * Reads the source from {@link draggingConnectionData}, so it is only valid\n   * during a drag — returns `null` if no source was recorded.\n   *\n   * Note this does **not** check {@link canConnect}; callers are expected to\n   * have validated the pairing before calling. The new connection has an empty\n   * label and no action — those are filled in afterwards via the action dialog.\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      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    return connection;\n  }\n\n  /**\n   * Resolves a saved connection's endpoints into **absolute canvas\n   * coordinates** for rendering:\n   *\n   * ```\n   * startY = sourceNode.y + sourcePoint.y + connection.sourceSwimlaneIndex * 263\n   * endY   = targetNode.y + targetPoint.y + connection.targetSwimlaneIndex * 263\n   * ```\n   *\n   * Both offsets are needed because `node.y` is lane-relative and `point.y` is\n   * node-relative.\n   *\n   * Returns `null` if either endpoint's node no longer exists — callers should\n   * treat that as \"skip rendering this edge\", not as an error.\n   *\n   * ⚠️ Relies on the connection's denormalised lane indices being current. A\n   * node moved between lanes without its connections updated renders detached.\n   *\n   * ⚠️ `ConnectionService.getConnectionData` adds a further `+ 40` here. The two\n   * disagree; this is the live path. See `./docs/06-known-issues.md` section A.\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.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  /**\n   * Whether an edge from `sourceNodeType` to `targetNodeType` is permitted by\n   * {@link connectionRules}. Unknown types return `false`.\n   */\n  canConnect(sourceNodeType: string, targetNodeType: string): boolean {\n    return (\n      this.connectionRules[sourceNodeType]?.includes(targetNodeType) || false\n    );\n  }\n\n  /**\n   * Node types the in-progress drag is allowed to land on. Drives the choices\n   * offered in the node-type popup when a connection is dropped on empty\n   * canvas. Empty when no drag is active.\n   */\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  /**\n   * Deletes a swimlane. Only succeeds when the lane has no nodes — stages must\n   * be moved to another lane first. Returns false when the lane still has nodes\n   * or the index is out of range.\n   *\n   * Keeps everything aligned after removal:\n   * - Re-sequences `order` on the remaining lanes (immutable reassignment so\n   *   Angular's @for blocks re-render).\n   * - Decrements the swimlane indices stored on connections whose endpoints\n   *   live below the removed lane, since those lanes shift up by one.\n   *\n   * The lane's original record is left in `swimlaneRecord`, so a previously\n   * loaded lane is emitted with `ObjectState.Removed` by\n   * `transformToWorkflowModel`; a never-saved lane simply disappears.\n   */\n  deleteSwimlane(index: number): boolean {\n    if (index < 0 || index >= this.swimlanes.length) {\n      return false;\n    }\n\n    if (this.swimlanes[index].nodes?.length) {\n      return false;\n    }\n\n    this.swimlanes = this.swimlanes\n      .filter((_, i) => i !== index)\n      .map((lane, i) => ({ ...lane, order: i }));\n\n    this.connections = this.connections.map((conn) => ({\n      ...conn,\n      sourceSwimlaneIndex:\n        conn.sourceSwimlaneIndex > index\n          ? conn.sourceSwimlaneIndex - 1\n          : conn.sourceSwimlaneIndex,\n      targetSwimlaneIndex:\n        conn.targetSwimlaneIndex > index\n          ? conn.targetSwimlaneIndex - 1\n          : conn.targetSwimlaneIndex,\n    }));\n\n    return true;\n  }\n\n  updateSwimlane(index: number, name: string, tags: Tag[]) {\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    }\n  }\n\n  /**\n   * Rebuilds the full `Workflow` API model from the current editing state —\n   * the save-side counterpart to `parseWorkflowData` in\n   * `workflow-designer.component.ts`.\n   *\n   * Mapping:\n   * - swimlanes → `Lanes`\n   * - stage **and subflow** nodes → `Stages` (subflows carry `IsSubProcess: true`)\n   * - connections → `Actions`\n   *\n   * Each entity's `DataState` is derived by looking it up in `swimlaneRecord` /\n   * `stageRecord` / `actionRecord`: found means `Changed`, absent means `New`.\n   * Clearing those maps therefore makes everything save as new.\n   *\n   * ⚠️ Decision and form nodes are **not** emitted as stages — only `stage` and\n   * `subflow` are. Decision semantics survive through the conditions on their\n   * connections.\n   *\n   * ⚠️ When no workflow was loaded, the header is hard-coded (`Name: 'New\n   * Workflow'`, empty description, default assignment and status) because the\n   * designer has no UI for editing it. See `./docs/06-known-issues.md` section G.\n   *\n   * This only builds the payload; `WorkflowDataService.saveWorkflows` sends it.\n   * Deletions are not part of this — they are issued eagerly at the point of\n   * user action. See `./docs/08-api-reference.md` section 3.\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          // 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  /**\n   * Moves a node from one swimlane to another and updates all related state:\n   * - Node position (swimlane-relative x/y)\n   * - Swimlane arrays (removes from old, adds to new)\n   * - Connection swimlane indices for this node\n   * - Node's stageData.Tags and SwimLane to match the destination swimlane\n   */\n  moveNodeToSwimlane(\n    nodeId: string,\n    fromSwimlaneIndex: number,\n    toSwimlaneIndex: number,\n    newX: number,\n    absoluteY: number        // absolute SVG Y of the node at drop time\n  ): Node | null {\n    const fromSwimlane = this.swimlanes[fromSwimlaneIndex];\n    if (!fromSwimlane?.nodes) return null;\n\n    const nodeIndex = fromSwimlane.nodes.findIndex((n) => n.id === nodeId);\n    if (nodeIndex === -1) return null;\n\n    // Pull the node out – keep a local reference\n    const node = fromSwimlane.nodes[nodeIndex];\n\n    // ── Fix the Y coordinate ──────────────────────────────────────────────\n    // Template formula: absoluteSVGY = node.y + swimlane.order * 263\n    // Connection formula: absoluteY = node.y + swimlaneIndex * 263 + point.y\n    // Both expect node.y to be swimlane-relative:\n    //   node.y = absoluteSVGY - swimlane.order * 263\n    node.x = newX;\n    node.y = absoluteY - toSwimlaneIndex * this.swimlaneHeight;\n\n    // ── Move between swimlane arrays (immutable reassignment) ─────────────\n    // Using filter+spread instead of splice/push so Angular's @for block\n    // detects the array change on both old and new swimlane.\n    fromSwimlane.nodes = fromSwimlane.nodes.filter((n) => n.id !== nodeId);\n\n    const toSwimlane = this.swimlanes[toSwimlaneIndex];\n    toSwimlane.nodes = [...(toSwimlane.nodes || []), node];\n\n    // ── Update connection swimlane indices ────────────────────────────────\n    this.connections = this.connections.map((conn) => {\n      if (conn.sourceNodeId !== nodeId && conn.targetNodeId !== nodeId) return conn;\n      return {\n        ...conn,\n        ...(conn.sourceNodeId === nodeId ? { sourceSwimlaneIndex: toSwimlaneIndex } : {}),\n        ...(conn.targetNodeId === nodeId ? { targetSwimlaneIndex: toSwimlaneIndex } : {}),\n      };\n    });\n\n    // ── Sync node metadata to the destination swimlane ────────────────────\n    node.stageData = {\n      ...node.stageData,\n      Tags: [...(toSwimlane.tags || [])],\n      SwimLane: toSwimlane.id || '',\n    };\n\n    return node;\n  }\n\n  /** Swimlane height constant used for coordinate conversions. */\n  readonly swimlaneHeight = 263;\n}\n","import { Injectable } from '@angular/core';\nimport { ActorTag, ErrorResponse, Escalation, FlowableStatus, Form, ObjectState, OperationAction, Paged, ReportSchedule, StageActorRule, Status, SwimLane, Tag, TaskAssignmentType, Workflow, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService, HttpWebRequestService, UtilService } from 'verben-workflow-ui/src/lib/services';\n\n/**\n * HTTP layer for the workflow designer — a thin wrapper over\n * `HttpWebRequestService` that picks an API base per call from\n * `EnvironmentService.environment`.\n *\n * Bases used:\n * - `WorkFlowAPI` — workflows, stages, actions, swimlanes, escalations, tags\n * - `AuthAPI` — `GetTags` (actor tags) only\n * - `ReportingAPI` — `GetReportSchedules` only\n *\n * Every method routes through {@link withLoader}, so the busy indicator is\n * handled centrally; callers should not toggle it themselves.\n *\n * ## Save is batched, deletes are not\n *\n * `saveWorkflows` persists the whole workflow at the user's explicit save. The\n * `delete*` methods fire immediately when the user confirms, from whichever\n * component owns that UI. A delete is therefore **already committed** and is\n * not undone by navigating away without saving.\n *\n * @see ./docs/08-api-reference.md — the full endpoint table\n * @see ./docs/05-persistence.md — how the models map on load and save\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class WorkflowDataService {\n  /** In-flight request count backing the shared busy indicator. */\n  private pendingRequests = 0;\n\n  constructor(\n    private httpService: HttpWebRequestService,\n    private envSvc: EnvironmentService,\n    private utilService: UtilService\n  ) { }\n\n  /**\n   * Wraps an API call so a busy indicator is shown while it is in flight.\n   * A ref-count keeps the loader visible until the last concurrent request\n   * settles, mirroring how the workflows facade toggles `sendBI`.\n   */\n  private withLoader<T>(request: () => Promise<T>): Promise<T> {\n    if (this.pendingRequests++ === 0) {\n      this.utilService.sendBI(true);\n    }\n    return request().finally(() => {\n      if (--this.pendingRequests === 0) {\n        this.utilService.sendBI(false);\n      }\n    });\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 = `GetWorkflowsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;\n    return this.withLoader(() => this.httpService.get(url) as Promise<Paged<Workflow>>);\n  }\n\n  getWorkflows(skip: number = 0, limit: number = 0): Promise<Paged<Workflow>> {\n    const url = `GetWorkflows/${skip}/${limit}`;\n    return this.withLoader(() => 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 = `GetForms/${skip}/${limit}`;\n    return this.withLoader(() => 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 = `GetTags/${skip}/${limit}`;\n    return this.withLoader(() => this.httpService.get(\n      url,\n      this.envSvc.environment.AuthAPI\n    ) as Promise<Paged<Tag>>);\n  }\n\n  saveWorkflows(requests: Partial<Workflow>[]): Promise<any | ErrorResponse> {\n    const url = `SaveWorkflows`;\n    // console.log('Saving workflows', requests);\n    return this.withLoader(() => 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 = `DeleteWorkflowStage`;\n    // console.log('Saving workflows', requests);\n    return this.withLoader(() => this.httpService.post(\n      url,\n      requests,\n      this.envSvc.environment.WorkFlowAPI\n    ));\n  }\n\n  deleteWorkflowActions(requests: string[]): Promise<any> {\n    const url = `DeleteWorkflowAction`;\n    return this.withLoader(() => this.httpService.post(\n      url,\n      requests,\n      this.envSvc.environment.WorkFlowAPI\n    ));\n  }\n\n  deleteSwimLanes(requests: SwimLane['Code'][]): Promise<any> {\n    const url = `DeleteSwimLane`;\n    return this.withLoader(() => this.httpService.post(\n      url,\n      requests,\n      this.envSvc.environment.WorkFlowAPI\n    ));\n  }\n\n  saveEscalations(requests: Partial<Escalation>[]): Promise<Escalation[]> {\n    const url = `SaveEscalations`;\n    // console.log('Saving workflows', requests);\n    return this.withLoader(() => this.httpService.post(\n      url,\n      requests,\n      this.envSvc.environment.WorkFlowAPI\n    ));\n  }\n\n  deleteEscalations(requests: Escalation['Code'][]): Promise<any> {\n    const url = `DeleteEscalation`;\n    // console.log('Saving workflows', requests);\n    return this.withLoader(() => 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 = `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.withLoader(() => 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 = `GetEscalationsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;\n    return this.withLoader(() => 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 = `GetReportSchedules/${skip}/${limit}`;\n    return this.withLoader(() => 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 = `GetOperationAction`;\n    return this.withLoader(() => 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 = `SaveActorTags`;\n    return this.withLoader(() => 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 = `GetFlowableStatus/${skip}/${limit}/CreatedAt/Desc`;\n    return this.withLoader(() => 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/**\n * Node helpers used by `DesignerToolbarComponent` and `StageDialogComponent`.\n *\n * ⚠️ **Partially adopted, and it has drifted from `WorkflowDesignerState`.**\n * Most components use `state` directly; this service duplicates a subset of its\n * logic. The copies are not identical — see {@link addNode} below and\n * `./docs/06-known-issues.md` section A.\n *\n * Prefer `WorkflowDesignerState` for new work. If you must change behaviour\n * here, check whether `state` needs the same change.\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   * ⚠️ **This disagrees with `WorkflowDesignerState.addNode` by 40px.** It\n   * subtracts an extra `- 40` \"header height\" that neither `state.addNode` nor\n   * the render template applies, so a node placed through this method lands\n   * 40px higher than one placed through the canvas.\n   *\n   * `state.addNode` is the correct one. Do not copy the `- 40` outward; the fix\n   * is to remove it here, which is tracked in `./docs/06-known-issues.md`.\n   *\n   * @param y **Absolute** canvas Y — same contract as `state.addNode`.\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/**\n * Swimlane helpers used by `DesignerToolbarComponent` and\n * `SwimlaneDialogComponent`. Delegates to `WorkflowDesignerState`, which also\n * implements much of this directly — see `./docs/01-architecture.md` for why\n * both exist.\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class SwimlaneService {\n  /**\n   * Swimlane band height in pixels.\n   *\n   * ⚠️ One of **four** separate declarations of this constant\n   * (`WorkflowDesignerState`, `DesignerCanvasComponent`,\n   * `NodeManagementService`, and here), plus bare `263` literals in templates.\n   * They agree today; nothing enforces that. Tracked in\n   * `./docs/06-known-issues.md` section B.\n   */\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      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      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})\n/**\n * The tool palette. Emits the chosen tool upward; the parent decides what a\n * subsequent canvas click means. Also hosts the save button and the actor-tags\n * entry point.\n *\n * Selection is a toggle — re-selecting the active tool clears it to `null`.\n */\nexport class DesignerToolbarComponent {\n  /** Currently active tool, owned by the parent. */\n  @Input() selectedTool: ToolType = null;\n  /** Drives the save button's busy state. */\n  @Input() isSaving: boolean = false;\n  /** Workflow being edited; used for actor-tag scoping. */\n  @Input() workflowCode: string | null = null;\n  /** Request to open the actor-tags dialog. */\n  @Output() openActorTags = new EventEmitter<void>();\n  /** A palette item was clicked; `null` when the active tool is deselected. */\n  @Output() toolSelected = new EventEmitter<ToolType>();\n  /** The save button was pressed. */\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=\"var(--vbn-color-primary)\"\n    textColor=\"var(--vbn-color-on-primary)\"\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=\"var(--vbn-color-primary)\"\n    textColor=\"var(--vbn-color-on-primary)\"\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} from '@angular/core';\nimport { EscalationType, Form, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowDataService } from '../workflow-data.service';\nimport { WorkflowDesignerState } from '../workflow-designer.state';\nimport { Node } from '../workflow-designer.types';\n\n@Component({\n  selector: 'svg:g[lib-stage-node]',\n  templateUrl: './stage-node.component.html',\n  styleUrls: ['./stage-node.component.css'],\n})\n/**\n * Renders a single stage or subflow node's chrome inside the canvas SVG —\n * body, label, and the action icons along its edge.\n *\n * Uses an **attribute selector** (`[lib-stage-node]`) because it attaches to an\n * SVG `<g>` element; it cannot be used as a standalone element.\n *\n * Positioning is the canvas template's job, not this component's — it renders\n * in its parent group's local space and knows nothing about swimlane offsets.\n */\nexport class StageNodeComponent {\n  /** The node to render. */\n  @Input() node!: Node;\n  /** Draws the entry-point indicator. */\n  @Input() isStartNode: boolean = false;\n  /** Renders the hexagonal subflow shape instead of the stage rectangle. */\n  @Input() isSubflow: boolean = false;\n  /** Backing stage record, for the label and icon states. */\n  @Input() stageData: Partial<WorkflowStage> = {};\n\n  get displayName(): string {\n    if (this.isSubflow) {\n      return this.node.workflowData?.name || this.node.stageData?.Name || 'Subflow';\n    }\n    return this.node.stageData?.Name || 'Stage';\n  }\n\n  get truncatedDisplayName(): string {\n    return this.displayName.length > 12\n      ? this.displayName.substring(0, 10) + '...'\n      : this.displayName;\n  }\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    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    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  }\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  }\n}\n","<svg:g>\n  <!-- Shape: Rectangle for stage, Hexagon for subflow -->\n  @if (isSubflow) {\n  <svg:path [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    \" fill=\"transparent\" stroke=\"#D36CFF\" stroke-width=\"1\"></svg:path>\n  } @else {\n  <svg:rect x=\"0\" y=\"0\" [attr.width]=\"node.width\" [attr.height]=\"node.height\" fill=\"transparent\" stroke=\"#D36CFF\"\n    stroke-width=\"1\"></svg:rect>\n  }\n\n  <!-- Top-left icon: Stage form -->\n  <svg:g (click)=\"toggleFormPopup($event)\" class=\"stage-icon\" transform=\"translate(6, 6)\">\n    <!-- Transparent rectangle to capture clicks -->\n    <svg:rect x=\"-2\" y=\"-2\" width=\"24\" height=\"24\" fill=\"transparent\" 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]=\"node.stageData?.formId ? '#D36CFF' : 'black'\" />\n  </svg:g>\n\n  <!-- Top-right icon: Shield -->\n  <svg:g (click)=\"toggleShieldPopup($event)\" class=\"stage-icon\"\n    [attr.transform]=\"'translate(' + (node.width - 30) + ', 6)'\">\n    <!-- Transparent rectangle to capture clicks -->\n    <svg:rect x=\"-2\" y=\"-2\" width=\"24\" height=\"24\" fill=\"transparent\" style=\"cursor: pointer\" />\n\n    <svg:path d=\"M7.5 12H16.5V13.5H7.5V12ZM7.5 7.5H16.5V9H7.5V7.5Z\" fill=\"black\" />\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  </svg:g>\n\n  @if (node.stageData?.Code) {\n  <!-- Left-center icon: Thunderbolt -->\n  <svg:g (click)=\"toggleActionPopup('left', $event)\" class=\"stage-icon\" transform=\"translate(6, 38)\">\n    <svg:path d=\"M11 15H6L13 1V9H18L11 23V15Z\" fill=\"black\" />\n  </svg:g>\n\n  <!-- Right-center icon: Thunderbolt -->\n  <svg:g (click)=\"toggleActionPopup('right', $event)\" class=\"stage-icon\"\n    [attr.transform]=\"'translate(' + (node.width - 30) + ', 38)'\">\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 *ngIf=\"hasMultipleConnectedStages\" (click)=\"toggleCodePopup($event)\" class=\"stage-icon\"\n    [attr.transform]=\"'translate(6, ' + (node.height - 16) + ')'\">\n    <svg:text font-family=\"'Plus Jakarta Sans', sans-serif\" font-weight=\"500\" font-size=\"16px\"\n      dominant-baseline=\"middle\" [attr.fill]=\"isParallelExecution ? '#D36CFF' : 'black'\">\n      //\n    </svg:text>\n  </svg:g>\n\n  <!-- Bottom-right icon: Timer -->\n  <svg:g (click)=\"toggleTimerPopup($event)\" class=\"stage-icon\" [attr.transform]=\"\n      'translate(' + (node.width - 30) + ', ' + (node.height - 30) + ')'\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  </svg:g>\n\n  <!-- Label in the center -->\n  <svg:text [attr.x]=\"node.width / 2\" [attr.y]=\"node.height / 2\" text-anchor=\"middle\" dominant-baseline=\"middle\"\n    [attr.font-size]=\"isSubflow ? '10' : '14'\" fill=\"var(--vbn-color-text)\">\n    {{ truncatedDisplayName }}\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 * RxJS-based popup state manager for the workflow designer.\n *\n * ⚠️ **Barely adopted.** Only `StageDialogComponent` consumes this; the canvas\n * re-implements popup visibility with local booleans. Two mechanisms coexist,\n * so a popup change made here may not affect the popup you are looking at —\n * check whether the component in question actually injects this service.\n *\n * Consolidating onto one mechanism is tracked in\n * `./docs/06-known-issues.md` section C.\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      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      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      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  OnInit,\n  Output,\n  SimpleChanges\n} from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { StageActorRule, Tag, TaskAssignmentType, WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { NodeManagementService } from '../services/node-management.service';\nimport { PopupService } from '../services/popup.service';\nimport { WorkflowDataService } from '../workflow-data.service';\n\n@Component({\n  selector: 'lib-stage-dialog',\n  templateUrl: './stage-dialog.component.html',\n  styleUrls: ['./stage-dialog.component.css'],\n})\n/**\n * Editor for a stage's properties — name, description, duration, actor rules,\n * tags, entry/exit flags, and the attached form.\n *\n * Serves both creation and editing; the caller distinguishes them by what it\n * passes as `stageData`. Deleting a stage from here issues\n * `deleteWorkflowStages` **immediately**, not at next save.\n *\n * Note: uses signal inputs (`this.visible()`, `this.stageData()`), not\n * decorator inputs. It is also the only consumer of `PopupService`.\n */\nexport class StageDialogComponent implements OnInit {\n  /** Signal input — read as `this.visible()`. */\n  visible = input<boolean>(false);\n  /** Stage being edited; empty object when creating. Read as `this.stageData()`. */\n  stageData = input.required<Partial<WorkflowStage>>({});\n  @Output() closed = new EventEmitter();\n  /** Emits the edited stage properties for the parent to apply. */\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\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      IsEntryPoint: [false],\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          IsEntryPoint: stageData.IsEntryPoint || false,\n          IsExitPoint: stageData.IsExitPoint || false,\n          Tags: stageData.Tags || [],\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  }\n\n  /**\n   * Initialize form with stage data if provided\n   */\n  private initFormWithStageData(): void {\n    if (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        AssignmentType:\n          this.stageData().AssignmentType || TaskAssignmentType.AutoRoute,\n        IsEntryPoint: this.stageData().IsEntryPoint || false,\n        IsExitPoint: this.stageData().IsExitPoint || false,\n        Tags: this.stageData().Tags || [],\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 stageData: Partial<WorkflowStage> = {\n        ...this.stageForm.value,\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  onDialogOpen(event: any): void {\n  }\n\n  deleteStage(): void {\n    const stageData = this.stageData();\n    if (stageData) {\n      const stageCode = stageData.Code;\n      if (stageCode) {\n        this.dataService\n          .deleteWorkflowStages([stageCode])\n          .then((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            }\n          })\n          .catch((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        }\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=\"grid gap-y-4\">\n      <!-- Stage Name -->\n      <verbena-input\n        name=\"Name\"\n        label=\"Stage Name\"\n        formControlName=\"Name\"\n        placeHolder=\"Enter Stage Name\"\n      />\n\n      <!-- Description -->\n      <verbena-textarea\n        label=\"Description\"\n        [rows]=\"3\"\n        formControlName=\"Description\"\n      ></verbena-textarea>\n\n      <!-- Recipient Count -->\n      <verbena-input\n        name=\"MinNoOfActor\"\n        label=\"Recipient Count\"\n        type=\"number\"\n        formControlName=\"MinNoOfActor\"\n        placeHolder=\"Enter Count\"\n      />\n\n      <!-- Pass On Rule -->\n      <verbena-input\n        name=\"PassOnRule\"\n        label=\"Pass On Rule\"\n        formControlName=\"PassOnRule\"\n        placeHolder=\"Select Rule\"\n      />\n\n      <!-- Duration -->\n      <verbena-input\n        name=\"Duration\"\n        label=\"Duration\"\n        type=\"number\"\n        formControlName=\"Duration\"\n        placeHolder=\"Set Duration\"\n      />\n\n      <!-- Actor Rule -->\n      <div class=\"space-y-1\">\n        <label for=\"actor-rule\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n          Actor Rule\n        </label>\n        <verben-drop-down\n          id=\"actor-rule\"\n          styleClass=\"w-full\"\n          width=\"100%\"\n          [multiselect]=\"false\"\n          placeholder=\"Select Rule\"\n          [options]=\"actorRules\"\n          formControlName=\"ActorRule\"\n          class=\"form-control\"\n          [showClear]=\"true\"\n        >\n        </verben-drop-down>\n      </div>\n\n      <!-- Assignment Type -->\n      <div class=\"space-y-1\">\n        <label for=\"assignment\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n          Assignment Type\n        </label>\n        <verben-drop-down\n          id=\"assignment\"\n          styleClass=\"w-full\"\n          width=\"100%\"\n          [multiselect]=\"false\"\n          placeholder=\"Select\"\n          [options]=\"assignmentTypes\"\n          formControlName=\"AssignmentType\"\n          class=\"form-control\"\n          [showClear]=\"true\"\n        >\n        </verben-drop-down>\n      </div>\n\n      <!-- Tags -->\n      <div class=\"space-y-1\">\n        <label for=\"tags\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n          Tags\n        </label>\n        <verben-drop-down\n          id=\"tags\"\n          selectKey=\"Code\"\n          styleClass=\"w-full\"\n          width=\"100%\"\n          [multiselect]=\"true\"\n          placeholder=\"Select\"\n          [options]=\"tags\"\n          optionLabel=\"Name\"\n          formControlName=\"Tags\"\n          class=\"form-control\"\n          [filter]=\"true\"\n          filterBy=\"Name\"\n        >\n        </verben-drop-down>\n      </div>\n\n      <!-- Is Entry Point -->\n      <div class=\"flex items-center gap-4\">\n        <label for=\"is-entry-point\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n          Entry Point\n        </label>\n        <verbena-switch\n          id=\"is-entry-point\"\n          onText=\"Yes\"\n          offText=\"No\"\n          [onColor]=\"'var(--vbn-color-text)'\"\n          formControlName=\"IsEntryPoint\"\n        ></verbena-switch>\n      </div>\n\n      <!-- Is Exit Point -->\n      <div class=\"flex items-center gap-4\">\n        <label for=\"is-exit-point\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n          Exit Point\n        </label>\n        <verbena-switch\n          id=\"is-exit-point\"\n          onText=\"Yes\"\n          offText=\"No\"\n          [onColor]=\"'var(--vbn-color-text)'\"\n          formControlName=\"IsExitPoint\"\n        ></verbena-switch>\n      </div>\n    </form>\n  </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n  <div class=\"w-full flex justify-between gap-4 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    <verbena-button\n      width=\"114px\"\n      height=\"39px\"\n      text=\"Delete\"\n      bgColor=\"var(--vbn-color-text-muted)\"\n      textColor=\"var(--vbn-color-on-primary)\"\n      borderRadius=\"10px\"\n      (click)=\"deleteStage()\"\n    ></verbena-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=\"var(--vbn-color-primary)\"\n      textColor=\"var(--vbn-color-on-primary)\"\n      borderRadius=\"10px\"\n      pd=\"10px 20px\"\n      width=\"114px\"\n      height=\"39px\"\n      (click)=\"saveStage()\"\n      [disable]=\"stageForm.invalid\"\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})\n/**\n * Prompts for the branch condition on an edge leaving a decision node, when\n * that edge is first created.\n *\n * Rendered as HTML overlaid on the SVG, so `popupX` / `popupY` are **viewport**\n * coordinates from `getViewportPosition` — not canvas coordinates.\n */\nexport class ConditionsPopupComponent {\n  @Input() visible: boolean = false;\n  /** Decision node the branch leaves from. */\n  @Input() decisionNodeId: string = '';\n  /** Connection awaiting a condition. */\n  @Input() newConnectionId: string = '';\n  /** Viewport X — not canvas X. */\n  @Input() popupX: number = 0;\n  /** Viewport Y — not canvas Y. */\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 { UtilService } from 'verben-workflow-ui/src/lib/services';\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})\n/**\n * Configures escalation rules for a single stage — what happens when the stage\n * overruns its duration.\n *\n * Escalations are persisted through their **own** endpoints\n * (`SaveEscalations` / `DeleteEscalation`), independently of the workflow save.\n * Changes here take effect without the user pressing Save.\n *\n * ⚠️ **Mixed input styles.** `visible` is a decorator input; the rest are\n * signal inputs (`this.workflowCode()`, `this.stageCode()`, `this.type()`).\n */\nexport class EscalationDialogComponent implements OnInit {\n  @Input() visible: boolean = false;\n  /** Owning workflow. Signal input. */\n  workflowCode = input.required<string>();\n  /** Stage the escalation attaches to. Signal input. */\n  stageCode = input.required<string>();\n  /** Which escalation kind is being configured. Signal input. */\n  type = input<EscalationType>();\n\n  @Output() closed = new EventEmitter();\n  /** Emitted after an escalation is successfully saved. */\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; IsMessageId: 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    private utilService: UtilService\n  ) {\n    effect(() => {\n      const stageCode = this.stageCode();\n      const workflowCode = this.workflowCode();\n      const type = this.type();\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.FullMessages.map(({ Message, IsTaskDataSource, IsMessageId }) => {\n          const found = reportSchedules.find((rs) => rs.Code === Message);\n          return found ? { ...found, IsTaskDataSource, IsMessageId } : 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('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    this.selectedMessages = this.selectedMessages.map((msg, i) => {\n      if (i === index) {\n        return { ...reportSchedule, IsTaskDataSource: false, IsMessageId: true };\n      }\n      return msg;\n    });\n  }\n\n  isValidSelection(): boolean {\n    return this.selectedMessages.every((msg) => !!msg);\n  }\n\n  async saveMessages() {\n    const taskNotifications: TaskNotification[] = this.selectedMessages\n      .filter((msg) => !!msg)\n      .map((msg) => ({\n        Id: '',\n        Code: '',\n        TenantId: '',\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: msg.IsMessageId,\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    this.onDialogClose(null);\n    const data: Partial<Escalation> = {\n      ...(this.escalation() ?? {\n        Id: '',\n        Code: '',\n        TenantId: '',\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    this.dataService.saveEscalations([data]).then((data) => {\n      this.escalation.set(data?.[0] ?? null);\n      this.utilService.showSuccess('Escalation saved successfully');\n      this.onDialogClose(null);\n    });\n    // }\n  }\n\n  deleteEscalation() {\n    const escalation = this.escalation();\n    if (escalation) {\n      this.dataService.deleteEscalations([escalation.Code]).then((data) => {\n        this.escalation.set(null);\n        this.onDialogClose(null);\n      });\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    this.escalation.set(null);\n    this.selectedMessages = [];\n    this.closed.emit();\n  }\n\n  onDialogOpen(eventData: any) {\n  }\n\n  isNotNew(): boolean {\n    const escalation = this.escalation();\n    return escalation !== null && escalation.DataState !== 'New';\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-[var(--vbn-color-primary)]\">\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-[var(--vbn-color-text)]/70 transform -rotate-45\"></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 for=\"operation-action\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n          Escalation\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 class=\"space-y-4\" *ngFor=\"let message of selectedMessages; let i = index\">\n        <div class=\"space-y-1\">\n          <label [for]=\"message + '-' + i\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n            Message {{ i + 1 }}\n          </label>\n          <verben-drop-down [id]=\"message + '-' + i\" selectKey=\"Code\" styleClass=\"w-full\" width=\"100%\"\n            [multiselect]=\"false\" placeholder=\"Select Message\" [options]=\"reportSchedules()\" optionLabel=\"Name\"\n            [ngModel]=\"message\" (ngModelChange)=\"onMessageSelected($event, i)\" class=\"form-control\"></verben-drop-down>\n        </div>\n\n        @if (message) {\n        <div class=\"flex items-center gap-4\">\n          <label [for]=\"'is-' + message + '-' + i + 'task-data-source'\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n            Is Task Data Source?\n          </label>\n          <verbena-switch [id]=\"'is-' + message + '-' + i + 'task-data-source'\" onText=\"Yes\" offText=\"No\"\n            [onColor]=\"'var(--vbn-color-text)'\" [(ngModel)]=\"message.IsTaskDataSource\"></verbena-switch>\n        </div>\n\n        <div class=\"flex items-center gap-4\">\n          <label [for]=\"'is-' + message + '-' + i + 'is-message-id'\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n            Is Message ID?\n          </label>\n          <verbena-switch [id]=\"'is-' + message + '-' + i + 'is-message-id'\" onText=\"Yes\" offText=\"No\"\n            [onColor]=\"'var(--vbn-color-text)'\" [(ngModel)]=\"message.IsMessageId\"></verbena-switch>\n        </div>\n        }\n\n        <div class=\"border border-primary -m-2 rounded-lg flex flex-col gap-3\" *ngIf=\"message\">\n          <div class=\"space-y-3 border-b border-primary px-2 py-3\">\n            <verbena-input name=\"Subject\" [(ngModel)]=\"message.Subject\" [readOnly]=\"true\" />\n            <verbena-input name=\"Recipients\" [(ngModel)]=\"message.Recipients\" [readOnly]=\"true\" />\n          </div>\n          <lib-editor [editorConfig]=\"editorConfig\" [editorMode]=\"editorMode\"\n            [(ngModel)]=\"message.PlainMessage\"></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 style=\"cursor: pointer\" type=\"button\" text=\"Add Message\" bgColor=\"var(--vbn-color-primary)\" textColor=\"var(--vbn-color-on-primary)\"\n      borderRadius=\"8px\" pd=\"10px 20px\" height=\"39px\" fontWeight=\"600\" fontSize=\"12px\" svg=\"add\" [svgHeight]=\"14\"\n      [svgWidth]=\"14\" [svgSize]=\"'sm'\" (click)=\"addMessage()\"></verbena-button>\n\n    <div class=\"flex gap-2 items-center\">\n      <verbena-button style=\"cursor: pointer\" type=\"button\" text=\"Delete\" bgColor=\"var(--vbn-color-primary)\" textColor=\"var(--vbn-color-on-primary)\"\n        borderRadius=\"8px\" pd=\"10px 20px\" width=\"110px\" height=\"39px\" fontWeight=\"600\" fontSize=\"12px\" svg=\"delete\"\n        [svgHeight]=\"14\" [svgWidth]=\"14\" [svgSize]=\"'sm'\" (click)=\"deleteEscalation()\"></verbena-button>\n\n      <verbena-button style=\"cursor: pointer\" type=\"button\" text=\"Save\" bgColor=\"var(--vbn-color-primary)\" textColor=\"var(--vbn-color-on-primary)\"\n        borderRadius=\"8px\" pd=\"10px 20px\" width=\"160px\" height=\"39px\" fontWeight=\"600\" fontSize=\"12px\" svg=\"send\"\n        [svgHeight]=\"14\" [svgWidth]=\"14\" [svgSize]=\"'sm'\" (click)=\"saveMessages()\"></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 { WorkflowDesignerState } from '../workflow-designer.state';\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})\n/**\n * Editor for a connection (workflow action) — its label, the operation it\n * triggers, and the flowable status applied when it is traversed.\n *\n * Deleting from here issues `deleteWorkflowActions` **immediately**, not at\n * next save.\n *\n * Note: uses signal inputs (`this.visible()`, `this.actionData()`).\n */\nexport class ActionDialogComponent implements OnInit {\n  /** Signal input — read as `this.visible()`. */\n  visible = input<boolean>(false);\n  /** Connection being edited. Read as `this.actionData()`. */\n  actionData = input.required<Connection | null>();\n  @Output() closed = new EventEmitter();\n  /** Emits the edited connection for the parent to apply. */\n  @Output() saved = new EventEmitter<Connection>();\n  /** Emits the deleted connection's id. */\n  @Output() deleted = new EventEmitter<string>();\n\n  actionForm: FormGroup;\n\n  operationActions: WritableSignal<OperationAction[]> = signal([]);\n  flowableStatuses: WritableSignal<FlowableStatus[]> = signal([]);\n\n  constructor(\n    private fb: FormBuilder,\n    private dataService: WorkflowDataService,\n    private state: WorkflowDesignerState\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        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      const prevData = this.actionData();\n\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  deleteAction(): void {\n    const actionData = this.actionData();\n    if (!actionData) return;\n\n    const connectionId = actionData.id;\n    const backendRecord = this.state.actionRecord[connectionId];\n\n    if (backendRecord?.Code) {\n      // Path A: backend-persisted action — call API first\n      this.dataService.deleteWorkflowActions([backendRecord.Code])\n        .then(() => {\n          this.deleted.emit(connectionId);\n          this.closed.emit();\n        })\n        .catch((error) => {\n        });\n    } else {\n      // Path B: local-only action — remove from state directly, no API call\n      this.deleted.emit(connectionId);\n      this.closed.emit();\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    this.closed.emit();\n  }\n\n  onDialogOpen(eventData: any) {\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-[var(--vbn-color-primary)]\">\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-[var(--vbn-color-text)]/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-[var(--vbn-color-text)]\">\n        Operation Action\n      </label>\n      <verben-drop-down id=\"operation-action\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" filterBy=\"Name\"\n        placeholder=\"Select Operation Action\" [options]=\"operationActions()\" optionLabel=\"Name\" optionValue=\"Code\"\n        formControlName=\"OperationAction\" class=\"form-control\" [showClear]=\"true\" [filter]=\"true\"></verben-drop-down>\n    </div>\n\n    <div class=\"space-y-1\">\n      <label for=\"target-status\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n        Target Status\n      </label>\n      <verben-drop-down id=\"target-status\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\" filterBy=\"Description\"\n        placeholder=\"Select Target Status\" [options]=\"flowableStatuses()\" optionLabel=\"Description\" optionValue=\"Name\"\n        formControlName=\"TargetStatus\" class=\"form-control\" [showClear]=\"true\" [filter]=\"true\"></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=\"var(--vbn-color-primary)\" textColor=\"var(--vbn-color-on-primary)\" borderRadius=\"10px\" pd=\"10px 20px\"\n      width=\"114px\" height=\"39px\" (click)=\"saveAction()\" [disable]=\"actionForm.invalid\"></verbena-button>\n    <verbena-button\n      width=\"114px\"\n      height=\"39px\"\n      text=\"Delete\"\n      bgColor=\"var(--vbn-color-text-muted)\"\n      textColor=\"var(--vbn-color-on-primary)\"\n      borderRadius=\"10px\"\n      (click)=\"deleteAction()\"\n    ></verbena-button>\n  </div>\n</ng-template>\n\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/**\n * The SVG editing surface. Renders the entire scene — swimlanes, nodes,\n * connections, and overlaid popups — from {@link WorkflowDesignerState}, and\n * owns nearly all pointer interaction: placing nodes, dragging them within and\n * between lanes, and the connection drag/drop pipeline.\n *\n * This is the largest file in the module. It reads and mutates the shared\n * `state` singleton directly rather than holding its own model.\n *\n * ## Coordinate spaces used here\n *\n * - {@link getMousePosition} returns **absolute canvas** coordinates — the space\n *   `state.addNode` and `Math.floor(y / 263)` expect.\n * - {@link getViewportPosition} additionally subtracts scroll offsets and is\n *   used **only** to position HTML popups over the SVG. Never feed its output\n *   into node or connection math.\n *\n * Read `../docs/02-coordinate-system.md` before changing anything positional.\n *\n * ## Popups\n *\n * Popup visibility is tracked with local booleans here, even though a\n * `PopupService` exists. Only `StageDialogComponent` uses that service; the two\n * mechanisms coexist. See `../docs/06-known-issues.md` section C.\n *\n * @see ../docs/04-interactions.md — the user-facing flows this component implements\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  /** Active toolbar tool; `null` means pointer mode. */\n  @Input() selectedTool: ToolType = null;\n  /**\n   * Canvas click position in **absolute** coordinates, for the parent to act on\n   * per the selected tool.\n   *\n   * Also carries a sentinel: `{ x: -1, y: laneIndex }` means \"edit the swimlane\n   * at `laneIndex`\" (the lane's pencil button), not a placement.\n   */\n  @Output() clickedPosition = new EventEmitter<{ x: number; y: number }>();\n  /** Emitted when a workflow is chosen for a subflow node. */\n  @Output() subflowSelected = new EventEmitter();\n  /** Where a stage will be created once the stage dialog is confirmed. */\n  pendingStagePosition: { swimlaneIndex: number; x: number; y: number } | null =\n    null;\n  /** A stage node's properties were edited on the canvas. */\n  @Output() stagePropertiesUpdated = new EventEmitter<{\n    nodeId: string;\n    stageData: Partial<WorkflowStage>;\n  }>();\n  /** A connection's action properties were edited on the canvas. */\n  @Output() actionPropertiesUpdated = new EventEmitter<{\n    connectionId: string;\n    actionData: Partial<WorkflowAction>;\n  }>();\n\n  /** The SVG root; its bounding box defines absolute canvas space. */\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      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  // ─── Node-drag state ───────────────────────────────────────────────────────\n  isDraggingNode = false;\n  draggingNode: Node | null = null;\n  private draggingNodeSwimlaneIndex: number = -1;\n  /** Mouse offset relative to node top-left at drag start (absolute canvas coords). */\n  private dragOffsetX = 0;\n  private dragOffsetY = 0;\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\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      // Seed the entry-point toggle from the node's actual start state, which is\n      // the source of truth for the start circle and API serialization. The\n      // auto-assigned entry node has isStartNode=true without stageData.IsEntryPoint.\n      this.activeStageData = {\n        ...nodeInfo.node.stageData,\n        IsEntryPoint: nodeInfo.node.isStartNode,\n        id: stageId,\n      };\n      this.showStageDialogLocal = true;\n    }\n  }\n\n  onShowActionDialog(connectionInfo: Connection): void {\n    // Find the node\n    // const connectionInfo = this.state.findActionById(actionId);\n    if (connectionInfo) {\n      this.activeActionId = connectionInfo.id;\n      this.activeActionData = connectionInfo;\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      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  onActionDialogDeleted(connectionId: string): void {\n    // Remove the connection from state\n    this.state.connections = this.state.connections.filter(\n      (c) => c.id !== connectionId\n    );\n    // Close the dialog\n    this.onActionDialogClosed();\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\n        // Sync the entry-point flag onto node.isStartNode, which drives both the\n        // start circle and the IsEntryPoint value serialized to the API.\n        if (stageData.IsEntryPoint) {\n          // Enforce a single entry point: this node becomes the sole start node.\n          this.state.swimlanes.forEach((swimlane) => {\n            swimlane.nodes?.forEach((node) => {\n              node.isStartNode = node.id === this.activeStageId;\n            });\n          });\n          this.state.startNodeId = this.activeStageId;\n        } else {\n          nodeInfo.node.isStartNode = false;\n          if (this.state.startNodeId === this.activeStageId) {\n            this.state.startNodeId = null;\n          }\n        }\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        }\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  /**\n   * Converts a DOM mouse event into **absolute canvas coordinates**, relative\n   * to the SVG's bounding box.\n   *\n   * This is the space that `state.addNode`, `Math.floor(y / 263)`, and all\n   * connection math expect. Use this — not {@link getViewportPosition} — for\n   * anything positional.\n   */\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  /**\n   * Converts absolute canvas coordinates into **viewport coordinates** by\n   * subtracting the scroll container's offsets.\n   *\n   * Used **only** to position HTML popups overlaid on the SVG. Feeding this\n   * into node or connection math produces elements that drift as the canvas\n   * scrolls.\n   */\n  private getViewportPosition(canvasX: number, canvasY: number): { x: number; y: number } {\n    const parentElement = this.canvasRef.nativeElement.parentElement;\n    const scrollLeft = parentElement?.scrollLeft || 0;\n    const scrollTop = parentElement?.scrollTop || 0;\n\n    return {\n      x: canvasX - scrollLeft,\n      y: canvasY - scrollTop,\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      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  // ─────────────────────────────────────────────────────────────────────────\n  // Node drag logic\n  // ─────────────────────────────────────────────────────────────────────────\n\n  /**\n   * Called from the template when the user presses the mouse button on a node.\n   * Starts the drag interaction and registers document-level listeners so the\n   * drag continues even when the cursor leaves the SVG canvas.\n   */\n  onNodeMouseDown(event: MouseEvent, node: Node, swimlaneIndex: number): void {\n    // Do not interfere with connection dragging or open popups\n    if (\n      this.state.isConnectionDragging() ||\n      this.popupVisible ||\n      this.showStartNodeFormPopup ||\n      this.showSubflowPopup\n    ) return;\n\n    event.stopPropagation(); // Prevent onCanvasClick from firing\n    event.preventDefault();\n\n    const position = this.getMousePosition(event);\n    // Template formula: absoluteSVGY = node.y + swimlane.order * 263\n    const absoluteNodeY = node.y + swimlaneIndex * this.swimlaneHeight;\n\n    this.isDraggingNode = true;\n    this.draggingNode = node;\n    this.draggingNodeSwimlaneIndex = swimlaneIndex;\n    // Store the offset from the node's top-left so the node doesn't jump\n    this.dragOffsetX = position.x - node.x;\n    this.dragOffsetY = position.y - absoluteNodeY;\n\n    // Seed pending values with the node's CURRENT position so that a plain\n    // click (no mousemove) leaves node.y unchanged in onNodeDragEnd.\n    this._pendingAbsoluteY = absoluteNodeY;\n    this._pendingTargetSwimlaneIndex = swimlaneIndex;\n\n    document.addEventListener('mousemove', this.onNodeDragMove);\n    document.addEventListener('mouseup', this.onNodeDragEnd);\n  }\n\n  /**\n   * Arrow function (preserves `this`) — runs on every mousemove while dragging\n   * a node.  Updates node.x / node.y in-place so Angular's change detection\n   * picks it up and redraws the node and all connected paths automatically.\n   */\n  onNodeDragMove = (event: MouseEvent): void => {\n    if (!this.isDraggingNode || !this.draggingNode) return;\n\n    const position = this.getMousePosition(event);\n\n    // Raw desired absolute position of the node top-left\n    const rawAbsoluteX = position.x - this.dragOffsetX;\n    const rawAbsoluteY = position.y - this.dragOffsetY;\n\n    // Determine which swimlane the node is being dragged into  (by cursor Y)\n    let targetSwimlaneIndex = Math.floor(position.y / this.swimlaneHeight);\n    targetSwimlaneIndex = Math.max(\n      0,\n      Math.min(targetSwimlaneIndex, this.state.swimlanes.length - 1)\n    );\n\n    const swimlaneTopY = targetSwimlaneIndex * this.swimlaneHeight;\n    const swimlaneBottomY = swimlaneTopY + this.swimlaneHeight;\n    const padding = 5;\n\n    // X: keep node fully on canvas (no left/right boundary needed for swimlanes)\n    const newAbsoluteX = Math.max(padding, rawAbsoluteX);\n\n    // Y: clamp so the node stays inside the targeted swimlane\n    let newAbsoluteY = rawAbsoluteY;\n    const node = this.draggingNode;\n    if (newAbsoluteY < swimlaneTopY + padding) {\n      newAbsoluteY = swimlaneTopY + padding;\n    } else if (newAbsoluteY + node.height > swimlaneBottomY - padding) {\n      newAbsoluteY = swimlaneBottomY - node.height - padding;\n    }\n\n    // Convert absolute Y to swimlane-relative Y for storage\n    const newRelativeY = newAbsoluteY - targetSwimlaneIndex * this.swimlaneHeight;\n\n    // Live preview: update position directly.\n    // Template formula: absoluteSVGY = node.y + swimlane.order * 263\n    // => node.y = absoluteY - swimlane.order * 263  (swimlane-relative)\n    // The node is STILL in the source swimlane's array during preview,\n    // so swimlane.order = draggingNodeSwimlaneIndex.\n    node.x = newAbsoluteX;\n    node.y = newAbsoluteY - this.draggingNodeSwimlaneIndex * this.swimlaneHeight;\n\n    // Store computed values for onNodeDragEnd\n    this._pendingTargetSwimlaneIndex = targetSwimlaneIndex;\n    this._pendingAbsoluteY = newAbsoluteY;\n  };\n\n  /** Scratch fields used to pass computed values from move → end handlers. */\n  private _pendingTargetSwimlaneIndex = -1;\n  private _pendingAbsoluteY = 0;\n\n  /**\n   * Arrow function (preserves `this`) — fires on mouseup after a node drag.\n   * Finalises the node position and performs swimlane migration if necessary.\n   */\n  onNodeDragEnd = (_event: MouseEvent): void => {\n    document.removeEventListener('mousemove', this.onNodeDragMove);\n    document.removeEventListener('mouseup', this.onNodeDragEnd);\n\n    if (!this.isDraggingNode || !this.draggingNode) {\n      this.isDraggingNode = false;\n      this.draggingNode = null;\n      return;\n    }\n\n    const node = this.draggingNode;\n    const fromIndex = this.draggingNodeSwimlaneIndex;\n    const toIndex = this._pendingTargetSwimlaneIndex !== -1\n      ? this._pendingTargetSwimlaneIndex\n      : fromIndex;\n    const absoluteY = this._pendingAbsoluteY;\n\n    if (fromIndex !== toIndex) {\n      // Cross-swimlane drop: state helper moves node between arrays,\n      // updates connections, and syncs tags. It also sets node.y correctly.\n      this.state.moveNodeToSwimlane(node.id, fromIndex, toIndex, node.x, absoluteY);\n    } else {\n      // Same swimlane: node.y = absoluteY - swimlane.order * 263 (swimlane-relative)\n      node.y = absoluteY - fromIndex * this.swimlaneHeight;\n    }\n\n    // Reset drag state\n    this.isDraggingNode = false;\n    this.draggingNode = null;\n    this.draggingNodeSwimlaneIndex = -1;\n    this.dragOffsetX = 0;\n    this.dragOffsetY = 0;\n    this._pendingTargetSwimlaneIndex = -1;\n    this._pendingAbsoluteY = 0;\n  };\n\n  /**\n   * Returns a CSS cursor value for the node rendering.\n   * Shows 'grabbing' while the node is being dragged, 'grab' otherwise.\n   */\n  getCursorForNode(nodeId: string): string {\n    return this.isDraggingNode && this.draggingNode?.id === nodeId ? 'grabbing' : 'grab';\n  }\n\n  // ─────────────────────────────────────────────────────────────────────────\n  // Connection drag logic (existing)\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  /**\n   * Terminates a connection drag. Three outcomes, evaluated in order:\n   *\n   * 1. **Dropped on an existing connection point** — if the source and target\n   *    are different nodes and `state.canConnect` allows the type pairing, the\n   *    connection is created immediately.\n   * 2. **Dropped inside a swimlane but not on a point** — opens the node-type\n   *    popup ({@link showConnectionPopup}), offering only the types permitted by\n   *    `state.getAllowedTargetNodeTypes()`. The node is created later, by\n   *    {@link createNodeConnection}.\n   * 3. **Dropped outside every swimlane** — the drag is cancelled.\n   *\n   * Always detaches the document-level move/up listeners first, so an early\n   * return cannot leave them attached.\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\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\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\n            // Notify about connection creation\n            this.onConnectionCreated(connection);\n          }\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\n    // Only show popup if within a swimlane\n    if (isInsideSwimlane && this.state.isConnectionDragging()) {\n      this.showConnectionPopup(position.x, position.y);\n    } else {\n      // End the connection drag if outside a swimlane\n      this.state.endConnectionDrag();\n    }\n  };\n\n  /**\n   * Hit-tests an absolute canvas position against every node's connection\n   * points, resolving each to absolute space as\n   * `node.y + swimlaneIndex * 263 + point.y` — the inverse of the render\n   * formula.\n   *\n   * Returns the first point within `tolerance` pixels, or `null`. Scans all\n   * lanes and all nodes linearly.\n   *\n   * @param x Absolute canvas X (from {@link getMousePosition}).\n   * @param y Absolute canvas Y.\n   * @param tolerance Hit radius in pixels.\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\n    // Convert canvas coordinates to viewport coordinates for popup positioning\n    const viewportPos = this.getViewportPosition(x, y);\n    this.popupX = viewportPos.x;\n    this.popupY = viewportPos.y;\n\n    // Get allowed node types based on the source node type\n    this.allowedNodeTypes = this.state.getAllowedTargetNodeTypes();\n\n    // Only show the popup if we have allowed node types\n    if (this.allowedNodeTypes.length > 0) {\n      this.popupVisible = true;\n\n      // Force the popup to be visible in the next tick\n    } else {\n      // No allowed node types, just end the drag\n      this.state.endConnectionDrag();\n    }\n  }\n\n  hideConnectionPopup(): void {\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  /**\n   * Creates a new node at the drop point and connects the dragged edge to it —\n   * the path taken when the user picks a type from the node-type popup.\n   *\n   * ## The coordinate contract this method must honour\n   *\n   * The target swimlane is derived from the **drop** Y\n   * (`Math.floor(endY / 263)`, clamped to the lane range), and `endY` is passed\n   * to `state.addNode` **absolute and unconverted**. `addNode` performs the\n   * lane-relative conversion itself.\n   *\n   * This method previously did the opposite — pre-converting `endY` and passing\n   * the *source* lane — which made `addNode` subtract the lane offset twice, so\n   * the new stage rendered one lane too high and attached to the wrong\n   * swimlane. `designer-canvas.connection-drop.spec.ts` guards against the\n   * regression. Do not reintroduce a conversion here.\n   *\n   * Connecting a decision to a stage defers node creation until the branch\n   * condition is supplied, via {@link pendingDecisionConnection}.\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      this.hideConnectionPopup();\n      return;\n    }\n\n    const { endX, endY } = pathData;\n\n    // Determine the target swimlane from the drop position (NOT the source\n    // swimlane). `addNode` expects an absolute canvas Y plus the target\n    // swimlane index, and performs the swimlane-relative conversion itself.\n    let targetSwimlaneIndex = Math.floor(endY / this.swimlaneHeight);\n    targetSwimlaneIndex = Math.max(\n      0,\n      Math.min(targetSwimlaneIndex, this.state.swimlanes.length - 1)\n    );\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: targetSwimlaneIndex,\n        x: endX,\n        y: endY,\n      };\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    // Handle preconditions based on node type\n    if (nodeType === 'stage') {\n      // Create the stage in the target swimlane. `addNode` converts the\n      // absolute endY to a swimlane-relative position internally.\n      const newNode = this.state.addNode(\n        targetSwimlaneIndex,\n        'stage',\n        endX,\n        endY,\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            targetSwimlaneIndex\n          );\n\n          if (connection) {\n            this.onConnectionCreated(connection);\n          }\n        }\n      }\n\n      this.hideConnectionPopup();\n      return;\n    } else if (nodeType === 'subflow') {\n      // Show workflow selection popup and store connection data for later use\n      this.showSubflowSelectionPopup(endX, endY, targetSwimlaneIndex);\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      targetSwimlaneIndex,\n      nodeType as ToolType,\n      endX,\n      endY\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            targetSwimlaneIndex\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          }\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        return '';\n      }\n\n      const { startX, startY, endX, endY } = pathData;\n\n      const sourceNodeInfo = this.state.findNodeById(connection.sourceNodeId);\n      if (!sourceNodeInfo) {\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        return '';\n      }\n\n      return this.getOrthogonalPath(\n        startX,\n        startY,\n        endX,\n        endY,\n        sourcePoint.type\n      );\n    } catch (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        }\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\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 - convert canvas coordinates to viewport coordinates\n    const swimlaneOffset = swimlaneIndex * 263;\n    const canvasX = nodeX - (!node ? 30 : 0);\n    const canvasY = nodeY + swimlaneOffset;\n\n    const viewportPos = this.getViewportPosition(canvasX, canvasY);\n    this.startNodeFormPopupX = viewportPos.x;\n    this.startNodeFormPopupY = viewportPos.y;\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          this.isLoadingStartNodeForms = false;\n        });\n    }\n\n    if (node) {\n      this.activeNodeForFormSelection = 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    // Convert canvas coordinates to viewport coordinates for popup positioning\n    const viewportPos = this.getViewportPosition(x, y);\n    this.subflowPopupX = viewportPos.x;\n    this.subflowPopupY = viewportPos.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    }\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        this.isLoadingWorkflows = false;\n      });\n\n    this.showSubflowPopup = true;\n  }\n\n  selectSubflowWorkflow(workflow: Workflow): void {\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        { Name: workflow.Name }, // Initialize stage name from workflow\n        { id: workflow.Code, name: workflow.Name }\n      );\n\n\n      // If this was created from a connection, create the connection\n      if (node && this.pendingConnectionSourcePoint) {\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            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\n    // Convert canvas coordinates to viewport coordinates for popup positioning\n    const viewportPos = this.getViewportPosition(position.x, 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 = viewportPos.x;\n    this.decisionConditionPopupY = viewportPos.y;\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    //   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        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        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        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,\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,\n            y: midY,\n          };\n        }\n      }\n    } catch (error) {\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 #canvas [attr.width]=\"canvasWidth\" [attr.height]=\"canvasHeight\" class=\"designer-canvas\"\n    (click)=\"onCanvasClick($event)\">\n    <defs>\n      <!-- Grid pattern definition -->\n\n      <pattern id=\"grid\" [attr.width]=\"gridSize\" [attr.height]=\"gridSize\" patternUnits=\"userSpaceOnUse\">\n        <path d=\"M 20 0 L 0 0 0 20\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"0.5\" />\n      </pattern>\n\n      <!-- Arrow head marker definition -->\n      <marker id=\"arrowhead\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n        <polygon points=\"0 0, 10 3.5, 0 7\" fill=\"#D36CFF\" />\n      </marker>\n\n      <!-- Connection point: outer transparent ring expands the hit target so a\n           connection drag can be started without pixel-precise aim. The visible\n           circle stays at r=5. The hit ring extends inward up to the node's\n           drag-handle edge so clicks near the edge fall to the connection point\n           (rendered topmost) rather than to the drag handle beneath. -->\n      <g id=\"connection-point-template\">\n        <circle r=\"12\" fill=\"transparent\" />\n        <circle r=\"5\" fill=\"#D36CFF\" stroke=\"#FFFFFF\" stroke-width=\"1\" />\n      </g>\n\n      <!-- Dashed line style for connection preview -->\n      <pattern id=\"dashed-line\" width=\"10\" height=\"10\" patternUnits=\"userSpaceOnUse\">\n        <line x1=\"0\" y1=\"5\" x2=\"10\" y2=\"5\" stroke=\"#D36CFF\" stroke-width=\"2\" stroke-dasharray=\"5,5\" />\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 x=\"50%\" y=\"50%\" font-family=\"sans-serif\" font-size=\"16\" fill=\"#94a3b8\" text-anchor=\"middle\">\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 x=\"0\" y=\"0\" [attr.width]=\"canvasWidth\" [attr.height]=\"263\"\n        [attr.fill]=\"swimlane.order % 2 === 0 ? '#FCF3FF' : '#ECFFF5'\" stroke=\"none\"></rect>\n\n      <!-- Vertical swimlane label on the left -->\n      <g class=\"swimlane-label\">\n        <!-- Purple background for the label -->\n        <rect x=\"0.5\" y=\"0.5\" width=\"43\" height=\"215\" rx=\"10.5\" fill=\"white\" stroke=\"#D36CFF\"></rect>\n\n        <!-- Plus button at the top -->\n        <g (click)=\"\n            onEditSwimlane($event, swimlane, swimlane.order);\n            $event.stopPropagation()\n          \">\n          <rect x=\"12.5\" y=\"10\" width=\"18\" height=\"18\" fill=\"transparent\" style=\"cursor: pointer\"></rect>\n\n          <path d=\"M22.52 12.174V17.08H27.47V18.51H22.52V23.394H21.2V18.51H16.25V17.08H21.2V12.174H22.52Z\"\n            fill=\"#0000FF\" class=\"plus-icon\" style=\"cursor: pointer\"></path>\n        </g>\n\n        <!-- Swimlane label -->\n        <text x=\"22\" y=\"106\" font-family=\"sans-serif\" font-size=\"14\" fill=\"#333333\" text-anchor=\"middle\"\n          transform=\"rotate(-90, 22, 100)\">\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 x=\"11.5\" y=\"187\" width=\"21\" height=\"19\" rx=\"9.5\" fill=\"#9E9E9E\"></rect>\n        <text x=\"24\" y=\"206\" font-family=\"sans-serif\" font-size=\"12\" fill=\"black\" text-anchor=\"middle\"\n          transform=\"rotate(-90, 22, 200)\">\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 class=\"node-element\" [attr.transform]=\"\n        'translate(' + node.x + ',' + (node.y + swimlane.order * 263) + ')'\"\n      (mouseenter)=\"showConnectionPoints(node.id, swimlane.order)\"\n      (mouseleave)=\"hideConnectionPoints(node.id)\">\n      <!-- Start node indicator (circle and arrow) for the first node -->\n      @if (node.isStartNode) {\n      <!-- Circle -->\n      <circle cx=\"-50\" cy=\"50\" r=\"30\" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\"></circle>\n      <!-- Form icon for start node -->\n      <svg:g (click)=\"\n          toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order)\n        \" class=\"stage-icon\" transform=\"translate(-45, 42)\" style=\"cursor: pointer; pointer-events: all\">\n        <!-- Transparent rectangle to capture clicks -->\n        <svg:rect x=\"-2\" y=\"-2\" width=\"24\" height=\"24\" fill=\"transparent\" style=\"cursor: pointer\" />\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'\" transform=\"scale(0.7)\" />\n      </svg:g>\n      <!-- Arrow from circle to node -->\n      <path d=\"M -20 50 L 0 50\" stroke=\"#D36CFF\" stroke-width=\"1\" marker-end=\"url(#arrowhead)\"></path>\n      }\n\n      <!-- Exit point indicator (circle and arrow) -->\n      @if (node.stageData?.IsExitPoint) {\n      <!-- Arrow from node to circle -->\n      <path [attr.d]=\"'M ' + node.width + ' 50 L ' + (node.width + 20) + ' 50'\" stroke=\"#D36CFF\" stroke-width=\"1\"\n        marker-end=\"url(#arrowhead)\"></path>\n      <!-- Circle -->\n      <circle [attr.cx]=\"node.width + 50\" cy=\"50\" r=\"30\" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"2\"></circle>\n      }\n\n      <!-- Inner drag-handle: inset 12px so the node edge ring stays drag-free.\n           Rendered BEFORE the node shapes/icons so the clickable icons paint on\n           top of it and win pointer events; the node body still falls through to\n           this handle because its shape/label use pointer-events:none.\n           Connection point <use> elements are rendered after everything so they\n           stay topmost and win pointer events at the node edges. -->\n      <rect class=\"node-drag-handle\"\n        [attr.x]=\"12\" [attr.y]=\"12\"\n        [attr.width]=\"node.width - 24\" [attr.height]=\"node.height - 24\"\n        fill=\"transparent\"\n        [style.cursor]=\"getCursorForNode(node.id)\"\n        (mousedown)=\"onNodeMouseDown($event, node, swimlane.order)\" />\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 lib-stage-node [node]=\"node\" [isStartNode]=\"node.isStartNode\"\n        (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\" (showShieldDialog)=\"onShowShieldDialog($event)\"\n        (showEscalationDialog)=\"onShowEscalationDialog($event)\" (showFormDialog)=\"\n          toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n        \"></svg:g>\n      }\n\n      <!-- Decision node -->\n      @if (node.type === 'decision') {\n      <path [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        \" fill=\"none\" stroke=\"#D36CFF\" stroke-width=\"1\" style=\"pointer-events: none\"></path>\n\n      <!-- Decision node condition indicator icon -->\n      <svg:g (click)=\"showDecisionConditionsPopup($event, node, swimlane.order)\" class=\"decision-condition-icon\"\n        [attr.transform]=\"\n          'translate(' +\n          (node.width / 2 - 10) +\n          ',' +\n          (node.height / 2 - 10) +\n          ')'\n        \">\n        <svg:rect x=\"-5\" y=\"-5\" width=\"30\" height=\"30\" fill=\"transparent\" style=\"cursor: pointer\" />\n        <svg:path d=\"M10 0H20V2H10V0ZM10 8H20V10H10V8ZM10 4H20V6H10V4ZM0 0H8V2H0V0ZM0 8H8V10H0V8ZM0 4H8V6H0V4Z\"\n          fill=\"#D36CFF\" />\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)\" fill=\"none\" stroke=\"#D36CFF\" stroke-linejoin=\"round\" style=\"pointer-events: none\" />\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)\" stroke=\"#D36CFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"pointer-events: none\" />\n      <text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-family=\"sans-serif\" font-size=\"14\"\n        fill=\"#D36CFF\" style=\"pointer-events: none\">\n        Form\n      </text>\n      }\n\n      <!-- Subflow node -->\n      @if (node.type === 'subflow') {\n      <svg:g lib-stage-node [node]=\"node\" [isStartNode]=\"node.isStartNode\" [isSubflow]=\"true\"\n        (stagePropertiesUpdated)=\"onStagePropertiesUpdated($event)\" (showShieldDialog)=\"onShowShieldDialog($event)\"\n        (showEscalationDialog)=\"onShowEscalationDialog($event)\" (showFormDialog)=\"\n          toggleStartNodeFormPopup($event, node.x, node.y, swimlane.order, node)\n        \"></svg:g>\n      }\n\n      <!-- Connection points for this node (rendered last = topmost) -->\n      @for (point of node.connectionPoints || []; track point.id) {\n        @if (isConnectionPointVisible(node.id)) {\n          <use class=\"connection-point\" [attr.href]=\"'#connection-point-template'\" [attr.x]=\"point.x\" [attr.y]=\"point.y\"\n            [attr.id]=\"point.id\" (mousedown)=\"startConnectionDrag($event, point, swimlane.order)\" />\n        }\n      }\n    </g>\n    <!-- A transparent hover area for improved hover detection -->\n    <rect [attr.x]=\"node.x - 10\" [attr.y]=\"node.y - 10\" [attr.width]=\"node.width + 20\" [attr.height]=\"node.height + 20\"\n      fill=\"transparent\" (mouseover)=\"showConnectionPoints(node.id, swimlane.order)\"\n      (mouseout)=\"hideConnectionPoints(node.id)\" style=\"pointer-events: none\" />\n    } }\n\n    <!-- Connections -->\n    @for (connection of state.connections; track connection.id) {\n    <g class=\"connection-element\">\n      <path [attr.d]=\"getConnectionPathForSavedConnection(connection)\" stroke=\"#D36CFF\" stroke-width=\"2\" fill=\"none\"\n        marker-end=\"url(#arrowhead)\"></path>\n\n      <!-- Connection Label -->\n      @if (connection.sourceNodeId && connection.targetNodeId) {\n      <foreignObject [attr.x]=\"getLabelPosition(connection).x\" [attr.y]=\"getLabelPosition(connection).y\" width=\"150\"\n        height=\"40\" style=\"overflow: visible; pointer-events: all;\" [attr.transform]=\"'translate(-75, -10)'\">\n        <wf-label-editor [label]=\"connection.label || 'New Action'\" [x]=\"0\" [y]=\"0\" [isConnection]=\"true\"\n          (labelChange)=\"saveConnectionLabel(connection, $event)\" (openDialog)=\"onShowActionDialog(connection)\" />\n      </foreignObject>\n      }\n    </g>\n    }\n\n    <!-- Connection preview line -->\n    @if (state.isConnectionDragging()) {\n    <g>\n      <path [attr.d]=\"getConnectionPath()\" stroke=\"#D36CFF\" stroke-width=\"2\" stroke-dasharray=\"5,5\" fill=\"none\"></path>\n    </g>\n    }\n  </svg>\n\n  <div *ngIf=\"popupVisible\" [style.position]=\"'absolute'\" [style.left.px]=\"popupX\" [style.top.px]=\"popupY\">\n    <verben-pop-Up [dropdownOpen]=\"true\" [customStyles]=\"{ 'z-index': '99' }\" [enableMouseLeave]=\"false\"\n      (dropdownOpenChange)=\"$event ? null : hideConnectionPopup()\">\n      <div dropdown-trigger style=\"display: none\">\n        <!-- Hidden trigger element -->\n      </div>\n      <div class=\"p-3 bg-white border border-gray-200 rounded shadow-md\" dropdown-content>\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 class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n              (click)=\"createNodeConnection(type)\">\n              Create {{ type | titlecase }}\n            </button>\n          </ng-container>\n          <button class=\"px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50\"\n            (click)=\"hideConnectionPopup()\">\n            Cancel\n          </button>\n        </div>\n      </div>\n    </verben-pop-Up>\n  </div>\n\n  <div *ngIf=\"showStartNodeFormPopup\" [style.position]=\"'absolute'\" [style.left.px]=\"startNodeFormPopupX\"\n    [style.top.px]=\"startNodeFormPopupY\">\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 class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\" dropdown-content\n        style=\"background-color: white; z-index: 1000\">\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\" style=\"max-height: 192px; overflow-y: auto;\">\n          <div class=\"mb-3\">\n            <button\n              class=\"w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n              (click)=\"selectStartNodeForm(null)\">\n              Clear form selection\n            </button>\n          </div>\n          <div *ngFor=\"let form of startNodeFormsList\" class=\"mb-1\">\n            <button class=\"w-full px-3 py-2 bg-white border border-gray-200 rounded text-sm hover:bg-gray-50 text-left\"\n              [ngClass]=\"{ 'bg-blue-50 !border-blue-500 !border-2 font-semibold': form?.Code === activeNodeForFormSelection?.stageData?.formId}\"\n              (click)=\"selectStartNodeForm(form)\">\n              {{ form.Name }}\n            </button>\n          </div>\n          <div *ngIf=\"startNodeFormsList.length === 0\" class=\"text-center py-2 text-gray-500\">\n            No forms available\n          </div>\n        </div>\n      </div>\n    </verben-pop-Up>\n  </div>\n\n  <div *ngIf=\"showSubflowPopup\" [style.position]=\"'absolute'\" [style.left.px]=\"subflowPopupX\"\n    [style.top.px]=\"subflowPopupY\">\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 class=\"p-3 bg-white border border-gray-200 rounded shadow-md w-64\" dropdown-content\n        style=\"background-color: white; z-index: 1000\">\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\" style=\"max-height: 192px; overflow-y: auto;\">\n          <div *ngFor=\"let workflow of workflowsList\" class=\"mb-1\">\n            <button 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              {{ workflow.Name }}\n            </button>\n          </div>\n          <div *ngIf=\"workflowsList.length === 0\" class=\"text-center py-2 text-gray-500\">\n            No workflows available\n          </div>\n        </div>\n      </div>\n    </verben-pop-Up>\n  </div>\n\n  <lib-conditions-popup [visible]=\"showDecisionConditionDialog\" [decisionNodeId]=\"activeDecisionNodeId\"\n    [newConnectionId]=\"activeConnectionId\" [popupX]=\"decisionConditionPopupX\" [popupY]=\"decisionConditionPopupY\"\n    (closed)=\"onDecisionConditionCancelled()\" (saved)=\"onDecisionConditionSaved($event)\"></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 [visible]=\"showStageDialogLocal\" [stageData]=\"activeStageData || {}\"\n    (closed)=\"onStageDialogClosed()\" (saved)=\"onStageDialogSaved($event)\"></lib-stage-dialog>\n\n  <lib-action-dialog [visible]=\"showActionDialogLocal\" [actionData]=\"activeActionData\" (closed)=\"onActionDialogClosed()\"\n    (saved)=\"onActionDialogSaved($event)\" (deleted)=\"onActionDialogDeleted($event)\"></lib-action-dialog>\n\n\n  <lib-escalation-dialog [visible]=\"showEscalationDialogLocal\" [type]=\"activeEscalationType()!\"\n    [stageCode]=\"activeStageCode() || ''\" [workflowCode]=\"state.workflow?.Code || ''\"\n    (closed)=\"onEscalationDialogClosed()\"></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})\n/**\n * Create/edit dialog for a swimlane: its name and the actor tags that own it.\n *\n * Serves both modes — `isEditing` selects between them, and `swimlaneData`\n * carries the current values when editing.\n *\n * ⚠️ **Mixed input styles.** `visible` and `isEditing` are decorator inputs\n * (`this.visible`) while `swimlaneData` is a signal input\n * (`this.swimlaneData()`). Check before use.\n */\nexport class SwimlaneDialogComponent implements OnInit {\n  @Input() visible: boolean = false;\n  /** Edit mode when true; create mode when false. */\n  @Input() isEditing: boolean = false;\n  /** Current values when editing. Signal input — read as `this.swimlaneData()`. */\n  swimlaneData = input<{ name: string; tags: Tag[] } | null>(null);\n  @Output() closed = new EventEmitter();\n  /** Emits the confirmed name and tags, for both create and edit. */\n  @Output() created = new EventEmitter<{ tags: Tag[]; name: string }>();\n  /** Requests deletion of the lane being edited. */\n  @Output() deleted = new EventEmitter<void>();\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\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  onDeleteSwimlane() {\n    this.deleted.emit();\n  }\n\n  onDialogClose(eventData: any) {\n    this.searchQuery = '';\n    this.workflowName = '';\n    this.selectedTagNames = [];\n    this.closed.emit();\n  }\n\n  onDialogOpen(eventData: any) {\n  }\n\n  applySelection() {\n    const selectedTags = this.tags.filter((tag) =>\n      this.selectedTagNames.includes(tag.Name)\n    );\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-[var(--vbn-color-primary)]\"\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-[var(--vbn-color-text)]/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-[var(--vbn-color-text)]/70\"\n        >{{ this.selectedTags.length }}/{{ tags.length }}</span\n      >\n    </div>\n    <span\n      class=\"font-medium cursor-pointer text-[var(--vbn-color-text)]/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-[var(--vbn-color-primary)] 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-[var(--vbn-color-primary)] 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        [filter]=\"true\"\n        [filterBy]=\"'Name'\"\n        [showClear]=\"true\"\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=\"var(--vbn-color-primary)\"\n      textColor=\"var(--vbn-color-on-primary)\"\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      *ngIf=\"isEditing\"\n      width=\"114px\"\n      height=\"39px\"\n      text=\"Delete\"\n      bgColor=\"var(--vbn-color-text-muted)\"\n      textColor=\"var(--vbn-color-on-primary)\"\n      borderRadius=\"10px\"\n      pd=\"10px 20px\"\n      (click)=\"onDeleteSwimlane()\"\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})\n/**\n * Manages the actor tags available to a workflow — the pool that swimlanes\n * draw from to define who owns each lane.\n *\n * Opened from the toolbar rather than from a node, since tags are\n * workflow-scoped. Persists via `saveActorTags` immediately, independently of\n * the workflow save.\n */\nexport class ActorTagsDialogComponent implements OnInit {\n  @Input() visible: boolean = false;\n  /** Workflow whose tags are being managed. */\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      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 [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-[var(--vbn-color-primary)]\">\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-[var(--vbn-color-text)]/70 transform -rotate-45\"></span>\n    </button>\n    <div class=\"text-center\">\n      <h2 class=\"text-sm font-medium\">Select Actor Tag</h2>\n    </div>\n    <span class=\"font-medium cursor-pointer text-[var(--vbn-color-text)]/70\" (click)=\"onSave()\">Save</span>\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 selectKey=\"Code\" label=\"Tag\" styleClass=\"w-full\" width=\"100%\" [multiselect]=\"false\"\n        placeholder=\"Select Tag\" [options]=\"tags\" optionLabel=\"Name\" id=\"tag\" [(ngModel)]=\"selectedTag\"\n        class=\"form-control\" [filter]=\"true\" filterBy=\"Name\" [showClear]=\"true\">\n      </verben-drop-down>\n\n      <div class=\"flex items-center gap-4 mt-4\">\n        <label for=\"is-view-only\" class=\"text-sm font-semibold text-[var(--vbn-color-text)]\">\n          Is View Only?\n        </label>\n        <verbena-switch id=\"is-view-only\" onText=\"Yes\" offText=\"No\" [onColor]=\"'var(--vbn-color-text)'\"\n          [(ngModel)]=\"isViewOnly\"></verbena-switch>\n      </div>\n    </div>\n  </div>\n</ng-template>\n\n<ng-template #footerTemplate>\n  <div class=\"flex justify-between w-full items-center p-4 border-t border-gray-200\">\n    <verbena-button (click)=\"onDialogClose($event)\" text=\"Cancel\" styleType=\"ylw-outline\"></verbena-button>\n\n    <verbena-button type=\"submit\" text=\"Save\" bgColor=\"var(--vbn-color-primary)\" textColor=\"var(--vbn-color-on-primary)\" borderRadius=\"10px\" pd=\"10px 20px\"\n      width=\"114px\" height=\"39px\" [disable]=\"!selectedTag\" (click)=\"onSave()\"></verbena-button>\n  </div>\n</ng-template>\n","import {\n  Component,\n  Input,\n  signal,\n  ViewChild,\n  WritableSignal,\n} from '@angular/core';\nimport { ErrorResponse, Tag, Workflow } 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 { Node, ToolType } from './workflow-designer.types';\n\n/**\n * The workflow designer's root component and **the only thing\n * `WorkflowDesignerModule` exports** — everything else in this folder is\n * internal.\n *\n * ```html\n * <lib-workflow-designer [workflowCode]=\"'WOR-QG2LCX'\"></lib-workflow-designer>\n * ```\n *\n * Responsibilities are deliberately narrow: load and save the workflow, host\n * the toolbar and the lane/actor-tag dialogs, and translate toolbar tool\n * selection plus canvas clicks into state mutations. The heavy lifting —\n * rendering and all pointer interaction — belongs to\n * {@link DesignerCanvasComponent}.\n *\n * ## Integration requirements\n *\n * Consuming apps must provide the `ENVIRONMENT` injection token and have a\n * reachable Workflow API; the designer throws on construction without the\n * former and renders empty without the latter. Note there are **no outputs** —\n * saving is driven by the built-in toolbar button, and the host is not notified\n * when it happens.\n *\n * @see ./docs/07-integration.md — full setup guide\n * @see ./docs/01-architecture.md — how this fits with the canvas and state\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  /** Code of the workflow to load. `null` renders an empty canvas. */\n  @Input() workflowCode: string | null = null;\n\n  /** Active toolbar tool; `null` means pointer mode. */\n  selectedTool: ToolType = null;\n  showSwimlaneDialog: boolean = false;\n  showActorTagsDialog: boolean = false;\n\n  editingSwimlaneIndex: number | null = null;\n  editingSwimlane: WritableSignal<{ name: string; tags: Tag[] } | null> =\n    signal(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          if (response instanceof ErrorResponse) {\n            this.utilService.showError(response.ErrorMsg);\n            this.isSaving = false;\n          } else {\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        })\n        .catch((error) => {\n          this.isSaving = false;\n          // Handle error - show a notification, etc.\n        });\n    }\n  }\n\n  /**\n   * Fetches a workflow by code and hands the first result to\n   * {@link parseWorkflowData}. Called from `ngOnInit` when `workflowCode` is\n   * set.\n   *\n   * Failures are logged and swallowed — the canvas simply stays empty. If the\n   * designer renders blank, check the `ENVIRONMENT` provider and the\n   * `WorkFlowAPI` base URL before suspecting the code itself.\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        this.isLoading = false;\n      });\n  }\n\n  /**\n   * Maps an API `Workflow` into the designer's editing model — the load-side\n   * counterpart to `WorkflowDesignerState.transformToWorkflowModel`.\n   *\n   * Steps, in order:\n   * 1. Reset `swimlanes`, `connections`, and the `*Record` maps, and stash the\n   *    full workflow for save-time state derivation.\n   * 2. Rebuild lanes sorted by `Position`, registering lane-id → index mappings.\n   * 3. Rebuild nodes from `Stages`, keyed by `IsSubProcess` into `subflow` or\n   *    `stage` type, then generate their connection points.\n   * 4. Rebuild connections from `Actions`.\n   *\n   * Nodes are constructed **literally here** rather than through\n   * `state.addNode`, so that `stage.Code` is preserved as the node id and\n   * identity survives the round trip. That also means this path bypasses\n   * `addNode`'s coordinate conversion — stage coordinates come back from the\n   * API already lane-relative and are used as-is.\n   *\n   * ⚠️ **This is the live parser.** `TransformerService.parseWorkflowData` is a\n   * dead duplicate reached by nothing — edit this one. See\n   * `./docs/06-known-issues.md` section A.\n   */\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.IsSubProcess ? '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.IsSubProcess,\n              AssignmentType: stage.AssignmentType,\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\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\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\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  }\n\n  openSwimlaneDialog() {\n    if (this.editingSwimlaneIndex !== null) {\n      this.editingSwimlane.set({\n        name: this.state.swimlanes[this.editingSwimlaneIndex].label,\n        tags: this.state.swimlanes[this.editingSwimlaneIndex].tags,\n      });\n    }\n    this.showSwimlaneDialog = true;\n  }\n\n\n\n  /**\n   * Handles a canvas click by branching on the active tool: opening the\n   * swimlane dialog, placing a stage/decision/form node, or starting the\n   * subflow picker. The tool resets to `null` after a successful placement.\n   *\n   * ⚠️ **Sentinel value.** `{ x: -1, y: laneIndex }` is not a position — it\n   * means \"edit the swimlane at `laneIndex`\", emitted by the lane's pencil\n   * button. It is intercepted before any placement logic runs. Any change to\n   * this method must preserve that check, and callers must never emit a\n   * genuine click with `x === -1`.\n   *\n   * Node placement passes the click Y through **absolute**, with the target\n   * lane derived as `Math.floor(event.y / 263)` — the canonical coordinate\n   * contract described in `./docs/02-coordinate-system.md`.\n   */\n  handleCanvasPositionClick(event: { x: number; y: number }) {\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      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        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\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          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          // 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\n    if (this.editingSwimlaneIndex !== null) {\n      // Update existing swimlane\n      this.state.updateSwimlane(\n        this.editingSwimlaneIndex,\n        event.name,\n        event.tags\n      );\n    } else {\n      // Create new swimlane\n      this.state.addSwimlane(event.name, event.tags);\n    }\n\n    this.showSwimlaneDialog = false;\n    this.editingSwimlaneIndex = null;\n  }\n\n\n\n  onSwimlaneDialogDeleted() {\n    if (this.editingSwimlaneIndex === null) {\n      return;\n    }\n\n    const index = this.editingSwimlaneIndex;\n    const swimlane = this.state.swimlanes[index];\n\n    // Guard: stages must be moved out first (also enforced in state.deleteSwimlane).\n    if (swimlane?.nodes?.length) {\n      this.utilService.showError(\n        'Move all stages out of this swimlane before deleting it.'\n      );\n      return;\n    }\n\n    // A loaded lane keeps its backend Code in swimlaneRecord (keyed by id/Code).\n    const backendRecord = swimlane?.id\n      ? this.state.swimlaneRecord[swimlane.id]\n      : undefined;\n\n    if (backendRecord?.Code) {\n      // Path A: backend-persisted lane — delete on the server first.\n      this.dataService\n        .deleteSwimLanes([backendRecord.Code])\n        .then(() => {\n          this.finishSwimlaneDelete(index);\n        })\n        .catch((error) => {\n          this.utilService.showError('Failed to delete swimlane');\n        });\n    } else {\n      // Path B: never-saved lane — remove from state directly, no API call.\n      this.finishSwimlaneDelete(index);\n    }\n  }\n\n  private finishSwimlaneDelete(index: number): void {\n    const deleted = this.state.deleteSwimlane(index);\n    if (!deleted) {\n      this.utilService.showError(\n        'Move all stages out of this swimlane before deleting it.'\n      );\n      return;\n    }\n\n    this.showSwimlaneDialog = false;\n    this.editingSwimlaneIndex = null;\n    this.canvasRef?.updateCanvasSize();\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 [selectedTool]=\"selectedTool\" [isSaving]=\"isSaving\"\n    [workflowCode]=\"state.workflow?.Code || null\" (toolSelected)=\"onToolSelected($event)\"\n    (saveWorkflow)=\"saveWorkflow()\" (openActorTags)=\"openActorTagsDialog()\">\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 [selectedTool]=\"selectedTool\" (clickedPosition)=\"handleCanvasPositionClick($event)\"\n    (subflowSelected)=\"onSubflowSelected()\" #canvasRef>\n  </lib-designer-canvas>\n\n  <lib-swimlane-dialog [visible]=\"showSwimlaneDialog\" [swimlaneData]=\"editingSwimlane()\"\n    [isEditing]=\"editingSwimlaneIndex !== null\" (created)=\"onSwimlaneDialogFilled($event)\"\n    (deleted)=\"onSwimlaneDialogDeleted()\" (closed)=\"showSwimlaneDialog = false\"></lib-swimlane-dialog>\n\n  <lib-actor-tags-dialog [visible]=\"showActorTagsDialog\" [workflowCode]=\"state.workflow?.Code || null\"\n    (closed)=\"showActorTagsDialog = false\"></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})\n/**\n * Read-only summary of a decision node's existing branches: each outgoing\n * connection, its target stage, and its condition. Its only output is\n * `closed` — editing happens elsewhere.\n *\n * Distinct from `ConditionsPopupComponent`, which prompts for a condition on a\n * *newly created* branch; this one reviews the branches already there.\n *\n * ⚠️ `getConnectionConditions` substitutes a hard-coded placeholder\n * (`'order.amount > 500,000'`) for connections with no condition set, so the\n * popup can display a condition that does not exist in the model. Likewise\n * `getDuration` falls back to `120`.\n *\n * Rendered as HTML overlaid on the SVG, so `popupX` / `popupY` are **viewport**\n * coordinates, not canvas coordinates.\n */\nexport class DecisionPopupComponent {\n  @Input() visible: boolean = false;\n  /** Decision node whose branches are shown. */\n  @Input() decisionNodeId: string = '';\n  /** Viewport X — not canvas X. */\n  @Input() popupX: number = 0;\n  /** Viewport Y — not canvas Y. */\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/**\n * ⚠️ **NOT ON THE LIVE PATH.** The only class that injects this is\n * `TransformerService`, which is itself injected by nothing.\n *\n * It duplicates connection logic that lives in `WorkflowDesignerState`, and the\n * two copies have **drifted apart**:\n *\n * - `connectionRules` here additionally allows `stage → form`; `state` does not.\n * - `getConnectionData` / `getConnectionPathData` here add `+ 40` to the\n *   swimlane offset; `state` and the render template do not.\n *\n * Neither divergence is currently visible to users, precisely because this file\n * does not run. Make connection changes in `WorkflowDesignerState`.\n *\n * @see ./docs/06-known-issues.md section A\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      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/**\n * ⚠️ **NOT ON THE LIVE PATH — injected by nothing.**\n *\n * This service appears in `WorkflowDesignerModule`'s `providers` array, which\n * makes it look wired up, but no component injects it. Its\n * `parseWorkflowData` and `transformToWorkflowModel` are stale duplicates of\n * the implementations that actually run:\n *\n * - load  → `WorkflowDesignerComponent.parseWorkflowData`\n * - save  → `WorkflowDesignerState.transformToWorkflowModel`\n *\n * Edit those. Changes here will pass review and do nothing at runtime.\n *\n * @see ./docs/06-known-issues.md section A — the split-brain problem\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  VerbenaTextareaModule,\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/**\n * The workflow designer feature module.\n *\n * 📖 **Documentation: [`./docs/README.md`](./docs/README.md)** — architecture,\n * the coordinate system, data model, interactions, persistence, known issues,\n * integration guide, API reference, and development workflow.\n *\n * Declares eleven components and exports exactly one,\n * {@link WorkflowDesignerComponent}; everything else is internal.\n *\n * Requires `verben-ng-ui` (seven modules) and `verben-reporting-ui`\n * (`EditorModule`) at runtime, and an `ENVIRONMENT` provider in the host app.\n * See `./docs/07-integration.md`.\n *\n * Note: the five `services/` classes listed in `providers` are all\n * `providedIn: 'root'` already, so those entries are redundant. Two of them\n * (`TransformerService`, `ConnectionService`) are not reached from any UI path\n * at all — see `./docs/06-known-issues.md`.\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    VerbenaTextareaModule,\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","i4","i2.WorkflowDataService","i1.WorkflowDataService","i1","i3.NodeManagementService","i4.PopupService","i2","i3","i3.WorkflowDesignerState","i5","i6.StageNodeComponent","i7.StageDialogComponent","i8.ConditionsPopupComponent","i9.EscalationDialogComponent","i10.ActionDialogComponent","i3.SwimlaneService","i5.DesignerToolbarComponent","i6.DesignerCanvasComponent","i7.SwimlaneDialogComponent","i8.ActorTagsDialogComponent","i2.NodeManagementService","i4.ConnectionService"],"mappings":"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"}