@memberjunction/ng-flow-editor 5.43.0 → 5.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"flow-editor.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-editor.component.ts","../../../src/lib/components/flow-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy,\n ChangeDetectorRef, ViewEncapsulation, ChangeDetectionStrategy, HostListener\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { FFlowComponent, FCanvasComponent, FZoomDirective, FCreateConnectionEvent,\n FCreateNodeEvent, FSelectionChangeEvent, FCanvasChangeEvent, FMoveNodesEvent,\n FReassignConnectionEvent } from '@foblex/flow';\nimport {\n FlowNode, FlowConnection, FlowNodeTypeConfig, FlowNodeAddedEvent,\n FlowNodeMovedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent,\n FlowSelectionChangedEvent,\n FlowCanvasClickEvent, FlowPosition, FlowLayoutDirection,\n FlowContextMenuTarget, FlowContextMenuAction\n} from '../interfaces/flow-types';\nimport { FlowStateService } from '../services/flow-state.service';\nimport { FlowLayoutService } from '../services/flow-layout.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Generic, entity-agnostic visual flow editor component.\n * Wraps Foblex Flow to provide a clean MJ-style API.\n *\n * Usage:\n * ```html\n * <mj-flow-editor\n * [Nodes]=\"myNodes\"\n * [Connections]=\"myConnections\"\n * [NodeTypes]=\"myNodeTypes\"\n * (NodeSelected)=\"onNodeSelected($event)\"\n * (ConnectionCreated)=\"onConnectionCreated($event)\">\n * </mj-flow-editor>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-editor',\n templateUrl: './flow-editor.component.html',\n styleUrls: ['./flow-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [FlowStateService, FlowLayoutService]\n})\nexport class FlowEditorComponent implements OnInit, OnDestroy {\n // ── Inputs ──────────────────────────────────────────────────\n @Input() Nodes: FlowNode[] = [];\n @Input() Connections: FlowConnection[] = [];\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() ReadOnly = false;\n @Input() ShowMinimap = true;\n @Input() ShowPalette = true;\n @Input() ShowGrid = true;\n @Input() ShowStatusBar = true;\n @Input() ShowToolbar = true;\n @Input() ShowLegend = true;\n @Input() GridSize = 20;\n @Input() AutoLayoutDirection: FlowLayoutDirection = 'vertical';\n /** Background color for connection labels */\n @Input() ConnectionLabelBackground = '#fffef5';\n /** Border color for connection labels */\n @Input() ConnectionLabelBorderColor = '#cbd5e1';\n /** Text color for connection labels */\n @Input() ConnectionLabelTextColor = '#334155';\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() NodeSelected = new EventEmitter<FlowNode | null>();\n @Output() NodeAdded = new EventEmitter<FlowNodeAddedEvent>();\n @Output() NodeRemoved = new EventEmitter<FlowNode>();\n @Output() NodeMoved = new EventEmitter<FlowNodeMovedEvent>();\n @Output() ConnectionCreated = new EventEmitter<FlowConnectionCreatedEvent>();\n @Output() ConnectionRemoved = new EventEmitter<FlowConnection>();\n @Output() ConnectionReassigned = new EventEmitter<FlowConnectionReassignedEvent>();\n @Output() ConnectionSelected = new EventEmitter<FlowConnection | null>();\n @Output() SelectionChanged = new EventEmitter<FlowSelectionChangedEvent>();\n @Output() CanvasClicked = new EventEmitter<FlowCanvasClickEvent>();\n @Output() NodesChanged = new EventEmitter<FlowNode[]>();\n @Output() ConnectionsChanged = new EventEmitter<FlowConnection[]>();\n @Output() NodeEditRequested = new EventEmitter<FlowNode>();\n @Output() ConnectionEditRequested = new EventEmitter<FlowConnection>();\n @Output() GridToggled = new EventEmitter<boolean>();\n @Output() MinimapToggled = new EventEmitter<boolean>();\n @Output() LegendToggled = new EventEmitter<boolean>();\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild(FFlowComponent) protected fFlow: FFlowComponent | undefined;\n @ViewChild(FCanvasComponent) protected fCanvas: FCanvasComponent | undefined;\n @ViewChild('fZoomRef') protected fZoom: FZoomDirective | undefined;\n\n // ── Internal State ──────────────────────────────────────────\n protected zoomLevel = 100;\n protected canvasPosition = { x: 0, y: 0 };\n protected canvasScale = 1;\n protected selectedNodeIDs: string[] = [];\n protected selectedConnectionIDs: string[] = [];\n protected panMode = false;\n\n /** Trigger function for canvas panning — only allows panning in pan mode */\n protected canvasMoveTriggerFn = (_event: MouseEvent | TouchEvent): boolean => {\n return this.panMode;\n };\n\n /* Context menu state */\n protected contextMenuVisible = false;\n protected contextMenuX = 0;\n protected contextMenuY = 0;\n protected contextMenuTargetType: FlowContextMenuTarget = 'node';\n protected contextMenuNode: FlowNode | null = null;\n protected contextMenuConnection: FlowConnection | null = null;\n\n private destroy$ = new Subject<void>();\n private initialized = false;\n private lastConnectionClickTime = 0;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private stateService: FlowStateService,\n private layoutService: FlowLayoutService\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.initialized = true;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Methods ──────────────────────────────────────────\n\n /** Fit all nodes within the viewport */\n ZoomToFit(): void {\n this.fCanvas?.fitToScreen({ x: 150, y: 150 }, true);\n }\n\n /** Zoom in one step */\n ZoomIn(): void {\n if (this.fZoom) {\n this.fZoom.zoomIn();\n } else {\n const newScale = Math.min(this.canvasScale + 0.15, 3);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Zoom out one step */\n ZoomOut(): void {\n if (this.fZoom) {\n this.fZoom.zoomOut();\n } else {\n const newScale = Math.max(this.canvasScale - 0.15, 0.1);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Run auto-layout using dagre */\n AutoArrange(direction?: FlowLayoutDirection): void {\n const dir = direction ?? this.AutoLayoutDirection;\n this.pushUndoState();\n const result = this.layoutService.CalculateLayout(this.Nodes, this.Connections, dir);\n for (const node of this.Nodes) {\n const newPos = result.Positions.get(node.ID);\n if (newPos) {\n node.Position = { ...newPos };\n }\n }\n this.NodesChanged.emit(this.Nodes);\n this.cdr.detectChanges();\n // Fit to screen after layout\n setTimeout(() => this.ZoomToFit(), 100);\n }\n\n /** Center the canvas on a specific node */\n CenterOnNode(nodeId: string): void {\n this.fCanvas?.centerGroupOrNode(nodeId, true);\n }\n\n /** Programmatically select a node */\n SelectNode(nodeId: string): void {\n this.fFlow?.select([nodeId], []);\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId)) ?? null;\n this.NodeSelected.emit(node);\n }\n\n /** Clear all selection */\n ClearSelection(): void {\n this.fFlow?.clearSelection();\n this.selectedNodeIDs = [];\n this.selectedConnectionIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n\n /** Update a node's visual status */\n SetNodeStatus(nodeId: string, status: FlowNode['Status'], message?: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (node) {\n node.Status = status;\n node.StatusMessage = message;\n this.cdr.detectChanges();\n }\n }\n\n /** Update a node's visual properties and push a new object reference so\n * OnPush child components (FlowNodeComponent) detect the change. */\n UpdateNode(nodeId: string, changes: Partial<Pick<FlowNode, 'Label' | 'Subtitle' | 'Icon' | 'Status' | 'StatusMessage' | 'IsStartNode' | 'Badges' | 'Data'>>): void {\n const idx = this.Nodes.findIndex(n => UUIDsEqual(n.ID, nodeId));\n if (idx === -1) return;\n // Create a new object reference so the OnPush FlowNodeComponent picks up the change\n this.Nodes[idx] = { ...this.Nodes[idx], ...changes };\n this.cdr.detectChanges();\n }\n\n /** Update a connection's visual properties in-place (label, color, style, etc.) */\n UpdateConnection(connId: string, changes: Partial<Pick<FlowConnection, 'Label' | 'LabelIcon' | 'LabelIconColor' | 'LabelDetail' | 'Color' | 'Style' | 'Animated'>>): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n Object.assign(conn, changes);\n this.cdr.detectChanges();\n }\n\n /** Highlight a sequence of nodes (e.g., execution path) */\n HighlightPath(nodeIds: string[]): void {\n for (const node of this.Nodes) {\n if (nodeIds.some(id => UUIDsEqual(id, node.ID))) {\n node.Status = 'running';\n }\n }\n // Highlight connections along the path\n for (const conn of this.Connections) {\n const srcIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.SourceNodeID));\n const tgtIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.TargetNodeID));\n if (srcIdx >= 0 && tgtIdx >= 0 && tgtIdx === srcIdx + 1) {\n conn.Animated = true;\n }\n }\n this.cdr.detectChanges();\n }\n\n /** Clear all node status highlights */\n ClearHighlights(): void {\n for (const node of this.Nodes) {\n node.Status = 'default';\n node.StatusMessage = undefined;\n }\n for (const conn of this.Connections) {\n conn.Animated = false;\n }\n this.cdr.detectChanges();\n }\n\n /** Undo the last operation */\n Undo(): void {\n const snapshot = this.stateService.Undo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n /** Redo the last undone operation */\n Redo(): void {\n const snapshot = this.stateService.Redo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n get CanUndo(): boolean {\n return this.stateService.CanUndo;\n }\n\n get CanRedo(): boolean {\n return this.stateService.CanRedo;\n }\n\n /** Delete the currently selected nodes and connections */\n DeleteSelected(): void {\n if (this.ReadOnly || (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0)) {\n return;\n }\n this.pushUndoState();\n this.removeSelectedItems();\n this.ClearSelection();\n }\n\n // ── Foblex Event Handlers ──────────────────────────────────\n\n /** Called when Foblex flow finishes loading */\n protected onFlowLoaded(): void {\n if (this.Nodes.length > 0) {\n setTimeout(() => this.ZoomToFit(), 200);\n }\n }\n\n /** Canvas zoom/pan changed */\n protected onCanvasChange(event: FCanvasChangeEvent): void {\n this.canvasPosition = event.position;\n this.canvasScale = event.scale;\n this.updateZoomLevel(event.scale);\n }\n\n /** User drew a new connection */\n protected onCreateConnection(event: FCreateConnectionEvent): void {\n if (!event.fInputId || this.ReadOnly) return;\n this.pushUndoState();\n\n // Derive node IDs from port IDs (ports are named nodeID-input / nodeID-output)\n const sourceNodeID = this.findNodeByPortId(event.fOutputId);\n const targetNodeID = this.findNodeByPortId(event.fInputId);\n\n if (!sourceNodeID || !targetNodeID) return;\n\n // Resolve actual port IDs — when fConnectOnNode is enabled, Foblex may\n // send the node ID itself instead of a port ID. Map to the correct port.\n const sourcePortID = this.resolvePortId(event.fOutputId, sourceNodeID, 'output');\n const targetPortID = this.resolvePortId(event.fInputId, targetNodeID, 'input');\n\n // Prevent duplicate connections\n const exists = this.Connections.some(\n c => UUIDsEqual(c.SourcePortID, sourcePortID) && UUIDsEqual(c.TargetPortID, targetPortID)\n );\n if (exists) return;\n\n this.ConnectionCreated.emit({\n SourceNodeID: sourceNodeID,\n SourcePortID: sourcePortID,\n TargetNodeID: targetNodeID,\n TargetPortID: targetPortID\n });\n }\n\n /** User reassigned (dragged) an existing connection endpoint to a new node */\n protected onReassignConnection(event: FReassignConnectionEvent): void {\n if (this.ReadOnly) return;\n\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n if (!conn) return;\n\n // If dropped on empty space (no new target/source), discard the reassignment\n if (event.isTargetReassign && !event.newTargetId) return;\n if (event.isSourceReassign && !event.newSourceId) return;\n\n this.pushUndoState();\n\n const oldSourceNodeID = conn.SourceNodeID;\n const oldSourcePortID = conn.SourcePortID;\n const oldTargetNodeID = conn.TargetNodeID;\n const oldTargetPortID = conn.TargetPortID;\n\n // Resolve new endpoints\n let newSourceNodeID = oldSourceNodeID;\n let newSourcePortID = oldSourcePortID;\n let newTargetNodeID = oldTargetNodeID;\n let newTargetPortID = oldTargetPortID;\n\n if (event.isSourceReassign && event.newSourceId) {\n newSourceNodeID = this.findNodeByPortId(event.newSourceId) ?? oldSourceNodeID;\n newSourcePortID = this.resolvePortId(event.newSourceId, newSourceNodeID, 'output');\n }\n\n if (event.isTargetReassign && event.newTargetId) {\n newTargetNodeID = this.findNodeByPortId(event.newTargetId) ?? oldTargetNodeID;\n newTargetPortID = this.resolvePortId(event.newTargetId, newTargetNodeID, 'input');\n }\n\n // Prevent self-connections\n if (newSourceNodeID === newTargetNodeID) return;\n\n // Prevent duplicates\n const duplicate = this.Connections.some(\n c => !UUIDsEqual(c.ID, conn.ID) &&\n UUIDsEqual(c.SourcePortID, newSourcePortID) &&\n UUIDsEqual(c.TargetPortID, newTargetPortID)\n );\n if (duplicate) return;\n\n // Update the connection in-place\n conn.SourceNodeID = newSourceNodeID;\n conn.SourcePortID = newSourcePortID;\n conn.TargetNodeID = newTargetNodeID;\n conn.TargetPortID = newTargetPortID;\n\n this.ConnectionReassigned.emit({\n ConnectionID: conn.ID,\n OldSourceNodeID: oldSourceNodeID,\n OldSourcePortID: oldSourcePortID,\n OldTargetNodeID: oldTargetNodeID,\n OldTargetPortID: oldTargetPortID,\n NewSourceNodeID: newSourceNodeID,\n NewSourcePortID: newSourcePortID,\n NewTargetNodeID: newTargetNodeID,\n NewTargetPortID: newTargetPortID\n });\n\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n /** External item dropped from palette */\n protected onCreateNode(event: FCreateNodeEvent): void {\n if (this.ReadOnly) return;\n this.pushUndoState();\n\n const nodeType = event.data as string;\n const config = this.NodeTypes.find(nt => nt.Type === nodeType);\n if (!config) return;\n\n // event.rect is already normalized to canvas coordinates by Foblex's\n // GetNormalizedElementRectExecution (via RoundedRect.fromCenter).\n // Do NOT pass it through getPositionInFlow() again — that double-normalizes\n // and places the node far from the actual drop point.\n // Use the center of the preview rect (≈ cursor position at drop time).\n const dropPosition: FlowPosition = {\n X: event.rect.x + event.rect.width / 2,\n Y: event.rect.y + event.rect.height / 2\n };\n\n const newNode = this.createDefaultNode(config, dropPosition);\n this.NodeAdded.emit({ Node: newNode, DropPosition: dropPosition });\n }\n\n /** Selection changed in Foblex */\n protected onSelectionChange(event: FSelectionChangeEvent): void {\n const timeSinceClick = Date.now() - this.lastConnectionClickTime;\n\n // If a direct connection click just fired, skip this Foblex callback\n // to avoid double-processing / overwriting the direct click result.\n if (timeSinceClick < 200) {\n return;\n }\n\n this.selectedNodeIDs = event.fNodeIds ?? [];\n this.selectedConnectionIDs = event.fConnectionIds ?? [];\n\n this.SelectionChanged.emit({\n SelectedNodeIDs: this.selectedNodeIDs,\n SelectedConnectionIDs: this.selectedConnectionIDs\n });\n\n // Emit specific node/connection selection events.\n // IMPORTANT: When selecting a connection, emit NodeSelected(null) FIRST so\n // that consumers clear their node state before the connection event opens\n // the connection properties panel.\n if (this.selectedNodeIDs.length === 1) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, this.selectedNodeIDs[0]));\n this.ConnectionSelected.emit(null);\n this.NodeSelected.emit(node ?? null);\n } else if (this.selectedConnectionIDs.length === 1) {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, this.selectedConnectionIDs[0]));\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn ?? null);\n } else if (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0) {\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n }\n\n /** Nodes moved on canvas */\n protected onNodesMoved(event: FMoveNodesEvent): void {\n if (this.ReadOnly || !event.fNodes || event.fNodes.length === 0) return;\n this.pushUndoState();\n\n for (const moved of event.fNodes) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, moved.id));\n if (node) {\n const oldPosition = { ...node.Position };\n node.Position = { X: moved.position.x, Y: moved.position.y };\n this.NodeMoved.emit({\n NodeID: node.ID,\n OldPosition: oldPosition,\n NewPosition: node.Position\n });\n }\n }\n this.NodesChanged.emit(this.Nodes);\n }\n\n // ── Toolbar Event Handlers ─────────────────────────────────\n\n protected onGridToggled(show: boolean): void {\n this.ShowGrid = show;\n this.GridToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onMinimapToggled(show: boolean): void {\n this.ShowMinimap = show;\n this.MinimapToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onLegendToggled(show: boolean): void {\n this.ShowLegend = show;\n this.LegendToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onPanModeToggled(enabled: boolean): void {\n this.panMode = enabled;\n this.cdr.detectChanges();\n }\n\n // ── Context Menu ───────────────────────────────────────────\n\n protected onNodeContextMenu(event: MouseEvent, node: FlowNode): void {\n if (this.ReadOnly) return;\n event.preventDefault();\n event.stopPropagation();\n this.showContextMenu(event, 'node', node, null);\n }\n\n /** Direct click on a connection — ensures ConnectionSelected fires reliably */\n protected onConnectionClicked(event: MouseEvent, conn: FlowConnection): void {\n // Do NOT stopPropagation — let Foblex handle its own visual selection.\n // Record the time so onSelectionChange can skip double-processing.\n this.lastConnectionClickTime = Date.now();\n this.selectedConnectionIDs = [conn.ID];\n this.selectedNodeIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn);\n this.cdr.detectChanges();\n }\n\n protected onConnectionContextMenu(event: MouseEvent, conn: FlowConnection): void {\n if (this.ReadOnly) return;\n event.preventDefault();\n event.stopPropagation();\n this.showContextMenu(event, 'connection', null, conn);\n }\n\n protected onContextMenuAction(action: FlowContextMenuAction): void {\n this.hideContextMenu();\n\n if (action === 'edit') {\n if (this.contextMenuTargetType === 'node' && this.contextMenuNode) {\n this.NodeEditRequested.emit(this.contextMenuNode);\n } else if (this.contextMenuTargetType === 'connection' && this.contextMenuConnection) {\n this.ConnectionEditRequested.emit(this.contextMenuConnection);\n }\n } else if (action === 'remove') {\n this.pushUndoState();\n if (this.contextMenuTargetType === 'node' && this.contextMenuNode) {\n this.removeNodeById(this.contextMenuNode.ID);\n } else if (this.contextMenuTargetType === 'connection' && this.contextMenuConnection) {\n this.removeConnectionById(this.contextMenuConnection.ID);\n }\n }\n }\n\n @HostListener('document:click')\n protected onDocumentClick(): void {\n if (this.contextMenuVisible) {\n this.hideContextMenu();\n }\n }\n\n private showContextMenu(\n event: MouseEvent,\n targetType: FlowContextMenuTarget,\n node: FlowNode | null,\n connection: FlowConnection | null\n ): void {\n this.contextMenuTargetType = targetType;\n this.contextMenuNode = node;\n this.contextMenuConnection = connection;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n this.cdr.detectChanges();\n }\n\n private hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = null;\n this.contextMenuConnection = null;\n this.cdr.detectChanges();\n }\n\n private removeNodeById(nodeId: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return;\n\n this.Nodes = this.Nodes.filter(n => !UUIDsEqual(n.ID, nodeId));\n\n /* Remove connections attached to this node */\n const orphaned = this.Connections.filter(\n c => UUIDsEqual(c.SourceNodeID, nodeId) || UUIDsEqual(c.TargetNodeID, nodeId)\n );\n this.Connections = this.Connections.filter(\n c => !UUIDsEqual(c.SourceNodeID, nodeId) && !UUIDsEqual(c.TargetNodeID, nodeId)\n );\n for (const conn of orphaned) {\n this.ConnectionRemoved.emit(conn);\n }\n this.NodeRemoved.emit(node);\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private removeConnectionById(connId: string): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n\n this.Connections = this.Connections.filter(c => !UUIDsEqual(c.ID, connId));\n this.ConnectionRemoved.emit(conn);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('keydown', ['$event'])\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.ReadOnly) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n // Don't delete if user is typing in an input\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') {\n return;\n }\n event.preventDefault();\n this.DeleteSelected();\n } else if (isCtrlOrMeta && event.key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.Undo();\n } else if (isCtrlOrMeta && (event.key === 'y' || (event.key === 'z' && event.shiftKey))) {\n event.preventDefault();\n this.Redo();\n } else if (isCtrlOrMeta && event.key === 'a') {\n event.preventDefault();\n this.fFlow?.selectAll();\n }\n }\n\n // ── TrackBy Functions ───────────────────────────────────────\n\n protected trackNodeById(_index: number, node: FlowNode): string {\n return node.ID;\n }\n\n protected trackConnectionById(_index: number, conn: FlowConnection): string {\n return conn.ID;\n }\n\n // ── Helper Methods ─────────────────────────────────────────\n\n GetTypeConfig(type: string): FlowNodeTypeConfig | null {\n return this.NodeTypes.find(nt => nt.Type === type) ?? null;\n }\n\n /** Get the connectable side string for Foblex based on port side */\n GetConnectableSide(side: string | undefined): string {\n switch (side) {\n case 'left': return 'left';\n case 'right': return 'right';\n case 'top': return 'top';\n case 'bottom': return 'bottom';\n default: return 'auto';\n }\n }\n\n get selectedCount(): number {\n return this.selectedNodeIDs.length + this.selectedConnectionIDs.length;\n }\n\n private pushUndoState(): void {\n this.stateService.PushState(this.Nodes, this.Connections);\n }\n\n private updateZoomLevel(scale: number): void {\n this.zoomLevel = Math.round(scale * 100);\n this.cdr.detectChanges();\n }\n\n private findNodeByPortId(portId: string): string | null {\n for (const node of this.Nodes) {\n for (const port of node.Ports) {\n if (UUIDsEqual(port.ID, portId)) {\n return node.ID;\n }\n }\n }\n // When fConnectOnNode is enabled, Foblex may send the node ID itself\n // instead of a port ID. Check for a direct node ID match as fallback.\n const directMatch = this.Nodes.find(n => UUIDsEqual(n.ID, portId));\n if (directMatch) {\n return directMatch.ID;\n }\n return null;\n }\n\n /**\n * When fConnectOnNode is enabled, Foblex may send a node ID instead of a port ID.\n * This resolves the raw ID to the correct port ID for the given direction.\n */\n private resolvePortId(rawId: string, nodeId: string, direction: 'input' | 'output'): string {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return rawId;\n\n // If the rawId already matches a port on this node, use it as-is\n const exactPort = node.Ports.find(p => UUIDsEqual(p.ID, rawId));\n if (exactPort) return rawId;\n\n // Otherwise, find the first port matching the expected direction\n const dirPort = node.Ports.find(p => p.Direction === direction);\n return dirPort ? dirPort.ID : rawId;\n }\n\n private createDefaultNode(config: FlowNodeTypeConfig, position: FlowPosition): FlowNode {\n const id = this.generateId();\n const defaultPorts = config.DefaultPorts ?? [\n { ID: `${id}-input`, Direction: 'input' as const, Side: 'top' as const, Multiple: true },\n { ID: `${id}-output`, Direction: 'output' as const, Side: 'bottom' as const, Multiple: true }\n ];\n\n return {\n ID: id,\n Type: config.Type,\n Label: config.Label,\n Icon: config.Icon,\n Status: 'default',\n Position: position,\n Ports: defaultPorts.map(p => ({\n ...p,\n ID: p.ID.startsWith(id) ? p.ID : `${id}-${p.ID}`\n }))\n };\n }\n\n private removeSelectedItems(): void {\n // Remove selected connections\n const removedConnections = this.Connections.filter(c => this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n this.Connections = this.Connections.filter(c => !this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n for (const conn of removedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n\n // Remove selected nodes and their connections\n const removedNodes = this.Nodes.filter(n => this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n this.Nodes = this.Nodes.filter(n => !this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n\n // Also remove connections attached to deleted nodes\n const deletedNodeIDs = new Set(this.selectedNodeIDs.map(id => NormalizeUUID(id)));\n const orphanedConnections = this.Connections.filter(\n c => deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) || deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n this.Connections = this.Connections.filter(\n c => !deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) && !deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n\n for (const conn of orphanedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n for (const node of removedNodes) {\n this.NodeRemoved.emit(node);\n }\n\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private generateId(): string {\n return 'flow-' + Math.random().toString(36).substring(2, 11);\n }\n}\n","<div class=\"mj-flow-editor\" [class.mj-flow-editor--readonly]=\"ReadOnly\" tabindex=\"0\">\n\n <!-- Canvas Toolbar -->\n @if (ShowToolbar) {\n <div class=\"mj-flow-editor-toolbar-area\">\n <mj-flow-toolbar\n [ZoomLevel]=\"zoomLevel\"\n [ShowGrid]=\"ShowGrid\"\n [ShowMinimap]=\"ShowMinimap\"\n [ShowLegend]=\"ShowLegend\"\n [ReadOnly]=\"ReadOnly\"\n [PanMode]=\"panMode\"\n (ZoomInClicked)=\"ZoomIn()\"\n (ZoomOutClicked)=\"ZoomOut()\"\n (FitToScreenClicked)=\"ZoomToFit()\"\n (AutoLayoutClicked)=\"AutoArrange()\"\n (GridToggled)=\"onGridToggled($event)\"\n (MinimapToggled)=\"onMinimapToggled($event)\"\n (LegendToggled)=\"onLegendToggled($event)\"\n (PanModeToggled)=\"onPanModeToggled($event)\">\n </mj-flow-toolbar>\n </div>\n }\n\n <!-- Main Canvas Area -->\n <div class=\"mj-flow-editor-canvas-area\">\n\n <!-- Palette Sidebar -->\n @if (ShowPalette && !ReadOnly) {\n <mj-flow-palette\n [NodeTypes]=\"NodeTypes\">\n </mj-flow-palette>\n }\n\n <!-- Foblex Canvas -->\n <div class=\"mj-flow-editor-canvas\"\n [class.mj-flow-editor-canvas--pan-mode]=\"panMode\">\n <f-flow fDraggable\n [fDraggableDisabled]=\"false\"\n [fCanvasMoveTrigger]=\"canvasMoveTriggerFn\"\n [vCellSize]=\"GridSize\"\n [hCellSize]=\"GridSize\"\n [fCellSizeWhileDragging]=\"ShowGrid\"\n (fLoaded)=\"onFlowLoaded()\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n (fReassignConnection)=\"onReassignConnection($event)\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fSelectionChange)=\"onSelectionChange($event)\"\n (fMoveNodes)=\"onNodesMoved($event)\">\n\n <!-- Background grid — MUST be direct child of f-flow (Foblex content projection requires it) -->\n @if (ShowGrid) {\n <f-background>\n <f-circle-pattern [color]=\"'#94a3b8'\" [radius]=\"24\"></f-circle-pattern>\n </f-background>\n }\n\n <!-- Alignment snap lines — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-line-alignment [fAlignThreshold]=\"10\"></f-line-alignment>\n }\n\n <f-canvas fZoom #fZoomRef=\"fComponent\"\n [fZoomMinimum]=\"0.15\"\n [fZoomMaximum]=\"3\"\n [fZoomStep]=\"0.1\"\n [position]=\"canvasPosition\"\n [scale]=\"canvasScale\"\n (fCanvasChange)=\"onCanvasChange($event)\">\n\n <!-- Interactive connection drawing -->\n @if (!ReadOnly) {\n <f-connection-for-create\n fType=\"bezier\"\n [fRadius]=\"8\"\n [fOffset]=\"12\">\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" fill=\"#94a3b8\"/>\n </svg>\n </f-connection-for-create>\n }\n\n <!-- Connections -->\n @for (conn of Connections; track trackConnectionById($index, conn)) {\n <f-connection\n [fConnectionId]=\"conn.ID\"\n [fOutputId]=\"conn.SourcePortID\"\n [fInputId]=\"conn.TargetPortID\"\n fType=\"bezier\"\n fBehavior=\"fixed\"\n [fRadius]=\"8\"\n [fOffset]=\"12\"\n [fSelectionDisabled]=\"false\"\n [fReassignDisabled]=\"ReadOnly\"\n [style.--connection-color]=\"conn.Color || '#94a3b8'\"\n [class.mj-flow-connection-colored]=\"!!conn.Color\"\n [class.mj-flow-connection-dashed]=\"conn.Style === 'dashed'\"\n [class.mj-flow-connection-dotted]=\"conn.Style === 'dotted'\"\n (click)=\"onConnectionClicked($event, conn)\"\n (contextmenu)=\"onConnectionContextMenu($event, conn)\">\n <!-- Arrow marker -->\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" [attr.fill]=\"conn.Color || '#94a3b8'\"/>\n </svg>\n <!-- Connection label -->\n @if (conn.Label) {\n <div fConnectionContent [position]=\"0.5\"\n class=\"mj-flow-connection-label\"\n [style.backgroundColor]=\"ConnectionLabelBackground\"\n [style.borderColor]=\"ConnectionLabelBorderColor\"\n [style.color]=\"ConnectionLabelTextColor\"\n [title]=\"conn.LabelDetail || conn.Label || ''\">\n @if (conn.LabelIcon) {\n <i\n class=\"fa-solid mj-flow-connection-label-icon\"\n [ngClass]=\"conn.LabelIcon\"\n [style.color]=\"conn.LabelIconColor || 'inherit'\"></i>\n }\n {{ conn.Label }}\n </div>\n }\n </f-connection>\n }\n\n <!-- Nodes -->\n @for (node of Nodes; track trackNodeById($index, node)) {\n <mj-flow-node\n fNode\n fDragHandle\n [fNodeId]=\"node.ID\"\n [fNodePosition]=\"{ x: node.Position.X, y: node.Position.Y }\"\n [fNodeDraggingDisabled]=\"ReadOnly || panMode || node.Locked === true\"\n [fNodeSelectionDisabled]=\"panMode\"\n [fConnectOnNode]=\"!ReadOnly && !panMode\"\n [Node]=\"node\"\n [TypeConfig]=\"GetTypeConfig(node.Type)\"\n [ReadOnly]=\"ReadOnly\"\n (contextmenu)=\"onNodeContextMenu($event, node)\">\n </mj-flow-node>\n }\n\n </f-canvas>\n\n <!-- Rubber-band selection — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-selection-area></f-selection-area>\n }\n\n <!-- Minimap -->\n @if (ShowMinimap) {\n <div class=\"mj-flow-editor-minimap\" fDragBlocker>\n <f-minimap [fMinSize]=\"1500\"></f-minimap>\n </div>\n }\n </f-flow>\n\n <!-- Legend -->\n @if (ShowLegend && Nodes.length > 0) {\n <div class=\"mj-flow-editor-legend\">\n <div class=\"mj-flow-editor-legend-title\">Legend</div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Connections</div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#64748b\" stroke-width=\"2\"/></svg>\n <span>Only exit path</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#16a34a\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-circle-check\" style=\"color:#16a34a;font-size:10px;\"></i>\n <span>Default (fallback)</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#f59e0b\" stroke-width=\"2\" stroke-dasharray=\"5 3\"/></svg>\n <span>Conditional</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#ef4444\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ef4444;font-size:10px;\"></i>\n <span>Duplicate defaults</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Step Types</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#3B82F6\"></span>\n <span>Action</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#8B5CF6\"></span>\n <span>Prompt</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#10B981\"></span>\n <span>Sub-Agent</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F59E0B\"></span>\n <span>For Each</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F97316\"></span>\n <span>While</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Borders</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#16a34a;background:#f0fdf4;\"></span>\n <span>Start node</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#ef4444;background:#fef2f2;\"></span>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ea580c;font-size:10px;\"></i>\n <span>Missing config</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Empty state overlay -->\n @if (Nodes.length === 0) {\n <div class=\"mj-flow-editor-empty\">\n <div class=\"mj-flow-editor-empty-content\">\n <i class=\"fa-solid fa-diagram-project mj-flow-editor-empty-icon\"></i>\n @if (!ReadOnly) {\n <p class=\"mj-flow-editor-empty-title\">Drag steps from the palette to start building your flow</p>\n }\n @if (ReadOnly) {\n <p class=\"mj-flow-editor-empty-title\">No steps defined for this flow</p>\n }\n @if (!ReadOnly) {\n <p class=\"mj-flow-editor-empty-subtitle\">\n Or use auto-layout after adding steps to arrange them automatically\n </p>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div\n class=\"mj-flow-context-menu\"\n [style.left.px]=\"contextMenuX\"\n [style.top.px]=\"contextMenuY\"\n (click)=\"$event.stopPropagation()\">\n <button class=\"mj-flow-context-menu-item\" (click)=\"onContextMenuAction('edit')\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span>Edit {{ contextMenuTargetType === 'node' ? 'Node' : 'Connection' }}</span>\n </button>\n <div class=\"mj-flow-context-menu-divider\"></div>\n <button class=\"mj-flow-context-menu-item mj-flow-context-menu-item--danger\" (click)=\"onContextMenuAction('remove')\">\n <i class=\"fa-solid fa-trash-can\"></i>\n <span>Remove {{ contextMenuTargetType === 'node' ? 'Node' : 'Connection' }}</span>\n </button>\n </div>\n }\n\n <!-- Status Bar -->\n @if (ShowStatusBar) {\n <mj-flow-status-bar\n [NodeCount]=\"Nodes.length\"\n [ConnectionCount]=\"Connections.length\"\n [SelectedCount]=\"selectedCount\"\n [ZoomLevel]=\"zoomLevel\">\n </mj-flow-status-bar>\n }\n</div>\n"]}
1
+ {"version":3,"file":"flow-editor.component.js","sourceRoot":"","sources":["../../../src/lib/components/flow-editor.component.ts","../../../src/lib/components/flow-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy,\n ChangeDetectorRef, ViewEncapsulation, ChangeDetectionStrategy, HostListener\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { FFlowComponent, FCanvasComponent, FZoomDirective, FCreateConnectionEvent,\n FCreateNodeEvent, FSelectionChangeEvent, FCanvasChangeEvent, FMoveNodesEvent,\n FReassignConnectionEvent } from '@foblex/flow';\nimport {\n FlowNode, FlowConnection, FlowNodeTypeConfig, FlowNodeAddedEvent,\n FlowNodeMovedEvent, FlowConnectionCreatedEvent, FlowConnectionReassignedEvent,\n FlowSelectionChangedEvent,\n FlowCanvasClickEvent, FlowPosition, FlowLayoutDirection,\n FlowContextMenuTarget, FlowContextMenuAction\n} from '../interfaces/flow-types';\nimport { FlowStateService } from '../services/flow-state.service';\nimport { FlowLayoutService } from '../services/flow-layout.service';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n/**\n * Generic, entity-agnostic visual flow editor component.\n * Wraps Foblex Flow to provide a clean MJ-style API.\n *\n * Usage:\n * ```html\n * <mj-flow-editor\n * [Nodes]=\"myNodes\"\n * [Connections]=\"myConnections\"\n * [NodeTypes]=\"myNodeTypes\"\n * (NodeSelected)=\"onNodeSelected($event)\"\n * (ConnectionCreated)=\"onConnectionCreated($event)\">\n * </mj-flow-editor>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-flow-editor',\n templateUrl: './flow-editor.component.html',\n styleUrls: ['./flow-editor.component.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Default,\n providers: [FlowStateService, FlowLayoutService]\n})\nexport class FlowEditorComponent implements OnInit, OnDestroy {\n // ── Inputs ──────────────────────────────────────────────────\n @Input() Nodes: FlowNode[] = [];\n @Input() Connections: FlowConnection[] = [];\n @Input() NodeTypes: FlowNodeTypeConfig[] = [];\n @Input() ReadOnly = false;\n @Input() ShowMinimap = true;\n @Input() ShowPalette = true;\n @Input() ShowGrid = true;\n @Input() ShowStatusBar = true;\n @Input() ShowToolbar = true;\n @Input() ShowLegend = true;\n @Input() GridSize = 20;\n @Input() AutoLayoutDirection: FlowLayoutDirection = 'vertical';\n /** Background color for connection labels */\n @Input() ConnectionLabelBackground = '#fffef5';\n /** Border color for connection labels */\n @Input() ConnectionLabelBorderColor = '#cbd5e1';\n /** Text color for connection labels */\n @Input() ConnectionLabelTextColor = '#334155';\n\n /** Title for the canvas empty-state overlay — depends on read-only mode. */\n public get EmptyStateTitle(): string {\n return this.ReadOnly\n ? 'No steps defined for this flow'\n : 'Drag steps from the palette to start building your flow';\n }\n\n // ── Outputs ─────────────────────────────────────────────────\n @Output() NodeSelected = new EventEmitter<FlowNode | null>();\n @Output() NodeAdded = new EventEmitter<FlowNodeAddedEvent>();\n @Output() NodeRemoved = new EventEmitter<FlowNode>();\n @Output() NodeMoved = new EventEmitter<FlowNodeMovedEvent>();\n @Output() ConnectionCreated = new EventEmitter<FlowConnectionCreatedEvent>();\n @Output() ConnectionRemoved = new EventEmitter<FlowConnection>();\n @Output() ConnectionReassigned = new EventEmitter<FlowConnectionReassignedEvent>();\n @Output() ConnectionSelected = new EventEmitter<FlowConnection | null>();\n @Output() SelectionChanged = new EventEmitter<FlowSelectionChangedEvent>();\n @Output() CanvasClicked = new EventEmitter<FlowCanvasClickEvent>();\n @Output() NodesChanged = new EventEmitter<FlowNode[]>();\n @Output() ConnectionsChanged = new EventEmitter<FlowConnection[]>();\n @Output() NodeEditRequested = new EventEmitter<FlowNode>();\n @Output() ConnectionEditRequested = new EventEmitter<FlowConnection>();\n @Output() GridToggled = new EventEmitter<boolean>();\n @Output() MinimapToggled = new EventEmitter<boolean>();\n @Output() LegendToggled = new EventEmitter<boolean>();\n\n // ── View Children ───────────────────────────────────────────\n @ViewChild(FFlowComponent) protected fFlow: FFlowComponent | undefined;\n @ViewChild(FCanvasComponent) protected fCanvas: FCanvasComponent | undefined;\n @ViewChild('fZoomRef') protected fZoom: FZoomDirective | undefined;\n\n // ── Internal State ──────────────────────────────────────────\n protected zoomLevel = 100;\n protected canvasPosition = { x: 0, y: 0 };\n protected canvasScale = 1;\n protected selectedNodeIDs: string[] = [];\n protected selectedConnectionIDs: string[] = [];\n protected panMode = false;\n\n /** Trigger function for canvas panning — only allows panning in pan mode */\n protected canvasMoveTriggerFn = (_event: MouseEvent | TouchEvent): boolean => {\n return this.panMode;\n };\n\n /* Context menu state */\n protected contextMenuVisible = false;\n protected contextMenuX = 0;\n protected contextMenuY = 0;\n protected contextMenuTargetType: FlowContextMenuTarget = 'node';\n protected contextMenuNode: FlowNode | null = null;\n protected contextMenuConnection: FlowConnection | null = null;\n\n private destroy$ = new Subject<void>();\n private initialized = false;\n private lastConnectionClickTime = 0;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private stateService: FlowStateService,\n private layoutService: FlowLayoutService\n ) {}\n\n // ── Lifecycle ───────────────────────────────────────────────\n\n ngOnInit(): void {\n this.initialized = true;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Methods ──────────────────────────────────────────\n\n /** Fit all nodes within the viewport */\n ZoomToFit(): void {\n this.fCanvas?.fitToScreen({ x: 150, y: 150 }, true);\n }\n\n /** Zoom in one step */\n ZoomIn(): void {\n if (this.fZoom) {\n this.fZoom.zoomIn();\n } else {\n const newScale = Math.min(this.canvasScale + 0.15, 3);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Zoom out one step */\n ZoomOut(): void {\n if (this.fZoom) {\n this.fZoom.zoomOut();\n } else {\n const newScale = Math.max(this.canvasScale - 0.15, 0.1);\n this.fCanvas?.setScale(newScale);\n this.updateZoomLevel(newScale);\n }\n }\n\n /** Run auto-layout using dagre */\n AutoArrange(direction?: FlowLayoutDirection): void {\n const dir = direction ?? this.AutoLayoutDirection;\n this.pushUndoState();\n const result = this.layoutService.CalculateLayout(this.Nodes, this.Connections, dir);\n for (const node of this.Nodes) {\n const newPos = result.Positions.get(node.ID);\n if (newPos) {\n node.Position = { ...newPos };\n }\n }\n this.NodesChanged.emit(this.Nodes);\n this.cdr.detectChanges();\n // Fit to screen after layout\n setTimeout(() => this.ZoomToFit(), 100);\n }\n\n /** Center the canvas on a specific node */\n CenterOnNode(nodeId: string): void {\n this.fCanvas?.centerGroupOrNode(nodeId, true);\n }\n\n /** Programmatically select a node */\n SelectNode(nodeId: string): void {\n this.fFlow?.select([nodeId], []);\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId)) ?? null;\n this.NodeSelected.emit(node);\n }\n\n /** Clear all selection */\n ClearSelection(): void {\n this.fFlow?.clearSelection();\n this.selectedNodeIDs = [];\n this.selectedConnectionIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n\n /** Update a node's visual status */\n SetNodeStatus(nodeId: string, status: FlowNode['Status'], message?: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (node) {\n node.Status = status;\n node.StatusMessage = message;\n this.cdr.detectChanges();\n }\n }\n\n /** Update a node's visual properties and push a new object reference so\n * OnPush child components (FlowNodeComponent) detect the change. */\n UpdateNode(nodeId: string, changes: Partial<Pick<FlowNode, 'Label' | 'Subtitle' | 'Icon' | 'Status' | 'StatusMessage' | 'IsStartNode' | 'Badges' | 'Data'>>): void {\n const idx = this.Nodes.findIndex(n => UUIDsEqual(n.ID, nodeId));\n if (idx === -1) return;\n // Create a new object reference so the OnPush FlowNodeComponent picks up the change\n this.Nodes[idx] = { ...this.Nodes[idx], ...changes };\n this.cdr.detectChanges();\n }\n\n /** Update a connection's visual properties in-place (label, color, style, etc.) */\n UpdateConnection(connId: string, changes: Partial<Pick<FlowConnection, 'Label' | 'LabelIcon' | 'LabelIconColor' | 'LabelDetail' | 'Color' | 'Style' | 'Animated'>>): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n Object.assign(conn, changes);\n this.cdr.detectChanges();\n }\n\n /** Highlight a sequence of nodes (e.g., execution path) */\n HighlightPath(nodeIds: string[]): void {\n for (const node of this.Nodes) {\n if (nodeIds.some(id => UUIDsEqual(id, node.ID))) {\n node.Status = 'running';\n }\n }\n // Highlight connections along the path\n for (const conn of this.Connections) {\n const srcIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.SourceNodeID));\n const tgtIdx = nodeIds.findIndex(id => UUIDsEqual(id, conn.TargetNodeID));\n if (srcIdx >= 0 && tgtIdx >= 0 && tgtIdx === srcIdx + 1) {\n conn.Animated = true;\n }\n }\n this.cdr.detectChanges();\n }\n\n /** Clear all node status highlights */\n ClearHighlights(): void {\n for (const node of this.Nodes) {\n node.Status = 'default';\n node.StatusMessage = undefined;\n }\n for (const conn of this.Connections) {\n conn.Animated = false;\n }\n this.cdr.detectChanges();\n }\n\n /** Undo the last operation */\n Undo(): void {\n const snapshot = this.stateService.Undo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n /** Redo the last undone operation */\n Redo(): void {\n const snapshot = this.stateService.Redo(this.Nodes, this.Connections);\n if (snapshot) {\n this.Nodes = snapshot.Nodes;\n this.Connections = snapshot.Connections;\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n }\n\n get CanUndo(): boolean {\n return this.stateService.CanUndo;\n }\n\n get CanRedo(): boolean {\n return this.stateService.CanRedo;\n }\n\n /** Delete the currently selected nodes and connections */\n DeleteSelected(): void {\n if (this.ReadOnly || (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0)) {\n return;\n }\n this.pushUndoState();\n this.removeSelectedItems();\n this.ClearSelection();\n }\n\n // ── Foblex Event Handlers ──────────────────────────────────\n\n /** Called when Foblex flow finishes loading */\n protected onFlowLoaded(): void {\n if (this.Nodes.length > 0) {\n setTimeout(() => this.ZoomToFit(), 200);\n }\n }\n\n /** Canvas zoom/pan changed */\n protected onCanvasChange(event: FCanvasChangeEvent): void {\n this.canvasPosition = event.position;\n this.canvasScale = event.scale;\n this.updateZoomLevel(event.scale);\n }\n\n /** User drew a new connection */\n protected onCreateConnection(event: FCreateConnectionEvent): void {\n if (!event.fInputId || this.ReadOnly) return;\n this.pushUndoState();\n\n // Derive node IDs from port IDs (ports are named nodeID-input / nodeID-output)\n const sourceNodeID = this.findNodeByPortId(event.fOutputId);\n const targetNodeID = this.findNodeByPortId(event.fInputId);\n\n if (!sourceNodeID || !targetNodeID) return;\n\n // Resolve actual port IDs — when fConnectOnNode is enabled, Foblex may\n // send the node ID itself instead of a port ID. Map to the correct port.\n const sourcePortID = this.resolvePortId(event.fOutputId, sourceNodeID, 'output');\n const targetPortID = this.resolvePortId(event.fInputId, targetNodeID, 'input');\n\n // Prevent duplicate connections\n const exists = this.Connections.some(\n c => UUIDsEqual(c.SourcePortID, sourcePortID) && UUIDsEqual(c.TargetPortID, targetPortID)\n );\n if (exists) return;\n\n this.ConnectionCreated.emit({\n SourceNodeID: sourceNodeID,\n SourcePortID: sourcePortID,\n TargetNodeID: targetNodeID,\n TargetPortID: targetPortID\n });\n }\n\n /** User reassigned (dragged) an existing connection endpoint to a new node */\n protected onReassignConnection(event: FReassignConnectionEvent): void {\n if (this.ReadOnly) return;\n\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, event.connectionId));\n if (!conn) return;\n\n // If dropped on empty space (no new target/source), discard the reassignment\n if (event.isTargetReassign && !event.newTargetId) return;\n if (event.isSourceReassign && !event.newSourceId) return;\n\n this.pushUndoState();\n\n const oldSourceNodeID = conn.SourceNodeID;\n const oldSourcePortID = conn.SourcePortID;\n const oldTargetNodeID = conn.TargetNodeID;\n const oldTargetPortID = conn.TargetPortID;\n\n // Resolve new endpoints\n let newSourceNodeID = oldSourceNodeID;\n let newSourcePortID = oldSourcePortID;\n let newTargetNodeID = oldTargetNodeID;\n let newTargetPortID = oldTargetPortID;\n\n if (event.isSourceReassign && event.newSourceId) {\n newSourceNodeID = this.findNodeByPortId(event.newSourceId) ?? oldSourceNodeID;\n newSourcePortID = this.resolvePortId(event.newSourceId, newSourceNodeID, 'output');\n }\n\n if (event.isTargetReassign && event.newTargetId) {\n newTargetNodeID = this.findNodeByPortId(event.newTargetId) ?? oldTargetNodeID;\n newTargetPortID = this.resolvePortId(event.newTargetId, newTargetNodeID, 'input');\n }\n\n // Prevent self-connections\n if (newSourceNodeID === newTargetNodeID) return;\n\n // Prevent duplicates\n const duplicate = this.Connections.some(\n c => !UUIDsEqual(c.ID, conn.ID) &&\n UUIDsEqual(c.SourcePortID, newSourcePortID) &&\n UUIDsEqual(c.TargetPortID, newTargetPortID)\n );\n if (duplicate) return;\n\n // Update the connection in-place\n conn.SourceNodeID = newSourceNodeID;\n conn.SourcePortID = newSourcePortID;\n conn.TargetNodeID = newTargetNodeID;\n conn.TargetPortID = newTargetPortID;\n\n this.ConnectionReassigned.emit({\n ConnectionID: conn.ID,\n OldSourceNodeID: oldSourceNodeID,\n OldSourcePortID: oldSourcePortID,\n OldTargetNodeID: oldTargetNodeID,\n OldTargetPortID: oldTargetPortID,\n NewSourceNodeID: newSourceNodeID,\n NewSourcePortID: newSourcePortID,\n NewTargetNodeID: newTargetNodeID,\n NewTargetPortID: newTargetPortID\n });\n\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n /** External item dropped from palette */\n protected onCreateNode(event: FCreateNodeEvent): void {\n if (this.ReadOnly) return;\n this.pushUndoState();\n\n const nodeType = event.data as string;\n const config = this.NodeTypes.find(nt => nt.Type === nodeType);\n if (!config) return;\n\n // event.rect is already normalized to canvas coordinates by Foblex's\n // GetNormalizedElementRectExecution (via RoundedRect.fromCenter).\n // Do NOT pass it through getPositionInFlow() again — that double-normalizes\n // and places the node far from the actual drop point.\n // Use the center of the preview rect (≈ cursor position at drop time).\n const dropPosition: FlowPosition = {\n X: event.rect.x + event.rect.width / 2,\n Y: event.rect.y + event.rect.height / 2\n };\n\n const newNode = this.createDefaultNode(config, dropPosition);\n this.NodeAdded.emit({ Node: newNode, DropPosition: dropPosition });\n }\n\n /** Selection changed in Foblex */\n protected onSelectionChange(event: FSelectionChangeEvent): void {\n const timeSinceClick = Date.now() - this.lastConnectionClickTime;\n\n // If a direct connection click just fired, skip this Foblex callback\n // to avoid double-processing / overwriting the direct click result.\n if (timeSinceClick < 200) {\n return;\n }\n\n this.selectedNodeIDs = event.fNodeIds ?? [];\n this.selectedConnectionIDs = event.fConnectionIds ?? [];\n\n this.SelectionChanged.emit({\n SelectedNodeIDs: this.selectedNodeIDs,\n SelectedConnectionIDs: this.selectedConnectionIDs\n });\n\n // Emit specific node/connection selection events.\n // IMPORTANT: When selecting a connection, emit NodeSelected(null) FIRST so\n // that consumers clear their node state before the connection event opens\n // the connection properties panel.\n if (this.selectedNodeIDs.length === 1) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, this.selectedNodeIDs[0]));\n this.ConnectionSelected.emit(null);\n this.NodeSelected.emit(node ?? null);\n } else if (this.selectedConnectionIDs.length === 1) {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, this.selectedConnectionIDs[0]));\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn ?? null);\n } else if (this.selectedNodeIDs.length === 0 && this.selectedConnectionIDs.length === 0) {\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(null);\n }\n }\n\n /** Nodes moved on canvas */\n protected onNodesMoved(event: FMoveNodesEvent): void {\n if (this.ReadOnly || !event.fNodes || event.fNodes.length === 0) return;\n this.pushUndoState();\n\n for (const moved of event.fNodes) {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, moved.id));\n if (node) {\n const oldPosition = { ...node.Position };\n node.Position = { X: moved.position.x, Y: moved.position.y };\n this.NodeMoved.emit({\n NodeID: node.ID,\n OldPosition: oldPosition,\n NewPosition: node.Position\n });\n }\n }\n this.NodesChanged.emit(this.Nodes);\n }\n\n // ── Toolbar Event Handlers ─────────────────────────────────\n\n protected onGridToggled(show: boolean): void {\n this.ShowGrid = show;\n this.GridToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onMinimapToggled(show: boolean): void {\n this.ShowMinimap = show;\n this.MinimapToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onLegendToggled(show: boolean): void {\n this.ShowLegend = show;\n this.LegendToggled.emit(show);\n this.cdr.detectChanges();\n }\n\n protected onPanModeToggled(enabled: boolean): void {\n this.panMode = enabled;\n this.cdr.detectChanges();\n }\n\n // ── Context Menu ───────────────────────────────────────────\n\n protected onNodeContextMenu(event: MouseEvent, node: FlowNode): void {\n if (this.ReadOnly) return;\n event.preventDefault();\n event.stopPropagation();\n this.showContextMenu(event, 'node', node, null);\n }\n\n /** Direct click on a connection — ensures ConnectionSelected fires reliably */\n protected onConnectionClicked(event: MouseEvent, conn: FlowConnection): void {\n // Do NOT stopPropagation — let Foblex handle its own visual selection.\n // Record the time so onSelectionChange can skip double-processing.\n this.lastConnectionClickTime = Date.now();\n this.selectedConnectionIDs = [conn.ID];\n this.selectedNodeIDs = [];\n this.NodeSelected.emit(null);\n this.ConnectionSelected.emit(conn);\n this.cdr.detectChanges();\n }\n\n protected onConnectionContextMenu(event: MouseEvent, conn: FlowConnection): void {\n if (this.ReadOnly) return;\n event.preventDefault();\n event.stopPropagation();\n this.showContextMenu(event, 'connection', null, conn);\n }\n\n protected onContextMenuAction(action: FlowContextMenuAction): void {\n this.hideContextMenu();\n\n if (action === 'edit') {\n if (this.contextMenuTargetType === 'node' && this.contextMenuNode) {\n this.NodeEditRequested.emit(this.contextMenuNode);\n } else if (this.contextMenuTargetType === 'connection' && this.contextMenuConnection) {\n this.ConnectionEditRequested.emit(this.contextMenuConnection);\n }\n } else if (action === 'remove') {\n this.pushUndoState();\n if (this.contextMenuTargetType === 'node' && this.contextMenuNode) {\n this.removeNodeById(this.contextMenuNode.ID);\n } else if (this.contextMenuTargetType === 'connection' && this.contextMenuConnection) {\n this.removeConnectionById(this.contextMenuConnection.ID);\n }\n }\n }\n\n @HostListener('document:click')\n protected onDocumentClick(): void {\n if (this.contextMenuVisible) {\n this.hideContextMenu();\n }\n }\n\n private showContextMenu(\n event: MouseEvent,\n targetType: FlowContextMenuTarget,\n node: FlowNode | null,\n connection: FlowConnection | null\n ): void {\n this.contextMenuTargetType = targetType;\n this.contextMenuNode = node;\n this.contextMenuConnection = connection;\n this.contextMenuX = event.clientX;\n this.contextMenuY = event.clientY;\n this.contextMenuVisible = true;\n this.cdr.detectChanges();\n }\n\n private hideContextMenu(): void {\n this.contextMenuVisible = false;\n this.contextMenuNode = null;\n this.contextMenuConnection = null;\n this.cdr.detectChanges();\n }\n\n private removeNodeById(nodeId: string): void {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return;\n\n this.Nodes = this.Nodes.filter(n => !UUIDsEqual(n.ID, nodeId));\n\n /* Remove connections attached to this node */\n const orphaned = this.Connections.filter(\n c => UUIDsEqual(c.SourceNodeID, nodeId) || UUIDsEqual(c.TargetNodeID, nodeId)\n );\n this.Connections = this.Connections.filter(\n c => !UUIDsEqual(c.SourceNodeID, nodeId) && !UUIDsEqual(c.TargetNodeID, nodeId)\n );\n for (const conn of orphaned) {\n this.ConnectionRemoved.emit(conn);\n }\n this.NodeRemoved.emit(node);\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private removeConnectionById(connId: string): void {\n const conn = this.Connections.find(c => UUIDsEqual(c.ID, connId));\n if (!conn) return;\n\n this.Connections = this.Connections.filter(c => !UUIDsEqual(c.ID, connId));\n this.ConnectionRemoved.emit(conn);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n // ── Keyboard Shortcuts ─────────────────────────────────────\n\n @HostListener('keydown', ['$event'])\n protected onKeyDown(event: KeyboardEvent): void {\n if (this.ReadOnly) return;\n\n const isCtrlOrMeta = event.ctrlKey || event.metaKey;\n\n if (event.key === 'Delete' || event.key === 'Backspace') {\n // Don't delete if user is typing in an input\n const target = event.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') {\n return;\n }\n event.preventDefault();\n this.DeleteSelected();\n } else if (isCtrlOrMeta && event.key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.Undo();\n } else if (isCtrlOrMeta && (event.key === 'y' || (event.key === 'z' && event.shiftKey))) {\n event.preventDefault();\n this.Redo();\n } else if (isCtrlOrMeta && event.key === 'a') {\n event.preventDefault();\n this.fFlow?.selectAll();\n }\n }\n\n // ── TrackBy Functions ───────────────────────────────────────\n\n protected trackNodeById(_index: number, node: FlowNode): string {\n return node.ID;\n }\n\n protected trackConnectionById(_index: number, conn: FlowConnection): string {\n return conn.ID;\n }\n\n // ── Helper Methods ─────────────────────────────────────────\n\n GetTypeConfig(type: string): FlowNodeTypeConfig | null {\n return this.NodeTypes.find(nt => nt.Type === type) ?? null;\n }\n\n /** Get the connectable side string for Foblex based on port side */\n GetConnectableSide(side: string | undefined): string {\n switch (side) {\n case 'left': return 'left';\n case 'right': return 'right';\n case 'top': return 'top';\n case 'bottom': return 'bottom';\n default: return 'auto';\n }\n }\n\n get selectedCount(): number {\n return this.selectedNodeIDs.length + this.selectedConnectionIDs.length;\n }\n\n private pushUndoState(): void {\n this.stateService.PushState(this.Nodes, this.Connections);\n }\n\n private updateZoomLevel(scale: number): void {\n this.zoomLevel = Math.round(scale * 100);\n this.cdr.detectChanges();\n }\n\n private findNodeByPortId(portId: string): string | null {\n for (const node of this.Nodes) {\n for (const port of node.Ports) {\n if (UUIDsEqual(port.ID, portId)) {\n return node.ID;\n }\n }\n }\n // When fConnectOnNode is enabled, Foblex may send the node ID itself\n // instead of a port ID. Check for a direct node ID match as fallback.\n const directMatch = this.Nodes.find(n => UUIDsEqual(n.ID, portId));\n if (directMatch) {\n return directMatch.ID;\n }\n return null;\n }\n\n /**\n * When fConnectOnNode is enabled, Foblex may send a node ID instead of a port ID.\n * This resolves the raw ID to the correct port ID for the given direction.\n */\n private resolvePortId(rawId: string, nodeId: string, direction: 'input' | 'output'): string {\n const node = this.Nodes.find(n => UUIDsEqual(n.ID, nodeId));\n if (!node) return rawId;\n\n // If the rawId already matches a port on this node, use it as-is\n const exactPort = node.Ports.find(p => UUIDsEqual(p.ID, rawId));\n if (exactPort) return rawId;\n\n // Otherwise, find the first port matching the expected direction\n const dirPort = node.Ports.find(p => p.Direction === direction);\n return dirPort ? dirPort.ID : rawId;\n }\n\n private createDefaultNode(config: FlowNodeTypeConfig, position: FlowPosition): FlowNode {\n const id = this.generateId();\n const defaultPorts = config.DefaultPorts ?? [\n { ID: `${id}-input`, Direction: 'input' as const, Side: 'top' as const, Multiple: true },\n { ID: `${id}-output`, Direction: 'output' as const, Side: 'bottom' as const, Multiple: true }\n ];\n\n return {\n ID: id,\n Type: config.Type,\n Label: config.Label,\n Icon: config.Icon,\n Status: 'default',\n Position: position,\n Ports: defaultPorts.map(p => ({\n ...p,\n ID: p.ID.startsWith(id) ? p.ID : `${id}-${p.ID}`\n }))\n };\n }\n\n private removeSelectedItems(): void {\n // Remove selected connections\n const removedConnections = this.Connections.filter(c => this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n this.Connections = this.Connections.filter(c => !this.selectedConnectionIDs.some(id => UUIDsEqual(id, c.ID)));\n for (const conn of removedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n\n // Remove selected nodes and their connections\n const removedNodes = this.Nodes.filter(n => this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n this.Nodes = this.Nodes.filter(n => !this.selectedNodeIDs.some(id => UUIDsEqual(id, n.ID)));\n\n // Also remove connections attached to deleted nodes\n const deletedNodeIDs = new Set(this.selectedNodeIDs.map(id => NormalizeUUID(id)));\n const orphanedConnections = this.Connections.filter(\n c => deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) || deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n this.Connections = this.Connections.filter(\n c => !deletedNodeIDs.has(NormalizeUUID(c.SourceNodeID)) && !deletedNodeIDs.has(NormalizeUUID(c.TargetNodeID))\n );\n\n for (const conn of orphanedConnections) {\n this.ConnectionRemoved.emit(conn);\n }\n for (const node of removedNodes) {\n this.NodeRemoved.emit(node);\n }\n\n this.NodesChanged.emit(this.Nodes);\n this.ConnectionsChanged.emit(this.Connections);\n this.cdr.detectChanges();\n }\n\n private generateId(): string {\n return 'flow-' + Math.random().toString(36).substring(2, 11);\n }\n}\n","<div class=\"mj-flow-editor\" [class.mj-flow-editor--readonly]=\"ReadOnly\" tabindex=\"0\">\n\n <!-- Canvas Toolbar -->\n @if (ShowToolbar) {\n <div class=\"mj-flow-editor-toolbar-area\">\n <mj-flow-toolbar\n [ZoomLevel]=\"zoomLevel\"\n [ShowGrid]=\"ShowGrid\"\n [ShowMinimap]=\"ShowMinimap\"\n [ShowLegend]=\"ShowLegend\"\n [ReadOnly]=\"ReadOnly\"\n [PanMode]=\"panMode\"\n (ZoomInClicked)=\"ZoomIn()\"\n (ZoomOutClicked)=\"ZoomOut()\"\n (FitToScreenClicked)=\"ZoomToFit()\"\n (AutoLayoutClicked)=\"AutoArrange()\"\n (GridToggled)=\"onGridToggled($event)\"\n (MinimapToggled)=\"onMinimapToggled($event)\"\n (LegendToggled)=\"onLegendToggled($event)\"\n (PanModeToggled)=\"onPanModeToggled($event)\">\n </mj-flow-toolbar>\n </div>\n }\n\n <!-- Main Canvas Area -->\n <div class=\"mj-flow-editor-canvas-area\">\n\n <!-- Palette Sidebar -->\n @if (ShowPalette && !ReadOnly) {\n <mj-flow-palette\n [NodeTypes]=\"NodeTypes\">\n </mj-flow-palette>\n }\n\n <!-- Foblex Canvas -->\n <div class=\"mj-flow-editor-canvas\"\n [class.mj-flow-editor-canvas--pan-mode]=\"panMode\">\n <f-flow fDraggable\n [fDraggableDisabled]=\"false\"\n [fCanvasMoveTrigger]=\"canvasMoveTriggerFn\"\n [vCellSize]=\"GridSize\"\n [hCellSize]=\"GridSize\"\n [fCellSizeWhileDragging]=\"ShowGrid\"\n (fLoaded)=\"onFlowLoaded()\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n (fReassignConnection)=\"onReassignConnection($event)\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fSelectionChange)=\"onSelectionChange($event)\"\n (fMoveNodes)=\"onNodesMoved($event)\">\n\n <!-- Background grid — MUST be direct child of f-flow (Foblex content projection requires it) -->\n @if (ShowGrid) {\n <f-background>\n <f-circle-pattern [color]=\"'#94a3b8'\" [radius]=\"24\"></f-circle-pattern>\n </f-background>\n }\n\n <!-- Alignment snap lines — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-line-alignment [fAlignThreshold]=\"10\"></f-line-alignment>\n }\n\n <f-canvas fZoom #fZoomRef=\"fComponent\"\n [fZoomMinimum]=\"0.15\"\n [fZoomMaximum]=\"3\"\n [fZoomStep]=\"0.1\"\n [position]=\"canvasPosition\"\n [scale]=\"canvasScale\"\n (fCanvasChange)=\"onCanvasChange($event)\">\n\n <!-- Interactive connection drawing -->\n @if (!ReadOnly) {\n <f-connection-for-create\n fType=\"bezier\"\n [fRadius]=\"8\"\n [fOffset]=\"12\">\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" fill=\"#94a3b8\"/>\n </svg>\n </f-connection-for-create>\n }\n\n <!-- Connections -->\n @for (conn of Connections; track trackConnectionById($index, conn)) {\n <f-connection\n [fConnectionId]=\"conn.ID\"\n [fOutputId]=\"conn.SourcePortID\"\n [fInputId]=\"conn.TargetPortID\"\n fType=\"bezier\"\n fBehavior=\"fixed\"\n [fRadius]=\"8\"\n [fOffset]=\"12\"\n [fSelectionDisabled]=\"false\"\n [fReassignDisabled]=\"ReadOnly\"\n [style.--connection-color]=\"conn.Color || '#94a3b8'\"\n [class.mj-flow-connection-colored]=\"!!conn.Color\"\n [class.mj-flow-connection-dashed]=\"conn.Style === 'dashed'\"\n [class.mj-flow-connection-dotted]=\"conn.Style === 'dotted'\"\n (click)=\"onConnectionClicked($event, conn)\"\n (contextmenu)=\"onConnectionContextMenu($event, conn)\">\n <!-- Arrow marker -->\n <svg viewBox=\"0 0 10 10\" fMarker type=\"end\"\n orient=\"auto\" [refX]=\"9\" [refY]=\"5\" [height]=\"10\" [width]=\"10\">\n <path d=\"M0 0L10 5L0 10Z\" [attr.fill]=\"conn.Color || '#94a3b8'\"/>\n </svg>\n <!-- Connection label -->\n @if (conn.Label) {\n <div fConnectionContent [position]=\"0.5\"\n class=\"mj-flow-connection-label\"\n [style.backgroundColor]=\"ConnectionLabelBackground\"\n [style.borderColor]=\"ConnectionLabelBorderColor\"\n [style.color]=\"ConnectionLabelTextColor\"\n [title]=\"conn.LabelDetail || conn.Label || ''\">\n @if (conn.LabelIcon) {\n <i\n class=\"fa-solid mj-flow-connection-label-icon\"\n [ngClass]=\"conn.LabelIcon\"\n [style.color]=\"conn.LabelIconColor || 'inherit'\"></i>\n }\n {{ conn.Label }}\n </div>\n }\n </f-connection>\n }\n\n <!-- Nodes -->\n @for (node of Nodes; track trackNodeById($index, node)) {\n <mj-flow-node\n fNode\n fDragHandle\n [fNodeId]=\"node.ID\"\n [fNodePosition]=\"{ x: node.Position.X, y: node.Position.Y }\"\n [fNodeDraggingDisabled]=\"ReadOnly || panMode || node.Locked === true\"\n [fNodeSelectionDisabled]=\"panMode\"\n [fConnectOnNode]=\"!ReadOnly && !panMode\"\n [Node]=\"node\"\n [TypeConfig]=\"GetTypeConfig(node.Type)\"\n [ReadOnly]=\"ReadOnly\"\n (contextmenu)=\"onNodeContextMenu($event, node)\">\n </mj-flow-node>\n }\n\n </f-canvas>\n\n <!-- Rubber-band selection — direct child of f-flow -->\n @if (!ReadOnly) {\n <f-selection-area></f-selection-area>\n }\n\n <!-- Minimap -->\n @if (ShowMinimap) {\n <div class=\"mj-flow-editor-minimap\" fDragBlocker>\n <f-minimap [fMinSize]=\"1500\"></f-minimap>\n </div>\n }\n </f-flow>\n\n <!-- Legend -->\n @if (ShowLegend && Nodes.length > 0) {\n <div class=\"mj-flow-editor-legend\">\n <div class=\"mj-flow-editor-legend-title\">Legend</div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Connections</div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#64748b\" stroke-width=\"2\"/></svg>\n <span>Only exit path</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#16a34a\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-circle-check\" style=\"color:#16a34a;font-size:10px;\"></i>\n <span>Default (fallback)</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#f59e0b\" stroke-width=\"2\" stroke-dasharray=\"5 3\"/></svg>\n <span>Conditional</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <svg class=\"mj-flow-editor-legend-line-svg\" width=\"28\" height=\"10\"><line x1=\"0\" y1=\"5\" x2=\"28\" y2=\"5\" stroke=\"#ef4444\" stroke-width=\"2\"/></svg>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ef4444;font-size:10px;\"></i>\n <span>Duplicate defaults</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Step Types</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#3B82F6\"></span>\n <span>Action</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#8B5CF6\"></span>\n <span>Prompt</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#10B981\"></span>\n <span>Sub-Agent</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F59E0B\"></span>\n <span>For Each</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-swatch\" style=\"background:#F97316\"></span>\n <span>While</span>\n </div>\n </div>\n <div class=\"mj-flow-editor-legend-section\">\n <div class=\"mj-flow-editor-legend-heading\">Borders</div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#16a34a;background:#f0fdf4;\"></span>\n <span>Start node</span>\n </div>\n <div class=\"mj-flow-editor-legend-item\">\n <span class=\"mj-flow-editor-legend-box\" style=\"border-color:#ef4444;background:#fef2f2;\"></span>\n <i class=\"fa-solid fa-triangle-exclamation\" style=\"color:#ea580c;font-size:10px;\"></i>\n <span>Missing config</span>\n </div>\n </div>\n </div>\n }\n\n <!-- Empty state overlay -->\n @if (Nodes.length === 0) {\n <div class=\"mj-flow-editor-empty\">\n <mj-empty-state\n Icon=\"fa-solid fa-diagram-project\"\n [Title]=\"EmptyStateTitle\">\n @if (!ReadOnly) {\n <p class=\"mj-flow-editor-empty-subtitle\">\n Or use auto-layout after adding steps to arrange them automatically\n </p>\n }\n </mj-empty-state>\n </div>\n }\n </div>\n </div>\n\n <!-- Context Menu -->\n @if (contextMenuVisible) {\n <div\n class=\"mj-flow-context-menu\"\n [style.left.px]=\"contextMenuX\"\n [style.top.px]=\"contextMenuY\"\n (click)=\"$event.stopPropagation()\">\n <button class=\"mj-flow-context-menu-item\" (click)=\"onContextMenuAction('edit')\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span>Edit {{ contextMenuTargetType === 'node' ? 'Node' : 'Connection' }}</span>\n </button>\n <div class=\"mj-flow-context-menu-divider\"></div>\n <button class=\"mj-flow-context-menu-item mj-flow-context-menu-item--danger\" (click)=\"onContextMenuAction('remove')\">\n <i class=\"fa-solid fa-trash-can\"></i>\n <span>Remove {{ contextMenuTargetType === 'node' ? 'Node' : 'Connection' }}</span>\n </button>\n </div>\n }\n\n <!-- Status Bar -->\n @if (ShowStatusBar) {\n <mj-flow-status-bar\n [NodeCount]=\"Nodes.length\"\n [ConnectionCount]=\"Connections.length\"\n [SelectedCount]=\"selectedCount\"\n [ZoomLevel]=\"zoomLevel\">\n </mj-flow-status-bar>\n }\n</div>\n"]}
@@ -11,9 +11,10 @@ import * as i9 from "@angular/common";
11
11
  import * as i10 from "@angular/forms";
12
12
  import * as i11 from "@foblex/flow";
13
13
  import * as i12 from "@memberjunction/ng-code-editor";
14
+ import * as i13 from "@memberjunction/ng-ui-components";
14
15
  export declare class FlowEditorModule {
15
16
  static ɵfac: i0.ɵɵFactoryDeclaration<FlowEditorModule, never>;
16
- static ɵmod: i0.ɵɵNgModuleDeclaration<FlowEditorModule, [typeof i1.FlowEditorComponent, typeof i2.FlowNodeComponent, typeof i3.FlowPaletteComponent, typeof i4.FlowToolbarComponent, typeof i5.FlowStatusBarComponent, typeof i6.FlowAgentEditorComponent, typeof i7.AgentPropertiesPanelComponent, typeof i8.AgentStepListComponent], [typeof i9.CommonModule, typeof i10.FormsModule, typeof i11.FFlowModule, typeof i12.CodeEditorModule], [typeof i1.FlowEditorComponent, typeof i2.FlowNodeComponent, typeof i3.FlowPaletteComponent, typeof i4.FlowToolbarComponent, typeof i5.FlowStatusBarComponent, typeof i6.FlowAgentEditorComponent, typeof i7.AgentPropertiesPanelComponent, typeof i8.AgentStepListComponent]>;
17
+ static ɵmod: i0.ɵɵNgModuleDeclaration<FlowEditorModule, [typeof i1.FlowEditorComponent, typeof i2.FlowNodeComponent, typeof i3.FlowPaletteComponent, typeof i4.FlowToolbarComponent, typeof i5.FlowStatusBarComponent, typeof i6.FlowAgentEditorComponent, typeof i7.AgentPropertiesPanelComponent, typeof i8.AgentStepListComponent], [typeof i9.CommonModule, typeof i10.FormsModule, typeof i11.FFlowModule, typeof i12.CodeEditorModule, typeof i13.MJEmptyStateComponent, typeof i13.MJAccordionModule], [typeof i1.FlowEditorComponent, typeof i2.FlowNodeComponent, typeof i3.FlowPaletteComponent, typeof i4.FlowToolbarComponent, typeof i5.FlowStatusBarComponent, typeof i6.FlowAgentEditorComponent, typeof i7.AgentPropertiesPanelComponent, typeof i8.AgentStepListComponent]>;
17
18
  static ɵinj: i0.ɵɵInjectorDeclaration<FlowEditorModule>;
18
19
  }
19
20
  //# sourceMappingURL=flow-editor.module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flow-editor.module.d.ts","sourceRoot":"","sources":["../../src/lib/flow-editor.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAkBA,qBAgCa,gBAAgB;yCAAhB,gBAAgB;0CAAhB,gBAAgB;0CAAhB,gBAAgB;CAAI"}
1
+ {"version":3,"file":"flow-editor.module.d.ts","sourceRoot":"","sources":["../../src/lib/flow-editor.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAmBA,qBAkCa,gBAAgB;yCAAhB,gBAAgB;0CAAhB,gBAAgB;0CAAhB,gBAAgB;CAAI"}
@@ -3,6 +3,7 @@ import { CommonModule } from '@angular/common';
3
3
  import { FormsModule } from '@angular/forms';
4
4
  import { FFlowModule } from '@foblex/flow';
5
5
  import { CodeEditorModule } from '@memberjunction/ng-code-editor';
6
+ import { MJEmptyStateComponent, MJAccordionModule } from '@memberjunction/ng-ui-components';
6
7
  // Generic components
7
8
  import { FlowEditorComponent } from './components/flow-editor.component';
8
9
  import { FlowNodeComponent } from './components/flow-node.component';
@@ -20,7 +21,9 @@ export class FlowEditorModule {
20
21
  static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [CommonModule,
21
22
  FormsModule,
22
23
  FFlowModule,
23
- CodeEditorModule] });
24
+ CodeEditorModule,
25
+ MJEmptyStateComponent,
26
+ MJAccordionModule] });
24
27
  }
25
28
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FlowEditorModule, [{
26
29
  type: NgModule,
@@ -41,7 +44,9 @@ export class FlowEditorModule {
41
44
  CommonModule,
42
45
  FormsModule,
43
46
  FFlowModule,
44
- CodeEditorModule
47
+ CodeEditorModule,
48
+ MJEmptyStateComponent,
49
+ MJAccordionModule
45
50
  ],
46
51
  exports: [
47
52
  // Generic — for any consumer
@@ -70,7 +75,9 @@ export class FlowEditorModule {
70
75
  AgentStepListComponent], imports: [CommonModule,
71
76
  FormsModule,
72
77
  FFlowModule,
73
- CodeEditorModule], exports: [
78
+ CodeEditorModule,
79
+ MJEmptyStateComponent,
80
+ MJAccordionModule], exports: [
74
81
  // Generic — for any consumer
75
82
  FlowEditorComponent,
76
83
  FlowNodeComponent,
@@ -1 +1 @@
1
- {"version":3,"file":"flow-editor.module.js","sourceRoot":"","sources":["../../src/lib/flow-editor.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,qBAAqB;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,4BAA4B;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;;AAkClF,MAAM,OAAO,gBAAgB;0GAAhB,gBAAgB;4DAAhB,gBAAgB;gEAlBzB,YAAY;YACZ,WAAW;YACX,WAAW;YACX,gBAAgB;;iFAeP,gBAAgB;cAhC5B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,UAAU;oBACV,mBAAmB;oBACnB,iBAAiB;oBACjB,oBAAoB;oBACpB,oBAAoB;oBACpB,sBAAsB;oBACtB,iBAAiB;oBACjB,wBAAwB;oBACxB,6BAA6B;oBAC7B,sBAAsB;iBACvB;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,WAAW;oBACX,gBAAgB;iBACjB;gBACD,OAAO,EAAE;oBACP,6BAA6B;oBAC7B,mBAAmB;oBACnB,iBAAiB;oBACjB,oBAAoB;oBACpB,oBAAoB;oBACpB,sBAAsB;oBACtB,iBAAiB;oBACjB,wBAAwB;oBACxB,6BAA6B;oBAC7B,sBAAsB;iBACvB;aACF;;wFACY,gBAAgB;QA9BzB,UAAU;QACV,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,iBAAiB;QACjB,wBAAwB;QACxB,6BAA6B;QAC7B,sBAAsB,aAGtB,YAAY;QACZ,WAAW;QACX,WAAW;QACX,gBAAgB;QAGhB,6BAA6B;QAC7B,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,iBAAiB;QACjB,wBAAwB;QACxB,6BAA6B;QAC7B,sBAAsB","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FFlowModule } from '@foblex/flow';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\n\n// Generic components\nimport { FlowEditorComponent } from './components/flow-editor.component';\nimport { FlowNodeComponent } from './components/flow-node.component';\nimport { FlowPaletteComponent } from './components/flow-palette.component';\nimport { FlowToolbarComponent } from './components/flow-toolbar.component';\nimport { FlowStatusBarComponent } from './components/flow-status-bar.component';\n\n// Agent-specific components\nimport { FlowAgentEditorComponent } from './agent-editor/flow-agent-editor.component';\nimport { AgentPropertiesPanelComponent } from './agent-editor/agent-properties-panel.component';\nimport { AgentStepListComponent } from './agent-editor/agent-step-list.component';\n\n@NgModule({\n declarations: [\n // Generic\n FlowEditorComponent,\n FlowNodeComponent,\n FlowPaletteComponent,\n FlowToolbarComponent,\n FlowStatusBarComponent,\n // Agent-specific\n FlowAgentEditorComponent,\n AgentPropertiesPanelComponent,\n AgentStepListComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n FFlowModule,\n CodeEditorModule\n ],\n exports: [\n // Generic — for any consumer\n FlowEditorComponent,\n FlowNodeComponent,\n FlowPaletteComponent,\n FlowToolbarComponent,\n FlowStatusBarComponent,\n // Agent-specific\n FlowAgentEditorComponent,\n AgentPropertiesPanelComponent,\n AgentStepListComponent\n ]\n})\nexport class FlowEditorModule { }\n"]}
1
+ {"version":3,"file":"flow-editor.module.js","sourceRoot":"","sources":["../../src/lib/flow-editor.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAE5F,qBAAqB;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAEhF,4BAA4B;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AACtF,OAAO,EAAE,6BAA6B,EAAE,MAAM,iDAAiD,CAAC;AAChG,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;;AAoClF,MAAM,OAAO,gBAAgB;0GAAhB,gBAAgB;4DAAhB,gBAAgB;gEApBzB,YAAY;YACZ,WAAW;YACX,WAAW;YACX,gBAAgB;YAChB,qBAAqB;YACrB,iBAAiB;;iFAeR,gBAAgB;cAlC5B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,UAAU;oBACV,mBAAmB;oBACnB,iBAAiB;oBACjB,oBAAoB;oBACpB,oBAAoB;oBACpB,sBAAsB;oBACtB,iBAAiB;oBACjB,wBAAwB;oBACxB,6BAA6B;oBAC7B,sBAAsB;iBACvB;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,WAAW;oBACX,gBAAgB;oBAChB,qBAAqB;oBACrB,iBAAiB;iBAClB;gBACD,OAAO,EAAE;oBACP,6BAA6B;oBAC7B,mBAAmB;oBACnB,iBAAiB;oBACjB,oBAAoB;oBACpB,oBAAoB;oBACpB,sBAAsB;oBACtB,iBAAiB;oBACjB,wBAAwB;oBACxB,6BAA6B;oBAC7B,sBAAsB;iBACvB;aACF;;wFACY,gBAAgB;QAhCzB,UAAU;QACV,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,iBAAiB;QACjB,wBAAwB;QACxB,6BAA6B;QAC7B,sBAAsB,aAGtB,YAAY;QACZ,WAAW;QACX,WAAW;QACX,gBAAgB;QAChB,qBAAqB;QACrB,iBAAiB;QAGjB,6BAA6B;QAC7B,mBAAmB;QACnB,iBAAiB;QACjB,oBAAoB;QACpB,oBAAoB;QACpB,sBAAsB;QACtB,iBAAiB;QACjB,wBAAwB;QACxB,6BAA6B;QAC7B,sBAAsB","sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FFlowModule } from '@foblex/flow';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport { MJEmptyStateComponent, MJAccordionModule } from '@memberjunction/ng-ui-components';\n\n// Generic components\nimport { FlowEditorComponent } from './components/flow-editor.component';\nimport { FlowNodeComponent } from './components/flow-node.component';\nimport { FlowPaletteComponent } from './components/flow-palette.component';\nimport { FlowToolbarComponent } from './components/flow-toolbar.component';\nimport { FlowStatusBarComponent } from './components/flow-status-bar.component';\n\n// Agent-specific components\nimport { FlowAgentEditorComponent } from './agent-editor/flow-agent-editor.component';\nimport { AgentPropertiesPanelComponent } from './agent-editor/agent-properties-panel.component';\nimport { AgentStepListComponent } from './agent-editor/agent-step-list.component';\n\n@NgModule({\n declarations: [\n // Generic\n FlowEditorComponent,\n FlowNodeComponent,\n FlowPaletteComponent,\n FlowToolbarComponent,\n FlowStatusBarComponent,\n // Agent-specific\n FlowAgentEditorComponent,\n AgentPropertiesPanelComponent,\n AgentStepListComponent\n ],\n imports: [\n CommonModule,\n FormsModule,\n FFlowModule,\n CodeEditorModule,\n MJEmptyStateComponent,\n MJAccordionModule\n ],\n exports: [\n // Generic — for any consumer\n FlowEditorComponent,\n FlowNodeComponent,\n FlowPaletteComponent,\n FlowToolbarComponent,\n FlowStatusBarComponent,\n // Agent-specific\n FlowAgentEditorComponent,\n AgentPropertiesPanelComponent,\n AgentStepListComponent\n ]\n})\nexport class FlowEditorModule { }\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-flow-editor",
3
- "version": "5.43.0",
3
+ "version": "5.45.0",
4
4
  "description": "MemberJunction: Generic visual flow editor component powered by Foblex Flow, with an agent-specific Flow Agent Editor",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -26,6 +26,7 @@
26
26
  "devDependencies": {
27
27
  "@angular/compiler": "21.1.3",
28
28
  "@angular/compiler-cli": "21.1.3",
29
+ "@memberjunction/ng-test-utils": "5.45.0",
29
30
  "sass": "^1.97.3",
30
31
  "vitest": "^4.0.18"
31
32
  },
@@ -36,17 +37,18 @@
36
37
  "@angular/platform-browser": "21.1.3"
37
38
  },
38
39
  "dependencies": {
40
+ "@memberjunction/ng-ui-components": "5.45.0",
39
41
  "@dagrejs/dagre": "^1.1.8",
40
42
  "@foblex/2d": "1.2.2",
41
43
  "@foblex/flow": "^18.0.0",
42
44
  "@foblex/mediator": "1.1.3",
43
45
  "@foblex/platform": "1.0.4",
44
46
  "@foblex/utils": "1.1.1",
45
- "@memberjunction/core": "5.43.0",
46
- "@memberjunction/core-entities": "5.43.0",
47
- "@memberjunction/global": "5.43.0",
48
- "@memberjunction/ng-base-types": "5.43.0",
49
- "@memberjunction/ng-code-editor": "5.43.0",
47
+ "@memberjunction/core": "5.45.0",
48
+ "@memberjunction/core-entities": "5.45.0",
49
+ "@memberjunction/global": "5.45.0",
50
+ "@memberjunction/ng-base-types": "5.45.0",
51
+ "@memberjunction/ng-code-editor": "5.45.0",
50
52
  "rxjs": "^7.8.2",
51
53
  "tslib": "^2.8.1"
52
54
  },
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=exports.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":""}
@@ -1,17 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { existsSync } from 'fs';
3
- import { resolve } from 'path';
4
- describe('@memberjunction/ng-flow-editor', () => {
5
- it('should have a public API entry point', () => {
6
- const pkgRoot = resolve(__dirname, '../..');
7
- const hasPublicApi = existsSync(resolve(pkgRoot, 'src/public-api.ts'));
8
- const hasIndex = existsSync(resolve(pkgRoot, 'src/index.ts'));
9
- expect(hasPublicApi || hasIndex).toBe(true);
10
- });
11
- it('should have a package.json with correct name', () => {
12
- const pkgRoot = resolve(__dirname, '../..');
13
- const pkg = require(resolve(pkgRoot, 'package.json'));
14
- expect(pkg.name).toBe('@memberjunction/ng-flow-editor');
15
- });
16
- });
17
- //# sourceMappingURL=exports.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { existsSync } from 'fs';\nimport { resolve } from 'path';\n\ndescribe('@memberjunction/ng-flow-editor', () => {\n it('should have a public API entry point', () => {\n const pkgRoot = resolve(__dirname, '../..');\n const hasPublicApi = existsSync(resolve(pkgRoot, 'src/public-api.ts'));\n const hasIndex = existsSync(resolve(pkgRoot, 'src/index.ts'));\n expect(hasPublicApi || hasIndex).toBe(true);\n });\n\n it('should have a package.json with correct name', () => {\n const pkgRoot = resolve(__dirname, '../..');\n const pkg = require(resolve(pkgRoot, 'package.json'));\n expect(pkg.name).toBe('@memberjunction/ng-flow-editor');\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- describe('@memberjunction/ng-flow-editor', () => {
3
- it('should have a passing test', () => {
4
- expect(true).toBe(true);
5
- });
6
- });
7
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it, expect } from 'vitest';\n\ndescribe('@memberjunction/ng-flow-editor', () => {\n it('should have a passing test', () => {\n expect(true).toBe(true);\n });\n});\n"]}