@memberjunction/ng-entity-relationship-diagram 5.11.0 → 5.13.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.
- package/dist/lib/components/entity-details/entity-details.component.js +2 -2
- package/dist/lib/components/erd-diagram.component.d.ts +2 -0
- package/dist/lib/components/erd-diagram.component.d.ts.map +1 -1
- package/dist/lib/components/erd-diagram.component.js +46 -27
- package/dist/lib/components/erd-diagram.component.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erd-diagram.component.js","sourceRoot":"","sources":["../../../src/lib/components/erd-diagram.component.ts","../../../src/lib/components/erd-diagram.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport * as d3 from 'd3';\nimport {\n ERDNode,\n ERDField,\n ERDLink,\n ERDConfig,\n ERDNodeClickEvent,\n ERDNodeDoubleClickEvent,\n ERDLinkClickEvent,\n ERDZoomEvent,\n ERDColorScheme,\n ERDState,\n ERDNodeHoverEvent,\n ERDLinkHoverEvent,\n ERDNodeContextMenuEvent,\n ERDLinkContextMenuEvent,\n ERDDiagramContextMenuEvent,\n ERDNodeDragEvent,\n ERDRelationshipInfo,\n ERDLayoutAlgorithm,\n ERDDagreConfig\n} from '../interfaces/erd-types';\nimport * as dagre from '@dagrejs/dagre';\n\n/**\n * Internal node representation for D3 force simulation.\n * Extends ERDNode with position and simulation-specific properties.\n * @internal\n */\ninterface InternalNode {\n id: string;\n name: string;\n node: ERDNode;\n x?: number;\n y?: number;\n fx?: number | null;\n fy?: number | null;\n width: number;\n height: number;\n primaryKeys: ERDField[];\n foreignKeys: ERDField[];\n}\n\n/**\n * Internal link representation for D3 force simulation.\n * @internal\n */\ninterface InternalLink {\n source: string | InternalNode;\n target: string | InternalNode;\n sourceField: ERDField;\n targetField?: ERDField;\n isSelfReference: boolean;\n /** Edge points computed by dagre for orthogonal routing */\n points?: Array<{ x: number; y: number }>;\n}\n\n/**\n * Default configuration values for the ERD diagram.\n * These values provide a good starting point for most use cases.\n */\n/** Default dagre configuration */\nconst DEFAULT_DAGRE_CONFIG: Required<ERDDagreConfig> = {\n rankDir: 'LR',\n nodeSep: 80, // Increased from 50 - more vertical space between nodes in same rank\n rankSep: 150, // Increased from 100 - more horizontal space between ranks for labels\n edgeSep: 20, // Increased from 10 - more space between edge paths\n ranker: 'network-simplex',\n align: undefined as unknown as 'UL' | 'UR' | 'DL' | 'DR'\n};\n\nconst DEFAULT_CONFIG: Required<ERDConfig> = {\n nodeWidth: 180,\n nodeBaseHeight: 60,\n fieldHeight: 20,\n maxNodeHeight: 300,\n chargeStrength: -800,\n linkDistance: 80,\n collisionPadding: 20,\n showFieldDetails: true,\n showRelationshipLabels: true,\n showHeader: true,\n showNodeCount: true,\n showMinimap: false,\n showLegend: false,\n enableDragging: true,\n enableZoom: true,\n enablePan: true,\n minZoom: 0.1,\n maxZoom: 4,\n initialZoom: 1,\n enableMultiSelect: false,\n animationDuration: 750,\n fitOnLoad: true,\n skipAnimation: false,\n emptyStateMessage: 'No entities to display',\n emptyStateIcon: 'fa-solid fa-diagram-project',\n layoutAlgorithm: 'dagre',\n dagreConfig: DEFAULT_DAGRE_CONFIG,\n colors: {\n nodeBackground: '#f8f9fa',\n nodeBorder: '#333',\n nodeHeader: '#007bff',\n nodeHeaderText: 'white',\n primaryKeyBackground: '#fff3cd',\n primaryKeyText: '#856404',\n foreignKeyBackground: '#cce5ff',\n foreignKeyText: '#004085',\n linkColor: '#666',\n selectedBorder: '#4CAF50',\n highlightBorder: '#ff9800',\n relatedBorder: '#ff6b35'\n }\n};\n\n/**\n * Entity Relationship Diagram component using D3.js force-directed graph.\n *\n * This is a **generic, reusable Angular component** that can visualize any data\n * that conforms to the `ERDNode` interface. It is completely decoupled from\n * MemberJunction-specific types and can be used in any Angular project.\n *\n * ## Features\n *\n * - **Interactive Force-Directed Layout**: Nodes automatically arrange themselves\n * using physics-based simulation with customizable forces\n * - **Zoom and Pan**: Mouse wheel zoom and drag-to-pan with configurable limits\n * - **Node Selection**: Click to select nodes with visual highlighting\n * - **Focus Mode**: Show a single node with its N-hop related entities\n * - **Relationship Visualization**: Arrows show foreign key relationships\n * - **Customizable Styling**: Full control over colors, sizes, and appearance\n * - **Rich Event System**: Comprehensive events for integration with parent components\n * - **State Persistence**: Save and restore diagram state (zoom, pan, selection, positions)\n *\n * ## Basic Usage\n *\n * ```html\n * <mj-erd-diagram\n * [nodes]=\"entityNodes\"\n * [selectedNodeId]=\"selectedId\"\n * [config]=\"erdConfig\"\n * (nodeClick)=\"onNodeClick($event)\"\n * (nodeSelected)=\"onNodeSelected($event)\"\n * (zoomChange)=\"onZoomChange($event)\">\n * </mj-erd-diagram>\n * ```\n *\n * ## Focus Mode Example\n *\n * Show a single entity with its immediate relationships:\n *\n * ```html\n * <mj-erd-diagram\n * [nodes]=\"allNodes\"\n * [focusNodeId]=\"'user-entity-id'\"\n * [focusDepth]=\"1\"\n * (nodeSelected)=\"onNodeSelected($event)\">\n * </mj-erd-diagram>\n * ```\n *\n * ## State Persistence Example\n *\n * ```typescript\n * // Save state\n * const state = this.erdDiagram.getState();\n * localStorage.setItem('erd-state', JSON.stringify(state));\n *\n * // Restore state\n * const savedState = JSON.parse(localStorage.getItem('erd-state'));\n * this.erdDiagram.setState(savedState);\n * ```\n *\n * @see ERDNode for the node data structure\n * @see ERDConfig for configuration options\n * @see ERDState for state persistence\n */\n@Component({\n standalone: false,\n selector: 'mj-erd-diagram',\n templateUrl: './erd-diagram.component.html',\n styleUrls: ['./erd-diagram.component.css']\n})\nexport class ERDDiagramComponent implements AfterViewInit, OnDestroy, OnChanges {\n @ViewChild('erdContainer', { static: false }) erdContainer!: ElementRef;\n\n // ============================================================================\n // INPUTS - Data\n // ============================================================================\n\n /**\n * The nodes (entities) to display in the diagram.\n * Each node should conform to the `ERDNode` interface.\n *\n * @example\n * ```typescript\n * nodes: ERDNode[] = [\n * {\n * id: 'user-1',\n * name: 'Users',\n * fields: [\n * { id: 'id', name: 'ID', isPrimaryKey: true },\n * { id: 'email', name: 'Email', isPrimaryKey: false }\n * ]\n * }\n * ];\n * ```\n */\n @Input() nodes: ERDNode[] = [];\n\n /**\n * ID of the currently selected node.\n * Use this for external control of selection state.\n * The component will highlight this node and emit selection events accordingly.\n *\n * @example `[selectedNodeId]=\"'entity-123'\"`\n */\n @Input() selectedNodeId: string | null = null;\n\n /**\n * IDs of nodes to highlight (in addition to selected node).\n * Highlighted nodes receive a distinct visual style (orange border by default).\n * Useful for showing search results or related items.\n *\n * @example `[highlightedNodeIds]=\"['entity-1', 'entity-2']\"`\n */\n @Input() highlightedNodeIds: string[] = [];\n\n /**\n * ID of the node to focus on.\n * When set, the diagram will only show this node and its related nodes\n * up to `focusDepth` hops away. This is useful for entity-centric views.\n *\n * Set to `null` to show all nodes.\n *\n * @example `[focusNodeId]=\"'user-entity-id'\"`\n */\n @Input() focusNodeId: string | null = null;\n\n /**\n * Number of relationship hops to include when in focus mode.\n * - `0`: Show only the focus node\n * - `1`: Show focus node + directly related nodes\n * - `2`: Show focus node + nodes within 2 relationship hops\n *\n * Only applies when `focusNodeId` is set.\n *\n * @default 1\n * @example `[focusDepth]=\"2\"`\n */\n @Input() focusDepth = 1;\n\n // ============================================================================\n // INPUTS - State\n // ============================================================================\n\n /**\n * Whether the diagram is currently refreshing/loading.\n * When `true`, displays a loading overlay on the diagram.\n *\n * @example `[isRefreshing]=\"isLoadingData\"`\n */\n @Input() isRefreshing = false;\n\n /**\n * Whether the diagram is in read-only mode.\n * When `true`, disables dragging and selection (zoom/pan still work).\n *\n * @default false\n */\n @Input() readOnly = false;\n\n // ============================================================================\n // INPUTS - Configuration\n // ============================================================================\n\n /**\n * Configuration options for the diagram.\n * All options are optional with sensible defaults.\n *\n * @see ERDConfig for all available options\n * @example\n * ```typescript\n * config: ERDConfig = {\n * nodeWidth: 200,\n * chargeStrength: -1000,\n * colors: {\n * nodeHeader: '#0066cc'\n * }\n * };\n * ```\n */\n @Input() config: ERDConfig = {};\n\n /**\n * Whether to show the header bar with zoom controls.\n * Set to `false` to hide the header and use programmatic control instead.\n *\n * @default true\n */\n @Input() showHeader = true;\n\n /**\n * Title to display in the header bar.\n * Only visible when `showHeader` is `true`.\n *\n * @default 'Entity Relationship Diagram'\n */\n @Input() headerTitle = 'Entity Relationship Diagram';\n\n // ============================================================================\n // OUTPUTS - Selection Events\n // ============================================================================\n\n /**\n * Emitted when a node is clicked.\n * Set `event.cancel = true` to prevent the default selection behavior.\n *\n * @example\n * ```typescript\n * onNodeClick(event: ERDNodeClickEvent) {\n * console.log('Clicked:', event.node.name);\n * // Prevent selection for certain nodes\n * if (event.node.customData?.['locked']) {\n * event.cancel = true;\n * }\n * }\n * ```\n */\n @Output() nodeClick = new EventEmitter<ERDNodeClickEvent>();\n\n /**\n * Emitted when a node is double-clicked.\n * Useful for opening detail views or triggering actions.\n *\n * @example\n * ```typescript\n * onNodeDoubleClick(event: ERDNodeDoubleClickEvent) {\n * this.openEntityDetail(event.node.id);\n * }\n * ```\n */\n @Output() nodeDoubleClick = new EventEmitter<ERDNodeDoubleClickEvent>();\n\n /**\n * Emitted when a node is selected (after click, unless cancelled).\n * The node parameter contains the full `ERDNode` data.\n */\n @Output() nodeSelected = new EventEmitter<ERDNode>();\n\n /**\n * Emitted when the current node is deselected.\n * This happens when clicking the background or selecting a different node.\n */\n @Output() nodeDeselected = new EventEmitter<void>();\n\n /**\n * Emitted when a relationship link is clicked.\n * The event includes both source and target nodes for context.\n */\n @Output() linkClick = new EventEmitter<ERDLinkClickEvent>();\n\n // ============================================================================\n // OUTPUTS - Hover Events\n // ============================================================================\n\n /**\n * Emitted when the mouse enters a node.\n * Includes related nodes and position for tooltip display.\n *\n * @example\n * ```typescript\n * onNodeHover(event: ERDNodeHoverEvent) {\n * this.showTooltip(event.node, event.position);\n * }\n * ```\n */\n @Output() nodeHover = new EventEmitter<ERDNodeHoverEvent>();\n\n /**\n * Emitted when the mouse leaves a node.\n */\n @Output() nodeHoverEnd = new EventEmitter<ERDNode>();\n\n /**\n * Emitted when the mouse enters a relationship link.\n */\n @Output() linkHover = new EventEmitter<ERDLinkHoverEvent>();\n\n /**\n * Emitted when the mouse leaves a relationship link.\n */\n @Output() linkHoverEnd = new EventEmitter<ERDLink>();\n\n // ============================================================================\n // OUTPUTS - Context Menu Events\n // ============================================================================\n\n /**\n * Emitted when a node is right-clicked.\n * Set `event.cancel = true` to prevent the default browser context menu.\n *\n * @example\n * ```typescript\n * onNodeContextMenu(event: ERDNodeContextMenuEvent) {\n * event.cancel = true;\n * this.showContextMenu(event.node, event.position);\n * }\n * ```\n */\n @Output() nodeContextMenu = new EventEmitter<ERDNodeContextMenuEvent>();\n\n /**\n * Emitted when a relationship link is right-clicked.\n */\n @Output() linkContextMenu = new EventEmitter<ERDLinkContextMenuEvent>();\n\n /**\n * Emitted when the diagram background is right-clicked.\n * Includes diagram coordinates for adding new nodes at click position.\n */\n @Output() diagramContextMenu = new EventEmitter<ERDDiagramContextMenuEvent>();\n\n // ============================================================================\n // OUTPUTS - Drag Events\n // ============================================================================\n\n /**\n * Emitted when a node drag operation starts.\n * Set `event.cancel = true` to prevent the drag.\n */\n @Output() nodeDragStart = new EventEmitter<ERDNodeDragEvent>();\n\n /**\n * Emitted when a node drag operation ends.\n */\n @Output() nodeDragEnd = new EventEmitter<ERDNodeDragEvent>();\n\n // ============================================================================\n // OUTPUTS - Diagram Events\n // ============================================================================\n\n /**\n * Emitted when zoom level or pan position changes.\n * Useful for synchronizing zoom controls or saving view state.\n */\n @Output() zoomChange = new EventEmitter<ERDZoomEvent>();\n\n /**\n * Emitted when the diagram requests a refresh.\n * Triggered by the refresh button in the header.\n */\n @Output() refreshRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the force simulation completes initial layout.\n * Useful for performing actions after nodes have settled.\n */\n @Output() layoutComplete = new EventEmitter<void>();\n\n /**\n * Emitted when diagram state changes (selection, zoom, highlights).\n * Useful for auto-saving state or syncing with other components.\n */\n @Output() stateChange = new EventEmitter<ERDState>();\n\n // ============================================================================\n // PRIVATE STATE\n // ============================================================================\n\n private svg: d3.Selection<SVGSVGElement, unknown, null, undefined> | null = null;\n private simulation: d3.Simulation<InternalNode, InternalLink> | null = null;\n private internalNodes: InternalNode[] = [];\n private internalLinks: InternalLink[] = [];\n private visibleNodes: InternalNode[] = [];\n private visibleLinks: InternalLink[] = [];\n private zoom: d3.ZoomBehavior<SVGSVGElement, unknown> | null = null;\n private resizeObserver?: ResizeObserver;\n private lastKnownSize = { width: 0, height: 0 };\n private resizeTimeout?: number;\n private mergedConfig: Required<ERDConfig> = DEFAULT_CONFIG;\n private layoutCompleted = false;\n private isLayoutFrozen = false;\n\n // ============================================================================\n // LIFECYCLE HOOKS\n // ============================================================================\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n this.setupERD();\n }, 100);\n\n this.setupResizeObserver();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['nodes'] && !changes['nodes'].firstChange) {\n this.setupERD();\n }\n\n if (changes['selectedNodeId'] && !changes['selectedNodeId'].firstChange) {\n this.updateSelectionHighlighting();\n this.emitStateChange();\n }\n\n if (changes['highlightedNodeIds'] && !changes['highlightedNodeIds'].firstChange) {\n this.updateHighlighting();\n this.emitStateChange();\n }\n\n if (changes['focusNodeId'] && !changes['focusNodeId'].firstChange) {\n this.setupERD();\n this.emitStateChange();\n }\n\n if (changes['focusDepth'] && !changes['focusDepth'].firstChange) {\n if (this.focusNodeId) {\n this.setupERD();\n this.emitStateChange();\n }\n }\n\n if (changes['config'] && !changes['config'].firstChange) {\n this.mergeConfig();\n this.setupERD();\n }\n }\n\n ngOnDestroy(): void {\n if (this.simulation) {\n this.simulation.stop();\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n }\n\n // ============================================================================\n // PUBLIC API - Zoom Control\n // ============================================================================\n\n /**\n * Zoom in on the diagram by a fixed factor (1.2x).\n * Uses smooth animation transition.\n */\n public zoomIn(): void {\n if (this.zoom && this.svg) {\n this.svg.transition().duration(300).call(\n this.zoom.scaleBy as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, k: number) => void,\n 1.2\n );\n }\n }\n\n /**\n * Zoom out on the diagram by a fixed factor (0.83x).\n * Uses smooth animation transition.\n */\n public zoomOut(): void {\n if (this.zoom && this.svg) {\n this.svg.transition().duration(300).call(\n this.zoom.scaleBy as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, k: number) => void,\n 0.83\n );\n }\n }\n\n /**\n * Reset zoom to default level (1x) and center the diagram.\n * Uses smooth animation transition.\n */\n public resetZoom(): void {\n if (this.zoom && this.svg) {\n this.svg.transition().duration(500).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity\n );\n }\n }\n\n /**\n * Zoom and pan to center on a specific node.\n *\n * @param nodeId - ID of the node to center on\n * @param scale - Optional zoom scale (default: 1.5)\n *\n * @example\n * ```typescript\n * // Center on node with default zoom\n * this.erdDiagram.zoomToNode('user-entity-id');\n *\n * // Center with custom zoom level\n * this.erdDiagram.zoomToNode('user-entity-id', 2.0);\n * ```\n */\n public zoomToNode(nodeId: string, scale = 1.5): void {\n const node = this.internalNodes.find(n => n.id === nodeId);\n if (!node || !this.zoom || !this.svg) return;\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n const x = width / 2 - (node.x || 0) * scale;\n const y = height / 2 - (node.y || 0) * scale;\n\n this.svg.transition().duration(this.mergedConfig.animationDuration).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity.translate(x, y).scale(scale)\n );\n }\n\n /**\n * Fit all visible nodes within the viewport.\n * Calculates optimal zoom level and position to show all nodes.\n *\n * @param padding - Padding around nodes (default: 50px)\n */\n public zoomToFit(padding = 50): void {\n if (!this.svg || !this.zoom || this.visibleNodes.length === 0) return;\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // Guard against zero container dimensions (container not laid out yet)\n if (width === 0 || height === 0) return;\n\n // Calculate bounds\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n this.visibleNodes.forEach(node => {\n const halfWidth = node.width / 2;\n const halfHeight = node.height / 2;\n minX = Math.min(minX, (node.x || 0) - halfWidth);\n minY = Math.min(minY, (node.y || 0) - halfHeight);\n maxX = Math.max(maxX, (node.x || 0) + halfWidth);\n maxY = Math.max(maxY, (node.y || 0) + halfHeight);\n });\n\n // Guard against invalid bounds (nodes without valid positions)\n if (!isFinite(minX) || !isFinite(minY) || !isFinite(maxX) || !isFinite(maxY)) return;\n\n const boundsWidth = maxX - minX + padding * 2;\n const boundsHeight = maxY - minY + padding * 2;\n\n // Guard against zero-dimension bounds\n if (boundsWidth <= 0 || boundsHeight <= 0) return;\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n\n const scale = Math.min(\n width / boundsWidth,\n height / boundsHeight,\n this.mergedConfig.maxZoom\n );\n\n // Final sanity check before applying transform\n if (!isFinite(scale) || scale <= 0) return;\n\n const translateX = width / 2 - centerX * scale;\n const translateY = height / 2 - centerY * scale;\n\n this.svg.transition().duration(this.mergedConfig.animationDuration).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity.translate(translateX, translateY).scale(scale)\n );\n }\n\n // ============================================================================\n // PUBLIC API - Selection\n // ============================================================================\n\n /**\n * Programmatically select a node by ID.\n *\n * @param nodeId - ID of the node to select\n * @returns `true` if node was found and selected, `false` otherwise\n */\n public selectNode(nodeId: string): boolean {\n const node = this.nodes.find(n => n.id === nodeId);\n if (node) {\n this.nodeSelected.emit(node);\n return true;\n }\n return false;\n }\n\n /**\n * Clear all selections.\n */\n public deselectAll(): void {\n this.nodeDeselected.emit();\n this.clearAllHighlighting();\n }\n\n // ============================================================================\n // PUBLIC API - Highlighting\n // ============================================================================\n\n /**\n * Highlight a specific node.\n *\n * @param nodeId - ID of the node to highlight\n */\n public highlightNode(nodeId: string): void {\n if (!this.highlightedNodeIds.includes(nodeId)) {\n this.highlightedNodeIds = [...this.highlightedNodeIds, nodeId];\n this.updateHighlighting();\n this.emitStateChange();\n }\n }\n\n /**\n * Clear all highlights.\n */\n public clearHighlights(): void {\n this.highlightedNodeIds = [];\n this.updateHighlighting();\n this.emitStateChange();\n }\n\n /**\n * Highlight a node and all its directly related nodes.\n *\n * @param nodeId - ID of the center node\n * @param depth - Number of relationship hops to highlight (default: 1)\n */\n public highlightRelated(nodeId: string, depth = 1): void {\n const relatedIds = this.getRelatedNodeIds(nodeId, depth);\n this.highlightedNodeIds = [nodeId, ...relatedIds];\n this.updateHighlighting();\n this.emitStateChange();\n }\n\n /**\n * Get nodes that are related to a specific node.\n *\n * @param nodeId - ID of the node to find relationships for\n * @param depth - Number of relationship hops (default: 1)\n * @returns Array of relationship information\n */\n public getRelatedNodes(nodeId: string, depth = 1): ERDRelationshipInfo[] {\n const result: ERDRelationshipInfo[] = [];\n const visited = new Set<string>([nodeId]);\n const toProcess = [{ id: nodeId, currentDepth: 0 }];\n\n while (toProcess.length > 0) {\n const current = toProcess.shift()!;\n if (current.currentDepth >= depth) continue;\n\n // Find outgoing relationships\n this.nodes.forEach(node => {\n node.fields.forEach(field => {\n if (field.relatedNodeId) {\n if (node.id === current.id && !visited.has(field.relatedNodeId)) {\n const targetNode = this.nodes.find(n => n.id === field.relatedNodeId);\n if (targetNode) {\n visited.add(field.relatedNodeId);\n toProcess.push({ id: field.relatedNodeId, currentDepth: current.currentDepth + 1 });\n result.push({\n node: targetNode,\n link: {\n sourceNodeId: node.id,\n targetNodeId: field.relatedNodeId,\n sourceField: field,\n isSelfReference: node.id === field.relatedNodeId\n },\n direction: 'outgoing',\n field\n });\n }\n }\n // Incoming relationships\n if (field.relatedNodeId === current.id && !visited.has(node.id)) {\n visited.add(node.id);\n toProcess.push({ id: node.id, currentDepth: current.currentDepth + 1 });\n result.push({\n node,\n link: {\n sourceNodeId: node.id,\n targetNodeId: field.relatedNodeId,\n sourceField: field,\n isSelfReference: node.id === field.relatedNodeId\n },\n direction: 'incoming',\n field\n });\n }\n }\n });\n });\n }\n\n return result;\n }\n\n // ============================================================================\n // PUBLIC API - State Management\n // ============================================================================\n\n /**\n * Get the current state of the diagram for persistence.\n * Includes selection, highlights, zoom, pan, and node positions.\n *\n * @returns Current diagram state\n *\n * @example\n * ```typescript\n * // Save to localStorage\n * const state = erdDiagram.getState();\n * localStorage.setItem('erd-state', JSON.stringify(state));\n * ```\n */\n public getState(): ERDState {\n const zoomState = this.getZoomState();\n const nodePositions: Record<string, { x: number; y: number; fx?: number | null; fy?: number | null }> = {};\n\n this.internalNodes.forEach(node => {\n nodePositions[node.id] = {\n x: node.x || 0,\n y: node.y || 0,\n fx: node.fx,\n fy: node.fy\n };\n });\n\n return {\n selectedNodeId: this.selectedNodeId,\n highlightedNodeIds: [...this.highlightedNodeIds],\n zoomLevel: zoomState.zoomLevel,\n translateX: zoomState.translateX,\n translateY: zoomState.translateY,\n focusNodeId: this.focusNodeId,\n focusDepth: this.focusDepth,\n nodePositions\n };\n }\n\n /**\n * Restore a previously saved diagram state.\n *\n * @param state - State object from `getState()`\n * @param restorePositions - Whether to restore node positions (default: true)\n *\n * @example\n * ```typescript\n * // Restore from localStorage\n * const savedState = JSON.parse(localStorage.getItem('erd-state'));\n * if (savedState) {\n * erdDiagram.setState(savedState);\n * }\n * ```\n */\n public setState(state: Partial<ERDState>, restorePositions = true): void {\n if (state.highlightedNodeIds) {\n this.highlightedNodeIds = [...state.highlightedNodeIds];\n }\n\n // Restore zoom/pan\n if (this.svg && this.zoom && state.zoomLevel != null) {\n this.svg.call(\n this.zoom.transform as unknown as (selection: d3.Selection<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity\n .translate(state.translateX || 0, state.translateY || 0)\n .scale(state.zoomLevel)\n );\n }\n\n // Restore node positions\n if (restorePositions && state.nodePositions) {\n this.internalNodes.forEach(node => {\n const savedPos = state.nodePositions?.[node.id];\n if (savedPos) {\n node.x = savedPos.x;\n node.y = savedPos.y;\n node.fx = savedPos.fx;\n node.fy = savedPos.fy;\n }\n });\n\n // Restart simulation briefly to update display\n if (this.simulation) {\n this.simulation.alpha(0.1).restart();\n }\n }\n\n this.updateSelectionHighlighting();\n this.updateHighlighting();\n }\n\n // ============================================================================\n // PUBLIC API - Layout Control\n // ============================================================================\n\n /**\n * Freeze the layout simulation.\n * Nodes will stay in their current positions and won't move.\n */\n public freezeLayout(): void {\n this.isLayoutFrozen = true;\n if (this.simulation) {\n this.simulation.stop();\n // Fix all node positions\n this.internalNodes.forEach(node => {\n node.fx = node.x;\n node.fy = node.y;\n });\n }\n }\n\n /**\n * Unfreeze the layout simulation.\n * Nodes will resume natural movement based on forces.\n */\n public unfreezeLayout(): void {\n this.isLayoutFrozen = false;\n // Unfix all node positions\n this.internalNodes.forEach(node => {\n node.fx = null;\n node.fy = null;\n });\n if (this.simulation) {\n this.simulation.alpha(0.3).restart();\n }\n }\n\n /**\n * Center the diagram without changing zoom level.\n */\n public centerDiagram(): void {\n if (!this.svg || !this.zoom || this.visibleNodes.length === 0) return;\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // Calculate center of all nodes\n let sumX = 0, sumY = 0;\n this.visibleNodes.forEach(node => {\n sumX += node.x || 0;\n sumY += node.y || 0;\n });\n const centerX = sumX / this.visibleNodes.length;\n const centerY = sumY / this.visibleNodes.length;\n\n const currentTransform = d3.zoomTransform(this.svg.node()!);\n const translateX = width / 2 - centerX * currentTransform.k;\n const translateY = height / 2 - centerY * currentTransform.k;\n\n this.svg.transition().duration(this.mergedConfig.animationDuration).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity.translate(translateX, translateY).scale(currentTransform.k)\n );\n }\n\n // ============================================================================\n // PUBLIC API - Utilities\n // ============================================================================\n\n /**\n * Rebuild the entire ERD visualization.\n */\n public refresh(): void {\n this.setupERD();\n }\n\n /**\n * Trigger a resize recalculation.\n * Call this when the container size changes.\n */\n public triggerResize(): void {\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n this.resizeTimeout = window.setTimeout(() => {\n this.resizeSVG();\n }, 100);\n }\n\n /**\n * Get current zoom state.\n *\n * @returns Current zoom level and translation\n */\n public getZoomState(): ERDZoomEvent {\n if (!this.svg) {\n return { zoomLevel: 1, translateX: 0, translateY: 0 };\n }\n const transform = d3.zoomTransform(this.svg.node()!);\n return {\n zoomLevel: transform.k,\n translateX: transform.x,\n translateY: transform.y\n };\n }\n\n /**\n * Export the diagram as an SVG string.\n *\n * @returns SVG markup string\n */\n public exportAsSVG(): string {\n if (!this.svg) return '';\n\n const svgNode = this.svg.node();\n if (!svgNode) return '';\n\n const serializer = new XMLSerializer();\n return serializer.serializeToString(svgNode);\n }\n\n // ============================================================================\n // SETUP METHODS\n // ============================================================================\n\n private setupERD(): void {\n if (!this.erdContainer?.nativeElement) {\n return;\n }\n\n this.layoutCompleted = false;\n this.mergeConfig();\n this.clearVisualization();\n this.createInternalNodes();\n this.createInternalLinks();\n this.applyFocusMode();\n this.createVisualization();\n }\n\n private mergeConfig(): void {\n this.mergedConfig = {\n ...DEFAULT_CONFIG,\n ...this.config,\n colors: {\n ...DEFAULT_CONFIG.colors,\n ...this.config.colors\n },\n dagreConfig: {\n ...DEFAULT_DAGRE_CONFIG,\n ...this.config.dagreConfig\n }\n };\n\n // Map 'horizontal' and 'vertical' layout algorithms to dagre with appropriate direction\n if (this.mergedConfig.layoutAlgorithm === 'horizontal') {\n this.mergedConfig.dagreConfig.rankDir = 'LR';\n } else if (this.mergedConfig.layoutAlgorithm === 'vertical') {\n this.mergedConfig.dagreConfig.rankDir = 'TB';\n }\n }\n\n private resizeSVG(): void {\n if (!this.svg || !this.erdContainer?.nativeElement) {\n return;\n }\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth || 800;\n const height = container.clientHeight || 600;\n\n if (Math.abs(this.lastKnownSize.width - width) < 5 &&\n Math.abs(this.lastKnownSize.height - height) < 5) {\n return;\n }\n\n this.lastKnownSize = { width, height };\n\n const svgElement = this.svg.node();\n if (svgElement) {\n svgElement.style.width = '100%';\n svgElement.style.height = '100%';\n }\n\n this.svg.attr('viewBox', `0 0 ${width} ${height}`);\n\n if (this.simulation && !this.isLayoutFrozen) {\n this.simulation.force('center', d3.forceCenter(width / 2, height / 2));\n this.simulation.alpha(0.3).restart();\n }\n }\n\n private setupResizeObserver(): void {\n if (!this.erdContainer?.nativeElement) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n this.resizeTimeout = window.setTimeout(() => {\n const container = this.erdContainer?.nativeElement;\n if (!container) return;\n\n const newWidth = container.clientWidth;\n const newHeight = container.clientHeight;\n\n if (Math.abs(this.lastKnownSize.width - newWidth) >= 5 ||\n Math.abs(this.lastKnownSize.height - newHeight) >= 5) {\n requestAnimationFrame(() => {\n this.resizeSVG();\n });\n }\n }, 50);\n });\n\n this.resizeObserver.observe(this.erdContainer.nativeElement);\n }\n\n private clearVisualization(): void {\n if (this.simulation) {\n this.simulation.stop();\n }\n d3.select(this.erdContainer.nativeElement).selectAll('*').remove();\n }\n\n // ============================================================================\n // FOCUS MODE\n // ============================================================================\n\n private applyFocusMode(): void {\n if (!this.focusNodeId) {\n // No focus mode - show all nodes\n this.visibleNodes = [...this.internalNodes];\n this.visibleLinks = [...this.internalLinks];\n return;\n }\n\n // Get IDs of nodes within focus depth\n const visibleIds = new Set<string>([this.focusNodeId]);\n const relatedIds = this.getRelatedNodeIds(this.focusNodeId, this.focusDepth);\n relatedIds.forEach(id => visibleIds.add(id));\n\n // Filter nodes\n this.visibleNodes = this.internalNodes.filter(n => visibleIds.has(n.id));\n\n // Filter links - only show links between visible nodes\n this.visibleLinks = this.internalLinks.filter(link => {\n const sourceId = typeof link.source === 'string' ? link.source : link.source.id;\n const targetId = typeof link.target === 'string' ? link.target : link.target.id;\n return visibleIds.has(sourceId) && visibleIds.has(targetId);\n });\n }\n\n private getRelatedNodeIds(nodeId: string, depth: number): string[] {\n const visited = new Set<string>([nodeId]);\n const toProcess = [{ id: nodeId, currentDepth: 0 }];\n const result: string[] = [];\n\n while (toProcess.length > 0) {\n const current = toProcess.shift()!;\n if (current.currentDepth >= depth) continue;\n\n // Find relationships\n this.nodes.forEach(node => {\n node.fields.forEach(field => {\n if (field.relatedNodeId) {\n // Outgoing from current\n if (node.id === current.id && !visited.has(field.relatedNodeId)) {\n visited.add(field.relatedNodeId);\n result.push(field.relatedNodeId);\n toProcess.push({ id: field.relatedNodeId, currentDepth: current.currentDepth + 1 });\n }\n // Incoming to current\n if (field.relatedNodeId === current.id && !visited.has(node.id)) {\n visited.add(node.id);\n result.push(node.id);\n toProcess.push({ id: node.id, currentDepth: current.currentDepth + 1 });\n }\n }\n });\n });\n }\n\n return result;\n }\n\n // ============================================================================\n // NODE/LINK CREATION\n // ============================================================================\n\n private createInternalNodes(): void {\n const cfg = this.mergedConfig;\n\n this.internalNodes = this.nodes.map(node => {\n const primaryKeys = node.fields.filter(f => f.isPrimaryKey);\n const foreignKeys = node.fields.filter(f => f.relatedNodeId && !f.isPrimaryKey);\n\n const fieldCount = Math.max(1, primaryKeys.length + foreignKeys.length);\n const calculatedHeight = Math.min(\n cfg.nodeBaseHeight + (fieldCount * cfg.fieldHeight),\n cfg.maxNodeHeight\n );\n\n return {\n id: node.id,\n name: node.name || node.schemaName || 'Unknown',\n node: node,\n width: cfg.nodeWidth,\n height: calculatedHeight,\n primaryKeys: primaryKeys,\n foreignKeys: foreignKeys\n };\n });\n }\n\n private createInternalLinks(): void {\n this.internalLinks = [];\n const nodeMap = new Map(this.internalNodes.map(n => [n.id, n]));\n\n this.nodes.forEach(node => {\n node.fields.forEach(field => {\n if (field.relatedNodeId) {\n const sourceNode = nodeMap.get(node.id);\n const targetNode = nodeMap.get(field.relatedNodeId);\n\n if (sourceNode && targetNode) {\n const isSelfReference = node.id === field.relatedNodeId;\n const targetField = targetNode.primaryKeys.find(pk => pk.name === field.relatedFieldName);\n\n this.internalLinks.push({\n source: sourceNode,\n target: targetNode,\n sourceField: field,\n targetField: targetField,\n isSelfReference: isSelfReference\n });\n }\n }\n });\n });\n }\n\n // ============================================================================\n // DAGRE LAYOUT\n // ============================================================================\n\n /**\n * Applies dagre hierarchical layout to position nodes and compute edge paths.\n * This provides clean, orthogonal edge routing.\n */\n private applyDagreLayout(): void {\n const cfg = this.mergedConfig;\n const dagreCfg = cfg.dagreConfig as Required<ERDDagreConfig>;\n\n // Create a new directed graph\n const g = new dagre.graphlib.Graph({ directed: true, multigraph: true });\n\n // Set graph options\n g.setGraph({\n rankdir: dagreCfg.rankDir,\n nodesep: dagreCfg.nodeSep,\n ranksep: dagreCfg.rankSep,\n edgesep: dagreCfg.edgeSep,\n ranker: dagreCfg.ranker,\n align: dagreCfg.align\n });\n\n // Default edge label (required by dagre)\n g.setDefaultEdgeLabel(() => ({}));\n\n // Add nodes to the graph\n this.visibleNodes.forEach(node => {\n g.setNode(node.id, {\n width: node.width,\n height: node.height,\n label: node.name\n });\n });\n\n // Add edges to the graph\n this.visibleLinks.forEach((link, index) => {\n const sourceId = typeof link.source === 'string' ? link.source : link.source.id;\n const targetId = typeof link.target === 'string' ? link.target : link.target.id;\n\n // Use index as edge name for multigraph support (multiple edges between same nodes)\n g.setEdge(sourceId, targetId, {\n label: link.sourceField.name || '',\n labelpos: 'c',\n labeloffset: 10\n }, `edge-${index}`);\n });\n\n // Run the layout algorithm\n dagre.layout(g);\n\n // Apply computed positions to nodes\n this.visibleNodes.forEach(node => {\n const dagreNode = g.node(node.id);\n if (dagreNode) {\n node.x = dagreNode.x;\n node.y = dagreNode.y;\n // Fix position to prevent force simulation from moving nodes\n node.fx = dagreNode.x;\n node.fy = dagreNode.y;\n }\n });\n\n // Store edge points for orthogonal path rendering\n this.visibleLinks.forEach((link, index) => {\n const sourceId = typeof link.source === 'string' ? link.source : link.source.id;\n const targetId = typeof link.target === 'string' ? link.target : link.target.id;\n\n const edge = g.edge(sourceId, targetId, `edge-${index}`);\n if (edge && edge.points) {\n link.points = edge.points;\n }\n });\n }\n\n /**\n * Checks if the current layout algorithm uses dagre.\n */\n private usesDagreLayout(): boolean {\n const algo = this.mergedConfig.layoutAlgorithm;\n return algo === 'dagre' || algo === 'horizontal' || algo === 'vertical';\n }\n\n // ============================================================================\n // VISUALIZATION\n // ============================================================================\n\n private createVisualization(): void {\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth || 800;\n const height = container.clientHeight || 600;\n const cfg = this.mergedConfig;\n const colors = cfg.colors as Required<ERDColorScheme>;\n\n this.lastKnownSize = { width, height };\n\n // Create zoom behavior\n if (cfg.enableZoom) {\n this.zoom = d3.zoom<SVGSVGElement, unknown>()\n .scaleExtent([cfg.minZoom, cfg.maxZoom])\n .on('zoom', (event) => {\n if (this.svg) {\n this.svg.select('.chart-area').attr('transform', event.transform);\n this.zoomChange.emit({\n zoomLevel: event.transform.k,\n translateX: event.transform.x,\n translateY: event.transform.y\n });\n }\n });\n }\n\n // Create SVG\n this.svg = d3\n .select(container)\n .append('svg')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .style('width', '100%')\n .style('height', '100%')\n .style('position', 'absolute')\n .style('top', '0')\n .style('left', '0');\n\n if (this.zoom) {\n this.svg.call(this.zoom);\n }\n\n // Background click handler\n this.svg.on('click', (event: MouseEvent) => {\n if (event.target === event.currentTarget) {\n this.nodeDeselected.emit();\n this.clearAllHighlighting();\n }\n });\n\n // Background context menu handler\n this.svg.on('contextmenu', (event: MouseEvent) => {\n if (event.target === event.currentTarget) {\n const contextEvent: ERDDiagramContextMenuEvent = {\n mouseEvent: event,\n cancel: false,\n position: { x: event.clientX, y: event.clientY },\n diagramPosition: this.screenToDiagramCoords(event.clientX, event.clientY)\n };\n this.diagramContextMenu.emit(contextEvent);\n if (contextEvent.cancel) {\n event.preventDefault();\n }\n }\n });\n\n const chartArea = this.svg.append('g').attr('class', 'chart-area');\n\n // Define arrow marker\n this.svg\n .append('defs')\n .selectAll('marker')\n .data(['end-arrow'])\n .enter()\n .append('marker')\n .attr('id', 'end-arrow')\n .attr('viewBox', '0 -5 10 10')\n .attr('refX', 8)\n .attr('refY', 0)\n .attr('markerWidth', 6)\n .attr('markerHeight', 6)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M0,-5L10,0L0,5')\n .attr('fill', colors.linkColor);\n\n // Apply layout based on algorithm\n if (this.usesDagreLayout()) {\n // Use dagre for hierarchical layout with orthogonal edges\n this.applyDagreLayout();\n this.simulation = null; // No force simulation needed\n } else {\n // Create force simulation with visible nodes only (original behavior)\n this.simulation = d3\n .forceSimulation<InternalNode>(this.visibleNodes)\n .force(\n 'link',\n d3\n .forceLink<InternalNode, InternalLink>(this.visibleLinks)\n .id((d) => d.id)\n .distance((d) => {\n const source = d.source as InternalNode;\n const target = d.target as InternalNode;\n const sourceSize = Math.max(source.width, source.height);\n const targetSize = Math.max(target.width, target.height);\n return (sourceSize + targetSize) / 2 + cfg.linkDistance;\n })\n )\n .force('charge', d3.forceManyBody().strength(cfg.chargeStrength))\n .force('center', d3.forceCenter(width / 2, height / 2))\n .force(\n 'collision',\n d3.forceCollide<InternalNode>().radius((d) => {\n return Math.max(d.width, d.height) / 2 + cfg.collisionPadding;\n })\n );\n }\n\n // Create links\n const link = chartArea\n .selectAll('.link')\n .data(this.visibleLinks)\n .enter()\n .append('g')\n .attr('class', 'link-group');\n\n link\n .append('path')\n .attr('class', 'link')\n .attr('stroke', colors.linkColor)\n .attr('stroke-opacity', 0.8)\n .attr('stroke-width', 2)\n .attr('fill', 'none')\n .attr('marker-end', (d) => (d.isSelfReference ? 'none' : 'url(#end-arrow)'));\n\n if (cfg.showRelationshipLabels) {\n // Add background rect for label (will be sized after text is rendered)\n // Self-referencing links get a green background to stand out\n link\n .append('rect')\n .attr('class', 'link-label-bg')\n .attr('fill', (d) => d.isSelfReference ? '#e8f5e9' : 'white')\n .attr('stroke', (d) => d.isSelfReference ? '#4CAF50' : colors.linkColor)\n .attr('stroke-width', 0.5)\n .attr('stroke-opacity', (d) => d.isSelfReference ? 0.6 : 0.4)\n .attr('rx', 2)\n .attr('ry', 2);\n\n // Add the label text\n link\n .append('text')\n .attr('class', 'link-label')\n .attr('font-size', '10px')\n .attr('fill', (d) => d.isSelfReference ? '#2e7d32' : colors.linkColor)\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text((d) => d.sourceField.name || '');\n }\n\n // Link event handlers\n this.attachLinkEventHandlers(link);\n\n // Create nodes\n const nodeGroup = chartArea\n .selectAll('.node')\n .data(this.visibleNodes)\n .enter()\n .append('g')\n .attr('class', 'node')\n .style('cursor', this.readOnly ? 'default' : 'pointer');\n\n if (cfg.enableDragging && !this.readOnly) {\n nodeGroup.call(\n d3.drag<SVGGElement, InternalNode>()\n .on('start', (event, d) => this.dragstarted(event, d))\n .on('drag', (event, d) => this.dragged(event, d))\n .on('end', (event, d) => this.dragended(event, d))\n );\n }\n\n // Node rectangle\n nodeGroup\n .append('rect')\n .attr('class', 'entity-rect')\n .attr('width', (d) => d.width)\n .attr('height', (d) => d.height)\n .attr('x', (d) => -d.width / 2)\n .attr('y', (d) => -d.height / 2)\n .attr('fill', colors.nodeBackground)\n .attr('stroke', colors.nodeBorder)\n .attr('stroke-width', 2)\n .attr('rx', 4);\n\n // Node header\n nodeGroup\n .append('rect')\n .attr('class', 'entity-header')\n .attr('width', (d) => d.width)\n .attr('height', 30)\n .attr('x', (d) => -d.width / 2)\n .attr('y', (d) => -d.height / 2)\n .attr('fill', colors.nodeHeader)\n .attr('rx', 4);\n\n nodeGroup\n .append('rect')\n .attr('class', 'entity-header-bottom')\n .attr('width', (d) => d.width)\n .attr('height', 15)\n .attr('x', (d) => -d.width / 2)\n .attr('y', (d) => -d.height / 2 + 15)\n .attr('fill', colors.nodeHeader);\n\n // Node name\n nodeGroup\n .append('text')\n .attr('class', 'entity-name')\n .attr('text-anchor', 'middle')\n .attr('y', (d) => -d.height / 2 + 20)\n .attr('font-size', '12px')\n .attr('font-weight', 'bold')\n .attr('fill', colors.nodeHeaderText)\n .text((d) => d.name);\n\n // Add fields if configured\n if (cfg.showFieldDetails) {\n this.renderNodeFields(nodeGroup, colors);\n }\n\n // Event handlers\n this.attachNodeEventHandlers(nodeGroup);\n\n // Tooltips\n nodeGroup\n .append('title')\n .text((d) => `${d.name}\\nPrimary Keys: ${d.primaryKeys.length}\\nForeign Keys: ${d.foreignKeys.length}`);\n\n // Handle layout completion based on algorithm type\n if (this.usesDagreLayout()) {\n // Dagre layout is synchronous - positions are already set\n this.updatePositions(link, nodeGroup);\n this.layoutCompleted = true;\n this.layoutComplete.emit();\n\n // Fit to view after positions are set\n if (cfg.fitOnLoad && this.visibleNodes.length > 1) {\n setTimeout(() => this.zoomToFit(), 50);\n }\n } else if (this.simulation) {\n // Force simulation layout\n if (cfg.skipAnimation) {\n // Run simulation to completion without animation\n this.simulation.stop();\n\n // Run enough ticks to settle the layout (typically 300 is enough)\n const tickCount = 300;\n for (let i = 0; i < tickCount; i++) {\n this.simulation.tick();\n }\n\n // Update positions once at the end\n this.updatePositions(link, nodeGroup);\n this.layoutCompleted = true;\n this.layoutComplete.emit();\n\n // Fit to view after positions are set\n if (cfg.fitOnLoad && this.visibleNodes.length > 1) {\n setTimeout(() => this.zoomToFit(), 50);\n }\n } else {\n // Normal animated mode\n // Simulation tick\n this.simulation.on('tick', () => {\n this.updatePositions(link, nodeGroup);\n });\n\n // Layout complete detection\n this.simulation.on('end', () => {\n if (!this.layoutCompleted) {\n this.layoutCompleted = true;\n this.layoutComplete.emit();\n if (cfg.fitOnLoad && this.visibleNodes.length > 1) {\n setTimeout(() => this.zoomToFit(), 100);\n }\n }\n });\n }\n }\n\n // Apply initial selection highlighting\n this.updateSelectionHighlighting();\n this.updateHighlighting();\n }\n\n private renderNodeFields(\n nodeGroup: d3.Selection<SVGGElement, InternalNode, SVGGElement, unknown>,\n colors: Required<ERDColorScheme>\n ): void {\n nodeGroup.each((d, i, nodes) => {\n const group = d3.select(nodes[i]);\n let currentY = -d.height / 2 + 40;\n\n // Primary keys\n d.primaryKeys.forEach((pk) => {\n const fieldGroup = group.append('g').attr('class', 'field-group primary-key');\n\n fieldGroup\n .append('rect')\n .attr('class', 'field-bg')\n .attr('x', -d.width / 2 + 2)\n .attr('y', currentY - 15)\n .attr('width', d.width - 4)\n .attr('height', 18)\n .attr('fill', colors.primaryKeyBackground);\n\n fieldGroup\n .append('text')\n .attr('class', 'field-icon')\n .attr('x', -d.width / 2 + 8)\n .attr('y', currentY - 2)\n .attr('font-size', '10px')\n .attr('fill', colors.primaryKeyText)\n .text('🔑');\n\n fieldGroup\n .append('text')\n .attr('class', 'field-name')\n .attr('x', -d.width / 2 + 25)\n .attr('y', currentY - 2)\n .attr('font-size', '11px')\n .attr('font-weight', 'bold')\n .attr('fill', colors.primaryKeyText)\n .text(pk.name || '');\n\n currentY += 20;\n });\n\n // Foreign keys\n d.foreignKeys.forEach((fk) => {\n const fieldGroup = group.append('g').attr('class', 'field-group foreign-key');\n\n fieldGroup\n .append('rect')\n .attr('class', 'field-bg')\n .attr('x', -d.width / 2 + 2)\n .attr('y', currentY - 15)\n .attr('width', d.width - 4)\n .attr('height', 18)\n .attr('fill', colors.foreignKeyBackground);\n\n fieldGroup\n .append('text')\n .attr('class', 'field-icon')\n .attr('x', -d.width / 2 + 8)\n .attr('y', currentY - 2)\n .attr('font-size', '10px')\n .attr('fill', colors.foreignKeyText)\n .text('🔗');\n\n fieldGroup\n .append('text')\n .attr('class', 'field-name')\n .attr('x', -d.width / 2 + 25)\n .attr('y', currentY - 2)\n .attr('font-size', '11px')\n .attr('fill', colors.foreignKeyText)\n .text(fk.name || '');\n\n currentY += 20;\n });\n });\n }\n\n private attachNodeEventHandlers(\n nodeGroup: d3.Selection<SVGGElement, InternalNode, SVGGElement, unknown>\n ): void {\n nodeGroup\n .on('click', (event: MouseEvent, d: InternalNode) => {\n if (this.readOnly) return;\n event.stopPropagation();\n\n // Emit click event with cancel pattern\n const clickEvent: ERDNodeClickEvent = {\n node: d.node,\n mouseEvent: event,\n cancel: false\n };\n this.nodeClick.emit(clickEvent);\n\n if (clickEvent.cancel) {\n return;\n }\n\n // Handle selection\n if (this.selectedNodeId === d.node.id) {\n this.nodeDeselected.emit();\n } else {\n this.nodeSelected.emit(d.node);\n\n // Auto-zoom if node is too small\n if (this.svg) {\n const currentTransform = d3.zoomTransform(this.svg.node()!);\n const currentRenderedWidth = d.width * currentTransform.k;\n if (currentRenderedWidth < 20) {\n this.zoomToNode(d.node.id);\n }\n }\n }\n\n this.updateSelectionHighlighting();\n })\n .on('dblclick', (event: MouseEvent, d: InternalNode) => {\n event.stopPropagation();\n\n const dblClickEvent: ERDNodeDoubleClickEvent = {\n node: d.node,\n mouseEvent: event,\n cancel: false\n };\n this.nodeDoubleClick.emit(dblClickEvent);\n })\n .on('mouseenter', (event: MouseEvent, d: InternalNode) => {\n const relatedInfo = this.getRelatedNodes(d.node.id, 1);\n const relatedNodes = relatedInfo.map(r => r.node);\n\n const hoverEvent: ERDNodeHoverEvent = {\n node: d.node,\n mouseEvent: event,\n relatedNodes,\n position: { x: event.clientX, y: event.clientY }\n };\n this.nodeHover.emit(hoverEvent);\n })\n .on('mouseleave', (_event: MouseEvent, d: InternalNode) => {\n this.nodeHoverEnd.emit(d.node);\n })\n .on('contextmenu', (event: MouseEvent, d: InternalNode) => {\n const contextEvent: ERDNodeContextMenuEvent = {\n node: d.node,\n mouseEvent: event,\n cancel: false,\n position: { x: event.clientX, y: event.clientY }\n };\n this.nodeContextMenu.emit(contextEvent);\n\n if (contextEvent.cancel) {\n event.preventDefault();\n }\n });\n }\n\n private attachLinkEventHandlers(\n linkGroup: d3.Selection<SVGGElement, InternalLink, SVGGElement, unknown>\n ): void {\n linkGroup\n .on('click', (event: MouseEvent, d: InternalLink) => {\n event.stopPropagation();\n\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n\n const clickEvent: ERDLinkClickEvent = {\n link,\n sourceNode,\n targetNode,\n mouseEvent: event,\n cancel: false\n };\n this.linkClick.emit(clickEvent);\n })\n .on('mouseenter', (event: MouseEvent, d: InternalLink) => {\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n\n const hoverEvent: ERDLinkHoverEvent = {\n link,\n sourceNode,\n targetNode,\n mouseEvent: event,\n position: { x: event.clientX, y: event.clientY }\n };\n this.linkHover.emit(hoverEvent);\n })\n .on('mouseleave', (_event: MouseEvent, d: InternalLink) => {\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n this.linkHoverEnd.emit(link);\n })\n .on('contextmenu', (event: MouseEvent, d: InternalLink) => {\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n\n const contextEvent: ERDLinkContextMenuEvent = {\n link,\n sourceNode,\n targetNode,\n mouseEvent: event,\n cancel: false,\n position: { x: event.clientX, y: event.clientY }\n };\n this.linkContextMenu.emit(contextEvent);\n\n if (contextEvent.cancel) {\n event.preventDefault();\n }\n });\n }\n\n private updatePositions(\n link: d3.Selection<SVGGElement, InternalLink, SVGGElement, unknown>,\n nodeGroup: d3.Selection<SVGGElement, InternalNode, SVGGElement, unknown>\n ): void {\n const usesDagre = this.usesDagreLayout();\n\n // Update link paths\n link.select('path').attr('d', (d) => {\n const source = d.source as InternalNode;\n const target = d.target as InternalNode;\n\n if (d.isSelfReference) {\n // Create a larger loop that goes around the bottom of the entity\n // Start from right side, loop down and around, return to left side\n const startX = source.x! + source.width / 2; // Right edge center\n const startY = source.y!;\n const endY = source.y! + source.height / 2; // Bottom edge Y\n const loopExtent = 60; // How far out the loop extends\n\n // Use a path that goes: right edge -> curves down-right -> bottom -> curves up to bottom edge\n return `M ${startX} ${startY}\n C ${startX + loopExtent} ${startY},\n ${startX + loopExtent} ${endY + loopExtent},\n ${source.x!} ${endY + loopExtent}\n C ${source.x! - loopExtent} ${endY + loopExtent},\n ${source.x! - source.width / 2 - loopExtent / 2} ${endY},\n ${source.x! - source.width / 2} ${endY}`;\n }\n\n // Use dagre edge points if available (provides cleaner orthogonal paths)\n if (usesDagre && d.points && d.points.length >= 2) {\n return this.createPathFromDagrePoints(d.points);\n }\n\n // Fallback to manual orthogonal path\n const sourcePoint = this.getSourceConnectionPoint(source, d.sourceField);\n const targetPoint = this.getTargetConnectionPoint(target, d.targetField);\n return this.createOrthogonalPath(sourcePoint, targetPoint);\n });\n\n // Update link labels and their background boxes\n link.select('text').attr('transform', (d) => {\n const source = d.source as InternalNode;\n const target = d.target as InternalNode;\n\n if (d.isSelfReference) {\n // Position label at the bottom of the loop (below the entity)\n const loopExtent = 60;\n return `translate(${source.x!}, ${source.y! + source.height / 2 + loopExtent + 8})`;\n }\n\n // Use midpoint of dagre edge points if available\n if (usesDagre && d.points && d.points.length >= 2) {\n const midIndex = Math.floor(d.points.length / 2);\n const midPoint = d.points[midIndex];\n return `translate(${midPoint.x}, ${midPoint.y})`;\n }\n\n // Fallback to midpoint between nodes\n const midX = (source.x! + target.x!) / 2;\n const midY = (source.y! + target.y!) / 2;\n return `translate(${midX}, ${midY - 8})`;\n });\n\n // Update label background rects to match text size and position\n link.each(function() {\n const group = d3.select(this);\n const textEl = group.select('text.link-label').node() as SVGTextElement | null;\n const bgRect = group.select('rect.link-label-bg');\n\n if (textEl && !bgRect.empty()) {\n const bbox = textEl.getBBox();\n const padding = 3;\n\n // Get the transform from the text element\n const transform = group.select('text.link-label').attr('transform');\n\n bgRect\n .attr('x', bbox.x - padding)\n .attr('y', bbox.y - padding)\n .attr('width', bbox.width + padding * 2)\n .attr('height', bbox.height + padding * 2)\n .attr('transform', transform);\n }\n });\n\n // Update node positions\n nodeGroup.attr('transform', (d) => `translate(${d.x},${d.y})`);\n }\n\n // ============================================================================\n // GEOMETRY HELPERS\n // ============================================================================\n\n private getSourceConnectionPoint(sourceNode: InternalNode, field?: ERDField): { x: number; y: number } {\n let connectY = sourceNode.y!;\n\n if (field) {\n const fkIndex = sourceNode.foreignKeys.findIndex((fk) => fk.id === field.id);\n if (fkIndex >= 0) {\n const fieldY = -sourceNode.height / 2 + 40 + sourceNode.primaryKeys.length * 20 + fkIndex * 20;\n connectY = sourceNode.y! + fieldY + 10;\n } else {\n // Check if the field is a primary key that also serves as a foreign key (IS-A pattern)\n const pkIndex = sourceNode.primaryKeys.findIndex((pk) => pk.id === field.id);\n if (pkIndex >= 0) {\n const fieldY = -sourceNode.height / 2 + 40 + pkIndex * 20;\n connectY = sourceNode.y! + fieldY + 10;\n }\n }\n }\n\n return {\n x: sourceNode.x! + sourceNode.width / 2,\n y: connectY,\n };\n }\n\n private getTargetConnectionPoint(targetNode: InternalNode, targetField?: ERDField): { x: number; y: number } {\n let connectY = targetNode.y! - targetNode.height / 2 + 40;\n\n if (targetField && targetField.isPrimaryKey) {\n const pkIndex = targetNode.primaryKeys.findIndex((pk) => pk.id === targetField.id);\n if (pkIndex >= 0) {\n const fieldY = -targetNode.height / 2 + 40 + pkIndex * 20;\n connectY = targetNode.y! + fieldY + 10;\n }\n }\n\n return {\n x: targetNode.x! - targetNode.width / 2,\n y: connectY,\n };\n }\n\n private createOrthogonalPath(source: { x: number; y: number }, target: { x: number; y: number }): string {\n const dx = target.x - source.x;\n let midX: number;\n\n if (dx > 0) {\n midX = source.x + dx * 0.7;\n } else {\n midX = source.x + Math.max(dx * 0.3, -50);\n }\n\n return `M ${source.x} ${source.y}\n L ${midX} ${source.y}\n L ${midX} ${target.y}\n L ${target.x} ${target.y}`;\n }\n\n /**\n * Creates an SVG path string from dagre's edge points.\n * Dagre provides an array of points for each edge that forms a clean orthogonal path.\n * @param points Array of {x, y} coordinates from dagre layout\n * @returns SVG path string\n */\n private createPathFromDagrePoints(points: Array<{ x: number; y: number }>): string {\n if (!points || points.length < 2) {\n return '';\n }\n\n // Start with Move to first point\n let path = `M ${points[0].x} ${points[0].y}`;\n\n // Add Line to each subsequent point\n for (let i = 1; i < points.length; i++) {\n path += ` L ${points[i].x} ${points[i].y}`;\n }\n\n return path;\n }\n\n private screenToDiagramCoords(screenX: number, screenY: number): { x: number; y: number } {\n if (!this.svg) return { x: 0, y: 0 };\n\n const svgNode = this.svg.node();\n if (!svgNode) return { x: 0, y: 0 };\n\n const rect = svgNode.getBoundingClientRect();\n const transform = d3.zoomTransform(svgNode);\n\n return {\n x: (screenX - rect.left - transform.x) / transform.k,\n y: (screenY - rect.top - transform.y) / transform.k\n };\n }\n\n // ============================================================================\n // HIGHLIGHTING\n // ============================================================================\n\n private clearAllHighlighting(): void {\n if (!this.svg) return;\n\n this.svg.selectAll('.node')\n .classed('selected', false)\n .classed('highlighted', false)\n .classed('relationship-connected', false)\n .classed('entity-connections-highlighted', false);\n\n this.svg.selectAll('.entity-rect')\n .classed('highlighted', false)\n .classed('relationship-highlighted', false)\n .classed('connection-highlighted', false)\n .style('stroke', this.mergedConfig.colors?.nodeBorder || '#333')\n .style('stroke-width', '2px')\n .style('filter', null);\n\n this.svg.selectAll('.link-group')\n .classed('highlighted', false);\n\n this.svg.selectAll('.link')\n .classed('highlighted', false);\n\n this.svg.selectAll('.link-label')\n .classed('highlighted', false);\n }\n\n private updateSelectionHighlighting(): void {\n if (!this.svg) return;\n\n // Clear previous selection styling\n this.svg.selectAll('.node')\n .classed('selected', false)\n .select('.entity-rect')\n .style('stroke', this.mergedConfig.colors?.nodeBorder || '#333')\n .style('stroke-width', '2px')\n .style('filter', null);\n\n if (this.selectedNodeId) {\n const selectedColor = this.mergedConfig.colors?.selectedBorder || '#4CAF50';\n\n this.svg.selectAll('.node')\n .filter((d: unknown) => (d as InternalNode).id === this.selectedNodeId)\n .classed('selected', true)\n .select('.entity-rect')\n .style('stroke', selectedColor)\n .style('stroke-width', '4px')\n .style('filter', `drop-shadow(0 0 8px ${selectedColor}80)`);\n }\n }\n\n private updateHighlighting(): void {\n if (!this.svg) return;\n\n const highlightColor = this.mergedConfig.colors?.highlightBorder || '#ff9800';\n const highlightSet = new Set(this.highlightedNodeIds);\n\n this.svg.selectAll('.node')\n .classed('highlighted', (d: unknown) => highlightSet.has((d as InternalNode).id))\n .filter((d: unknown) => highlightSet.has((d as InternalNode).id))\n .select('.entity-rect')\n .style('stroke', highlightColor)\n .style('stroke-width', '3px')\n .style('filter', `drop-shadow(0 0 6px ${highlightColor}80)`);\n }\n\n private emitStateChange(): void {\n const state = this.getState();\n this.stateChange.emit(state);\n }\n\n // ============================================================================\n // DRAG HANDLERS\n // ============================================================================\n\n private dragstarted(event: d3.D3DragEvent<SVGGElement, InternalNode, InternalNode>, d: InternalNode): void {\n if (this.isLayoutFrozen) return;\n\n const dragEvent: ERDNodeDragEvent = {\n node: d.node,\n startPosition: { x: d.x || 0, y: d.y || 0 },\n currentPosition: { x: d.x || 0, y: d.y || 0 },\n cancel: false\n };\n this.nodeDragStart.emit(dragEvent);\n\n if (dragEvent.cancel) return;\n\n if (!event.active && this.simulation) {\n this.simulation.alphaTarget(0.3).restart();\n }\n d.fx = d.x;\n d.fy = d.y;\n }\n\n private dragged(event: d3.D3DragEvent<SVGGElement, InternalNode, InternalNode>, d: InternalNode): void {\n if (this.isLayoutFrozen) return;\n\n d.fx = event.x;\n d.fy = event.y;\n }\n\n private dragended(event: d3.D3DragEvent<SVGGElement, InternalNode, InternalNode>, d: InternalNode): void {\n if (this.isLayoutFrozen) return;\n\n const dragEvent: ERDNodeDragEvent = {\n node: d.node,\n startPosition: { x: 0, y: 0 }, // Start position not tracked in drag\n currentPosition: { x: d.x || 0, y: d.y || 0 },\n cancel: false\n };\n this.nodeDragEnd.emit(dragEvent);\n\n if (!event.active && this.simulation) {\n this.simulation.alphaTarget(0);\n }\n d.fx = null;\n d.fy = null;\n }\n}\n","<div class=\"erd-section\">\n @if (showHeader) {\n <div class=\"section-header\">\n <h3>{{ headerTitle }}</h3>\n <div class=\"erd-controls\">\n <button class=\"control-btn\" (click)=\"zoomIn()\" title=\"Zoom In\">\n <span class=\"fa-solid fa-search-plus\"></span>\n </button>\n <button class=\"control-btn\" (click)=\"zoomOut()\" title=\"Zoom Out\">\n <span class=\"fa-solid fa-search-minus\"></span>\n </button>\n <button class=\"control-btn\" (click)=\"resetZoom()\" title=\"Reset Zoom\">\n <span class=\"fa-solid fa-expand\"></span>\n </button>\n <button class=\"control-btn\" (click)=\"refresh(); refreshRequested.emit()\" title=\"Refresh Diagram\">\n <span class=\"fa-solid fa-refresh\"></span>\n </button>\n </div>\n </div>\n }\n <div class=\"erd-container\" #erdContainer>\n @if (isRefreshing) {\n <div class=\"loading-overlay\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">Loading diagram...</div>\n </div>\n </div>\n }\n </div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"erd-diagram.component.js","sourceRoot":"","sources":["../../../src/lib/components/erd-diagram.component.ts","../../../src/lib/components/erd-diagram.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n OnChanges,\n SimpleChanges\n} from '@angular/core';\nimport * as d3 from 'd3';\nimport {\n ERDNode,\n ERDField,\n ERDLink,\n ERDConfig,\n ERDNodeClickEvent,\n ERDNodeDoubleClickEvent,\n ERDLinkClickEvent,\n ERDZoomEvent,\n ERDColorScheme,\n ERDState,\n ERDNodeHoverEvent,\n ERDLinkHoverEvent,\n ERDNodeContextMenuEvent,\n ERDLinkContextMenuEvent,\n ERDDiagramContextMenuEvent,\n ERDNodeDragEvent,\n ERDRelationshipInfo,\n ERDLayoutAlgorithm,\n ERDDagreConfig\n} from '../interfaces/erd-types';\nimport * as dagre from '@dagrejs/dagre';\n\n/**\n * Internal node representation for D3 force simulation.\n * Extends ERDNode with position and simulation-specific properties.\n * @internal\n */\ninterface InternalNode {\n id: string;\n name: string;\n node: ERDNode;\n x?: number;\n y?: number;\n fx?: number | null;\n fy?: number | null;\n width: number;\n height: number;\n primaryKeys: ERDField[];\n foreignKeys: ERDField[];\n}\n\n/**\n * Internal link representation for D3 force simulation.\n * @internal\n */\ninterface InternalLink {\n source: string | InternalNode;\n target: string | InternalNode;\n sourceField: ERDField;\n targetField?: ERDField;\n isSelfReference: boolean;\n /** Edge points computed by dagre for orthogonal routing */\n points?: Array<{ x: number; y: number }>;\n}\n\n/**\n * Default configuration values for the ERD diagram.\n * These values provide a good starting point for most use cases.\n */\n/** Default dagre configuration */\nconst DEFAULT_DAGRE_CONFIG: Required<ERDDagreConfig> = {\n rankDir: 'LR',\n nodeSep: 80, // Increased from 50 - more vertical space between nodes in same rank\n rankSep: 150, // Increased from 100 - more horizontal space between ranks for labels\n edgeSep: 20, // Increased from 10 - more space between edge paths\n ranker: 'network-simplex',\n align: undefined as unknown as 'UL' | 'UR' | 'DL' | 'DR'\n};\n\nconst DEFAULT_CONFIG: Required<ERDConfig> = {\n nodeWidth: 180,\n nodeBaseHeight: 60,\n fieldHeight: 20,\n maxNodeHeight: 300,\n chargeStrength: -800,\n linkDistance: 80,\n collisionPadding: 20,\n showFieldDetails: true,\n showRelationshipLabels: true,\n showHeader: true,\n showNodeCount: true,\n showMinimap: false,\n showLegend: false,\n enableDragging: true,\n enableZoom: true,\n enablePan: true,\n minZoom: 0.1,\n maxZoom: 4,\n initialZoom: 1,\n enableMultiSelect: false,\n animationDuration: 750,\n fitOnLoad: true,\n skipAnimation: false,\n emptyStateMessage: 'No entities to display',\n emptyStateIcon: 'fa-solid fa-diagram-project',\n layoutAlgorithm: 'dagre',\n dagreConfig: DEFAULT_DAGRE_CONFIG,\n colors: {\n nodeBackground: '#f8f9fa',\n nodeBorder: '#333',\n nodeHeader: '#007bff',\n nodeHeaderText: 'white',\n primaryKeyBackground: '#fff3cd',\n primaryKeyText: '#856404',\n foreignKeyBackground: '#cce5ff',\n foreignKeyText: '#004085',\n linkColor: '#666',\n selectedBorder: '#4CAF50',\n highlightBorder: '#ff9800',\n relatedBorder: '#ff6b35'\n }\n};\n\n/**\n * Entity Relationship Diagram component using D3.js force-directed graph.\n *\n * This is a **generic, reusable Angular component** that can visualize any data\n * that conforms to the `ERDNode` interface. It is completely decoupled from\n * MemberJunction-specific types and can be used in any Angular project.\n *\n * ## Features\n *\n * - **Interactive Force-Directed Layout**: Nodes automatically arrange themselves\n * using physics-based simulation with customizable forces\n * - **Zoom and Pan**: Mouse wheel zoom and drag-to-pan with configurable limits\n * - **Node Selection**: Click to select nodes with visual highlighting\n * - **Focus Mode**: Show a single node with its N-hop related entities\n * - **Relationship Visualization**: Arrows show foreign key relationships\n * - **Customizable Styling**: Full control over colors, sizes, and appearance\n * - **Rich Event System**: Comprehensive events for integration with parent components\n * - **State Persistence**: Save and restore diagram state (zoom, pan, selection, positions)\n *\n * ## Basic Usage\n *\n * ```html\n * <mj-erd-diagram\n * [nodes]=\"entityNodes\"\n * [selectedNodeId]=\"selectedId\"\n * [config]=\"erdConfig\"\n * (nodeClick)=\"onNodeClick($event)\"\n * (nodeSelected)=\"onNodeSelected($event)\"\n * (zoomChange)=\"onZoomChange($event)\">\n * </mj-erd-diagram>\n * ```\n *\n * ## Focus Mode Example\n *\n * Show a single entity with its immediate relationships:\n *\n * ```html\n * <mj-erd-diagram\n * [nodes]=\"allNodes\"\n * [focusNodeId]=\"'user-entity-id'\"\n * [focusDepth]=\"1\"\n * (nodeSelected)=\"onNodeSelected($event)\">\n * </mj-erd-diagram>\n * ```\n *\n * ## State Persistence Example\n *\n * ```typescript\n * // Save state\n * const state = this.erdDiagram.getState();\n * localStorage.setItem('erd-state', JSON.stringify(state));\n *\n * // Restore state\n * const savedState = JSON.parse(localStorage.getItem('erd-state'));\n * this.erdDiagram.setState(savedState);\n * ```\n *\n * @see ERDNode for the node data structure\n * @see ERDConfig for configuration options\n * @see ERDState for state persistence\n */\n@Component({\n standalone: false,\n selector: 'mj-erd-diagram',\n templateUrl: './erd-diagram.component.html',\n styleUrls: ['./erd-diagram.component.css']\n})\nexport class ERDDiagramComponent implements AfterViewInit, OnDestroy, OnChanges {\n @ViewChild('erdContainer', { static: false }) erdContainer!: ElementRef;\n\n // ============================================================================\n // INPUTS - Data\n // ============================================================================\n\n /**\n * The nodes (entities) to display in the diagram.\n * Each node should conform to the `ERDNode` interface.\n *\n * @example\n * ```typescript\n * nodes: ERDNode[] = [\n * {\n * id: 'user-1',\n * name: 'Users',\n * fields: [\n * { id: 'id', name: 'ID', isPrimaryKey: true },\n * { id: 'email', name: 'Email', isPrimaryKey: false }\n * ]\n * }\n * ];\n * ```\n */\n @Input() nodes: ERDNode[] = [];\n\n /**\n * ID of the currently selected node.\n * Use this for external control of selection state.\n * The component will highlight this node and emit selection events accordingly.\n *\n * @example `[selectedNodeId]=\"'entity-123'\"`\n */\n @Input() selectedNodeId: string | null = null;\n\n /**\n * IDs of nodes to highlight (in addition to selected node).\n * Highlighted nodes receive a distinct visual style (orange border by default).\n * Useful for showing search results or related items.\n *\n * @example `[highlightedNodeIds]=\"['entity-1', 'entity-2']\"`\n */\n @Input() highlightedNodeIds: string[] = [];\n\n /**\n * ID of the node to focus on.\n * When set, the diagram will only show this node and its related nodes\n * up to `focusDepth` hops away. This is useful for entity-centric views.\n *\n * Set to `null` to show all nodes.\n *\n * @example `[focusNodeId]=\"'user-entity-id'\"`\n */\n @Input() focusNodeId: string | null = null;\n\n /**\n * Number of relationship hops to include when in focus mode.\n * - `0`: Show only the focus node\n * - `1`: Show focus node + directly related nodes\n * - `2`: Show focus node + nodes within 2 relationship hops\n *\n * Only applies when `focusNodeId` is set.\n *\n * @default 1\n * @example `[focusDepth]=\"2\"`\n */\n @Input() focusDepth = 1;\n\n // ============================================================================\n // INPUTS - State\n // ============================================================================\n\n /**\n * Whether the diagram is currently refreshing/loading.\n * When `true`, displays a loading overlay on the diagram.\n *\n * @example `[isRefreshing]=\"isLoadingData\"`\n */\n @Input() isRefreshing = false;\n\n /**\n * Whether the diagram is in read-only mode.\n * When `true`, disables dragging and selection (zoom/pan still work).\n *\n * @default false\n */\n @Input() readOnly = false;\n\n // ============================================================================\n // INPUTS - Configuration\n // ============================================================================\n\n /**\n * Configuration options for the diagram.\n * All options are optional with sensible defaults.\n *\n * @see ERDConfig for all available options\n * @example\n * ```typescript\n * config: ERDConfig = {\n * nodeWidth: 200,\n * chargeStrength: -1000,\n * colors: {\n * nodeHeader: '#0066cc'\n * }\n * };\n * ```\n */\n @Input() config: ERDConfig = {};\n\n /**\n * Whether to show the header bar with zoom controls.\n * Set to `false` to hide the header and use programmatic control instead.\n *\n * @default true\n */\n @Input() showHeader = true;\n\n /**\n * Title to display in the header bar.\n * Only visible when `showHeader` is `true`.\n *\n * @default 'Entity Relationship Diagram'\n */\n @Input() headerTitle = 'Entity Relationship Diagram';\n\n // ============================================================================\n // OUTPUTS - Selection Events\n // ============================================================================\n\n /**\n * Emitted when a node is clicked.\n * Set `event.cancel = true` to prevent the default selection behavior.\n *\n * @example\n * ```typescript\n * onNodeClick(event: ERDNodeClickEvent) {\n * console.log('Clicked:', event.node.name);\n * // Prevent selection for certain nodes\n * if (event.node.customData?.['locked']) {\n * event.cancel = true;\n * }\n * }\n * ```\n */\n @Output() nodeClick = new EventEmitter<ERDNodeClickEvent>();\n\n /**\n * Emitted when a node is double-clicked.\n * Useful for opening detail views or triggering actions.\n *\n * @example\n * ```typescript\n * onNodeDoubleClick(event: ERDNodeDoubleClickEvent) {\n * this.openEntityDetail(event.node.id);\n * }\n * ```\n */\n @Output() nodeDoubleClick = new EventEmitter<ERDNodeDoubleClickEvent>();\n\n /**\n * Emitted when a node is selected (after click, unless cancelled).\n * The node parameter contains the full `ERDNode` data.\n */\n @Output() nodeSelected = new EventEmitter<ERDNode>();\n\n /**\n * Emitted when the current node is deselected.\n * This happens when clicking the background or selecting a different node.\n */\n @Output() nodeDeselected = new EventEmitter<void>();\n\n /**\n * Emitted when a relationship link is clicked.\n * The event includes both source and target nodes for context.\n */\n @Output() linkClick = new EventEmitter<ERDLinkClickEvent>();\n\n // ============================================================================\n // OUTPUTS - Hover Events\n // ============================================================================\n\n /**\n * Emitted when the mouse enters a node.\n * Includes related nodes and position for tooltip display.\n *\n * @example\n * ```typescript\n * onNodeHover(event: ERDNodeHoverEvent) {\n * this.showTooltip(event.node, event.position);\n * }\n * ```\n */\n @Output() nodeHover = new EventEmitter<ERDNodeHoverEvent>();\n\n /**\n * Emitted when the mouse leaves a node.\n */\n @Output() nodeHoverEnd = new EventEmitter<ERDNode>();\n\n /**\n * Emitted when the mouse enters a relationship link.\n */\n @Output() linkHover = new EventEmitter<ERDLinkHoverEvent>();\n\n /**\n * Emitted when the mouse leaves a relationship link.\n */\n @Output() linkHoverEnd = new EventEmitter<ERDLink>();\n\n // ============================================================================\n // OUTPUTS - Context Menu Events\n // ============================================================================\n\n /**\n * Emitted when a node is right-clicked.\n * Set `event.cancel = true` to prevent the default browser context menu.\n *\n * @example\n * ```typescript\n * onNodeContextMenu(event: ERDNodeContextMenuEvent) {\n * event.cancel = true;\n * this.showContextMenu(event.node, event.position);\n * }\n * ```\n */\n @Output() nodeContextMenu = new EventEmitter<ERDNodeContextMenuEvent>();\n\n /**\n * Emitted when a relationship link is right-clicked.\n */\n @Output() linkContextMenu = new EventEmitter<ERDLinkContextMenuEvent>();\n\n /**\n * Emitted when the diagram background is right-clicked.\n * Includes diagram coordinates for adding new nodes at click position.\n */\n @Output() diagramContextMenu = new EventEmitter<ERDDiagramContextMenuEvent>();\n\n // ============================================================================\n // OUTPUTS - Drag Events\n // ============================================================================\n\n /**\n * Emitted when a node drag operation starts.\n * Set `event.cancel = true` to prevent the drag.\n */\n @Output() nodeDragStart = new EventEmitter<ERDNodeDragEvent>();\n\n /**\n * Emitted when a node drag operation ends.\n */\n @Output() nodeDragEnd = new EventEmitter<ERDNodeDragEvent>();\n\n // ============================================================================\n // OUTPUTS - Diagram Events\n // ============================================================================\n\n /**\n * Emitted when zoom level or pan position changes.\n * Useful for synchronizing zoom controls or saving view state.\n */\n @Output() zoomChange = new EventEmitter<ERDZoomEvent>();\n\n /**\n * Emitted when the diagram requests a refresh.\n * Triggered by the refresh button in the header.\n */\n @Output() refreshRequested = new EventEmitter<void>();\n\n /**\n * Emitted when the force simulation completes initial layout.\n * Useful for performing actions after nodes have settled.\n */\n @Output() layoutComplete = new EventEmitter<void>();\n\n /**\n * Emitted when diagram state changes (selection, zoom, highlights).\n * Useful for auto-saving state or syncing with other components.\n */\n @Output() stateChange = new EventEmitter<ERDState>();\n\n // ============================================================================\n // PRIVATE STATE\n // ============================================================================\n\n private svg: d3.Selection<SVGSVGElement, unknown, null, undefined> | null = null;\n private simulation: d3.Simulation<InternalNode, InternalLink> | null = null;\n private internalNodes: InternalNode[] = [];\n private internalLinks: InternalLink[] = [];\n private visibleNodes: InternalNode[] = [];\n private visibleLinks: InternalLink[] = [];\n private zoom: d3.ZoomBehavior<SVGSVGElement, unknown> | null = null;\n private resizeObserver?: ResizeObserver;\n private lastKnownSize = { width: 0, height: 0 };\n private resizeTimeout?: number;\n private mergedConfig: Required<ERDConfig> = DEFAULT_CONFIG;\n private layoutCompleted = false;\n private isLayoutFrozen = false;\n\n // ============================================================================\n // LIFECYCLE HOOKS\n // ============================================================================\n\n ngAfterViewInit(): void {\n setTimeout(() => {\n this.setupERD();\n }, 100);\n\n this.setupResizeObserver();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['nodes'] && !changes['nodes'].firstChange) {\n this.setupERD();\n }\n\n if (changes['selectedNodeId'] && !changes['selectedNodeId'].firstChange) {\n this.updateSelectionHighlighting();\n this.emitStateChange();\n }\n\n if (changes['highlightedNodeIds'] && !changes['highlightedNodeIds'].firstChange) {\n this.updateHighlighting();\n this.emitStateChange();\n }\n\n if (changes['focusNodeId'] && !changes['focusNodeId'].firstChange) {\n this.setupERD();\n this.emitStateChange();\n }\n\n if (changes['focusDepth'] && !changes['focusDepth'].firstChange) {\n if (this.focusNodeId) {\n this.setupERD();\n this.emitStateChange();\n }\n }\n\n if (changes['config'] && !changes['config'].firstChange) {\n this.mergeConfig();\n this.setupERD();\n }\n }\n\n ngOnDestroy(): void {\n if (this.simulation) {\n this.simulation.stop();\n }\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n }\n\n // ============================================================================\n // PUBLIC API - Zoom Control\n // ============================================================================\n\n /**\n * Zoom in on the diagram by a fixed factor (1.2x).\n * Uses smooth animation transition.\n */\n public zoomIn(): void {\n if (this.zoom && this.svg) {\n this.svg.transition().duration(300).call(\n this.zoom.scaleBy as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, k: number) => void,\n 1.2\n );\n }\n }\n\n /**\n * Zoom out on the diagram by a fixed factor (0.83x).\n * Uses smooth animation transition.\n */\n public zoomOut(): void {\n if (this.zoom && this.svg) {\n this.svg.transition().duration(300).call(\n this.zoom.scaleBy as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, k: number) => void,\n 0.83\n );\n }\n }\n\n /**\n * Reset zoom to default level (1x) and center the diagram.\n * Uses smooth animation transition.\n */\n public resetZoom(): void {\n if (this.zoom && this.svg) {\n this.svg.transition().duration(500).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity\n );\n }\n }\n\n /**\n * Zoom and pan to center on a specific node.\n *\n * @param nodeId - ID of the node to center on\n * @param scale - Optional zoom scale (default: 1.5)\n *\n * @example\n * ```typescript\n * // Center on node with default zoom\n * this.erdDiagram.zoomToNode('user-entity-id');\n *\n * // Center with custom zoom level\n * this.erdDiagram.zoomToNode('user-entity-id', 2.0);\n * ```\n */\n public zoomToNode(nodeId: string, scale = 1.5): void {\n const node = this.internalNodes.find(n => n.id === nodeId);\n if (!node || !this.zoom || !this.svg) return;\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n const x = width / 2 - (node.x || 0) * scale;\n const y = height / 2 - (node.y || 0) * scale;\n\n this.svg.transition().duration(this.mergedConfig.animationDuration).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity.translate(x, y).scale(scale)\n );\n }\n\n /**\n * Fit all visible nodes within the viewport.\n * Calculates optimal zoom level and position to show all nodes.\n *\n * @param padding - Padding around nodes (default: 50px)\n */\n public zoomToFit(padding = 50): void {\n if (!this.svg || !this.zoom || this.visibleNodes.length === 0) return;\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // Guard against zero container dimensions (container not laid out yet)\n if (width === 0 || height === 0) return;\n\n // Calculate bounds\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n this.visibleNodes.forEach(node => {\n const halfWidth = node.width / 2;\n const halfHeight = node.height / 2;\n minX = Math.min(minX, (node.x || 0) - halfWidth);\n minY = Math.min(minY, (node.y || 0) - halfHeight);\n maxX = Math.max(maxX, (node.x || 0) + halfWidth);\n maxY = Math.max(maxY, (node.y || 0) + halfHeight);\n });\n\n // Guard against invalid bounds (nodes without valid positions)\n if (!isFinite(minX) || !isFinite(minY) || !isFinite(maxX) || !isFinite(maxY)) return;\n\n const boundsWidth = maxX - minX + padding * 2;\n const boundsHeight = maxY - minY + padding * 2;\n\n // Guard against zero-dimension bounds\n if (boundsWidth <= 0 || boundsHeight <= 0) return;\n\n const centerX = (minX + maxX) / 2;\n const centerY = (minY + maxY) / 2;\n\n const scale = Math.min(\n width / boundsWidth,\n height / boundsHeight,\n this.mergedConfig.maxZoom\n );\n\n // Final sanity check before applying transform\n if (!isFinite(scale) || scale <= 0) return;\n\n const translateX = width / 2 - centerX * scale;\n const translateY = height / 2 - centerY * scale;\n\n this.svg.transition().duration(this.mergedConfig.animationDuration).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity.translate(translateX, translateY).scale(scale)\n );\n }\n\n // ============================================================================\n // PUBLIC API - Selection\n // ============================================================================\n\n /**\n * Programmatically select a node by ID.\n *\n * @param nodeId - ID of the node to select\n * @returns `true` if node was found and selected, `false` otherwise\n */\n public selectNode(nodeId: string): boolean {\n const node = this.nodes.find(n => n.id === nodeId);\n if (node) {\n this.nodeSelected.emit(node);\n return true;\n }\n return false;\n }\n\n /**\n * Clear all selections.\n */\n public deselectAll(): void {\n this.nodeDeselected.emit();\n this.clearAllHighlighting();\n }\n\n // ============================================================================\n // PUBLIC API - Highlighting\n // ============================================================================\n\n /**\n * Highlight a specific node.\n *\n * @param nodeId - ID of the node to highlight\n */\n public highlightNode(nodeId: string): void {\n if (!this.highlightedNodeIds.includes(nodeId)) {\n this.highlightedNodeIds = [...this.highlightedNodeIds, nodeId];\n this.updateHighlighting();\n this.emitStateChange();\n }\n }\n\n /**\n * Clear all highlights.\n */\n public clearHighlights(): void {\n this.highlightedNodeIds = [];\n this.updateHighlighting();\n this.emitStateChange();\n }\n\n /**\n * Highlight a node and all its directly related nodes.\n *\n * @param nodeId - ID of the center node\n * @param depth - Number of relationship hops to highlight (default: 1)\n */\n public highlightRelated(nodeId: string, depth = 1): void {\n const relatedIds = this.getRelatedNodeIds(nodeId, depth);\n this.highlightedNodeIds = [nodeId, ...relatedIds];\n this.updateHighlighting();\n this.emitStateChange();\n }\n\n /**\n * Get nodes that are related to a specific node.\n *\n * @param nodeId - ID of the node to find relationships for\n * @param depth - Number of relationship hops (default: 1)\n * @returns Array of relationship information\n */\n public getRelatedNodes(nodeId: string, depth = 1): ERDRelationshipInfo[] {\n const result: ERDRelationshipInfo[] = [];\n const visited = new Set<string>([nodeId]);\n const toProcess = [{ id: nodeId, currentDepth: 0 }];\n\n while (toProcess.length > 0) {\n const current = toProcess.shift()!;\n if (current.currentDepth >= depth) continue;\n\n // Find outgoing relationships\n this.nodes.forEach(node => {\n node.fields.forEach(field => {\n if (field.relatedNodeId) {\n if (node.id === current.id && !visited.has(field.relatedNodeId)) {\n const targetNode = this.nodes.find(n => n.id === field.relatedNodeId);\n if (targetNode) {\n visited.add(field.relatedNodeId);\n toProcess.push({ id: field.relatedNodeId, currentDepth: current.currentDepth + 1 });\n result.push({\n node: targetNode,\n link: {\n sourceNodeId: node.id,\n targetNodeId: field.relatedNodeId,\n sourceField: field,\n isSelfReference: node.id === field.relatedNodeId\n },\n direction: 'outgoing',\n field\n });\n }\n }\n // Incoming relationships\n if (field.relatedNodeId === current.id && !visited.has(node.id)) {\n visited.add(node.id);\n toProcess.push({ id: node.id, currentDepth: current.currentDepth + 1 });\n result.push({\n node,\n link: {\n sourceNodeId: node.id,\n targetNodeId: field.relatedNodeId,\n sourceField: field,\n isSelfReference: node.id === field.relatedNodeId\n },\n direction: 'incoming',\n field\n });\n }\n }\n });\n });\n }\n\n return result;\n }\n\n // ============================================================================\n // PUBLIC API - State Management\n // ============================================================================\n\n /**\n * Get the current state of the diagram for persistence.\n * Includes selection, highlights, zoom, pan, and node positions.\n *\n * @returns Current diagram state\n *\n * @example\n * ```typescript\n * // Save to localStorage\n * const state = erdDiagram.getState();\n * localStorage.setItem('erd-state', JSON.stringify(state));\n * ```\n */\n public getState(): ERDState {\n const zoomState = this.getZoomState();\n const nodePositions: Record<string, { x: number; y: number; fx?: number | null; fy?: number | null }> = {};\n\n this.internalNodes.forEach(node => {\n nodePositions[node.id] = {\n x: node.x || 0,\n y: node.y || 0,\n fx: node.fx,\n fy: node.fy\n };\n });\n\n return {\n selectedNodeId: this.selectedNodeId,\n highlightedNodeIds: [...this.highlightedNodeIds],\n zoomLevel: zoomState.zoomLevel,\n translateX: zoomState.translateX,\n translateY: zoomState.translateY,\n focusNodeId: this.focusNodeId,\n focusDepth: this.focusDepth,\n nodePositions\n };\n }\n\n /**\n * Restore a previously saved diagram state.\n *\n * @param state - State object from `getState()`\n * @param restorePositions - Whether to restore node positions (default: true)\n *\n * @example\n * ```typescript\n * // Restore from localStorage\n * const savedState = JSON.parse(localStorage.getItem('erd-state'));\n * if (savedState) {\n * erdDiagram.setState(savedState);\n * }\n * ```\n */\n public setState(state: Partial<ERDState>, restorePositions = true): void {\n if (state.highlightedNodeIds) {\n this.highlightedNodeIds = [...state.highlightedNodeIds];\n }\n\n // Restore zoom/pan\n if (this.svg && this.zoom && state.zoomLevel != null) {\n this.svg.call(\n this.zoom.transform as unknown as (selection: d3.Selection<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity\n .translate(state.translateX || 0, state.translateY || 0)\n .scale(state.zoomLevel)\n );\n }\n\n // Restore node positions\n if (restorePositions && state.nodePositions) {\n this.internalNodes.forEach(node => {\n const savedPos = state.nodePositions?.[node.id];\n if (savedPos) {\n node.x = savedPos.x;\n node.y = savedPos.y;\n node.fx = savedPos.fx;\n node.fy = savedPos.fy;\n }\n });\n\n // Restart simulation briefly to update display\n if (this.simulation) {\n this.simulation.alpha(0.1).restart();\n }\n }\n\n this.updateSelectionHighlighting();\n this.updateHighlighting();\n }\n\n // ============================================================================\n // PUBLIC API - Layout Control\n // ============================================================================\n\n /**\n * Freeze the layout simulation.\n * Nodes will stay in their current positions and won't move.\n */\n public freezeLayout(): void {\n this.isLayoutFrozen = true;\n if (this.simulation) {\n this.simulation.stop();\n // Fix all node positions\n this.internalNodes.forEach(node => {\n node.fx = node.x;\n node.fy = node.y;\n });\n }\n }\n\n /**\n * Unfreeze the layout simulation.\n * Nodes will resume natural movement based on forces.\n */\n public unfreezeLayout(): void {\n this.isLayoutFrozen = false;\n // Unfix all node positions\n this.internalNodes.forEach(node => {\n node.fx = null;\n node.fy = null;\n });\n if (this.simulation) {\n this.simulation.alpha(0.3).restart();\n }\n }\n\n /**\n * Center the diagram without changing zoom level.\n */\n public centerDiagram(): void {\n if (!this.svg || !this.zoom || this.visibleNodes.length === 0) return;\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth;\n const height = container.clientHeight;\n\n // Calculate center of all nodes\n let sumX = 0, sumY = 0;\n this.visibleNodes.forEach(node => {\n sumX += node.x || 0;\n sumY += node.y || 0;\n });\n const centerX = sumX / this.visibleNodes.length;\n const centerY = sumY / this.visibleNodes.length;\n\n const currentTransform = d3.zoomTransform(this.svg.node()!);\n const translateX = width / 2 - centerX * currentTransform.k;\n const translateY = height / 2 - centerY * currentTransform.k;\n\n this.svg.transition().duration(this.mergedConfig.animationDuration).call(\n this.zoom.transform as unknown as (transition: d3.Transition<SVGSVGElement, unknown, null, undefined>, transform: d3.ZoomTransform) => void,\n d3.zoomIdentity.translate(translateX, translateY).scale(currentTransform.k)\n );\n }\n\n // ============================================================================\n // PUBLIC API - Utilities\n // ============================================================================\n\n /**\n * Rebuild the entire ERD visualization.\n */\n public refresh(): void {\n this.setupERD();\n }\n\n /**\n * Trigger a resize recalculation.\n * Call this when the container size changes.\n */\n public triggerResize(): void {\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n this.resizeTimeout = window.setTimeout(() => {\n this.resizeSVG();\n }, 100);\n }\n\n /**\n * Get current zoom state.\n *\n * @returns Current zoom level and translation\n */\n public getZoomState(): ERDZoomEvent {\n if (!this.svg) {\n return { zoomLevel: 1, translateX: 0, translateY: 0 };\n }\n const transform = d3.zoomTransform(this.svg.node()!);\n return {\n zoomLevel: transform.k,\n translateX: transform.x,\n translateY: transform.y\n };\n }\n\n /**\n * Export the diagram as an SVG string.\n *\n * @returns SVG markup string\n */\n public exportAsSVG(): string {\n if (!this.svg) return '';\n\n const svgNode = this.svg.node();\n if (!svgNode) return '';\n\n const serializer = new XMLSerializer();\n return serializer.serializeToString(svgNode);\n }\n\n // ============================================================================\n // SETUP METHODS\n // ============================================================================\n\n private setupERD(): void {\n if (!this.erdContainer?.nativeElement) {\n return;\n }\n\n this.layoutCompleted = false;\n this.mergeConfig();\n this.clearVisualization();\n this.createInternalNodes();\n this.createInternalLinks();\n this.applyFocusMode();\n this.createVisualization();\n }\n\n private mergeConfig(): void {\n this.mergedConfig = {\n ...DEFAULT_CONFIG,\n ...this.config,\n colors: {\n ...DEFAULT_CONFIG.colors,\n ...this.config.colors\n },\n dagreConfig: {\n ...DEFAULT_DAGRE_CONFIG,\n ...this.config.dagreConfig\n }\n };\n\n // Map 'horizontal' and 'vertical' layout algorithms to dagre with appropriate direction\n if (this.mergedConfig.layoutAlgorithm === 'horizontal') {\n this.mergedConfig.dagreConfig.rankDir = 'LR';\n } else if (this.mergedConfig.layoutAlgorithm === 'vertical') {\n this.mergedConfig.dagreConfig.rankDir = 'TB';\n }\n }\n\n private resizeSVG(): void {\n if (!this.svg || !this.erdContainer?.nativeElement) {\n return;\n }\n\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth || 800;\n const height = container.clientHeight || 600;\n\n if (Math.abs(this.lastKnownSize.width - width) < 5 &&\n Math.abs(this.lastKnownSize.height - height) < 5) {\n return;\n }\n\n this.lastKnownSize = { width, height };\n\n const svgElement = this.svg.node();\n if (svgElement) {\n svgElement.style.width = '100%';\n svgElement.style.height = '100%';\n }\n\n this.svg.attr('viewBox', `0 0 ${width} ${height}`);\n\n if (this.simulation && !this.isLayoutFrozen) {\n this.simulation.force('center', d3.forceCenter(width / 2, height / 2));\n this.simulation.alpha(0.3).restart();\n }\n }\n\n private setupResizeObserver(): void {\n if (!this.erdContainer?.nativeElement) {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n this.resizeTimeout = window.setTimeout(() => {\n const container = this.erdContainer?.nativeElement;\n if (!container) return;\n\n const newWidth = container.clientWidth;\n const newHeight = container.clientHeight;\n\n if (Math.abs(this.lastKnownSize.width - newWidth) >= 5 ||\n Math.abs(this.lastKnownSize.height - newHeight) >= 5) {\n requestAnimationFrame(() => {\n this.resizeSVG();\n });\n }\n }, 50);\n });\n\n this.resizeObserver.observe(this.erdContainer.nativeElement);\n }\n\n private clearVisualization(): void {\n if (this.simulation) {\n this.simulation.stop();\n }\n d3.select(this.erdContainer.nativeElement).selectAll('*').remove();\n }\n\n // ============================================================================\n // FOCUS MODE\n // ============================================================================\n\n private applyFocusMode(): void {\n if (!this.focusNodeId) {\n // No focus mode - show all nodes\n this.visibleNodes = [...this.internalNodes];\n this.visibleLinks = [...this.internalLinks];\n return;\n }\n\n // Get IDs of nodes within focus depth\n const visibleIds = new Set<string>([this.focusNodeId]);\n const relatedIds = this.getRelatedNodeIds(this.focusNodeId, this.focusDepth);\n relatedIds.forEach(id => visibleIds.add(id));\n\n // Filter nodes\n this.visibleNodes = this.internalNodes.filter(n => visibleIds.has(n.id));\n\n // Filter links - only show links between visible nodes\n this.visibleLinks = this.internalLinks.filter(link => {\n const sourceId = typeof link.source === 'string' ? link.source : link.source.id;\n const targetId = typeof link.target === 'string' ? link.target : link.target.id;\n return visibleIds.has(sourceId) && visibleIds.has(targetId);\n });\n }\n\n private getRelatedNodeIds(nodeId: string, depth: number): string[] {\n const visited = new Set<string>([nodeId]);\n const toProcess = [{ id: nodeId, currentDepth: 0 }];\n const result: string[] = [];\n\n while (toProcess.length > 0) {\n const current = toProcess.shift()!;\n if (current.currentDepth >= depth) continue;\n\n // Find relationships\n this.nodes.forEach(node => {\n node.fields.forEach(field => {\n if (field.relatedNodeId) {\n // Outgoing from current\n if (node.id === current.id && !visited.has(field.relatedNodeId)) {\n visited.add(field.relatedNodeId);\n result.push(field.relatedNodeId);\n toProcess.push({ id: field.relatedNodeId, currentDepth: current.currentDepth + 1 });\n }\n // Incoming to current\n if (field.relatedNodeId === current.id && !visited.has(node.id)) {\n visited.add(node.id);\n result.push(node.id);\n toProcess.push({ id: node.id, currentDepth: current.currentDepth + 1 });\n }\n }\n });\n });\n }\n\n return result;\n }\n\n // ============================================================================\n // NODE/LINK CREATION\n // ============================================================================\n\n private createInternalNodes(): void {\n const cfg = this.mergedConfig;\n\n this.internalNodes = this.nodes.map(node => {\n const primaryKeys = node.fields.filter(f => f.isPrimaryKey);\n const foreignKeys = node.fields.filter(f => f.relatedNodeId && !f.isPrimaryKey);\n\n const fieldCount = Math.max(1, primaryKeys.length + foreignKeys.length);\n const calculatedHeight = Math.min(\n cfg.nodeBaseHeight + (fieldCount * cfg.fieldHeight),\n cfg.maxNodeHeight\n );\n\n return {\n id: node.id,\n name: node.name || node.schemaName || 'Unknown',\n node: node,\n width: cfg.nodeWidth,\n height: calculatedHeight,\n primaryKeys: primaryKeys,\n foreignKeys: foreignKeys\n };\n });\n }\n\n private createInternalLinks(): void {\n this.internalLinks = [];\n const nodeMap = new Map(this.internalNodes.map(n => [n.id, n]));\n\n this.nodes.forEach(node => {\n node.fields.forEach(field => {\n if (field.relatedNodeId) {\n const sourceNode = nodeMap.get(node.id);\n const targetNode = nodeMap.get(field.relatedNodeId);\n\n if (sourceNode && targetNode) {\n const isSelfReference = node.id === field.relatedNodeId;\n const targetField = targetNode.primaryKeys.find(pk => pk.name === field.relatedFieldName);\n\n this.internalLinks.push({\n source: sourceNode,\n target: targetNode,\n sourceField: field,\n targetField: targetField,\n isSelfReference: isSelfReference\n });\n }\n }\n });\n });\n }\n\n // ============================================================================\n // DAGRE LAYOUT\n // ============================================================================\n\n /**\n * Applies dagre hierarchical layout to position nodes and compute edge paths.\n * This provides clean, orthogonal edge routing.\n */\n private applyDagreLayout(): void {\n const cfg = this.mergedConfig;\n const dagreCfg = cfg.dagreConfig as Required<ERDDagreConfig>;\n\n // Create a new directed graph\n const g = new dagre.graphlib.Graph({ directed: true, multigraph: true });\n\n // Set graph options\n g.setGraph({\n rankdir: dagreCfg.rankDir,\n nodesep: dagreCfg.nodeSep,\n ranksep: dagreCfg.rankSep,\n edgesep: dagreCfg.edgeSep,\n ranker: dagreCfg.ranker,\n align: dagreCfg.align\n });\n\n // Default edge label (required by dagre)\n g.setDefaultEdgeLabel(() => ({}));\n\n // Add nodes to the graph\n this.visibleNodes.forEach(node => {\n g.setNode(node.id, {\n width: node.width,\n height: node.height,\n label: node.name\n });\n });\n\n // Add edges to the graph\n this.visibleLinks.forEach((link, index) => {\n const sourceId = typeof link.source === 'string' ? link.source : link.source.id;\n const targetId = typeof link.target === 'string' ? link.target : link.target.id;\n\n // Use index as edge name for multigraph support (multiple edges between same nodes)\n g.setEdge(sourceId, targetId, {\n label: link.sourceField.name || '',\n labelpos: 'c',\n labeloffset: 10\n }, `edge-${index}`);\n });\n\n // Run the layout algorithm\n dagre.layout(g);\n\n // Apply computed positions to nodes\n this.visibleNodes.forEach(node => {\n const dagreNode = g.node(node.id);\n if (dagreNode) {\n node.x = dagreNode.x;\n node.y = dagreNode.y;\n // Fix position to prevent force simulation from moving nodes\n node.fx = dagreNode.x;\n node.fy = dagreNode.y;\n }\n });\n\n // Store edge points for orthogonal path rendering\n this.visibleLinks.forEach((link, index) => {\n const sourceId = typeof link.source === 'string' ? link.source : link.source.id;\n const targetId = typeof link.target === 'string' ? link.target : link.target.id;\n\n const edge = g.edge(sourceId, targetId, `edge-${index}`);\n if (edge && edge.points) {\n link.points = edge.points;\n }\n });\n }\n\n /**\n * Checks if the current layout algorithm uses dagre.\n */\n private usesDagreLayout(): boolean {\n const algo = this.mergedConfig.layoutAlgorithm;\n return algo === 'dagre' || algo === 'horizontal' || algo === 'vertical';\n }\n\n // ============================================================================\n // VISUALIZATION\n // ============================================================================\n\n private createVisualization(): void {\n const container = this.erdContainer.nativeElement;\n const width = container.clientWidth || 800;\n const height = container.clientHeight || 600;\n const cfg = this.mergedConfig;\n const colors = cfg.colors as Required<ERDColorScheme>;\n\n this.lastKnownSize = { width, height };\n\n // Create zoom behavior\n if (cfg.enableZoom) {\n this.zoom = d3.zoom<SVGSVGElement, unknown>()\n .scaleExtent([cfg.minZoom, cfg.maxZoom])\n .on('zoom', (event) => {\n if (this.svg) {\n this.svg.select('.chart-area').attr('transform', event.transform);\n this.zoomChange.emit({\n zoomLevel: event.transform.k,\n translateX: event.transform.x,\n translateY: event.transform.y\n });\n }\n });\n }\n\n // Create SVG\n this.svg = d3\n .select(container)\n .append('svg')\n .attr('viewBox', `0 0 ${width} ${height}`)\n .style('width', '100%')\n .style('height', '100%')\n .style('position', 'absolute')\n .style('top', '0')\n .style('left', '0');\n\n if (this.zoom) {\n this.svg.call(this.zoom);\n }\n\n // Background click handler\n this.svg.on('click', (event: MouseEvent) => {\n if (event.target === event.currentTarget) {\n this.nodeDeselected.emit();\n this.clearAllHighlighting();\n }\n });\n\n // Background context menu handler\n this.svg.on('contextmenu', (event: MouseEvent) => {\n if (event.target === event.currentTarget) {\n const contextEvent: ERDDiagramContextMenuEvent = {\n mouseEvent: event,\n cancel: false,\n position: { x: event.clientX, y: event.clientY },\n diagramPosition: this.screenToDiagramCoords(event.clientX, event.clientY)\n };\n this.diagramContextMenu.emit(contextEvent);\n if (contextEvent.cancel) {\n event.preventDefault();\n }\n }\n });\n\n const chartArea = this.svg.append('g').attr('class', 'chart-area');\n\n // Define arrow marker\n this.svg\n .append('defs')\n .selectAll('marker')\n .data(['end-arrow'])\n .enter()\n .append('marker')\n .attr('id', 'end-arrow')\n .attr('viewBox', '0 -5 10 10')\n .attr('refX', 8)\n .attr('refY', 0)\n .attr('markerWidth', 6)\n .attr('markerHeight', 6)\n .attr('orient', 'auto')\n .append('path')\n .attr('d', 'M0,-5L10,0L0,5')\n .attr('fill', colors.linkColor);\n\n // Apply layout based on algorithm\n if (this.usesDagreLayout()) {\n // Use dagre for hierarchical layout with orthogonal edges\n this.applyDagreLayout();\n this.simulation = null; // No force simulation needed\n } else {\n // Create force simulation with visible nodes only (original behavior)\n this.simulation = d3\n .forceSimulation<InternalNode>(this.visibleNodes)\n .force(\n 'link',\n d3\n .forceLink<InternalNode, InternalLink>(this.visibleLinks)\n .id((d) => d.id)\n .distance((d) => {\n const source = d.source as InternalNode;\n const target = d.target as InternalNode;\n const sourceSize = Math.max(source.width, source.height);\n const targetSize = Math.max(target.width, target.height);\n return (sourceSize + targetSize) / 2 + cfg.linkDistance;\n })\n )\n .force('charge', d3.forceManyBody().strength(cfg.chargeStrength))\n .force('center', d3.forceCenter(width / 2, height / 2))\n .force(\n 'collision',\n d3.forceCollide<InternalNode>().radius((d) => {\n return Math.max(d.width, d.height) / 2 + cfg.collisionPadding;\n })\n );\n }\n\n // Create links\n const link = chartArea\n .selectAll('.link')\n .data(this.visibleLinks)\n .enter()\n .append('g')\n .attr('class', (d) => d.isSelfReference ? 'link-group self-reference' : 'link-group');\n\n link\n .append('path')\n .attr('class', 'link')\n .attr('stroke', colors.linkColor)\n .attr('stroke-opacity', 0.8)\n .attr('stroke-width', 2)\n .attr('fill', 'none')\n .attr('marker-end', (d) => (d.isSelfReference ? 'none' : 'url(#end-arrow)'));\n\n if (cfg.showRelationshipLabels) {\n // Add background rect for label (will be sized after text is rendered)\n // Self-referencing links get distinct styling via .self-reference CSS class\n link\n .append('rect')\n .attr('class', 'link-label-bg')\n .attr('stroke-width', 0.5)\n .attr('stroke-opacity', (d) => d.isSelfReference ? 0.6 : 0.4)\n .attr('rx', 2)\n .attr('ry', 2);\n\n // Add the label text\n link\n .append('text')\n .attr('class', 'link-label')\n .attr('font-size', '10px')\n .attr('text-anchor', 'middle')\n .attr('dominant-baseline', 'middle')\n .text((d) => d.sourceField.name || '');\n }\n\n // Link event handlers\n this.attachLinkEventHandlers(link);\n\n // Create nodes\n const nodeGroup = chartArea\n .selectAll('.node')\n .data(this.visibleNodes)\n .enter()\n .append('g')\n .attr('class', 'node')\n .style('cursor', this.readOnly ? 'default' : 'pointer');\n\n if (cfg.enableDragging && !this.readOnly) {\n nodeGroup.call(\n d3.drag<SVGGElement, InternalNode>()\n .on('start', (event, d) => this.dragstarted(event, d))\n .on('drag', (event, d) => this.dragged(event, d))\n .on('end', (event, d) => this.dragended(event, d))\n );\n }\n\n // Node rectangle\n nodeGroup\n .append('rect')\n .attr('class', 'entity-rect')\n .attr('width', (d) => d.width)\n .attr('height', (d) => d.height)\n .attr('x', (d) => -d.width / 2)\n .attr('y', (d) => -d.height / 2)\n .attr('fill', colors.nodeBackground)\n .attr('stroke', colors.nodeBorder)\n .attr('stroke-width', 2)\n .attr('rx', 4);\n\n // Node header\n nodeGroup\n .append('rect')\n .attr('class', 'entity-header')\n .attr('width', (d) => d.width)\n .attr('height', 30)\n .attr('x', (d) => -d.width / 2)\n .attr('y', (d) => -d.height / 2)\n .attr('fill', colors.nodeHeader)\n .attr('rx', 4);\n\n nodeGroup\n .append('rect')\n .attr('class', 'entity-header-bottom')\n .attr('width', (d) => d.width)\n .attr('height', 15)\n .attr('x', (d) => -d.width / 2)\n .attr('y', (d) => -d.height / 2 + 15)\n .attr('fill', colors.nodeHeader);\n\n // Node name\n const entityNameText = nodeGroup\n .append('text')\n .attr('class', 'entity-name')\n .attr('text-anchor', 'middle')\n .attr('y', (d) => -d.height / 2 + 20)\n .attr('font-size', '12px')\n .attr('font-weight', 'bold')\n .attr('fill', colors.nodeHeaderText)\n .text((d) => d.name);\n\n // Truncate entity names that overflow the header\n entityNameText.each((_d, i, nodes) => {\n this.truncateTextElement(nodes[i] as SVGTextElement, cfg.nodeWidth - 16);\n });\n\n // Add fields if configured\n if (cfg.showFieldDetails) {\n this.renderNodeFields(nodeGroup, colors);\n }\n\n // Event handlers\n this.attachNodeEventHandlers(nodeGroup);\n\n // Tooltips\n nodeGroup\n .append('title')\n .text((d) => `${d.name}\\nPrimary Keys: ${d.primaryKeys.length}\\nForeign Keys: ${d.foreignKeys.length}`);\n\n // Handle layout completion based on algorithm type\n if (this.usesDagreLayout()) {\n // Dagre layout is synchronous - positions are already set\n this.updatePositions(link, nodeGroup);\n this.layoutCompleted = true;\n this.layoutComplete.emit();\n\n // Fit to view after positions are set\n if (cfg.fitOnLoad && this.visibleNodes.length > 1) {\n setTimeout(() => this.zoomToFit(), 50);\n }\n } else if (this.simulation) {\n // Force simulation layout\n if (cfg.skipAnimation) {\n // Run simulation to completion without animation\n this.simulation.stop();\n\n // Run enough ticks to settle the layout (typically 300 is enough)\n const tickCount = 300;\n for (let i = 0; i < tickCount; i++) {\n this.simulation.tick();\n }\n\n // Update positions once at the end\n this.updatePositions(link, nodeGroup);\n this.layoutCompleted = true;\n this.layoutComplete.emit();\n\n // Fit to view after positions are set\n if (cfg.fitOnLoad && this.visibleNodes.length > 1) {\n setTimeout(() => this.zoomToFit(), 50);\n }\n } else {\n // Normal animated mode\n // Simulation tick\n this.simulation.on('tick', () => {\n this.updatePositions(link, nodeGroup);\n });\n\n // Layout complete detection\n this.simulation.on('end', () => {\n if (!this.layoutCompleted) {\n this.layoutCompleted = true;\n this.layoutComplete.emit();\n if (cfg.fitOnLoad && this.visibleNodes.length > 1) {\n setTimeout(() => this.zoomToFit(), 100);\n }\n }\n });\n }\n }\n\n // Apply initial selection highlighting\n this.updateSelectionHighlighting();\n this.updateHighlighting();\n }\n\n private renderNodeFields(\n nodeGroup: d3.Selection<SVGGElement, InternalNode, SVGGElement, unknown>,\n colors: Required<ERDColorScheme>\n ): void {\n nodeGroup.each((d, i, nodes) => {\n const group = d3.select(nodes[i]);\n let currentY = -d.height / 2 + 40;\n\n // Primary keys\n d.primaryKeys.forEach((pk) => {\n const fieldGroup = group.append('g').attr('class', 'field-group primary-key');\n\n fieldGroup\n .append('rect')\n .attr('class', 'field-bg')\n .attr('x', -d.width / 2 + 2)\n .attr('y', currentY - 15)\n .attr('width', d.width - 4)\n .attr('height', 18)\n .attr('fill', colors.primaryKeyBackground);\n\n fieldGroup\n .append('text')\n .attr('class', 'field-icon')\n .attr('x', -d.width / 2 + 8)\n .attr('y', currentY - 2)\n .attr('font-size', '10px')\n .attr('fill', colors.primaryKeyText)\n .text('🔑');\n\n const pkNameEl = fieldGroup\n .append('text')\n .attr('class', 'field-name')\n .attr('x', -d.width / 2 + 25)\n .attr('y', currentY - 2)\n .attr('font-size', '11px')\n .attr('font-weight', 'bold')\n .attr('fill', colors.primaryKeyText)\n .text(pk.name || '')\n .node();\n\n if (pkNameEl) this.truncateTextElement(pkNameEl, d.width - 33);\n\n currentY += 20;\n });\n\n // Foreign keys\n d.foreignKeys.forEach((fk) => {\n const fieldGroup = group.append('g').attr('class', 'field-group foreign-key');\n\n fieldGroup\n .append('rect')\n .attr('class', 'field-bg')\n .attr('x', -d.width / 2 + 2)\n .attr('y', currentY - 15)\n .attr('width', d.width - 4)\n .attr('height', 18)\n .attr('fill', colors.foreignKeyBackground);\n\n fieldGroup\n .append('text')\n .attr('class', 'field-icon')\n .attr('x', -d.width / 2 + 8)\n .attr('y', currentY - 2)\n .attr('font-size', '10px')\n .attr('fill', colors.foreignKeyText)\n .text('🔗');\n\n const fkNameEl = fieldGroup\n .append('text')\n .attr('class', 'field-name')\n .attr('x', -d.width / 2 + 25)\n .attr('y', currentY - 2)\n .attr('font-size', '11px')\n .attr('fill', colors.foreignKeyText)\n .text(fk.name || '')\n .node();\n\n if (fkNameEl) this.truncateTextElement(fkNameEl, d.width - 33);\n\n currentY += 20;\n });\n });\n }\n\n /** Truncate an SVG text element to fit within maxWidth, adding \"…\" if needed */\n private truncateTextElement(textEl: SVGTextElement, maxWidth: number): void {\n const original = textEl.textContent || '';\n if (!original || textEl.getComputedTextLength() <= maxWidth) return;\n\n // Binary search for the longest fitting substring\n let lo = 0;\n let hi = original.length;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n textEl.textContent = original.slice(0, mid) + '…';\n if (textEl.getComputedTextLength() <= maxWidth) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n textEl.textContent = lo < original.length ? original.slice(0, lo) + '…' : original;\n }\n\n private attachNodeEventHandlers(\n nodeGroup: d3.Selection<SVGGElement, InternalNode, SVGGElement, unknown>\n ): void {\n nodeGroup\n .on('click', (event: MouseEvent, d: InternalNode) => {\n if (this.readOnly) return;\n event.stopPropagation();\n\n // Emit click event with cancel pattern\n const clickEvent: ERDNodeClickEvent = {\n node: d.node,\n mouseEvent: event,\n cancel: false\n };\n this.nodeClick.emit(clickEvent);\n\n if (clickEvent.cancel) {\n return;\n }\n\n // Handle selection\n if (this.selectedNodeId === d.node.id) {\n this.nodeDeselected.emit();\n } else {\n this.nodeSelected.emit(d.node);\n\n // Auto-zoom if node is too small\n if (this.svg) {\n const currentTransform = d3.zoomTransform(this.svg.node()!);\n const currentRenderedWidth = d.width * currentTransform.k;\n if (currentRenderedWidth < 20) {\n this.zoomToNode(d.node.id);\n }\n }\n }\n\n this.updateSelectionHighlighting();\n })\n .on('dblclick', (event: MouseEvent, d: InternalNode) => {\n event.stopPropagation();\n\n const dblClickEvent: ERDNodeDoubleClickEvent = {\n node: d.node,\n mouseEvent: event,\n cancel: false\n };\n this.nodeDoubleClick.emit(dblClickEvent);\n })\n .on('mouseenter', (event: MouseEvent, d: InternalNode) => {\n const relatedInfo = this.getRelatedNodes(d.node.id, 1);\n const relatedNodes = relatedInfo.map(r => r.node);\n\n const hoverEvent: ERDNodeHoverEvent = {\n node: d.node,\n mouseEvent: event,\n relatedNodes,\n position: { x: event.clientX, y: event.clientY }\n };\n this.nodeHover.emit(hoverEvent);\n })\n .on('mouseleave', (_event: MouseEvent, d: InternalNode) => {\n this.nodeHoverEnd.emit(d.node);\n })\n .on('contextmenu', (event: MouseEvent, d: InternalNode) => {\n const contextEvent: ERDNodeContextMenuEvent = {\n node: d.node,\n mouseEvent: event,\n cancel: false,\n position: { x: event.clientX, y: event.clientY }\n };\n this.nodeContextMenu.emit(contextEvent);\n\n if (contextEvent.cancel) {\n event.preventDefault();\n }\n });\n }\n\n private attachLinkEventHandlers(\n linkGroup: d3.Selection<SVGGElement, InternalLink, SVGGElement, unknown>\n ): void {\n linkGroup\n .on('click', (event: MouseEvent, d: InternalLink) => {\n event.stopPropagation();\n\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n\n const clickEvent: ERDLinkClickEvent = {\n link,\n sourceNode,\n targetNode,\n mouseEvent: event,\n cancel: false\n };\n this.linkClick.emit(clickEvent);\n })\n .on('mouseenter', (event: MouseEvent, d: InternalLink) => {\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n\n const hoverEvent: ERDLinkHoverEvent = {\n link,\n sourceNode,\n targetNode,\n mouseEvent: event,\n position: { x: event.clientX, y: event.clientY }\n };\n this.linkHover.emit(hoverEvent);\n })\n .on('mouseleave', (_event: MouseEvent, d: InternalLink) => {\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n this.linkHoverEnd.emit(link);\n })\n .on('contextmenu', (event: MouseEvent, d: InternalLink) => {\n const sourceNode = (d.source as InternalNode).node;\n const targetNode = (d.target as InternalNode).node;\n\n const link: ERDLink = {\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n sourceField: d.sourceField,\n targetField: d.targetField,\n isSelfReference: d.isSelfReference\n };\n\n const contextEvent: ERDLinkContextMenuEvent = {\n link,\n sourceNode,\n targetNode,\n mouseEvent: event,\n cancel: false,\n position: { x: event.clientX, y: event.clientY }\n };\n this.linkContextMenu.emit(contextEvent);\n\n if (contextEvent.cancel) {\n event.preventDefault();\n }\n });\n }\n\n private updatePositions(\n link: d3.Selection<SVGGElement, InternalLink, SVGGElement, unknown>,\n nodeGroup: d3.Selection<SVGGElement, InternalNode, SVGGElement, unknown>\n ): void {\n const usesDagre = this.usesDagreLayout();\n\n // Update link paths\n link.select('path').attr('d', (d) => {\n const source = d.source as InternalNode;\n const target = d.target as InternalNode;\n\n if (d.isSelfReference) {\n // Create a larger loop that goes around the bottom of the entity\n // Start from right side, loop down and around, return to left side\n const startX = source.x! + source.width / 2; // Right edge center\n const startY = source.y!;\n const endY = source.y! + source.height / 2; // Bottom edge Y\n const loopExtent = 60; // How far out the loop extends\n\n // Use a path that goes: right edge -> curves down-right -> bottom -> curves up to bottom edge\n return `M ${startX} ${startY}\n C ${startX + loopExtent} ${startY},\n ${startX + loopExtent} ${endY + loopExtent},\n ${source.x!} ${endY + loopExtent}\n C ${source.x! - loopExtent} ${endY + loopExtent},\n ${source.x! - source.width / 2 - loopExtent / 2} ${endY},\n ${source.x! - source.width / 2} ${endY}`;\n }\n\n // Use dagre edge points if available (provides cleaner orthogonal paths)\n if (usesDagre && d.points && d.points.length >= 2) {\n return this.createPathFromDagrePoints(d.points);\n }\n\n // Fallback to manual orthogonal path\n const sourcePoint = this.getSourceConnectionPoint(source, d.sourceField);\n const targetPoint = this.getTargetConnectionPoint(target, d.targetField);\n return this.createOrthogonalPath(sourcePoint, targetPoint);\n });\n\n // Update link labels and their background boxes\n link.select('text').attr('transform', (d) => {\n const source = d.source as InternalNode;\n const target = d.target as InternalNode;\n\n if (d.isSelfReference) {\n // Position label at the bottom of the loop (below the entity)\n const loopExtent = 60;\n return `translate(${source.x!}, ${source.y! + source.height / 2 + loopExtent + 8})`;\n }\n\n // Use midpoint of dagre edge points if available\n if (usesDagre && d.points && d.points.length >= 2) {\n const midIndex = Math.floor(d.points.length / 2);\n const midPoint = d.points[midIndex];\n return `translate(${midPoint.x}, ${midPoint.y})`;\n }\n\n // Fallback to midpoint between nodes\n const midX = (source.x! + target.x!) / 2;\n const midY = (source.y! + target.y!) / 2;\n return `translate(${midX}, ${midY - 8})`;\n });\n\n // Update label background rects to match text size and position\n link.each(function() {\n const group = d3.select(this);\n const textEl = group.select('text.link-label').node() as SVGTextElement | null;\n const bgRect = group.select('rect.link-label-bg');\n\n if (textEl && !bgRect.empty()) {\n const bbox = textEl.getBBox();\n const padding = 3;\n\n // Get the transform from the text element\n const transform = group.select('text.link-label').attr('transform');\n\n bgRect\n .attr('x', bbox.x - padding)\n .attr('y', bbox.y - padding)\n .attr('width', bbox.width + padding * 2)\n .attr('height', bbox.height + padding * 2)\n .attr('transform', transform);\n }\n });\n\n // Update node positions\n nodeGroup.attr('transform', (d) => `translate(${d.x},${d.y})`);\n }\n\n // ============================================================================\n // GEOMETRY HELPERS\n // ============================================================================\n\n private getSourceConnectionPoint(sourceNode: InternalNode, field?: ERDField): { x: number; y: number } {\n let connectY = sourceNode.y!;\n\n if (field) {\n const fkIndex = sourceNode.foreignKeys.findIndex((fk) => fk.id === field.id);\n if (fkIndex >= 0) {\n const fieldY = -sourceNode.height / 2 + 40 + sourceNode.primaryKeys.length * 20 + fkIndex * 20;\n connectY = sourceNode.y! + fieldY + 10;\n } else {\n // Check if the field is a primary key that also serves as a foreign key (IS-A pattern)\n const pkIndex = sourceNode.primaryKeys.findIndex((pk) => pk.id === field.id);\n if (pkIndex >= 0) {\n const fieldY = -sourceNode.height / 2 + 40 + pkIndex * 20;\n connectY = sourceNode.y! + fieldY + 10;\n }\n }\n }\n\n return {\n x: sourceNode.x! + sourceNode.width / 2,\n y: connectY,\n };\n }\n\n private getTargetConnectionPoint(targetNode: InternalNode, targetField?: ERDField): { x: number; y: number } {\n let connectY = targetNode.y! - targetNode.height / 2 + 40;\n\n if (targetField && targetField.isPrimaryKey) {\n const pkIndex = targetNode.primaryKeys.findIndex((pk) => pk.id === targetField.id);\n if (pkIndex >= 0) {\n const fieldY = -targetNode.height / 2 + 40 + pkIndex * 20;\n connectY = targetNode.y! + fieldY + 10;\n }\n }\n\n return {\n x: targetNode.x! - targetNode.width / 2,\n y: connectY,\n };\n }\n\n private createOrthogonalPath(source: { x: number; y: number }, target: { x: number; y: number }): string {\n const dx = target.x - source.x;\n let midX: number;\n\n if (dx > 0) {\n midX = source.x + dx * 0.7;\n } else {\n midX = source.x + Math.max(dx * 0.3, -50);\n }\n\n return `M ${source.x} ${source.y}\n L ${midX} ${source.y}\n L ${midX} ${target.y}\n L ${target.x} ${target.y}`;\n }\n\n /**\n * Creates an SVG path string from dagre's edge points.\n * Dagre provides an array of points for each edge that forms a clean orthogonal path.\n * @param points Array of {x, y} coordinates from dagre layout\n * @returns SVG path string\n */\n private createPathFromDagrePoints(points: Array<{ x: number; y: number }>): string {\n if (!points || points.length < 2) {\n return '';\n }\n\n // Start with Move to first point\n let path = `M ${points[0].x} ${points[0].y}`;\n\n // Add Line to each subsequent point\n for (let i = 1; i < points.length; i++) {\n path += ` L ${points[i].x} ${points[i].y}`;\n }\n\n return path;\n }\n\n private screenToDiagramCoords(screenX: number, screenY: number): { x: number; y: number } {\n if (!this.svg) return { x: 0, y: 0 };\n\n const svgNode = this.svg.node();\n if (!svgNode) return { x: 0, y: 0 };\n\n const rect = svgNode.getBoundingClientRect();\n const transform = d3.zoomTransform(svgNode);\n\n return {\n x: (screenX - rect.left - transform.x) / transform.k,\n y: (screenY - rect.top - transform.y) / transform.k\n };\n }\n\n // ============================================================================\n // HIGHLIGHTING\n // ============================================================================\n\n private clearAllHighlighting(): void {\n if (!this.svg) return;\n\n this.svg.selectAll('.node')\n .classed('selected', false)\n .classed('highlighted', false)\n .classed('relationship-connected', false)\n .classed('entity-connections-highlighted', false);\n\n this.svg.selectAll('.entity-rect')\n .classed('highlighted', false)\n .classed('relationship-highlighted', false)\n .classed('connection-highlighted', false)\n .style('stroke', null)\n .style('stroke-width', null)\n .style('filter', null);\n\n this.svg.selectAll('.link-group')\n .classed('highlighted', false);\n\n this.svg.selectAll('.link')\n .classed('highlighted', false);\n\n this.svg.selectAll('.link-label')\n .classed('highlighted', false);\n }\n\n private updateSelectionHighlighting(): void {\n if (!this.svg) return;\n\n // Clear previous selection styling — remove inline styles so CSS classes take over\n this.svg.selectAll('.node')\n .classed('selected', false)\n .select('.entity-rect')\n .style('stroke', null)\n .style('stroke-width', null)\n .style('filter', null);\n\n if (this.selectedNodeId) {\n this.svg.selectAll('.node')\n .filter((d: unknown) => (d as InternalNode).id === this.selectedNodeId)\n .classed('selected', true);\n }\n }\n\n private updateHighlighting(): void {\n if (!this.svg) return;\n\n const highlightSet = new Set(this.highlightedNodeIds);\n\n this.svg.selectAll('.node')\n .classed('highlighted', (d: unknown) => highlightSet.has((d as InternalNode).id))\n .filter((d: unknown) => highlightSet.has((d as InternalNode).id))\n .select('.entity-rect')\n .classed('highlighted', true);\n }\n\n private emitStateChange(): void {\n const state = this.getState();\n this.stateChange.emit(state);\n }\n\n // ============================================================================\n // DRAG HANDLERS\n // ============================================================================\n\n private dragstarted(event: d3.D3DragEvent<SVGGElement, InternalNode, InternalNode>, d: InternalNode): void {\n if (this.isLayoutFrozen) return;\n\n const dragEvent: ERDNodeDragEvent = {\n node: d.node,\n startPosition: { x: d.x || 0, y: d.y || 0 },\n currentPosition: { x: d.x || 0, y: d.y || 0 },\n cancel: false\n };\n this.nodeDragStart.emit(dragEvent);\n\n if (dragEvent.cancel) return;\n\n if (!event.active && this.simulation) {\n this.simulation.alphaTarget(0.3).restart();\n }\n d.fx = d.x;\n d.fy = d.y;\n }\n\n private dragged(event: d3.D3DragEvent<SVGGElement, InternalNode, InternalNode>, d: InternalNode): void {\n if (this.isLayoutFrozen) return;\n\n d.fx = event.x;\n d.fy = event.y;\n }\n\n private dragended(event: d3.D3DragEvent<SVGGElement, InternalNode, InternalNode>, d: InternalNode): void {\n if (this.isLayoutFrozen) return;\n\n const dragEvent: ERDNodeDragEvent = {\n node: d.node,\n startPosition: { x: 0, y: 0 }, // Start position not tracked in drag\n currentPosition: { x: d.x || 0, y: d.y || 0 },\n cancel: false\n };\n this.nodeDragEnd.emit(dragEvent);\n\n if (!event.active && this.simulation) {\n this.simulation.alphaTarget(0);\n }\n d.fx = null;\n d.fy = null;\n }\n}\n","<div class=\"erd-section\">\n @if (showHeader) {\n <div class=\"section-header\">\n <h3>{{ headerTitle }}</h3>\n <div class=\"erd-controls\">\n <button class=\"control-btn\" (click)=\"zoomIn()\" title=\"Zoom In\">\n <span class=\"fa-solid fa-search-plus\"></span>\n </button>\n <button class=\"control-btn\" (click)=\"zoomOut()\" title=\"Zoom Out\">\n <span class=\"fa-solid fa-search-minus\"></span>\n </button>\n <button class=\"control-btn\" (click)=\"resetZoom()\" title=\"Reset Zoom\">\n <span class=\"fa-solid fa-expand\"></span>\n </button>\n <button class=\"control-btn\" (click)=\"refresh(); refreshRequested.emit()\" title=\"Refresh Diagram\">\n <span class=\"fa-solid fa-refresh\"></span>\n </button>\n </div>\n </div>\n }\n <div class=\"erd-container\" #erdContainer>\n @if (isRefreshing) {\n <div class=\"loading-overlay\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\">\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n <div class=\"spinner-ring\"></div>\n </div>\n <div class=\"loading-text\">Loading diagram...</div>\n </div>\n </div>\n }\n </div>\n</div>\n"]}
|