ngx-workflow 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +291 -0
- package/fesm2022/ngx-workflow.mjs +3016 -0
- package/fesm2022/ngx-workflow.mjs.map +1 -0
- package/package.json +47 -0
- package/types/ngx-workflow.d.ts +482 -0
- package/types/ngx-workflow.d.ts.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngx-workflow.mjs","sources":["../../../libs/ngx-workflow/src/lib/injection-tokens/node-types.token.ts","../../../libs/ngx-workflow/src/lib/injection-tokens/edge-types.token.ts","../../../libs/ngx-workflow/src/lib/utils/path-getters.ts","../../../libs/ngx-workflow/src/lib/utils/path-finder.ts","../../../libs/ngx-workflow/src/lib/components/zoom-controls/zoom-controls.component.ts","../../../libs/ngx-workflow/src/lib/components/zoom-controls/zoom-controls.component.html","../../../libs/ngx-workflow/src/lib/services/undo-redo.service.ts","../../../libs/ngx-workflow/src/lib/services/diagram-state.service.ts","../../../libs/ngx-workflow/src/lib/components/minimap/minimap.component.ts","../../../libs/ngx-workflow/src/lib/components/minimap/minimap.component.html","../../../libs/ngx-workflow/src/lib/components/background/background.component.ts","../../../libs/ngx-workflow/src/lib/components/background/background.component.html","../../../libs/ngx-workflow/src/lib/components/alignment-controls/alignment-controls.component.ts","../../../libs/ngx-workflow/src/lib/components/alignment-controls/alignment-controls.component.html","../../../libs/ngx-workflow/src/lib/components/properties-sidebar/properties-sidebar.component.ts","../../../libs/ngx-workflow/src/lib/components/properties-sidebar/properties-sidebar.component.html","../../../libs/ngx-workflow/src/lib/components/diagram/diagram.component.ts","../../../libs/ngx-workflow/src/lib/components/diagram/diagram.component.html","../../../libs/ngx-workflow/src/lib/components/custom-node/rounded-rect-node.component.ts","../../../libs/ngx-workflow/src/lib/services/layout.service.ts","../../../libs/ngx-workflow/src/lib/ngx-workflow.module.ts","../../../libs/ngx-workflow/src/public-api.ts","../../../libs/ngx-workflow/src/ngx-workflow.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { NodeComponentType } from '../types/component-types';\n\nexport const NGX_WORKFLOW_NODE_TYPES = new InjectionToken<Record<string, NodeComponentType>>('NGX_WORKFLOW_NODE_TYPES');","import { InjectionToken } from '@angular/core';\nimport { EdgeComponentType } from '../types/component-types';\n\nexport const NGX_WORKFLOW_EDGE_TYPES = new InjectionToken<Record<string, EdgeComponentType>>('NGX_WORKFLOW_EDGE_TYPES');","import { XYPosition } from '../models';\n\nexport function getStraightPath(source: XYPosition, target: XYPosition): string {\n return `M ${source.x},${source.y} L ${target.x},${target.y}`;\n}\n\nexport function getBezierPath(source: XYPosition, target: XYPosition): string {\n const midX = (source.x + target.x) / 2;\n return `M ${source.x},${source.y} C ${midX},${source.y} ${midX},${target.y} ${target.x},${target.y}`;\n}\n\nexport function getStepPath(source: XYPosition, target: XYPosition): string {\n const midY = (source.y + target.y) / 2;\n return `M ${source.x},${source.y} L ${source.x},${midY} L ${target.x},${midY} L ${target.x},${target.y}`;\n}\n\nexport function getSelfLoopPath(source: XYPosition, handle: string = 'top', offset: number = 30): string {\n const { x, y } = source;\n\n switch (handle) {\n case 'top':\n return `M ${x},${y} C ${x - offset},${y - offset * 2} ${x + offset},${y - offset * 2} ${x},${y}`;\n case 'right':\n return `M ${x},${y} C ${x + offset * 2},${y - offset} ${x + offset * 2},${y + offset} ${x},${y}`;\n case 'bottom':\n return `M ${x},${y} C ${x + offset},${y + offset * 2} ${x - offset},${y + offset * 2} ${x},${y}`;\n case 'left':\n return `M ${x},${y} C ${x - offset * 2},${y + offset} ${x - offset * 2},${y - offset} ${x},${y}`;\n default:\n return `M ${x},${y} C ${x - offset},${y - offset * 2} ${x + offset},${y - offset * 2} ${x},${y}`;\n }\n}\n\nexport function getSmartEdgePath(path: XYPosition[]): string {\n if (path.length === 0) return '';\n\n let d = `M ${path[0].x},${path[0].y}`;\n\n for (let i = 1; i < path.length; i++) {\n d += ` L ${path[i].x},${path[i].y}`;\n }\n\n return d;\n}\n\nexport function getPolylineMidpoint(points: XYPosition[]): XYPosition {\n if (points.length < 2) return points[0] || { x: 0, y: 0 };\n\n // Calculate total length\n let totalLength = 0;\n const segments: { length: number; start: XYPosition; end: XYPosition }[] = [];\n\n for (let i = 0; i < points.length - 1; i++) {\n const start = points[i];\n const end = points[i + 1];\n const length = Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2));\n segments.push({ length, start, end });\n totalLength += length;\n }\n\n // Find midpoint\n let remainingLength = totalLength / 2;\n\n for (const segment of segments) {\n if (remainingLength <= segment.length) {\n // Midpoint is on this segment\n const ratio = remainingLength / segment.length;\n return {\n x: segment.start.x + (segment.end.x - segment.start.x) * ratio,\n y: segment.start.y + (segment.end.y - segment.start.y) * ratio\n };\n }\n remainingLength -= segment.length;\n }\n\n return points[points.length - 1];\n}","import { XYPosition } from '../models';\r\n\r\ninterface GridNode {\r\n x: number;\r\n y: number;\r\n walkable: boolean;\r\n g: number; // Cost from start\r\n h: number; // Heuristic cost to end\r\n f: number; // Total cost\r\n parent: GridNode | null;\r\n opened: boolean;\r\n closed: boolean;\r\n}\r\n\r\nclass MinHeap {\r\n private heap: GridNode[] = [];\r\n\r\n push(node: GridNode): void {\r\n this.heap.push(node);\r\n this.bubbleUp(this.heap.length - 1);\r\n }\r\n\r\n pop(): GridNode | undefined {\r\n if (this.heap.length === 0) return undefined;\r\n const top = this.heap[0];\r\n const bottom = this.heap.pop();\r\n if (this.heap.length > 0 && bottom) {\r\n this.heap[0] = bottom;\r\n this.sinkDown(0);\r\n }\r\n return top;\r\n }\r\n\r\n size(): number {\r\n return this.heap.length;\r\n }\r\n\r\n private bubbleUp(index: number): void {\r\n const element = this.heap[index];\r\n while (index > 0) {\r\n const parentIndex = Math.floor((index - 1) / 2);\r\n const parent = this.heap[parentIndex];\r\n if (element.f >= parent.f) break;\r\n this.heap[parentIndex] = element;\r\n this.heap[index] = parent;\r\n index = parentIndex;\r\n }\r\n }\r\n\r\n private sinkDown(index: number): void {\r\n const length = this.heap.length;\r\n const element = this.heap[index];\r\n while (true) {\r\n const leftChildIndex = 2 * index + 1;\r\n const rightChildIndex = 2 * index + 2;\r\n let leftChild: GridNode | undefined, rightChild: GridNode | undefined;\r\n let swap = null;\r\n\r\n if (leftChildIndex < length) {\r\n leftChild = this.heap[leftChildIndex];\r\n if (leftChild.f < element.f) {\r\n swap = leftChildIndex;\r\n }\r\n }\r\n\r\n if (rightChildIndex < length) {\r\n rightChild = this.heap[rightChildIndex];\r\n if (\r\n (swap === null && rightChild.f < element.f) ||\r\n (swap !== null && rightChild.f < leftChild!.f)\r\n ) {\r\n swap = rightChildIndex;\r\n }\r\n }\r\n\r\n if (swap === null) break;\r\n this.heap[index] = this.heap[swap];\r\n this.heap[swap] = element;\r\n index = swap;\r\n }\r\n }\r\n\r\n rescoreElement(node: GridNode): void {\r\n const index = this.heap.indexOf(node);\r\n if (index !== -1) {\r\n // Since f usually decreases in A*, we bubble up\r\n this.bubbleUp(index);\r\n }\r\n }\r\n}\r\n\r\nexport class PathFinder {\r\n private gridSize = 20; // Size of each grid cell\r\n private grid: GridNode[][] = [];\r\n private width = 0;\r\n private height = 0;\r\n private bounds = { minX: 0, minY: 0, maxX: 0, maxY: 0 };\r\n\r\n constructor(\r\n private nodes: { x: number; y: number; width: number; height: number; id: string }[],\r\n private graphWidth: number = 2000,\r\n private graphHeight: number = 2000\r\n ) {\r\n this.initializeGrid();\r\n }\r\n\r\n private initializeGrid() {\r\n // Determine bounds based on nodes, with some padding\r\n if (this.nodes.length === 0) return;\r\n\r\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n\r\n this.nodes.forEach(node => {\r\n minX = Math.min(minX, node.x);\r\n minY = Math.min(minY, node.y);\r\n maxX = Math.max(maxX, node.x + node.width);\r\n maxY = Math.max(maxY, node.y + node.height);\r\n });\r\n\r\n // Add padding\r\n const padding = 100;\r\n this.bounds = {\r\n minX: Math.floor((minX - padding) / this.gridSize) * this.gridSize,\r\n minY: Math.floor((minY - padding) / this.gridSize) * this.gridSize,\r\n maxX: Math.ceil((maxX + padding) / this.gridSize) * this.gridSize,\r\n maxY: Math.ceil((maxY + padding) / this.gridSize) * this.gridSize\r\n };\r\n\r\n this.width = Math.ceil((this.bounds.maxX - this.bounds.minX) / this.gridSize);\r\n this.height = Math.ceil((this.bounds.maxY - this.bounds.minY) / this.gridSize);\r\n\r\n // Initialize grid\r\n this.grid = [];\r\n for (let y = 0; y < this.height; y++) {\r\n const row: GridNode[] = [];\r\n for (let x = 0; x < this.width; x++) {\r\n row.push({\r\n x,\r\n y,\r\n walkable: true,\r\n g: 0,\r\n h: 0,\r\n f: 0,\r\n parent: null,\r\n opened: false,\r\n closed: false\r\n });\r\n }\r\n this.grid.push(row);\r\n }\r\n\r\n // Mark obstacles\r\n this.nodes.forEach(node => {\r\n const startX = Math.floor((node.x - this.bounds.minX) / this.gridSize);\r\n const startY = Math.floor((node.y - this.bounds.minY) / this.gridSize);\r\n const endX = Math.ceil((node.x + node.width - this.bounds.minX) / this.gridSize);\r\n const endY = Math.ceil((node.y + node.height - this.bounds.minY) / this.gridSize);\r\n\r\n for (let y = Math.max(0, startY); y < Math.min(this.height, endY); y++) {\r\n for (let x = Math.max(0, startX); x < Math.min(this.width, endX); x++) {\r\n this.grid[y][x].walkable = false;\r\n }\r\n }\r\n });\r\n }\r\n\r\n findPath(start: XYPosition, end: XYPosition): XYPosition[] {\r\n const startGridX = Math.floor((start.x - this.bounds.minX) / this.gridSize);\r\n const startGridY = Math.floor((start.y - this.bounds.minY) / this.gridSize);\r\n const endGridX = Math.floor((end.x - this.bounds.minX) / this.gridSize);\r\n const endGridY = Math.floor((end.y - this.bounds.minY) / this.gridSize);\r\n\r\n // Check if start or end are out of bounds\r\n if (!this.isValid(startGridX, startGridY) || !this.isValid(endGridX, endGridY)) {\r\n return [start, end]; // Fallback to straight line\r\n }\r\n\r\n // Reset grid state for new search (optimization: use a search ID instead of clearing all?)\r\n // For now, simple reset is safer, but O(W*H). \r\n // Optimization: Only reset nodes we touch? \r\n // Let's iterate over the grid to reset. This is slow if grid is huge.\r\n // Better: Use a 'visitedToken' on GridNode and increment it per search.\r\n // But I can't easily change GridNode interface without touching everything.\r\n // Let's stick to resetting for now, but maybe optimize later.\r\n // Actually, since we create a NEW PathFinder on drag stop, the grid is fresh.\r\n // But findPath is called multiple times (once per edge).\r\n // So we MUST reset.\r\n // Optimization: Keep a list of visited nodes and reset only them.\r\n\r\n // We'll use a `resetList` to track modified nodes and reset them at the end.\r\n const resetList: GridNode[] = [];\r\n\r\n const startNode = this.grid[startGridY][startGridX];\r\n const endNode = this.grid[endGridY][endGridX];\r\n\r\n // Temporarily make start and end walkable\r\n const startWasWalkable = startNode.walkable;\r\n const endWasWalkable = endNode.walkable;\r\n startNode.walkable = true;\r\n endNode.walkable = true;\r\n resetList.push(startNode, endNode);\r\n\r\n const openList = new MinHeap();\r\n startNode.g = 0;\r\n startNode.h = Math.abs(startNode.x - endNode.x) + Math.abs(startNode.y - endNode.y);\r\n startNode.f = startNode.g + startNode.h;\r\n startNode.opened = true;\r\n openList.push(startNode);\r\n resetList.push(startNode);\r\n\r\n let pathFound = false;\r\n\r\n while (openList.size() > 0) {\r\n const currentNode = openList.pop()!;\r\n currentNode.closed = true;\r\n\r\n if (currentNode === endNode) {\r\n pathFound = true;\r\n break;\r\n }\r\n\r\n const neighbors = this.getNeighbors(currentNode);\r\n for (const neighbor of neighbors) {\r\n if (neighbor.closed || !neighbor.walkable) {\r\n continue;\r\n }\r\n\r\n const gScore = currentNode.g + 1;\r\n\r\n if (!neighbor.opened || gScore < neighbor.g) {\r\n neighbor.g = gScore;\r\n neighbor.h = Math.abs(neighbor.x - endNode.x) + Math.abs(neighbor.y - endNode.y);\r\n neighbor.f = neighbor.g + neighbor.h;\r\n neighbor.parent = currentNode;\r\n\r\n if (!neighbor.opened) {\r\n neighbor.opened = true;\r\n openList.push(neighbor);\r\n resetList.push(neighbor);\r\n } else {\r\n openList.rescoreElement(neighbor);\r\n }\r\n }\r\n }\r\n }\r\n\r\n let resultPath: XYPosition[] = [start, end];\r\n\r\n if (pathFound) {\r\n const path: XYPosition[] = [];\r\n let curr: GridNode | null = endNode;\r\n while (curr) {\r\n path.unshift({\r\n x: curr.x * this.gridSize + this.bounds.minX + this.gridSize / 2,\r\n y: curr.y * this.gridSize + this.bounds.minY + this.gridSize / 2\r\n });\r\n curr = curr.parent;\r\n }\r\n path[0] = start;\r\n path[path.length - 1] = end;\r\n resultPath = this.simplifyPath(path);\r\n }\r\n\r\n // Cleanup\r\n startNode.walkable = startWasWalkable;\r\n endNode.walkable = endWasWalkable;\r\n\r\n // Reset modified nodes\r\n for (const node of resetList) {\r\n node.g = 0;\r\n node.h = 0;\r\n node.f = 0;\r\n node.parent = null;\r\n node.opened = false;\r\n node.closed = false;\r\n }\r\n\r\n return resultPath;\r\n }\r\n\r\n private isValid(x: number, y: number): boolean {\r\n return x >= 0 && x < this.width && y >= 0 && y < this.height;\r\n }\r\n\r\n private getNeighbors(node: GridNode): GridNode[] {\r\n const neighbors: GridNode[] = [];\r\n const dirs = [[0, 1], [1, 0], [0, -1], [-1, 0]]; // 4-directional\r\n\r\n for (const [dx, dy] of dirs) {\r\n const newX = node.x + dx;\r\n const newY = node.y + dy;\r\n\r\n if (this.isValid(newX, newY)) {\r\n neighbors.push(this.grid[newY][newX]);\r\n }\r\n }\r\n\r\n return neighbors;\r\n }\r\n\r\n private simplifyPath(path: XYPosition[]): XYPosition[] {\r\n if (path.length <= 2) return path;\r\n\r\n const simplified: XYPosition[] = [path[0]];\r\n let direction = {\r\n x: Math.sign(path[1].x - path[0].x),\r\n y: Math.sign(path[1].y - path[0].y)\r\n };\r\n\r\n for (let i = 1; i < path.length - 1; i++) {\r\n const nextPoint = path[i + 1];\r\n const currentPoint = path[i];\r\n\r\n const newDirection = {\r\n x: Math.sign(nextPoint.x - currentPoint.x),\r\n y: Math.sign(nextPoint.y - currentPoint.y)\r\n };\r\n\r\n // If direction changes, add the turning point\r\n if (newDirection.x !== direction.x || newDirection.y !== direction.y) {\r\n simplified.push(currentPoint);\r\n direction = newDirection;\r\n }\r\n }\r\n\r\n simplified.push(path[path.length - 1]);\r\n return simplified;\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ngx-workflow-zoom-controls',\r\n imports: [CommonModule],\r\n templateUrl: './zoom-controls.component.html',\r\n styleUrls: ['./zoom-controls.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ZoomControlsComponent {\r\n @Input() zoom: number = 1;\r\n @Input() minZoom: number = 0.1;\r\n @Input() maxZoom: number = 10;\r\n\r\n @Output() zoomIn = new EventEmitter<void>();\r\n @Output() zoomOut = new EventEmitter<void>();\r\n @Output() fitView = new EventEmitter<void>();\r\n @Output() resetZoom = new EventEmitter<void>();\r\n\r\n get zoomPercent(): number {\r\n return Math.round(this.zoom * 100);\r\n }\r\n\r\n onZoomIn(): void {\r\n this.zoomIn.emit();\r\n }\r\n\r\n onZoomOut(): void {\r\n this.zoomOut.emit();\r\n }\r\n\r\n onFitView(): void {\r\n this.fitView.emit();\r\n }\r\n\r\n onResetZoom(): void {\r\n this.resetZoom.emit();\r\n }\r\n}\r\n","<div class=\"ngx-workflow__zoom-controls\">\r\n <button class=\"ngx-workflow__zoom-button\" (click)=\"onZoomIn()\" [disabled]=\"zoom >= maxZoom\" title=\"Zoom In\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <path d=\"M8 3v10M3 8h10\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\r\n </svg>\r\n </button>\r\n\r\n <button class=\"ngx-workflow__zoom-button\" (click)=\"onZoomOut()\" [disabled]=\"zoom <= minZoom\" title=\"Zoom Out\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <path d=\"M3 8h10\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\r\n </svg>\r\n </button>\r\n\r\n <button class=\"ngx-workflow__zoom-button\" (click)=\"onFitView()\" title=\"Fit View\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\r\n <path d=\"M5 5L11 11M11 5L5 11\" stroke=\"currentColor\" stroke-width=\"1.5\" />\r\n </svg>\r\n </button>\r\n\r\n <button class=\"ngx-workflow__zoom-button\" (click)=\"onResetZoom()\" title=\"Reset Zoom (100%)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <text x=\"8\" y=\"12\" text-anchor=\"middle\" font-size=\"10\" fill=\"currentColor\">1:1</text>\r\n </svg>\r\n </button>\r\n\r\n <div class=\"ngx-workflow__zoom-level\">{{ zoomPercent }}%</div>\r\n</div>","import { Injectable, signal, computed, WritableSignal } from '@angular/core';\nimport { Node, Edge, Viewport, DiagramState } from '../models';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UndoRedoService {\n private undoStack: WritableSignal<DiagramState[]> = signal([]);\n private redoStack: WritableSignal<DiagramState[]> = signal([]);\n\n constructor() { }\n\n // Saves the current state of the diagram to the undo stack\n saveState(currentState: DiagramState): void {\n this.undoStack.update((stack) => [...stack, currentState]);\n this.redoStack.set([]); // Clear redo stack on new action\n // console.log('State saved');\n // console.log('Undo Stack size:', this.undoStack().length);\n }\n\n // Undoes the last action\n undo(currentState: DiagramState): DiagramState | undefined {\n const previousState = this.undoStack().pop();\n if (previousState) {\n this.redoStack.update((stack) => [...stack, currentState]);\n console.log('Undo performed. Undo Stack size:', this.undoStack().length);\n console.log('Redo Stack size:', this.redoStack().length);\n return previousState;\n }\n console.log('Nothing to undo.');\n return undefined;\n }\n\n // Redoes the last undone action\n redo(currentState: DiagramState): DiagramState | undefined {\n const nextState = this.redoStack().pop();\n if (nextState) {\n this.undoStack.update((stack) => [...stack, currentState]);\n console.log('Redo performed. Undo Stack size:', this.undoStack().length);\n console.log('Redo Stack size:', this.redoStack().length);\n return nextState;\n }\n console.log('Nothing to redo.');\n return undefined;\n }\n\n canUndo = computed(() => this.undoStack().length > 0);\n canRedo = computed(() => this.redoStack().length > 0);\n\n clearStacks(): void {\n this.undoStack.set([]);\n this.redoStack.set([]);\n }\n}\n","import {\r\n Injectable,\r\n signal,\r\n EventEmitter,\r\n computed,\r\n WritableSignal,\r\n ElementRef,\r\n effect,\r\n} from '@angular/core';\r\nimport { Node, Edge, Viewport, XYPosition, DiagramState, AlignmentGuide } from '../models';\r\nimport { Observable, Subject, animationFrameScheduler } from 'rxjs';\r\nimport { throttleTime } from 'rxjs/operators';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { UndoRedoService } from './undo-redo.service'; // Import UndoRedoService and DiagramState\r\n\r\ninterface Connection {\r\n source: string;\r\n sourceHandle?: string;\r\n target: string;\r\n targetHandle?: string;\r\n}\r\n\r\n// Interface for temporary edges (preview edges)\r\ninterface TempEdge extends Edge {\r\n sourceX: number;\r\n sourceY: number;\r\n targetX: number;\r\n targetY: number;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class DiagramStateService {\r\n readonly nodes: WritableSignal<Node[]> = signal<Node[]>([]);\r\n readonly edges: WritableSignal<Edge[]> = signal<Edge[]>([]);\r\n readonly tempEdges: WritableSignal<TempEdge[]> = signal<TempEdge[]>([]);\r\n readonly viewport: WritableSignal<Viewport> = signal<Viewport>({ x: 0, y: 0, zoom: 1 });\r\n readonly alignmentGuides = signal<AlignmentGuide[]>([]);\r\n readonly searchQuery = signal<string>('');\r\n readonly filterType = signal<string | null>(null);\r\n readonly containerDimensions = signal<{ width: number; height: number }>({ width: 0, height: 0 });\r\n\r\n // Computed signals\r\n readonly selectedNodes = computed(() => this.nodes().filter((n) => n.selected));\r\n readonly selectedEdges = computed(() => this.edges().filter((e) => e.selected));\r\n\r\n readonly viewNodes = computed(() => {\r\n const nodes = this.nodes();\r\n const query = this.searchQuery().toLowerCase();\r\n const type = this.filterType();\r\n\r\n return nodes.map(node => {\r\n const matchesSearch = !query ||\r\n (node.label && node.label.toLowerCase().includes(query)) ||\r\n (node.data && JSON.stringify(node.data).toLowerCase().includes(query));\r\n\r\n const matchesType = !type || node.type === type;\r\n\r\n const isMatch = matchesSearch && matchesType;\r\n\r\n // If there is a search/filter active, highlight matches and dim non-matches\r\n // If no search/filter, reset (no highlight, no dim)\r\n const isActive = !!query || !!type;\r\n\r\n return {\r\n ...node,\r\n highlighted: isActive && isMatch,\r\n dimmed: isActive && !isMatch\r\n };\r\n });\r\n });\r\n\r\n readonly visibleNodes = computed(() => {\r\n const nodes = this.viewNodes();\r\n const viewport = this.viewport();\r\n const dimensions = this.containerDimensions();\r\n const buffer = 500; // Buffer in pixels\r\n\r\n if (dimensions.width === 0 || dimensions.height === 0) {\r\n return nodes; // Render all if dimensions not set\r\n }\r\n\r\n const minX = -viewport.x / viewport.zoom - buffer;\r\n const maxX = (-viewport.x + dimensions.width) / viewport.zoom + buffer;\r\n const minY = -viewport.y / viewport.zoom - buffer;\r\n const maxY = (-viewport.y + dimensions.height) / viewport.zoom + buffer;\r\n\r\n return nodes.filter(node => {\r\n const nodeX = node.position.x;\r\n const nodeY = node.position.y;\r\n const nodeWidth = node.width || 150; // Default width\r\n const nodeHeight = node.height || 60; // Default height\r\n\r\n return (\r\n nodeX + nodeWidth >= minX &&\r\n nodeX <= maxX &&\r\n nodeY + nodeHeight >= minY &&\r\n nodeY <= maxY\r\n );\r\n });\r\n });\r\n\r\n readonly lodLevel = computed(() => {\r\n const zoom = this.viewport().zoom;\r\n if (zoom < 0.4) return 'low';\r\n if (zoom < 0.8) return 'medium';\r\n return 'high';\r\n });\r\n\r\n // Reference to the main SVG element, set by DiagramComponent\r\n el: ElementRef<HTMLElement | SVGSVGElement> | undefined;\r\n\r\n readonly dragEnd = new EventEmitter<Node>();\r\n readonly nodesChange = new EventEmitter<Node[]>();\r\n readonly edgesChange = new EventEmitter<Edge[]>();\r\n readonly viewportChange = new EventEmitter<Viewport>();\r\n readonly nodeClick = new EventEmitter<Node>();\r\n readonly edgeClick = new EventEmitter<Edge>();\r\n readonly connect = new EventEmitter<Connection>();\r\n readonly dragStart = new EventEmitter<Node>();\r\n\r\n // Internal subjects for batched updates\r\n private nodeUpdates$ = new Subject<Node[]>();\r\n private edgeUpdates$ = new Subject<Edge[]>();\r\n private viewportUpdates$ = new Subject<Viewport>();\r\n\r\n constructor(private undoRedoService: UndoRedoService) {\r\n // Sync internal subjects to signals (for batched updates)\r\n this.nodeUpdates$\r\n .pipe(throttleTime(0, animationFrameScheduler, { leading: true, trailing: true }))\r\n .subscribe((nodes) => {\r\n this.nodes.set(nodes);\r\n });\r\n\r\n this.edgeUpdates$\r\n .pipe(throttleTime(0, animationFrameScheduler, { leading: true, trailing: true }))\r\n .subscribe((edges) => {\r\n this.edges.set(edges);\r\n });\r\n\r\n this.viewportUpdates$\r\n .pipe(throttleTime(0, animationFrameScheduler, { leading: true, trailing: true }))\r\n .subscribe((viewport) => {\r\n this.viewport.set(viewport);\r\n });\r\n\r\n // Emit changes whenever signals update\r\n effect(() => {\r\n this.nodesChange.emit(this.nodes());\r\n });\r\n\r\n effect(() => {\r\n this.edgesChange.emit(this.edges());\r\n });\r\n\r\n effect(() => {\r\n this.viewportChange.emit(this.viewport());\r\n });\r\n }\r\n\r\n // Helper to get current state for undo/redo\r\n private getCurrentState(): DiagramState {\r\n return {\r\n nodes: [...this.nodes()],\r\n edges: [...this.edges()],\r\n viewport: { ...this.viewport() },\r\n };\r\n }\r\n // Public method to retrieve the current diagram state (for export)\r\n getDiagramState(): DiagramState {\r\n return this.getCurrentState();\r\n }\r\n\r\n /**\r\n * Replace the entire diagram state (nodes, edges, viewport) with the given state.\r\n * Used for importing diagram JSON.\r\n */\r\n setDiagramState(state: DiagramState): void {\r\n // Save current state for undo\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n // Replace signals\r\n this.nodes.set(state.nodes.map(n => ({ ...n, selected: false, dragging: false, draggable: true })));\r\n this.edges.set(state.edges.map(e => ({ ...e, selected: false })));\r\n this.viewport.set(state.viewport);\r\n // Emit changes\r\n this.nodesChange.emit(this.nodes());\r\n this.edgesChange.emit(this.edges());\r\n this.viewportChange.emit(this.viewport());\r\n }\r\n // Apply state from undo/redo service\r\n private applyState(state: DiagramState): void {\r\n this.nodes.set(state.nodes);\r\n this.edges.set(state.edges);\r\n this.viewport.set(state.viewport);\r\n }\r\n\r\n undo(): void {\r\n const currentState = this.getCurrentState();\r\n const previousState = this.undoRedoService.undo(currentState);\r\n if (previousState) {\r\n this.applyState(previousState);\r\n }\r\n }\r\n\r\n redo(): void {\r\n const currentState = this.getCurrentState();\r\n const nextState = this.undoRedoService.redo(currentState);\r\n if (nextState) {\r\n this.applyState(nextState);\r\n }\r\n }\r\n\r\n onResizeStart(node: Node): void {\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n }\r\n\r\n onResizeEnd(node: Node): void {\r\n // Optional: emit resize end event if needed in the future\r\n }\r\n\r\n // --- Edge Management ---\r\n\r\n addEdge(edge: Edge): void {\r\n console.log('DiagramStateService.addEdge: start', edge);\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n this.edges.update((currentEdges) => [...currentEdges, { ...edge, selected: false }]);\r\n this.connect.emit({\r\n source: edge.source,\r\n sourceHandle: edge.sourceHandle,\r\n target: edge.target,\r\n targetHandle: edge.targetHandle,\r\n });\r\n console.log('DiagramStateService.addEdge: end');\r\n }\r\n\r\n updateEdge(id: string, changes: Partial<Edge>): void {\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n this.edges.update((currentEdges) =>\r\n currentEdges.map((edge) => {\r\n if (edge.id === id) {\r\n return { ...edge, ...changes };\r\n }\r\n return edge;\r\n })\r\n );\r\n }\r\n\r\n removeEdge(id: string): void {\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n this.edges.update((currentEdges) => currentEdges.filter((edge) => edge.id !== id));\r\n this.tempEdges.update((currentTempEdges) => currentTempEdges.filter((edge) => edge.id !== id)); // Remove from tempEdges as well\r\n }\r\n\r\n // --- Temporary Edge (Preview Edge) Management ---\r\n\r\n addTempEdge(edge: TempEdge): void {\r\n this.tempEdges.update((currentTempEdges) => [...currentTempEdges, edge]);\r\n }\r\n\r\n updateTempEdgeTarget(id: string, targetPosition: XYPosition): void {\r\n this.tempEdges.update((currentTempEdges) =>\r\n currentTempEdges.map((edge) =>\r\n edge.id === id ? { ...edge, targetX: targetPosition.x, targetY: targetPosition.y } : edge\r\n )\r\n );\r\n }\r\n\r\n // --- Viewport Management ---\r\n\r\n setViewport(viewport: Partial<Viewport>): void {\r\n this.viewport.update((currentViewport) => ({ ...currentViewport, ...viewport }));\r\n }\r\n\r\n // --- Selection Management ---\r\n\r\n selectNodes(nodeIds: string[], multi: boolean = false): void {\r\n this.nodes.update((currentNodes) =>\r\n currentNodes.map((node) => ({\r\n ...node,\r\n selected: multi\r\n ? nodeIds.includes(node.id)\r\n ? !node.selected\r\n : node.selected\r\n : nodeIds.includes(node.id),\r\n }))\r\n );\r\n }\r\n\r\n clearSelection(): void {\r\n this.nodes.update((currentNodes) => currentNodes.map((node) => ({ ...node, selected: false })));\r\n this.edges.update((currentEdges) => currentEdges.map((edge) => ({ ...edge, selected: false })));\r\n }\r\n\r\n selectAll(): void {\r\n this.nodes.update((currentNodes) => currentNodes.map((node) => ({ ...node, selected: true })));\r\n }\r\n\r\n multiSelect(nodeId: string): void {\r\n this.nodes.update((currentNodes) =>\r\n currentNodes.map((node) => ({\r\n ...node,\r\n selected: node.id === nodeId ? !node.selected : node.selected,\r\n }))\r\n );\r\n }\r\n\r\n deleteSelectedElements(): void {\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n const nodesToDelete = this.selectedNodes().map((node) => node.id);\r\n const edgesToDelete = this.selectedEdges().map((edge) => edge.id);\r\n\r\n // Remove nodes and associated edges\r\n this.nodes.update((currentNodes) =>\r\n currentNodes.filter((node) => !nodesToDelete.includes(node.id))\r\n );\r\n this.edges.update((currentEdges) =>\r\n currentEdges.filter(\r\n (edge) =>\r\n !edgesToDelete.includes(edge.id) &&\r\n !nodesToDelete.includes(edge.source) &&\r\n !nodesToDelete.includes(edge.target)\r\n )\r\n );\r\n\r\n // Clear selection after deletion\r\n this.clearSelection();\r\n console.log('Selected elements deleted');\r\n }\r\n\r\n // --- Alignment & Distribution ---\r\n\r\n alignNodes(alignment: 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom'): void {\r\n const selectedNodes = this.selectedNodes();\r\n if (selectedNodes.length < 2) return;\r\n\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n\r\n let targetValue: number;\r\n\r\n switch (alignment) {\r\n case 'left':\r\n targetValue = Math.min(...selectedNodes.map((n) => n.position.x));\r\n break;\r\n case 'center': {\r\n const minX = Math.min(...selectedNodes.map((n) => n.position.x));\r\n const maxX = Math.max(...selectedNodes.map((n) => n.position.x + (n.width || 170)));\r\n targetValue = minX + (maxX - minX) / 2;\r\n break;\r\n }\r\n case 'right':\r\n targetValue = Math.max(...selectedNodes.map((n) => n.position.x + (n.width || 170)));\r\n break;\r\n case 'top':\r\n targetValue = Math.min(...selectedNodes.map((n) => n.position.y));\r\n break;\r\n case 'middle': {\r\n const minY = Math.min(...selectedNodes.map((n) => n.position.y));\r\n const maxY = Math.max(...selectedNodes.map((n) => n.position.y + (n.height || 60)));\r\n targetValue = minY + (maxY - minY) / 2;\r\n break;\r\n }\r\n case 'bottom':\r\n targetValue = Math.max(...selectedNodes.map((n) => n.position.y + (n.height || 60)));\r\n break;\r\n }\r\n\r\n this.nodes.update((currentNodes) =>\r\n currentNodes.map((node) => {\r\n if (!node.selected) return node;\r\n\r\n const newPos = { ...node.position };\r\n const width = node.width || 170;\r\n const height = node.height || 60;\r\n\r\n switch (alignment) {\r\n case 'left':\r\n newPos.x = targetValue;\r\n break;\r\n case 'center':\r\n newPos.x = targetValue - width / 2;\r\n break;\r\n case 'right':\r\n newPos.x = targetValue - width;\r\n break;\r\n case 'top':\r\n newPos.y = targetValue;\r\n break;\r\n case 'middle':\r\n newPos.y = targetValue - height / 2;\r\n break;\r\n case 'bottom':\r\n newPos.y = targetValue - height;\r\n break;\r\n }\r\n return { ...node, position: newPos };\r\n })\r\n );\r\n }\r\n\r\n distributeNodes(distribution: 'horizontal' | 'vertical'): void {\r\n const selectedNodes = this.selectedNodes();\r\n if (selectedNodes.length < 3) return;\r\n\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n\r\n // Sort nodes by position\r\n const sortedNodes = [...selectedNodes].sort((a, b) => {\r\n return distribution === 'horizontal' ? a.position.x - b.position.x : a.position.y - b.position.y;\r\n });\r\n\r\n const firstNode = sortedNodes[0];\r\n const lastNode = sortedNodes[sortedNodes.length - 1];\r\n\r\n if (distribution === 'horizontal') {\r\n const totalSpan = lastNode.position.x - firstNode.position.x;\r\n const step = totalSpan / (sortedNodes.length - 1);\r\n\r\n this.nodes.update(nodes => nodes.map(node => {\r\n const index = sortedNodes.findIndex(n => n.id === node.id);\r\n if (index === -1) return node;\r\n return {\r\n ...node,\r\n position: {\r\n ...node.position,\r\n x: firstNode.position.x + (step * index)\r\n }\r\n };\r\n }));\r\n } else {\r\n const totalSpan = lastNode.position.y - firstNode.position.y;\r\n const step = totalSpan / (sortedNodes.length - 1);\r\n\r\n this.nodes.update(nodes => nodes.map(node => {\r\n const index = sortedNodes.findIndex(n => n.id === node.id);\r\n if (index === -1) return node;\r\n return {\r\n ...node,\r\n position: {\r\n ...node.position,\r\n y: firstNode.position.y + (step * index)\r\n }\r\n };\r\n }));\r\n }\r\n }\r\n\r\n // --- Internal batching methods for components to use ---\r\n batchUpdateNodes(updatedNodes: Node[]): void {\r\n this.nodeUpdates$.next(updatedNodes);\r\n }\r\n\r\n batchUpdateEdges(updatedEdges: Edge[]): void {\r\n this.edgeUpdates$.next(updatedEdges);\r\n }\r\n\r\n batchUpdateViewport(updatedViewport: Viewport): void {\r\n this.viewportUpdates$.next(updatedViewport);\r\n }\r\n\r\n // --- Event Emitters triggered by components ---\r\n onNodeClick(node: Node): void {\r\n this.nodeClick.emit(node);\r\n }\r\n\r\n onEdgeClick(edge: Edge): void {\r\n this.edgeClick.emit(edge);\r\n }\r\n\r\n\r\n\r\n onDragStart(node: Node): void {\r\n this.undoRedoService.saveState(this.getCurrentState()); // Save state before drag starts\r\n this.dragStart.emit(node);\r\n this.updateNode(node.id, { dragging: true });\r\n }\r\n\r\n onDragEnd(node: Node): void {\r\n this.dragEnd.emit(node);\r\n this.updateNode(node.id, { dragging: false });\r\n this.alignmentGuides.set([]); // Clear alignment guides\r\n // State is already saved at dragStart, so no need to save again here unless\r\n // a single drag operation is considered a single undoable action.\r\n // If multiple small state changes during drag need to be undone as one,\r\n // then the saveState logic here would be different (e.g., debounced save).\r\n }\r\n // --- Clipboard Operations ---\r\n\r\n private clipboard: { nodes: Node[]; edges: Edge[] } = { nodes: [], edges: [] };\r\n\r\n copy(): void {\r\n const selectedNodes = this.selectedNodes();\r\n if (selectedNodes.length === 0) return;\r\n\r\n const selectedNodeIds = new Set(selectedNodes.map((n) => n.id));\r\n\r\n // Find edges that are connected ONLY to selected nodes\r\n const internalEdges = this.edges().filter(\r\n (edge) => selectedNodeIds.has(edge.source) && selectedNodeIds.has(edge.target)\r\n );\r\n\r\n // Deep copy to avoid reference issues\r\n this.clipboard = {\r\n nodes: JSON.parse(JSON.stringify(selectedNodes)),\r\n edges: JSON.parse(JSON.stringify(internalEdges)),\r\n };\r\n console.log('Copied to clipboard:', this.clipboard);\r\n }\r\n\r\n paste(): void {\r\n if (this.clipboard.nodes.length === 0) return;\r\n\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n\r\n const idMap = new Map<string, string>();\r\n const newNodes: Node[] = [];\r\n const newEdges: Edge[] = [];\r\n\r\n // Create new nodes with new IDs and offset position\r\n this.clipboard.nodes.forEach((node) => {\r\n const newId = uuidv4();\r\n idMap.set(node.id, newId);\r\n newNodes.push({\r\n ...node,\r\n id: newId,\r\n position: { x: node.position.x + 20, y: node.position.y + 20 },\r\n selected: true, // Select pasted nodes\r\n });\r\n });\r\n\r\n // Create new edges with updated source/target IDs\r\n this.clipboard.edges.forEach((edge) => {\r\n const newSource = idMap.get(edge.source);\r\n const newTarget = idMap.get(edge.target);\r\n if (newSource && newTarget) {\r\n newEdges.push({\r\n ...edge,\r\n id: uuidv4(),\r\n source: newSource,\r\n target: newTarget,\r\n selected: true, // Select pasted edges\r\n });\r\n }\r\n });\r\n\r\n // Deselect existing elements\r\n this.clearSelection();\r\n\r\n // Add new elements\r\n this.nodes.update((nodes) => [...nodes, ...newNodes]);\r\n this.edges.update((edges) => [...edges, ...newEdges]);\r\n }\r\n\r\n cut(): void {\r\n this.copy();\r\n this.deleteSelectedElements();\r\n }\r\n\r\n duplicate(): void {\r\n this.copy();\r\n this.paste();\r\n }\r\n // --- Grouping Operations ---\r\n\r\n groupNodes(nodeIds: string[]): void {\r\n if (nodeIds.length < 2) return;\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n\r\n const nodesToGroup = this.nodes().filter((n) => nodeIds.includes(n.id));\r\n if (nodesToGroup.length === 0) return;\r\n\r\n // Calculate bounding box\r\n const minX = Math.min(...nodesToGroup.map((n) => n.position.x));\r\n const minY = Math.min(...nodesToGroup.map((n) => n.position.y));\r\n const maxX = Math.max(...nodesToGroup.map((n) => n.position.x + (n.width || 150)));\r\n const maxY = Math.max(...nodesToGroup.map((n) => n.position.y + (n.height || 60)));\r\n\r\n const padding = 20;\r\n const groupNode: Node = {\r\n id: uuidv4(),\r\n type: 'group',\r\n position: { x: minX - padding, y: minY - padding },\r\n width: maxX - minX + padding * 2,\r\n height: maxY - minY + padding * 2,\r\n data: { label: 'Group' },\r\n expanded: true,\r\n selected: true,\r\n };\r\n\r\n // Update children to point to parent\r\n // Note: We are keeping absolute coordinates for now, so no position update needed for children\r\n const updatedChildren = nodesToGroup.map((n) => ({ ...n, parentId: groupNode.id, selected: false }));\r\n const otherNodes = this.nodes().filter((n) => !nodeIds.includes(n.id));\r\n\r\n this.nodes.set([...otherNodes, groupNode, ...updatedChildren]);\r\n this.clearSelection();\r\n this.selectNodes([groupNode.id]);\r\n }\r\n\r\n ungroupNodes(groupId: string): void {\r\n const groupNode = this.nodes().find((n) => n.id === groupId);\r\n if (!groupNode || groupNode.type !== 'group') return;\r\n\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n\r\n // Remove parentId from children\r\n const updatedNodes = this.nodes().map((n) => {\r\n if (n.parentId === groupId) {\r\n const { parentId, ...rest } = n;\r\n return { ...rest, selected: true };\r\n }\r\n return n;\r\n });\r\n\r\n // Remove group node\r\n this.nodes.set(updatedNodes.filter((n) => n.id !== groupId));\r\n }\r\n\r\n addNode(node: Node): void {\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n this.nodes.update((nodes) => [...nodes, { ...node, selected: false }]);\r\n }\r\n\r\n removeNode(id: string): void {\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n this.nodes.update((nodes) => nodes.filter((n) => n.id !== id));\r\n this.edges.update((edges) => edges.filter((e) => e.source !== id && e.target !== id));\r\n }\r\n\r\n updateNode(id: string, changes: Partial<Node>): void {\r\n if (!changes.dragging && !changes.position) {\r\n this.undoRedoService.saveState(this.getCurrentState());\r\n }\r\n this.nodes.update((nodes) =>\r\n nodes.map((n) => {\r\n if (n.id === id) {\r\n return { ...n, ...changes };\r\n }\r\n return n;\r\n })\r\n );\r\n }\r\n\r\n resizeNode(id: string, width: number, height: number, position?: XYPosition): void {\r\n this.nodes.update((nodes) =>\r\n nodes.map((n) => {\r\n if (n.id === id) {\r\n return { ...n, width, height, ...(position ? { position } : {}) };\r\n }\r\n return n;\r\n })\r\n );\r\n }\r\n\r\n\r\n toggleGroup(groupId: string): void {\r\n this.nodes.update((nodes) =>\r\n nodes.map((n) => {\r\n if (n.id === groupId) {\r\n return { ...n, expanded: !n.expanded };\r\n }\r\n return n;\r\n })\r\n );\r\n }\r\n\r\n // Move node and handle group children\r\n moveNode(id: string, newPosition: XYPosition): void {\r\n // console.log('moveNode', id, newPosition);\r\n const node = this.nodes().find((n) => n.id === id);\r\n if (!node) return;\r\n\r\n // Snapping Logic\r\n let snappedX = newPosition.x;\r\n let snappedY = newPosition.y;\r\n const guides: AlignmentGuide[] = [];\r\n const SNAP_DISTANCE = 5;\r\n const GRID_SIZE = 20;\r\n\r\n // 1. Snap to Grid (lower priority)\r\n snappedX = Math.round(snappedX / GRID_SIZE) * GRID_SIZE;\r\n snappedY = Math.round(snappedY / GRID_SIZE) * GRID_SIZE;\r\n\r\n // 2. Snap to Nodes (higher priority)\r\n // Only snap if dragging a single node (for simplicity for now)\r\n const otherNodes = this.nodes().filter(n => n.id !== id && n.parentId === node.parentId && !n.selected);\r\n\r\n let snappedXNode = false;\r\n let snappedYNode = false;\r\n\r\n // Horizontal Alignment (aligning Y coordinates)\r\n // Check Top, Center, Bottom\r\n const myHeight = node.height || 150; // Default height\r\n const myCenterY = newPosition.y + myHeight / 2;\r\n const myBottomY = newPosition.y + myHeight;\r\n\r\n for (const other of otherNodes) {\r\n const otherHeight = other.height || 150;\r\n const otherY = other.position.y;\r\n const otherCenterY = otherY + otherHeight / 2;\r\n const otherBottomY = otherY + otherHeight;\r\n\r\n // Top to Top\r\n if (Math.abs(newPosition.y - otherY) < SNAP_DISTANCE) {\r\n snappedY = otherY;\r\n snappedYNode = true;\r\n guides.push({ type: 'horizontal', position: otherY, start: Math.min(newPosition.x, other.position.x), end: Math.max(newPosition.x + (node.width || 150), other.position.x + (other.width || 150)) });\r\n }\r\n // Top to Bottom\r\n else if (Math.abs(newPosition.y - otherBottomY) < SNAP_DISTANCE) {\r\n snappedY = otherBottomY;\r\n snappedYNode = true;\r\n guides.push({ type: 'horizontal', position: otherBottomY, start: Math.min(newPosition.x, other.position.x), end: Math.max(newPosition.x + (node.width || 150), other.position.x + (other.width || 150)) });\r\n }\r\n // Center to Center\r\n else if (Math.abs(myCenterY - otherCenterY) < SNAP_DISTANCE) {\r\n snappedY = otherCenterY - myHeight / 2;\r\n snappedYNode = true;\r\n guides.push({ type: 'horizontal', position: otherCenterY, start: Math.min(newPosition.x, other.position.x), end: Math.max(newPosition.x + (node.width || 150), other.position.x + (other.width || 150)) });\r\n }\r\n // Bottom to Top\r\n else if (Math.abs(myBottomY - otherY) < SNAP_DISTANCE) {\r\n snappedY = otherY - myHeight;\r\n snappedYNode = true;\r\n guides.push({ type: 'horizontal', position: otherY, start: Math.min(newPosition.x, other.position.x), end: Math.max(newPosition.x + (node.width || 150), other.position.x + (other.width || 150)) });\r\n }\r\n // Bottom to Bottom\r\n else if (Math.abs(myBottomY - otherBottomY) < SNAP_DISTANCE) {\r\n snappedY = otherBottomY - myHeight;\r\n snappedYNode = true;\r\n guides.push({ type: 'horizontal', position: otherBottomY, start: Math.min(newPosition.x, other.position.x), end: Math.max(newPosition.x + (node.width || 150), other.position.x + (other.width || 150)) });\r\n }\r\n\r\n if (snappedYNode) break; // Snap to first match\r\n }\r\n\r\n // Vertical Alignment (aligning X coordinates)\r\n // Check Left, Center, Right\r\n const myWidth = node.width || 150; // Default width\r\n const myCenterX = newPosition.x + myWidth / 2;\r\n const myRightX = newPosition.x + myWidth;\r\n\r\n for (const other of otherNodes) {\r\n const otherWidth = other.width || 150;\r\n const otherX = other.position.x;\r\n const otherCenterX = otherX + otherWidth / 2;\r\n const otherRightX = otherX + otherWidth;\r\n\r\n // Left to Left\r\n if (Math.abs(newPosition.x - otherX) < SNAP_DISTANCE) {\r\n snappedX = otherX;\r\n snappedXNode = true;\r\n guides.push({ type: 'vertical', position: otherX, start: Math.min(newPosition.y, other.position.y), end: Math.max(newPosition.y + (node.height || 60), other.position.y + (other.height || 60)) });\r\n }\r\n // Left to Right\r\n else if (Math.abs(newPosition.x - otherRightX) < SNAP_DISTANCE) {\r\n snappedX = otherRightX;\r\n snappedXNode = true;\r\n guides.push({ type: 'vertical', position: otherRightX, start: Math.min(newPosition.y, other.position.y), end: Math.max(newPosition.y + (node.height || 60), other.position.y + (other.height || 60)) });\r\n }\r\n // Center to Center\r\n else if (Math.abs(myCenterX - otherCenterX) < SNAP_DISTANCE) {\r\n snappedX = otherCenterX - myWidth / 2;\r\n snappedXNode = true;\r\n guides.push({ type: 'vertical', position: otherCenterX, start: Math.min(newPosition.y, other.position.y), end: Math.max(newPosition.y + (node.height || 60), other.position.y + (other.height || 60)) });\r\n }\r\n // Right to Left\r\n else if (Math.abs(myRightX - otherX) < SNAP_DISTANCE) {\r\n snappedX = otherX - myWidth;\r\n snappedXNode = true;\r\n guides.push({ type: 'vertical', position: otherX, start: Math.min(newPosition.y, other.position.y), end: Math.max(newPosition.y + (node.height || 60), other.position.y + (other.height || 60)) });\r\n }\r\n // Right to Right\r\n else if (Math.abs(myRightX - otherRightX) < SNAP_DISTANCE) {\r\n snappedX = otherRightX - myWidth;\r\n snappedXNode = true;\r\n guides.push({ type: 'vertical', position: otherRightX, start: Math.min(newPosition.y, other.position.y), end: Math.max(newPosition.y + (node.height || 60), other.position.y + (other.height || 60)) });\r\n }\r\n\r\n if (snappedXNode) break;\r\n }\r\n\r\n this.alignmentGuides.set(guides);\r\n\r\n const finalPosition = { x: snappedX, y: snappedY };\r\n const dx = finalPosition.x - node.position.x;\r\n const dy = finalPosition.y - node.position.y;\r\n\r\n if (dx === 0 && dy === 0) return;\r\n\r\n // Update the moved node\r\n const updatedNodes = this.nodes().map((n) => {\r\n if (n.id === id) {\r\n return { ...n, position: finalPosition };\r\n }\r\n return n;\r\n });\r\n\r\n // If it's a group, move all children recursively\r\n if (node.type === 'group') {\r\n this.moveChildren(id, dx, dy, updatedNodes);\r\n }\r\n\r\n this.nodes.set(updatedNodes);\r\n }\r\n\r\n private moveChildren(parentId: string, dx: number, dy: number, nodes: Node[], visited = new Set<string>()): void {\r\n if (visited.has(parentId)) {\r\n console.warn('Cycle detected in group hierarchy, stopping recursion for', parentId);\r\n return;\r\n }\r\n visited.add(parentId);\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n if (nodes[i].parentId === parentId) {\r\n nodes[i] = {\r\n ...nodes[i],\r\n position: {\r\n x: nodes[i].position.x + dx,\r\n y: nodes[i].position.y + dy,\r\n },\r\n };\r\n // Recursively move children of children (nested groups)\r\n if (nodes[i].type === 'group') {\r\n this.moveChildren(nodes[i].id, dx, dy, nodes, visited);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Move multiple nodes (batch movement)\r\n moveNodes(moves: { id: string; position: XYPosition }[]): void {\r\n console.log('moveNodes', moves.length);\r\n const GRID_SIZE = 20;\r\n\r\n let currentNodes = [...this.nodes()];\r\n this.alignmentGuides.set([]); // Clear guides during batch move for now\r\n\r\n moves.forEach(move => {\r\n const node = currentNodes.find(n => n.id === move.id);\r\n if (!node) return;\r\n\r\n // Simple grid snap for batch move\r\n const snappedX = Math.round(move.position.x / GRID_SIZE) * GRID_SIZE;\r\n const snappedY = Math.round(move.position.y / GRID_SIZE) * GRID_SIZE;\r\n const finalPosition = { x: snappedX, y: snappedY };\r\n\r\n const dx = finalPosition.x - node.position.x;\r\n const dy = finalPosition.y - node.position.y;\r\n\r\n // Update parent node\r\n currentNodes = currentNodes.map(n => n.id === move.id ? { ...n, position: finalPosition } : n);\r\n\r\n // If group, move children\r\n if (node.type === 'group') {\r\n this.moveChildren(node.id, dx, dy, currentNodes);\r\n }\r\n });\r\n\r\n this.nodes.set(currentNodes);\r\n }\r\n\r\n setSearchQuery(query: string): void {\r\n this.searchQuery.set(query);\r\n }\r\n\r\n setFilterType(type: string | null): void {\r\n this.filterType.set(type);\r\n }\r\n\r\n setZoom(zoom: number): void {\r\n this.viewport.update(v => ({ ...v, zoom }));\r\n }\r\n\r\n setContainerDimensions(dimensions: { width: number; height: number }): void {\r\n this.containerDimensions.set(dimensions);\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, Input, ElementRef, ViewChild, AfterViewInit, OnDestroy, computed, Signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DiagramStateService } from '../../services/diagram-state.service';\r\nimport { Node, Viewport } from '../../models';\r\n\r\n@Component({\r\n selector: 'ngx-workflow-minimap',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './minimap.component.html',\r\n styleUrls: ['./minimap.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class MinimapComponent {\r\n @Input() nodeColor: string = '#e2e2e2';\r\n @Input() nodeClass: string = '';\r\n\r\n // Initialize signals from service\r\n nodes: Signal<Node[]>;\r\n viewport: Signal<Viewport>;\r\n\r\n // Minimap dimensions\r\n width = 200;\r\n height = 150;\r\n\r\n constructor(private diagramStateService: DiagramStateService) {\r\n this.nodes = this.diagramStateService.nodes;\r\n this.viewport = this.diagramStateService.viewport;\r\n }\r\n\r\n // Computed properties for rendering\r\n viewBox = computed(() => {\r\n const nodes = this.nodes();\r\n if (nodes.length === 0) return '0 0 100 100';\r\n\r\n const bounds = this.getBounds(nodes);\r\n const padding = 50;\r\n return `${bounds.minX - padding} ${bounds.minY - padding} ${bounds.width + padding * 2} ${bounds.height + padding * 2}`;\r\n });\r\n\r\n viewportIndicator = computed(() => {\r\n const v = this.viewport();\r\n const nodes = this.nodes();\r\n if (nodes.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\r\n\r\n // We need to map the current viewport to the minimap coordinate system\r\n // This is a bit complex because the viewport transform is applied to the main diagram\r\n // and we need to show which part of the diagram is currently visible.\r\n\r\n // For now, let's just return a placeholder. \r\n // Real implementation requires knowing the diagram container size which we might need to get from service\r\n return { x: -v.x / v.zoom, y: -v.y / v.zoom, width: 1000 / v.zoom, height: 800 / v.zoom };\r\n });\r\n\r\n private getBounds(nodes: Node[]) {\r\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n\r\n nodes.forEach(node => {\r\n minX = Math.min(minX, node.position.x);\r\n minY = Math.min(minY, node.position.y);\r\n maxX = Math.max(maxX, node.position.x + (node.width || 170));\r\n maxY = Math.max(maxY, node.position.y + (node.height || 60));\r\n });\r\n\r\n return {\r\n minX,\r\n minY,\r\n width: maxX - minX,\r\n height: maxY - minY\r\n };\r\n }\r\n onMinimapClick(event: MouseEvent) {\r\n const svg = event.currentTarget as SVGSVGElement;\r\n const rect = svg.getBoundingClientRect();\r\n\r\n // Click position relative to minimap\r\n const clickX = event.clientX - rect.left;\r\n const clickY = event.clientY - rect.top;\r\n\r\n // Convert to SVG coordinates\r\n // We need to parse the viewBox to know the scale\r\n const vb = this.viewBox().split(' ').map(parseFloat);\r\n const vbX = vb[0];\r\n const vbY = vb[1];\r\n const vbW = vb[2];\r\n const vbH = vb[3];\r\n\r\n const scaleX = vbW / rect.width;\r\n const scaleY = vbH / rect.height;\r\n\r\n const svgX = vbX + clickX * scaleX;\r\n const svgY = vbY + clickY * scaleY;\r\n\r\n // Center the viewport on this point\r\n // New viewport x = -svgX * zoom + viewportWidth / 2\r\n // We need the diagram dimensions to center perfectly, but for now we can approximate\r\n // or just move the top-left to this point.\r\n // Let's try to center.\r\n const currentZoom = this.viewport().zoom;\r\n\r\n // Assuming a default diagram size or getting it from service would be better\r\n // For now, let's just move to that position\r\n const newX = -svgX * currentZoom + 400; // 400 is approx half width\r\n const newY = -svgY * currentZoom + 300; // 300 is approx half height\r\n\r\n this.diagramStateService.setViewport({\r\n x: newX,\r\n y: newY,\r\n zoom: currentZoom\r\n });\r\n }\r\n}\r\n","<div class=\"ngx-workflow__minimap\">\r\n <svg [attr.viewBox]=\"viewBox()\" class=\"ngx-workflow__minimap-svg\" (click)=\"onMinimapClick($event)\">\r\n <rect *ngFor=\"let node of nodes()\" [attr.x]=\"node.position.x\" [attr.y]=\"node.position.y\"\r\n [attr.width]=\"node.width || 170\" [attr.height]=\"node.height || 60\" [attr.fill]=\"nodeColor\" [class]=\"nodeClass\"\r\n class=\"ngx-workflow__minimap-node\" />\r\n <rect class=\"ngx-workflow__minimap-viewport\" [attr.x]=\"viewportIndicator().x\" [attr.y]=\"viewportIndicator().y\"\r\n [attr.width]=\"viewportIndicator().width\" [attr.height]=\"viewportIndicator().height\" />\r\n </svg>\r\n</div>","import { Component, Input, computed, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DiagramStateService } from '../../services/diagram-state.service';\r\n\r\n@Component({\r\n selector: 'ngx-workflow-background',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './background.component.html',\r\n styleUrls: ['./background.component.scss']\r\n})\r\nexport class BackgroundComponent {\r\n @Input() variant: 'dots' | 'lines' | 'cross' = 'dots';\r\n @Input() gap: number = 20;\r\n @Input() size: number = 1;\r\n @Input() color: string = '#81818a';\r\n @Input() backgroundColor: string = '#f0f0f0';\r\n\r\n private diagramStateService = inject(DiagramStateService);\r\n\r\n // Computed property for pattern transform based on viewport\r\n patternTransform = computed(() => {\r\n const viewport = this.diagramStateService.viewport();\r\n return `translate(${viewport.x}, ${viewport.y}) scale(${viewport.zoom})`;\r\n });\r\n}\r\n","<svg class=\"ngx-workflow__background\" [attr.width]=\"'100%'\" [attr.height]=\"'100%'\">\r\n <defs>\r\n <!-- Dots Pattern -->\r\n <pattern *ngIf=\"variant === 'dots'\" id=\"ngx-workflow__pattern-dots\" [attr.x]=\"0\" [attr.y]=\"0\" [attr.width]=\"gap\"\r\n [attr.height]=\"gap\" patternUnits=\"userSpaceOnUse\" [attr.patternTransform]=\"patternTransform()\">\r\n <circle [attr.cx]=\"size\" [attr.cy]=\"size\" [attr.r]=\"size\" [attr.fill]=\"color\" />\r\n </pattern>\r\n\r\n <!-- Lines Pattern -->\r\n <pattern *ngIf=\"variant === 'lines'\" id=\"ngx-workflow__pattern-lines\" [attr.x]=\"0\" [attr.y]=\"0\" [attr.width]=\"gap\"\r\n [attr.height]=\"gap\" patternUnits=\"userSpaceOnUse\" [attr.patternTransform]=\"patternTransform()\">\r\n <path [attr.d]=\"'M ' + gap + ' 0 L 0 0 0 ' + gap\" [attr.fill]=\"'none'\" [attr.stroke]=\"color\"\r\n [attr.stroke-width]=\"size\" />\r\n </pattern>\r\n\r\n <!-- Cross Pattern -->\r\n <pattern *ngIf=\"variant === 'cross'\" id=\"ngx-workflow__pattern-cross\" [attr.x]=\"0\" [attr.y]=\"0\" [attr.width]=\"gap\"\r\n [attr.height]=\"gap\" patternUnits=\"userSpaceOnUse\" [attr.patternTransform]=\"patternTransform()\">\r\n <path [attr.d]=\"'M ' + gap + ' 0 L 0 0 0 ' + gap\" [attr.fill]=\"'none'\" [attr.stroke]=\"color\"\r\n [attr.stroke-width]=\"size\" />\r\n <path [attr.d]=\"'M 0 ' + (gap/2) + ' L ' + gap + ' ' + (gap/2) + ' M ' + (gap/2) + ' 0 L ' + (gap/2) + ' ' + gap\"\r\n [attr.fill]=\"'none'\" [attr.stroke]=\"color\" [attr.stroke-width]=\"size\" />\r\n </pattern>\r\n </defs>\r\n\r\n <rect width=\"100%\" height=\"100%\" [attr.fill]=\"backgroundColor\" />\r\n <rect width=\"100%\" height=\"100%\" [attr.fill]=\"'url(#ngx-workflow__pattern-' + variant + ')'\" />\r\n</svg>","import { Component, ChangeDetectionStrategy, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DiagramStateService } from '../../services/diagram-state.service';\r\n\r\n@Component({\r\n selector: 'ngx-workflow-alignment-controls',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './alignment-controls.component.html',\r\n styleUrls: ['./alignment-controls.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AlignmentControlsComponent {\r\n // Only show controls if more than 1 node is selected\r\n showControls = computed(() => this.diagramStateService.selectedNodes().length > 1);\r\n // Only show distribution controls if more than 2 nodes are selected\r\n showDistribution = computed(() => this.diagramStateService.selectedNodes().length > 2);\r\n\r\n constructor(private diagramStateService: DiagramStateService) { }\r\n\r\n align(alignment: 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom'): void {\r\n this.diagramStateService.alignNodes(alignment);\r\n }\r\n\r\n distribute(distribution: 'horizontal' | 'vertical'): void {\r\n this.diagramStateService.distributeNodes(distribution);\r\n }\r\n}\r\n","<div class=\"ngx-workflow__alignment-controls\" *ngIf=\"showControls()\">\r\n <div class=\"ngx-workflow__alignment-group\">\r\n <button (click)=\"align('left')\" title=\"Align Left\">Left</button>\r\n <button (click)=\"align('center')\" title=\"Align Center\">Center</button>\r\n <button (click)=\"align('right')\" title=\"Align Right\">Right</button>\r\n </div>\r\n <div class=\"ngx-workflow__alignment-group\">\r\n <button (click)=\"align('top')\" title=\"Align Top\">Top</button>\r\n <button (click)=\"align('middle')\" title=\"Align Middle\">Middle</button>\r\n <button (click)=\"align('bottom')\" title=\"Align Bottom\">Bottom</button>\r\n </div>\r\n <div class=\"ngx-workflow__alignment-group\" *ngIf=\"showDistribution()\">\r\n <button (click)=\"distribute('horizontal')\" title=\"Distribute Horizontally\">Dist H</button>\r\n <button (click)=\"distribute('vertical')\" title=\"Distribute Vertically\">Dist V</button>\r\n </div>\r\n</div>","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Node } from '../../models';\r\n\r\n@Component({\r\n selector: 'ngx-workflow-properties-sidebar',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './properties-sidebar.component.html',\r\n styleUrls: ['./properties-sidebar.component.scss']\r\n})\r\nexport class PropertiesSidebarComponent {\r\n @Input() node: Node | null = null;\r\n @Output() close = new EventEmitter<void>();\r\n @Output() change = new EventEmitter<Partial<Node>>();\r\n\r\n updateLabel(label: string) {\r\n if (!this.node) return;\r\n this.change.emit({ label });\r\n }\r\n\r\n updateWidth(width: number) {\r\n this.change.emit({ width });\r\n }\r\n\r\n updateHeight(height: number) {\r\n this.change.emit({ height });\r\n }\r\n\r\n updateX(x: number) {\r\n if (!this.node) return;\r\n this.change.emit({ position: { x, y: this.node.position.y } });\r\n }\r\n\r\n updateY(y: number) {\r\n if (!this.node) return;\r\n this.change.emit({ position: { x: this.node.position.x, y } });\r\n }\r\n}\r\n","<div class=\"ngx-workflow__sidebar\" [class.open]=\"!!node\">\r\n <div class=\"ngx-workflow__sidebar-header\">\r\n <h3>Node Properties</h3>\r\n <button class=\"ngx-workflow__close-btn\" (click)=\"close.emit()\">×</button>\r\n </div>\r\n\r\n <div class=\"ngx-workflow__sidebar-content\" *ngIf=\"node\">\r\n <div class=\"ngx-workflow__form-group\">\r\n <label>ID</label>\r\n <input type=\"text\" [value]=\"node.id\" disabled class=\"ngx-workflow__input disabled\">\r\n </div>\r\n\r\n <div class=\"ngx-workflow__form-group\">\r\n <label>Label</label>\r\n <input type=\"text\" [ngModel]=\"node.label\" (ngModelChange)=\"updateLabel($event)\" class=\"ngx-workflow__input\">\r\n </div>\r\n\r\n <div class=\"ngx-workflow__form-row\">\r\n <div class=\"ngx-workflow__form-group\">\r\n <label>X</label>\r\n <input type=\"number\" [ngModel]=\"node.position.x\" (ngModelChange)=\"updateX($event)\"\r\n class=\"ngx-workflow__input\">\r\n </div>\r\n <div class=\"ngx-workflow__form-group\">\r\n <label>Y</label>\r\n <input type=\"number\" [ngModel]=\"node.position.y\" (ngModelChange)=\"updateY($event)\"\r\n class=\"ngx-workflow__input\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"ngx-workflow__form-row\">\r\n <div class=\"ngx-workflow__form-group\">\r\n <label>Width</label>\r\n <input type=\"number\" [ngModel]=\"node.width || 170\" (ngModelChange)=\"updateWidth($event)\"\r\n class=\"ngx-workflow__input\">\r\n </div>\r\n <div class=\"ngx-workflow__form-group\">\r\n <label>Height</label>\r\n <input type=\"number\" [ngModel]=\"node.height || 60\" (ngModelChange)=\"updateHeight($event)\"\r\n class=\"ngx-workflow__input\">\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { Component, ChangeDetectionStrategy, ElementRef, OnInit, Renderer2, NgZone, OnDestroy, HostListener, WritableSignal, Inject, Optional, computed, ViewChild, Input, Output, EventEmitter, OnChanges, SimpleChanges, Signal, ChangeDetectorRef } from '@angular/core';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { CommonModule, NgComponentOutlet } from '@angular/common';\r\nimport { DiagramStateService } from '../../services/diagram-state.service';\r\nimport { Viewport, XYPosition, Node, Edge, TempEdge, DiagramState, AlignmentGuide } from '../../models';\r\nimport { Subscription, Observable } from 'rxjs';\r\nimport { NGX_WORKFLOW_NODE_TYPES } from '../../injection-tokens';\r\nimport { NodeComponentType } from '../../types';\r\nimport { getBezierPath, getStraightPath, getStepPath, getSelfLoopPath, getSmartEdgePath, PathFinder, getPolylineMidpoint } from '../../utils';\r\nimport { v4 as uuidv4 } from 'uuid';\r\nimport { ZoomControlsComponent } from '../zoom-controls/zoom-controls.component';\r\nimport { MinimapComponent } from '../minimap/minimap.component';\r\nimport { BackgroundComponent } from '../background/background.component';\r\nimport { AlignmentControlsComponent } from '../alignment-controls/alignment-controls.component';\r\nimport { PropertiesSidebarComponent } from '../properties-sidebar/properties-sidebar.component';\r\n\r\n// Helper function to get a node from the array\r\nfunction getNode(id: string, nodes: Node[]): Node | undefined {\r\n return nodes.find(n => n.id === id);\r\n}\r\n\r\n// Helper function to determine handle position based on node and handle id/type\r\nfunction getHandleAbsolutePosition(node: Node, handleId: string | undefined): XYPosition {\r\n const nodeWidth = node.width || 170;\r\n const nodeHeight = node.height || 60;\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n\r\n switch (handleId) {\r\n case 'top':\r\n offsetX = nodeWidth / 2;\r\n offsetY = 0;\r\n break;\r\n case 'right':\r\n offsetX = nodeWidth;\r\n offsetY = nodeHeight / 2;\r\n break;\r\n case 'bottom':\r\n offsetX = nodeWidth / 2;\r\n offsetY = nodeHeight;\r\n break;\r\n case 'left':\r\n offsetX = 0;\r\n offsetY = nodeHeight / 2;\r\n break;\r\n default: // Center of the node if no specific handle\r\n offsetX = nodeWidth / 2;\r\n offsetY = nodeHeight / 2;\r\n }\r\n return {\r\n x: node.position.x + offsetX,\r\n y: node.position.y + offsetY\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'ngx-workflow-diagram',\r\n templateUrl: './diagram.component.html',\r\n styleUrls: ['./diagram.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: true,\r\n imports: [CommonModule, ZoomControlsComponent, MinimapComponent, BackgroundComponent, AlignmentControlsComponent, PropertiesSidebarComponent]\r\n})\r\nexport class DiagramComponent implements OnInit, OnDestroy, OnChanges {\r\n // Trigger rebuild\r\n @ViewChild('svg', { static: true }) svgRef!: ElementRef<SVGSVGElement>;\r\n\r\n // Input properties for declarative usage\r\n @Input() initialNodes: Node[] = [];\r\n @Input() initialEdges: Edge[] = [];\r\n @Input() initialViewport?: Viewport;\r\n @Input() showZoomControls: boolean = true;\r\n\r\n // Input for showing/hiding minimap\r\n @Input() showMinimap: boolean = true;\r\n\r\n // Input for background configuration\r\n @Input() showBackground: boolean = true;\r\n @Input() backgroundVariant: 'dots' | 'lines' | 'cross' = 'dots';\r\n @Input() backgroundGap: number = 20;\r\n @Input() backgroundSize: number = 1;\r\n @Input() backgroundColor: string = '#81818a';\r\n @Input() backgroundBgColor: string = '#f0f0f0';\r\n\r\n // Output events\r\n @Output() nodeClick = new EventEmitter<Node>();\r\n @Output() edgeClick = new EventEmitter<Edge>();\r\n @Output() connect = new EventEmitter<{ source: string; sourceHandle?: string; target: string; targetHandle?: string }>();\r\n @Output() nodesChange = new EventEmitter<Node[]>();\r\n @Output() edgesChange = new EventEmitter<Edge[]>();\r\n @Output() nodeDoubleClick = new EventEmitter<Node>();\r\n\r\n // Sidebar State\r\n selectedNodeForEditing: Node | null = null;\r\n\r\n viewport!: WritableSignal<Viewport>;\r\n nodes!: WritableSignal<Node[]>;\r\n viewNodes!: Signal<Node[]>;\r\n filteredNodes!: Signal<Node[]>;\r\n edges!: WritableSignal<Edge[]>;\r\n tempEdges!: WritableSignal<TempEdge[]>;\r\n alignmentGuides!: Signal<AlignmentGuide[]>;\r\n\r\n // Expose Math to the template\r\n Math = Math;\r\n\r\n private _pathFinder: PathFinder | null = null;\r\n private pathCache = new Map<string, string>();\r\n private dragAnimationFrameId: number | null = null;\r\n private unlistenPointerMove: (() => void) | null = null;\r\n private unlistenPointerUp: (() => void) | null = null;\r\n private unlistenPointerLeave: (() => void) | null = null;\r\n private pathPointsCache = new Map<string, XYPosition[]>();\r\n\r\n private isPanning = false;\r\n private lastPanPosition: XYPosition = { x: 0, y: 0 };\r\n private subscriptions = new Subscription();\r\n // Lasso selection properties\r\n isSelecting = false;\r\n selectionStart: XYPosition = { x: 0, y: 0 };\r\n selectionEnd: XYPosition = { x: 0, y: 0 };\r\n\r\n // Node Dragging\r\n private isDraggingNode = false;\r\n private draggingNode: Node | null = null;\r\n private draggingNodes: Node[] = []; // All nodes being dragged (for multi-select)\r\n private startNodePosition: XYPosition = { x: 0, y: 0 };\r\n private startNodePositions: Map<string, XYPosition> = new Map(); // Initial positions for multi-drag\r\n private startPointerPosition: XYPosition = { x: 0, y: 0 };\r\n\r\n // Connection (Handle)\r\n private isConnecting = false;\r\n private currentPreviewEdgeId: string | null = null;\r\n private currentTargetHandle: { nodeId: string; handleId?: string; type: 'source' | 'target' } | null = null;\r\n private connectingSourceNodeId: string | null = null;\r\n private connectingSourceHandleId: string | undefined = undefined;\r\n\r\n // Resizing\r\n private isResizing = false;\r\n private resizingNode: Node | null = null;\r\n private resizeHandle: 'nw' | 'ne' | 'sw' | 'se' | null = null;\r\n private startResizePosition: XYPosition = { x: 0, y: 0 };\r\n private startNodeDimensions: { width: number; height: number; x: number; y: number } = { width: 0, height: 0, x: 0, y: 0 };\r\n\r\n // Edge Updating\r\n private isUpdatingEdge = false;\r\n private updatingEdge: Edge | null = null;\r\n private updatingEdgeHandle: 'source' | 'target' | null = null;\r\n\r\n // Edge Label Editing\r\n editingEdgeId: string | null = null;\r\n\r\n private updatePathFinder(nodes: Node[]): void {\r\n this.pathCache.clear();\r\n this.pathPointsCache.clear();\r\n this._pathFinder = new PathFinder(nodes.map(n => ({\r\n id: n.id,\r\n x: n.position.x,\r\n y: n.position.y,\r\n width: n.width || this.defaultNodeWidth,\r\n height: n.height || this.defaultNodeHeight\r\n })));\r\n }\r\n\r\n onEdgeDoubleClick(event: MouseEvent, edge: Edge): void {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n this.editingEdgeId = edge.id;\r\n }\r\n\r\n onNodeDoubleClick(event: MouseEvent, node: Node): void {\r\n console.log('Node double clicked:', node);\r\n event.stopPropagation();\r\n this.selectedNodeForEditing = node;\r\n this.nodeDoubleClick.emit(node);\r\n this.cdRef.detectChanges();\r\n }\r\n\r\n onDiagramDoubleClick(event: MouseEvent): void {\r\n let target = event.target as Element;\r\n\r\n // If target is SVG (likely due to capture), find the actual element under cursor\r\n if (target === this.svgRef.nativeElement || target.classList.contains('ngx-workflow__background')) {\r\n const element = document.elementFromPoint(event.clientX, event.clientY);\r\n if (element) {\r\n target = element;\r\n }\r\n }\r\n\r\n const nodeElement = target.closest('.ngx-workflow__node');\r\n if (nodeElement) {\r\n const nodeId = (nodeElement as HTMLElement).dataset['id'];\r\n const node = this.nodes().find(n => n.id === nodeId);\r\n if (node) {\r\n this.onNodeDoubleClick(event, node);\r\n }\r\n }\r\n }\r\n\r\n closeSidebar(): void {\r\n this.selectedNodeForEditing = null;\r\n }\r\n\r\n onPropertiesChange(changes: Partial<Node>): void {\r\n if (this.selectedNodeForEditing) {\r\n this.diagramStateService.updateNode(this.selectedNodeForEditing.id, changes);\r\n // Update local reference to keep sidebar in sync\r\n this.selectedNodeForEditing = { ...this.selectedNodeForEditing, ...changes };\r\n }\r\n }\r\n\r\n updateEdgeLabel(edge: Edge, newLabel: string): void {\r\n this.diagramStateService.updateEdge(edge.id, { label: newLabel });\r\n this.editingEdgeId = null;\r\n }\r\n\r\n onEdgeLabelBlur(): void {\r\n this.editingEdgeId = null;\r\n }\r\n\r\n // Default node dimensions\r\n defaultNodeWidth = 170;\r\n defaultNodeHeight = 60;\r\n\r\n // Input for custom connection validation (optional)\r\n @Input() connectionValidator?: (sourceNodeId: string, targetNodeId: string) => boolean;\r\n // Input for node resizing (global toggle)\r\n @Input() nodesResizable: boolean = true;\r\n // Helper to check if a connection is allowed\r\n private isValidConnection(sourceId: string, targetId: string): boolean {\r\n // console.log('isValidConnection checking:', sourceId, targetId);\r\n // Prevent duplicate edges between same source and target\r\n const existing = this.edges().some(e => e.source === sourceId && e.target === targetId);\r\n if (existing) {\r\n // console.log('isValidConnection: existing edge found');\r\n return false;\r\n }\r\n // Use custom validator if provided\r\n if (this.connectionValidator) {\r\n return this.connectionValidator(sourceId, targetId);\r\n }\r\n return true;\r\n }\r\n\r\n constructor(\r\n public el: ElementRef<HTMLElement>, // Host element\r\n private renderer: Renderer2,\r\n private ngZone: NgZone,\r\n private cdRef: ChangeDetectorRef,\r\n public diagramStateService: DiagramStateService,\r\n @Optional() @Inject(NGX_WORKFLOW_NODE_TYPES) public nodeTypes: Record<string, NodeComponentType> | null\r\n ) {\r\n this.nodes$ = toObservable(this.diagramStateService.nodes);\r\n }\r\n\r\n get nodeTypeKeys(): string[] {\r\n return this.nodeTypes ? Object.keys(this.nodeTypes) : [];\r\n }\r\n\r\n private nodes$: Observable<Node[]>;\r\n private resizeObserver!: ResizeObserver;\r\n\r\n ngOnInit(): void {\r\n this.diagramStateService.el = this.svgRef;\r\n this.viewport = this.diagramStateService.viewport;\r\n this.nodes = this.diagramStateService.nodes;\r\n this.filteredNodes = this.diagramStateService.visibleNodes; // Use visibleNodes for rendering\r\n this.edges = this.diagramStateService.edges;\r\n this.tempEdges = this.diagramStateService.tempEdges;\r\n this.alignmentGuides = this.diagramStateService.alignmentGuides;\r\n\r\n if (this.initialNodes.length > 0) {\r\n this.initialNodes.forEach(node => this.diagramStateService.addNode(node));\r\n }\r\n if (this.initialEdges.length > 0) {\r\n // Add initial edges directly to the signal without triggering connect events\r\n this.diagramStateService.edges.set([...this.initialEdges]);\r\n }\r\n if (this.initialViewport) {\r\n this.diagramStateService.setViewport(this.initialViewport);\r\n }\r\n\r\n // Subscribe to state changes and emit events\r\n this.subscriptions.add(\r\n this.diagramStateService.nodeClick.subscribe((node: Node) => this.nodeClick.emit(node))\r\n );\r\n this.subscriptions.add(\r\n this.diagramStateService.edgeClick.subscribe((edge: Edge) => this.edgeClick.emit(edge))\r\n );\r\n this.subscriptions.add(\r\n this.diagramStateService.connect.subscribe((connection) => this.connect.emit(connection))\r\n );\r\n this.subscriptions.add(\r\n this.nodes$.subscribe(nodes => {\r\n this.nodes.set(nodes);\r\n if (!this.isDraggingNode) {\r\n this.updatePathFinder(nodes);\r\n this.nodesChange.emit(nodes);\r\n }\r\n })\r\n );\r\n this.subscriptions.add(\r\n this.diagramStateService.edgesChange.subscribe((edges: Edge[]) => this.edgesChange.emit(edges))\r\n );\r\n\r\n // Initialize ResizeObserver\r\n this.resizeObserver = new ResizeObserver(entries => {\r\n for (const entry of entries) {\r\n const { width, height } = entry.contentRect;\r\n this.diagramStateService.setContainerDimensions({ width, height });\r\n }\r\n });\r\n\r\n // We need to observe the container, but we only have el (host) or svgRef.\r\n // Let's observe the host element.\r\n this.resizeObserver.observe(this.el.nativeElement);\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n this.unlistenPointerMove = this.renderer.listen(this.svgRef.nativeElement, 'pointermove', (event: PointerEvent) => {\r\n this.onPointerMove(event);\r\n });\r\n this.unlistenPointerUp = this.renderer.listen(this.svgRef.nativeElement, 'pointerup', (event: PointerEvent) => {\r\n this.onPointerUp(event);\r\n });\r\n this.unlistenPointerLeave = this.renderer.listen(this.svgRef.nativeElement, 'pointerleave', (event: PointerEvent) => {\r\n this.onPointerLeave(event);\r\n });\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n if (this.unlistenPointerMove) this.unlistenPointerMove();\r\n if (this.unlistenPointerUp) this.unlistenPointerUp();\r\n if (this.unlistenPointerLeave) this.unlistenPointerLeave();\r\n }\r\n\r\n get lodLevel(): string {\r\n return this.diagramStateService.lodLevel();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // Handle changes to input properties after initialization\r\n if (changes['initialNodes'] && !changes['initialNodes'].firstChange) {\r\n if (this.isDraggingNode || this.draggingNode) {\r\n return;\r\n }\r\n const currentNodes = this.nodes();\r\n if (this.initialNodes === currentNodes) {\r\n return;\r\n }\r\n const currentNodeIds = new Set(currentNodes.map(n => n.id));\r\n const newNodeIds = new Set(this.initialNodes.map(n => n.id));\r\n currentNodes.forEach(node => {\r\n if (!newNodeIds.has(node.id)) {\r\n this.diagramStateService.removeNode(node.id);\r\n }\r\n });\r\n this.initialNodes.forEach(node => {\r\n if (!currentNodeIds.has(node.id)) {\r\n this.diagramStateService.addNode(node);\r\n } else {\r\n const currentNode = currentNodes.find(n => n.id === node.id);\r\n if (currentNode && JSON.stringify(currentNode) !== JSON.stringify(node)) {\r\n this.diagramStateService.updateNode(node.id, node);\r\n }\r\n }\r\n });\r\n }\r\n if (changes['initialEdges'] && !changes['initialEdges'].firstChange) {\r\n const currentEdges = this.edges();\r\n if (this.initialEdges === currentEdges) return;\r\n if (JSON.stringify(this.initialEdges) !== JSON.stringify(currentEdges)) {\r\n this.diagramStateService.edges.set([...this.initialEdges]);\r\n }\r\n }\r\n if (changes['initialViewport'] && !changes['initialViewport'].firstChange && this.initialViewport) {\r\n const currentViewport = this.viewport();\r\n if (JSON.stringify(this.initialViewport) !== JSON.stringify(currentViewport)) {\r\n this.diagramStateService.setViewport(this.initialViewport);\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n get transform(): string {\r\n const v = this.viewport();\r\n return `translate(${v.x}, ${v.y}) scale(${v.zoom})`;\r\n }\r\n\r\n trackByNodeId(index: number, node: Node): string {\r\n return node.id;\r\n }\r\n\r\n trackByEdgeId(index: number, edge: Edge): string {\r\n return edge.id;\r\n }\r\n\r\n @HostListener('window:keydown.delete', ['$event'])\r\n onDeleteKeyPress(event: any): void {\r\n this.diagramStateService.deleteSelectedElements();\r\n }\r\n\r\n @HostListener('window:keydown.control.z', ['$event'])\r\n @HostListener('window:keydown.meta.z', ['$event']) // For macOS\r\n onUndoKeyPress(event: any): void {\r\n event.preventDefault(); // Prevent browser undo\r\n this.diagramStateService.undo();\r\n }\r\n\r\n @HostListener('window:keydown.control.shift.z', ['$event'])\r\n @HostListener('window:keydown.meta.shift.z', ['$event']) // For macOS\r\n onRedoKeyPress(event: any): void {\r\n event.preventDefault(); // Prevent browser redo\r\n this.diagramStateService.redo();\r\n }\r\n\r\n @HostListener('window:keydown.control.c', ['$event'])\r\n @HostListener('window:keydown.meta.c', ['$event'])\r\n onCopyKeyPress(event: any): void {\r\n // Don't prevent default if user is typing in an input\r\n if (this.isInputActive(event)) return;\r\n this.diagramStateService.copy();\r\n }\r\n\r\n @HostListener('window:keydown.control.v', ['$event'])\r\n @HostListener('window:keydown.meta.v', ['$event'])\r\n onPasteKeyPress(event: any): void {\r\n if (this.isInputActive(event)) return;\r\n this.diagramStateService.paste();\r\n }\r\n\r\n @HostListener('window:keydown.control.x', ['$event'])\r\n @HostListener('window:keydown.meta.x', ['$event'])\r\n onCutKeyPress(event: any): void {\r\n if (this.isInputActive(event)) return;\r\n this.diagramStateService.cut();\r\n }\r\n\r\n @HostListener('window:keydown.control.d', ['$event'])\r\n @HostListener('window:keydown.meta.d', ['$event'])\r\n onDuplicateKeyPress(event: any): void {\r\n if (this.isInputActive(event)) return;\r\n event.preventDefault(); // Prevent browser bookmark\r\n this.diagramStateService.duplicate();\r\n }\r\n\r\n @HostListener('window:keydown.control.g', ['$event'])\r\n @HostListener('window:keydown.meta.g', ['$event'])\r\n onGroupKeyPress(event: any): void {\r\n if (this.isInputActive(event)) return;\r\n event.preventDefault(); // Prevent browser find\r\n const selectedNodes = this.diagramStateService.selectedNodes();\r\n if (selectedNodes.length > 1) {\r\n this.diagramStateService.groupNodes(selectedNodes.map(n => n.id));\r\n }\r\n }\r\n\r\n @HostListener('window:keydown.control.shift.g', ['$event'])\r\n @HostListener('window:keydown.meta.shift.g', ['$event'])\r\n onUngroupKeyPress(event: any): void {\r\n if (this.isInputActive(event)) return;\r\n event.preventDefault();\r\n const selectedNodes = this.diagramStateService.selectedNodes();\r\n if (selectedNodes.length === 1 && selectedNodes[0].type === 'group') {\r\n this.diagramStateService.ungroupNodes(selectedNodes[0].id);\r\n }\r\n }\r\n\r\n toggleGroup(event: Event, node: Node): void {\r\n event.stopPropagation();\r\n this.diagramStateService.toggleGroup(node.id);\r\n }\r\n\r\n private isInputActive(event: any): boolean {\r\n const target = event.target as HTMLElement;\r\n return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\r\n }\r\n\r\n onWheel(event: WheelEvent): void {\r\n event.preventDefault();\r\n this.ngZone.runOutsideAngular(() => {\r\n const svgRect = this.svgRef.nativeElement.getBoundingClientRect();\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const viewportBefore = this.viewport();\r\n\r\n const pointX = (clientX - svgRect.left - viewportBefore.x) / viewportBefore.zoom;\r\n const pointY = (clientY - svgRect.top - viewportBefore.y) / viewportBefore.zoom;\r\n\r\n const scaleFactor = 1.05;\r\n const newZoom = event.deltaY < 0 ? viewportBefore.zoom * scaleFactor : viewportBefore.zoom / scaleFactor;\r\n\r\n const clampedZoom = Math.max(0.1, Math.min(10, newZoom));\r\n\r\n const newX = clientX - svgRect.left - pointX * clampedZoom;\r\n const newY = clientY - svgRect.top - pointY * clampedZoom;\r\n\r\n this.diagramStateService.setViewport({ x: newX, y: newY, zoom: clampedZoom });\r\n });\r\n }\r\n\r\n onPointerDown(event: PointerEvent): void {\r\n let targetElement = event.target as Element;\r\n\r\n // Check for resize handle first (highest priority)\r\n const resizeHandleElement = targetElement.closest('.ngx-workflow__resize-handle') as HTMLElement;\r\n if (resizeHandleElement) {\r\n const nodeElement = resizeHandleElement.closest('.ngx-workflow__node') as HTMLElement;\r\n if (nodeElement) {\r\n const nodeId = nodeElement.dataset['id'];\r\n const node = this.nodes().find(n => n.id === nodeId);\r\n const handle = resizeHandleElement.dataset['handle'] as 'nw' | 'ne' | 'sw' | 'se';\r\n if (node && handle && (node.resizable !== false) && this.nodesResizable) {\r\n this.startResizing(event, node, handle);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n let handleElement = targetElement.closest('.ngx-workflow__handle') as HTMLElement;\r\n const nodeElement = targetElement.closest('.ngx-workflow__node') as HTMLElement;\r\n\r\n if (event.button !== 0) return;\r\n\r\n if (handleElement && handleElement.dataset['type'] === 'source') {\r\n // Start Connecting\r\n this.startConnecting(event, handleElement);\r\n } else if (nodeElement) {\r\n // Start Dragging Node\r\n const nodeId = nodeElement.dataset['id'];\r\n const node = this.nodes().find(n => n.id === nodeId);\r\n if (node && node.draggable) {\r\n this.startDraggingNode(event, node);\r\n }\r\n // Select Node\r\n if (node) {\r\n this.diagramStateService.onNodeClick(node);\r\n this.diagramStateService.selectNodes([node.id], event.ctrlKey || event.metaKey || event.shiftKey);\r\n }\r\n } else {\r\n // Pan or Select\r\n const isClickingOnCanvas = targetElement === this.svgRef.nativeElement || targetElement.classList.contains('ngx-workflow__background');\r\n if (isClickingOnCanvas) {\r\n if (event.shiftKey) {\r\n this.startSelecting(event);\r\n } else {\r\n this.startPanning(event);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onPointerMove(event: PointerEvent): void {\r\n // console.log('onPointerMove', { dragging: this.isDraggingNode, connecting: this.isConnecting, resizing: this.isResizing });\r\n if (this.isResizing) {\r\n this.resize(event);\r\n } else if (this.isUpdatingEdge) {\r\n this.updateEdge(event);\r\n } else if (this.isConnecting) {\r\n this.updateConnection(event);\r\n } else if (this.isDraggingNode) {\r\n this.dragNode(event);\r\n } else if (this.isPanning) {\r\n this.pan(event);\r\n } else if (this.isSelecting) {\r\n this.updateSelection(event);\r\n }\r\n }\r\n\r\n onPointerUp(event: PointerEvent): void {\r\n if (this.isResizing) {\r\n this.stopResizing(event);\r\n } else if (this.isUpdatingEdge) {\r\n this.stopUpdatingEdge(event);\r\n } else if (this.isConnecting) {\r\n this.finishConnecting(event);\r\n } else if (this.isDraggingNode) {\r\n this.stopDraggingNode(event);\r\n } else if (this.isPanning) {\r\n this.stopPanning(event);\r\n } else if (this.isSelecting) {\r\n this.stopSelecting(event);\r\n }\r\n }\r\n\r\n onPointerLeave(event: PointerEvent): void {\r\n if (this.isResizing || this.isUpdatingEdge || this.isPanning || this.isSelecting || this.isDraggingNode || this.isConnecting) {\r\n this.onPointerUp(event);\r\n }\r\n }\r\n\r\n // --- Connecting Logic ---\r\n\r\n private startConnecting(event: PointerEvent, handleElement: HTMLElement): void {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.isConnecting = true;\r\n this.svgRef.nativeElement.setPointerCapture(event.pointerId);\r\n\r\n const nodeId = handleElement.dataset['nodeid'];\r\n const handleId = handleElement.dataset['handleid'];\r\n\r\n if (!nodeId) return;\r\n\r\n this.connectingSourceNodeId = nodeId;\r\n this.connectingSourceHandleId = handleId;\r\n\r\n const previewEdgeId = `preview-${uuidv4()}`;\r\n this.currentPreviewEdgeId = previewEdgeId;\r\n\r\n const viewport = this.viewport();\r\n const diagramSvgEl = this.svgRef.nativeElement;\r\n const handleScreenCoords = handleElement.getBoundingClientRect();\r\n const diagramScreenCoords = diagramSvgEl.getBoundingClientRect();\r\n\r\n const sourceX = (handleScreenCoords.x + handleScreenCoords.width / 2 - diagramScreenCoords.x - viewport.x) / viewport.zoom;\r\n const sourceY = (handleScreenCoords.y + handleScreenCoords.height / 2 - diagramScreenCoords.y - viewport.y) / viewport.zoom;\r\n\r\n const newTempEdge: TempEdge = {\r\n id: previewEdgeId,\r\n source: nodeId,\r\n sourceHandle: handleId,\r\n target: 'preview-target',\r\n targetHandle: undefined,\r\n type: 'straight',\r\n animated: true,\r\n style: { stroke: 'blue', strokeWidth: '2' },\r\n sourceX: sourceX,\r\n sourceY: sourceY,\r\n targetX: sourceX,\r\n targetY: sourceY,\r\n };\r\n this.diagramStateService.addTempEdge(newTempEdge);\r\n }\r\n\r\n private updateConnection(event: PointerEvent): void {\r\n if (!this.currentPreviewEdgeId) return;\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const diagramSvgEl = this.svgRef.nativeElement;\r\n const diagramScreenCoords = diagramSvgEl.getBoundingClientRect();\r\n const viewport = this.viewport();\r\n\r\n const currentPointerX = (event.clientX - diagramScreenCoords.x - viewport.x) / viewport.zoom;\r\n const currentPointerY = (event.clientY - diagramScreenCoords.y - viewport.y) / viewport.zoom;\r\n\r\n this.diagramStateService.updateTempEdgeTarget(this.currentPreviewEdgeId!, { x: currentPointerX, y: currentPointerY });\r\n\r\n // Use geometric distance check instead of elementFromPoint to avoid pointer capture issues\r\n let closestHandle: { nodeId: string, handleId: string } | null = null;\r\n let minDistance = 20; // Detection radius\r\n\r\n const nodes = this.nodes();\r\n for (const node of nodes) {\r\n const handles = ['top', 'right', 'bottom', 'left'];\r\n for (const handleId of handles) {\r\n const handlePos = getHandleAbsolutePosition(node, handleId);\r\n const dist = Math.hypot(handlePos.x - currentPointerX, handlePos.y - currentPointerY);\r\n if (dist < minDistance) {\r\n minDistance = dist;\r\n closestHandle = { nodeId: node.id, handleId: handleId };\r\n }\r\n }\r\n }\r\n\r\n this.clearTargetHandleHighlight();\r\n\r\n if (closestHandle) {\r\n const targetNodeId = closestHandle.nodeId;\r\n const targetHandleId = closestHandle.handleId;\r\n\r\n // Allow connecting to any handle on a different node OR same node (self-loop)\r\n // console.log('updateConnection: handle found', targetNodeId, this.connectingSourceNodeId);\r\n if (targetNodeId && this.isValidConnection(this.connectingSourceNodeId!, targetNodeId)) {\r\n this.currentTargetHandle = { nodeId: targetNodeId, handleId: targetHandleId, type: 'target' };\r\n\r\n // We need to find the handle element to highlight it\r\n // This is a bit expensive but necessary for visual feedback\r\n const handleEl = this.el.nativeElement.querySelector(`.ngx-workflow__handle[data-nodeid=\"${targetNodeId}\"][data-handleid=\"${targetHandleId}\"]`);\r\n if (handleEl) {\r\n this.renderer.addClass(handleEl, 'ngx-workflow__handle--valid-target');\r\n }\r\n } else {\r\n this.currentTargetHandle = null;\r\n }\r\n } else {\r\n this.currentTargetHandle = null;\r\n }\r\n });\r\n }\r\n\r\n private finishConnecting(event: PointerEvent): void {\r\n console.log('finishConnecting: start');\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.isConnecting = false;\r\n this.svgRef.nativeElement.releasePointerCapture(event.pointerId);\r\n this.clearTargetHandleHighlight();\r\n\r\n if (this.currentPreviewEdgeId) {\r\n console.log('finishConnecting: removing preview edge');\r\n this.diagramStateService.removeEdge(this.currentPreviewEdgeId);\r\n }\r\n\r\n if (this.currentTargetHandle && this.connectingSourceNodeId) {\r\n const sourceId = this.connectingSourceNodeId;\r\n const targetId = this.currentTargetHandle.nodeId;\r\n console.log('finishConnecting: attempting connection', { sourceId, targetId });\r\n\r\n if (this.isValidConnection(sourceId, targetId)) {\r\n const newEdge: Edge = {\r\n id: uuidv4(),\r\n source: sourceId,\r\n sourceHandle: this.connectingSourceHandleId,\r\n target: targetId,\r\n targetHandle: this.currentTargetHandle.handleId,\r\n // type: 'bezier', // Removed to use default smart routing\r\n };\r\n console.log('finishConnecting: adding edge', newEdge);\r\n this.diagramStateService.addEdge(newEdge);\r\n } else {\r\n console.log('finishConnecting: invalid connection');\r\n // Visual feedback for invalid connection: flash source node\r\n const sourceNodeEl = this.el.nativeElement.querySelector(`[data-nodeid=\"${sourceId}\"]`);\r\n if (sourceNodeEl) {\r\n this.renderer.addClass(sourceNodeEl, 'invalid-connection');\r\n setTimeout(() => this.renderer.removeClass(sourceNodeEl, 'invalid-connection'), 1000);\r\n }\r\n }\r\n }\r\n\r\n this.currentPreviewEdgeId = null;\r\n this.currentTargetHandle = null;\r\n this.connectingSourceNodeId = null;\r\n this.connectingSourceHandleId = undefined;\r\n console.log('finishConnecting: end');\r\n }\r\n\r\n private clearTargetHandleHighlight(): void {\r\n const activeHighlights = document.querySelectorAll('.ngx-workflow__handle--valid-target');\r\n activeHighlights.forEach(el => this.renderer.removeClass(el, 'ngx-workflow__handle--valid-target'));\r\n }\r\n\r\n // --- Dragging Logic ---\r\n\r\n private startDraggingNode(event: PointerEvent, node: Node): void {\r\n event.stopPropagation();\r\n this.isDraggingNode = true;\r\n this.draggingNode = node;\r\n this.startNodePosition = { x: node.position.x, y: node.position.y };\r\n this.startPointerPosition = { x: event.clientX, y: event.clientY };\r\n this.svgRef.nativeElement.setPointerCapture(event.pointerId);\r\n\r\n // Check if this node is part of a multi-selection\r\n const selectedNodes = this.nodes().filter(n => n.selected);\r\n if (selectedNodes.length > 1 && node.selected) {\r\n // Multi-node drag: store all selected nodes and their positions\r\n this.draggingNodes = selectedNodes;\r\n this.startNodePositions.clear();\r\n selectedNodes.forEach(n => {\r\n this.startNodePositions.set(n.id, { x: n.position.x, y: n.position.y });\r\n });\r\n } else {\r\n // Single node drag\r\n this.draggingNodes = [node];\r\n this.startNodePositions.clear();\r\n this.startNodePositions.set(node.id, { x: node.position.x, y: node.position.y });\r\n }\r\n\r\n this.diagramStateService.onDragStart(node);\r\n console.log('startDraggingNode: started for', node.id);\r\n }\r\n\r\n private dragNode(event: PointerEvent): void {\r\n if (!this.draggingNode) return;\r\n event.stopPropagation();\r\n\r\n if (this.dragAnimationFrameId) {\r\n cancelAnimationFrame(this.dragAnimationFrameId);\r\n }\r\n\r\n this.dragAnimationFrameId = requestAnimationFrame(() => {\r\n if (!this.draggingNode) return;\r\n const zoom = this.viewport().zoom;\r\n const deltaX = (event.clientX - this.startPointerPosition.x) / zoom;\r\n const deltaY = (event.clientY - this.startPointerPosition.y) / zoom;\r\n\r\n if (this.draggingNodes.length > 1) {\r\n // Multi-node drag: move all selected nodes by the same delta\r\n const moves = this.draggingNodes.map(node => {\r\n const startPos = this.startNodePositions.get(node.id)!;\r\n return {\r\n id: node.id,\r\n position: {\r\n x: startPos.x + deltaX,\r\n y: startPos.y + deltaY\r\n }\r\n };\r\n });\r\n this.diagramStateService.moveNodes(moves);\r\n } else {\r\n // Single node drag\r\n const newPosition = {\r\n x: this.startNodePosition.x + deltaX,\r\n y: this.startNodePosition.y + deltaY,\r\n };\r\n this.diagramStateService.moveNode(this.draggingNode!.id, newPosition);\r\n }\r\n this.cdRef.detectChanges();\r\n this.dragAnimationFrameId = null;\r\n });\r\n }\r\n\r\n private stopDraggingNode(event: PointerEvent): void {\r\n if (!this.draggingNode) return;\r\n event.stopPropagation();\r\n this.isDraggingNode = false;\r\n this.updatePathFinder(this.nodes());\r\n if (this.dragAnimationFrameId) {\r\n cancelAnimationFrame(this.dragAnimationFrameId);\r\n this.dragAnimationFrameId = null;\r\n }\r\n this.svgRef.nativeElement.releasePointerCapture(event.pointerId);\r\n\r\n // Trigger onDragEnd for all dragged nodes\r\n this.draggingNodes.forEach(node => {\r\n this.diagramStateService.onDragEnd(node);\r\n });\r\n console.log('stopDraggingNode: stopped');\r\n\r\n this.draggingNode = null;\r\n this.draggingNodes = [];\r\n this.startNodePositions.clear();\r\n\r\n // Emit the final state after drag is complete\r\n this.nodesChange.emit(this.nodes());\r\n }\r\n\r\n // --- Resizing Logic ---\r\n\r\n private startResizing(event: PointerEvent, node: Node, handle: 'nw' | 'ne' | 'sw' | 'se'): void {\r\n event.stopPropagation();\r\n this.isResizing = true;\r\n this.resizingNode = node;\r\n this.resizeHandle = handle;\r\n this.startResizePosition = { x: event.clientX, y: event.clientY };\r\n this.startNodeDimensions = {\r\n width: node.width || this.defaultNodeWidth,\r\n height: node.height || this.defaultNodeHeight,\r\n x: node.position.x,\r\n y: node.position.y\r\n };\r\n this.svgRef.nativeElement.setPointerCapture(event.pointerId);\r\n this.diagramStateService.onResizeStart(node);\r\n }\r\n\r\n private resize(event: PointerEvent): void {\r\n if (!this.resizingNode || !this.resizeHandle) return;\r\n event.stopPropagation();\r\n\r\n const resizingNode = this.resizingNode;\r\n const resizeHandle = this.resizeHandle;\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const zoom = this.viewport().zoom;\r\n const deltaX = (event.clientX - this.startResizePosition.x) / zoom;\r\n const deltaY = (event.clientY - this.startResizePosition.y) / zoom;\r\n\r\n let newWidth = this.startNodeDimensions.width;\r\n let newHeight = this.startNodeDimensions.height;\r\n let newX = this.startNodeDimensions.x;\r\n let newY = this.startNodeDimensions.y;\r\n\r\n // Calculate new dimensions based on handle\r\n switch (resizeHandle) {\r\n case 'se': // Southeast - resize from bottom-right\r\n newWidth = this.startNodeDimensions.width + deltaX;\r\n newHeight = this.startNodeDimensions.height + deltaY;\r\n break;\r\n case 'sw': // Southwest - resize from bottom-left\r\n newWidth = this.startNodeDimensions.width - deltaX;\r\n newHeight = this.startNodeDimensions.height + deltaY;\r\n newX = this.startNodeDimensions.x + deltaX;\r\n break;\r\n case 'ne': // Northeast - resize from top-right\r\n newWidth = this.startNodeDimensions.width + deltaX;\r\n newHeight = this.startNodeDimensions.height - deltaY;\r\n newY = this.startNodeDimensions.y + deltaY;\r\n break;\r\n case 'nw': // Northwest - resize from top-left\r\n newWidth = this.startNodeDimensions.width - deltaX;\r\n newHeight = this.startNodeDimensions.height - deltaY;\r\n newX = this.startNodeDimensions.x + deltaX;\r\n newY = this.startNodeDimensions.y + deltaY;\r\n break;\r\n }\r\n\r\n // Apply constraints\r\n const minWidth = resizingNode.minWidth || 50;\r\n const minHeight = resizingNode.minHeight || 30;\r\n const maxWidth = resizingNode.maxWidth || 500;\r\n const maxHeight = resizingNode.maxHeight || 500;\r\n\r\n newWidth = Math.max(minWidth, Math.min(maxWidth, newWidth));\r\n newHeight = Math.max(minHeight, Math.min(maxHeight, newHeight));\r\n\r\n // Adjust position if constrained (for nw, ne, sw handles)\r\n if (resizeHandle === 'nw' || resizeHandle === 'sw') {\r\n const widthDiff = newWidth - (this.startNodeDimensions.width - deltaX);\r\n newX = this.startNodeDimensions.x + deltaX - widthDiff;\r\n }\r\n if (resizeHandle === 'nw' || resizeHandle === 'ne') {\r\n const heightDiff = newHeight - (this.startNodeDimensions.height - deltaY);\r\n newY = this.startNodeDimensions.y + deltaY - heightDiff;\r\n }\r\n\r\n // Update node\r\n this.diagramStateService.resizeNode(resizingNode.id, newWidth, newHeight, { x: newX, y: newY });\r\n });\r\n }\r\n\r\n private stopResizing(event: PointerEvent): void {\r\n if (!this.resizingNode) return;\r\n event.stopPropagation();\r\n this.isResizing = false;\r\n this.svgRef.nativeElement.releasePointerCapture(event.pointerId);\r\n this.diagramStateService.onResizeEnd(this.resizingNode);\r\n this.resizingNode = null;\r\n this.resizeHandle = null;\r\n }\r\n\r\n // --- Edge Updating Logic ---\r\n\r\n startUpdatingEdge(event: PointerEvent, edge: Edge, handleType: 'source' | 'target'): void {\r\n event.stopPropagation();\r\n this.isUpdatingEdge = true;\r\n this.updatingEdge = edge;\r\n this.updatingEdgeHandle = handleType;\r\n this.svgRef.nativeElement.setPointerCapture(event.pointerId);\r\n\r\n const tempEdgeId = `temp-update-${edge.id}`;\r\n this.currentPreviewEdgeId = tempEdgeId;\r\n\r\n const sourceNode = this.nodes().find(n => n.id === edge.source);\r\n const targetNode = this.nodes().find(n => n.id === edge.target);\r\n\r\n if (!sourceNode || !targetNode) return;\r\n\r\n const sourcePos = getHandleAbsolutePosition(sourceNode, edge.sourceHandle);\r\n const targetPos = getHandleAbsolutePosition(targetNode, edge.targetHandle);\r\n\r\n let startX, startY, endX, endY;\r\n\r\n if (handleType === 'source') {\r\n startX = targetPos.x;\r\n startY = targetPos.y;\r\n endX = sourcePos.x;\r\n endY = sourcePos.y;\r\n } else {\r\n startX = sourcePos.x;\r\n startY = sourcePos.y;\r\n endX = targetPos.x;\r\n endY = targetPos.y;\r\n }\r\n\r\n this.diagramStateService.addTempEdge({\r\n id: tempEdgeId,\r\n source: edge.source,\r\n sourceHandle: edge.sourceHandle,\r\n target: edge.target,\r\n targetHandle: edge.targetHandle,\r\n type: edge.type || 'bezier',\r\n animated: edge.animated,\r\n sourceX: startX,\r\n sourceY: startY,\r\n targetX: endX,\r\n targetY: endY,\r\n style: edge.style,\r\n markerEnd: edge.markerEnd\r\n });\r\n }\r\n\r\n private updateEdge(event: PointerEvent): void {\r\n if (!this.updatingEdge || !this.currentPreviewEdgeId) return;\r\n event.stopPropagation();\r\n\r\n this.ngZone.runOutsideAngular(() => {\r\n const diagramRect = this.svgRef.nativeElement.getBoundingClientRect();\r\n const viewport = this.viewport();\r\n const point = {\r\n x: (event.clientX - diagramRect.left - viewport.x) / viewport.zoom,\r\n y: (event.clientY - diagramRect.top - viewport.y) / viewport.zoom\r\n };\r\n\r\n this.diagramStateService.updateTempEdgeTarget(this.currentPreviewEdgeId!, point);\r\n\r\n const element = document.elementFromPoint(event.clientX, event.clientY);\r\n const handle = element?.closest('.ngx-workflow__handle');\r\n\r\n if (handle) {\r\n const nodeId = handle.getAttribute('data-nodeid');\r\n const handleId = handle.getAttribute('data-handleid');\r\n const type = handle.getAttribute('data-type');\r\n\r\n if (nodeId && type) {\r\n this.currentTargetHandle = { nodeId, handleId: handleId || undefined, type: type as 'source' | 'target' };\r\n }\r\n } else {\r\n this.currentTargetHandle = null;\r\n }\r\n });\r\n }\r\n\r\n private stopUpdatingEdge(event: PointerEvent): void {\r\n if (!this.updatingEdge) return;\r\n event.stopPropagation();\r\n this.isUpdatingEdge = false;\r\n this.svgRef.nativeElement.releasePointerCapture(event.pointerId);\r\n\r\n if (this.currentPreviewEdgeId) {\r\n this.diagramStateService.removeEdge(this.currentPreviewEdgeId);\r\n this.currentPreviewEdgeId = null;\r\n }\r\n }\r\n\r\n\r\n // --- Panning Logic ---\r\n\r\n private startPanning(event: PointerEvent): void {\r\n this.isPanning = true;\r\n this.lastPanPosition = { x: event.clientX, y: event.clientY };\r\n this.renderer.setStyle(this.svgRef.nativeElement, 'cursor', 'grabbing');\r\n this.svgRef.nativeElement.setPointerCapture(event.pointerId);\r\n this.diagramStateService.clearSelection();\r\n }\r\n\r\n private pan(event: PointerEvent): void {\r\n this.ngZone.runOutsideAngular(() => {\r\n const deltaX = event.clientX - this.lastPanPosition.x;\r\n const deltaY = event.clientY - this.lastPanPosition.y;\r\n\r\n const currentViewport = this.viewport();\r\n this.diagramStateService.setViewport({\r\n x: currentViewport.x + deltaX,\r\n y: currentViewport.y + deltaY,\r\n zoom: currentViewport.zoom,\r\n });\r\n\r\n this.lastPanPosition = { x: event.clientX, y: event.clientY };\r\n });\r\n }\r\n\r\n private stopPanning(event: PointerEvent): void {\r\n this.isPanning = false;\r\n this.renderer.setStyle(this.svgRef.nativeElement, 'cursor', 'grab');\r\n this.svgRef.nativeElement.releasePointerCapture(event.pointerId);\r\n }\r\n\r\n // --- Selection Logic ---\r\n\r\n private startSelecting(event: PointerEvent): void {\r\n this.isSelecting = true;\r\n this.selectionStart = this.getDiagramCoordinates(event.clientX, event.clientY);\r\n this.selectionEnd = { ...this.selectionStart };\r\n this.svgRef.nativeElement.setPointerCapture(event.pointerId);\r\n }\r\n\r\n private updateSelection(event: PointerEvent): void {\r\n this.ngZone.runOutsideAngular(() => {\r\n this.selectionEnd = this.getDiagramCoordinates(event.clientX, event.clientY);\r\n });\r\n }\r\n\r\n private stopSelecting(event: PointerEvent): void {\r\n this.isSelecting = false;\r\n this.svgRef.nativeElement.releasePointerCapture(event.pointerId);\r\n this.performLassoSelection();\r\n }\r\n\r\n private getDiagramCoordinates(clientX: number, clientY: number): XYPosition {\r\n const svgRect = this.svgRef.nativeElement.getBoundingClientRect();\r\n const viewport = this.viewport();\r\n\r\n const x = (clientX - svgRect.left - viewport.x) / viewport.zoom;\r\n const y = (clientY - svgRect.top - viewport.y) / viewport.zoom;\r\n return { x, y };\r\n }\r\n\r\n private performLassoSelection(): void {\r\n const minX = Math.min(this.selectionStart.x, this.selectionEnd.x);\r\n const maxX = Math.max(this.selectionStart.x, this.selectionEnd.x);\r\n const minY = Math.min(this.selectionStart.y, this.selectionEnd.y);\r\n const maxY = Math.max(this.selectionStart.y, this.selectionEnd.y);\r\n\r\n const selectedNodeIds: string[] = [];\r\n this.nodes().forEach((node: Node) => {\r\n const nodeX = node.position.x;\r\n const nodeY = node.position.y;\r\n const nodeWidth = node.width || this.defaultNodeWidth;\r\n const nodeHeight = node.height || this.defaultNodeHeight;\r\n\r\n if (\r\n nodeX < maxX &&\r\n nodeX + nodeWidth > minX &&\r\n nodeY < maxY &&\r\n nodeY + nodeHeight > minY\r\n ) {\r\n selectedNodeIds.push(node.id);\r\n }\r\n });\r\n\r\n this.diagramStateService.clearSelection();\r\n this.diagramStateService.selectNodes(selectedNodeIds, false);\r\n }\r\n\r\n // --- Edge Logic ---\r\n\r\n getEdgePath(edge: Edge | TempEdge, isTemporary: boolean = false): string {\r\n const nodes = this.nodes();\r\n let sourcePos: XYPosition;\r\n let targetPos: XYPosition;\r\n\r\n if (isTemporary && 'sourceX' in edge && 'sourceY' in edge && 'targetX' in edge && 'targetY' in edge) {\r\n sourcePos = { x: edge.sourceX, y: edge.sourceY };\r\n targetPos = { x: edge.targetX, y: edge.targetY };\r\n } else {\r\n const sourceNode = getNode(edge.source, nodes);\r\n const targetNode = getNode(edge.target, nodes);\r\n\r\n if (!sourceNode || !targetNode) {\r\n return 'M 0 0';\r\n }\r\n\r\n sourcePos = getHandleAbsolutePosition(sourceNode, edge.sourceHandle);\r\n targetPos = getHandleAbsolutePosition(targetNode, edge.targetHandle);\r\n\r\n if (sourceNode.id === targetNode.id) {\r\n return getSelfLoopPath(sourcePos, edge.sourceHandle);\r\n }\r\n }\r\n\r\n // Use smart routing if type is 'smart' or not specified (default)\r\n // But respect explicit 'straight' type if user wants simple straight line\r\n if ((edge.type === 'smart' || !edge.type) && !isTemporary) {\r\n const cacheKey = `${edge.id}-${sourcePos.x},${sourcePos.y}-${targetPos.x},${targetPos.y}`;\r\n\r\n if (this.pathCache.has(cacheKey)) {\r\n return this.pathCache.get(cacheKey)!;\r\n }\r\n\r\n try {\r\n if (!this._pathFinder) {\r\n this.updatePathFinder(this.nodes());\r\n }\r\n const path = this._pathFinder!.findPath(sourcePos, targetPos);\r\n const d = getSmartEdgePath(path);\r\n this.pathCache.set(cacheKey, d);\r\n return d;\r\n } catch (e) {\r\n console.warn('Pathfinding failed, falling back to straight path', e);\r\n return getStraightPath(sourcePos, targetPos);\r\n }\r\n }\r\n\r\n switch (edge.type) {\r\n case 'bezier': return getBezierPath(sourcePos, targetPos);\r\n case 'step': return getStepPath(sourcePos, targetPos);\r\n case 'straight': return getStraightPath(sourcePos, targetPos);\r\n default: return getStraightPath(sourcePos, targetPos);\r\n }\r\n }\r\n\r\n getMarkerUrl(marker: string | undefined): string | null {\r\n if (!marker) return null;\r\n // Support built-in markers or custom marker IDs\r\n if (marker === 'arrow' || marker === 'arrowclosed' || marker === 'dot') {\r\n return `url(#ngx-workflow__${marker})`;\r\n }\r\n return `url(#${marker})`;\r\n }\r\n\r\n getEdgeLabelPosition(edge: Edge): XYPosition {\r\n const nodes = this.nodes();\r\n const sourceNode = getNode(edge.source, nodes);\r\n const targetNode = getNode(edge.target, nodes);\r\n\r\n if (!sourceNode || !targetNode) {\r\n return { x: 0, y: 0 };\r\n }\r\n\r\n const sourcePos = getHandleAbsolutePosition(sourceNode, edge.sourceHandle);\r\n const targetPos = getHandleAbsolutePosition(targetNode, edge.targetHandle);\r\n\r\n if (edge.type === 'smart' || !edge.type) {\r\n try {\r\n // For label position, we can re-use the cached path if available, \r\n // but we need the points, not the string. \r\n // For now, let's just re-calculate or maybe cache points too?\r\n // Re-calculating for label might be okay if getEdgePath is cached, \r\n // but ideally we cache the points.\r\n // Let's optimize this later if needed, or cache points instead of string.\r\n\r\n // Optimization: Cache points instead of string\r\n const cacheKey = `${edge.id}-${sourcePos.x},${sourcePos.y}-${targetPos.x},${targetPos.y}-points`;\r\n let path: XYPosition[];\r\n\r\n if (this.pathPointsCache.has(cacheKey)) {\r\n path = this.pathPointsCache.get(cacheKey)!;\r\n } else {\r\n if (!this._pathFinder) {\r\n this.updatePathFinder(this.nodes());\r\n }\r\n path = this._pathFinder!.findPath(sourcePos, targetPos);\r\n this.pathPointsCache.set(cacheKey, path);\r\n }\r\n\r\n return getPolylineMidpoint(path);\r\n } catch (e) {\r\n console.warn('Pathfinding failed for label position', e);\r\n }\r\n }\r\n\r\n // Return midpoint of the edge\r\n return {\r\n x: (sourcePos.x + targetPos.x) / 2,\r\n y: (sourcePos.y + targetPos.y) / 2\r\n };\r\n }\r\n\r\n onEdgeClick(event: MouseEvent, edge: Edge): void {\r\n event.stopPropagation();\r\n event.preventDefault();\r\n\r\n this.diagramStateService.onEdgeClick(edge);\r\n\r\n const isMultiSelect = event.ctrlKey || event.metaKey || event.shiftKey;\r\n\r\n // Clear node selection when selecting edges\r\n this.diagramStateService.nodes.update(nodes =>\r\n nodes.map(n => ({ ...n, selected: false }))\r\n );\r\n\r\n // Toggle edge selection\r\n this.diagramStateService.edges.update(edges =>\r\n edges.map(e => ({\r\n ...e,\r\n selected: e.id === edge.id\r\n ? !e.selected\r\n : (isMultiSelect ? e.selected : false)\r\n }))\r\n );\r\n }\r\n\r\n // --- Node Logic ---\r\n\r\n getCustomNodeComponent(type: string | undefined): NodeComponentType | null {\r\n if (type && this.nodeTypes && this.nodeTypes[type]) {\r\n return this.nodeTypes[type];\r\n }\r\n return null;\r\n }\r\n\r\n zoomIn(): void {\r\n const currentViewport = this.viewport();\r\n const newZoom = Math.min(currentViewport.zoom * 1.2, 10);\r\n this.diagramStateService.setViewport({\r\n ...currentViewport,\r\n zoom: newZoom\r\n });\r\n }\r\n\r\n zoomOut(): void {\r\n const currentViewport = this.viewport();\r\n const newZoom = Math.max(currentViewport.zoom / 1.2, 0.1);\r\n this.diagramStateService.setViewport({\r\n ...currentViewport,\r\n zoom: newZoom\r\n });\r\n }\r\n\r\n resetZoom(): void {\r\n const currentViewport = this.viewport();\r\n this.diagramStateService.setViewport({\r\n ...currentViewport,\r\n zoom: 1\r\n });\r\n }\r\n\r\n fitView(): void {\r\n const nodes = this.nodes();\r\n if (nodes.length === 0) return;\r\n\r\n // Calculate bounds of all nodes\r\n let minX = Infinity;\r\n let minY = Infinity;\r\n let maxX = -Infinity;\r\n let maxY = -Infinity;\r\n\r\n nodes.forEach(node => {\r\n const width = node.width || this.defaultNodeWidth;\r\n const height = node.height || this.defaultNodeHeight;\r\n\r\n minX = Math.min(minX, node.position.x);\r\n minY = Math.min(minY, node.position.y);\r\n maxX = Math.max(maxX, node.position.x + width);\r\n maxY = Math.max(maxY, node.position.y + height);\r\n });\r\n\r\n const boundsWidth = maxX - minX;\r\n const boundsHeight = maxY - minY;\r\n\r\n // Get SVG dimensions\r\n const svgRect = this.svgRef.nativeElement.getBoundingClientRect();\r\n const padding = 50; // Padding around nodes\r\n\r\n // Calculate zoom to fit\r\n const zoomX = (svgRect.width - padding * 2) / boundsWidth;\r\n const zoomY = (svgRect.height - padding * 2) / boundsHeight;\r\n const zoom = Math.min(zoomX, zoomY, 2); // Max zoom of 2x for fit view\r\n\r\n // Calculate center position\r\n const x = (svgRect.width - boundsWidth * zoom) / 2 - minX * zoom;\r\n const y = (svgRect.height - boundsHeight * zoom) / 2 - minY * zoom;\r\n\r\n this.diagramStateService.setViewport({ x, y, zoom });\r\n }\r\n\r\n /**\r\n * Returns the current state of the diagram (nodes, edges, viewport).\r\n */\r\n getDiagramState(): DiagramState {\r\n return this.diagramStateService.getDiagramState();\r\n }\r\n\r\n /**\r\n * Sets the state of the diagram.\r\n */\r\n setDiagramState(state: DiagramState): void {\r\n this.diagramStateService.setDiagramState(state);\r\n }\r\n\r\n /**\r\n * Exports the diagram as an SVG file.\r\n * @param fileName The name of the file to download (default: 'diagram.svg')\r\n * @param download Whether to trigger a download (default: true)\r\n * @returns The SVG string\r\n */\r\n exportToSVG(fileName: string = 'diagram.svg', download: boolean = true): string {\r\n const svgElement = this.svgRef.nativeElement;\r\n\r\n // Clone the SVG to avoid modifying the live diagram\r\n const clone = svgElement.cloneNode(true) as SVGSVGElement;\r\n\r\n // Get the bounding box of the content (nodes and edges)\r\n // We need to calculate this manually because getBBox() on the clone won't work if it's not in the DOM\r\n const nodes = this.nodes();\r\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\r\n\r\n if (nodes.length > 0) {\r\n nodes.forEach(node => {\r\n minX = Math.min(minX, node.position.x);\r\n minY = Math.min(minY, node.position.y);\r\n maxX = Math.max(maxX, node.position.x + (node.width || this.defaultNodeWidth));\r\n maxY = Math.max(maxY, node.position.y + (node.height || this.defaultNodeHeight));\r\n });\r\n } else {\r\n minX = 0; minY = 0; maxX = 100; maxY = 100;\r\n }\r\n\r\n // Add some padding\r\n const padding = 20;\r\n minX -= padding;\r\n minY -= padding;\r\n maxX += padding;\r\n maxY += padding;\r\n\r\n const width = maxX - minX;\r\n const height = maxY - minY;\r\n\r\n // Set the viewBox to the content bounds\r\n clone.setAttribute('viewBox', `${minX} ${minY} ${width} ${height}`);\r\n clone.setAttribute('width', `${width}`);\r\n clone.setAttribute('height', `${height}`);\r\n\r\n // Remove the transform from the viewport group in the clone to reset zoom/pan\r\n // The viewport group is the first child g element\r\n const viewportGroup = clone.querySelector('.ngx-workflow__viewport');\r\n if (viewportGroup) {\r\n viewportGroup.removeAttribute('transform');\r\n }\r\n\r\n // Serialize the SVG\r\n const serializer = new XMLSerializer();\r\n let svgString = serializer.serializeToString(clone);\r\n\r\n // Add XML declaration\r\n if (!svgString.match(/^<xml/)) {\r\n svgString = '<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n' + svgString;\r\n }\r\n\r\n if (download) {\r\n const blob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' });\r\n const url = URL.createObjectURL(blob);\r\n this.downloadFile(url, fileName);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n return svgString;\r\n }\r\n\r\n /**\r\n * Exports the diagram as a PNG image.\r\n * @param fileName The name of the file to download (default: 'diagram.png')\r\n * @param download Whether to trigger a download (default: true)\r\n * @returns A promise that resolves to the data URL of the PNG\r\n */\r\n async exportToPNG(fileName: string = 'diagram.png', download: boolean = true): Promise<string> {\r\n const svgString = this.exportToSVG(fileName, false);\r\n\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n const svgBlob = new Blob([svgString], { type: 'image/svg+xml;charset=utf-8' });\r\n const url = URL.createObjectURL(svgBlob);\r\n\r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) {\r\n reject(new Error('Could not get canvas context'));\r\n return;\r\n }\r\n\r\n // Draw white background\r\n ctx.fillStyle = '#ffffff';\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n ctx.drawImage(img, 0, 0);\r\n\r\n const pngUrl = canvas.toDataURL('image/png');\r\n\r\n if (download) {\r\n this.downloadFile(pngUrl, fileName);\r\n }\r\n\r\n URL.revokeObjectURL(url);\r\n resolve(pngUrl);\r\n };\r\n\r\n img.onerror = (e) => {\r\n URL.revokeObjectURL(url);\r\n reject(e);\r\n };\r\n\r\n img.src = url;\r\n });\r\n }\r\n\r\n /**\r\n * Exports the diagram state as a JSON file.\r\n * @param fileName The name of the file to download (default: 'diagram.json')\r\n */\r\n exportToJSON(fileName: string = 'diagram.json'): void {\r\n const state = this.getDiagramState();\r\n const jsonString = JSON.stringify(state, null, 2);\r\n const blob = new Blob([jsonString], { type: 'application/json' });\r\n const url = URL.createObjectURL(blob);\r\n this.downloadFile(url, fileName);\r\n URL.revokeObjectURL(url);\r\n }\r\n\r\n /**\r\n * Triggers the file input to select a JSON file for import.\r\n */\r\n triggerImport(): void {\r\n const fileInput = document.createElement('input');\r\n fileInput.type = 'file';\r\n fileInput.accept = '.json';\r\n fileInput.style.display = 'none';\r\n fileInput.onchange = (e) => this.onFileSelected(e);\r\n document.body.appendChild(fileInput);\r\n fileInput.click();\r\n document.body.removeChild(fileInput);\r\n }\r\n\r\n /**\r\n * Handles the file selection for import.\r\n */\r\n onFileSelected(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (!input.files || input.files.length === 0) return;\r\n\r\n const file = input.files[0];\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e) => {\r\n try {\r\n const jsonString = e.target?.result as string;\r\n const state = JSON.parse(jsonString) as DiagramState;\r\n\r\n // Basic validation\r\n if (state.nodes && state.edges && state.viewport) {\r\n this.setDiagramState(state);\r\n } else {\r\n console.error('Invalid diagram JSON format');\r\n // TODO: Show user notification\r\n }\r\n } catch (error) {\r\n console.error('Error parsing JSON', error);\r\n // TODO: Show user notification\r\n }\r\n };\r\n\r\n reader.readAsText(file);\r\n }\r\n\r\n private downloadFile(url: string, fileName: string): void {\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = fileName;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n document.body.removeChild(link);\r\n }\r\n\r\n onSearch(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.diagramStateService.setSearchQuery(input.value);\r\n }\r\n\r\n onFilterType(event: Event): void {\r\n const select = event.target as HTMLSelectElement;\r\n this.diagramStateService.setFilterType(select.value || null);\r\n }\r\n\r\n onZoomChange(zoom: number): void {\r\n this.diagramStateService.setZoom(zoom);\r\n }\r\n\r\n onMinimapViewportChange(viewport: Viewport): void {\r\n this.diagramStateService.setViewport(viewport);\r\n }\r\n\r\n getEdgeHandlePosition(edge: Edge, type: 'source' | 'target'): XYPosition {\r\n const nodes = this.nodes();\r\n const nodeId = type === 'source' ? edge.source : edge.target;\r\n const handleId = type === 'source' ? edge.sourceHandle : edge.targetHandle;\r\n const node = nodes.find(n => n.id === nodeId);\r\n\r\n if (!node) return { x: 0, y: 0 };\r\n\r\n const pos = getHandleAbsolutePosition(node, handleId);\r\n\r\n return {\r\n x: isFinite(pos.x) ? pos.x : 0,\r\n y: isFinite(pos.y) ? pos.y : 0\r\n };\r\n }\r\n\r\n @HostListener('window:keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const target = event.target as HTMLElement;\r\n // Ignore if focus is on an input or textarea\r\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\r\n return;\r\n }\r\n\r\n // Delete or Backspace to remove selected elements\r\n if (event.key === 'Delete' || event.key === 'Backspace') {\r\n this.diagramStateService.deleteSelectedElements();\r\n }\r\n\r\n // Ctrl+A or Cmd+A to select all\r\n if ((event.ctrlKey || event.metaKey) && event.key === 'a') {\r\n event.preventDefault(); // Prevent default browser select all\r\n this.diagramStateService.selectAll();\r\n }\r\n\r\n // Undo (Ctrl+Z) and Redo (Ctrl+Y or Ctrl+Shift+Z)\r\n if (event.ctrlKey || event.metaKey) {\r\n if (event.key === 'z') {\r\n event.preventDefault();\r\n this.diagramStateService.undo();\r\n } else if (event.key === 'y' || (event.shiftKey && event.key === 'Z')) {\r\n event.preventDefault();\r\n this.diagramStateService.redo();\r\n }\r\n\r\n // Clipboard Operations\r\n if (event.key === 'c') {\r\n // Handled by onCopyKeyPress\r\n } else if (event.key === 'v') {\r\n // Handled by onPasteKeyPress\r\n } else if (event.key === 'x') {\r\n // Handled by onCutKeyPress\r\n }\r\n }\r\n }\r\n}\r\n","<div class=\"ngx-workflow__container\" [attr.data-lod]=\"lodLevel\">\r\n <ngx-workflow-background *ngIf=\"showBackground\" [variant]=\"backgroundVariant\" [gap]=\"backgroundGap\"\r\n [size]=\"backgroundSize\" [color]=\"backgroundColor\" [backgroundColor]=\"backgroundBgColor\"></ngx-workflow-background>\r\n <svg #svg class=\"ngx-workflow__diagram\" (wheel)=\"onWheel($event)\" (pointerdown)=\"onPointerDown($event)\"\r\n (dblclick)=\"onDiagramDoubleClick($event)\">\r\n <defs>\r\n <pattern id=\"ngx-workflow__grid-pattern\" x=\"0\" y=\"0\" width=\"20\" height=\"20\" patternUnits=\"userSpaceOnUse\">\r\n <circle cx=\"0.5\" cy=\"0.5\" r=\"0.5\" fill=\"#ccc\" />\r\n </pattern>\r\n\r\n <!-- Arrow marker -->\r\n <marker id=\"ngx-workflow__arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\r\n orient=\"auto-start-reverse\">\r\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"context-stroke\" />\r\n </marker>\r\n\r\n <!-- Arrowclosed marker (filled) -->\r\n <marker id=\"ngx-workflow__arrowclosed\" viewBox=\"0 0 10 10\" refX=\"10\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\"\r\n orient=\"auto-start-reverse\">\r\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"context-stroke\" stroke=\"context-stroke\" />\r\n </marker>\r\n\r\n <!-- Dot marker -->\r\n <marker id=\"ngx-workflow__dot\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerWidth=\"6\" markerHeight=\"6\">\r\n <circle cx=\"5\" cy=\"5\" r=\"4\" fill=\"context-stroke\" />\r\n </marker>\r\n </defs>\r\n\r\n <rect width=\"100%\" height=\"100%\" fill=\"url(#ngx-workflow__grid-pattern)\" class=\"ngx-workflow__background\" />\r\n\r\n <g class=\"ngx-workflow__viewport\" [attr.transform]=\"transform\">\r\n <!-- Edges -->\r\n <g *ngFor=\"let edge of edges(); trackBy: trackByEdgeId\" [class.selected]=\"edge.selected\"\r\n [class.animated]=\"edge.animated\" class=\"ngx-workflow__edge\" (click)=\"onEdgeClick($event, edge)\"\r\n (dblclick)=\"onEdgeDoubleClick($event, edge)\">\r\n <!-- Edge path with markers -->\r\n <path [attr.d]=\"getEdgePath(edge)\" class=\"ngx-workflow__edge-path\" [style]=\"edge.style\"\r\n [attr.marker-start]=\"getMarkerUrl(edge.markerStart)\" [attr.marker-end]=\"getMarkerUrl(edge.markerEnd)\">\r\n </path>\r\n <!-- Invisible hitbox for easier clicking -->\r\n <path [attr.d]=\"getEdgePath(edge)\" class=\"ngx-workflow__edge-hitbox\"></path>\r\n\r\n <!-- Edge label -->\r\n <g *ngIf=\"edge.label || editingEdgeId === edge.id\" class=\"ngx-workflow__edge-label\">\r\n <foreignObject *ngIf=\"editingEdgeId === edge.id\" [attr.x]=\"getEdgeLabelPosition(edge).x - 50\"\r\n [attr.y]=\"getEdgeLabelPosition(edge).y - 15\" width=\"100\" height=\"30\">\r\n <input #edgeLabelInput type=\"text\" [value]=\"edge.label || ''\" (blur)=\"onEdgeLabelBlur()\"\r\n (keydown.enter)=\"updateEdgeLabel(edge, edgeLabelInput.value)\" class=\"ngx-workflow__edge-label-input\"\r\n autofocus>\r\n </foreignObject>\r\n\r\n <text *ngIf=\"editingEdgeId !== edge.id\" [attr.x]=\"getEdgeLabelPosition(edge).x\"\r\n [attr.y]=\"getEdgeLabelPosition(edge).y\" text-anchor=\"middle\" dominant-baseline=\"middle\"\r\n class=\"ngx-workflow__edge-label-text\" [style]=\"edge.labelStyle\">\r\n <!-- Label background -->\r\n <tspan *ngIf=\"edge.labelBgStyle\" class=\"ngx-workflow__edge-label-bg\" [style]=\"edge.labelBgStyle\"></tspan>\r\n {{ edge.label }}\r\n </text>\r\n </g>\r\n\r\n <!-- Edge Update Handles -->\r\n <g *ngIf=\"edge.selected\">\r\n <!-- Source Handle -->\r\n <circle class=\"ngx-workflow__edge-handle\" [attr.cx]=\"getEdgeHandlePosition(edge, 'source').x\"\r\n [attr.cy]=\"getEdgeHandlePosition(edge, 'source').y\" r=\"4\"\r\n (pointerdown)=\"startUpdatingEdge($event, edge, 'source')\"></circle>\r\n <!-- Target Handle -->\r\n <circle class=\"ngx-workflow__edge-handle\" [attr.cx]=\"getEdgeHandlePosition(edge, 'target').x\"\r\n [attr.cy]=\"getEdgeHandlePosition(edge, 'target').y\" r=\"4\"\r\n (pointerdown)=\"startUpdatingEdge($event, edge, 'target')\"></circle>\r\n </g>\r\n </g>\r\n\r\n <!-- Render temporary edges (previews) -->\r\n <g *ngFor=\"let tempEdge of tempEdges(); trackBy: trackByEdgeId\" [class.animated]=\"tempEdge.animated\"\r\n class=\"ngx-workflow__edge\">\r\n <path [attr.d]=\"getEdgePath(tempEdge, true)\" class=\"ngx-workflow__edge-path\" [style]=\"tempEdge.style\"></path>\r\n </g>\r\n\r\n <!-- Nodes -->\r\n <g *ngFor=\"let node of filteredNodes(); trackBy: trackByNodeId\" class=\"ngx-workflow__node\"\r\n [attr.data-id]=\"node.id\" [class.selected]=\"node.selected\" [class.dragging]=\"node.dragging\"\r\n [attr.transform]=\"'translate(' + node.position.x + ',' + node.position.y + ')'\"\r\n (dblclick)=\"onNodeDoubleClick($event, node)\">\r\n\r\n <!-- Node outline and background (visual + dragging) -->\r\n <rect [attr.width]=\"node.width || defaultNodeWidth\" [attr.height]=\"node.height || defaultNodeHeight\" rx=\"3\"\r\n ry=\"3\" class=\"ngx-workflow__node-rect\"></rect>\r\n\r\n <!-- Node Label -->\r\n <text *ngIf=\"node.type !== 'group'\" [attr.x]=\"(node.width || defaultNodeWidth) / 2\"\r\n [attr.y]=\"(node.height || defaultNodeHeight) / 2\" text-anchor=\"middle\" dominant-baseline=\"middle\"\r\n class=\"ngx-workflow__node-label\">\r\n {{ node.label }}\r\n </text>\r\n\r\n <!-- Hit area -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth) / 2\" cy=\"-10\" r=\"20\" fill=\"transparent\"\r\n pointer-events=\"all\"></circle>\r\n <!-- Visual -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth) / 2\" [attr.cy]=\"0\" r=\"6\"\r\n class=\"ngx-workflow__handle-circle\">\r\n </circle>\r\n\r\n <!-- Top Handle -->\r\n <g class=\"ngx-workflow__handle ngx-workflow__handle--source ngx-workflow__handle--target\"\r\n [attr.data-nodeid]=\"node.id\" data-handleid=\"top\" [attr.data-type]=\"'source'\">\r\n <!-- Hit area -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth) / 2\" cy=\"-10\" r=\"20\" fill=\"transparent\"\r\n pointer-events=\"all\"></circle>\r\n <!-- Visual -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth) / 2\" [attr.cy]=\"0\" r=\"6\"\r\n class=\"ngx-workflow__handle-circle\">\r\n </circle>\r\n </g>\r\n\r\n <!-- Right Handle -->\r\n <g class=\"ngx-workflow__handle ngx-workflow__handle--source ngx-workflow__handle--target\"\r\n [attr.data-nodeid]=\"node.id\" data-handleid=\"right\" [attr.data-type]=\"'source'\">\r\n <!-- Hit area -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth) + 10\" [attr.cy]=\"(node.height || defaultNodeHeight) / 2\"\r\n r=\"20\" fill=\"transparent\" pointer-events=\"all\">\r\n </circle>\r\n <!-- Visual -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth)\" [attr.cy]=\"(node.height || defaultNodeHeight) / 2\" r=\"6\"\r\n class=\"ngx-workflow__handle-circle\"></circle>\r\n </g>\r\n <!-- Bottom Handle -->\r\n <g class=\"ngx-workflow__handle ngx-workflow__handle--source ngx-workflow__handle--target\"\r\n [attr.data-nodeid]=\"node.id\" data-handleid=\"bottom\" [attr.data-type]=\"'source'\">\r\n <!-- Hit area -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth) / 2\" [attr.cy]=\"(node.height || defaultNodeHeight) + 10\"\r\n r=\"20\" fill=\"transparent\" pointer-events=\"all\">\r\n </circle>\r\n <!-- Visual -->\r\n <circle [attr.cx]=\"(node.width || defaultNodeWidth) / 2\" [attr.cy]=\"(node.height || defaultNodeHeight)\" r=\"6\"\r\n class=\"ngx-workflow__handle-circle\"></circle>\r\n </g>\r\n <!-- Left Handle -->\r\n <g class=\"ngx-workflow__handle ngx-workflow__handle--source ngx-workflow__handle--target\"\r\n [attr.data-nodeid]=\"node.id\" data-handleid=\"left\" [attr.data-type]=\"'source'\">\r\n <!-- Hit area -->\r\n <circle cx=\"-10\" [attr.cy]=\"(node.height || defaultNodeHeight) / 2\" r=\"20\" fill=\"transparent\"\r\n pointer-events=\"all\"></circle>\r\n <!-- Visual -->\r\n <circle [attr.cx]=\"0\" [attr.cy]=\"(node.height || defaultNodeHeight) / 2\" r=\"6\"\r\n class=\"ngx-workflow__handle-circle\">\r\n </circle>\r\n </g>\r\n\r\n <!-- Resize Handles -->\r\n <g *ngIf=\"node.selected && (node.resizable !== false) && nodesResizable\">\r\n <!-- NW Handle -->\r\n <rect class=\"ngx-workflow__resize-handle\" data-handle=\"nw\" [attr.x]=\"-5\" [attr.y]=\"-5\" width=\"10\" height=\"10\">\r\n </rect>\r\n <!-- NE Handle -->\r\n <rect class=\"ngx-workflow__resize-handle\" data-handle=\"ne\" [attr.x]=\"(node.width || defaultNodeWidth) - 5\"\r\n [attr.y]=\"-5\" width=\"10\" height=\"10\"></rect>\r\n <!-- SW Handle -->\r\n <rect class=\"ngx-workflow__resize-handle\" data-handle=\"sw\" [attr.x]=\"-5\"\r\n [attr.y]=\"(node.height || defaultNodeHeight) - 5\" width=\"10\" height=\"10\"></rect>\r\n <!-- SE Handle -->\r\n <rect class=\"ngx-workflow__resize-handle\" data-handle=\"se\" [attr.x]=\"(node.width || defaultNodeWidth) - 5\"\r\n [attr.y]=\"(node.height || defaultNodeHeight) - 5\" width=\"10\" height=\"10\"></rect>\r\n </g>\r\n\r\n <!-- Group Node Template -->\r\n <g *ngIf=\"node.type === 'group'\" class=\"ngx-workflow__group-node\">\r\n <!-- Header -->\r\n <rect [attr.width]=\"node.width\" height=\"30\" class=\"ngx-workflow__group-header\"></rect>\r\n <text [attr.x]=\"10\" [attr.y]=\"20\" class=\"ngx-workflow__group-label\">{{ node.label }}</text>\r\n\r\n <!-- Expand/Collapse Toggle -->\r\n <g class=\"ngx-workflow__group-toggle\" [attr.transform]=\"'translate(' + (node.width! - 25) + ', 5)'\"\r\n (click)=\"toggleGroup($event, node)\">\r\n <rect width=\"20\" height=\"20\" rx=\"4\" class=\"ngx-workflow__group-toggle-bg\"></rect>\r\n <path [attr.d]=\"node.expanded ? 'M 5 10 L 15 10' : 'M 5 10 L 15 10 M 10 5 L 10 15'\"\r\n class=\"ngx-workflow__group-toggle-icon\"></path>\r\n </g>\r\n </g>\r\n </g>\r\n\r\n <!-- Alignment Guides -->\r\n <g *ngFor=\"let guide of alignmentGuides()\" class=\"ngx-workflow__alignment-guide\">\r\n <line *ngIf=\"guide.type === 'horizontal'\" [attr.x1]=\"guide.start\" [attr.y1]=\"guide.position\"\r\n [attr.x2]=\"guide.end\" [attr.y2]=\"guide.position\" />\r\n <line *ngIf=\"guide.type === 'vertical'\" [attr.x1]=\"guide.position\" [attr.y1]=\"guide.start\"\r\n [attr.x2]=\"guide.position\" [attr.y2]=\"guide.end\" />\r\n </g>\r\n </g>\r\n\r\n </svg>\r\n\r\n <!-- IO Controls -->\r\n <div class=\"ngx-workflow__io-controls\">\r\n <input type=\"text\" placeholder=\"Search...\" (input)=\"onSearch($event)\">\r\n <select (change)=\"onFilterType($event)\">\r\n <option value=\"\">All Types</option>\r\n <option *ngFor=\"let type of nodeTypeKeys\" [value]=\"type\">{{ type }}</option>\r\n </select>\r\n <div class=\"ngx-workflow__separator\"></div>\r\n <button (click)=\"exportToJSON()\">Export JSON</button>\r\n <button (click)=\"triggerImport()\">Import JSON</button>\r\n <button (click)=\"exportToPNG()\">Export PNG</button>\r\n <button (click)=\"exportToSVG()\">Export SVG</button>\r\n </div>\r\n\r\n <ngx-workflow-zoom-controls *ngIf=\"showZoomControls\" [zoom]=\"viewport().zoom\" [minZoom]=\"0.1\" [maxZoom]=\"4\"\r\n (zoomIn)=\"onZoomChange(viewport().zoom + 0.1)\" (zoomOut)=\"onZoomChange(viewport().zoom - 0.1)\"\r\n (fitView)=\"onZoomChange(1)\" (resetZoom)=\"onZoomChange(1)\"></ngx-workflow-zoom-controls>\r\n\r\n <ngx-workflow-alignment-controls></ngx-workflow-alignment-controls>\r\n\r\n <ngx-workflow-minimap *ngIf=\"showMinimap\"></ngx-workflow-minimap>\r\n\r\n <ngx-workflow-properties-sidebar [node]=\"selectedNodeForEditing\" (close)=\"closeSidebar()\"\r\n (change)=\"onPropertiesChange($event)\"></ngx-workflow-properties-sidebar>\r\n</div>","import { Component, ChangeDetectionStrategy, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Node } from '../../models/node.model';\n\n@Component({\n selector: 'ngx-workflow-rounded-rect-node',\n template: `\n <svg:g class=\"ngx-workflow__custom-node ngx-workflow__rounded-rect-node\">\n <rect\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.width]=\"node.width || 170\"\n [attr.height]=\"node.height || 60\"\n rx=\"10\"\n ry=\"10\"\n fill=\"#a7f3d0\"\n stroke=\"#065f46\"\n stroke-width=\"1.5\"\n ></rect>\n <text\n [attr.x]=\"(node.width || 170) / 2\"\n [attr.y]=\"(node.height || 60) / 2\"\n text-anchor=\"middle\"\n alignment-baseline=\"middle\"\n fill=\"#065f46\"\n font-size=\"14px\"\n font-family=\"sans-serif\"\n >\n {{ node.data?.label || 'Custom Node' }}\n </text>\n </svg:g>\n `,\n styles: [`\n .ngx-workflow__rounded-rect-node {\n /* Specific styles for this custom node if needed */\n }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule]\n})\nexport class RoundedRectNodeComponent {\n @Input() node!: Node;\n}","import { Injectable } from '@angular/core';\nimport { Node, Edge, XYPosition } from '../models';\nimport ELK, { ElkNode } from 'elkjs/lib/elk.bundled';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LayoutService {\n\n private elk: any;\n\n constructor() {\n this.elk = new ELK();\n }\n\n // --- ELK Layout ---\n async applyElkLayout(nodes: Node[], edges: Edge[], options?: any): Promise<Node[]> {\n const elkGraph = {\n id: 'root',\n layoutOptions: {\n 'elk.algorithm': 'layered',\n 'elk.direction': 'DOWN',\n 'elk.spacing.nodeNode': '75',\n 'elk.layered.nodePlacement.strategy': 'BRANDES_KOLLER',\n ...options\n },\n children: nodes.map(node => ({\n id: node.id,\n width: node.width || 170,\n height: node.height || 60,\n })),\n edges: edges.map(edge => ({\n id: edge.id,\n sources: [edge.source],\n targets: [edge.target],\n })),\n };\n\n try {\n const result = await this.elk.layout(elkGraph);\n\n const laidOutNodes = nodes.map(node => {\n const elkNode = result.children?.find((n: ElkNode) => n.id === node.id);\n if (elkNode && elkNode.x !== undefined && elkNode.y !== undefined) {\n return {\n ...node,\n position: {\n x: elkNode.x,\n y: elkNode.y,\n },\n };\n }\n return node; // Return original if not found or no position\n });\n return laidOutNodes;\n\n } catch (error) {\n console.error('ELK layout failed:', error);\n return nodes; // Return original nodes on error\n }\n }\n}\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n// Components\r\nimport { DiagramComponent } from './components/diagram/diagram.component';\r\nimport { RoundedRectNodeComponent } from './components/custom-node/rounded-rect-node.component';\r\n\r\n// Services\r\nimport { DiagramStateService } from './services/diagram-state.service';\r\nimport { LayoutService } from './services/layout.service';\r\nimport { UndoRedoService } from './services/undo-redo.service';\r\n\r\n// Injection Tokens\r\nimport { NGX_WORKFLOW_NODE_TYPES } from './injection-tokens/node-types.token';\r\nimport { NGX_WORKFLOW_EDGE_TYPES } from './injection-tokens/edge-types.token';\r\nimport { Type } from '@angular/core';\r\nimport { Node } from './models';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n DiagramComponent,\r\n RoundedRectNodeComponent, // Import custom node component if it's standalone\r\n ],\r\n declarations: [\r\n // Standalone components are imported, not declared.\r\n // If a non-standalone component was needed, it would go here.\r\n ],\r\n providers: [\r\n DiagramStateService,\r\n LayoutService,\r\n UndoRedoService,\r\n {\r\n provide: NGX_WORKFLOW_NODE_TYPES,\r\n useValue: {\r\n 'rounded-rect': RoundedRectNodeComponent,\r\n // Add other custom node types here\r\n },\r\n },\r\n ],\r\n exports: [\r\n DiagramComponent,\r\n RoundedRectNodeComponent,\r\n ],\r\n})\r\nexport class NgxWorkflowModule { }","/*\n * Public API Surface of ngx-workflow\n */\n\nexport * from './lib/ngx-workflow.module';\n\n// Components\nexport * from './lib/components/diagram/diagram.component';\nexport * from './lib/components/custom-node/rounded-rect-node.component';\n\n// Services\nexport * from './lib/services/diagram-state.service';\nexport * from './lib/services/layout.service';\nexport * from './lib/services/undo-redo.service';\n\n// Models\nexport * from './lib/models/node.model';\nexport * from './lib/models/edge.model';\nexport * from './lib/models/viewport.model';\nexport * from './lib/models/diagram.model';\n\n// Types\nexport * from './lib/types/component-types';\n\n// Injection Tokens\nexport * from './lib/injection-tokens/node-types.token';\nexport * from './lib/injection-tokens/edge-types.token';\n\n// Utils\nexport * from './lib/utils/path-getters';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uuidv4","i1.UndoRedoService","i1.DiagramStateService","i1","i2"],"mappings":"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"}
|