@memberjunction/ng-entity-relationship-diagram 5.30.1 → 5.32.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.
Files changed (40) hide show
  1. package/dist/__tests__/compute-erd-layout.test.d.ts +2 -0
  2. package/dist/__tests__/compute-erd-layout.test.d.ts.map +1 -0
  3. package/dist/__tests__/compute-erd-layout.test.js +207 -0
  4. package/dist/__tests__/compute-erd-layout.test.js.map +1 -0
  5. package/dist/lib/components/entity-details/entity-details.component.d.ts +2 -1
  6. package/dist/lib/components/entity-details/entity-details.component.d.ts.map +1 -1
  7. package/dist/lib/components/entity-details/entity-details.component.js +7 -7
  8. package/dist/lib/components/entity-details/entity-details.component.js.map +1 -1
  9. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.d.ts +10 -4
  10. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.d.ts.map +1 -1
  11. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.js +60 -72
  12. package/dist/lib/components/entity-filter-panel/entity-filter-panel.component.js.map +1 -1
  13. package/dist/lib/components/erd-composite/erd-composite.component.d.ts +4 -1
  14. package/dist/lib/components/erd-composite/erd-composite.component.d.ts.map +1 -1
  15. package/dist/lib/components/erd-composite/erd-composite.component.js +22 -8
  16. package/dist/lib/components/erd-composite/erd-composite.component.js.map +1 -1
  17. package/dist/lib/components/erd-diagram.component.d.ts +169 -443
  18. package/dist/lib/components/erd-diagram.component.d.ts.map +1 -1
  19. package/dist/lib/components/erd-diagram.component.js +916 -1777
  20. package/dist/lib/components/erd-diagram.component.js.map +1 -1
  21. package/dist/lib/components/mj-entity-erd.component.d.ts +3 -2
  22. package/dist/lib/components/mj-entity-erd.component.d.ts.map +1 -1
  23. package/dist/lib/components/mj-entity-erd.component.js +6 -6
  24. package/dist/lib/components/mj-entity-erd.component.js.map +1 -1
  25. package/dist/lib/entity-relationship-diagram.module.d.ts +2 -1
  26. package/dist/lib/entity-relationship-diagram.module.d.ts.map +1 -1
  27. package/dist/lib/entity-relationship-diagram.module.js +9 -3
  28. package/dist/lib/entity-relationship-diagram.module.js.map +1 -1
  29. package/dist/lib/interfaces/erd-types.d.ts +38 -7
  30. package/dist/lib/interfaces/erd-types.d.ts.map +1 -1
  31. package/dist/lib/interfaces/erd-types.js.map +1 -1
  32. package/dist/lib/layout/compute-dagre-layout.d.ts +32 -0
  33. package/dist/lib/layout/compute-dagre-layout.d.ts.map +1 -0
  34. package/dist/lib/layout/compute-dagre-layout.js +168 -0
  35. package/dist/lib/layout/compute-dagre-layout.js.map +1 -0
  36. package/dist/lib/layout/compute-erd-layout.d.ts +103 -0
  37. package/dist/lib/layout/compute-erd-layout.d.ts.map +1 -0
  38. package/dist/lib/layout/compute-erd-layout.js +254 -0
  39. package/dist/lib/layout/compute-erd-layout.js.map +1 -0
  40. package/package.json +6 -5
@@ -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', (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"]}
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":["/**\n * @module erd-diagram.component\n * @description\n * Schema-grouped Entity Relationship Diagram. Each schema becomes a rounded\n * rectangular band; entities tile in a grid within the band. Click a node to\n * enter focus mode (neighbours highlighted, everything else dimmed) and see a\n * floating details card with its inbound and outbound FKs.\n *\n * The component is pure Angular + SVG (no D3, no Dagre). Layout is computed\n * by a pure function in `../layout/compute-erd-layout.ts` that is easily\n * unit-tested.\n *\n * Public API is preserved from the previous D3-based implementation so\n * existing consumers (Database Designer wizard preview, admin ERD dashboard,\n * Entity Record view) continue to work without changes.\n */\n\nimport {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n ViewChild,\n HostBinding,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n AfterViewInit,\n OnDestroy,\n OnChanges,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport {\n ERDNode,\n ERDField,\n ERDLink,\n ERDConfig,\n ERDNodeClickEvent,\n ERDNodeDoubleClickEvent,\n ERDLinkClickEvent,\n ERDZoomEvent,\n ERDState,\n ERDNodeHoverEvent,\n ERDLinkHoverEvent,\n ERDNodeContextMenuEvent,\n ERDLinkContextMenuEvent,\n ERDDiagramContextMenuEvent,\n ERDNodeDragEvent,\n} from '../interfaces/erd-types';\nimport {\n computeErdLayout,\n pointsToPath,\n getNeighbors,\n type ErdLayout,\n type LaidOutNode,\n type LaidOutEdge,\n type LaidOutBand,\n} from '../layout/compute-erd-layout';\nimport { computeDagreLayout } from '../layout/compute-dagre-layout';\n\n// ──────────────────────────────────────────────────────────────────────────\n// Internal view-model types\n// ──────────────────────────────────────────────────────────────────────────\n\ninterface SchemaChip {\n name: string;\n count: number;\n active: boolean;\n}\n\n/** 2D transform (pan x/y + zoom scale) for the SVG stage. */\ninterface Transform {\n x: number;\n y: number;\n k: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-erd-diagram',\n templateUrl: './erd-diagram.component.html',\n styleUrls: ['./erd-diagram.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ERDDiagramComponent implements AfterViewInit, OnDestroy, OnChanges {\n\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly host = inject(ElementRef);\n\n // ─── INPUTS ───────────────────────────────────────────────────────────\n\n @Input() public nodes: ERDNode[] = [];\n @Input() public selectedNodeId: string | null = null;\n @Input() public highlightedNodeIds: string[] = [];\n @Input() public focusNodeId: string | null = null;\n @Input() public focusDepth = 1;\n @Input() public isRefreshing = false;\n @Input() public readOnly = false;\n @Input() public config: ERDConfig = {};\n @Input() public showHeader = true;\n @Input() public headerTitle = 'Entity Relationship Diagram';\n\n // ─── OUTPUTS (preserved from legacy API) ──────────────────────────────\n\n @Output() public nodeClick = new EventEmitter<ERDNodeClickEvent>();\n @Output() public nodeDoubleClick = new EventEmitter<ERDNodeDoubleClickEvent>();\n @Output() public nodeSelected = new EventEmitter<ERDNode>();\n @Output() public nodeDeselected = new EventEmitter<void>();\n @Output() public linkClick = new EventEmitter<ERDLinkClickEvent>();\n @Output() public nodeHover = new EventEmitter<ERDNodeHoverEvent>();\n @Output() public nodeHoverEnd = new EventEmitter<ERDNode>();\n @Output() public linkHover = new EventEmitter<ERDLinkHoverEvent>();\n @Output() public linkHoverEnd = new EventEmitter<ERDLink>();\n @Output() public nodeContextMenu = new EventEmitter<ERDNodeContextMenuEvent>();\n @Output() public linkContextMenu = new EventEmitter<ERDLinkContextMenuEvent>();\n @Output() public diagramContextMenu = new EventEmitter<ERDDiagramContextMenuEvent>();\n @Output() public nodeDragStart = new EventEmitter<ERDNodeDragEvent>();\n @Output() public nodeDragEnd = new EventEmitter<ERDNodeDragEvent>();\n @Output() public zoomChange = new EventEmitter<ERDZoomEvent>();\n @Output() public refreshRequested = new EventEmitter<void>();\n @Output() public layoutComplete = new EventEmitter<void>();\n @Output() public stateChange = new EventEmitter<ERDState>();\n\n // ─── VIEW CHILDREN ────────────────────────────────────────────────────\n\n @ViewChild('canvasRef', { static: false }) private canvasRef?: ElementRef<SVGSVGElement>;\n\n // ─── STATE ────────────────────────────────────────────────────────────\n\n /** Current pan + zoom. */\n public transform: Transform = { x: 0, y: 0, k: 1 };\n\n /** Set of schema names the user has filtered IN. Null means \"all\". */\n public activeSchemas: Set<string> | null = null;\n\n /** Search query string. */\n public searchQuery = '';\n\n /** Node IDs the user has clicked \"+N more fields\" on. */\n public expandedNodeIds = new Set<string>();\n\n /** Node currently being hovered (for highlight preview). */\n public hoverNodeId: string | null = null;\n\n /** Cached layout — recomputed when nodes, filter, search or expansion changes. */\n public layout: ErdLayout = { nodes: [], edges: [], bands: [], totalWidth: 0, totalHeight: 0 };\n\n /**\n * Active layout algorithm. Starts from `config.layoutAlgorithm` (default\n * `schema-grid`) but can be toggled at runtime via `setLayoutAlgorithm`.\n * Exposed so the chrome toggle + saved user state can drive it.\n */\n public activeLayout: 'schema-grid' | 'dagre' = 'schema-grid';\n\n /** Derived schema summary for the chip row. */\n public schemaChips: SchemaChip[] = [];\n\n /** Derived — number of entities currently visible. */\n public visibleCount = 0;\n\n /** Derived — total entities in the input, before any filtering. */\n public totalCount = 0;\n\n /** Derived — the Set of IDs in the focus/hover neighbourhood (null when no highlight active). */\n public highlightSet: Set<string> | null = null;\n\n /** Derived — the single selected entity, if any. */\n public selectedEntity: ERDNode | null = null;\n\n // Panning bookkeeping (not reactive). Public so the template can bind a\n // cursor attribute to it; treat as internal state.\n public panning = false;\n private panStart: { x: number; y: number } | null = null;\n /** Raw mousedown coords — used to compute drag distance for the\n * pan-vs-click threshold. */\n private dragOrigin: { clientX: number; clientY: number } | null = null;\n /** True once movement crossed the drag threshold — used to suppress\n * the synthetic click that follows the mouseup. */\n private dragMoved = false;\n /** Pixels of movement before mousedown is treated as a drag. */\n private static readonly DRAG_THRESHOLD = 4;\n /** Bound window listeners — kept on the instance so we can detach. */\n private boundWindowMove?: (e: MouseEvent) => void;\n private boundWindowUp?: (e: MouseEvent) => void;\n\n private resizeObserver?: ResizeObserver;\n\n @HostBinding('class.erd-root') readonly rootClass = true;\n\n // ─── LIFECYCLE ────────────────────────────────────────────────────────\n\n public ngOnChanges(changes: SimpleChanges): void {\n const nodesChanged = !!changes['nodes'];\n // Compare config by the fields we actually use — consumers that bind\n // an inline `[config]=\"{...}\"` object literal get a new reference\n // every CD cycle, so a naive `changes['config']` check would\n // recompute + refit endlessly.\n const configChanged = this.configAffectsLayout(\n changes['config']?.previousValue as ERDConfig | undefined,\n changes['config']?.currentValue as ERDConfig | undefined,\n );\n if (nodesChanged || configChanged) {\n if (nodesChanged) {\n this.activeSchemas = null;\n this.expandedNodeIds = new Set();\n this.hoverNodeId = null;\n }\n // Honour `config.layoutAlgorithm` on first arrival; runtime\n // changes happen via `setLayoutAlgorithm`.\n if (this.config.layoutAlgorithm === 'dagre') this.activeLayout = 'dagre';\n else if (this.config.layoutAlgorithm === 'schema-grid') this.activeLayout = 'schema-grid';\n this.recompute();\n // Fit-to-view once the DOM has the new canvas dimensions.\n queueMicrotask(() => this.fitToView());\n }\n if (changes['focusNodeId']) {\n this.updateHighlightSet();\n this.cdr.markForCheck();\n }\n }\n\n /** True iff any config field that influences the cached layout changed. */\n private configAffectsLayout(prev: ERDConfig | undefined, curr: ERDConfig | undefined): boolean {\n if (prev === curr) return false;\n return (\n (prev?.nodeWidth ?? null) !== (curr?.nodeWidth ?? null) ||\n (prev?.fieldHeight ?? null) !== (curr?.fieldHeight ?? null) ||\n (prev?.showAllFields ?? null) !== (curr?.showAllFields ?? null) ||\n (prev?.showSchemaBands ?? null) !== (curr?.showSchemaBands ?? null) ||\n (prev?.crowsFoot ?? null) !== (curr?.crowsFoot ?? null) ||\n (prev?.maxFitZoom ?? null) !== (curr?.maxFitZoom ?? null) ||\n (prev?.minZoom ?? null) !== (curr?.minZoom ?? null) ||\n (prev?.maxZoom ?? null) !== (curr?.maxZoom ?? null)\n );\n }\n\n public ngAfterViewInit(): void {\n this.resizeObserver = this.watchResize();\n this.recompute();\n queueMicrotask(() => this.fitToView());\n }\n\n public ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n // Detach any pan listeners still bound from an in-progress drag.\n if (this.boundWindowMove) window.removeEventListener('mousemove', this.boundWindowMove);\n if (this.boundWindowUp) window.removeEventListener('mouseup', this.boundWindowUp);\n }\n\n // ─── RECOMPUTATION ────────────────────────────────────────────────────\n\n /** Rebuild the layout + derived view-model from current inputs/state. */\n private recompute(): void {\n this.totalCount = this.nodes.length;\n\n const filteredBySchema = this.activeSchemas\n ? this.nodes.filter(n => this.activeSchemas!.has(n.schemaName || '_'))\n : this.nodes;\n\n const q = this.searchQuery.trim().toLowerCase();\n const filtered = q\n ? filteredBySchema.filter(n =>\n n.name.toLowerCase().includes(q) ||\n (n.schemaName?.toLowerCase().includes(q) ?? false) ||\n n.fields.some(f => f.name.toLowerCase().includes(q)))\n : filteredBySchema;\n\n this.visibleCount = filtered.length;\n\n const commonOpts = {\n nodeWidth: this.config.nodeWidth ?? 220,\n fieldHeight: this.config.fieldHeight ?? 22,\n expandedNodeIds: this.expandedNodeIds,\n showAllFields: this.config.showAllFields ?? false,\n };\n\n this.layout = this.activeLayout === 'dagre'\n ? computeDagreLayout(filtered, {\n ...commonOpts,\n rankDir: this.config.dagreConfig?.rankDir ?? 'LR',\n nodeSep: this.config.dagreConfig?.nodeSep,\n rankSep: this.config.dagreConfig?.rankSep,\n })\n : computeErdLayout(filtered, commonOpts);\n\n this.schemaChips = this.buildSchemaChips();\n this.updateHighlightSet();\n this.updateSelectedEntity();\n this.cdr.markForCheck();\n }\n\n /**\n * Switch between the schema-grid and dagre hierarchical layouts at\n * runtime. Emits a state change so the consumer can persist the\n * user's preference (via `userStateChange` on `mj-erd-composite`).\n *\n * Also clears the current focus/selection — switching layouts moves\n * cards to entirely new positions, so the previously-selected entity\n * would otherwise stay highlighted in a different spot with the side\n * panel still open, which is jarring. A clean slate is better.\n */\n public setLayoutAlgorithm(algo: 'schema-grid' | 'dagre'): void {\n if (this.activeLayout === algo) return;\n this.activeLayout = algo;\n\n const hadSelection = !!(this.focusNodeId || this.selectedNodeId);\n this.focusNodeId = null;\n this.selectedNodeId = null;\n this.hoverNodeId = null;\n this.updateHighlightSet();\n this.updateSelectedEntity();\n if (hadSelection) this.nodeDeselected.emit();\n\n this.recompute();\n queueMicrotask(() => this.fitToView());\n this.stateChange.emit(this.getState());\n }\n\n private buildSchemaChips(): SchemaChip[] {\n const counts = new Map<string, number>();\n for (const n of this.nodes) {\n const s = n.schemaName || '_';\n counts.set(s, (counts.get(s) ?? 0) + 1);\n }\n return [...counts.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, count]) => ({\n name,\n count,\n active: this.activeSchemas ? this.activeSchemas.has(name) : true,\n }));\n }\n\n private updateHighlightSet(): void {\n const id = this.focusNodeId ?? this.hoverNodeId;\n this.highlightSet = id ? getNeighbors(this.nodes, id) : null;\n }\n\n private updateSelectedEntity(): void {\n const id = this.focusNodeId ?? this.selectedNodeId;\n this.selectedEntity = id ? this.nodes.find(n => n.id === id) ?? null : null;\n }\n\n private watchResize(): ResizeObserver {\n const observer = new ResizeObserver(() => this.fitToView());\n observer.observe(this.host.nativeElement);\n return observer;\n }\n\n // ─── PAN / ZOOM / FIT ────────────────────────────────────────────────\n\n /**\n * Mousedown anywhere on the SVG (background OR a node card). We\n * arm a potential pan and attach window-level move/up listeners so\n * the drag continues even if the cursor leaves the canvas (passes\n * over the focus card, scrollbars, the chrome, etc.).\n *\n * The actual `panning = true` flip happens in the move handler once\n * the cursor crosses `DRAG_THRESHOLD` — that way short clicks still\n * register as clicks on cards (no accidental selection-toggle from\n * a tiny mouse jitter).\n */\n public onBackgroundMouseDown(e: MouseEvent): void {\n if (e.button !== 0) return;\n this.dragOrigin = { clientX: e.clientX, clientY: e.clientY };\n this.dragMoved = false;\n this.panStart = { x: e.clientX - this.transform.x, y: e.clientY - this.transform.y };\n\n this.boundWindowMove = (ev: MouseEvent) => this.onWindowMouseMove(ev);\n this.boundWindowUp = (ev: MouseEvent) => this.onWindowMouseUp(ev);\n window.addEventListener('mousemove', this.boundWindowMove);\n window.addEventListener('mouseup', this.boundWindowUp);\n }\n\n private onWindowMouseMove(e: MouseEvent): void {\n if (!this.dragOrigin || !this.panStart) return;\n\n if (!this.panning) {\n const dx = e.clientX - this.dragOrigin.clientX;\n const dy = e.clientY - this.dragOrigin.clientY;\n if (Math.hypot(dx, dy) < ERDDiagramComponent.DRAG_THRESHOLD) return;\n this.panning = true;\n this.dragMoved = true;\n }\n\n this.transform = {\n ...this.transform,\n x: e.clientX - this.panStart.x,\n y: e.clientY - this.panStart.y,\n };\n this.emitZoom();\n this.cdr.markForCheck();\n }\n\n private onWindowMouseUp(_e: MouseEvent): void {\n // If a drag actually happened, swallow the synthetic click that\n // browsers fire on mouseup so it doesn't reach the node click\n // handler and toggle the focus. We use capture phase + once so\n // we only catch the immediate next click from this mouse-up.\n if (this.dragMoved) {\n const swallow = (ev: MouseEvent) => {\n ev.stopPropagation();\n ev.preventDefault();\n };\n window.addEventListener('click', swallow, { capture: true, once: true });\n }\n\n this.panning = false;\n this.panStart = null;\n this.dragOrigin = null;\n this.dragMoved = false;\n\n if (this.boundWindowMove) {\n window.removeEventListener('mousemove', this.boundWindowMove);\n this.boundWindowMove = undefined;\n }\n if (this.boundWindowUp) {\n window.removeEventListener('mouseup', this.boundWindowUp);\n this.boundWindowUp = undefined;\n }\n }\n\n public onWheel(e: WheelEvent): void {\n if (this.config.enableZoom === false) return;\n e.preventDefault();\n const svg = this.canvasRef?.nativeElement;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const mx = e.clientX - rect.left;\n const my = e.clientY - rect.top;\n const delta = -e.deltaY * 0.001;\n const minZoom = this.config.minZoom ?? 0.15;\n const maxZoom = this.config.maxZoom ?? 2.5;\n const newK = Math.max(minZoom, Math.min(maxZoom, this.transform.k * (1 + delta)));\n const ratio = newK / this.transform.k;\n this.transform = {\n k: newK,\n x: mx - (mx - this.transform.x) * ratio,\n y: my - (my - this.transform.y) * ratio,\n };\n this.emitZoom();\n this.cdr.markForCheck();\n }\n\n public zoomBy(factor: number): void {\n const svg = this.canvasRef?.nativeElement;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n const mx = rect.width / 2;\n const my = rect.height / 2;\n const minZoom = this.config.minZoom ?? 0.15;\n const maxZoom = this.config.maxZoom ?? 2.5;\n const newK = Math.max(minZoom, Math.min(maxZoom, this.transform.k * factor));\n const ratio = newK / this.transform.k;\n this.transform = {\n k: newK,\n x: mx - (mx - this.transform.x) * ratio,\n y: my - (my - this.transform.y) * ratio,\n };\n this.emitZoom();\n this.cdr.markForCheck();\n }\n\n public fitToView(): void {\n const svg = this.canvasRef?.nativeElement;\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0 || this.layout.totalWidth === 0) return;\n\n const padding = 60;\n // Allow fit to scale UP for small diagrams (e.g. the Database Designer\n // wizard preview, where a single entity + a couple of satellites\n // would otherwise look lost in the pane). Consumers can override via\n // `config.maxFitZoom`. Default 2.5x: a 220px card becomes ~550px,\n // which comfortably fills a typical preview pane without looking\n // cartoonish (13px text → ~33px, still a readable ceiling).\n const maxFit = this.config.maxFitZoom ?? 2.5;\n const idealK = Math.min(\n (rect.width - padding * 2) / this.layout.totalWidth,\n (rect.height - padding * 2) / this.layout.totalHeight,\n maxFit,\n );\n\n // Clamp the fit zoom so cards stay legible. On very large schemas\n // (hundreds of entities) fit-to-view would otherwise shrink each card\n // to a few pixels wide. We'd rather show part of the canvas at a\n // readable zoom and let the user pan to see the rest.\n const minZoom = this.config.minZoom ?? 0.35;\n const k = Math.max(idealK, minZoom);\n\n // Center horizontally only if the canvas fits; otherwise anchor at left\n // so the user starts at the first schema band instead of the middle.\n const canvasFitsX = this.layout.totalWidth * k <= rect.width - padding * 2;\n const canvasFitsY = this.layout.totalHeight * k <= rect.height - padding * 2;\n\n const newX = canvasFitsX ? (rect.width - this.layout.totalWidth * k) / 2 : padding;\n const newY = canvasFitsY ? (rect.height - this.layout.totalHeight * k) / 2 : padding;\n\n // Idempotent guard. If the computed transform is effectively identical\n // to the current one, bail out without reassigning or calling\n // markForCheck. Without this, a consumer that passes an inline\n // `[config]=\"{...}\"` object literal re-triggers ngOnChanges on every\n // change-detection tick, producing an infinite fitToView → markForCheck\n // → CD → ngOnChanges → fitToView loop (NG0103).\n const TOL = 0.001;\n if (\n Math.abs(this.transform.k - k) < TOL &&\n Math.abs(this.transform.x - newX) < 0.5 &&\n Math.abs(this.transform.y - newY) < 0.5\n ) {\n return;\n }\n\n this.transform = { k, x: newX, y: newY };\n this.emitZoom();\n this.layoutComplete.emit();\n this.cdr.markForCheck();\n }\n\n private centerOn(nodeId: string): void {\n const n = this.layout.nodes.find(x => x.id === nodeId);\n const svg = this.canvasRef?.nativeElement;\n if (!n || !svg) return;\n const rect = svg.getBoundingClientRect();\n const k = Math.max(this.transform.k, 0.9);\n this.transform = {\n k,\n x: rect.width / 2 - (n.x + n.width / 2) * k,\n y: rect.height / 2 - (n.y + n.height / 2) * k,\n };\n this.emitZoom();\n // External callers (e.g. zoomToNode invoked from the side panel)\n // need CD to pick up the new transform — onNodeClick used to do\n // this itself but external pathways were silently no-op'ing.\n this.cdr.markForCheck();\n }\n\n private emitZoom(): void {\n this.zoomChange.emit({\n zoomLevel: this.transform.k,\n translateX: this.transform.x,\n translateY: this.transform.y,\n });\n }\n\n // ─── NODE INTERACTIONS ───────────────────────────────────────────────\n\n public onNodeClick(node: LaidOutNode, e: MouseEvent): void {\n e.stopPropagation();\n const event: ERDNodeClickEvent = { node, mouseEvent: e, cancel: false };\n this.nodeClick.emit(event);\n if (event.cancel) return;\n\n if (this.focusNodeId === node.id) {\n // Toggle off — deselect.\n this.focusNodeId = null;\n this.selectedNodeId = null;\n this.nodeDeselected.emit();\n } else {\n this.focusNodeId = node.id;\n this.selectedNodeId = node.id;\n this.nodeSelected.emit(node);\n this.centerOn(node.id);\n }\n this.updateHighlightSet();\n this.updateSelectedEntity();\n this.cdr.markForCheck();\n }\n\n public onNodeMouseEnter(node: LaidOutNode, e: MouseEvent): void {\n this.hoverNodeId = node.id;\n this.updateHighlightSet();\n const related = this.nodes.filter(n => this.highlightSet?.has(n.id) && n.id !== node.id);\n this.nodeHover.emit({\n node, mouseEvent: e, relatedNodes: related,\n position: { x: e.clientX, y: e.clientY },\n });\n this.cdr.markForCheck();\n }\n\n public onNodeMouseLeave(node: LaidOutNode): void {\n this.hoverNodeId = null;\n this.updateHighlightSet();\n this.nodeHoverEnd.emit(node);\n this.cdr.markForCheck();\n }\n\n public onToggleExpand(nodeId: string, e: Event): void {\n e.stopPropagation();\n if (this.expandedNodeIds.has(nodeId)) this.expandedNodeIds.delete(nodeId);\n else this.expandedNodeIds.add(nodeId);\n // New Set reference so @for trackBy treats it as changed.\n this.expandedNodeIds = new Set(this.expandedNodeIds);\n this.recompute();\n }\n\n // ─── CHROME INTERACTIONS ─────────────────────────────────────────────\n\n public onSearchChange(value: string): void {\n this.searchQuery = value;\n this.recompute();\n }\n\n public onClearSearch(): void {\n this.searchQuery = '';\n this.recompute();\n }\n\n public onSchemaChipToggle(schemaName: string): void {\n const current = this.activeSchemas ?? new Set(this.schemaChips.map(c => c.name));\n const next = new Set(current);\n if (next.has(schemaName)) next.delete(schemaName);\n else next.add(schemaName);\n this.activeSchemas = next.size === this.schemaChips.length ? null : next;\n this.recompute();\n }\n\n public onRequestRefresh(): void {\n this.refreshRequested.emit();\n }\n\n // ─── DERIVED DATA FOR TEMPLATE ───────────────────────────────────────\n\n /** Path string for an edge — uses the orthogonal polyline from layout. */\n public edgePath(edge: LaidOutEdge): string {\n return pointsToPath(edge.points);\n }\n\n /**\n * Whether to render FK field labels along edges. Defaults to ON in\n * both layouts — the zoom-gate (>=0.55x) keeps the labels off when\n * the user is zoomed out far enough to see hundreds of entities, so\n * \"noise on dense views\" isn't a real concern. Consumers can still\n * force off via `config.showRelationshipLabels: false`.\n */\n public get showEdgeLabels(): boolean {\n const enabled = this.config.showRelationshipLabels ?? true;\n if (!enabled) return false;\n return this.transform.k >= 0.55;\n }\n\n /**\n * Pick a point along the edge polyline for a label and approximate\n * its width. Returns null for self-loops (no good place to put text).\n * Uses the longest horizontal segment when one exists; falls back to\n * the segment midpoint otherwise.\n */\n public edgeLabelPosition(edge: LaidOutEdge): { x: number; y: number; w: number } | null {\n if (edge.selfReference) return null;\n const pts = edge.points;\n if (pts.length < 2) return null;\n\n // Find the longest horizontal segment so the label sits on a\n // straight portion, not over a corner.\n let bestIdx = 0;\n let bestLen = 0;\n for (let i = 0; i < pts.length - 1; i++) {\n const [x1, y1] = pts[i];\n const [x2, y2] = pts[i + 1];\n if (Math.abs(y2 - y1) > 0.5) continue; // skip vertical segs\n const len = Math.abs(x2 - x1);\n if (len > bestLen) { bestLen = len; bestIdx = i; }\n }\n\n const [x1, y1] = pts[bestIdx];\n const [x2, y2] = pts[bestIdx + 1];\n const x = (x1 + x2) / 2;\n const y = (y1 + y2) / 2;\n\n // 6.5 px per char is a good approximation for the 11px mono we\n // use for labels — only used to size the background rect.\n const w = Math.max(20, edge.sourceField.name.length * 6.5);\n return { x, y, w };\n }\n\n /** Whether a node should appear dimmed (highlight mode active, node not in set). */\n public isDimmed(nodeId: string): boolean {\n return !!this.highlightSet && !this.highlightSet.has(nodeId);\n }\n\n /** Whether a node is the current focus (strong border). */\n public isFocus(nodeId: string): boolean {\n return this.focusNodeId === nodeId;\n }\n\n /** Whether a node is a 1-hop neighbour of the focus (medium border). */\n public isNeighbour(nodeId: string): boolean {\n return !!this.highlightSet && this.highlightSet.has(nodeId) && !this.isFocus(nodeId);\n }\n\n /** Whether an edge is part of the active highlight subgraph. */\n public isEdgeActive(edge: LaidOutEdge): boolean {\n return !!this.highlightSet && this.highlightSet.has(edge.sourceId) && this.highlightSet.has(edge.targetId);\n }\n\n /** Whether an edge should appear dimmed. */\n public isEdgeDimmed(edge: LaidOutEdge): boolean {\n return !!this.highlightSet && !this.isEdgeActive(edge);\n }\n\n /** Zoom percentage string for the toolbar readout. */\n public get zoomPercent(): string {\n return Math.round(this.transform.k * 100) + '%';\n }\n\n /** Short friendly row-count string (e.g. 1248 → \"1.2k\"). */\n public formatCount(n: number | undefined): string {\n if (n == null) return '';\n if (n >= 1000) return (n / 1000).toFixed(n >= 10000 ? 0 : 1) + 'k';\n return n.toString();\n }\n\n /** Number of PK fields — handy aggregate (kept for external API parity). */\n public pkCount(entity: ERDNode): number {\n return entity.fields.filter(f => f.isPrimaryKey).length;\n }\n\n /** Number of FK fields — handy aggregate (kept for external API parity). */\n public fkCount(entity: ERDNode): number {\n return entity.fields.filter(f => !!f.relatedNodeId).length;\n }\n\n // ─── LEGACY API SHIMS ────────────────────────────────────────────────\n // Kept so existing consumers (mj-entity-erd wrapper, admin ERD dashboard)\n // continue to compile and work. The new implementation doesn't need\n // most of these, but we preserve the shape.\n\n public zoomIn(): void { this.zoomBy(1.2); }\n public zoomOut(): void { this.zoomBy(0.83); }\n public resetZoom(): void { this.fitToView(); }\n public zoomToFit(_padding?: number): void { this.fitToView(); }\n public zoomToNode(nodeId: string, _scale?: number): void { this.centerOn(nodeId); }\n public triggerResize(): void { this.fitToView(); }\n\n public refresh(): void {\n this.recompute();\n queueMicrotask(() => this.fitToView());\n }\n\n public getState(): ERDState {\n return {\n selectedNodeId: this.selectedNodeId,\n highlightedNodeIds: [...this.highlightedNodeIds],\n zoomLevel: this.transform.k,\n translateX: this.transform.x,\n translateY: this.transform.y,\n focusNodeId: this.focusNodeId,\n focusDepth: this.focusDepth,\n nodePositions: {},\n layoutAlgorithm: this.activeLayout,\n };\n }\n\n public setState(state: Partial<ERDState>, _restorePositions?: boolean): void {\n if (state.selectedNodeId !== undefined) this.selectedNodeId = state.selectedNodeId;\n if (state.highlightedNodeIds !== undefined) this.highlightedNodeIds = [...state.highlightedNodeIds];\n if (state.focusNodeId !== undefined) this.focusNodeId = state.focusNodeId;\n if (state.focusDepth !== undefined) this.focusDepth = state.focusDepth;\n if (state.zoomLevel !== undefined || state.translateX !== undefined || state.translateY !== undefined) {\n this.transform = {\n k: state.zoomLevel ?? this.transform.k,\n x: state.translateX ?? this.transform.x,\n y: state.translateY ?? this.transform.y,\n };\n }\n if (state.layoutAlgorithm && state.layoutAlgorithm !== this.activeLayout) {\n this.activeLayout = state.layoutAlgorithm;\n this.recompute();\n }\n this.updateHighlightSet();\n this.updateSelectedEntity();\n this.cdr.markForCheck();\n }\n\n public exportAsSVG(): string {\n const svg = this.canvasRef?.nativeElement;\n if (!svg) return '';\n return new XMLSerializer().serializeToString(svg);\n }\n\n // ─── TRACK-BYs ───────────────────────────────────────────────────────\n\n public trackByBand = (_: number, b: LaidOutBand) => b.schemaName;\n public trackByEdge = (_: number, e: LaidOutEdge) => e.id;\n public trackByNode = (_: number, n: LaidOutNode) => n.id;\n public trackByField = (_: number, f: ERDField) => f.id || f.name;\n public trackByChip = (_: number, c: SchemaChip) => c.name;\n}\n","<!-- ── CHROME ──────────────────────────────────────────────────────────── -->\n@if (showHeader) {\n <header class=\"erd-chrome\">\n <div class=\"erd-title-group\">\n <div class=\"erd-title\">{{ headerTitle }}</div>\n <div class=\"erd-subtitle\">\n <span class=\"erd-count-pill\">{{ visibleCount }}</span>\n <span class=\"erd-count-label\">of {{ totalCount }} entities</span>\n <span class=\"erd-dot\">·</span>\n <span>{{ layout.edges.length }} relationships</span>\n </div>\n </div>\n\n <label class=\"erd-search\">\n <i class=\"fa-solid fa-magnifying-glass\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n [value]=\"searchQuery\"\n (input)=\"onSearchChange($any($event.target).value)\"\n placeholder=\"Search entities, schemas, fields…\"\n spellcheck=\"false\"\n aria-label=\"Search entities\" />\n @if (searchQuery) {\n <button type=\"button\" class=\"erd-search-clear\" (click)=\"onClearSearch()\" aria-label=\"Clear search\">×</button>\n }\n </label>\n\n <div class=\"erd-chrome-right\">\n @if (schemaChips.length > 1) {\n <div class=\"erd-schema-chips\" role=\"group\" aria-label=\"Filter by schema\">\n @for (chip of schemaChips; track trackByChip($index, chip)) {\n <button\n type=\"button\"\n class=\"erd-chip\"\n [class.active]=\"chip.active\"\n (click)=\"onSchemaChipToggle(chip.name)\"\n [attr.aria-pressed]=\"chip.active\">\n <span class=\"erd-chip-label\">{{ chip.name }}</span>\n <span class=\"erd-chip-count\">{{ chip.count }}</span>\n </button>\n }\n </div>\n }\n\n <div class=\"erd-toolbar\" role=\"group\" aria-label=\"Layout mode\">\n <button\n type=\"button\"\n [class.active]=\"activeLayout === 'schema-grid'\"\n (click)=\"setLayoutAlgorithm('schema-grid')\"\n title=\"Schema grid — grouped by schema, predictable\"\n aria-label=\"Schema-grid layout\">\n <i class=\"fa-solid fa-table-cells\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n [class.active]=\"activeLayout === 'dagre'\"\n (click)=\"setLayoutAlgorithm('dagre')\"\n title=\"Hierarchical — classic ERD, relationship-driven\"\n aria-label=\"Hierarchical layout\">\n <i class=\"fa-solid fa-sitemap\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n <div class=\"erd-toolbar\" role=\"group\" aria-label=\"Zoom controls\">\n <button type=\"button\" (click)=\"zoomBy(1.2)\" title=\"Zoom in\" aria-label=\"Zoom in\">\n <i class=\"fa-solid fa-magnifying-glass-plus\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" (click)=\"zoomBy(0.83)\" title=\"Zoom out\" aria-label=\"Zoom out\">\n <i class=\"fa-solid fa-magnifying-glass-minus\" aria-hidden=\"true\"></i>\n </button>\n <button type=\"button\" (click)=\"fitToView()\" title=\"Fit to view\" aria-label=\"Fit to view\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"erd-zoom-val\">{{ zoomPercent }}</span>\n </div>\n </div>\n </header>\n}\n\n<!-- ── CANVAS ──────────────────────────────────────────────────────────── -->\n<!-- Pan handling is window-level once mousedown fires (see component) so\n dragging continues even if the cursor leaves the canvas-wrap. -->\n<div class=\"erd-canvas-wrap\">\n\n <svg\n #canvasRef\n class=\"erd-canvas\"\n [attr.data-panning]=\"panning ? 'true' : null\"\n (mousedown)=\"onBackgroundMouseDown($event)\"\n (wheel)=\"onWheel($event)\">\n\n <defs>\n <marker id=\"erd-arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"erd-marker\" />\n </marker>\n <marker id=\"erd-arrow-active\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto\">\n <path d=\"M 0 0 L 10 5 L 0 10 z\" class=\"erd-marker erd-marker-active\" />\n </marker>\n <marker id=\"erd-many\" viewBox=\"-10 -6 14 12\" refX=\"-8\" refY=\"0\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\">\n <path d=\"M 0 -5 L -8 0 L 0 5 M -8 0 L 4 0\" class=\"erd-marker-stroke\" />\n </marker>\n <marker id=\"erd-many-active\" viewBox=\"-10 -6 14 12\" refX=\"-8\" refY=\"0\" markerWidth=\"14\" markerHeight=\"14\" orient=\"auto\">\n <path d=\"M 0 -5 L -8 0 L 0 5 M -8 0 L 4 0\" class=\"erd-marker-stroke erd-marker-active\" />\n </marker>\n </defs>\n\n <g [attr.transform]=\"'translate(' + transform.x + ' ' + transform.y + ') scale(' + transform.k + ')'\">\n\n <!-- Schema bands -->\n @if ((config.showSchemaBands ?? true)) {\n @for (band of layout.bands; track trackByBand($index, band)) {\n <g class=\"erd-band\">\n <rect\n [attr.x]=\"band.x\" [attr.y]=\"band.y\"\n [attr.width]=\"band.width\" [attr.height]=\"band.height\"\n rx=\"16\"\n class=\"erd-band-rect\" />\n <text\n [attr.x]=\"band.x + band.width / 2\"\n [attr.y]=\"band.y + 32\"\n text-anchor=\"middle\"\n class=\"erd-band-title\">\n {{ band.schemaName }}\n </text>\n </g>\n }\n }\n\n <!-- Edges -->\n <g class=\"erd-edges\">\n @for (edge of layout.edges; track trackByEdge($index, edge)) {\n <path\n [attr.d]=\"edgePath(edge)\"\n fill=\"none\"\n class=\"erd-edge\"\n [class.erd-edge-active]=\"isEdgeActive(edge)\"\n [class.erd-edge-dimmed]=\"isEdgeDimmed(edge)\"\n [attr.marker-start]=\"(config.crowsFoot ?? true) ? (isEdgeActive(edge) ? 'url(#erd-many-active)' : 'url(#erd-many)') : null\"\n [attr.marker-end]=\"isEdgeActive(edge) ? 'url(#erd-arrow-active)' : 'url(#erd-arrow)'\" />\n }\n </g>\n\n <!-- Edge labels — FK field names rendered along edges. Only shown\n when zoom is high enough for the text to be legible, and only\n when config.showRelationshipLabels resolves true. -->\n @if (showEdgeLabels) {\n <g class=\"erd-edge-labels\">\n @for (edge of layout.edges; track trackByEdge($index, edge)) {\n @let pos = edgeLabelPosition(edge);\n @if (pos) {\n <g\n class=\"erd-edge-label\"\n [class.erd-edge-label-active]=\"isEdgeActive(edge)\"\n [class.erd-edge-label-dimmed]=\"isEdgeDimmed(edge)\">\n <rect\n [attr.x]=\"pos.x - pos.w / 2 - 4\"\n [attr.y]=\"pos.y - 8\"\n [attr.width]=\"pos.w + 8\"\n height=\"16\"\n rx=\"3\"\n class=\"erd-edge-label-bg\" />\n <text\n [attr.x]=\"pos.x\"\n [attr.y]=\"pos.y + 4\"\n text-anchor=\"middle\"\n class=\"erd-edge-label-text\">{{ edge.sourceField.name }}</text>\n </g>\n }\n }\n </g>\n }\n\n <!-- Nodes -->\n <g class=\"erd-nodes\">\n @for (node of layout.nodes; track trackByNode($index, node)) {\n <g\n class=\"erd-node\"\n [attr.transform]=\"'translate(' + node.x + ' ' + node.y + ')'\"\n [class.erd-node-focus]=\"isFocus(node.id)\"\n [class.erd-node-neighbour]=\"isNeighbour(node.id)\"\n [class.erd-node-dimmed]=\"isDimmed(node.id)\"\n (click)=\"onNodeClick(node, $event)\"\n (mouseenter)=\"onNodeMouseEnter(node, $event)\"\n (mouseleave)=\"onNodeMouseLeave(node)\">\n\n <!-- Card shadow -->\n <rect class=\"erd-node-shadow\"\n [attr.width]=\"node.width\" [attr.height]=\"node.height\"\n x=\"0\" y=\"2\" rx=\"8\" />\n\n <!-- Card body -->\n <rect class=\"erd-node-body\"\n [attr.width]=\"node.width\" [attr.height]=\"node.height\"\n x=\"0\" y=\"0\" rx=\"8\" />\n\n <!-- Header -->\n <rect class=\"erd-node-header\"\n x=\"0\" y=\"0\"\n [attr.width]=\"node.width\" height=\"36\"\n rx=\"6\" />\n <foreignObject x=\"14\" y=\"8\" [attr.width]=\"node.width - 28\" height=\"22\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"erd-node-header-content\">\n <span class=\"erd-node-name\" [title]=\"node.name\">{{ node.name }}</span>\n @if (node.customData && $any(node.customData).rows != null) {\n <span class=\"erd-node-rows\">{{ formatCount($any(node.customData).rows) }}</span>\n }\n </div>\n </foreignObject>\n\n <!-- Separator -->\n <line class=\"erd-node-separator\"\n x1=\"0\" [attr.x2]=\"node.width\" y1=\"36\" y2=\"36\" />\n\n <!-- Fields -->\n @for (field of node.visibleFields; track trackByField($index, field); let i = $index) {\n <foreignObject x=\"0\" [attr.y]=\"36 + i * 22\" [attr.width]=\"node.width\" height=\"22\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\"\n class=\"erd-field-row\"\n [class.erd-field-pk]=\"field.isPrimaryKey\"\n [class.erd-field-fk]=\"!field.isPrimaryKey && field.relatedNodeId\">\n @if (field.isPrimaryKey) {\n <span class=\"erd-field-chip erd-field-chip-pk\">PK</span>\n } @else if (field.relatedNodeId) {\n <span class=\"erd-field-chip erd-field-chip-fk\">FK</span>\n }\n <span class=\"erd-field-name\" [title]=\"field.name\">{{ field.name }}</span>\n @if (field.type) {\n <span class=\"erd-field-type\" [title]=\"field.type\">{{ field.type }}</span>\n }\n </div>\n </foreignObject>\n }\n\n <!-- +N more toggle -->\n @if (node.hasMore) {\n <foreignObject\n x=\"4\"\n [attr.y]=\"36 + node.visibleFields.length * 22 + 6\"\n [attr.width]=\"node.width - 8\"\n height=\"14\"\n (click)=\"onToggleExpand(node.id, $event)\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\" class=\"erd-field-more\">\n + {{ node.fields.length - node.visibleFields.length }} more fields\n </div>\n </foreignObject>\n }\n\n <!-- Outline frame — drawn last so the focus/neighbour stroke\n sits above the header instead of being clipped by it. -->\n <rect class=\"erd-node-frame\"\n [attr.width]=\"node.width\" [attr.height]=\"node.height\"\n x=\"0\" y=\"0\" rx=\"8\" />\n </g>\n }\n </g>\n </g>\n </svg>\n\n <!-- Focus details are rendered by the consumer's side panel\n (mj-entity-details inside mj-erd-composite); the in-canvas\n floating focus card was removed as it duplicated that content. -->\n\n <!-- ── Empty state ─────────────────────────────────────────────────── -->\n @if (visibleCount === 0) {\n <div class=\"erd-empty\">\n <div class=\"erd-empty-icon\">\n <i [class]=\"config.emptyStateIcon || 'fa-solid fa-diagram-project'\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"erd-empty-title\">\n {{ totalCount === 0 ? (config.emptyStateMessage || 'No entities to display') : 'No entities match' }}\n </div>\n @if (totalCount > 0) {\n <div class=\"erd-empty-hint\">Try adjusting schema filters or clearing search</div>\n }\n </div>\n }\n\n <!-- ── Loading overlay ─────────────────────────────────────────────── -->\n @if (isRefreshing) {\n <div class=\"erd-loading-overlay\">\n <div class=\"erd-loading-content\">\n <i class=\"fa-solid fa-circle-notch fa-spin\" aria-hidden=\"true\"></i>\n <span>Loading…</span>\n </div>\n </div>\n }\n</div>\n"]}
@@ -1,5 +1,6 @@
1
1
  import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import { EntityInfo } from '@memberjunction/core';
3
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import { ERDDiagramComponent } from './erd-diagram.component';
4
5
  import { ERDNode, ERDConfig, ERDState, ERDNodeClickEvent, ERDNodeDoubleClickEvent, ERDZoomEvent } from '../interfaces/erd-types';
5
6
  import * as i0 from "@angular/core";
@@ -88,7 +89,7 @@ export interface OpenEntityRecordEvent {
88
89
  *
89
90
  * @see ERDDiagramComponent for the underlying generic component
90
91
  */
91
- export declare class MJEntityERDComponent implements OnChanges {
92
+ export declare class MJEntityERDComponent extends BaseAngularComponent implements OnChanges {
92
93
  erdDiagram: ERDDiagramComponent;
93
94
  /**
94
95
  * The entities to display in the ERD.
@@ -205,7 +206,7 @@ export declare class MJEntityERDComponent implements OnChanges {
205
206
  refreshRequested: EventEmitter<void>;
206
207
  /** Computed ERD nodes */
207
208
  erdNodes: ERDNode[];
208
- private _metadata;
209
+ private get _metadata();
209
210
  ngOnChanges(changes: SimpleChanges): void;
210
211
  private buildERDData;
211
212
  onNodeClick(_event: ERDNodeClickEvent): void;
@@ -1 +1 @@
1
- {"version":3,"file":"mj-entity-erd.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/mj-entity-erd.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mj-entity-erd.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/mj-entity-erd.component.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy } from '@angular/core';
2
- import { Metadata } from '@memberjunction/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { ERDDiagramComponent } from './erd-diagram.component';
4
4
  import { buildERDDataFromEntities, getOriginalEntityFromERDNode } from '../utils/entity-to-erd-adapter';
5
5
  import * as i0 from "@angular/core";
@@ -56,7 +56,7 @@ import * as i1 from "./erd-diagram.component";
56
56
  *
57
57
  * @see ERDDiagramComponent for the underlying generic component
58
58
  */
59
- export class MJEntityERDComponent {
59
+ export class MJEntityERDComponent extends BaseAngularComponent {
60
60
  erdDiagram;
61
61
  // ============================================================================
62
62
  // INPUTS - Data
@@ -188,7 +188,7 @@ export class MJEntityERDComponent {
188
188
  // ============================================================================
189
189
  /** Computed ERD nodes */
190
190
  erdNodes = [];
191
- _metadata = new Metadata();
191
+ get _metadata() { return this.ProviderToUse; }
192
192
  // ============================================================================
193
193
  // LIFECYCLE
194
194
  // ============================================================================
@@ -323,13 +323,13 @@ export class MJEntityERDComponent {
323
323
  triggerResize() {
324
324
  this.erdDiagram?.triggerResize();
325
325
  }
326
- static ɵfac = function MJEntityERDComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJEntityERDComponent)(); };
326
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMJEntityERDComponent_BaseFactory; return function MJEntityERDComponent_Factory(__ngFactoryType__) { return (ɵMJEntityERDComponent_BaseFactory || (ɵMJEntityERDComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MJEntityERDComponent)))(__ngFactoryType__ || MJEntityERDComponent); }; })();
327
327
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJEntityERDComponent, selectors: [["mj-entity-erd"]], viewQuery: function MJEntityERDComponent_Query(rf, ctx) { if (rf & 1) {
328
328
  i0.ɵɵviewQuery(ERDDiagramComponent, 5);
329
329
  } if (rf & 2) {
330
330
  let _t;
331
331
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.erdDiagram = _t.first);
332
- } }, inputs: { entities: "entities", allEntities: "allEntities", selectedEntityId: "selectedEntityId", highlightedEntityIds: "highlightedEntityIds", focusEntityId: "focusEntityId", focusDepth: "focusDepth", depth: "depth", includeIncoming: "includeIncoming", includeOutgoing: "includeOutgoing", config: "config", showHeader: "showHeader", headerTitle: "headerTitle", isRefreshing: "isRefreshing", readOnly: "readOnly" }, outputs: { entitySelected: "entitySelected", entityDeselected: "entityDeselected", entityDoubleClick: "entityDoubleClick", openRecord: "openRecord", zoomChange: "zoomChange", stateChange: "stateChange", refreshRequested: "refreshRequested" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 10, consts: [[3, "nodeClick", "nodeDoubleClick", "nodeSelected", "nodeDeselected", "zoomChange", "stateChange", "refreshRequested", "nodes", "selectedNodeId", "highlightedNodeIds", "focusNodeId", "focusDepth", "config", "showHeader", "headerTitle", "isRefreshing", "readOnly"]], template: function MJEntityERDComponent_Template(rf, ctx) { if (rf & 1) {
332
+ } }, inputs: { entities: "entities", allEntities: "allEntities", selectedEntityId: "selectedEntityId", highlightedEntityIds: "highlightedEntityIds", focusEntityId: "focusEntityId", focusDepth: "focusDepth", depth: "depth", includeIncoming: "includeIncoming", includeOutgoing: "includeOutgoing", config: "config", showHeader: "showHeader", headerTitle: "headerTitle", isRefreshing: "isRefreshing", readOnly: "readOnly" }, outputs: { entitySelected: "entitySelected", entityDeselected: "entityDeselected", entityDoubleClick: "entityDoubleClick", openRecord: "openRecord", zoomChange: "zoomChange", stateChange: "stateChange", refreshRequested: "refreshRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 10, consts: [[3, "nodeClick", "nodeDoubleClick", "nodeSelected", "nodeDeselected", "zoomChange", "stateChange", "refreshRequested", "nodes", "selectedNodeId", "highlightedNodeIds", "focusNodeId", "focusDepth", "config", "showHeader", "headerTitle", "isRefreshing", "readOnly"]], template: function MJEntityERDComponent_Template(rf, ctx) { if (rf & 1) {
333
333
  i0.ɵɵelementStart(0, "mj-erd-diagram", 0);
334
334
  i0.ɵɵlistener("nodeClick", function MJEntityERDComponent_Template_mj_erd_diagram_nodeClick_0_listener($event) { return ctx.onNodeClick($event); })("nodeDoubleClick", function MJEntityERDComponent_Template_mj_erd_diagram_nodeDoubleClick_0_listener($event) { return ctx.onNodeDoubleClick($event); })("nodeSelected", function MJEntityERDComponent_Template_mj_erd_diagram_nodeSelected_0_listener($event) { return ctx.onNodeSelected($event); })("nodeDeselected", function MJEntityERDComponent_Template_mj_erd_diagram_nodeDeselected_0_listener() { return ctx.onNodeDeselected(); })("zoomChange", function MJEntityERDComponent_Template_mj_erd_diagram_zoomChange_0_listener($event) { return ctx.onZoomChange($event); })("stateChange", function MJEntityERDComponent_Template_mj_erd_diagram_stateChange_0_listener($event) { return ctx.onStateChange($event); })("refreshRequested", function MJEntityERDComponent_Template_mj_erd_diagram_refreshRequested_0_listener() { return ctx.onRefreshRequested(); });
335
335
  i0.ɵɵelementEnd();
@@ -411,5 +411,5 @@ export class MJEntityERDComponent {
411
411
  }], refreshRequested: [{
412
412
  type: Output
413
413
  }] }); })();
414
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJEntityERDComponent, { className: "MJEntityERDComponent", filePath: "src/lib/components/mj-entity-erd.component.ts", lineNumber: 139 }); })();
414
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJEntityERDComponent, { className: "MJEntityERDComponent", filePath: "src/lib/components/mj-entity-erd.component.ts", lineNumber: 140 }); })();
415
415
  //# sourceMappingURL=mj-entity-erd.component.js.map