verben-workflow-ui 0.5.41 → 0.5.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/esm2022/src/lib/components/actors/actors.facade.mjs +36 -4
  2. package/esm2022/src/lib/components/actors/actors.service.mjs +1 -1
  3. package/esm2022/src/lib/components/designer/services/wf-persistence.service.mjs +22 -3
  4. package/esm2022/src/lib/components/my-queue/my-queue.facade.mjs +74 -4
  5. package/esm2022/src/lib/components/my-queue/my-queue.service.mjs +1 -1
  6. package/esm2022/src/lib/components/tasks/tasks.facade.mjs +48 -3
  7. package/esm2022/src/lib/components/tasks/tasks.service.mjs +1 -1
  8. package/esm2022/src/lib/components/workflows/workflows.facade.mjs +40 -4
  9. package/esm2022/src/lib/components/workflows/workflows.service.mjs +1 -1
  10. package/fesm2022/verben-workflow-ui-src-lib-components-actors.mjs +35 -3
  11. package/fesm2022/verben-workflow-ui-src-lib-components-actors.mjs.map +1 -1
  12. package/fesm2022/verben-workflow-ui-src-lib-components-designer.mjs +19 -2
  13. package/fesm2022/verben-workflow-ui-src-lib-components-designer.mjs.map +1 -1
  14. package/fesm2022/verben-workflow-ui-src-lib-components-my-queue.mjs +73 -4
  15. package/fesm2022/verben-workflow-ui-src-lib-components-my-queue.mjs.map +1 -1
  16. package/fesm2022/verben-workflow-ui-src-lib-components-tasks.mjs +47 -3
  17. package/fesm2022/verben-workflow-ui-src-lib-components-tasks.mjs.map +1 -1
  18. package/fesm2022/verben-workflow-ui-src-lib-components-workflows.mjs +39 -3
  19. package/fesm2022/verben-workflow-ui-src-lib-components-workflows.mjs.map +1 -1
  20. package/package.json +7 -7
  21. package/src/lib/components/actors/actors.service.d.ts +6 -6
  22. package/src/lib/components/designer/services/wf-persistence.service.d.ts +2 -3
  23. package/src/lib/components/my-queue/my-queue.service.d.ts +23 -23
  24. package/src/lib/components/tasks/tasks.service.d.ts +15 -15
  25. package/src/lib/components/workflows/workflows.service.d.ts +11 -16
@@ -1 +1 @@
1
- {"version":3,"file":"verben-workflow-ui-src-lib-components-designer.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-toolbar.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/label-editor.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-state.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/label-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/swimlane-label.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/swimlane-popup.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/swimlane-stats.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/canvas-state.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-finder.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-selection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/keyboard-handler.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/rendering.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/orthogonal-router.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/connection-segment-interaction.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/connection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-mapper.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-persistence.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-precondition.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/node-selector.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/viewport.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/position-update.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-interaction.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/swimlane-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-facade.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-canvas.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-designer.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/verben-workflow-ui-src-lib-components-designer.ts"],"sourcesContent":["// components/workflow/toolbar/wf-toolbar.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkflowObjectType } from '../models/types';\n\ninterface ToolbarItem {\n id: WorkflowObjectType;\n label: string;\n icon: string;\n}\n\n@Component({\n selector: 'wf-toolbar',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"toolbar\">\n @for (item of toolbarItems; track item.id) {\n <button\n class=\"tool-button\"\n [class.active]=\"selectedTool === item.id\"\n (click)=\"onToolSelect(item.id)\"\n >\n <img [src]=\"item.icon\" [alt]=\"item.label\" class=\"tool-icon\" />\n </button>\n }\n </div>\n `,\n styles: [\n `\n .toolbar {\n display: flex;\n padding: 0.5rem;\n gap: 0.5rem;\n background: white;\n border: 1px solid #aa00ff;\n border-radius: 7px;\n box-shadow: 4px 4px 4px 3px #00000040;\n }\n\n .tool-button {\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #e5e7eb;\n border-radius: 0.375rem;\n background: white;\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover {\n background: #f9fafb;\n }\n\n &.active {\n background: #f3e8ff;\n border-color: #d8b4fe;\n }\n }\n\n .tool-icon {\n }\n `,\n ],\n})\nexport class WFToolbarComponent {\n @Input() selectedTool: WorkflowObjectType | null = null;\n @Output() toolSelected = new EventEmitter<WorkflowObjectType | null>();\n\n toolbarItems: ToolbarItem[] = [\n { id: 'swimlane', label: 'Swimlane', icon: 'icons/swimlane.svg' },\n { id: 'stage', label: 'Stage', icon: 'icons/stage.svg' },\n { id: 'action', label: 'Action', icon: 'icons/action.svg' },\n { id: 'form', label: 'Form', icon: 'icons/form.svg' },\n // { id: 'decision', label: 'Decision', icon: 'icons/decision.svg' },\n { id: 'decision', label: 'Decision', icon: 'icons/stage.svg' },\n { id: 'subflow', label: 'Subflow', icon: 'icons/subflow.svg' },\n ];\n\n onToolSelect(toolId: WorkflowObjectType): void {\n // If same tool is selected, deselect it\n this.toolSelected.emit(this.selectedTool === toolId ? null : toolId);\n }\n}\n","// components/label-editor.component.ts\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\n\n@Component({\n selector: 'wf-label-editor',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div\n class=\"label-container\"\n [class.editing]=\"isEditing\"\n [class.swimlane-label]=\"isSwimlane\"\n >\n @if (isEditing) {\n <input\n #labelInput\n type=\"text\"\n [value]=\"label\"\n (blur)=\"finishEditing()\"\n (keyup.enter)=\"finishEditing()\"\n (keyup.escape)=\"cancelEditing()\"\n class=\"label-input\"\n [class.swimlane-input]=\"isSwimlane\"\n [style.width.px]=\"Math.max(100, label.length * 8)\"\n />\n } @else {\n <span\n (dblclick)=\"startEditing()\"\n class=\"label-text\"\n [class.connection-label]=\"isConnection\"\n [class.swimlane-text]=\"isSwimlane\"\n >\n {{ label }}\n <svg (click)=\"openDialog.emit($event)\" class=\"edit-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.78934 3.19845L11.8027 6.21184M12.1148 2.0038L12.9974 2.8864C13.5858 3.47481 13.5858 4.42879 12.9974 5.01719L4.26925 13.7453H1.25586V10.7319L9.98399 2.0038C10.5724 1.4154 11.5264 1.4154 12.1148 2.0038Z\" stroke=\"#3479E9\" stroke-linecap=\"square\"/>\n </svg>\n </span>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .label-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 50px;\n z-index: 1000;\n }\n\n .label-container.editing {\n background: white;\n padding: 2px;\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .label-input {\n padding: 2px 4px;\n border: 1px solid #d36cff;\n border-radius: 2px;\n font-size: 12px;\n font-family: inherit;\n outline: none;\n\n &.swimlane-input {\n font-size: 14px;\n font-weight: 500;\n min-width: 150px;\n }\n }\n\n .label-text {\n cursor: text;\n user-select: none;\n font-size: 12px;\n pointer-events: all;\n display: inline-block;\n min-width: 20px;\n min-height: 14px;\n position: relative;\n }\n\n .connection-label {\n background: white;\n padding: 2px 4px;\n border: 1px solid #e5e7eb;\n border-radius: 2px;\n }\n\n .swimlane-text {\n font-size: 14px;\n font-weight: 500;\n color: #64748b;\n }\n\n .swimlane-label {\n position: absolute;\n left: 20px;\n }\n\n .edit-icon {\n position: absolute;\n right: -14px;\n top: -14px;\n cursor: pointer;\n }\n `,\n ],\n})\nexport class LabelEditorComponent {\n @Input() label = '';\n @Input() x = 0;\n @Input() y = 0;\n @Input() isConnection = false;\n @Input() isSwimlane = false;\n @Output() labelChange = new EventEmitter<string>();\n @Output() openDialog = new EventEmitter();\n\n @ViewChild('labelInput') labelInput!: ElementRef<HTMLInputElement>;\n\n isEditing = false;\n protected readonly Math = Math;\n\n getEditorPosition(): string {\n // const offsetX = this.isConnection ? -25 : -25; // Center the label\n // const offsetY = -10; // Slight upward offset to center vertically\n\n const offsetX = this.isConnection ? 0 : 0; // Center the label\n const offsetY = 0; // Slight upward offset to center vertically\n\n // return `translate(${this.x + offsetX}px, ${this.y + offsetY}px)`;\n return `translate(50%, 50%)`;\n }\n\n getLabelStyle(): any {\n if (this.isEditing) return {};\n\n return {\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n 'pointer-events': 'all',\n };\n }\n\n startEditing(): void {\n this.isEditing = true;\n setTimeout(() => {\n if (this.labelInput) {\n this.labelInput.nativeElement.focus();\n this.labelInput.nativeElement.select();\n }\n });\n }\n\n finishEditing(): void {\n if (this.isEditing) {\n const newValue = this.labelInput.nativeElement.value.trim();\n if (newValue && newValue !== this.label) {\n this.labelChange.emit(newValue);\n }\n this.isEditing = false;\n }\n }\n\n cancelEditing(): void {\n this.isEditing = false;\n }\n\n @HostListener('document:keydown.escape')\n onEscapePress(): void {\n this.cancelEditing();\n }\n}\n","// services/wf-state.service.ts\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport {\n WorkflowObject,\n Position,\n WorkflowObjectType,\n Action,\n} from '../models/types';\nimport { SwimlaneManagementService } from './swimlane-management.service';\n\ninterface WorkflowState {\n objects: WorkflowObject[];\n selectedObjectId: string | null;\n selectedTool: WorkflowObjectType | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowStateService {\n state = signal<WorkflowState>({\n objects: [],\n selectedObjectId: null,\n selectedTool: null,\n });\n\n // Computed signals for better reactivity\n readonly objects = computed(() => this.state().objects);\n readonly selectedObjectId = computed(() => this.state().selectedObjectId);\n readonly selectedTool = computed(() => this.state().selectedTool);\n // private swimlaneManagement = inject(SwimlaneManagementService);\n\n // Computed signals for filtered objects\n readonly nodes = computed(() =>\n this.objects().filter(\n (obj) => obj.type !== 'swimlane' && obj.type !== 'action'\n )\n );\n\n readonly swimlanes = computed(() =>\n this.objects().filter((obj) => obj.type === 'swimlane')\n );\n\n readonly connections = computed(\n () => this.objects().filter((obj) => obj.type === 'action') as Action[]\n );\n\n addObject(object: WorkflowObject): void {\n this.state.update((state) => ({\n ...state,\n objects: [...state.objects, object],\n }));\n }\n\n updateObject(id: string, changes: Partial<WorkflowObject>): void {\n this.state.update((state) => ({\n ...state,\n objects: state.objects.map((obj) =>\n obj.id === id ? { ...obj, ...changes } : obj\n ),\n }));\n }\n\n updateMultipleObjects(\n updates: { id: string; changes: Partial<WorkflowObject> }[]\n ): void {\n this.state.update((state) => ({\n ...state,\n objects: state.objects.map((obj) => {\n const update = updates.find((u) => u.id === obj.id);\n return update ? { ...obj, ...update.changes } : obj;\n }),\n }));\n }\n\n removeObject(id: string): void {\n this.state.update((state) => ({\n ...state,\n objects: state.objects.filter((obj) => obj.id !== id),\n }));\n }\n\n setSelectedTool(tool: WorkflowObjectType | null): void {\n this.state.update((state) => ({ ...state, selectedTool: tool }));\n }\n\n setSelectedObject(id: string | null): void {\n this.state.update((state) => ({ ...state, selectedObjectId: id }));\n }\n\n getObjectById(id: string): WorkflowObject | undefined {\n return this.objects().find((obj) => obj.id === id);\n }\n\n // Initialize workflow with default objects\n initializeWorkflow(): void {\n const swimlaneHeight = 260;\n\n const swimlane: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'swimlane',\n position: { x: 0, y: 0 },\n size: { width: 3000 - 40, height: swimlaneHeight },\n label: 'Default Swimlane',\n };\n\n // Position start node vertically centered in the swimlane\n const startNodeHeight = 46; // Height of start node\n const startY = (swimlaneHeight - startNodeHeight) / 2;\n const startNode: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'start',\n position: { x: 50, y: startY },\n size: { width: 58, height: startNodeHeight },\n label: 'Start',\n };\n\n const initialConnection: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'action',\n position: startNode.position,\n size: { width: 0, height: 0 },\n label: '',\n fromId: startNode.id,\n toId: '',\n points: [\n {\n x: startNode.position.x + startNode.size.width,\n y: startNode.position.y + startNode.size.height / 2,\n },\n {\n x: startNode.position.x + startNode.size.width + 50,\n y: startNode.position.y + startNode.size.height / 2,\n },\n ],\n } as WorkflowObject;\n\n this.state.set({\n ...this.state(),\n objects: [swimlane, startNode, initialConnection],\n });\n }\n}\n","// services/label-management.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { Position, WorkflowObject, Action } from '../models/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LabelManagementService {\n private workflowState = inject(WorkflowStateService);\n\n updateLabel(objectId: string, newLabel: string): void {\n this.workflowState.updateObject(objectId, { label: newLabel });\n }\n\n getLabelPosition(object: WorkflowObject): Position {\n if (object.type === 'action') {\n return this.getConnectionLabelPosition(object as Action);\n }\n\n // // // For regular nodes, use SVG coordinates\n // if (object.type === 'swimlane') {\n // return {\n // x: 100, // Fixed position for swimlane labels\n // y: object.position.y + 20,\n // };\n // }\n\n // For regular nodes, use SVG coordinates\n // For swimlanes, position label at the left side\n if (object.type === 'swimlane') {\n return {\n x: object.position.x + 20, // Small indent from left edge\n y: object.position.y + object.size.height / 2, // Vertically centered\n };\n }\n\n return {\n x: object.position.x + object.size.width / 2,\n y: object.position.y + object.size.height / 2,\n };\n }\n\n private getConnectionLabelPosition(connection: Action): Position {\n if (!connection.points || connection.points.length < 2) {\n return { x: 0, y: 0 };\n }\n\n // Find the middle point of the connection\n const midIndex = Math.floor(connection.points.length / 2);\n const point1 = connection.points[midIndex - 1];\n const point2 = connection.points[midIndex];\n\n return {\n x: (point1.x + point2.x) / 2,\n y: (point1.y + point2.y) / 2 - 10, // Offset above the line\n };\n }\n\n getSVGTextPosition(object: WorkflowObject): { x: number; y: number } {\n // Center the label for all node types\n const centerX = object.size.width / 2;\n let centerY = object.size.height / 2;\n\n // Adjust position for form type\n if (object.type === 'form') {\n centerY = object.size.height + 20; // Position below the form\n }\n\n return { x: centerX, y: centerY };\n }\n}\n","// components/workflow/swimlane-label.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LabelEditorComponent } from './label-editor.component';\n\n@Component({\n selector: '[wf-swimlane-label]',\n standalone: true,\n imports: [CommonModule, LabelEditorComponent],\n template: `\n <svg:g>\n <!-- Plus icon at top -->\n <svg:g\n transform=\"translate(0, 20)\"\n class=\"cursor-pointer\"\n (click)=\"onAddClick($event)\"\n >\n <svg:circle r=\"10\" fill=\"white\" stroke=\"#D8B4FE\" stroke-width=\"1\" />\n <svg:path\n d=\"M-6 0h12 M0 -6v12\"\n stroke=\"#9333EA\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg:g>\n\n <!-- Label in middle with edit support -->\n <svg:g transform=\"translate(0, 120)\">\n <svg:foreignObject\n x=\"-60\"\n y=\"-12\"\n width=\"180\"\n height=\"24\"\n transform=\"rotate(-90)\"\n >\n <xhtml:div\n xmlns=\"http://www.w3.org/1999/xhtml\"\n style=\"width: 100%; height: 100%;\"\n >\n <wf-label-editor\n [label]=\"label\"\n [x]=\"0\"\n [y]=\"0\"\n (labelChange)=\"onLabelChange($event)\"\n />\n </xhtml:div>\n </svg:foreignObject>\n </svg:g>\n\n <!-- Count badge at bottom -->\n <svg:g transform=\"translate(0, 200)\">\n <svg:rect\n x=\"-15\"\n y=\"-10\"\n width=\"20\"\n height=\"20\"\n rx=\"20\"\n fill=\"#F3E8FF\"\n stroke=\"#D8B4FE\"\n />\n <svg:text\n x=\"0\"\n y=\"4\"\n text-anchor=\"middle\"\n font-size=\"12\"\n fill=\"#7E22CE\"\n font-weight=\"500\"\n transform=\"rotate(-90)\"\n >\n {{ count }}\n </svg:text>\n </svg:g>\n </svg:g>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n circle:hover {\n fill: #f3e8ff;\n }\n `,\n ],\n})\nexport class SwimlaneLabelComponent {\n @Input() label = '';\n @Input() count = 0;\n\n @Output() addClick = new EventEmitter<MouseEvent>();\n @Output() labelChange = new EventEmitter<string>();\n\n onAddClick(event: MouseEvent): void {\n event.stopPropagation();\n this.addClick.emit(event);\n }\n\n onLabelChange(newLabel: string): void {\n this.labelChange.emit(newLabel);\n }\n}\n","// components/workflow/swimlane-popup.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Position } from '../models/types';\n\n@Component({\n selector: 'wf-swimlane-popup',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div \n class=\"fixed bg-white rounded-lg shadow-lg border border-slate-200 p-4 min-w-[200px]\"\n [style.left.px]=\"position.x\"\n [style.top.px]=\"position.y\"\n >\n <div class=\"flex justify-between items-center mb-4\">\n <h3 class=\"text-sm font-medium text-slate-900\">Swimlane Actions</h3>\n <button \n class=\"text-slate-400 hover:text-slate-600\"\n (click)=\"close.emit()\"\n >×</button>\n </div>\n\n <div class=\"space-y-2\">\n <button \n *ngFor=\"let action of actions\"\n class=\"w-full text-left px-3 py-2 text-sm text-slate-700 hover:bg-purple-50 rounded-md\"\n (click)=\"onActionClick(action)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n `\n})\nexport class SwimLanePopupComponent {\n @Input() position!: Position;\n @Output() close = new EventEmitter<void>();\n @Output() actionSelected = new EventEmitter<string>();\n\n actions = [\n { id: 'add-above', label: 'Add Swimlane Above' },\n { id: 'add-below', label: 'Add Swimlane Below' },\n { id: 'delete', label: 'Delete Swimlane' },\n ];\n\n onActionClick(action: { id: string, label: string }): void {\n this.actionSelected.emit(action.id);\n this.close.emit();\n }\n}","// services/swimlane-stats.service.ts\nimport { Injectable, inject, signal } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\n\ninterface SwimlanePopupState {\n isOpen: boolean;\n position: Position;\n swimlaneId: string | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SwimlaneStatsService {\n private workflowState = inject(WorkflowStateService);\n\n private popupState = signal<SwimlanePopupState>({\n isOpen: false,\n position: { x: 0, y: 0 },\n swimlaneId: null,\n });\n\n readonly popupStatus = this.popupState.asReadonly();\n\n getNodeCount(swimlaneId: string): number {\n const nodes = this.workflowState.nodes();\n return nodes.filter((node) => this.isNodeInSwimlane(node, swimlaneId))\n .length;\n }\n\n private isNodeInSwimlane(node: WorkflowObject, swimlaneId: string): boolean {\n const swimlane = this.workflowState.getObjectById(swimlaneId);\n if (!swimlane) return false;\n\n return (\n node.position.y >= swimlane.position.y &&\n node.position.y <= swimlane.position.y + swimlane.size.height\n );\n }\n\n openPopup(position: Position, swimlaneId: string): void {\n this.popupState.set({\n isOpen: true,\n position,\n swimlaneId,\n });\n }\n\n closePopup(): void {\n this.popupState.update((state) => ({ ...state, isOpen: false }));\n }\n}\n","// services/canvas-state.service.ts\nimport { Injectable, signal } from '@angular/core';\nimport { Position } from '../models/types';\n\nexport interface CanvasState {\n width: number;\n height: number;\n gridSize: number;\n isConnecting: boolean;\n isDragging: boolean;\n dragStartPosition: Position | null;\n dragOffset: Position;\n connectionPreview: Position[] | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CanvasStateService {\n private state = signal<CanvasState>({\n width: 3000,\n height: 2000,\n gridSize: 20,\n isConnecting: false,\n isDragging: false,\n dragStartPosition: null,\n dragOffset: { x: 0, y: 0 },\n connectionPreview: null,\n });\n\n readonly canvasState = this.state.asReadonly();\n\n setConnecting(isConnecting: boolean): void {\n this.state.update((state) => ({ ...state, isConnecting }));\n }\n\n setDragging(isDragging: boolean): void {\n this.state.update((state) => ({ ...state, isDragging }));\n }\n\n setDragStartPosition(position: Position | null): void {\n this.state.update((state) => ({ ...state, dragStartPosition: position }));\n }\n\n setDragOffset(offset: Position): void {\n this.state.update((state) => ({ ...state, dragOffset: offset }));\n }\n\n setConnectionPreview(points: Position[] | null): void {\n this.state.update((state) => ({ ...state, connectionPreview: points }));\n }\n\n resetInteractionState(): void {\n this.state.update((state) => ({\n ...state,\n isConnecting: false,\n isDragging: false,\n dragStartPosition: null,\n dragOffset: { x: 0, y: 0 },\n connectionPreview: null,\n }));\n }\n}\n","// services/node-finder.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeFinderService {\n private workflowState = inject(WorkflowStateService);\n\n findNodeAtPoint(point: Position): WorkflowObject | null {\n return (\n this.workflowState\n .nodes()\n .find((node) => this.isPointInNode(point, node)) || null\n );\n }\n\n isPointInNode(point: Position, node: WorkflowObject): boolean {\n return (\n point.x >= node.position.x &&\n point.x <= node.position.x + node.size.width &&\n point.y >= node.position.y &&\n point.y <= node.position.y + node.size.height\n );\n }\n\n isProtectedNode(node: WorkflowObject): boolean {\n return ['start', 'swimlane'].includes(node.type);\n }\n\n // Add any other shared node-finding functionality here\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WorkflowObject, Position, Action } from '../models/types';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { CanvasStateService } from './canvas-state.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { NodeFinderService } from './node-finder.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeSelectionService {\n private workflowState = inject(WorkflowStateService);\n private nodeFinder = inject(NodeFinderService);\n private canvasState = inject(CanvasStateService);\n\n handleNodeClick(point: Position): void {\n // Clear any ongoing interactions first\n this.canvasState.resetInteractionState();\n\n const nodes = this.workflowState.nodes();\n const clickedNode = this.nodeFinder.findNodeAtPoint(point);\n\n if (clickedNode) {\n this.selectNode(clickedNode.id);\n } else {\n this.clearSelection();\n }\n }\n\n selectNode(nodeId: string): void {\n // Don't reselect if already selected\n if (this.workflowState.selectedObjectId() === nodeId) return;\n\n this.workflowState.setSelectedObject(nodeId);\n }\n\n clearSelection(): void {\n this.workflowState.setSelectedObject(null);\n }\n\n isSelected(nodeId: string): boolean {\n return this.workflowState.selectedObjectId() === nodeId;\n }\n\n getSelectedNode(): WorkflowObject | null {\n const selectedId = this.workflowState.selectedObjectId();\n if (!selectedId) return null;\n\n return this.workflowState.getObjectById(selectedId) || null;\n }\n\n canSelectNode(node: WorkflowObject): boolean {\n // Add any rules for node selection here\n // For example, prevent selecting swimlanes\n return node.type !== 'swimlane';\n }\n\n handleToolSelection(nodeType: string | null): void {\n // Clear selection when tool is selected\n if (nodeType) {\n this.clearSelection();\n }\n }\n\n handleKeyboardEvent(event: KeyboardEvent): void {\n // Handle keyboard shortcuts for selection\n // For example, 'Escape' to clear selection\n if (event.key === 'Escape') {\n this.clearSelection();\n }\n }\n\n handleClickOutside(event: MouseEvent): void {\n // Check if click is outside any node and clear selection\n const target = event.target as HTMLElement;\n if (\n target.tagName === 'svg' ||\n target.classList.contains('canvas-container')\n ) {\n this.clearSelection();\n }\n }\n\n deleteSelectedObject(): void {\n const selectedId = this.workflowState.selectedObjectId();\n if (!selectedId) return;\n\n const selectedObject = this.workflowState.getObjectById(selectedId);\n if (!selectedObject) return;\n\n // First, remove any connections to/from this object\n const connections = this.workflowState.connections();\n const relatedConnectionIds = connections\n .filter(\n (conn: Action) => conn.fromId === selectedId || conn.toId === selectedId\n )\n .map((conn) => conn.id);\n\n // Remove all related connections\n relatedConnectionIds.forEach((id) => {\n this.workflowState.removeObject(id);\n });\n\n // Remove the selected object\n this.workflowState.removeObject(selectedId);\n\n // Clear the selection\n this.clearSelection();\n }\n}\n","// services/keyboard-handler.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { NodeSelectionService } from './node-selection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class KeyboardHandlerService {\n private workflowState = inject(WorkflowStateService);\n private selection = inject(NodeSelectionService);\n\n handleKeyDown(event: KeyboardEvent): void {\n // Only handle keyboard events if an object is selected\n if (!this.workflowState.selectedObjectId()) return;\n\n switch (event.key) {\n case 'Delete':\n case 'Backspace':\n this.handleDelete();\n break;\n // Add other keyboard shortcuts here\n }\n }\n\n private handleDelete(): void {\n const selectedId = this.workflowState.selectedObjectId();\n if (!selectedId) return;\n\n const selectedObject = this.workflowState.getObjectById(selectedId);\n if (!selectedObject) return;\n\n // Don't delete protected nodes like start node or swimlanes\n if (['start', 'swimlane'].includes(selectedObject.type)) return;\n\n // Remove the object and its connections\n this.selection.deleteSelectedObject();\n }\n}\n","// services/rendering.service.ts\nimport { Injectable } from '@angular/core';\nimport { Position, WorkflowObject, WorkflowObjectType } from '../models/types';\n\nexport interface NodeStyle {\n fill: string;\n stroke: string;\n strokeWidth: number;\n strokeLinejoin?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RenderingService {\n // Node path generation\n generateNodePath(object: WorkflowObject): string {\n switch (object.type) {\n case 'start':\n return this.getStartNodePath(object.size.width, object.size.height);\n case 'decision':\n return this.getDecisionPath(object.size.width, object.size.height);\n case 'form':\n return this.getFormPath(object.size.width, object.size.height);\n case 'subflow':\n return this.getSubflowPath(object.size.width, object.size.height);\n default:\n return '';\n }\n }\n\n // Individual path generators\n getStartNodePath(width: number, height: number): string {\n return `M${width} ${height / 2} \n A${width / 2} ${height / 2} 0 0 0 \n 0 ${height / 2}\n A${width / 2} ${height / 2} 0 0 0 \n ${width} ${height / 2}`;\n }\n\n getFormPath(width: number, height: number): string {\n // Use exact path from design SVG\n return `M74.0625 40.5591V85.0625C74.0625 87.9716 72.9069 90.7615 70.8498 92.8186C68.7928 94.8756 66.0028 96.0312 63.0938 96.0312H11.9062C8.99716 96.0312 6.20721 94.8756 4.15017 92.8186C2.09313 90.7615 0.9375 87.9716 0.9375 85.0625V11.9375C0.9375 9.02841 2.09313 6.23846 4.15017 4.18142C6.20721 2.12438 8.99716 0.96875 11.9062 0.96875H34.4722C36.4109 0.969043 38.2701 1.73921 39.6412 3.10994L71.9213 35.3901C73.292 36.7611 74.0622 38.6204 74.0625 40.5591Z`;\n }\n\n getStartNodePaths(): { circle: string; arrow: string } {\n return {\n circle:\n 'M57.5 23C57.5 35.3246 44.8544 45.5 29 45.5C13.1456 45.5 0.5 35.3246 0.5 23C0.5 10.6754 13.1456 0.5 29 0.5C44.8544 0.5 57.5 10.6754 57.5 23Z',\n arrow: 'M74 6L64 0.226497V11.7735L74 6ZM0 7H65V5H0V7Z',\n };\n }\n\n getNodeStyle(isSelected: boolean): NodeStyle {\n return {\n fill: 'white',\n stroke: '#D36CFF',\n strokeWidth: isSelected ? 2 : 1,\n strokeLinejoin: 'round',\n };\n }\n\n getConnectionStyle(isSelected: boolean): Partial<SVGPathElement['style']> {\n return {\n stroke: '#D36CFF',\n strokeWidth: isSelected ? '2' : '1',\n fill: 'none',\n };\n }\n\n getConnectionPreviewStyle(): Partial<SVGPathElement['style']> {\n return {\n stroke: '#D36CFF',\n strokeWidth: '1',\n strokeDasharray: '4',\n fill: 'none',\n };\n }\n\n getSwimlaneStyle(): Partial<SVGRectElement['style']> {\n return {\n fill: '#f8fafc',\n stroke: '#e2e8f0',\n strokeWidth: '1',\n };\n }\n\n getNodeTransforms(node: WorkflowObject): {\n node: string;\n arrow?: string;\n indicator?: string;\n } {\n const baseTransform = `translate(${node.position.x}, ${node.position.y})`;\n\n switch (node.type) {\n case 'start':\n return {\n node: baseTransform,\n arrow: 'translate(57, 17)', // Position arrow relative to circle\n };\n case 'decision':\n return {\n node: baseTransform,\n indicator: `translate(${node.size.width + 10}, -10)`, // Position properties indicator\n };\n default:\n return { node: baseTransform };\n }\n }\n\n getDecisionNodePath(width: number, height: number): string {\n return `M${width / 2} 0 L${width} ${height / 2} L${\n width / 2\n } ${height} L0 ${height / 2} Z`;\n }\n\n getPropertiesIndicator(): {\n circle: { r: number; style: NodeStyle };\n text: { content: string; style: Partial<SVGTextElement['style']> };\n } {\n return {\n circle: {\n r: 8,\n style: {\n fill: 'white',\n stroke: '#D36CFF',\n strokeWidth: 1,\n },\n },\n text: {\n content: 'i',\n style: {\n fontSize: '12px',\n textAnchor: 'middle',\n alignmentBaseline: 'middle',\n userSelect: 'none',\n pointerEvents: 'none',\n },\n },\n };\n }\n\n getLabelStyle(\n nodeType: WorkflowObjectType\n ): Partial<SVGTextElement['style']> {\n const baseStyle = {\n fontSize: '12px',\n textAnchor: 'middle',\n dominantBaseline: 'middle',\n userSelect: 'none',\n pointerEvents: 'none',\n };\n\n switch (nodeType) {\n case 'swimlane':\n return {\n ...baseStyle,\n fontSize: '14px',\n fontWeight: '500',\n fill: '#64748b',\n // writingMode: 'vertical-lr',\n };\n default:\n return baseStyle;\n }\n }\n\n getDefaultDimensions(): { width: number; height: number; gridSize: number } {\n return {\n width: 3000,\n height: 2000,\n gridSize: 20,\n };\n }\n\n getGridPattern(): {\n pattern: { width: number; height: number };\n path: { d: string; style: Partial<SVGPathElement['style']> };\n } {\n return {\n pattern: {\n width: 20,\n height: 20,\n },\n path: {\n d: 'M 20 0 L 0 0 0 20',\n style: {\n fill: 'none',\n stroke: '#e2e8f0',\n strokeWidth: '0.5',\n },\n },\n };\n }\n\n // getConnectionPath(points: Position[]): string {\n // if (!points || points.length < 2) return '';\n\n // const [start, ...rest] = points;\n // const end = rest[rest.length - 1];\n\n // // Create the main path\n // const mainPath =\n // `M ${start.x} ${start.y} ` + rest.map((p) => `L ${p.x} ${p.y}`).join(' ');\n\n // // Add arrowhead\n // const arrowPath = this.createArrowhead(\n // end,\n // this.getEndPointAngle(points[points.length - 2], end)\n // );\n\n // return `${mainPath} ${arrowPath}`;\n // }\n\n /**\n * Gets the SVG path for a connection\n */\n getConnectionPath(points: Position[]): string {\n if (!points || points.length < 2) return '';\n\n // Create the main path\n const pathCommands = points.map((point, index) => {\n return index === 0\n ? `M ${point.x} ${point.y}`\n : `L ${point.x} ${point.y}`;\n });\n\n // Add arrowhead to the last segment\n const lastSegmentStart = points[points.length - 2];\n const lastSegmentEnd = points[points.length - 1];\n const arrowPath = this.createArrowhead(\n lastSegmentEnd,\n this.getEndPointAngle(lastSegmentStart, lastSegmentEnd)\n );\n\n return `${pathCommands.join(' ')} ${arrowPath}`;\n }\n\n /**\n * Gets style for an individual connection segment\n */\n getConnectionSegmentStyle(\n isSelected: boolean,\n isHovered: boolean\n ): Partial<SVGPathElement['style']> {\n return {\n stroke: '#D36CFF',\n strokeWidth: isSelected ? '2' : isHovered ? '2' : '1',\n fill: 'none',\n transition: 'stroke-width 0.2s ease',\n };\n }\n\n private createArrowhead(point: Position, angle: number): string {\n const arrowSize = 10;\n const arrowPoints = [\n {\n x: point.x - arrowSize * Math.cos(angle - Math.PI / 6),\n y: point.y - arrowSize * Math.sin(angle - Math.PI / 6),\n },\n point,\n {\n x: point.x - arrowSize * Math.cos(angle + Math.PI / 6),\n y: point.y - arrowSize * Math.sin(angle + Math.PI / 6),\n },\n ];\n\n return (\n `M ${arrowPoints[0].x} ${arrowPoints[0].y} ` +\n `L ${arrowPoints[1].x} ${arrowPoints[1].y} ` +\n `L ${arrowPoints[2].x} ${arrowPoints[2].y}`\n );\n }\n\n private getEndPointAngle(p1: Position, p2: Position): number {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n }\n\n getDecisionPath(width: number, height: number): string {\n // Using the exact dimensions from your SVG\n const centerX = width / 2;\n const centerY = height / 2;\n return `M0.981845 ${centerY} L${centerX} 0.580976 L${\n width - 0.981845\n } ${centerY} L${centerX} ${height - 0.580976}Z`;\n }\n\n getSubflowPath(width: number, height: number): string {\n // Using the exact dimensions from your SVG\n return `M1.19873 ${height * 0.252887}L${width / 2} 0.57735L${\n width - 1.19873\n } ${height * 0.252887}V${height * 0.747113}L${width / 2} ${\n height - 0.57735\n }L1.19873 ${height * 0.747113}V${height * 0.252887}`;\n }\n}\n","// services/orthogonal-router.service.ts\nimport { Injectable } from '@angular/core';\nimport {\n ConnectionPoint,\n NodeSide,\n Position,\n RoutingPoint,\n Size,\n} from '../models/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OrthogonalRouterService {\n /**\n * Finds the closest node side and point for a given mouse position\n */\n findConnectionPoint(\n node: { position: Position; size: Size },\n mousePos: Position\n ): ConnectionPoint {\n const { position: pos, size } = node;\n\n // Calculate distances to each side\n const distToTop = Math.abs(mousePos.y - pos.y);\n const distToBottom = Math.abs(mousePos.y - (pos.y + size.height));\n const distToLeft = Math.abs(mousePos.x - pos.x);\n const distToRight = Math.abs(mousePos.x - (pos.x + size.width));\n\n // Find the minimum distance\n const minDist = Math.min(distToTop, distToBottom, distToLeft, distToRight);\n\n // Determine connection point based on closest side\n let side: NodeSide;\n let x: number;\n let y: number;\n\n if (minDist === distToTop) {\n side = 'top';\n x = Math.min(Math.max(mousePos.x, pos.x), pos.x + size.width);\n y = pos.y;\n } else if (minDist === distToBottom) {\n side = 'bottom';\n x = Math.min(Math.max(mousePos.x, pos.x), pos.x + size.width);\n y = pos.y + size.height;\n } else if (minDist === distToLeft) {\n side = 'left';\n x = pos.x;\n y = Math.min(Math.max(mousePos.y, pos.y), pos.y + size.height);\n } else {\n side = 'right';\n x = pos.x + size.width;\n y = Math.min(Math.max(mousePos.y, pos.y), pos.y + size.height);\n }\n\n return { x, y, side };\n }\n\n /**\n * Calculates the optimal orthogonal route between two points\n */\n calculateRoute(\n startNode: { position: Position; size: Size },\n endNode: { position: Position; size: Size },\n startPoint: ConnectionPoint,\n endPoint: ConnectionPoint\n ): RoutingPoint[] {\n // Convert connection points to routing points\n const start: RoutingPoint = { ...startPoint, type: 'start' };\n const end: RoutingPoint = { ...endPoint, type: 'end' };\n\n // If points are aligned vertically or horizontally, create direct route\n if (Math.abs(start.x - end.x) < 10) {\n return this.createVerticalRoute(start, end);\n }\n if (Math.abs(start.y - end.y) < 10) {\n return this.createHorizontalRoute(start, end);\n }\n\n // Create route based on connection sides\n return this.createRouteFromSides(\n start,\n end,\n startPoint.side,\n endPoint.side\n );\n }\n\n private createRouteFromSides(\n start: RoutingPoint,\n end: RoutingPoint,\n startSide: NodeSide,\n endSide: NodeSide\n ): RoutingPoint[] {\n const points: RoutingPoint[] = [start];\n\n // Determine if we need to start horizontally or vertically based on the start side\n const startHorizontal = startSide === 'left' || startSide === 'right';\n const endHorizontal = endSide === 'left' || endSide === 'right';\n\n if (startHorizontal) {\n // Start with horizontal movement\n const midX = (start.x + end.x) / 2;\n if (start.y !== end.y) {\n points.push(this.createBendPoint(midX, start.y, true));\n points.push(this.createBendPoint(midX, end.y, false));\n }\n } else {\n // Start with vertical movement\n const midY = (start.y + end.y) / 2;\n if (start.x !== end.x) {\n points.push(this.createBendPoint(start.x, midY, false));\n points.push(this.createBendPoint(end.x, midY, true));\n }\n }\n\n points.push(end);\n return this.simplifyRoute(points);\n }\n\n private createBendPoint(\n x: number,\n y: number,\n isHorizontal: boolean\n ): RoutingPoint {\n return { x, y, type: 'bend', isHorizontal };\n }\n\n private createHorizontalRoute(\n start: RoutingPoint,\n end: RoutingPoint\n ): RoutingPoint[] {\n return [start, { ...end, type: 'end', isHorizontal: true }];\n }\n\n private createVerticalRoute(\n start: RoutingPoint,\n end: RoutingPoint\n ): RoutingPoint[] {\n return [start, { ...end, type: 'end', isHorizontal: false }];\n }\n\n private simplifyRoute(points: RoutingPoint[]): RoutingPoint[] {\n // Remove unnecessary bends (where three points form a straight line)\n const simplified = points.filter((point, index) => {\n if (index === 0 || index === points.length - 1) return true;\n\n const prev = points[index - 1];\n const next = points[index + 1];\n\n // Keep point if it creates an actual bend\n return (\n !(prev.x === point.x && point.x === next.x) &&\n !(prev.y === point.y && point.y === next.y)\n );\n });\n\n // Update point types and horizontal flags\n return simplified.map((point, index) => ({\n ...point,\n type:\n index === 0\n ? 'start'\n : index === simplified.length - 1\n ? 'end'\n : 'bend',\n isHorizontal:\n index < simplified.length - 1\n ? simplified[index + 1].y === point.y\n : point.y === simplified[index - 1].y,\n }));\n }\n\n /**\n * Updates a segment's position while maintaining orthogonal constraints\n */\n updateSegment(\n points: RoutingPoint[],\n segmentIndex: number,\n newPosition: Position\n ): RoutingPoint[] {\n const updatedPoints = [...points];\n const currentPoint = points[segmentIndex];\n const nextPoint = points[segmentIndex + 1];\n\n if (!currentPoint || !nextPoint) return points;\n\n // Determine if this is a horizontal or vertical segment\n const isHorizontal = currentPoint.y === nextPoint.y;\n\n if (isHorizontal) {\n // Moving a horizontal segment - adjust y coordinate\n updatedPoints[segmentIndex].y = newPosition.y;\n updatedPoints[segmentIndex + 1].y = newPosition.y;\n } else {\n // Moving a vertical segment - adjust x coordinate\n updatedPoints[segmentIndex].x = newPosition.x;\n updatedPoints[segmentIndex + 1].x = newPosition.x;\n }\n\n return this.simplifyRoute(updatedPoints);\n }\n\n /**\n * Determines if a point is near enough to a line segment for manipulation\n */\n isPointNearSegment(\n point: Position,\n segmentStart: Position,\n segmentEnd: Position,\n threshold = 10\n ): boolean {\n // For horizontal segments\n if (segmentStart.y === segmentEnd.y) {\n return (\n Math.abs(point.y - segmentStart.y) <= threshold &&\n point.x >= Math.min(segmentStart.x, segmentEnd.x) &&\n point.x <= Math.max(segmentStart.x, segmentEnd.x)\n );\n }\n\n // For vertical segments\n if (segmentStart.x === segmentEnd.x) {\n return (\n Math.abs(point.x - segmentStart.x) <= threshold &&\n point.y >= Math.min(segmentStart.y, segmentEnd.y) &&\n point.y <= Math.max(segmentStart.y, segmentEnd.y)\n );\n }\n\n return false;\n }\n}\n","// services/connection-segment-interaction.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, Action } from '../models/types';\nimport { OrthogonalRouterService } from './orthogonal-router.service';\nimport { WorkflowStateService } from './wf-state.service';\n\ninterface SegmentDragState {\n connectionId: string;\n segmentIndex: number;\n initialPosition: Position;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConnectionSegmentInteractionService {\n private workflowState = inject(WorkflowStateService);\n private orthogonalRouter = inject(OrthogonalRouterService);\n\n private dragState: SegmentDragState | null = null;\n\n /**\n * Identifies if a point is near any connection segment\n */\n findSegmentAtPoint(\n point: Position\n ): { connectionId: string; segmentIndex: number } | null {\n const connections = this.workflowState.connections();\n\n for (const connection of connections) {\n const points = connection.points;\n if (!points || points.length < 2) continue;\n\n // Check each segment\n for (let i = 0; i < points.length - 1; i++) {\n if (\n this.orthogonalRouter.isPointNearSegment(\n point,\n points[i],\n points[i + 1]\n )\n ) {\n return {\n connectionId: connection.id,\n segmentIndex: i,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Starts dragging a connection segment\n */\n startDragging(\n connectionId: string,\n segmentIndex: number,\n point: Position\n ): void {\n this.dragState = {\n connectionId,\n segmentIndex,\n initialPosition: point,\n };\n }\n\n /**\n * Updates segment position during drag\n */\n updateDragging(point: Position): void {\n if (!this.dragState) return;\n\n const connection = this.workflowState.getObjectById(\n this.dragState.connectionId\n ) as Action;\n if (!connection || !connection.points) return;\n\n // Convert Position[] to RoutingPoint[]\n const routingPoints = connection.points.map((p, index) => ({\n ...p,\n type:\n index === 0\n ? 'start'\n : index === connection.points.length - 1\n ? 'end'\n : ('bend' as 'start' | 'end' | 'bend'),\n isHorizontal:\n index < connection.points.length - 1\n ? connection.points[index].y === connection.points[index + 1].y\n : false,\n }));\n\n const updatedPoints = this.orthogonalRouter.updateSegment(\n routingPoints,\n this.dragState.segmentIndex,\n point\n );\n\n // Convert back to Position[] for storage\n const positionPoints = updatedPoints.map((p) => ({\n x: p.x,\n y: p.y,\n }));\n\n this.workflowState.updateObject(connection.id, {\n points: positionPoints,\n } as Partial<Action>);\n }\n /**\n * Completes the drag operation\n */\n finishDragging(): void {\n // Additional cleanup if needed\n this.dragState = null;\n }\n\n /**\n * Returns whether a segment is currently being dragged\n */\n isDragging(): boolean {\n return this.dragState !== null;\n }\n\n /**\n * Gets cursor style based on segment orientation\n */\n getSegmentCursor(connectionId: string, segmentIndex: number): string {\n const connection = this.workflowState.getObjectById(connectionId) as Action;\n if (!connection || !connection.points) return 'default';\n\n const point = connection.points[segmentIndex];\n const nextPoint = connection.points[segmentIndex + 1];\n\n if (!point || !nextPoint) return 'default';\n\n // Return appropriate cursor based on segment orientation\n return point.y === nextPoint.y ? 'ns-resize' : 'ew-resize';\n }\n}\n","// services/connection.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport {\n Position,\n WorkflowObject,\n Action,\n ConnectionPoint,\n NodeSide,\n} from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { RenderingService } from './rendering.service';\nimport { NodeFinderService } from './node-finder.service';\nimport { OrthogonalRouterService } from './orthogonal-router.service';\nimport { ConnectionSegmentInteractionService } from './connection-segment-interaction.service';\n\nexport interface ConnectionEndpoints {\n startPoint: ConnectionPoint;\n endPoint: ConnectionPoint;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConnectionService {\n private workflowState = inject(WorkflowStateService);\n private canvasState = inject(CanvasStateService);\n private nodeFinder = inject(NodeFinderService);\n private rendering = inject(RenderingService);\n private orthogonalRouter = inject(OrthogonalRouterService);\n private segmentInteraction = inject(ConnectionSegmentInteractionService);\n private connectionEndpoints = new Map<string, ConnectionEndpoints>();\n\n startConnection(sourceNode: WorkflowObject, point: Position): void {\n if (!this.canStartConnection(sourceNode)) return;\n\n const startPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(sourceNode, point),\n type: 'start',\n position: point,\n };\n\n this.canvasState.setConnecting(true);\n this.workflowState.setSelectedObject(sourceNode.id);\n\n // Store the start point for later use\n const tempId = 'preview';\n this.connectionEndpoints.set(tempId, {\n startPoint,\n endPoint: { ...startPoint }, // Create a new object with the same properties\n });\n\n // Calculate initial preview route\n const previewPoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n { position: point, size: { width: 0, height: 0 } },\n startPoint,\n startPoint\n );\n\n this.canvasState.setConnectionPreview(previewPoints);\n }\n\n updateConnectionPreview(point: Position): void {\n const sourceNodeId = this.workflowState.selectedObjectId();\n if (!sourceNodeId) return;\n\n const sourceNode = this.workflowState.getObjectById(sourceNodeId);\n if (!sourceNode) return;\n\n const endpoints = this.connectionEndpoints.get('preview');\n if (!endpoints) return;\n\n const endPoint: ConnectionPoint = {\n x: point.x,\n y: point.y,\n side: this.determineEndSide(endpoints.startPoint, point),\n type: 'end',\n position: point,\n };\n\n // Update preview with new end point\n const previewPoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n { position: point, size: { width: 0, height: 0 } },\n endpoints.startPoint,\n endPoint\n );\n\n this.canvasState.setConnectionPreview(previewPoints);\n }\n\n finalizeConnection(point: Position): void {\n const sourceNodeId = this.workflowState.selectedObjectId();\n if (!sourceNodeId) return;\n\n const sourceNode = this.workflowState.getObjectById(sourceNodeId);\n if (!sourceNode) return;\n\n const targetNode = this.nodeFinder.findNodeAtPoint(point);\n const endpoints = this.connectionEndpoints.get('preview');\n\n if (targetNode && endpoints && this.canConnect(sourceNode, targetNode)) {\n const endPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(targetNode, point),\n type: 'end',\n position: point,\n };\n\n // Calculate final route\n const routePoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n targetNode,\n endpoints.startPoint,\n endPoint\n );\n\n const newConnection: Action = {\n id: crypto.randomUUID(),\n type: 'action',\n fromId: sourceNode.id,\n toId: targetNode.id,\n label: '',\n position: sourceNode.position,\n size: { width: 0, height: 0 },\n points: routePoints,\n };\n\n // Store the connection endpoints for later use\n this.connectionEndpoints.set(newConnection.id, {\n startPoint: endpoints.startPoint,\n endPoint,\n });\n\n this.workflowState.addObject(newConnection);\n }\n\n this.connectionEndpoints.delete('preview');\n }\n\n updateConnectionsForNode(nodeId: string): void {\n const node = this.workflowState.getObjectById(nodeId);\n if (!node) return;\n\n const connections = this.workflowState\n .connections()\n .filter((conn) => conn.fromId === nodeId || conn.toId === nodeId);\n\n connections.forEach((connection) => {\n const sourceNode = this.workflowState.getObjectById(connection.fromId);\n const targetNode = this.workflowState.getObjectById(connection.toId);\n\n if (sourceNode && targetNode) {\n // Determine connection points based on current node positions\n const startPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(sourceNode, {\n x: sourceNode.position.x + sourceNode.size.width / 2,\n y: sourceNode.position.y + sourceNode.size.height / 2,\n }),\n type: 'start',\n position: sourceNode.position,\n };\n\n const endPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(targetNode, {\n x: targetNode.position.x + targetNode.size.width / 2,\n y: targetNode.position.y + targetNode.size.height / 2,\n }),\n type: 'end',\n position: targetNode.position,\n };\n\n // Calculate completely new route\n const newPoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n targetNode,\n startPoint,\n endPoint\n );\n\n // Update connection\n this.workflowState.updateObject(connection.id, {\n points: newPoints,\n } as Partial<Action>);\n\n // Store new endpoints\n this.connectionEndpoints.set(connection.id, { startPoint, endPoint });\n }\n });\n }\n\n private determineEndSide(\n startPoint: ConnectionPoint,\n endPoint: Position\n ): NodeSide {\n // Determine the best side for the end point based on relative position\n const dx = endPoint.x - startPoint.x;\n const dy = endPoint.y - startPoint.y;\n\n if (Math.abs(dx) > Math.abs(dy)) {\n return dx > 0 ? 'left' : 'right';\n } else {\n return dy > 0 ? 'top' : 'bottom';\n }\n }\n\n /**\n * Handles clicking on a connection segment\n */\n handleSegmentClick(point: Position): void {\n const segment = this.segmentInteraction.findSegmentAtPoint(point);\n if (segment) {\n this.segmentInteraction.startDragging(\n segment.connectionId,\n segment.segmentIndex,\n point\n );\n }\n }\n\n /**\n * Updates segment position during drag\n */\n handleSegmentDrag(point: Position): void {\n if (this.segmentInteraction.isDragging()) {\n this.segmentInteraction.updateDragging(point);\n }\n }\n\n /**\n * Completes segment drag operation\n */\n finishSegmentDrag(): void {\n this.segmentInteraction.finishDragging();\n }\n\n /**\n * Gets cursor style for a segment\n */\n getSegmentCursor(connectionId: string, segmentIndex: number): string {\n return this.segmentInteraction.getSegmentCursor(connectionId, segmentIndex);\n }\n\n getConnectionPath(connection: Action): string {\n if (!connection.points || connection.points.length < 2) return '';\n\n const points = connection.points;\n const [start, ...rest] = points;\n return (\n `M ${start.x} ${start.y} ` + rest.map((p) => `L ${p.x} ${p.y}`).join(' ')\n );\n }\n\n private canStartConnection(node: WorkflowObject): boolean {\n if (node.type === 'start') {\n // Start node can only have one outgoing connection\n return !this.hasOutgoingConnections(node.id);\n }\n return ['stage', 'decision', 'form', 'subflow'].includes(node.type);\n }\n\n private canConnect(source: WorkflowObject, target: WorkflowObject): boolean {\n if (!target || source.id === target.id) return false;\n\n // Prevent connections to start node and swimlanes\n if (['start', 'swimlane'].includes(target.type)) return false;\n\n // Prevent duplicate connections\n return !this.hasConnection(source.id, target.id);\n }\n\n private hasConnection(sourceId: string, targetId: string): boolean {\n return this.workflowState\n .connections()\n .some(\n (conn) =>\n (conn as Action).fromId === sourceId &&\n (conn as Action).toId === targetId\n );\n }\n\n getPreviewPath(): string {\n const preview = this.canvasState.canvasState().connectionPreview;\n if (!preview || preview.length < 2) return '';\n\n // Use the rendering service for consistent path generation\n return this.rendering.getConnectionPath(preview);\n }\n\n hasOutgoingConnections(nodeId: string): boolean {\n return this.workflowState\n .connections()\n .some((conn) => (conn as Action).fromId === nodeId);\n }\n\n getConnectionPoint(node: WorkflowObject, type: 'input' | 'output'): Position {\n const center = {\n x: node.position.x + node.size.width / 2,\n y: node.position.y + node.size.height / 2,\n };\n\n switch (node.type) {\n case 'stage':\n return {\n x:\n type === 'input'\n ? node.position.x\n : node.position.x + node.size.width,\n y: center.y,\n };\n case 'decision':\n return type === 'input'\n ? { x: center.x, y: node.position.y }\n : { x: node.position.x + node.size.width, y: center.y };\n default:\n return type === 'input'\n ? { x: node.position.x, y: center.y }\n : { x: node.position.x + node.size.width, y: center.y };\n }\n }\n\n recalculateConnectionPoints(\n source: WorkflowObject,\n target: WorkflowObject,\n existingPoints: Position[]\n ): Position[] {\n // Start and end points\n const startPoint = this.getConnectionPoint(source, 'output');\n const endPoint = this.getConnectionPoint(target, 'input');\n\n // If it's a simple connection, just return direct path\n if (existingPoints.length <= 2) {\n return [startPoint, endPoint];\n }\n\n // For complex paths, maintain the middle points' relative positions\n const middlePoints = existingPoints.slice(1, -1).map((point) => ({\n x: point.x + (startPoint.x - existingPoints[0].x),\n y: point.y + (startPoint.y - existingPoints[0].y),\n }));\n\n return [startPoint, ...middlePoints, endPoint];\n }\n\n // Use nodeFinder methods instead of NodeInteractionService\n findTargetNode(point: Position): WorkflowObject | null {\n return this.nodeFinder.findNodeAtPoint(point);\n }\n}\n","// services/workflow-mapper.service.ts\nimport { Injectable } from '@angular/core';\nimport {\n WorkflowObject,\n Position,\n Action as FrontendAction,\n Stage,\n WorkflowMetadata,\n} from '../models/types';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { TaskAssignmentType } from 'verben-workflow-ui/src/lib/models';\nimport { Status } from 'verben-workflow-ui/src/lib/models';\nimport { SwimLane } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { StageActorRule } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowAction } from 'verben-workflow-ui/src/lib/models';\nimport { ObjectState } from 'verben-workflow-ui/src/lib/models';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowMapperService {\n constructor(private connectionService: ConnectionService) {}\n\n // Frontend to Backend transformation\n toBackendWorkflow(\n objects: WorkflowObject[],\n workflowMetadata: WorkflowMetadata\n ): Workflow {\n const swimlanes = objects.filter((obj) => obj.type === 'swimlane');\n const stages = objects.filter((obj) => obj.type === 'stage');\n const connections = objects.filter(\n (obj) =>\n obj.type === 'action' &&\n (obj as FrontendAction)?.fromId &&\n (obj as FrontendAction)?.toId\n ) as FrontendAction[];\n const startNode = objects.find((obj) => obj.type === 'start');\n const forms = objects.filter((obj) => obj.type === 'form');\n\n // Find entry points (stages connected to start node)\n const entryPointIds = connections\n .filter((conn) => conn.fromId === startNode?.id)\n .map((conn) => conn.toId);\n\n // Find exit points (stages with no outgoing connections)\n const exitPointIds = stages\n .filter((stage) => !connections.some((conn) => conn.fromId === stage.id))\n .map((stage) => stage.id);\n\n // Preserve original workflow code if it exists, otherwise generate a new one\n const code =\n workflowMetadata.code || this.generateCode(workflowMetadata.name);\n\n const workflow: Workflow = {\n Id: workflowMetadata.id || '',\n id: workflowMetadata.id || '',\n Code: code,\n Name: workflowMetadata.name,\n Description:\n workflowMetadata.description || `Workflow for ${workflowMetadata.name}`,\n StageEntryRule: this.generateStageEntryRule(entryPointIds.length),\n Form: workflowMetadata.formId || '',\n AssignmentType: TaskAssignmentType.Queue,\n Status: Status.Active,\n Actions: connections.map((connection) =>\n this.toBackendAction(connection, code)\n ),\n Lanes: swimlanes.map((lane) => this.toBackendSwimlane(lane, code)),\n Stages: [],\n TenantId: workflowMetadata.tenantId || '',\n ServiceName: 'Workflow',\n CreatedAt: workflowMetadata.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: workflowMetadata.isNew ? ObjectState.New : ObjectState.Changed,\n };\n\n // Map stages with entry/exit point information\n const mappedStages = stages.map((stage) =>\n this.toBackendStage(\n stage,\n code,\n entryPointIds.includes(stage.id),\n exitPointIds.includes(stage.id),\n this.findSwimlaneForStage(stage, swimlanes),\n workflowMetadata.tenantId || ''\n )\n );\n\n // Store stages in workflow\n workflow.Stages = mappedStages;\n\n return workflow;\n }\n\n private generateCode(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n private findSwimlaneForStage(\n stage: WorkflowObject,\n swimlanes: WorkflowObject[]\n ): string {\n return (\n swimlanes.find(\n (lane) =>\n stage.position.y >= lane.position.y &&\n stage.position.y <= lane.position.y + lane.size.height\n )?.id || ''\n );\n }\n\n private generateStageEntryRule(entryPointCount: number): string {\n return entryPointCount > 1 ? 'parallel-entry' : 'single-entry';\n }\n\n private toBackendSwimlane(\n frontendLane: WorkflowObject,\n workflow: string\n ): SwimLane {\n // Preserve original ID if available\n const originalId = frontendLane.originalId || '';\n\n return {\n Id: originalId,\n id: originalId,\n Code: frontendLane.originalCode || this.generateCode(frontendLane.label),\n Position: Math.floor(frontendLane.position.y / frontendLane.size.height),\n Workflow: workflow,\n Coordinates: {\n X: frontendLane.position.x,\n Y: frontendLane.position.y,\n },\n Size: {\n Width: frontendLane.size.width,\n Height: frontendLane.size.height,\n },\n Tags: frontendLane.tags || [], // This now correctly maps Tag[] to Tag[]\n TenantId: frontendLane.tenantId || '',\n ServiceName: 'Workflow',\n CreatedAt: frontendLane.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: originalId ? ObjectState.Changed : ObjectState.New,\n };\n }\n\n private toBackendStage(\n frontendStage: WorkflowObject,\n workflowId: string,\n isEntryPoint: boolean,\n isExitPoint: boolean,\n swimlaneId: string,\n tenantId: string\n ): WorkflowStage {\n const stage = frontendStage as Stage;\n const originalId = stage.originalId || '';\n\n return {\n Id: originalId,\n id: originalId,\n Code: stage.originalCode || this.generateCode(stage.label),\n Key: stage.id,\n Workflow: workflowId,\n Name: stage.label,\n Description: stage.description || '',\n Duration: stage.duration || 0,\n PassOnRule: stage.passOnRule || '',\n ActorRule: (stage.actorRule as StageActorRule) || StageActorRule.Any,\n MinNoOfActor: stage.minNoOfActor || 1,\n IsParallel: stage.isParallel || false,\n IsEntryPoint: isEntryPoint,\n IsExitPoint: isExitPoint,\n Tags: stage.tags || [], // Now correctly maps Tag[] to Tag[]\n Form: stage.form || '',\n AllowMultiSubProcess: stage.allowMultiSubProcess || false,\n AssignmentType:\n (stage.assignmentType as TaskAssignmentType) ||\n TaskAssignmentType.Queue,\n SubWorkFlow: stage.subWorkflow || '',\n SwimLane: swimlaneId,\n Coordinates: {\n X: stage.position.x,\n Y: stage.position.y,\n },\n IsSubProcess: stage.isSubProcess || false,\n TenantId: tenantId,\n ServiceName: 'Workflow',\n CreatedAt: stage.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: originalId ? ObjectState.Changed : ObjectState.New,\n };\n }\n\n private toBackendAction(\n frontendAction: FrontendAction,\n workflow: string\n ): WorkflowAction {\n const originalId = frontendAction.originalId || '';\n\n return {\n Id: originalId,\n id: originalId,\n Code:\n frontendAction.originalCode ||\n `${frontendAction.fromId}-to-${frontendAction.toId}`,\n Workflow: workflow,\n Name: frontendAction.label || 'Unnamed Action',\n OperationAction: null,\n FromStage: frontendAction.fromId,\n ToStage: frontendAction.toId,\n IsParallel: frontendAction.isParallel || false,\n PassOnRule: frontendAction.passOnRule || '',\n TenantId: frontendAction.tenantId || '',\n ServiceName: 'Workflow',\n CreatedAt: frontendAction.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: originalId ? ObjectState.Changed : ObjectState.New,\n };\n }\n\n // Backend to Frontend transformation\n toFrontendObjects(workflow: Workflow): {\n objects: WorkflowObject[];\n metadata: WorkflowMetadata;\n } {\n const objects: WorkflowObject[] = [];\n\n // Create metadata object to store workflow information\n const metadata: WorkflowMetadata = {\n id: workflow.Id,\n code: workflow.Code,\n name: workflow.Name,\n description: workflow.Description,\n tenantId: workflow.TenantId,\n formId: workflow.Form,\n createdAt: workflow.CreatedAt,\n isNew: workflow.DataState === ObjectState.New,\n };\n\n // Start with the start node\n const startNode = this.createStartNode();\n objects.push(startNode);\n\n // Convert swimlanes\n const swimlanes = workflow.Lanes.map((lane) =>\n this.toFrontendSwimlane(lane)\n );\n objects.push(...swimlanes);\n\n // Convert stages\n const stages = workflow.Stages.map((stage) => this.toFrontendStage(stage));\n objects.push(...stages);\n\n // Create connections, including from start node to entry points\n const connections = this.createConnections(workflow, startNode.id, stages);\n objects.push(...connections);\n\n return { objects, metadata };\n }\n\n private createStartNode(): WorkflowObject {\n return {\n id: 'start-node',\n type: 'start',\n position: { x: 50, y: 37 },\n size: { width: 58, height: 46 },\n label: 'Start',\n };\n }\n\n private toFrontendSwimlane(backendLane: SwimLane): WorkflowObject {\n // Normalize the coordinates and size\n const coordinates = backendLane.Coordinates || {\n X: 0,\n Y: backendLane.Position * 120,\n };\n const position = {\n x: coordinates.X ?? 0,\n y: coordinates.Y ?? 0,\n };\n\n const size = backendLane.Size || { Width: 2960, Height: 120 };\n const normalizedSize = {\n width: size.Width ?? 2960,\n height: size.Height ?? 120,\n };\n\n return {\n id: backendLane.Code,\n type: 'swimlane',\n position,\n size: normalizedSize,\n label: backendLane.Code,\n // Store original backend information for later use\n originalId: backendLane.Id,\n originalCode: backendLane.Code,\n tags: backendLane.Tags || [],\n tenantId: backendLane.TenantId,\n createdAt: backendLane.CreatedAt,\n };\n }\n\n private toFrontendStage(backendStage: WorkflowStage): WorkflowObject {\n // Normalize coordinates\n const coordinates = backendStage.Coordinates || { X: 0, Y: 0 };\n const position = {\n x: coordinates.X ?? 0,\n y: coordinates.Y ?? 0,\n };\n\n return {\n id: backendStage.Key || backendStage.Code,\n type: 'stage',\n position,\n size: { width: 120, height: 80 }, // Default size for stages\n label: backendStage.Name,\n // Store original backend information\n originalId: backendStage.Id,\n originalCode: backendStage.Code,\n description: backendStage.Description,\n duration: backendStage.Duration,\n passOnRule: backendStage.PassOnRule,\n actorRule: backendStage.ActorRule,\n minNoOfActor: backendStage.MinNoOfActor,\n isParallel: backendStage.IsParallel,\n isEntryPoint: backendStage.IsEntryPoint,\n isExitPoint: backendStage.IsExitPoint,\n tags: backendStage.Tags,\n forms: backendStage.Form,\n allowMultiSubProcess: backendStage.AllowMultiSubProcess,\n assignmentType: backendStage.AssignmentType,\n subWorkflow: backendStage.SubWorkFlow,\n isSubProcess: backendStage.IsSubProcess,\n tenantId: backendStage.TenantId,\n createdAt: backendStage.CreatedAt,\n };\n }\n\n private createConnections(\n workflow: Workflow,\n startNodeId: string,\n stages: WorkflowObject[]\n ): FrontendAction[] {\n const connections: FrontendAction[] = [];\n const actions = workflow.Actions;\n\n // Create connections from start node to entry points\n stages\n .filter(\n (stage) =>\n workflow.Stages.find((s) => s.Key === stage.id || s.Code === stage.id)\n ?.IsEntryPoint\n )\n .forEach((entryStage) => {\n connections.push(\n this.createConnection(\n crypto.randomUUID(),\n startNodeId,\n entryStage.id,\n 'Start',\n stages\n )\n );\n });\n\n // Create connections between stages\n actions.forEach((action) => {\n connections.push(\n this.createConnection(\n action.Code,\n action.FromStage,\n action.ToStage,\n action.Name || '',\n stages,\n {\n originalId: action.Id,\n originalCode: action.Code,\n isParallel: action.IsParallel,\n passOnRule: action.PassOnRule,\n tenantId: action.TenantId,\n createdAt: action.CreatedAt,\n }\n )\n );\n });\n\n return connections;\n }\n\n private createConnection(\n id: string,\n fromId: string,\n toId: string,\n label: string,\n stages: WorkflowObject[],\n properties?: any\n ): FrontendAction {\n const sourceNode =\n stages.find((s) => s.id === fromId) || this.createStartNode();\n const targetNode = stages.find((s) => s.id === toId);\n\n if (!targetNode) {\n console.error(`Unable to find target stage with id: ${toId}`);\n // Return a minimal connection to avoid breaking the application\n return {\n id,\n type: 'action',\n fromId,\n toId,\n label,\n position: { x: 0, y: 0 },\n size: { width: 0, height: 0 },\n points: [],\n ...properties,\n };\n }\n\n const points = this.connectionService.recalculateConnectionPoints(\n sourceNode,\n targetNode,\n []\n );\n\n return {\n id,\n type: 'action',\n fromId,\n toId,\n label,\n position: sourceNode.position,\n size: { width: 0, height: 0 },\n points,\n // Store all additional properties from backend\n originalId: properties?.originalId,\n originalCode: properties?.originalCode,\n isParallel: properties?.isParallel,\n passOnRule: properties?.passOnRule,\n tenantId: properties?.tenantId,\n createdAt: properties?.createdAt,\n properties: properties?.properties,\n };\n }\n}\n","// services/workflow-persistence.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { WorkflowMapperService } from './wf-mapper.service';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { FormEntity } from 'verben-workflow-ui/src/lib/models';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowsService } from 'verben-workflow-ui/src/lib/components/workflows';\nimport { WorkflowMetadata } from '../models/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowPersistenceService {\n private workflowState = inject(WorkflowStateService);\n private mapper = inject(WorkflowMapperService);\n private service = inject(WorkflowsService);\n\n // Add a property to store the current workflow metadata\n private currentWorkflowMetadata: WorkflowMetadata = {\n id: '',\n code: '',\n name: 'New Workflow',\n description: '',\n isNew: true,\n };\n\n // Getter for workflow metadata\n get workflowMetadata(): WorkflowMetadata {\n return { ...this.currentWorkflowMetadata };\n }\n\n // Save workflow with current metadata\n saveWorkflow(): Promise<Workflow[]> {\n const currentObjects = this.workflowState.objects();\n const workflow = this.mapper.toBackendWorkflow(\n currentObjects,\n this.currentWorkflowMetadata\n );\n\n return this.service.saveWorkflows([workflow]).then((results) => {\n // Update metadata with saved workflow info if successful\n if (results && results.length > 0) {\n const savedWorkflow = results[0];\n this.updateWorkflowMetadata({\n id: savedWorkflow.Id,\n code: savedWorkflow.Code,\n name: savedWorkflow.Name,\n description: savedWorkflow.Description,\n tenantId: savedWorkflow.TenantId,\n formId: savedWorkflow.Form,\n createdAt: savedWorkflow.CreatedAt,\n isNew: false,\n });\n }\n return results;\n });\n }\n\n // Load workflow by ID\n async loadWorkflow(workflowId: string): Promise<void> {\n try {\n const data = await this.service.getWorkflowWithParam(workflowId);\n const workflow = data.Result[0];\n\n if (workflow) {\n const result = this.mapper.toFrontendObjects(workflow);\n\n // Update metadata\n this.updateWorkflowMetadata({\n id: workflow.Id,\n code: workflow.Code,\n name: workflow.Name,\n description: workflow.Description,\n tenantId: workflow.TenantId,\n formId: workflow.Form,\n createdAt: workflow.CreatedAt,\n isNew: false,\n });\n\n // Clear existing state and load new objects\n this.workflowState.state.set({\n objects: result.objects,\n selectedObjectId: null,\n selectedTool: null,\n });\n }\n } catch (error) {\n console.error('Error loading workflow:', error);\n throw error;\n }\n }\n\n // Update workflow metadata\n updateWorkflowMetadata(metadata: Partial<WorkflowMetadata>): void {\n this.currentWorkflowMetadata = {\n ...this.currentWorkflowMetadata,\n ...metadata,\n };\n }\n\n // Create a new workflow\n createNewWorkflow(name: string, description?: string): void {\n // Reset the state\n this.workflowState.initializeWorkflow();\n\n // Set up new metadata\n this.updateWorkflowMetadata({\n id: '',\n code: '',\n name: name,\n description: description || `New workflow: ${name}`,\n isNew: true,\n });\n }\n\n // Update existing workflow\n async updateWorkflow(\n workflowName: string,\n description?: string\n ): Promise<Workflow[]> {\n // Update metadata\n this.updateWorkflowMetadata({\n name: workflowName,\n description: description || this.currentWorkflowMetadata.description,\n });\n\n // Save with updated metadata\n return this.saveWorkflow();\n }\n\n // Load all workflows\n async loadWorkflows(): Promise<Workflow[]> {\n try {\n const data = await this.service.getWorkflows(0, 0, 'createdAt', 'ASC');\n return data.Result;\n } catch (error) {\n console.error('Error loading workflows:', error);\n throw error;\n }\n }\n\n // Load forms\n async loadForms(): Promise<FormEntity[]> {\n try {\n const data = await this.service.getForms(0, 0, 'createdAt', 'ASC');\n return data.Result;\n } catch (error) {\n console.error('Error loading forms:', error);\n throw error;\n }\n }\n\n // Load tags\n async loadTags(): Promise<Tag[]> {\n try {\n const data = await this.service.getTags(0, 0, 'createdAt', 'ASC');\n return data.Result;\n } catch (error) {\n console.error('Error loading tags:', error);\n throw error;\n }\n }\n}\n","// services/node-precondition.service.ts\nimport { Injectable, signal, inject } from '@angular/core';\nimport { WorkflowObjectType, Position } from '../models/types';\nimport { WorkflowPersistenceService } from './wf-persistence.service';\nimport { FormEntity } from 'verben-workflow-ui/src/lib/models';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\n\nexport interface PreconditionData {\n type: 'form' | 'subflow' | 'swimlane' | 'decision';\n id?: string;\n name?: string;\n tags?: Tag[];\n condition?: string;\n}\n\nexport interface PendingNode {\n type: WorkflowObjectType;\n position: Position;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodePreconditionService {\n private persistence = inject(WorkflowPersistenceService);\n\n private preconditionRequired = new Set([\n 'form',\n 'subflow',\n 'swimlane',\n 'decision',\n ]);\n\n private pendingNodeSignal = signal<PendingNode | null>(null);\n readonly pendingNode = this.pendingNodeSignal.asReadonly();\n\n // Replace mock data signals with real data signals\n private formOptions = signal<PreconditionData[]>([]);\n private workflowOptions = signal<PreconditionData[]>([]);\n private tagOptions = signal<Tag[]>([]);\n\n // Add readonly accessors\n readonly forms = this.formOptions.asReadonly();\n readonly workflows = this.workflowOptions.asReadonly();\n readonly tags = this.tagOptions.asReadonly();\n\n // Add initialization method to load real data\n async initializeData(): Promise<void> {\n try {\n const [forms, workflows, tags] = await Promise.all([\n this.persistence.loadForms(),\n this.persistence.loadWorkflows(),\n this.persistence.loadTags(),\n ]);\n\n this.formOptions.set(\n forms.map((form) => ({\n type: 'form',\n id: form.Id,\n name: form.Name,\n }))\n );\n\n this.workflowOptions.set(\n workflows.map((workflow) => ({\n type: 'subflow',\n id: workflow.Id,\n name: workflow.Name,\n }))\n );\n\n this.tagOptions.set(tags);\n } catch (error) {\n console.error('Failed to load precondition data:', error);\n }\n }\n\n requiresPrecondition(type: WorkflowObjectType): boolean {\n return this.preconditionRequired.has(type);\n }\n\n setPendingNode(type: WorkflowObjectType, position: Position): void {\n this.pendingNodeSignal.set({ type, position });\n }\n\n clearPendingNode(): void {\n this.pendingNodeSignal.set(null);\n }\n\n async getItems(type: WorkflowObjectType): Promise<PreconditionData[]> {\n switch (type) {\n case 'form':\n return this.mapForms(await this.persistence.loadForms());\n case 'subflow':\n return this.mapWorkflows(await this.persistence.loadWorkflows());\n case 'swimlane':\n return this.mapTags(await this.persistence.loadTags());\n case 'decision':\n return this.getDecisionConditions();\n default:\n return [];\n }\n }\n\n private mapForms(forms: FormEntity[]): PreconditionData[] {\n return forms.map((form) => ({\n type: 'form',\n id: form.Id,\n name: form.Name,\n }));\n }\n\n private mapWorkflows(workflows: Workflow[]): PreconditionData[] {\n return workflows.map((workflow) => ({\n type: 'subflow',\n id: workflow.Id,\n name: workflow.Name,\n }));\n }\n\n private mapTags(tags: Tag[]): PreconditionData[] {\n return [\n {\n type: 'swimlane',\n tags: tags,\n },\n ];\n }\n\n private getDecisionConditions(): PreconditionData[] {\n return [\n {\n type: 'decision',\n condition: '', // Empty condition to be filled by user\n },\n ];\n }\n}\n","// Update imports\nimport { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DropDownModule, VerbenDialogueModule } from 'verben-ng-ui';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport {\n NodePreconditionService,\n PreconditionData,\n} from '../services/node-precondition.service';\n\n@Component({\n selector: 'wf-node-selector',\n standalone: true,\n imports: [CommonModule, VerbenDialogueModule, FormsModule, DropDownModule],\n template: `\n <verben-dialogue\n [isVisible]=\"!!preconditionService.pendingNode()\"\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'small'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'precondition-dialogue'\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n >\n </verben-dialogue>\n\n <ng-template #headerTemplate>\n <h3 class=\"text-lg font-semibold\">{{ getDialogTitle() }}</h3>\n </ng-template>\n\n <ng-template #bodyTemplate>\n <div class=\"p-6\">\n @switch (preconditionService.pendingNode()?.type) { @case ('swimlane') {\n <div class=\"space-y-4\">\n <verben-drop-down\n [multiselect]=\"true\"\n display=\"chip\"\n [required]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Tags\"\n optionLabel=\"Name\"\n styleClass=\"w-full\"\n [options]=\"preconditionService.tags()\"\n [(ngModel)]=\"selectedTags\"\n (onChange)=\"onTagSelectionChange($event)\"\n ></verben-drop-down>\n\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!selectedTags.length\"\n (click)=\"onTagsSubmit()\"\n >\n Apply Tags\n </button>\n </div>\n } @case ('decision') {\n <div class=\"space-y-4\">\n <div>\n <label class=\"block text-sm font-medium mb-2\">Condition</label>\n <textarea\n class=\"w-full p-2 border rounded-md\"\n rows=\"3\"\n [(ngModel)]=\"condition\"\n placeholder=\"Enter condition...\"\n ></textarea>\n </div>\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!condition\"\n (click)=\"onConditionSubmit()\"\n >\n Apply Condition\n </button>\n </div>\n } @case ('form') {\n <div class=\"space-y-4\">\n <verben-drop-down\n [required]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Form\"\n optionLabel=\"name\"\n optionValue=\"id\"\n styleClass=\"w-full\"\n [options]=\"preconditionService.forms()\"\n [(ngModel)]=\"selectedFormId\"\n (onChange)=\"onDropdownChange($event)\"\n ></verben-drop-down>\n\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!selectedFormId\"\n (click)=\"onFormSubmit()\"\n >\n Select Form\n </button>\n </div>\n } @default {\n <div class=\"space-y-4\">\n <verben-drop-down\n [required]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Workflow\"\n optionLabel=\"name\"\n optionValue=\"id\"\n styleClass=\"w-full\"\n [options]=\"preconditionService.workflows()\"\n [(ngModel)]=\"selectedWorkflowId\"\n (onChange)=\"onDropdownChange($event)\"\n ></verben-drop-down>\n\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!selectedWorkflowId\"\n (click)=\"onWorkflowSubmit()\"\n >\n Select Workflow\n </button>\n </div>\n } }\n </div>\n </ng-template>\n `,\n})\nexport class NodeSelectorComponent {\n // Replace existing properties with these\n protected selectedTags: Tag[] = [];\n protected selectedFormId: string = '';\n protected selectedWorkflowId: string = '';\n protected condition = '';\n protected preconditionService = inject(NodePreconditionService);\n\n @Output() select = new EventEmitter<PreconditionData>();\n\n // Methods for dropdown handling\n protected onTagSelectionChange(event: any): void {\n // Handle tag selection change if needed\n console.log('Tag selection changed:', this.selectedTags);\n }\n\n protected onDropdownChange(event: any): void {\n console.log('Dropdown selection changed:', event);\n }\n\n protected onFormSubmit(): void {\n const selectedForm = this.preconditionService\n .forms()\n .find((f) => f.id === this.selectedFormId);\n if (selectedForm) {\n this.select.emit(selectedForm);\n }\n }\n\n protected onWorkflowSubmit(): void {\n const selectedWorkflow = this.preconditionService\n .workflows()\n .find((w) => w.id === this.selectedWorkflowId);\n if (selectedWorkflow) {\n this.select.emit(selectedWorkflow);\n }\n }\n\n protected getDialogTitle(): string {\n const type = this.preconditionService.pendingNode()?.type;\n switch (type) {\n case 'form':\n return 'Select Form';\n case 'subflow':\n return 'Select Workflow';\n case 'swimlane':\n return 'Select Tags';\n case 'decision':\n return 'Set Condition';\n default:\n return 'Select';\n }\n }\n\n protected onTagsSubmit(): void {\n this.select.emit({\n type: 'swimlane',\n id: crypto.randomUUID(),\n name: 'Swimlane',\n tags: this.selectedTags,\n });\n }\n\n protected onConditionSubmit(): void {\n this.select.emit({\n type: 'decision',\n id: crypto.randomUUID(),\n name: 'Decision',\n condition: this.condition,\n });\n }\n\n protected onSelect(data: PreconditionData): void {\n this.select.emit(data);\n }\n\n onModalClose(event: any): void {\n this.preconditionService.clearPendingNode();\n }\n}\n","// services/viewport.service.ts\nimport { Injectable, ElementRef } from '@angular/core';\nimport { Position } from '../models/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ViewportService {\n getCanvasPoint(\n event: MouseEvent,\n canvasRef: ElementRef<SVGElement>\n ): Position {\n const rect = canvasRef.nativeElement.getBoundingClientRect();\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n }\n\n snapToGrid(position: Position, gridSize: number): Position {\n return {\n x: Math.round(position.x / gridSize) * gridSize,\n y: Math.round(position.y / gridSize) * gridSize,\n };\n }\n\n getObjectTransform(position: Position): string {\n return `translate(${position.x}, ${position.y})`;\n }\n}\n","// services/position-update.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, Action } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PositionUpdateService {\n private workflowState = inject(WorkflowStateService);\n private connection = inject(ConnectionService);\n\n updateNodeWithConnections(nodeId: string, newPosition: Position): void {\n // Update node position\n this.workflowState.updateObject(nodeId, { position: newPosition });\n\n // Update connected paths\n const connections = this.workflowState\n .connections()\n .filter((conn) => conn.fromId === nodeId || conn.toId === nodeId);\n\n const updates = this.getConnectionUpdates(nodeId, newPosition, connections);\n if (updates.length > 0) {\n this.workflowState.updateMultipleObjects(updates);\n }\n }\n\n private getConnectionUpdates(\n nodeId: string,\n newPosition: Position,\n connections: Action[]\n ): { id: string; changes: Partial<Action> }[] {\n return connections\n .map((conn) => {\n const sourceNode = this.workflowState.getObjectById(conn.fromId);\n const targetNode = this.workflowState.getObjectById(conn.toId);\n\n if (!sourceNode || !targetNode) return null;\n\n const points = this.connection.recalculateConnectionPoints(\n sourceNode,\n targetNode,\n conn.points\n );\n\n return {\n id: conn.id,\n changes: { points } as Partial<Action>,\n };\n })\n .filter(\n (update): update is NonNullable<typeof update> => update !== null\n );\n }\n}\n","// services/node-interaction.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { ViewportService } from './viewport.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { CanvasStateService } from './canvas-state.service';\nimport { PositionUpdateService } from './position-update.service';\nimport { NodeFinderService } from './node-finder.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeInteractionService {\n private viewport = inject(ViewportService);\n private workflowState = inject(WorkflowStateService);\n private canvasState = inject(CanvasStateService);\n private positionUpdate = inject(PositionUpdateService);\n private nodeFinder = inject(NodeFinderService);\n\n // Use nodeFinder instead of direct implementation\n findNodeAtPoint(point: Position): WorkflowObject | null {\n return this.nodeFinder.findNodeAtPoint(point);\n }\n\n private isPointInNode(point: Position, node: WorkflowObject): boolean {\n return (\n point.x >= node.position.x &&\n point.x <= node.position.x + node.size.width &&\n point.y >= node.position.y &&\n point.y <= node.position.y + node.size.height\n );\n }\n\n startDragging(node: WorkflowObject, point: Position): void {\n if (this.isProtectedNode(node)) return;\n\n this.canvasState.setDragging(true);\n this.canvasState.setDragStartPosition(point);\n this.workflowState.setSelectedObject(node.id);\n\n // Calculate offset from node position to click position\n this.canvasState.setDragOffset({\n x: point.x - node.position.x,\n y: point.y - node.position.y,\n });\n }\n\n handleDragging(currentPoint: Position, gridSize: number): void {\n const objectId = this.workflowState.selectedObjectId();\n\n if (!objectId) return;\n\n const selectedNode = this.workflowState.getObjectById(objectId);\n if (!selectedNode) return;\n\n const { dragOffset } = this.canvasState.canvasState();\n\n const newPosition = {\n x: currentPoint.x - dragOffset.x,\n y: currentPoint.y - dragOffset.y,\n };\n\n // Snap to grid\n const snappedPosition = this.viewport.snapToGrid(newPosition, gridSize);\n\n // Find nearest swimlane if applicable\n const nearestSwimlane = this.findNearestSwimlane(snappedPosition);\n if (nearestSwimlane) {\n snappedPosition.y =\n nearestSwimlane.position.y +\n (nearestSwimlane.size.height - selectedNode.size.height) / 2;\n }\n\n // Update node position\n this.workflowState.updateObject(selectedNode.id, {\n position: snappedPosition,\n });\n\n // Use the new service\n this.positionUpdate.updateNodeWithConnections(\n selectedNode.id,\n snappedPosition\n );\n }\n\n finalizeDragging(finalPoint: Position): void {\n const objectId = this.workflowState.selectedObjectId();\n\n if (!objectId) return;\n\n const selectedNode = this.workflowState.getObjectById(objectId);\n if (!selectedNode) return;\n\n // Perform any final position adjustments\n const boundedPosition = this.keepWithinBounds(\n selectedNode.position,\n this.canvasState.canvasState().width,\n this.canvasState.canvasState().height\n );\n\n if (boundedPosition !== selectedNode.position) {\n this.workflowState.updateObject(selectedNode.id, {\n position: boundedPosition,\n });\n }\n }\n\n private findNearestSwimlane(position: Position): WorkflowObject | null {\n const swimlanes = this.workflowState.swimlanes();\n for (const swimlane of swimlanes) {\n if (\n position.y >= swimlane.position.y &&\n position.y <= swimlane.position.y + swimlane.size.height\n ) {\n return swimlane;\n }\n }\n return null;\n }\n\n private keepWithinBounds(\n position: Position,\n width: number,\n height: number\n ): Position {\n return {\n x: Math.max(0, Math.min(position.x, width - 100)), // 100 is minimum node width\n y: Math.max(0, Math.min(position.y, height - 60)), // 60 is minimum node height\n };\n }\n\n private isProtectedNode(node: WorkflowObject): boolean {\n return ['start', 'swimlane'].includes(node.type);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { WorkflowObject } from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SwimlaneManagementService {\n private workflowState = inject(WorkflowStateService);\n private canvasState = inject(CanvasStateService);\n private readonly DEFAULT_SWIMLANE_HEIGHT = 260;\n\n createSwimlane(clickPosition: number): void {\n const swimlanes = this.workflowState.swimlanes();\n const canvasWidth = this.canvasState.canvasState().width;\n\n // Calculate the new swimlane's position\n const newPosition = this.calculateNewSwimlanePosition(\n clickPosition,\n swimlanes\n );\n\n const newSwimlane: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'swimlane',\n position: { x: 0, y: this.findNearestSwimlanePosition(clickPosition) },\n size: { width: canvasWidth - 40, height: this.DEFAULT_SWIMLANE_HEIGHT },\n label: `Swimlane ${swimlanes.length + 1}`,\n };\n\n this.workflowState.addObject(newSwimlane);\n this.reorderSwimlanes();\n }\n\n getVerticalCenterForSwimlane(swimlaneY: number): number {\n return swimlaneY + this.DEFAULT_SWIMLANE_HEIGHT / 2;\n }\n\n getSwimlaneHeight(): number {\n return this.DEFAULT_SWIMLANE_HEIGHT;\n }\n\n private calculateNewSwimlanePosition(\n clickY: number,\n swimlanes: WorkflowObject[]\n ): number {\n if (swimlanes.length === 0) return 0;\n\n // Sort swimlanes by vertical position\n const sortedSwimlanes = [...swimlanes].sort(\n (a, b) => a.position.y - b.position.y\n );\n\n // Find the appropriate insertion point based on click position\n for (let i = 0; i < sortedSwimlanes.length; i++) {\n const swimlane = sortedSwimlanes[i];\n if (clickY < swimlane.position.y + swimlane.size.height / 2) {\n return i * this.DEFAULT_SWIMLANE_HEIGHT;\n }\n }\n\n // If click is below all existing swimlanes, add to the end\n return sortedSwimlanes.length * this.DEFAULT_SWIMLANE_HEIGHT;\n }\n\n // reorderSwimlanes(): void {\n // const swimlanes = [...this.workflowState.swimlanes()].sort(\n // (a, b) => a.position.y - b.position.y\n // );\n\n // const updates = swimlanes.map((swimlane, index) => ({\n // id: swimlane.id,\n // changes: {\n // position: { x: 0, y: index * this.DEFAULT_SWIMLANE_HEIGHT },\n // size: { ...swimlane.size },\n // },\n // }));\n\n // this.workflowState.updateMultipleObjects(updates);\n // }\n\n reorderSwimlanes(): void {\n const swimlanes = [...this.workflowState.swimlanes()].sort(\n (a, b) => a.position.y - b.position.y\n );\n\n // Update positions and adjust contained nodes\n swimlanes.forEach((swimlane, index) => {\n const oldY = swimlane.position.y;\n const newY = index * this.DEFAULT_SWIMLANE_HEIGHT;\n\n // Update swimlane position\n this.workflowState.updateObject(swimlane.id, {\n position: { x: 0, y: newY },\n size: { ...swimlane.size, height: this.DEFAULT_SWIMLANE_HEIGHT },\n });\n\n // If position changed, adjust contained nodes\n if (oldY !== newY) {\n this.adjustNodesInSwimlane(swimlane.id, oldY, newY);\n }\n });\n }\n\n private adjustNodesInSwimlane(\n swimlaneId: string,\n oldY: number,\n newY: number\n ): void {\n const nodes = this.workflowState.nodes();\n const swimlane = this.workflowState.getObjectById(swimlaneId);\n if (!swimlane) return;\n\n nodes.forEach((node) => {\n if (this.isNodeInSwimlane(node, swimlane)) {\n const relativeY = node.position.y - oldY; // Position relative to old swimlane top\n const newNodeY = newY + relativeY; // Maintain relative position in new location\n\n this.workflowState.updateObject(node.id, {\n position: { ...node.position, y: newNodeY },\n });\n }\n });\n }\n\n private isNodeInSwimlane(\n node: WorkflowObject,\n swimlane: WorkflowObject\n ): boolean {\n return (\n node.position.y >= swimlane.position.y &&\n node.position.y <= swimlane.position.y + swimlane.size.height\n );\n }\n\n resizeSwimlanesForCanvas(canvasWidth: number): void {\n const swimlanes = this.workflowState.swimlanes();\n const updates = swimlanes.map((swimlane) => ({\n id: swimlane.id,\n changes: {\n size: { width: canvasWidth - 40, height: this.DEFAULT_SWIMLANE_HEIGHT },\n },\n }));\n\n this.workflowState.updateMultipleObjects(updates);\n }\n\n getTotalHeight(): number {\n const swimlanes = this.workflowState.swimlanes();\n return swimlanes.length * this.DEFAULT_SWIMLANE_HEIGHT;\n }\n\n swapSwimlanes(swimlane1Id: string, swimlane2Id: string): void {\n const swimlane1 = this.workflowState.getObjectById(swimlane1Id);\n const swimlane2 = this.workflowState.getObjectById(swimlane2Id);\n\n if (!swimlane1 || !swimlane2) return;\n\n const temp = swimlane1.position.y;\n this.workflowState.updateObject(swimlane1Id, {\n position: { ...swimlane1.position, y: swimlane2.position.y },\n });\n this.workflowState.updateObject(swimlane2Id, {\n position: { ...swimlane2.position, y: temp },\n });\n\n this.reorderSwimlanes();\n }\n\n findNearestSwimlanePosition(yPosition: number): number {\n const swimlanes = this.workflowState.swimlanes();\n if (swimlanes.length === 0) return 0;\n\n const sortedSwimlanes = [...swimlanes].sort(\n (a, b) => a.position.y - b.position.y\n );\n\n // Find the first swimlane that's below the given position\n for (let i = 0; i < sortedSwimlanes.length; i++) {\n if (sortedSwimlanes[i].position.y > yPosition) {\n return i * sortedSwimlanes[0].size.height;\n }\n }\n\n // If no swimlane is below, add to the end\n return sortedSwimlanes.length * sortedSwimlanes[0].size.height;\n }\n}\n","// services/workflow-facade.service.ts\nimport { Injectable, inject, ElementRef } from '@angular/core';\nimport {\n WorkflowObject,\n Position,\n Action,\n WorkflowObjectType,\n SubFlow,\n Form,\n Swimlane,\n Decision,\n} from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\nimport { ViewportService } from './viewport.service';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { ConnectionService } from './connection.service';\nimport { RenderingService } from './rendering.service';\nimport { NodeSelectionService } from './node-selection.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { SwimlaneManagementService } from './swimlane-management.service';\nimport { WorkflowPersistenceService } from './wf-persistence.service';\nimport { ConnectionSegmentInteractionService } from './connection-segment-interaction.service';\nimport {\n NodePreconditionService,\n PreconditionData,\n} from './node-precondition.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowFacadeService {\n private workflowState = inject(WorkflowStateService);\n private viewport = inject(ViewportService);\n private nodeInteraction = inject(NodeInteractionService);\n connection = inject(ConnectionService);\n rendering = inject(RenderingService);\n selection = inject(NodeSelectionService);\n private canvasStateService = inject(CanvasStateService);\n private swimlaneManagement = inject(SwimlaneManagementService);\n public persistence = inject(WorkflowPersistenceService);\n private segmentInteraction = inject(ConnectionSegmentInteractionService);\n public preconditionService = inject(NodePreconditionService);\n\n // Canvas State Accessors\n readonly canvasState = this.canvasStateService.canvasState;\n readonly workflowObjects = this.workflowState.objects;\n readonly selectedObjectId = this.workflowState.selectedObjectId;\n readonly selectedTool = this.workflowState.selectedTool;\n\n // Filtered Object Accessors\n readonly nodes = this.workflowState.nodes;\n readonly swimlanes = this.workflowState.swimlanes;\n readonly connections = this.workflowState.connections;\n\n // Rendering Methods\n getNodeStyle = this.rendering.getNodeStyle;\n getConnectionStyle = this.rendering.getConnectionStyle;\n getStartNodePaths = this.rendering.getStartNodePaths;\n getNodeTransforms = this.rendering.getNodeTransforms;\n getGridPattern = this.rendering.getGridPattern;\n\n // Connection methods\n getConnectionPath(points: Position[]): string {\n return this.rendering.getConnectionPath(points);\n }\n // Added these getter methods to expose connection service functionality\n getConnectionPreviewPath = () => this.connection.getPreviewPath();\n hasOutgoingConnections = (nodeId: string) =>\n this.connection.hasOutgoingConnections(nodeId);\n\n // Segment interaction methods\n handleSegmentMouseDown(\n event: MouseEvent,\n canvasRef: ElementRef<SVGElement>,\n connectionId: string,\n segmentIndex: number\n ): void {\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n this.segmentInteraction.startDragging(connectionId, segmentIndex, point);\n this.canvasStateService.setDragging(true);\n }\n\n getSegmentCursor(connectionId: string, segmentIndex: number): string {\n return this.segmentInteraction.getSegmentCursor(connectionId, segmentIndex);\n }\n\n // Mouse Event Handlers\n handleMouseDown(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n if (event.button !== 0) return;\n\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n const clickedNode = this.nodeInteraction.findNodeAtPoint(\n point\n // this.nodes()\n );\n\n if (this.selectedTool() === 'action' && clickedNode) {\n this.connection.startConnection(clickedNode, point);\n } else if (this.selectedTool()) {\n this.handleToolPlacement(point);\n } else if (clickedNode) {\n if (\n event.target instanceof Element &&\n event.target.classList.contains('properties-indicator')\n ) {\n // Handle properties click\n return;\n }\n this.nodeInteraction.startDragging(clickedNode, point);\n } else {\n this.selection.handleClickOutside(event);\n }\n }\n\n handleMouseMove(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n const { isConnecting, isDragging } = this.canvasState();\n\n if (isConnecting) {\n this.connection.updateConnectionPreview(point);\n } else if (isDragging) {\n // this.nodeInteraction.handleDragging(point, this.canvasState().gridSize);\n if (this.segmentInteraction.isDragging()) {\n this.segmentInteraction.updateDragging(point);\n } else {\n this.nodeInteraction.handleDragging(point, this.canvasState().gridSize);\n }\n }\n }\n\n handleMouseUp(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n const { isConnecting, isDragging } = this.canvasState();\n\n if (isConnecting) {\n this.connection.finalizeConnection(point);\n } else if (isDragging) {\n // this.nodeInteraction.finalizeDragging(point);\n if (this.segmentInteraction.isDragging()) {\n this.segmentInteraction.finishDragging();\n } else {\n this.nodeInteraction.finalizeDragging(point);\n }\n }\n\n this.canvasStateService.resetInteractionState();\n }\n\n handleMouseLeave(): void {\n this.canvasStateService.resetInteractionState();\n }\n\n // Tool and Object Management\n handleToolSelection(tool: WorkflowObjectType | null): void {\n this.workflowState.setSelectedTool(tool);\n this.selection.handleToolSelection(tool);\n }\n\n // private handleToolPlacement(point: Position): void {\n // console.log('Tool placement triggered', {\n // selectedTool: this.selectedTool(),\n // point,\n // });\n\n // if (this.selectedTool() === 'swimlane') {\n // this.swimlaneManagement.createSwimlane(point.y);\n // console.log(\n // 'Swimlane created, current swimlanes:',\n // this.workflowState.swimlanes()\n // );\n // this.workflowState.setSelectedTool(null);\n // return;\n // }\n\n // const newNode: WorkflowObject = {\n // id: crypto.randomUUID(),\n // type: this.selectedTool()!,\n // position: this.viewport.snapToGrid(point, this.canvasState().gridSize),\n // size: this.getDefaultSize(this.selectedTool()!),\n // label: `New ${this.selectedTool()}`,\n // };\n\n // this.workflowState.addObject(newNode);\n // this.workflowState.setSelectedTool(null);\n // }\n private handleToolPlacement(point: Position): void {\n if (!this.selectedTool()) return;\n\n const nodeType = this.selectedTool()!;\n\n // Check if precondition is required\n if (this.preconditionService.requiresPrecondition(nodeType)) {\n this.preconditionService.setPendingNode(nodeType, point);\n return; // Don't create node yet\n }\n\n // Create node immediately if no precondition required\n this.createNode(nodeType, point);\n }\n\n private createNode(\n type: WorkflowObjectType,\n position: Position,\n selectedData?: PreconditionData\n ): void {\n const baseNode = {\n id: crypto.randomUUID(),\n type: type,\n position: this.viewport.snapToGrid(position, this.canvasState().gridSize),\n size: this.getDefaultSize(type),\n };\n\n let nodeData;\n switch (type) {\n case 'form':\n case 'subflow':\n nodeData = {\n ...baseNode,\n label: selectedData?.name || `New ${type}`,\n referenceId: selectedData?.id,\n } as SubFlow | Form;\n break;\n\n case 'swimlane':\n nodeData = {\n ...baseNode,\n label: selectedData?.name || 'Swimlane',\n tags: selectedData?.tags || [],\n order: this.workflowState.swimlanes().length, // Add order based on current swimlane count\n } as Swimlane;\n break;\n\n case 'decision':\n nodeData = {\n ...baseNode,\n label: selectedData?.name || 'Decision',\n condition: selectedData?.condition || '',\n } as Decision;\n break;\n\n default:\n nodeData = {\n ...baseNode,\n label: `New ${type}`,\n };\n }\n\n this.workflowState.addObject(nodeData);\n this.workflowState.setSelectedTool(null);\n }\n\n // Call this when a form/subflow is selected\n finalizeNodeCreation(selectedData: PreconditionData): void {\n const pendingNode = this.preconditionService.pendingNode();\n if (!pendingNode) return;\n\n this.createNode(pendingNode.type, pendingNode.position, selectedData);\n\n this.preconditionService.clearPendingNode();\n }\n\n handleSwimlaneCreation(point: Position): void {\n const swimlaneManagement = inject(SwimlaneManagementService);\n swimlaneManagement.createSwimlane(point.y);\n }\n\n private getDefaultSize(type: WorkflowObjectType): {\n width: number;\n height: number;\n } {\n const sizes = {\n stage: { width: 120, height: 80 },\n action: { width: 40, height: 40 },\n form: { width: 75, height: 96 }, // Exact size from design SVG\n decision: { width: 100, height: 100 },\n subflow: { width: 120, height: 80 },\n swimlane: { width: 0, height: 0 }, // Handled separately\n start: { width: 58, height: 46 },\n };\n return sizes[type];\n }\n\n // Initialization\n initializeWorkflow(): void {\n this.workflowState.initializeWorkflow();\n }\n}\n","// components/workflow/canvas/wf-canvas.component.ts\nimport {\n Component,\n ViewChild,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n inject,\n HostListener,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkflowFacadeService } from '../services/wf-facade.service';\nimport { LabelEditorComponent } from './label-editor.component';\nimport { LabelManagementService } from '../services/label-management.service';\nimport { SwimlaneLabelComponent } from './swimlane-label.component';\nimport { SwimLanePopupComponent } from './swimlane-popup.component';\nimport { SwimlaneStatsService } from '../services/swimlane-stats.service';\nimport { Position } from '../models/types';\nimport { KeyboardHandlerService } from '../services/keyboard-handler.service';\nimport { NodeSelectorComponent } from './node-selector.component';\nimport {\n NodePreconditionService,\n PreconditionData,\n} from '../services/node-precondition.service';\n\n@Component({\n selector: 'wf-canvas',\n standalone: true,\n imports: [\n CommonModule,\n LabelEditorComponent,\n SwimlaneLabelComponent,\n SwimLanePopupComponent,\n NodeSelectorComponent,\n ],\n template: `\n <div\n class=\"canvas-container\"\n #container\n [class.connecting]=\"facade.canvasState().isConnecting\"\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave()\"\n >\n <svg\n #canvas\n [attr.width]=\"facade.canvasState().width\"\n [attr.height]=\"facade.canvasState().height\"\n >\n <!-- Grid Pattern -->\n <defs>\n <pattern\n id=\"grid\"\n [attr.width]=\"facade.canvasState().gridSize\"\n [attr.height]=\"facade.canvasState().gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n [attr.d]=\"facade.getGridPattern().path.d\"\n [ngStyle]=\"facade.getGridPattern().path.style\"\n />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Swimlanes -->\n @for (swimlane of facade.swimlanes(); track swimlane.id) {\n <g [attr.transform]=\"facade.getNodeTransforms(swimlane).node\">\n <rect\n [attr.width]=\"swimlane.size.width\"\n [attr.height]=\"swimlane.size.height\"\n [ngStyle]=\"facade.rendering.getSwimlaneStyle()\"\n />\n <!-- <text\n x=\"100\"\n y=\"20\"\n [ngStyle]=\"facade.rendering.getLabelStyle('swimlane')\"\n >\n {{ swimlane.label }}\n </text> -->\n <!-- <foreignObject\n [attr.x]=\"labelService.getLabelPosition(swimlane).x\"\n [attr.y]=\"labelService.getLabelPosition(swimlane).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible;\"\n >\n <wf-label-editor\n [label]=\"swimlane.label || 'New Swimlane'\"\n [x]=\"0\"\n [y]=\"0\"\n [isSwimlane]=\"true\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n />\n </foreignObject> -->\n\n <!-- <g\n wf-swimlane-label\n [label]=\"swimlane.label\"\n [count]=\"swimlaneStats.getNodeCount(swimlane.id)\"\n [x]=\"20\"\n [y]=\"swimlane.size.height - 20\"\n (addClick)=\"onSwimlaneAddClick($event, swimlane)\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n /> -->\n\n <g transform=\"translate(30, 20)\">\n <g\n wf-swimlane-label\n [label]=\"swimlane.label\"\n [count]=\"swimlaneStats.getNodeCount(swimlane.id)\"\n (addClick)=\"onSwimlaneAddClick($event, swimlane)\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n />\n </g>\n\n <!-- <foreignObject\n [attr.x]=\"50\"\n [attr.y]=\"20\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible;\"\n >\n <wf-label-editor\n [label]=\"swimlane.label || 'New Swimlane'\"\n [x]=\"0\"\n [y]=\"0\"\n [isSwimlane]=\"true\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n />\n </foreignObject> -->\n </g>\n }\n\n <!-- Connections with labels -->\n @for (connection of facade.connections(); track connection.id) {\n <g\n class=\"connection\"\n [class.selected]=\"facade.selection.isSelected(connection.id)\"\n >\n <!-- <path\n [attr.d]=\"facade.getConnectionPath(connection.points)\"\n [ngStyle]=\"\n facade.getConnectionStyle(\n facade.selection.isSelected(connection.id)\n )\n \"\n /> -->\n <!-- Complete connection path with arrowhead -->\n <path\n [attr.d]=\"facade.getConnectionPath(connection.points)\"\n [ngStyle]=\"\n facade.getConnectionStyle(\n facade.selection.isSelected(connection.id)\n )\n \"\n />\n <!-- Render segments -->\n @for (point of connection.points; let i = $index; track i) { @if (i <\n connection.points.length - 1) {\n <!-- Interactive segment -->\n <!-- <path\n [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n [ngStyle]=\"\n facade.getConnectionStyle(\n facade.selection.isSelected(connection.id)\n )\n \"\n [style.cursor]=\"facade.getSegmentCursor(connection.id, i)\"\n (mousedown)=\"onSegmentMouseDown($event, connection.id, i)\"\n class=\"connection-segment\"\n /> -->\n <g\n class=\"segment-group\"\n (mouseenter)=\"\n hoveredSegment = { connectionId: connection.id, index: i }\n \"\n (mouseleave)=\"hoveredSegment = null\"\n >\n <!-- Hit detection area -->\n <path\n [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n class=\"segment-hitarea\"\n [style.cursor]=\"facade.getSegmentCursor(connection.id, i)\"\n (mousedown)=\"onSegmentMouseDown($event, connection.id, i)\"\n />\n\n <!-- Visible segment -->\n <path\n [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n [ngStyle]=\"\n facade.rendering.getConnectionSegmentStyle(\n facade.selection.isSelected(connection.id),\n isSegmentHovered(connection.id, i)\n )\n \"\n />\n </g>\n } }\n <!-- Connection Label -->\n @if (connection.fromId && connection.toId) {\n <foreignObject\n [attr.x]=\"labelService.getLabelPosition(connection).x\"\n [attr.y]=\"labelService.getLabelPosition(connection).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible; pointer-events: all;\"\n [attr.transform]=\"'translate(-10, -10)'\"\n >\n <wf-label-editor\n [label]=\"connection.label || 'New Action'\"\n [x]=\"0\"\n [y]=\"0\"\n [isConnection]=\"true\"\n (labelChange)=\"updateLabel(connection.id, $event)\"\n />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Nodes -->\n @for (node of facade.nodes(); track node.id) {\n <g\n [attr.transform]=\"facade.getNodeTransforms(node).node\"\n [class.selected]=\"facade.selection.isSelected(node.id)\"\n [class.dragging]=\"\n facade.canvasState().isDragging &&\n facade.selection.isSelected(node.id)\n \"\n >\n @switch (node.type) { @case ('start') {\n <path\n [attr.d]=\"facade.getStartNodePaths().circle\"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n @if (!facade.hasOutgoingConnections(node.id)) {\n <path\n [attr.d]=\"facade.getStartNodePaths().arrow\"\n [attr.transform]=\"facade.getNodeTransforms(node).arrow\"\n fill=\"#D36CFF\"\n />\n } }@case ('form') {\n <path\n [attr.d]=\"facade.rendering.generateNodePath(node)\"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } @case ('decision') {\n <path\n [attr.d]=\"\n facade.rendering.getDecisionPath(\n node.size.width,\n node.size.height\n )\n \"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } @case ('subflow') {\n <path\n [attr.d]=\"\n facade.rendering.getSubflowPath(node.size.width, node.size.height)\n \"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } @default {\n <rect\n [attr.width]=\"node.size.width\"\n [attr.height]=\"node.size.height\"\n [attr.rx]=\"4\"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } }\n\n <!-- Node label -->\n <!-- <text\n [attr.x]=\"node.size.width / 2\"\n [attr.y]=\"node.size.height / 2\"\n [ngStyle]=\"facade.rendering.getLabelStyle(node.type)\"\n >\n {{ node.label }}\n </text> -->\n <foreignObject\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.width]=\"node.size.width\"\n [attr.height]=\"node.size.height\"\n style=\"overflow: visible;\"\n >\n <wf-label-editor\n [label]=\"node.label\"\n [x]=\"labelService.getSVGTextPosition(node).x\"\n [y]=\"labelService.getSVGTextPosition(node).y\"\n (labelChange)=\"updateLabel(node.id, $event)\"\n />\n </foreignObject>\n </g>\n }\n\n <!-- Connection preview with arrowhead -->\n @if (facade.canvasState().connectionPreview) {\n <path\n [attr.d]=\"facade.getConnectionPreviewPath()\"\n [ngStyle]=\"facade.rendering.getConnectionPreviewStyle()\"\n />\n }\n </svg>\n\n @if (swimlaneStats.popupStatus().isOpen) {\n <wf-swimlane-popup\n [position]=\"swimlaneStats.popupStatus().position\"\n (close)=\"swimlaneStats.closePopup()\"\n (actionSelected)=\"onPopupAction($event)\"\n />\n }\n </div>\n\n <wf-node-selector\n (select)=\"onNodeSelected($event)\"\n (cancel)=\"onNodeSelectionCancelled()\"\n />\n `,\n styles: [\n `\n .canvas-container {\n flex: 1;\n overflow: auto;\n position: relative;\n background: white;\n\n &.connecting {\n cursor: crosshair;\n }\n }\n\n .connection {\n path {\n stroke: #d36cff;\n stroke-width: 2;\n fill: none;\n pointer-events: none;\n }\n\n &.selected path {\n stroke-width: 3;\n }\n }\n\n .selected {\n & :not(text) {\n stroke-width: 3;\n }\n }\n\n .dragging {\n cursor: grabbing;\n }\n\n .connection {\n pointer-events: none;\n }\n\n .segment-group {\n pointer-events: all;\n }\n\n .segment-hitarea {\n stroke: transparent;\n stroke-width: 10;\n fill: none;\n }\n `,\n ],\n})\nexport class WFCanvasComponent {\n @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('canvas') canvasRef!: ElementRef<SVGElement>;\n\n protected labelService = inject(LabelManagementService);\n protected swimlaneStats = inject(SwimlaneStatsService);\n private keyboardHandler = inject(KeyboardHandlerService);\n protected preconditionService = inject(NodePreconditionService);\n\n hoveredSegment: { connectionId: string; index: number } | null = null;\n\n constructor(public facade: WorkflowFacadeService) {}\n\n @HostListener('window:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n // Only handle keyboard events if the canvas is focused\n if (this.containerRef.nativeElement.contains(document.activeElement)) {\n this.keyboardHandler.handleKeyDown(event);\n }\n }\n\n // Add click handler to ensure the canvas can receive keyboard events\n @HostListener('click')\n onClick(): void {\n this.containerRef.nativeElement.focus();\n }\n\n updateLabel(objectId: string, newLabel: string): void {\n this.labelService.updateLabel(objectId, newLabel);\n }\n\n // Event handlers\n onMouseDown(event: MouseEvent): void {\n this.facade.handleMouseDown(event, this.canvasRef);\n }\n\n onMouseMove(event: MouseEvent): void {\n this.facade.handleMouseMove(event, this.canvasRef);\n }\n\n onMouseUp(event: MouseEvent): void {\n this.facade.handleMouseUp(event, this.canvasRef);\n }\n\n onMouseLeave(): void {\n this.facade.handleMouseLeave();\n }\n\n onSwimlaneAddClick(event: MouseEvent, swimlane: any): void {\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n const position: Position = {\n x: event.clientX - rect.left + 20,\n y: event.clientY - rect.top,\n };\n\n this.swimlaneStats.openPopup(position, swimlane.id);\n }\n\n onPopupAction(actionId: string): void {\n const swimlaneId = this.swimlaneStats.popupStatus().swimlaneId;\n if (!swimlaneId) return;\n\n switch (actionId) {\n case 'add-above':\n // Handle adding swimlane above\n break;\n case 'add-below':\n // Handle adding swimlane below\n break;\n case 'delete':\n // Handle deletion\n break;\n }\n }\n\n getSegmentPath(start: Position, end: Position): string {\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n }\n\n isSegmentHovered(connectionId: string, index: number): boolean {\n return (\n this.hoveredSegment?.connectionId === connectionId &&\n this.hoveredSegment?.index === index\n );\n }\n\n onSegmentMouseDown(\n event: MouseEvent,\n connectionId: string,\n segmentIndex: number\n ): void {\n event.stopPropagation();\n this.facade.handleSegmentMouseDown(\n event,\n this.canvasRef,\n connectionId,\n segmentIndex\n );\n }\n\n onNodeSelected(data: PreconditionData): void {\n this.facade.finalizeNodeCreation(data);\n }\n\n onNodeSelectionCancelled(): void {\n this.facade.preconditionService.clearPendingNode();\n }\n}\n","// components/workflow/wf-designer.component.ts\nimport {\n Component,\n inject,\n input,\n OnInit,\n computed,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WFToolbarComponent } from './wf-toolbar.component';\nimport { WFCanvasComponent } from './wf-canvas.component';\nimport { WorkflowFacadeService } from '../services/wf-facade.service';\nimport { WorkflowObjectType } from '../models/types';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService } from 'verben-workflow-ui/src/lib/services';\nimport { NodeSelectorComponent } from './node-selector.component';\nimport { PreconditionData } from '../services/node-precondition.service';\n\n@Component({\n selector: 'wf-designer',\n standalone: true,\n imports: [\n CommonModule,\n WFToolbarComponent,\n WFCanvasComponent,\n NodeSelectorComponent,\n ],\n providers: [EnvironmentService],\n template: `\n <div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1 class=\"workflow-title\">{{ workflowName() }}</h1>\n <p *ngIf=\"workflowDescription()\" class=\"workflow-description\">\n {{ workflowDescription() }}\n </p>\n </div>\n\n <wf-toolbar\n [selectedTool]=\"facade.selectedTool()\"\n (toolSelected)=\"handleToolSelection($event)\"\n />\n\n <wf-canvas />\n\n <div class=\"workflow-actions\">\n <button\n class=\"save-button\"\n (click)=\"handleSave()\"\n [disabled]=\"isSaving()\"\n >\n {{ isSaving() ? 'Saving...' : 'Save' }}\n </button>\n </div>\n\n <!-- Node selector dialog for forms, subflows, etc. -->\n <wf-node-selector\n (select)=\"handleNodeSelection($event)\"\n (cancel)=\"handleNodeSelectionCancel()\"\n />\n </div>\n `,\n styles: [\n `\n .workflow-designer {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: white;\n }\n\n .workflow-header {\n padding: 1rem;\n border-bottom: 1px solid #e5e7eb;\n }\n\n .workflow-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: #111827;\n }\n\n .workflow-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin-top: 0.25rem;\n }\n\n .workflow-actions {\n padding: 0.75rem;\n border-top: 1px solid #e5e7eb;\n display: flex;\n justify-content: flex-end;\n }\n\n .save-button {\n padding: 0.5rem 1rem;\n background-color: #9333ea;\n color: white;\n font-weight: 500;\n border-radius: 0.375rem;\n border: none;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .save-button:hover {\n background-color: #7e22ce;\n }\n\n .save-button:disabled {\n background-color: #d8b4fe;\n cursor: not-allowed;\n }\n `,\n ],\n})\nexport class WFDesignerComponent implements OnInit {\n workflowId = input.required<Workflow['Code']>();\n\n public facade = inject(WorkflowFacadeService);\n private saving = signal<boolean>(false);\n\n // Computed signals for reactive UI\n readonly workflowName = computed(\n () => this.facade.persistence.workflowMetadata.name || 'Untitled Workflow'\n );\n\n readonly workflowDescription = computed(\n () => this.facade.persistence.workflowMetadata.description || ''\n );\n\n readonly isSaving = this.saving.asReadonly();\n\n constructor() {\n this.facade.initializeWorkflow();\n }\n\n ngOnInit(): void {\n const workflowId = this.workflowId();\n if (workflowId) {\n this.loadWorkflow(workflowId);\n }\n }\n\n private loadWorkflow(workflowId: string): void {\n this.facade.persistence.loadWorkflow(workflowId).catch((error) => {\n console.error('Failed to load workflow:', error);\n // Optionally show an error notification here\n });\n }\n\n handleToolSelection(tool: WorkflowObjectType | null): void {\n this.facade.handleToolSelection(tool);\n }\n\n handleSave(): void {\n if (this.isSaving()) return;\n\n this.saving.set(true);\n\n this.facade.persistence\n .saveWorkflow()\n .then((results) => {\n console.log('Workflow saved successfully:', results);\n // Optionally show a success notification\n })\n .catch((error) => {\n console.error('Error saving workflow:', error);\n // Optionally show an error notification\n })\n .finally(() => {\n this.saving.set(false);\n });\n }\n\n handleNodeSelection(data: PreconditionData): void {\n this.facade.finalizeNodeCreation(data);\n }\n\n handleNodeSelectionCancel(): void {\n // The node selection was canceled, clear the pending node\n this.facade.preconditionService.clearPendingNode();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ConnectionService","i1","i1.WorkflowFacadeService"],"mappings":"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"}
1
+ {"version":3,"file":"verben-workflow-ui-src-lib-components-designer.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-toolbar.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/label-editor.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-state.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/label-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/swimlane-label.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/swimlane-popup.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/swimlane-stats.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/canvas-state.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-finder.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-selection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/keyboard-handler.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/rendering.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/orthogonal-router.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/connection-segment-interaction.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/connection.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-mapper.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-persistence.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-precondition.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/node-selector.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/viewport.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/position-update.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/node-interaction.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/swimlane-management.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/services/wf-facade.service.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-canvas.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/components/wf-designer.component.ts","../../../projects/verben-workflow-ui/src/lib/components/designer/verben-workflow-ui-src-lib-components-designer.ts"],"sourcesContent":["// components/workflow/toolbar/wf-toolbar.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkflowObjectType } from '../models/types';\n\ninterface ToolbarItem {\n id: WorkflowObjectType;\n label: string;\n icon: string;\n}\n\n@Component({\n selector: 'wf-toolbar',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"toolbar\">\n @for (item of toolbarItems; track item.id) {\n <button\n class=\"tool-button\"\n [class.active]=\"selectedTool === item.id\"\n (click)=\"onToolSelect(item.id)\"\n >\n <img [src]=\"item.icon\" [alt]=\"item.label\" class=\"tool-icon\" />\n </button>\n }\n </div>\n `,\n styles: [\n `\n .toolbar {\n display: flex;\n padding: 0.5rem;\n gap: 0.5rem;\n background: white;\n border: 1px solid #aa00ff;\n border-radius: 7px;\n box-shadow: 4px 4px 4px 3px #00000040;\n }\n\n .tool-button {\n display: flex;\n align-items: center;\n justify-content: center;\n border: 1px solid #e5e7eb;\n border-radius: 0.375rem;\n background: white;\n cursor: pointer;\n transition: all 0.2s;\n\n &:hover {\n background: #f9fafb;\n }\n\n &.active {\n background: #f3e8ff;\n border-color: #d8b4fe;\n }\n }\n\n .tool-icon {\n }\n `,\n ],\n})\nexport class WFToolbarComponent {\n @Input() selectedTool: WorkflowObjectType | null = null;\n @Output() toolSelected = new EventEmitter<WorkflowObjectType | null>();\n\n toolbarItems: ToolbarItem[] = [\n { id: 'swimlane', label: 'Swimlane', icon: 'icons/swimlane.svg' },\n { id: 'stage', label: 'Stage', icon: 'icons/stage.svg' },\n { id: 'action', label: 'Action', icon: 'icons/action.svg' },\n { id: 'form', label: 'Form', icon: 'icons/form.svg' },\n // { id: 'decision', label: 'Decision', icon: 'icons/decision.svg' },\n { id: 'decision', label: 'Decision', icon: 'icons/stage.svg' },\n { id: 'subflow', label: 'Subflow', icon: 'icons/subflow.svg' },\n ];\n\n onToolSelect(toolId: WorkflowObjectType): void {\n // If same tool is selected, deselect it\n this.toolSelected.emit(this.selectedTool === toolId ? null : toolId);\n }\n}\n","// components/label-editor.component.ts\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n Output,\n ViewChild,\n} from '@angular/core';\n\n@Component({\n selector: 'wf-label-editor',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div\n class=\"label-container\"\n [class.editing]=\"isEditing\"\n [class.swimlane-label]=\"isSwimlane\"\n >\n @if (isEditing) {\n <input\n #labelInput\n type=\"text\"\n [value]=\"label\"\n (blur)=\"finishEditing()\"\n (keyup.enter)=\"finishEditing()\"\n (keyup.escape)=\"cancelEditing()\"\n class=\"label-input\"\n [class.swimlane-input]=\"isSwimlane\"\n [style.width.px]=\"Math.max(100, label.length * 8)\"\n />\n } @else {\n <span\n (dblclick)=\"startEditing()\"\n class=\"label-text\"\n [class.connection-label]=\"isConnection\"\n [class.swimlane-text]=\"isSwimlane\"\n >\n {{ label }}\n <svg (click)=\"openDialog.emit($event)\" class=\"edit-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8.78934 3.19845L11.8027 6.21184M12.1148 2.0038L12.9974 2.8864C13.5858 3.47481 13.5858 4.42879 12.9974 5.01719L4.26925 13.7453H1.25586V10.7319L9.98399 2.0038C10.5724 1.4154 11.5264 1.4154 12.1148 2.0038Z\" stroke=\"#3479E9\" stroke-linecap=\"square\"/>\n </svg>\n </span>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .label-container {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 50px;\n z-index: 1000;\n }\n\n .label-container.editing {\n background: white;\n padding: 2px;\n border-radius: 4px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n .label-input {\n padding: 2px 4px;\n border: 1px solid #d36cff;\n border-radius: 2px;\n font-size: 12px;\n font-family: inherit;\n outline: none;\n\n &.swimlane-input {\n font-size: 14px;\n font-weight: 500;\n min-width: 150px;\n }\n }\n\n .label-text {\n cursor: text;\n user-select: none;\n font-size: 12px;\n pointer-events: all;\n display: inline-block;\n min-width: 20px;\n min-height: 14px;\n position: relative;\n }\n\n .connection-label {\n background: white;\n padding: 2px 4px;\n border: 1px solid #e5e7eb;\n border-radius: 2px;\n }\n\n .swimlane-text {\n font-size: 14px;\n font-weight: 500;\n color: #64748b;\n }\n\n .swimlane-label {\n position: absolute;\n left: 20px;\n }\n\n .edit-icon {\n position: absolute;\n right: -14px;\n top: -14px;\n cursor: pointer;\n }\n `,\n ],\n})\nexport class LabelEditorComponent {\n @Input() label = '';\n @Input() x = 0;\n @Input() y = 0;\n @Input() isConnection = false;\n @Input() isSwimlane = false;\n @Output() labelChange = new EventEmitter<string>();\n @Output() openDialog = new EventEmitter();\n\n @ViewChild('labelInput') labelInput!: ElementRef<HTMLInputElement>;\n\n isEditing = false;\n protected readonly Math = Math;\n\n getEditorPosition(): string {\n // const offsetX = this.isConnection ? -25 : -25; // Center the label\n // const offsetY = -10; // Slight upward offset to center vertically\n\n const offsetX = this.isConnection ? 0 : 0; // Center the label\n const offsetY = 0; // Slight upward offset to center vertically\n\n // return `translate(${this.x + offsetX}px, ${this.y + offsetY}px)`;\n return `translate(50%, 50%)`;\n }\n\n getLabelStyle(): any {\n if (this.isEditing) return {};\n\n return {\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n 'pointer-events': 'all',\n };\n }\n\n startEditing(): void {\n this.isEditing = true;\n setTimeout(() => {\n if (this.labelInput) {\n this.labelInput.nativeElement.focus();\n this.labelInput.nativeElement.select();\n }\n });\n }\n\n finishEditing(): void {\n if (this.isEditing) {\n const newValue = this.labelInput.nativeElement.value.trim();\n if (newValue && newValue !== this.label) {\n this.labelChange.emit(newValue);\n }\n this.isEditing = false;\n }\n }\n\n cancelEditing(): void {\n this.isEditing = false;\n }\n\n @HostListener('document:keydown.escape')\n onEscapePress(): void {\n this.cancelEditing();\n }\n}\n","// services/wf-state.service.ts\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport {\n WorkflowObject,\n Position,\n WorkflowObjectType,\n Action,\n} from '../models/types';\nimport { SwimlaneManagementService } from './swimlane-management.service';\n\ninterface WorkflowState {\n objects: WorkflowObject[];\n selectedObjectId: string | null;\n selectedTool: WorkflowObjectType | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowStateService {\n state = signal<WorkflowState>({\n objects: [],\n selectedObjectId: null,\n selectedTool: null,\n });\n\n // Computed signals for better reactivity\n readonly objects = computed(() => this.state().objects);\n readonly selectedObjectId = computed(() => this.state().selectedObjectId);\n readonly selectedTool = computed(() => this.state().selectedTool);\n // private swimlaneManagement = inject(SwimlaneManagementService);\n\n // Computed signals for filtered objects\n readonly nodes = computed(() =>\n this.objects().filter(\n (obj) => obj.type !== 'swimlane' && obj.type !== 'action'\n )\n );\n\n readonly swimlanes = computed(() =>\n this.objects().filter((obj) => obj.type === 'swimlane')\n );\n\n readonly connections = computed(\n () => this.objects().filter((obj) => obj.type === 'action') as Action[]\n );\n\n addObject(object: WorkflowObject): void {\n this.state.update((state) => ({\n ...state,\n objects: [...state.objects, object],\n }));\n }\n\n updateObject(id: string, changes: Partial<WorkflowObject>): void {\n this.state.update((state) => ({\n ...state,\n objects: state.objects.map((obj) =>\n obj.id === id ? { ...obj, ...changes } : obj\n ),\n }));\n }\n\n updateMultipleObjects(\n updates: { id: string; changes: Partial<WorkflowObject> }[]\n ): void {\n this.state.update((state) => ({\n ...state,\n objects: state.objects.map((obj) => {\n const update = updates.find((u) => u.id === obj.id);\n return update ? { ...obj, ...update.changes } : obj;\n }),\n }));\n }\n\n removeObject(id: string): void {\n this.state.update((state) => ({\n ...state,\n objects: state.objects.filter((obj) => obj.id !== id),\n }));\n }\n\n setSelectedTool(tool: WorkflowObjectType | null): void {\n this.state.update((state) => ({ ...state, selectedTool: tool }));\n }\n\n setSelectedObject(id: string | null): void {\n this.state.update((state) => ({ ...state, selectedObjectId: id }));\n }\n\n getObjectById(id: string): WorkflowObject | undefined {\n return this.objects().find((obj) => obj.id === id);\n }\n\n // Initialize workflow with default objects\n initializeWorkflow(): void {\n const swimlaneHeight = 260;\n\n const swimlane: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'swimlane',\n position: { x: 0, y: 0 },\n size: { width: 3000 - 40, height: swimlaneHeight },\n label: 'Default Swimlane',\n };\n\n // Position start node vertically centered in the swimlane\n const startNodeHeight = 46; // Height of start node\n const startY = (swimlaneHeight - startNodeHeight) / 2;\n const startNode: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'start',\n position: { x: 50, y: startY },\n size: { width: 58, height: startNodeHeight },\n label: 'Start',\n };\n\n const initialConnection: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'action',\n position: startNode.position,\n size: { width: 0, height: 0 },\n label: '',\n fromId: startNode.id,\n toId: '',\n points: [\n {\n x: startNode.position.x + startNode.size.width,\n y: startNode.position.y + startNode.size.height / 2,\n },\n {\n x: startNode.position.x + startNode.size.width + 50,\n y: startNode.position.y + startNode.size.height / 2,\n },\n ],\n } as WorkflowObject;\n\n this.state.set({\n ...this.state(),\n objects: [swimlane, startNode, initialConnection],\n });\n }\n}\n","// services/label-management.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { Position, WorkflowObject, Action } from '../models/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LabelManagementService {\n private workflowState = inject(WorkflowStateService);\n\n updateLabel(objectId: string, newLabel: string): void {\n this.workflowState.updateObject(objectId, { label: newLabel });\n }\n\n getLabelPosition(object: WorkflowObject): Position {\n if (object.type === 'action') {\n return this.getConnectionLabelPosition(object as Action);\n }\n\n // // // For regular nodes, use SVG coordinates\n // if (object.type === 'swimlane') {\n // return {\n // x: 100, // Fixed position for swimlane labels\n // y: object.position.y + 20,\n // };\n // }\n\n // For regular nodes, use SVG coordinates\n // For swimlanes, position label at the left side\n if (object.type === 'swimlane') {\n return {\n x: object.position.x + 20, // Small indent from left edge\n y: object.position.y + object.size.height / 2, // Vertically centered\n };\n }\n\n return {\n x: object.position.x + object.size.width / 2,\n y: object.position.y + object.size.height / 2,\n };\n }\n\n private getConnectionLabelPosition(connection: Action): Position {\n if (!connection.points || connection.points.length < 2) {\n return { x: 0, y: 0 };\n }\n\n // Find the middle point of the connection\n const midIndex = Math.floor(connection.points.length / 2);\n const point1 = connection.points[midIndex - 1];\n const point2 = connection.points[midIndex];\n\n return {\n x: (point1.x + point2.x) / 2,\n y: (point1.y + point2.y) / 2 - 10, // Offset above the line\n };\n }\n\n getSVGTextPosition(object: WorkflowObject): { x: number; y: number } {\n // Center the label for all node types\n const centerX = object.size.width / 2;\n let centerY = object.size.height / 2;\n\n // Adjust position for form type\n if (object.type === 'form') {\n centerY = object.size.height + 20; // Position below the form\n }\n\n return { x: centerX, y: centerY };\n }\n}\n","// components/workflow/swimlane-label.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LabelEditorComponent } from './label-editor.component';\n\n@Component({\n selector: '[wf-swimlane-label]',\n standalone: true,\n imports: [CommonModule, LabelEditorComponent],\n template: `\n <svg:g>\n <!-- Plus icon at top -->\n <svg:g\n transform=\"translate(0, 20)\"\n class=\"cursor-pointer\"\n (click)=\"onAddClick($event)\"\n >\n <svg:circle r=\"10\" fill=\"white\" stroke=\"#D8B4FE\" stroke-width=\"1\" />\n <svg:path\n d=\"M-6 0h12 M0 -6v12\"\n stroke=\"#9333EA\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg:g>\n\n <!-- Label in middle with edit support -->\n <svg:g transform=\"translate(0, 120)\">\n <svg:foreignObject\n x=\"-60\"\n y=\"-12\"\n width=\"180\"\n height=\"24\"\n transform=\"rotate(-90)\"\n >\n <xhtml:div\n xmlns=\"http://www.w3.org/1999/xhtml\"\n style=\"width: 100%; height: 100%;\"\n >\n <wf-label-editor\n [label]=\"label\"\n [x]=\"0\"\n [y]=\"0\"\n (labelChange)=\"onLabelChange($event)\"\n />\n </xhtml:div>\n </svg:foreignObject>\n </svg:g>\n\n <!-- Count badge at bottom -->\n <svg:g transform=\"translate(0, 200)\">\n <svg:rect\n x=\"-15\"\n y=\"-10\"\n width=\"20\"\n height=\"20\"\n rx=\"20\"\n fill=\"#F3E8FF\"\n stroke=\"#D8B4FE\"\n />\n <svg:text\n x=\"0\"\n y=\"4\"\n text-anchor=\"middle\"\n font-size=\"12\"\n fill=\"#7E22CE\"\n font-weight=\"500\"\n transform=\"rotate(-90)\"\n >\n {{ count }}\n </svg:text>\n </svg:g>\n </svg:g>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n circle:hover {\n fill: #f3e8ff;\n }\n `,\n ],\n})\nexport class SwimlaneLabelComponent {\n @Input() label = '';\n @Input() count = 0;\n\n @Output() addClick = new EventEmitter<MouseEvent>();\n @Output() labelChange = new EventEmitter<string>();\n\n onAddClick(event: MouseEvent): void {\n event.stopPropagation();\n this.addClick.emit(event);\n }\n\n onLabelChange(newLabel: string): void {\n this.labelChange.emit(newLabel);\n }\n}\n","// components/workflow/swimlane-popup.component.ts\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Position } from '../models/types';\n\n@Component({\n selector: 'wf-swimlane-popup',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div \n class=\"fixed bg-white rounded-lg shadow-lg border border-slate-200 p-4 min-w-[200px]\"\n [style.left.px]=\"position.x\"\n [style.top.px]=\"position.y\"\n >\n <div class=\"flex justify-between items-center mb-4\">\n <h3 class=\"text-sm font-medium text-slate-900\">Swimlane Actions</h3>\n <button \n class=\"text-slate-400 hover:text-slate-600\"\n (click)=\"close.emit()\"\n >×</button>\n </div>\n\n <div class=\"space-y-2\">\n <button \n *ngFor=\"let action of actions\"\n class=\"w-full text-left px-3 py-2 text-sm text-slate-700 hover:bg-purple-50 rounded-md\"\n (click)=\"onActionClick(action)\"\n >\n {{ action.label }}\n </button>\n </div>\n </div>\n `\n})\nexport class SwimLanePopupComponent {\n @Input() position!: Position;\n @Output() close = new EventEmitter<void>();\n @Output() actionSelected = new EventEmitter<string>();\n\n actions = [\n { id: 'add-above', label: 'Add Swimlane Above' },\n { id: 'add-below', label: 'Add Swimlane Below' },\n { id: 'delete', label: 'Delete Swimlane' },\n ];\n\n onActionClick(action: { id: string, label: string }): void {\n this.actionSelected.emit(action.id);\n this.close.emit();\n }\n}","// services/swimlane-stats.service.ts\nimport { Injectable, inject, signal } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\n\ninterface SwimlanePopupState {\n isOpen: boolean;\n position: Position;\n swimlaneId: string | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SwimlaneStatsService {\n private workflowState = inject(WorkflowStateService);\n\n private popupState = signal<SwimlanePopupState>({\n isOpen: false,\n position: { x: 0, y: 0 },\n swimlaneId: null,\n });\n\n readonly popupStatus = this.popupState.asReadonly();\n\n getNodeCount(swimlaneId: string): number {\n const nodes = this.workflowState.nodes();\n return nodes.filter((node) => this.isNodeInSwimlane(node, swimlaneId))\n .length;\n }\n\n private isNodeInSwimlane(node: WorkflowObject, swimlaneId: string): boolean {\n const swimlane = this.workflowState.getObjectById(swimlaneId);\n if (!swimlane) return false;\n\n return (\n node.position.y >= swimlane.position.y &&\n node.position.y <= swimlane.position.y + swimlane.size.height\n );\n }\n\n openPopup(position: Position, swimlaneId: string): void {\n this.popupState.set({\n isOpen: true,\n position,\n swimlaneId,\n });\n }\n\n closePopup(): void {\n this.popupState.update((state) => ({ ...state, isOpen: false }));\n }\n}\n","// services/canvas-state.service.ts\nimport { Injectable, signal } from '@angular/core';\nimport { Position } from '../models/types';\n\nexport interface CanvasState {\n width: number;\n height: number;\n gridSize: number;\n isConnecting: boolean;\n isDragging: boolean;\n dragStartPosition: Position | null;\n dragOffset: Position;\n connectionPreview: Position[] | null;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CanvasStateService {\n private state = signal<CanvasState>({\n width: 3000,\n height: 2000,\n gridSize: 20,\n isConnecting: false,\n isDragging: false,\n dragStartPosition: null,\n dragOffset: { x: 0, y: 0 },\n connectionPreview: null,\n });\n\n readonly canvasState = this.state.asReadonly();\n\n setConnecting(isConnecting: boolean): void {\n this.state.update((state) => ({ ...state, isConnecting }));\n }\n\n setDragging(isDragging: boolean): void {\n this.state.update((state) => ({ ...state, isDragging }));\n }\n\n setDragStartPosition(position: Position | null): void {\n this.state.update((state) => ({ ...state, dragStartPosition: position }));\n }\n\n setDragOffset(offset: Position): void {\n this.state.update((state) => ({ ...state, dragOffset: offset }));\n }\n\n setConnectionPreview(points: Position[] | null): void {\n this.state.update((state) => ({ ...state, connectionPreview: points }));\n }\n\n resetInteractionState(): void {\n this.state.update((state) => ({\n ...state,\n isConnecting: false,\n isDragging: false,\n dragStartPosition: null,\n dragOffset: { x: 0, y: 0 },\n connectionPreview: null,\n }));\n }\n}\n","// services/node-finder.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeFinderService {\n private workflowState = inject(WorkflowStateService);\n\n findNodeAtPoint(point: Position): WorkflowObject | null {\n return (\n this.workflowState\n .nodes()\n .find((node) => this.isPointInNode(point, node)) || null\n );\n }\n\n isPointInNode(point: Position, node: WorkflowObject): boolean {\n return (\n point.x >= node.position.x &&\n point.x <= node.position.x + node.size.width &&\n point.y >= node.position.y &&\n point.y <= node.position.y + node.size.height\n );\n }\n\n isProtectedNode(node: WorkflowObject): boolean {\n return ['start', 'swimlane'].includes(node.type);\n }\n\n // Add any other shared node-finding functionality here\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WorkflowObject, Position, Action } from '../models/types';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { CanvasStateService } from './canvas-state.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { NodeFinderService } from './node-finder.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeSelectionService {\n private workflowState = inject(WorkflowStateService);\n private nodeFinder = inject(NodeFinderService);\n private canvasState = inject(CanvasStateService);\n\n handleNodeClick(point: Position): void {\n // Clear any ongoing interactions first\n this.canvasState.resetInteractionState();\n\n const nodes = this.workflowState.nodes();\n const clickedNode = this.nodeFinder.findNodeAtPoint(point);\n\n if (clickedNode) {\n this.selectNode(clickedNode.id);\n } else {\n this.clearSelection();\n }\n }\n\n selectNode(nodeId: string): void {\n // Don't reselect if already selected\n if (this.workflowState.selectedObjectId() === nodeId) return;\n\n this.workflowState.setSelectedObject(nodeId);\n }\n\n clearSelection(): void {\n this.workflowState.setSelectedObject(null);\n }\n\n isSelected(nodeId: string): boolean {\n return this.workflowState.selectedObjectId() === nodeId;\n }\n\n getSelectedNode(): WorkflowObject | null {\n const selectedId = this.workflowState.selectedObjectId();\n if (!selectedId) return null;\n\n return this.workflowState.getObjectById(selectedId) || null;\n }\n\n canSelectNode(node: WorkflowObject): boolean {\n // Add any rules for node selection here\n // For example, prevent selecting swimlanes\n return node.type !== 'swimlane';\n }\n\n handleToolSelection(nodeType: string | null): void {\n // Clear selection when tool is selected\n if (nodeType) {\n this.clearSelection();\n }\n }\n\n handleKeyboardEvent(event: KeyboardEvent): void {\n // Handle keyboard shortcuts for selection\n // For example, 'Escape' to clear selection\n if (event.key === 'Escape') {\n this.clearSelection();\n }\n }\n\n handleClickOutside(event: MouseEvent): void {\n // Check if click is outside any node and clear selection\n const target = event.target as HTMLElement;\n if (\n target.tagName === 'svg' ||\n target.classList.contains('canvas-container')\n ) {\n this.clearSelection();\n }\n }\n\n deleteSelectedObject(): void {\n const selectedId = this.workflowState.selectedObjectId();\n if (!selectedId) return;\n\n const selectedObject = this.workflowState.getObjectById(selectedId);\n if (!selectedObject) return;\n\n // First, remove any connections to/from this object\n const connections = this.workflowState.connections();\n const relatedConnectionIds = connections\n .filter(\n (conn: Action) => conn.fromId === selectedId || conn.toId === selectedId\n )\n .map((conn) => conn.id);\n\n // Remove all related connections\n relatedConnectionIds.forEach((id) => {\n this.workflowState.removeObject(id);\n });\n\n // Remove the selected object\n this.workflowState.removeObject(selectedId);\n\n // Clear the selection\n this.clearSelection();\n }\n}\n","// services/keyboard-handler.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { NodeSelectionService } from './node-selection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class KeyboardHandlerService {\n private workflowState = inject(WorkflowStateService);\n private selection = inject(NodeSelectionService);\n\n handleKeyDown(event: KeyboardEvent): void {\n // Only handle keyboard events if an object is selected\n if (!this.workflowState.selectedObjectId()) return;\n\n switch (event.key) {\n case 'Delete':\n case 'Backspace':\n this.handleDelete();\n break;\n // Add other keyboard shortcuts here\n }\n }\n\n private handleDelete(): void {\n const selectedId = this.workflowState.selectedObjectId();\n if (!selectedId) return;\n\n const selectedObject = this.workflowState.getObjectById(selectedId);\n if (!selectedObject) return;\n\n // Don't delete protected nodes like start node or swimlanes\n if (['start', 'swimlane'].includes(selectedObject.type)) return;\n\n // Remove the object and its connections\n this.selection.deleteSelectedObject();\n }\n}\n","// services/rendering.service.ts\nimport { Injectable } from '@angular/core';\nimport { Position, WorkflowObject, WorkflowObjectType } from '../models/types';\n\nexport interface NodeStyle {\n fill: string;\n stroke: string;\n strokeWidth: number;\n strokeLinejoin?: string;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RenderingService {\n // Node path generation\n generateNodePath(object: WorkflowObject): string {\n switch (object.type) {\n case 'start':\n return this.getStartNodePath(object.size.width, object.size.height);\n case 'decision':\n return this.getDecisionPath(object.size.width, object.size.height);\n case 'form':\n return this.getFormPath(object.size.width, object.size.height);\n case 'subflow':\n return this.getSubflowPath(object.size.width, object.size.height);\n default:\n return '';\n }\n }\n\n // Individual path generators\n getStartNodePath(width: number, height: number): string {\n return `M${width} ${height / 2} \n A${width / 2} ${height / 2} 0 0 0 \n 0 ${height / 2}\n A${width / 2} ${height / 2} 0 0 0 \n ${width} ${height / 2}`;\n }\n\n getFormPath(width: number, height: number): string {\n // Use exact path from design SVG\n return `M74.0625 40.5591V85.0625C74.0625 87.9716 72.9069 90.7615 70.8498 92.8186C68.7928 94.8756 66.0028 96.0312 63.0938 96.0312H11.9062C8.99716 96.0312 6.20721 94.8756 4.15017 92.8186C2.09313 90.7615 0.9375 87.9716 0.9375 85.0625V11.9375C0.9375 9.02841 2.09313 6.23846 4.15017 4.18142C6.20721 2.12438 8.99716 0.96875 11.9062 0.96875H34.4722C36.4109 0.969043 38.2701 1.73921 39.6412 3.10994L71.9213 35.3901C73.292 36.7611 74.0622 38.6204 74.0625 40.5591Z`;\n }\n\n getStartNodePaths(): { circle: string; arrow: string } {\n return {\n circle:\n 'M57.5 23C57.5 35.3246 44.8544 45.5 29 45.5C13.1456 45.5 0.5 35.3246 0.5 23C0.5 10.6754 13.1456 0.5 29 0.5C44.8544 0.5 57.5 10.6754 57.5 23Z',\n arrow: 'M74 6L64 0.226497V11.7735L74 6ZM0 7H65V5H0V7Z',\n };\n }\n\n getNodeStyle(isSelected: boolean): NodeStyle {\n return {\n fill: 'white',\n stroke: '#D36CFF',\n strokeWidth: isSelected ? 2 : 1,\n strokeLinejoin: 'round',\n };\n }\n\n getConnectionStyle(isSelected: boolean): Partial<SVGPathElement['style']> {\n return {\n stroke: '#D36CFF',\n strokeWidth: isSelected ? '2' : '1',\n fill: 'none',\n };\n }\n\n getConnectionPreviewStyle(): Partial<SVGPathElement['style']> {\n return {\n stroke: '#D36CFF',\n strokeWidth: '1',\n strokeDasharray: '4',\n fill: 'none',\n };\n }\n\n getSwimlaneStyle(): Partial<SVGRectElement['style']> {\n return {\n fill: '#f8fafc',\n stroke: '#e2e8f0',\n strokeWidth: '1',\n };\n }\n\n getNodeTransforms(node: WorkflowObject): {\n node: string;\n arrow?: string;\n indicator?: string;\n } {\n const baseTransform = `translate(${node.position.x}, ${node.position.y})`;\n\n switch (node.type) {\n case 'start':\n return {\n node: baseTransform,\n arrow: 'translate(57, 17)', // Position arrow relative to circle\n };\n case 'decision':\n return {\n node: baseTransform,\n indicator: `translate(${node.size.width + 10}, -10)`, // Position properties indicator\n };\n default:\n return { node: baseTransform };\n }\n }\n\n getDecisionNodePath(width: number, height: number): string {\n return `M${width / 2} 0 L${width} ${height / 2} L${\n width / 2\n } ${height} L0 ${height / 2} Z`;\n }\n\n getPropertiesIndicator(): {\n circle: { r: number; style: NodeStyle };\n text: { content: string; style: Partial<SVGTextElement['style']> };\n } {\n return {\n circle: {\n r: 8,\n style: {\n fill: 'white',\n stroke: '#D36CFF',\n strokeWidth: 1,\n },\n },\n text: {\n content: 'i',\n style: {\n fontSize: '12px',\n textAnchor: 'middle',\n alignmentBaseline: 'middle',\n userSelect: 'none',\n pointerEvents: 'none',\n },\n },\n };\n }\n\n getLabelStyle(\n nodeType: WorkflowObjectType\n ): Partial<SVGTextElement['style']> {\n const baseStyle = {\n fontSize: '12px',\n textAnchor: 'middle',\n dominantBaseline: 'middle',\n userSelect: 'none',\n pointerEvents: 'none',\n };\n\n switch (nodeType) {\n case 'swimlane':\n return {\n ...baseStyle,\n fontSize: '14px',\n fontWeight: '500',\n fill: '#64748b',\n // writingMode: 'vertical-lr',\n };\n default:\n return baseStyle;\n }\n }\n\n getDefaultDimensions(): { width: number; height: number; gridSize: number } {\n return {\n width: 3000,\n height: 2000,\n gridSize: 20,\n };\n }\n\n getGridPattern(): {\n pattern: { width: number; height: number };\n path: { d: string; style: Partial<SVGPathElement['style']> };\n } {\n return {\n pattern: {\n width: 20,\n height: 20,\n },\n path: {\n d: 'M 20 0 L 0 0 0 20',\n style: {\n fill: 'none',\n stroke: '#e2e8f0',\n strokeWidth: '0.5',\n },\n },\n };\n }\n\n // getConnectionPath(points: Position[]): string {\n // if (!points || points.length < 2) return '';\n\n // const [start, ...rest] = points;\n // const end = rest[rest.length - 1];\n\n // // Create the main path\n // const mainPath =\n // `M ${start.x} ${start.y} ` + rest.map((p) => `L ${p.x} ${p.y}`).join(' ');\n\n // // Add arrowhead\n // const arrowPath = this.createArrowhead(\n // end,\n // this.getEndPointAngle(points[points.length - 2], end)\n // );\n\n // return `${mainPath} ${arrowPath}`;\n // }\n\n /**\n * Gets the SVG path for a connection\n */\n getConnectionPath(points: Position[]): string {\n if (!points || points.length < 2) return '';\n\n // Create the main path\n const pathCommands = points.map((point, index) => {\n return index === 0\n ? `M ${point.x} ${point.y}`\n : `L ${point.x} ${point.y}`;\n });\n\n // Add arrowhead to the last segment\n const lastSegmentStart = points[points.length - 2];\n const lastSegmentEnd = points[points.length - 1];\n const arrowPath = this.createArrowhead(\n lastSegmentEnd,\n this.getEndPointAngle(lastSegmentStart, lastSegmentEnd)\n );\n\n return `${pathCommands.join(' ')} ${arrowPath}`;\n }\n\n /**\n * Gets style for an individual connection segment\n */\n getConnectionSegmentStyle(\n isSelected: boolean,\n isHovered: boolean\n ): Partial<SVGPathElement['style']> {\n return {\n stroke: '#D36CFF',\n strokeWidth: isSelected ? '2' : isHovered ? '2' : '1',\n fill: 'none',\n transition: 'stroke-width 0.2s ease',\n };\n }\n\n private createArrowhead(point: Position, angle: number): string {\n const arrowSize = 10;\n const arrowPoints = [\n {\n x: point.x - arrowSize * Math.cos(angle - Math.PI / 6),\n y: point.y - arrowSize * Math.sin(angle - Math.PI / 6),\n },\n point,\n {\n x: point.x - arrowSize * Math.cos(angle + Math.PI / 6),\n y: point.y - arrowSize * Math.sin(angle + Math.PI / 6),\n },\n ];\n\n return (\n `M ${arrowPoints[0].x} ${arrowPoints[0].y} ` +\n `L ${arrowPoints[1].x} ${arrowPoints[1].y} ` +\n `L ${arrowPoints[2].x} ${arrowPoints[2].y}`\n );\n }\n\n private getEndPointAngle(p1: Position, p2: Position): number {\n return Math.atan2(p2.y - p1.y, p2.x - p1.x);\n }\n\n getDecisionPath(width: number, height: number): string {\n // Using the exact dimensions from your SVG\n const centerX = width / 2;\n const centerY = height / 2;\n return `M0.981845 ${centerY} L${centerX} 0.580976 L${\n width - 0.981845\n } ${centerY} L${centerX} ${height - 0.580976}Z`;\n }\n\n getSubflowPath(width: number, height: number): string {\n // Using the exact dimensions from your SVG\n return `M1.19873 ${height * 0.252887}L${width / 2} 0.57735L${\n width - 1.19873\n } ${height * 0.252887}V${height * 0.747113}L${width / 2} ${\n height - 0.57735\n }L1.19873 ${height * 0.747113}V${height * 0.252887}`;\n }\n}\n","// services/orthogonal-router.service.ts\nimport { Injectable } from '@angular/core';\nimport {\n ConnectionPoint,\n NodeSide,\n Position,\n RoutingPoint,\n Size,\n} from '../models/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OrthogonalRouterService {\n /**\n * Finds the closest node side and point for a given mouse position\n */\n findConnectionPoint(\n node: { position: Position; size: Size },\n mousePos: Position\n ): ConnectionPoint {\n const { position: pos, size } = node;\n\n // Calculate distances to each side\n const distToTop = Math.abs(mousePos.y - pos.y);\n const distToBottom = Math.abs(mousePos.y - (pos.y + size.height));\n const distToLeft = Math.abs(mousePos.x - pos.x);\n const distToRight = Math.abs(mousePos.x - (pos.x + size.width));\n\n // Find the minimum distance\n const minDist = Math.min(distToTop, distToBottom, distToLeft, distToRight);\n\n // Determine connection point based on closest side\n let side: NodeSide;\n let x: number;\n let y: number;\n\n if (minDist === distToTop) {\n side = 'top';\n x = Math.min(Math.max(mousePos.x, pos.x), pos.x + size.width);\n y = pos.y;\n } else if (minDist === distToBottom) {\n side = 'bottom';\n x = Math.min(Math.max(mousePos.x, pos.x), pos.x + size.width);\n y = pos.y + size.height;\n } else if (minDist === distToLeft) {\n side = 'left';\n x = pos.x;\n y = Math.min(Math.max(mousePos.y, pos.y), pos.y + size.height);\n } else {\n side = 'right';\n x = pos.x + size.width;\n y = Math.min(Math.max(mousePos.y, pos.y), pos.y + size.height);\n }\n\n return { x, y, side };\n }\n\n /**\n * Calculates the optimal orthogonal route between two points\n */\n calculateRoute(\n startNode: { position: Position; size: Size },\n endNode: { position: Position; size: Size },\n startPoint: ConnectionPoint,\n endPoint: ConnectionPoint\n ): RoutingPoint[] {\n // Convert connection points to routing points\n const start: RoutingPoint = { ...startPoint, type: 'start' };\n const end: RoutingPoint = { ...endPoint, type: 'end' };\n\n // If points are aligned vertically or horizontally, create direct route\n if (Math.abs(start.x - end.x) < 10) {\n return this.createVerticalRoute(start, end);\n }\n if (Math.abs(start.y - end.y) < 10) {\n return this.createHorizontalRoute(start, end);\n }\n\n // Create route based on connection sides\n return this.createRouteFromSides(\n start,\n end,\n startPoint.side,\n endPoint.side\n );\n }\n\n private createRouteFromSides(\n start: RoutingPoint,\n end: RoutingPoint,\n startSide: NodeSide,\n endSide: NodeSide\n ): RoutingPoint[] {\n const points: RoutingPoint[] = [start];\n\n // Determine if we need to start horizontally or vertically based on the start side\n const startHorizontal = startSide === 'left' || startSide === 'right';\n const endHorizontal = endSide === 'left' || endSide === 'right';\n\n if (startHorizontal) {\n // Start with horizontal movement\n const midX = (start.x + end.x) / 2;\n if (start.y !== end.y) {\n points.push(this.createBendPoint(midX, start.y, true));\n points.push(this.createBendPoint(midX, end.y, false));\n }\n } else {\n // Start with vertical movement\n const midY = (start.y + end.y) / 2;\n if (start.x !== end.x) {\n points.push(this.createBendPoint(start.x, midY, false));\n points.push(this.createBendPoint(end.x, midY, true));\n }\n }\n\n points.push(end);\n return this.simplifyRoute(points);\n }\n\n private createBendPoint(\n x: number,\n y: number,\n isHorizontal: boolean\n ): RoutingPoint {\n return { x, y, type: 'bend', isHorizontal };\n }\n\n private createHorizontalRoute(\n start: RoutingPoint,\n end: RoutingPoint\n ): RoutingPoint[] {\n return [start, { ...end, type: 'end', isHorizontal: true }];\n }\n\n private createVerticalRoute(\n start: RoutingPoint,\n end: RoutingPoint\n ): RoutingPoint[] {\n return [start, { ...end, type: 'end', isHorizontal: false }];\n }\n\n private simplifyRoute(points: RoutingPoint[]): RoutingPoint[] {\n // Remove unnecessary bends (where three points form a straight line)\n const simplified = points.filter((point, index) => {\n if (index === 0 || index === points.length - 1) return true;\n\n const prev = points[index - 1];\n const next = points[index + 1];\n\n // Keep point if it creates an actual bend\n return (\n !(prev.x === point.x && point.x === next.x) &&\n !(prev.y === point.y && point.y === next.y)\n );\n });\n\n // Update point types and horizontal flags\n return simplified.map((point, index) => ({\n ...point,\n type:\n index === 0\n ? 'start'\n : index === simplified.length - 1\n ? 'end'\n : 'bend',\n isHorizontal:\n index < simplified.length - 1\n ? simplified[index + 1].y === point.y\n : point.y === simplified[index - 1].y,\n }));\n }\n\n /**\n * Updates a segment's position while maintaining orthogonal constraints\n */\n updateSegment(\n points: RoutingPoint[],\n segmentIndex: number,\n newPosition: Position\n ): RoutingPoint[] {\n const updatedPoints = [...points];\n const currentPoint = points[segmentIndex];\n const nextPoint = points[segmentIndex + 1];\n\n if (!currentPoint || !nextPoint) return points;\n\n // Determine if this is a horizontal or vertical segment\n const isHorizontal = currentPoint.y === nextPoint.y;\n\n if (isHorizontal) {\n // Moving a horizontal segment - adjust y coordinate\n updatedPoints[segmentIndex].y = newPosition.y;\n updatedPoints[segmentIndex + 1].y = newPosition.y;\n } else {\n // Moving a vertical segment - adjust x coordinate\n updatedPoints[segmentIndex].x = newPosition.x;\n updatedPoints[segmentIndex + 1].x = newPosition.x;\n }\n\n return this.simplifyRoute(updatedPoints);\n }\n\n /**\n * Determines if a point is near enough to a line segment for manipulation\n */\n isPointNearSegment(\n point: Position,\n segmentStart: Position,\n segmentEnd: Position,\n threshold = 10\n ): boolean {\n // For horizontal segments\n if (segmentStart.y === segmentEnd.y) {\n return (\n Math.abs(point.y - segmentStart.y) <= threshold &&\n point.x >= Math.min(segmentStart.x, segmentEnd.x) &&\n point.x <= Math.max(segmentStart.x, segmentEnd.x)\n );\n }\n\n // For vertical segments\n if (segmentStart.x === segmentEnd.x) {\n return (\n Math.abs(point.x - segmentStart.x) <= threshold &&\n point.y >= Math.min(segmentStart.y, segmentEnd.y) &&\n point.y <= Math.max(segmentStart.y, segmentEnd.y)\n );\n }\n\n return false;\n }\n}\n","// services/connection-segment-interaction.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, Action } from '../models/types';\nimport { OrthogonalRouterService } from './orthogonal-router.service';\nimport { WorkflowStateService } from './wf-state.service';\n\ninterface SegmentDragState {\n connectionId: string;\n segmentIndex: number;\n initialPosition: Position;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConnectionSegmentInteractionService {\n private workflowState = inject(WorkflowStateService);\n private orthogonalRouter = inject(OrthogonalRouterService);\n\n private dragState: SegmentDragState | null = null;\n\n /**\n * Identifies if a point is near any connection segment\n */\n findSegmentAtPoint(\n point: Position\n ): { connectionId: string; segmentIndex: number } | null {\n const connections = this.workflowState.connections();\n\n for (const connection of connections) {\n const points = connection.points;\n if (!points || points.length < 2) continue;\n\n // Check each segment\n for (let i = 0; i < points.length - 1; i++) {\n if (\n this.orthogonalRouter.isPointNearSegment(\n point,\n points[i],\n points[i + 1]\n )\n ) {\n return {\n connectionId: connection.id,\n segmentIndex: i,\n };\n }\n }\n }\n\n return null;\n }\n\n /**\n * Starts dragging a connection segment\n */\n startDragging(\n connectionId: string,\n segmentIndex: number,\n point: Position\n ): void {\n this.dragState = {\n connectionId,\n segmentIndex,\n initialPosition: point,\n };\n }\n\n /**\n * Updates segment position during drag\n */\n updateDragging(point: Position): void {\n if (!this.dragState) return;\n\n const connection = this.workflowState.getObjectById(\n this.dragState.connectionId\n ) as Action;\n if (!connection || !connection.points) return;\n\n // Convert Position[] to RoutingPoint[]\n const routingPoints = connection.points.map((p, index) => ({\n ...p,\n type:\n index === 0\n ? 'start'\n : index === connection.points.length - 1\n ? 'end'\n : ('bend' as 'start' | 'end' | 'bend'),\n isHorizontal:\n index < connection.points.length - 1\n ? connection.points[index].y === connection.points[index + 1].y\n : false,\n }));\n\n const updatedPoints = this.orthogonalRouter.updateSegment(\n routingPoints,\n this.dragState.segmentIndex,\n point\n );\n\n // Convert back to Position[] for storage\n const positionPoints = updatedPoints.map((p) => ({\n x: p.x,\n y: p.y,\n }));\n\n this.workflowState.updateObject(connection.id, {\n points: positionPoints,\n } as Partial<Action>);\n }\n /**\n * Completes the drag operation\n */\n finishDragging(): void {\n // Additional cleanup if needed\n this.dragState = null;\n }\n\n /**\n * Returns whether a segment is currently being dragged\n */\n isDragging(): boolean {\n return this.dragState !== null;\n }\n\n /**\n * Gets cursor style based on segment orientation\n */\n getSegmentCursor(connectionId: string, segmentIndex: number): string {\n const connection = this.workflowState.getObjectById(connectionId) as Action;\n if (!connection || !connection.points) return 'default';\n\n const point = connection.points[segmentIndex];\n const nextPoint = connection.points[segmentIndex + 1];\n\n if (!point || !nextPoint) return 'default';\n\n // Return appropriate cursor based on segment orientation\n return point.y === nextPoint.y ? 'ns-resize' : 'ew-resize';\n }\n}\n","// services/connection.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport {\n Position,\n WorkflowObject,\n Action,\n ConnectionPoint,\n NodeSide,\n} from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { RenderingService } from './rendering.service';\nimport { NodeFinderService } from './node-finder.service';\nimport { OrthogonalRouterService } from './orthogonal-router.service';\nimport { ConnectionSegmentInteractionService } from './connection-segment-interaction.service';\n\nexport interface ConnectionEndpoints {\n startPoint: ConnectionPoint;\n endPoint: ConnectionPoint;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ConnectionService {\n private workflowState = inject(WorkflowStateService);\n private canvasState = inject(CanvasStateService);\n private nodeFinder = inject(NodeFinderService);\n private rendering = inject(RenderingService);\n private orthogonalRouter = inject(OrthogonalRouterService);\n private segmentInteraction = inject(ConnectionSegmentInteractionService);\n private connectionEndpoints = new Map<string, ConnectionEndpoints>();\n\n startConnection(sourceNode: WorkflowObject, point: Position): void {\n if (!this.canStartConnection(sourceNode)) return;\n\n const startPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(sourceNode, point),\n type: 'start',\n position: point,\n };\n\n this.canvasState.setConnecting(true);\n this.workflowState.setSelectedObject(sourceNode.id);\n\n // Store the start point for later use\n const tempId = 'preview';\n this.connectionEndpoints.set(tempId, {\n startPoint,\n endPoint: { ...startPoint }, // Create a new object with the same properties\n });\n\n // Calculate initial preview route\n const previewPoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n { position: point, size: { width: 0, height: 0 } },\n startPoint,\n startPoint\n );\n\n this.canvasState.setConnectionPreview(previewPoints);\n }\n\n updateConnectionPreview(point: Position): void {\n const sourceNodeId = this.workflowState.selectedObjectId();\n if (!sourceNodeId) return;\n\n const sourceNode = this.workflowState.getObjectById(sourceNodeId);\n if (!sourceNode) return;\n\n const endpoints = this.connectionEndpoints.get('preview');\n if (!endpoints) return;\n\n const endPoint: ConnectionPoint = {\n x: point.x,\n y: point.y,\n side: this.determineEndSide(endpoints.startPoint, point),\n type: 'end',\n position: point,\n };\n\n // Update preview with new end point\n const previewPoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n { position: point, size: { width: 0, height: 0 } },\n endpoints.startPoint,\n endPoint\n );\n\n this.canvasState.setConnectionPreview(previewPoints);\n }\n\n finalizeConnection(point: Position): void {\n const sourceNodeId = this.workflowState.selectedObjectId();\n if (!sourceNodeId) return;\n\n const sourceNode = this.workflowState.getObjectById(sourceNodeId);\n if (!sourceNode) return;\n\n const targetNode = this.nodeFinder.findNodeAtPoint(point);\n const endpoints = this.connectionEndpoints.get('preview');\n\n if (targetNode && endpoints && this.canConnect(sourceNode, targetNode)) {\n const endPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(targetNode, point),\n type: 'end',\n position: point,\n };\n\n // Calculate final route\n const routePoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n targetNode,\n endpoints.startPoint,\n endPoint\n );\n\n const newConnection: Action = {\n id: crypto.randomUUID(),\n type: 'action',\n fromId: sourceNode.id,\n toId: targetNode.id,\n label: '',\n position: sourceNode.position,\n size: { width: 0, height: 0 },\n points: routePoints,\n };\n\n // Store the connection endpoints for later use\n this.connectionEndpoints.set(newConnection.id, {\n startPoint: endpoints.startPoint,\n endPoint,\n });\n\n this.workflowState.addObject(newConnection);\n }\n\n this.connectionEndpoints.delete('preview');\n }\n\n updateConnectionsForNode(nodeId: string): void {\n const node = this.workflowState.getObjectById(nodeId);\n if (!node) return;\n\n const connections = this.workflowState\n .connections()\n .filter((conn) => conn.fromId === nodeId || conn.toId === nodeId);\n\n connections.forEach((connection) => {\n const sourceNode = this.workflowState.getObjectById(connection.fromId);\n const targetNode = this.workflowState.getObjectById(connection.toId);\n\n if (sourceNode && targetNode) {\n // Determine connection points based on current node positions\n const startPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(sourceNode, {\n x: sourceNode.position.x + sourceNode.size.width / 2,\n y: sourceNode.position.y + sourceNode.size.height / 2,\n }),\n type: 'start',\n position: sourceNode.position,\n };\n\n const endPoint: ConnectionPoint = {\n ...this.orthogonalRouter.findConnectionPoint(targetNode, {\n x: targetNode.position.x + targetNode.size.width / 2,\n y: targetNode.position.y + targetNode.size.height / 2,\n }),\n type: 'end',\n position: targetNode.position,\n };\n\n // Calculate completely new route\n const newPoints = this.orthogonalRouter.calculateRoute(\n sourceNode,\n targetNode,\n startPoint,\n endPoint\n );\n\n // Update connection\n this.workflowState.updateObject(connection.id, {\n points: newPoints,\n } as Partial<Action>);\n\n // Store new endpoints\n this.connectionEndpoints.set(connection.id, { startPoint, endPoint });\n }\n });\n }\n\n private determineEndSide(\n startPoint: ConnectionPoint,\n endPoint: Position\n ): NodeSide {\n // Determine the best side for the end point based on relative position\n const dx = endPoint.x - startPoint.x;\n const dy = endPoint.y - startPoint.y;\n\n if (Math.abs(dx) > Math.abs(dy)) {\n return dx > 0 ? 'left' : 'right';\n } else {\n return dy > 0 ? 'top' : 'bottom';\n }\n }\n\n /**\n * Handles clicking on a connection segment\n */\n handleSegmentClick(point: Position): void {\n const segment = this.segmentInteraction.findSegmentAtPoint(point);\n if (segment) {\n this.segmentInteraction.startDragging(\n segment.connectionId,\n segment.segmentIndex,\n point\n );\n }\n }\n\n /**\n * Updates segment position during drag\n */\n handleSegmentDrag(point: Position): void {\n if (this.segmentInteraction.isDragging()) {\n this.segmentInteraction.updateDragging(point);\n }\n }\n\n /**\n * Completes segment drag operation\n */\n finishSegmentDrag(): void {\n this.segmentInteraction.finishDragging();\n }\n\n /**\n * Gets cursor style for a segment\n */\n getSegmentCursor(connectionId: string, segmentIndex: number): string {\n return this.segmentInteraction.getSegmentCursor(connectionId, segmentIndex);\n }\n\n getConnectionPath(connection: Action): string {\n if (!connection.points || connection.points.length < 2) return '';\n\n const points = connection.points;\n const [start, ...rest] = points;\n return (\n `M ${start.x} ${start.y} ` + rest.map((p) => `L ${p.x} ${p.y}`).join(' ')\n );\n }\n\n private canStartConnection(node: WorkflowObject): boolean {\n if (node.type === 'start') {\n // Start node can only have one outgoing connection\n return !this.hasOutgoingConnections(node.id);\n }\n return ['stage', 'decision', 'form', 'subflow'].includes(node.type);\n }\n\n private canConnect(source: WorkflowObject, target: WorkflowObject): boolean {\n if (!target || source.id === target.id) return false;\n\n // Prevent connections to start node and swimlanes\n if (['start', 'swimlane'].includes(target.type)) return false;\n\n // Prevent duplicate connections\n return !this.hasConnection(source.id, target.id);\n }\n\n private hasConnection(sourceId: string, targetId: string): boolean {\n return this.workflowState\n .connections()\n .some(\n (conn) =>\n (conn as Action).fromId === sourceId &&\n (conn as Action).toId === targetId\n );\n }\n\n getPreviewPath(): string {\n const preview = this.canvasState.canvasState().connectionPreview;\n if (!preview || preview.length < 2) return '';\n\n // Use the rendering service for consistent path generation\n return this.rendering.getConnectionPath(preview);\n }\n\n hasOutgoingConnections(nodeId: string): boolean {\n return this.workflowState\n .connections()\n .some((conn) => (conn as Action).fromId === nodeId);\n }\n\n getConnectionPoint(node: WorkflowObject, type: 'input' | 'output'): Position {\n const center = {\n x: node.position.x + node.size.width / 2,\n y: node.position.y + node.size.height / 2,\n };\n\n switch (node.type) {\n case 'stage':\n return {\n x:\n type === 'input'\n ? node.position.x\n : node.position.x + node.size.width,\n y: center.y,\n };\n case 'decision':\n return type === 'input'\n ? { x: center.x, y: node.position.y }\n : { x: node.position.x + node.size.width, y: center.y };\n default:\n return type === 'input'\n ? { x: node.position.x, y: center.y }\n : { x: node.position.x + node.size.width, y: center.y };\n }\n }\n\n recalculateConnectionPoints(\n source: WorkflowObject,\n target: WorkflowObject,\n existingPoints: Position[]\n ): Position[] {\n // Start and end points\n const startPoint = this.getConnectionPoint(source, 'output');\n const endPoint = this.getConnectionPoint(target, 'input');\n\n // If it's a simple connection, just return direct path\n if (existingPoints.length <= 2) {\n return [startPoint, endPoint];\n }\n\n // For complex paths, maintain the middle points' relative positions\n const middlePoints = existingPoints.slice(1, -1).map((point) => ({\n x: point.x + (startPoint.x - existingPoints[0].x),\n y: point.y + (startPoint.y - existingPoints[0].y),\n }));\n\n return [startPoint, ...middlePoints, endPoint];\n }\n\n // Use nodeFinder methods instead of NodeInteractionService\n findTargetNode(point: Position): WorkflowObject | null {\n return this.nodeFinder.findNodeAtPoint(point);\n }\n}\n","// services/workflow-mapper.service.ts\nimport { Injectable } from '@angular/core';\nimport {\n WorkflowObject,\n Position,\n Action as FrontendAction,\n Stage,\n WorkflowMetadata,\n} from '../models/types';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { TaskAssignmentType } from 'verben-workflow-ui/src/lib/models';\nimport { Status } from 'verben-workflow-ui/src/lib/models';\nimport { SwimLane } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowStage } from 'verben-workflow-ui/src/lib/models';\nimport { StageActorRule } from 'verben-workflow-ui/src/lib/models';\nimport { WorkflowAction } from 'verben-workflow-ui/src/lib/models';\nimport { ObjectState } from 'verben-workflow-ui/src/lib/models';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowMapperService {\n constructor(private connectionService: ConnectionService) {}\n\n // Frontend to Backend transformation\n toBackendWorkflow(\n objects: WorkflowObject[],\n workflowMetadata: WorkflowMetadata\n ): Workflow {\n const swimlanes = objects.filter((obj) => obj.type === 'swimlane');\n const stages = objects.filter((obj) => obj.type === 'stage');\n const connections = objects.filter(\n (obj) =>\n obj.type === 'action' &&\n (obj as FrontendAction)?.fromId &&\n (obj as FrontendAction)?.toId\n ) as FrontendAction[];\n const startNode = objects.find((obj) => obj.type === 'start');\n const forms = objects.filter((obj) => obj.type === 'form');\n\n // Find entry points (stages connected to start node)\n const entryPointIds = connections\n .filter((conn) => conn.fromId === startNode?.id)\n .map((conn) => conn.toId);\n\n // Find exit points (stages with no outgoing connections)\n const exitPointIds = stages\n .filter((stage) => !connections.some((conn) => conn.fromId === stage.id))\n .map((stage) => stage.id);\n\n // Preserve original workflow code if it exists, otherwise generate a new one\n const code =\n workflowMetadata.code || this.generateCode(workflowMetadata.name);\n\n const workflow: Workflow = {\n Id: workflowMetadata.id || '',\n id: workflowMetadata.id || '',\n Code: code,\n Name: workflowMetadata.name,\n Description:\n workflowMetadata.description || `Workflow for ${workflowMetadata.name}`,\n StageEntryRule: this.generateStageEntryRule(entryPointIds.length),\n Form: workflowMetadata.formId || '',\n AssignmentType: TaskAssignmentType.Queue,\n Status: Status.Active,\n Actions: connections.map((connection) =>\n this.toBackendAction(connection, code)\n ),\n Lanes: swimlanes.map((lane) => this.toBackendSwimlane(lane, code)),\n Stages: [],\n TenantId: workflowMetadata.tenantId || '',\n ServiceName: 'Workflow',\n CreatedAt: workflowMetadata.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: workflowMetadata.isNew ? ObjectState.New : ObjectState.Changed,\n };\n\n // Map stages with entry/exit point information\n const mappedStages = stages.map((stage) =>\n this.toBackendStage(\n stage,\n code,\n entryPointIds.includes(stage.id),\n exitPointIds.includes(stage.id),\n this.findSwimlaneForStage(stage, swimlanes),\n workflowMetadata.tenantId || ''\n )\n );\n\n // Store stages in workflow\n workflow.Stages = mappedStages;\n\n return workflow;\n }\n\n private generateCode(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n private findSwimlaneForStage(\n stage: WorkflowObject,\n swimlanes: WorkflowObject[]\n ): string {\n return (\n swimlanes.find(\n (lane) =>\n stage.position.y >= lane.position.y &&\n stage.position.y <= lane.position.y + lane.size.height\n )?.id || ''\n );\n }\n\n private generateStageEntryRule(entryPointCount: number): string {\n return entryPointCount > 1 ? 'parallel-entry' : 'single-entry';\n }\n\n private toBackendSwimlane(\n frontendLane: WorkflowObject,\n workflow: string\n ): SwimLane {\n // Preserve original ID if available\n const originalId = frontendLane.originalId || '';\n\n return {\n Id: originalId,\n id: originalId,\n Code: frontendLane.originalCode || this.generateCode(frontendLane.label),\n Position: Math.floor(frontendLane.position.y / frontendLane.size.height),\n Workflow: workflow,\n Coordinates: {\n X: frontendLane.position.x,\n Y: frontendLane.position.y,\n },\n Size: {\n Width: frontendLane.size.width,\n Height: frontendLane.size.height,\n },\n Tags: frontendLane.tags || [], // This now correctly maps Tag[] to Tag[]\n TenantId: frontendLane.tenantId || '',\n ServiceName: 'Workflow',\n CreatedAt: frontendLane.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: originalId ? ObjectState.Changed : ObjectState.New,\n };\n }\n\n private toBackendStage(\n frontendStage: WorkflowObject,\n workflowId: string,\n isEntryPoint: boolean,\n isExitPoint: boolean,\n swimlaneId: string,\n tenantId: string\n ): WorkflowStage {\n const stage = frontendStage as Stage;\n const originalId = stage.originalId || '';\n\n return {\n Id: originalId,\n id: originalId,\n Code: stage.originalCode || this.generateCode(stage.label),\n Key: stage.id,\n Workflow: workflowId,\n Name: stage.label,\n Description: stage.description || '',\n Duration: stage.duration || 0,\n PassOnRule: stage.passOnRule || '',\n ActorRule: (stage.actorRule as StageActorRule) || StageActorRule.Any,\n MinNoOfActor: stage.minNoOfActor || 1,\n IsParallel: stage.isParallel || false,\n IsEntryPoint: isEntryPoint,\n IsExitPoint: isExitPoint,\n Tags: stage.tags || [], // Now correctly maps Tag[] to Tag[]\n Form: stage.form || '',\n AllowMultiSubProcess: stage.allowMultiSubProcess || false,\n AssignmentType:\n (stage.assignmentType as TaskAssignmentType) ||\n TaskAssignmentType.Queue,\n SubWorkFlow: stage.subWorkflow || '',\n SwimLane: swimlaneId,\n Coordinates: {\n X: stage.position.x,\n Y: stage.position.y,\n },\n IsSubProcess: stage.isSubProcess || false,\n TenantId: tenantId,\n ServiceName: 'Workflow',\n CreatedAt: stage.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: originalId ? ObjectState.Changed : ObjectState.New,\n };\n }\n\n private toBackendAction(\n frontendAction: FrontendAction,\n workflow: string\n ): WorkflowAction {\n const originalId = frontendAction.originalId || '';\n\n return {\n Id: originalId,\n id: originalId,\n Code:\n frontendAction.originalCode ||\n `${frontendAction.fromId}-to-${frontendAction.toId}`,\n Workflow: workflow,\n Name: frontendAction.label || 'Unnamed Action',\n OperationAction: null,\n FromStage: frontendAction.fromId,\n ToStage: frontendAction.toId,\n IsParallel: frontendAction.isParallel || false,\n PassOnRule: frontendAction.passOnRule || '',\n TenantId: frontendAction.tenantId || '',\n ServiceName: 'Workflow',\n CreatedAt: frontendAction.createdAt || new Date(),\n UpdatedAt: new Date(),\n DataState: originalId ? ObjectState.Changed : ObjectState.New,\n };\n }\n\n // Backend to Frontend transformation\n toFrontendObjects(workflow: Workflow): {\n objects: WorkflowObject[];\n metadata: WorkflowMetadata;\n } {\n const objects: WorkflowObject[] = [];\n\n // Create metadata object to store workflow information\n const metadata: WorkflowMetadata = {\n id: workflow.Id,\n code: workflow.Code,\n name: workflow.Name,\n description: workflow.Description,\n tenantId: workflow.TenantId,\n formId: workflow.Form,\n createdAt: workflow.CreatedAt,\n isNew: workflow.DataState === ObjectState.New,\n };\n\n // Start with the start node\n const startNode = this.createStartNode();\n objects.push(startNode);\n\n // Convert swimlanes\n const swimlanes = workflow.Lanes.map((lane) =>\n this.toFrontendSwimlane(lane)\n );\n objects.push(...swimlanes);\n\n // Convert stages\n const stages = workflow.Stages.map((stage) => this.toFrontendStage(stage));\n objects.push(...stages);\n\n // Create connections, including from start node to entry points\n const connections = this.createConnections(workflow, startNode.id, stages);\n objects.push(...connections);\n\n return { objects, metadata };\n }\n\n private createStartNode(): WorkflowObject {\n return {\n id: 'start-node',\n type: 'start',\n position: { x: 50, y: 37 },\n size: { width: 58, height: 46 },\n label: 'Start',\n };\n }\n\n private toFrontendSwimlane(backendLane: SwimLane): WorkflowObject {\n // Normalize the coordinates and size\n const coordinates = backendLane.Coordinates || {\n X: 0,\n Y: backendLane.Position * 120,\n };\n const position = {\n x: coordinates.X ?? 0,\n y: coordinates.Y ?? 0,\n };\n\n const size = backendLane.Size || { Width: 2960, Height: 120 };\n const normalizedSize = {\n width: size.Width ?? 2960,\n height: size.Height ?? 120,\n };\n\n return {\n id: backendLane.Code,\n type: 'swimlane',\n position,\n size: normalizedSize,\n label: backendLane.Code,\n // Store original backend information for later use\n originalId: backendLane.Id,\n originalCode: backendLane.Code,\n tags: backendLane.Tags || [],\n tenantId: backendLane.TenantId,\n createdAt: backendLane.CreatedAt,\n };\n }\n\n private toFrontendStage(backendStage: WorkflowStage): WorkflowObject {\n // Normalize coordinates\n const coordinates = backendStage.Coordinates || { X: 0, Y: 0 };\n const position = {\n x: coordinates.X ?? 0,\n y: coordinates.Y ?? 0,\n };\n\n return {\n id: backendStage.Key || backendStage.Code,\n type: 'stage',\n position,\n size: { width: 120, height: 80 }, // Default size for stages\n label: backendStage.Name,\n // Store original backend information\n originalId: backendStage.Id,\n originalCode: backendStage.Code,\n description: backendStage.Description,\n duration: backendStage.Duration,\n passOnRule: backendStage.PassOnRule,\n actorRule: backendStage.ActorRule,\n minNoOfActor: backendStage.MinNoOfActor,\n isParallel: backendStage.IsParallel,\n isEntryPoint: backendStage.IsEntryPoint,\n isExitPoint: backendStage.IsExitPoint,\n tags: backendStage.Tags,\n forms: backendStage.Form,\n allowMultiSubProcess: backendStage.AllowMultiSubProcess,\n assignmentType: backendStage.AssignmentType,\n subWorkflow: backendStage.SubWorkFlow,\n isSubProcess: backendStage.IsSubProcess,\n tenantId: backendStage.TenantId,\n createdAt: backendStage.CreatedAt,\n };\n }\n\n private createConnections(\n workflow: Workflow,\n startNodeId: string,\n stages: WorkflowObject[]\n ): FrontendAction[] {\n const connections: FrontendAction[] = [];\n const actions = workflow.Actions;\n\n // Create connections from start node to entry points\n stages\n .filter(\n (stage) =>\n workflow.Stages.find((s) => s.Key === stage.id || s.Code === stage.id)\n ?.IsEntryPoint\n )\n .forEach((entryStage) => {\n connections.push(\n this.createConnection(\n crypto.randomUUID(),\n startNodeId,\n entryStage.id,\n 'Start',\n stages\n )\n );\n });\n\n // Create connections between stages\n actions.forEach((action) => {\n connections.push(\n this.createConnection(\n action.Code,\n action.FromStage,\n action.ToStage,\n action.Name || '',\n stages,\n {\n originalId: action.Id,\n originalCode: action.Code,\n isParallel: action.IsParallel,\n passOnRule: action.PassOnRule,\n tenantId: action.TenantId,\n createdAt: action.CreatedAt,\n }\n )\n );\n });\n\n return connections;\n }\n\n private createConnection(\n id: string,\n fromId: string,\n toId: string,\n label: string,\n stages: WorkflowObject[],\n properties?: any\n ): FrontendAction {\n const sourceNode =\n stages.find((s) => s.id === fromId) || this.createStartNode();\n const targetNode = stages.find((s) => s.id === toId);\n\n if (!targetNode) {\n console.error(`Unable to find target stage with id: ${toId}`);\n // Return a minimal connection to avoid breaking the application\n return {\n id,\n type: 'action',\n fromId,\n toId,\n label,\n position: { x: 0, y: 0 },\n size: { width: 0, height: 0 },\n points: [],\n ...properties,\n };\n }\n\n const points = this.connectionService.recalculateConnectionPoints(\n sourceNode,\n targetNode,\n []\n );\n\n return {\n id,\n type: 'action',\n fromId,\n toId,\n label,\n position: sourceNode.position,\n size: { width: 0, height: 0 },\n points,\n // Store all additional properties from backend\n originalId: properties?.originalId,\n originalCode: properties?.originalCode,\n isParallel: properties?.isParallel,\n passOnRule: properties?.passOnRule,\n tenantId: properties?.tenantId,\n createdAt: properties?.createdAt,\n properties: properties?.properties,\n };\n }\n}\n","// services/workflow-persistence.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { WorkflowsService } from 'verben-workflow-ui/src/lib/components/workflows';\nimport { ErrorResponse, FormEntity, Tag, Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { WorkflowMetadata } from '../models/types';\nimport { WorkflowMapperService } from './wf-mapper.service';\nimport { WorkflowStateService } from './wf-state.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowPersistenceService {\n private workflowState = inject(WorkflowStateService);\n private mapper = inject(WorkflowMapperService);\n private service = inject(WorkflowsService);\n private utilSvc = inject(UtilService);\n\n // Add a property to store the current workflow metadata\n private currentWorkflowMetadata: WorkflowMetadata = {\n id: '',\n code: '',\n name: 'New Workflow',\n description: '',\n isNew: true,\n };\n\n // Getter for workflow metadata\n get workflowMetadata(): WorkflowMetadata {\n return { ...this.currentWorkflowMetadata };\n }\n\n // Save workflow with current metadata\n saveWorkflow(): Promise<Workflow[]> {\n const currentObjects = this.workflowState.objects();\n const workflow = this.mapper.toBackendWorkflow(\n currentObjects,\n this.currentWorkflowMetadata\n );\n\n return this.service.saveWorkflows([workflow]).then((results) => {\n // Update metadata with saved workflow info if successful\n if (results && results.length > 0) {\n const savedWorkflow = results[0];\n this.updateWorkflowMetadata({\n id: savedWorkflow.Id,\n code: savedWorkflow.Code,\n name: savedWorkflow.Name,\n description: savedWorkflow.Description,\n tenantId: savedWorkflow.TenantId,\n formId: savedWorkflow.Form,\n createdAt: savedWorkflow.CreatedAt,\n isNew: false,\n });\n }\n return results;\n });\n }\n\n // Load workflow by ID\n async loadWorkflow(workflowId: string): Promise<void> {\n try {\n const data = await this.service.getWorkflowWithParam(workflowId);\n if (data instanceof ErrorResponse) {\n this.utilSvc.showError(data.ErrorMsg);\n return;\n }\n const workflow = data.Result[0];\n\n if (workflow) {\n const result = this.mapper.toFrontendObjects(workflow);\n\n // Update metadata\n this.updateWorkflowMetadata({\n id: workflow.Id,\n code: workflow.Code,\n name: workflow.Name,\n description: workflow.Description,\n tenantId: workflow.TenantId,\n formId: workflow.Form,\n createdAt: workflow.CreatedAt,\n isNew: false,\n });\n\n // Clear existing state and load new objects\n this.workflowState.state.set({\n objects: result.objects,\n selectedObjectId: null,\n selectedTool: null,\n });\n }\n } catch (error) {\n console.error('Error loading workflow:', error);\n throw error;\n }\n }\n\n // Update workflow metadata\n updateWorkflowMetadata(metadata: Partial<WorkflowMetadata>): void {\n this.currentWorkflowMetadata = {\n ...this.currentWorkflowMetadata,\n ...metadata,\n };\n }\n\n // Create a new workflow\n createNewWorkflow(name: string, description?: string): void {\n // Reset the state\n this.workflowState.initializeWorkflow();\n\n // Set up new metadata\n this.updateWorkflowMetadata({\n id: '',\n code: '',\n name: name,\n description: description || `New workflow: ${name}`,\n isNew: true,\n });\n }\n\n // Update existing workflow\n async updateWorkflow(\n workflowName: string,\n description?: string\n ): Promise<Workflow[]> {\n // Update metadata\n this.updateWorkflowMetadata({\n name: workflowName,\n description: description || this.currentWorkflowMetadata.description,\n });\n\n // Save with updated metadata\n return this.saveWorkflow();\n }\n\n // Load all workflows\n async loadWorkflows(): Promise<Workflow[]> {\n try {\n const data = await this.service.getWorkflows(0, 0, 'createdAt', 'ASC');\n if (data instanceof ErrorResponse) {\n this.utilSvc.showError(data.ErrorMsg);\n return [];\n }\n return data.Result;\n } catch (error) {\n console.error('Error loading workflows:', error);\n throw error;\n }\n }\n\n // Load forms\n async loadForms(): Promise<FormEntity[]> {\n try {\n const data = await this.service.getForms(0, 0, 'createdAt', 'ASC');\n if (data instanceof ErrorResponse) {\n this.utilSvc.showError(data.ErrorMsg);\n return [];\n }\n return data.Result;\n } catch (error) {\n console.error('Error loading forms:', error);\n throw error;\n }\n }\n\n // Load tags\n async loadTags(): Promise<Tag[]> {\n try {\n const data = await this.service.getTags(0, 0, 'createdAt', 'ASC');\n if (data instanceof ErrorResponse) {\n this.utilSvc.showError(data.ErrorMsg);\n return [];\n }\n return data.Result;\n } catch (error) {\n console.error('Error loading tags:', error);\n throw error;\n }\n }\n}\n","// services/node-precondition.service.ts\nimport { Injectable, signal, inject } from '@angular/core';\nimport { WorkflowObjectType, Position } from '../models/types';\nimport { WorkflowPersistenceService } from './wf-persistence.service';\nimport { FormEntity } from 'verben-workflow-ui/src/lib/models';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\n\nexport interface PreconditionData {\n type: 'form' | 'subflow' | 'swimlane' | 'decision';\n id?: string;\n name?: string;\n tags?: Tag[];\n condition?: string;\n}\n\nexport interface PendingNode {\n type: WorkflowObjectType;\n position: Position;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodePreconditionService {\n private persistence = inject(WorkflowPersistenceService);\n\n private preconditionRequired = new Set([\n 'form',\n 'subflow',\n 'swimlane',\n 'decision',\n ]);\n\n private pendingNodeSignal = signal<PendingNode | null>(null);\n readonly pendingNode = this.pendingNodeSignal.asReadonly();\n\n // Replace mock data signals with real data signals\n private formOptions = signal<PreconditionData[]>([]);\n private workflowOptions = signal<PreconditionData[]>([]);\n private tagOptions = signal<Tag[]>([]);\n\n // Add readonly accessors\n readonly forms = this.formOptions.asReadonly();\n readonly workflows = this.workflowOptions.asReadonly();\n readonly tags = this.tagOptions.asReadonly();\n\n // Add initialization method to load real data\n async initializeData(): Promise<void> {\n try {\n const [forms, workflows, tags] = await Promise.all([\n this.persistence.loadForms(),\n this.persistence.loadWorkflows(),\n this.persistence.loadTags(),\n ]);\n\n this.formOptions.set(\n forms.map((form) => ({\n type: 'form',\n id: form.Id,\n name: form.Name,\n }))\n );\n\n this.workflowOptions.set(\n workflows.map((workflow) => ({\n type: 'subflow',\n id: workflow.Id,\n name: workflow.Name,\n }))\n );\n\n this.tagOptions.set(tags);\n } catch (error) {\n console.error('Failed to load precondition data:', error);\n }\n }\n\n requiresPrecondition(type: WorkflowObjectType): boolean {\n return this.preconditionRequired.has(type);\n }\n\n setPendingNode(type: WorkflowObjectType, position: Position): void {\n this.pendingNodeSignal.set({ type, position });\n }\n\n clearPendingNode(): void {\n this.pendingNodeSignal.set(null);\n }\n\n async getItems(type: WorkflowObjectType): Promise<PreconditionData[]> {\n switch (type) {\n case 'form':\n return this.mapForms(await this.persistence.loadForms());\n case 'subflow':\n return this.mapWorkflows(await this.persistence.loadWorkflows());\n case 'swimlane':\n return this.mapTags(await this.persistence.loadTags());\n case 'decision':\n return this.getDecisionConditions();\n default:\n return [];\n }\n }\n\n private mapForms(forms: FormEntity[]): PreconditionData[] {\n return forms.map((form) => ({\n type: 'form',\n id: form.Id,\n name: form.Name,\n }));\n }\n\n private mapWorkflows(workflows: Workflow[]): PreconditionData[] {\n return workflows.map((workflow) => ({\n type: 'subflow',\n id: workflow.Id,\n name: workflow.Name,\n }));\n }\n\n private mapTags(tags: Tag[]): PreconditionData[] {\n return [\n {\n type: 'swimlane',\n tags: tags,\n },\n ];\n }\n\n private getDecisionConditions(): PreconditionData[] {\n return [\n {\n type: 'decision',\n condition: '', // Empty condition to be filled by user\n },\n ];\n }\n}\n","// Update imports\nimport { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, inject, Output } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { DropDownModule, VerbenDialogueModule } from 'verben-ng-ui';\nimport { Tag } from 'verben-workflow-ui/src/lib/models';\nimport {\n NodePreconditionService,\n PreconditionData,\n} from '../services/node-precondition.service';\n\n@Component({\n selector: 'wf-node-selector',\n standalone: true,\n imports: [CommonModule, VerbenDialogueModule, FormsModule, DropDownModule],\n template: `\n <verben-dialogue\n [isVisible]=\"!!preconditionService.pendingNode()\"\n [showCloseIcon]=\"true\"\n [dismissOutsideClick]=\"true\"\n [closeOnEscape]=\"true\"\n [size]=\"'small'\"\n [mode]=\"'dialogue'\"\n [customClass]=\"'precondition-dialogue'\"\n [headerTemplate]=\"headerTemplate\"\n [bodyTemplate]=\"bodyTemplate\"\n (closeModal)=\"onModalClose($event)\"\n >\n </verben-dialogue>\n\n <ng-template #headerTemplate>\n <h3 class=\"text-lg font-semibold\">{{ getDialogTitle() }}</h3>\n </ng-template>\n\n <ng-template #bodyTemplate>\n <div class=\"p-6\">\n @switch (preconditionService.pendingNode()?.type) { @case ('swimlane') {\n <div class=\"space-y-4\">\n <verben-drop-down\n [multiselect]=\"true\"\n display=\"chip\"\n [required]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Tags\"\n optionLabel=\"Name\"\n styleClass=\"w-full\"\n [options]=\"preconditionService.tags()\"\n [(ngModel)]=\"selectedTags\"\n (onChange)=\"onTagSelectionChange($event)\"\n ></verben-drop-down>\n\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!selectedTags.length\"\n (click)=\"onTagsSubmit()\"\n >\n Apply Tags\n </button>\n </div>\n } @case ('decision') {\n <div class=\"space-y-4\">\n <div>\n <label class=\"block text-sm font-medium mb-2\">Condition</label>\n <textarea\n class=\"w-full p-2 border rounded-md\"\n rows=\"3\"\n [(ngModel)]=\"condition\"\n placeholder=\"Enter condition...\"\n ></textarea>\n </div>\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!condition\"\n (click)=\"onConditionSubmit()\"\n >\n Apply Condition\n </button>\n </div>\n } @case ('form') {\n <div class=\"space-y-4\">\n <verben-drop-down\n [required]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Form\"\n optionLabel=\"name\"\n optionValue=\"id\"\n styleClass=\"w-full\"\n [options]=\"preconditionService.forms()\"\n [(ngModel)]=\"selectedFormId\"\n (onChange)=\"onDropdownChange($event)\"\n ></verben-drop-down>\n\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!selectedFormId\"\n (click)=\"onFormSubmit()\"\n >\n Select Form\n </button>\n </div>\n } @default {\n <div class=\"space-y-4\">\n <verben-drop-down\n [required]=\"true\"\n [filter]=\"true\"\n [showClear]=\"true\"\n placeholder=\"Select Workflow\"\n optionLabel=\"name\"\n optionValue=\"id\"\n styleClass=\"w-full\"\n [options]=\"preconditionService.workflows()\"\n [(ngModel)]=\"selectedWorkflowId\"\n (onChange)=\"onDropdownChange($event)\"\n ></verben-drop-down>\n\n <button\n class=\"w-full px-4 py-2 bg-purple-600 text-white rounded-md\"\n [disabled]=\"!selectedWorkflowId\"\n (click)=\"onWorkflowSubmit()\"\n >\n Select Workflow\n </button>\n </div>\n } }\n </div>\n </ng-template>\n `,\n})\nexport class NodeSelectorComponent {\n // Replace existing properties with these\n protected selectedTags: Tag[] = [];\n protected selectedFormId: string = '';\n protected selectedWorkflowId: string = '';\n protected condition = '';\n protected preconditionService = inject(NodePreconditionService);\n\n @Output() select = new EventEmitter<PreconditionData>();\n\n // Methods for dropdown handling\n protected onTagSelectionChange(event: any): void {\n // Handle tag selection change if needed\n console.log('Tag selection changed:', this.selectedTags);\n }\n\n protected onDropdownChange(event: any): void {\n console.log('Dropdown selection changed:', event);\n }\n\n protected onFormSubmit(): void {\n const selectedForm = this.preconditionService\n .forms()\n .find((f) => f.id === this.selectedFormId);\n if (selectedForm) {\n this.select.emit(selectedForm);\n }\n }\n\n protected onWorkflowSubmit(): void {\n const selectedWorkflow = this.preconditionService\n .workflows()\n .find((w) => w.id === this.selectedWorkflowId);\n if (selectedWorkflow) {\n this.select.emit(selectedWorkflow);\n }\n }\n\n protected getDialogTitle(): string {\n const type = this.preconditionService.pendingNode()?.type;\n switch (type) {\n case 'form':\n return 'Select Form';\n case 'subflow':\n return 'Select Workflow';\n case 'swimlane':\n return 'Select Tags';\n case 'decision':\n return 'Set Condition';\n default:\n return 'Select';\n }\n }\n\n protected onTagsSubmit(): void {\n this.select.emit({\n type: 'swimlane',\n id: crypto.randomUUID(),\n name: 'Swimlane',\n tags: this.selectedTags,\n });\n }\n\n protected onConditionSubmit(): void {\n this.select.emit({\n type: 'decision',\n id: crypto.randomUUID(),\n name: 'Decision',\n condition: this.condition,\n });\n }\n\n protected onSelect(data: PreconditionData): void {\n this.select.emit(data);\n }\n\n onModalClose(event: any): void {\n this.preconditionService.clearPendingNode();\n }\n}\n","// services/viewport.service.ts\nimport { Injectable, ElementRef } from '@angular/core';\nimport { Position } from '../models/types';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ViewportService {\n getCanvasPoint(\n event: MouseEvent,\n canvasRef: ElementRef<SVGElement>\n ): Position {\n const rect = canvasRef.nativeElement.getBoundingClientRect();\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n }\n\n snapToGrid(position: Position, gridSize: number): Position {\n return {\n x: Math.round(position.x / gridSize) * gridSize,\n y: Math.round(position.y / gridSize) * gridSize,\n };\n }\n\n getObjectTransform(position: Position): string {\n return `translate(${position.x}, ${position.y})`;\n }\n}\n","// services/position-update.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, Action } from '../models/types';\nimport { WorkflowStateService } from './wf-state.service';\nimport { ConnectionService } from './connection.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PositionUpdateService {\n private workflowState = inject(WorkflowStateService);\n private connection = inject(ConnectionService);\n\n updateNodeWithConnections(nodeId: string, newPosition: Position): void {\n // Update node position\n this.workflowState.updateObject(nodeId, { position: newPosition });\n\n // Update connected paths\n const connections = this.workflowState\n .connections()\n .filter((conn) => conn.fromId === nodeId || conn.toId === nodeId);\n\n const updates = this.getConnectionUpdates(nodeId, newPosition, connections);\n if (updates.length > 0) {\n this.workflowState.updateMultipleObjects(updates);\n }\n }\n\n private getConnectionUpdates(\n nodeId: string,\n newPosition: Position,\n connections: Action[]\n ): { id: string; changes: Partial<Action> }[] {\n return connections\n .map((conn) => {\n const sourceNode = this.workflowState.getObjectById(conn.fromId);\n const targetNode = this.workflowState.getObjectById(conn.toId);\n\n if (!sourceNode || !targetNode) return null;\n\n const points = this.connection.recalculateConnectionPoints(\n sourceNode,\n targetNode,\n conn.points\n );\n\n return {\n id: conn.id,\n changes: { points } as Partial<Action>,\n };\n })\n .filter(\n (update): update is NonNullable<typeof update> => update !== null\n );\n }\n}\n","// services/node-interaction.service.ts\nimport { Injectable, inject } from '@angular/core';\nimport { Position, WorkflowObject } from '../models/types';\nimport { ViewportService } from './viewport.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { CanvasStateService } from './canvas-state.service';\nimport { PositionUpdateService } from './position-update.service';\nimport { NodeFinderService } from './node-finder.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NodeInteractionService {\n private viewport = inject(ViewportService);\n private workflowState = inject(WorkflowStateService);\n private canvasState = inject(CanvasStateService);\n private positionUpdate = inject(PositionUpdateService);\n private nodeFinder = inject(NodeFinderService);\n\n // Use nodeFinder instead of direct implementation\n findNodeAtPoint(point: Position): WorkflowObject | null {\n return this.nodeFinder.findNodeAtPoint(point);\n }\n\n private isPointInNode(point: Position, node: WorkflowObject): boolean {\n return (\n point.x >= node.position.x &&\n point.x <= node.position.x + node.size.width &&\n point.y >= node.position.y &&\n point.y <= node.position.y + node.size.height\n );\n }\n\n startDragging(node: WorkflowObject, point: Position): void {\n if (this.isProtectedNode(node)) return;\n\n this.canvasState.setDragging(true);\n this.canvasState.setDragStartPosition(point);\n this.workflowState.setSelectedObject(node.id);\n\n // Calculate offset from node position to click position\n this.canvasState.setDragOffset({\n x: point.x - node.position.x,\n y: point.y - node.position.y,\n });\n }\n\n handleDragging(currentPoint: Position, gridSize: number): void {\n const objectId = this.workflowState.selectedObjectId();\n\n if (!objectId) return;\n\n const selectedNode = this.workflowState.getObjectById(objectId);\n if (!selectedNode) return;\n\n const { dragOffset } = this.canvasState.canvasState();\n\n const newPosition = {\n x: currentPoint.x - dragOffset.x,\n y: currentPoint.y - dragOffset.y,\n };\n\n // Snap to grid\n const snappedPosition = this.viewport.snapToGrid(newPosition, gridSize);\n\n // Find nearest swimlane if applicable\n const nearestSwimlane = this.findNearestSwimlane(snappedPosition);\n if (nearestSwimlane) {\n snappedPosition.y =\n nearestSwimlane.position.y +\n (nearestSwimlane.size.height - selectedNode.size.height) / 2;\n }\n\n // Update node position\n this.workflowState.updateObject(selectedNode.id, {\n position: snappedPosition,\n });\n\n // Use the new service\n this.positionUpdate.updateNodeWithConnections(\n selectedNode.id,\n snappedPosition\n );\n }\n\n finalizeDragging(finalPoint: Position): void {\n const objectId = this.workflowState.selectedObjectId();\n\n if (!objectId) return;\n\n const selectedNode = this.workflowState.getObjectById(objectId);\n if (!selectedNode) return;\n\n // Perform any final position adjustments\n const boundedPosition = this.keepWithinBounds(\n selectedNode.position,\n this.canvasState.canvasState().width,\n this.canvasState.canvasState().height\n );\n\n if (boundedPosition !== selectedNode.position) {\n this.workflowState.updateObject(selectedNode.id, {\n position: boundedPosition,\n });\n }\n }\n\n private findNearestSwimlane(position: Position): WorkflowObject | null {\n const swimlanes = this.workflowState.swimlanes();\n for (const swimlane of swimlanes) {\n if (\n position.y >= swimlane.position.y &&\n position.y <= swimlane.position.y + swimlane.size.height\n ) {\n return swimlane;\n }\n }\n return null;\n }\n\n private keepWithinBounds(\n position: Position,\n width: number,\n height: number\n ): Position {\n return {\n x: Math.max(0, Math.min(position.x, width - 100)), // 100 is minimum node width\n y: Math.max(0, Math.min(position.y, height - 60)), // 60 is minimum node height\n };\n }\n\n private isProtectedNode(node: WorkflowObject): boolean {\n return ['start', 'swimlane'].includes(node.type);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { WorkflowStateService } from './wf-state.service';\nimport { WorkflowObject } from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SwimlaneManagementService {\n private workflowState = inject(WorkflowStateService);\n private canvasState = inject(CanvasStateService);\n private readonly DEFAULT_SWIMLANE_HEIGHT = 260;\n\n createSwimlane(clickPosition: number): void {\n const swimlanes = this.workflowState.swimlanes();\n const canvasWidth = this.canvasState.canvasState().width;\n\n // Calculate the new swimlane's position\n const newPosition = this.calculateNewSwimlanePosition(\n clickPosition,\n swimlanes\n );\n\n const newSwimlane: WorkflowObject = {\n id: crypto.randomUUID(),\n type: 'swimlane',\n position: { x: 0, y: this.findNearestSwimlanePosition(clickPosition) },\n size: { width: canvasWidth - 40, height: this.DEFAULT_SWIMLANE_HEIGHT },\n label: `Swimlane ${swimlanes.length + 1}`,\n };\n\n this.workflowState.addObject(newSwimlane);\n this.reorderSwimlanes();\n }\n\n getVerticalCenterForSwimlane(swimlaneY: number): number {\n return swimlaneY + this.DEFAULT_SWIMLANE_HEIGHT / 2;\n }\n\n getSwimlaneHeight(): number {\n return this.DEFAULT_SWIMLANE_HEIGHT;\n }\n\n private calculateNewSwimlanePosition(\n clickY: number,\n swimlanes: WorkflowObject[]\n ): number {\n if (swimlanes.length === 0) return 0;\n\n // Sort swimlanes by vertical position\n const sortedSwimlanes = [...swimlanes].sort(\n (a, b) => a.position.y - b.position.y\n );\n\n // Find the appropriate insertion point based on click position\n for (let i = 0; i < sortedSwimlanes.length; i++) {\n const swimlane = sortedSwimlanes[i];\n if (clickY < swimlane.position.y + swimlane.size.height / 2) {\n return i * this.DEFAULT_SWIMLANE_HEIGHT;\n }\n }\n\n // If click is below all existing swimlanes, add to the end\n return sortedSwimlanes.length * this.DEFAULT_SWIMLANE_HEIGHT;\n }\n\n // reorderSwimlanes(): void {\n // const swimlanes = [...this.workflowState.swimlanes()].sort(\n // (a, b) => a.position.y - b.position.y\n // );\n\n // const updates = swimlanes.map((swimlane, index) => ({\n // id: swimlane.id,\n // changes: {\n // position: { x: 0, y: index * this.DEFAULT_SWIMLANE_HEIGHT },\n // size: { ...swimlane.size },\n // },\n // }));\n\n // this.workflowState.updateMultipleObjects(updates);\n // }\n\n reorderSwimlanes(): void {\n const swimlanes = [...this.workflowState.swimlanes()].sort(\n (a, b) => a.position.y - b.position.y\n );\n\n // Update positions and adjust contained nodes\n swimlanes.forEach((swimlane, index) => {\n const oldY = swimlane.position.y;\n const newY = index * this.DEFAULT_SWIMLANE_HEIGHT;\n\n // Update swimlane position\n this.workflowState.updateObject(swimlane.id, {\n position: { x: 0, y: newY },\n size: { ...swimlane.size, height: this.DEFAULT_SWIMLANE_HEIGHT },\n });\n\n // If position changed, adjust contained nodes\n if (oldY !== newY) {\n this.adjustNodesInSwimlane(swimlane.id, oldY, newY);\n }\n });\n }\n\n private adjustNodesInSwimlane(\n swimlaneId: string,\n oldY: number,\n newY: number\n ): void {\n const nodes = this.workflowState.nodes();\n const swimlane = this.workflowState.getObjectById(swimlaneId);\n if (!swimlane) return;\n\n nodes.forEach((node) => {\n if (this.isNodeInSwimlane(node, swimlane)) {\n const relativeY = node.position.y - oldY; // Position relative to old swimlane top\n const newNodeY = newY + relativeY; // Maintain relative position in new location\n\n this.workflowState.updateObject(node.id, {\n position: { ...node.position, y: newNodeY },\n });\n }\n });\n }\n\n private isNodeInSwimlane(\n node: WorkflowObject,\n swimlane: WorkflowObject\n ): boolean {\n return (\n node.position.y >= swimlane.position.y &&\n node.position.y <= swimlane.position.y + swimlane.size.height\n );\n }\n\n resizeSwimlanesForCanvas(canvasWidth: number): void {\n const swimlanes = this.workflowState.swimlanes();\n const updates = swimlanes.map((swimlane) => ({\n id: swimlane.id,\n changes: {\n size: { width: canvasWidth - 40, height: this.DEFAULT_SWIMLANE_HEIGHT },\n },\n }));\n\n this.workflowState.updateMultipleObjects(updates);\n }\n\n getTotalHeight(): number {\n const swimlanes = this.workflowState.swimlanes();\n return swimlanes.length * this.DEFAULT_SWIMLANE_HEIGHT;\n }\n\n swapSwimlanes(swimlane1Id: string, swimlane2Id: string): void {\n const swimlane1 = this.workflowState.getObjectById(swimlane1Id);\n const swimlane2 = this.workflowState.getObjectById(swimlane2Id);\n\n if (!swimlane1 || !swimlane2) return;\n\n const temp = swimlane1.position.y;\n this.workflowState.updateObject(swimlane1Id, {\n position: { ...swimlane1.position, y: swimlane2.position.y },\n });\n this.workflowState.updateObject(swimlane2Id, {\n position: { ...swimlane2.position, y: temp },\n });\n\n this.reorderSwimlanes();\n }\n\n findNearestSwimlanePosition(yPosition: number): number {\n const swimlanes = this.workflowState.swimlanes();\n if (swimlanes.length === 0) return 0;\n\n const sortedSwimlanes = [...swimlanes].sort(\n (a, b) => a.position.y - b.position.y\n );\n\n // Find the first swimlane that's below the given position\n for (let i = 0; i < sortedSwimlanes.length; i++) {\n if (sortedSwimlanes[i].position.y > yPosition) {\n return i * sortedSwimlanes[0].size.height;\n }\n }\n\n // If no swimlane is below, add to the end\n return sortedSwimlanes.length * sortedSwimlanes[0].size.height;\n }\n}\n","// services/workflow-facade.service.ts\nimport { Injectable, inject, ElementRef } from '@angular/core';\nimport {\n WorkflowObject,\n Position,\n Action,\n WorkflowObjectType,\n SubFlow,\n Form,\n Swimlane,\n Decision,\n} from '../models/types';\nimport { CanvasStateService } from './canvas-state.service';\nimport { ViewportService } from './viewport.service';\nimport { NodeInteractionService } from './node-interaction.service';\nimport { ConnectionService } from './connection.service';\nimport { RenderingService } from './rendering.service';\nimport { NodeSelectionService } from './node-selection.service';\nimport { WorkflowStateService } from './wf-state.service';\nimport { SwimlaneManagementService } from './swimlane-management.service';\nimport { WorkflowPersistenceService } from './wf-persistence.service';\nimport { ConnectionSegmentInteractionService } from './connection-segment-interaction.service';\nimport {\n NodePreconditionService,\n PreconditionData,\n} from './node-precondition.service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class WorkflowFacadeService {\n private workflowState = inject(WorkflowStateService);\n private viewport = inject(ViewportService);\n private nodeInteraction = inject(NodeInteractionService);\n connection = inject(ConnectionService);\n rendering = inject(RenderingService);\n selection = inject(NodeSelectionService);\n private canvasStateService = inject(CanvasStateService);\n private swimlaneManagement = inject(SwimlaneManagementService);\n public persistence = inject(WorkflowPersistenceService);\n private segmentInteraction = inject(ConnectionSegmentInteractionService);\n public preconditionService = inject(NodePreconditionService);\n\n // Canvas State Accessors\n readonly canvasState = this.canvasStateService.canvasState;\n readonly workflowObjects = this.workflowState.objects;\n readonly selectedObjectId = this.workflowState.selectedObjectId;\n readonly selectedTool = this.workflowState.selectedTool;\n\n // Filtered Object Accessors\n readonly nodes = this.workflowState.nodes;\n readonly swimlanes = this.workflowState.swimlanes;\n readonly connections = this.workflowState.connections;\n\n // Rendering Methods\n getNodeStyle = this.rendering.getNodeStyle;\n getConnectionStyle = this.rendering.getConnectionStyle;\n getStartNodePaths = this.rendering.getStartNodePaths;\n getNodeTransforms = this.rendering.getNodeTransforms;\n getGridPattern = this.rendering.getGridPattern;\n\n // Connection methods\n getConnectionPath(points: Position[]): string {\n return this.rendering.getConnectionPath(points);\n }\n // Added these getter methods to expose connection service functionality\n getConnectionPreviewPath = () => this.connection.getPreviewPath();\n hasOutgoingConnections = (nodeId: string) =>\n this.connection.hasOutgoingConnections(nodeId);\n\n // Segment interaction methods\n handleSegmentMouseDown(\n event: MouseEvent,\n canvasRef: ElementRef<SVGElement>,\n connectionId: string,\n segmentIndex: number\n ): void {\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n this.segmentInteraction.startDragging(connectionId, segmentIndex, point);\n this.canvasStateService.setDragging(true);\n }\n\n getSegmentCursor(connectionId: string, segmentIndex: number): string {\n return this.segmentInteraction.getSegmentCursor(connectionId, segmentIndex);\n }\n\n // Mouse Event Handlers\n handleMouseDown(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n if (event.button !== 0) return;\n\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n const clickedNode = this.nodeInteraction.findNodeAtPoint(\n point\n // this.nodes()\n );\n\n if (this.selectedTool() === 'action' && clickedNode) {\n this.connection.startConnection(clickedNode, point);\n } else if (this.selectedTool()) {\n this.handleToolPlacement(point);\n } else if (clickedNode) {\n if (\n event.target instanceof Element &&\n event.target.classList.contains('properties-indicator')\n ) {\n // Handle properties click\n return;\n }\n this.nodeInteraction.startDragging(clickedNode, point);\n } else {\n this.selection.handleClickOutside(event);\n }\n }\n\n handleMouseMove(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n const { isConnecting, isDragging } = this.canvasState();\n\n if (isConnecting) {\n this.connection.updateConnectionPreview(point);\n } else if (isDragging) {\n // this.nodeInteraction.handleDragging(point, this.canvasState().gridSize);\n if (this.segmentInteraction.isDragging()) {\n this.segmentInteraction.updateDragging(point);\n } else {\n this.nodeInteraction.handleDragging(point, this.canvasState().gridSize);\n }\n }\n }\n\n handleMouseUp(event: MouseEvent, canvasRef: ElementRef<SVGElement>): void {\n const point = this.viewport.getCanvasPoint(event, canvasRef);\n const { isConnecting, isDragging } = this.canvasState();\n\n if (isConnecting) {\n this.connection.finalizeConnection(point);\n } else if (isDragging) {\n // this.nodeInteraction.finalizeDragging(point);\n if (this.segmentInteraction.isDragging()) {\n this.segmentInteraction.finishDragging();\n } else {\n this.nodeInteraction.finalizeDragging(point);\n }\n }\n\n this.canvasStateService.resetInteractionState();\n }\n\n handleMouseLeave(): void {\n this.canvasStateService.resetInteractionState();\n }\n\n // Tool and Object Management\n handleToolSelection(tool: WorkflowObjectType | null): void {\n this.workflowState.setSelectedTool(tool);\n this.selection.handleToolSelection(tool);\n }\n\n // private handleToolPlacement(point: Position): void {\n // console.log('Tool placement triggered', {\n // selectedTool: this.selectedTool(),\n // point,\n // });\n\n // if (this.selectedTool() === 'swimlane') {\n // this.swimlaneManagement.createSwimlane(point.y);\n // console.log(\n // 'Swimlane created, current swimlanes:',\n // this.workflowState.swimlanes()\n // );\n // this.workflowState.setSelectedTool(null);\n // return;\n // }\n\n // const newNode: WorkflowObject = {\n // id: crypto.randomUUID(),\n // type: this.selectedTool()!,\n // position: this.viewport.snapToGrid(point, this.canvasState().gridSize),\n // size: this.getDefaultSize(this.selectedTool()!),\n // label: `New ${this.selectedTool()}`,\n // };\n\n // this.workflowState.addObject(newNode);\n // this.workflowState.setSelectedTool(null);\n // }\n private handleToolPlacement(point: Position): void {\n if (!this.selectedTool()) return;\n\n const nodeType = this.selectedTool()!;\n\n // Check if precondition is required\n if (this.preconditionService.requiresPrecondition(nodeType)) {\n this.preconditionService.setPendingNode(nodeType, point);\n return; // Don't create node yet\n }\n\n // Create node immediately if no precondition required\n this.createNode(nodeType, point);\n }\n\n private createNode(\n type: WorkflowObjectType,\n position: Position,\n selectedData?: PreconditionData\n ): void {\n const baseNode = {\n id: crypto.randomUUID(),\n type: type,\n position: this.viewport.snapToGrid(position, this.canvasState().gridSize),\n size: this.getDefaultSize(type),\n };\n\n let nodeData;\n switch (type) {\n case 'form':\n case 'subflow':\n nodeData = {\n ...baseNode,\n label: selectedData?.name || `New ${type}`,\n referenceId: selectedData?.id,\n } as SubFlow | Form;\n break;\n\n case 'swimlane':\n nodeData = {\n ...baseNode,\n label: selectedData?.name || 'Swimlane',\n tags: selectedData?.tags || [],\n order: this.workflowState.swimlanes().length, // Add order based on current swimlane count\n } as Swimlane;\n break;\n\n case 'decision':\n nodeData = {\n ...baseNode,\n label: selectedData?.name || 'Decision',\n condition: selectedData?.condition || '',\n } as Decision;\n break;\n\n default:\n nodeData = {\n ...baseNode,\n label: `New ${type}`,\n };\n }\n\n this.workflowState.addObject(nodeData);\n this.workflowState.setSelectedTool(null);\n }\n\n // Call this when a form/subflow is selected\n finalizeNodeCreation(selectedData: PreconditionData): void {\n const pendingNode = this.preconditionService.pendingNode();\n if (!pendingNode) return;\n\n this.createNode(pendingNode.type, pendingNode.position, selectedData);\n\n this.preconditionService.clearPendingNode();\n }\n\n handleSwimlaneCreation(point: Position): void {\n const swimlaneManagement = inject(SwimlaneManagementService);\n swimlaneManagement.createSwimlane(point.y);\n }\n\n private getDefaultSize(type: WorkflowObjectType): {\n width: number;\n height: number;\n } {\n const sizes = {\n stage: { width: 120, height: 80 },\n action: { width: 40, height: 40 },\n form: { width: 75, height: 96 }, // Exact size from design SVG\n decision: { width: 100, height: 100 },\n subflow: { width: 120, height: 80 },\n swimlane: { width: 0, height: 0 }, // Handled separately\n start: { width: 58, height: 46 },\n };\n return sizes[type];\n }\n\n // Initialization\n initializeWorkflow(): void {\n this.workflowState.initializeWorkflow();\n }\n}\n","// components/workflow/canvas/wf-canvas.component.ts\nimport {\n Component,\n ViewChild,\n ElementRef,\n Input,\n Output,\n EventEmitter,\n inject,\n HostListener,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WorkflowFacadeService } from '../services/wf-facade.service';\nimport { LabelEditorComponent } from './label-editor.component';\nimport { LabelManagementService } from '../services/label-management.service';\nimport { SwimlaneLabelComponent } from './swimlane-label.component';\nimport { SwimLanePopupComponent } from './swimlane-popup.component';\nimport { SwimlaneStatsService } from '../services/swimlane-stats.service';\nimport { Position } from '../models/types';\nimport { KeyboardHandlerService } from '../services/keyboard-handler.service';\nimport { NodeSelectorComponent } from './node-selector.component';\nimport {\n NodePreconditionService,\n PreconditionData,\n} from '../services/node-precondition.service';\n\n@Component({\n selector: 'wf-canvas',\n standalone: true,\n imports: [\n CommonModule,\n LabelEditorComponent,\n SwimlaneLabelComponent,\n SwimLanePopupComponent,\n NodeSelectorComponent,\n ],\n template: `\n <div\n class=\"canvas-container\"\n #container\n [class.connecting]=\"facade.canvasState().isConnecting\"\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave()\"\n >\n <svg\n #canvas\n [attr.width]=\"facade.canvasState().width\"\n [attr.height]=\"facade.canvasState().height\"\n >\n <!-- Grid Pattern -->\n <defs>\n <pattern\n id=\"grid\"\n [attr.width]=\"facade.canvasState().gridSize\"\n [attr.height]=\"facade.canvasState().gridSize\"\n patternUnits=\"userSpaceOnUse\"\n >\n <path\n [attr.d]=\"facade.getGridPattern().path.d\"\n [ngStyle]=\"facade.getGridPattern().path.style\"\n />\n </pattern>\n </defs>\n\n <!-- Background grid -->\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n\n <!-- Swimlanes -->\n @for (swimlane of facade.swimlanes(); track swimlane.id) {\n <g [attr.transform]=\"facade.getNodeTransforms(swimlane).node\">\n <rect\n [attr.width]=\"swimlane.size.width\"\n [attr.height]=\"swimlane.size.height\"\n [ngStyle]=\"facade.rendering.getSwimlaneStyle()\"\n />\n <!-- <text\n x=\"100\"\n y=\"20\"\n [ngStyle]=\"facade.rendering.getLabelStyle('swimlane')\"\n >\n {{ swimlane.label }}\n </text> -->\n <!-- <foreignObject\n [attr.x]=\"labelService.getLabelPosition(swimlane).x\"\n [attr.y]=\"labelService.getLabelPosition(swimlane).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible;\"\n >\n <wf-label-editor\n [label]=\"swimlane.label || 'New Swimlane'\"\n [x]=\"0\"\n [y]=\"0\"\n [isSwimlane]=\"true\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n />\n </foreignObject> -->\n\n <!-- <g\n wf-swimlane-label\n [label]=\"swimlane.label\"\n [count]=\"swimlaneStats.getNodeCount(swimlane.id)\"\n [x]=\"20\"\n [y]=\"swimlane.size.height - 20\"\n (addClick)=\"onSwimlaneAddClick($event, swimlane)\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n /> -->\n\n <g transform=\"translate(30, 20)\">\n <g\n wf-swimlane-label\n [label]=\"swimlane.label\"\n [count]=\"swimlaneStats.getNodeCount(swimlane.id)\"\n (addClick)=\"onSwimlaneAddClick($event, swimlane)\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n />\n </g>\n\n <!-- <foreignObject\n [attr.x]=\"50\"\n [attr.y]=\"20\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible;\"\n >\n <wf-label-editor\n [label]=\"swimlane.label || 'New Swimlane'\"\n [x]=\"0\"\n [y]=\"0\"\n [isSwimlane]=\"true\"\n (labelChange)=\"updateLabel(swimlane.id, $event)\"\n />\n </foreignObject> -->\n </g>\n }\n\n <!-- Connections with labels -->\n @for (connection of facade.connections(); track connection.id) {\n <g\n class=\"connection\"\n [class.selected]=\"facade.selection.isSelected(connection.id)\"\n >\n <!-- <path\n [attr.d]=\"facade.getConnectionPath(connection.points)\"\n [ngStyle]=\"\n facade.getConnectionStyle(\n facade.selection.isSelected(connection.id)\n )\n \"\n /> -->\n <!-- Complete connection path with arrowhead -->\n <path\n [attr.d]=\"facade.getConnectionPath(connection.points)\"\n [ngStyle]=\"\n facade.getConnectionStyle(\n facade.selection.isSelected(connection.id)\n )\n \"\n />\n <!-- Render segments -->\n @for (point of connection.points; let i = $index; track i) { @if (i <\n connection.points.length - 1) {\n <!-- Interactive segment -->\n <!-- <path\n [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n [ngStyle]=\"\n facade.getConnectionStyle(\n facade.selection.isSelected(connection.id)\n )\n \"\n [style.cursor]=\"facade.getSegmentCursor(connection.id, i)\"\n (mousedown)=\"onSegmentMouseDown($event, connection.id, i)\"\n class=\"connection-segment\"\n /> -->\n <g\n class=\"segment-group\"\n (mouseenter)=\"\n hoveredSegment = { connectionId: connection.id, index: i }\n \"\n (mouseleave)=\"hoveredSegment = null\"\n >\n <!-- Hit detection area -->\n <path\n [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n class=\"segment-hitarea\"\n [style.cursor]=\"facade.getSegmentCursor(connection.id, i)\"\n (mousedown)=\"onSegmentMouseDown($event, connection.id, i)\"\n />\n\n <!-- Visible segment -->\n <path\n [attr.d]=\"getSegmentPath(point, connection.points[i + 1])\"\n [ngStyle]=\"\n facade.rendering.getConnectionSegmentStyle(\n facade.selection.isSelected(connection.id),\n isSegmentHovered(connection.id, i)\n )\n \"\n />\n </g>\n } }\n <!-- Connection Label -->\n @if (connection.fromId && connection.toId) {\n <foreignObject\n [attr.x]=\"labelService.getLabelPosition(connection).x\"\n [attr.y]=\"labelService.getLabelPosition(connection).y\"\n width=\"150\"\n height=\"40\"\n style=\"overflow: visible; pointer-events: all;\"\n [attr.transform]=\"'translate(-10, -10)'\"\n >\n <wf-label-editor\n [label]=\"connection.label || 'New Action'\"\n [x]=\"0\"\n [y]=\"0\"\n [isConnection]=\"true\"\n (labelChange)=\"updateLabel(connection.id, $event)\"\n />\n </foreignObject>\n }\n </g>\n }\n\n <!-- Nodes -->\n @for (node of facade.nodes(); track node.id) {\n <g\n [attr.transform]=\"facade.getNodeTransforms(node).node\"\n [class.selected]=\"facade.selection.isSelected(node.id)\"\n [class.dragging]=\"\n facade.canvasState().isDragging &&\n facade.selection.isSelected(node.id)\n \"\n >\n @switch (node.type) { @case ('start') {\n <path\n [attr.d]=\"facade.getStartNodePaths().circle\"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n @if (!facade.hasOutgoingConnections(node.id)) {\n <path\n [attr.d]=\"facade.getStartNodePaths().arrow\"\n [attr.transform]=\"facade.getNodeTransforms(node).arrow\"\n fill=\"#D36CFF\"\n />\n } }@case ('form') {\n <path\n [attr.d]=\"facade.rendering.generateNodePath(node)\"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } @case ('decision') {\n <path\n [attr.d]=\"\n facade.rendering.getDecisionPath(\n node.size.width,\n node.size.height\n )\n \"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } @case ('subflow') {\n <path\n [attr.d]=\"\n facade.rendering.getSubflowPath(node.size.width, node.size.height)\n \"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } @default {\n <rect\n [attr.width]=\"node.size.width\"\n [attr.height]=\"node.size.height\"\n [attr.rx]=\"4\"\n [ngStyle]=\"\n facade.getNodeStyle(facade.selection.isSelected(node.id))\n \"\n />\n } }\n\n <!-- Node label -->\n <!-- <text\n [attr.x]=\"node.size.width / 2\"\n [attr.y]=\"node.size.height / 2\"\n [ngStyle]=\"facade.rendering.getLabelStyle(node.type)\"\n >\n {{ node.label }}\n </text> -->\n <foreignObject\n [attr.x]=\"0\"\n [attr.y]=\"0\"\n [attr.width]=\"node.size.width\"\n [attr.height]=\"node.size.height\"\n style=\"overflow: visible;\"\n >\n <wf-label-editor\n [label]=\"node.label\"\n [x]=\"labelService.getSVGTextPosition(node).x\"\n [y]=\"labelService.getSVGTextPosition(node).y\"\n (labelChange)=\"updateLabel(node.id, $event)\"\n />\n </foreignObject>\n </g>\n }\n\n <!-- Connection preview with arrowhead -->\n @if (facade.canvasState().connectionPreview) {\n <path\n [attr.d]=\"facade.getConnectionPreviewPath()\"\n [ngStyle]=\"facade.rendering.getConnectionPreviewStyle()\"\n />\n }\n </svg>\n\n @if (swimlaneStats.popupStatus().isOpen) {\n <wf-swimlane-popup\n [position]=\"swimlaneStats.popupStatus().position\"\n (close)=\"swimlaneStats.closePopup()\"\n (actionSelected)=\"onPopupAction($event)\"\n />\n }\n </div>\n\n <wf-node-selector\n (select)=\"onNodeSelected($event)\"\n (cancel)=\"onNodeSelectionCancelled()\"\n />\n `,\n styles: [\n `\n .canvas-container {\n flex: 1;\n overflow: auto;\n position: relative;\n background: white;\n\n &.connecting {\n cursor: crosshair;\n }\n }\n\n .connection {\n path {\n stroke: #d36cff;\n stroke-width: 2;\n fill: none;\n pointer-events: none;\n }\n\n &.selected path {\n stroke-width: 3;\n }\n }\n\n .selected {\n & :not(text) {\n stroke-width: 3;\n }\n }\n\n .dragging {\n cursor: grabbing;\n }\n\n .connection {\n pointer-events: none;\n }\n\n .segment-group {\n pointer-events: all;\n }\n\n .segment-hitarea {\n stroke: transparent;\n stroke-width: 10;\n fill: none;\n }\n `,\n ],\n})\nexport class WFCanvasComponent {\n @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('canvas') canvasRef!: ElementRef<SVGElement>;\n\n protected labelService = inject(LabelManagementService);\n protected swimlaneStats = inject(SwimlaneStatsService);\n private keyboardHandler = inject(KeyboardHandlerService);\n protected preconditionService = inject(NodePreconditionService);\n\n hoveredSegment: { connectionId: string; index: number } | null = null;\n\n constructor(public facade: WorkflowFacadeService) {}\n\n @HostListener('window:keydown', ['$event'])\n onKeyDown(event: KeyboardEvent): void {\n // Only handle keyboard events if the canvas is focused\n if (this.containerRef.nativeElement.contains(document.activeElement)) {\n this.keyboardHandler.handleKeyDown(event);\n }\n }\n\n // Add click handler to ensure the canvas can receive keyboard events\n @HostListener('click')\n onClick(): void {\n this.containerRef.nativeElement.focus();\n }\n\n updateLabel(objectId: string, newLabel: string): void {\n this.labelService.updateLabel(objectId, newLabel);\n }\n\n // Event handlers\n onMouseDown(event: MouseEvent): void {\n this.facade.handleMouseDown(event, this.canvasRef);\n }\n\n onMouseMove(event: MouseEvent): void {\n this.facade.handleMouseMove(event, this.canvasRef);\n }\n\n onMouseUp(event: MouseEvent): void {\n this.facade.handleMouseUp(event, this.canvasRef);\n }\n\n onMouseLeave(): void {\n this.facade.handleMouseLeave();\n }\n\n onSwimlaneAddClick(event: MouseEvent, swimlane: any): void {\n const rect = this.canvasRef.nativeElement.getBoundingClientRect();\n const position: Position = {\n x: event.clientX - rect.left + 20,\n y: event.clientY - rect.top,\n };\n\n this.swimlaneStats.openPopup(position, swimlane.id);\n }\n\n onPopupAction(actionId: string): void {\n const swimlaneId = this.swimlaneStats.popupStatus().swimlaneId;\n if (!swimlaneId) return;\n\n switch (actionId) {\n case 'add-above':\n // Handle adding swimlane above\n break;\n case 'add-below':\n // Handle adding swimlane below\n break;\n case 'delete':\n // Handle deletion\n break;\n }\n }\n\n getSegmentPath(start: Position, end: Position): string {\n return `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n }\n\n isSegmentHovered(connectionId: string, index: number): boolean {\n return (\n this.hoveredSegment?.connectionId === connectionId &&\n this.hoveredSegment?.index === index\n );\n }\n\n onSegmentMouseDown(\n event: MouseEvent,\n connectionId: string,\n segmentIndex: number\n ): void {\n event.stopPropagation();\n this.facade.handleSegmentMouseDown(\n event,\n this.canvasRef,\n connectionId,\n segmentIndex\n );\n }\n\n onNodeSelected(data: PreconditionData): void {\n this.facade.finalizeNodeCreation(data);\n }\n\n onNodeSelectionCancelled(): void {\n this.facade.preconditionService.clearPendingNode();\n }\n}\n","// components/workflow/wf-designer.component.ts\nimport {\n Component,\n inject,\n input,\n OnInit,\n computed,\n signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { WFToolbarComponent } from './wf-toolbar.component';\nimport { WFCanvasComponent } from './wf-canvas.component';\nimport { WorkflowFacadeService } from '../services/wf-facade.service';\nimport { WorkflowObjectType } from '../models/types';\nimport { Workflow } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService } from 'verben-workflow-ui/src/lib/services';\nimport { NodeSelectorComponent } from './node-selector.component';\nimport { PreconditionData } from '../services/node-precondition.service';\n\n@Component({\n selector: 'wf-designer',\n standalone: true,\n imports: [\n CommonModule,\n WFToolbarComponent,\n WFCanvasComponent,\n NodeSelectorComponent,\n ],\n providers: [EnvironmentService],\n template: `\n <div class=\"workflow-designer\">\n <div class=\"workflow-header\">\n <h1 class=\"workflow-title\">{{ workflowName() }}</h1>\n <p *ngIf=\"workflowDescription()\" class=\"workflow-description\">\n {{ workflowDescription() }}\n </p>\n </div>\n\n <wf-toolbar\n [selectedTool]=\"facade.selectedTool()\"\n (toolSelected)=\"handleToolSelection($event)\"\n />\n\n <wf-canvas />\n\n <div class=\"workflow-actions\">\n <button\n class=\"save-button\"\n (click)=\"handleSave()\"\n [disabled]=\"isSaving()\"\n >\n {{ isSaving() ? 'Saving...' : 'Save' }}\n </button>\n </div>\n\n <!-- Node selector dialog for forms, subflows, etc. -->\n <wf-node-selector\n (select)=\"handleNodeSelection($event)\"\n (cancel)=\"handleNodeSelectionCancel()\"\n />\n </div>\n `,\n styles: [\n `\n .workflow-designer {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: white;\n }\n\n .workflow-header {\n padding: 1rem;\n border-bottom: 1px solid #e5e7eb;\n }\n\n .workflow-title {\n font-size: 1.25rem;\n font-weight: 600;\n color: #111827;\n }\n\n .workflow-description {\n font-size: 0.875rem;\n color: #6b7280;\n margin-top: 0.25rem;\n }\n\n .workflow-actions {\n padding: 0.75rem;\n border-top: 1px solid #e5e7eb;\n display: flex;\n justify-content: flex-end;\n }\n\n .save-button {\n padding: 0.5rem 1rem;\n background-color: #9333ea;\n color: white;\n font-weight: 500;\n border-radius: 0.375rem;\n border: none;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .save-button:hover {\n background-color: #7e22ce;\n }\n\n .save-button:disabled {\n background-color: #d8b4fe;\n cursor: not-allowed;\n }\n `,\n ],\n})\nexport class WFDesignerComponent implements OnInit {\n workflowId = input.required<Workflow['Code']>();\n\n public facade = inject(WorkflowFacadeService);\n private saving = signal<boolean>(false);\n\n // Computed signals for reactive UI\n readonly workflowName = computed(\n () => this.facade.persistence.workflowMetadata.name || 'Untitled Workflow'\n );\n\n readonly workflowDescription = computed(\n () => this.facade.persistence.workflowMetadata.description || ''\n );\n\n readonly isSaving = this.saving.asReadonly();\n\n constructor() {\n this.facade.initializeWorkflow();\n }\n\n ngOnInit(): void {\n const workflowId = this.workflowId();\n if (workflowId) {\n this.loadWorkflow(workflowId);\n }\n }\n\n private loadWorkflow(workflowId: string): void {\n this.facade.persistence.loadWorkflow(workflowId).catch((error) => {\n console.error('Failed to load workflow:', error);\n // Optionally show an error notification here\n });\n }\n\n handleToolSelection(tool: WorkflowObjectType | null): void {\n this.facade.handleToolSelection(tool);\n }\n\n handleSave(): void {\n if (this.isSaving()) return;\n\n this.saving.set(true);\n\n this.facade.persistence\n .saveWorkflow()\n .then((results) => {\n console.log('Workflow saved successfully:', results);\n // Optionally show a success notification\n })\n .catch((error) => {\n console.error('Error saving workflow:', error);\n // Optionally show an error notification\n })\n .finally(() => {\n this.saving.set(false);\n });\n }\n\n handleNodeSelection(data: PreconditionData): void {\n this.facade.finalizeNodeCreation(data);\n }\n\n handleNodeSelectionCancel(): void {\n // The node selection was canceled, clear the pending node\n this.facade.preconditionService.clearPendingNode();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ConnectionService","i1","i1.WorkflowFacadeService"],"mappings":"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"}