@tic-nova/ngx-interactive-org-chart 1.4.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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tic-nova-ngx-interactive-org-chart.mjs","sources":["../../../projects/ngx-interactive-org-chart/src/lib/helpers/ngx-interactive-org-chart.helper.ts","../../../projects/ngx-interactive-org-chart/src/lib/helpers/drag-ghost.helper.ts","../../../projects/ngx-interactive-org-chart/src/lib/components/mini-map/mini-map.component.ts","../../../projects/ngx-interactive-org-chart/src/lib/components/mini-map/mini-map.component.html","../../../projects/ngx-interactive-org-chart/src/lib/components/ngx-interactive-org-chart/default-theme-options.ts","../../../projects/ngx-interactive-org-chart/src/lib/components/ngx-interactive-org-chart/ngx-interactive-org-chart.component.ts","../../../projects/ngx-interactive-org-chart/src/lib/components/ngx-interactive-org-chart/ngx-interactive-org-chart.component.html","../../../projects/ngx-interactive-org-chart/src/lib/helpers/ngx-interactive-org-chart-drag-drop.helper.ts","../../../projects/ngx-interactive-org-chart/src/public-api.ts","../../../projects/ngx-interactive-org-chart/src/tic-nova-ngx-interactive-org-chart.ts"],"sourcesContent":["import { OrgChartNode, OrgChartToggleNodeArgs } from '../models';\n\nexport function toggleNodeCollapse<T>({\n node,\n targetNode,\n collapse,\n}: OrgChartToggleNodeArgs<T>): OrgChartNode<T> {\n if (node.id === targetNode) {\n const newCollapse = collapse ?? !node.collapsed;\n\n return {\n ...node,\n collapsed: newCollapse,\n children: node.children?.map(child =>\n setCollapseRecursively(child, newCollapse)\n ),\n };\n }\n\n if (node.children?.length) {\n return {\n ...node,\n children: node.children.map(child =>\n toggleNodeCollapse({ node: child, targetNode, collapse })\n ),\n };\n }\n\n return node;\n}\n\nfunction setCollapseRecursively<T>(\n node: OrgChartNode<T>,\n collapse: boolean\n): OrgChartNode<T> {\n return {\n ...node,\n collapsed: collapse,\n children: node.children?.map(child =>\n setCollapseRecursively(child, collapse)\n ),\n };\n}\n\nexport function mapNodesRecursively<T>(\n node: OrgChartNode<T>,\n collapsed?: boolean\n): OrgChartNode<T> {\n const mappedChildren =\n node.children?.map(child =>\n mapNodesRecursively(child as OrgChartNode<T>, collapsed)\n ) || [];\n\n const descendantsCount = mappedChildren.reduce(\n (acc, child) => acc + 1 + (child.descendantsCount ?? 0),\n 0\n );\n\n return {\n ...node,\n id: node.id ?? crypto.randomUUID(),\n collapsed: collapsed ?? node.collapsed ?? false,\n hidden: node.hidden ?? false,\n children: mappedChildren,\n descendantsCount,\n };\n}\n","/**\n * Essential CSS properties to copy for drag ghost elements.\n */\nconst GHOST_ELEMENT_STYLES = [\n 'background',\n 'background-color',\n 'background-image',\n 'background-size',\n 'background-position',\n 'background-repeat',\n 'color',\n 'font-family',\n 'font-size',\n 'font-weight',\n 'line-height',\n 'text-align',\n 'border',\n 'border-radius',\n 'border-color',\n 'border-width',\n 'border-style',\n 'padding',\n 'box-sizing',\n 'display',\n 'flex-direction',\n 'align-items',\n 'justify-content',\n 'gap',\n 'outline',\n 'outline-color',\n 'outline-width',\n];\n\n/**\n * Creates a cloned node element with copied styles for drag preview.\n * This removes interactive elements and copies essential visual styles.\n *\n * @param nodeElement - The original node element to clone\n * @returns A cloned element with copied styles\n */\nexport function cloneNodeWithStyles(nodeElement: HTMLElement): HTMLElement {\n // Clone the node deeply\n const clone = nodeElement.cloneNode(true) as HTMLElement;\n\n // Remove ID and draggable to avoid conflicts\n clone.removeAttribute('id');\n clone.removeAttribute('draggable');\n\n // Remove interactive elements\n const collapseBtn = clone.querySelector('.collapse-btn');\n if (collapseBtn) collapseBtn.remove();\n\n const dragHandle = clone.querySelector('.drag-handle');\n if (dragHandle) dragHandle.remove();\n\n // Get computed styles from original\n const computed = window.getComputedStyle(nodeElement);\n\n // Apply essential visual styles to clone\n GHOST_ELEMENT_STYLES.forEach(prop => {\n const value = computed.getPropertyValue(prop);\n if (value) {\n clone.style.setProperty(prop, value, 'important');\n }\n });\n\n // Apply styles to nested elements\n const sourceChildren = nodeElement.querySelectorAll('*');\n const cloneChildren = clone.querySelectorAll('*');\n\n sourceChildren.forEach((sourceChild, index) => {\n if (cloneChildren[index]) {\n const childComputed = window.getComputedStyle(sourceChild);\n const cloneChild = cloneChildren[index] as HTMLElement;\n\n GHOST_ELEMENT_STYLES.forEach(prop => {\n const value = childComputed.getPropertyValue(prop);\n if (value) {\n cloneChild.style.setProperty(prop, value, 'important');\n }\n });\n }\n });\n\n return clone;\n}\n\n/**\n * Configuration for creating a touch drag ghost element.\n */\nexport interface TouchDragGhostConfig {\n readonly nodeElement: HTMLElement;\n readonly currentScale: number;\n readonly touchX: number;\n readonly touchY: number;\n}\n\n/**\n * Result of creating a touch drag ghost element.\n */\nexport interface TouchDragGhostResult {\n readonly wrapper: HTMLElement;\n readonly scaledWidth: number;\n readonly scaledHeight: number;\n}\n\n/**\n * Creates a ghost element to follow the touch during drag.\n * The ghost element is wrapped in a positioned container and scaled to match the current zoom level.\n *\n * @param config - Configuration for creating the ghost element\n * @returns The wrapper element and scaled dimensions\n */\nexport function createTouchDragGhost(\n config: TouchDragGhostConfig\n): TouchDragGhostResult {\n const { nodeElement, currentScale, touchX, touchY } = config;\n\n // Get the unscaled dimensions\n const unscaledWidth = nodeElement.offsetWidth;\n const unscaledHeight = nodeElement.offsetHeight;\n\n // Clone the node with styles using shared helper\n const ghost = cloneNodeWithStyles(nodeElement);\n\n // Calculate the actual scaled dimensions for positioning\n const scaleFactor = currentScale * 1.05;\n const scaledWidth = unscaledWidth * scaleFactor;\n const scaledHeight = unscaledHeight * scaleFactor;\n\n // Create wrapper for positioning\n const wrapper = document.createElement('div');\n wrapper.className = 'touch-drag-ghost-wrapper';\n wrapper.style.position = 'fixed';\n wrapper.style.pointerEvents = 'none';\n wrapper.style.zIndex = '10000';\n // Position wrapper so the scaled ghost is centered on the touch point\n wrapper.style.left = touchX - scaledWidth / 2 + 'px';\n wrapper.style.top = touchY - scaledHeight / 2 + 'px';\n\n // Set ghost to unscaled dimensions, then apply the zoom scale via transform\n ghost.style.setProperty('position', 'relative', 'important');\n ghost.style.setProperty('width', unscaledWidth + 'px', 'important');\n ghost.style.setProperty('height', unscaledHeight + 'px', 'important');\n ghost.style.setProperty('margin', '0', 'important');\n ghost.style.setProperty('opacity', '0.9', 'important');\n ghost.style.setProperty('transform-origin', 'top left', 'important');\n // Apply the current zoom scale to match the visible node, then apply slight scale-up for drag effect\n ghost.style.setProperty('transform', `scale(${scaleFactor})`, 'important');\n ghost.style.setProperty(\n 'box-shadow',\n '0 15px 40px rgba(0, 0, 0, 0.4)',\n 'important'\n );\n ghost.style.setProperty('cursor', 'grabbing', 'important');\n\n wrapper.appendChild(ghost);\n document.body.appendChild(wrapper);\n\n return {\n wrapper,\n scaledWidth,\n scaledHeight,\n };\n}\n\n/**\n * Updates the position of a touch drag ghost element wrapper.\n *\n * @param wrapper - The ghost wrapper element to reposition\n * @param x - The new x coordinate\n * @param y - The new y coordinate\n * @param scaledWidth - The scaled width of the ghost element\n * @param scaledHeight - The scaled height of the ghost element\n */\nexport function updateTouchGhostPosition(\n wrapper: HTMLElement,\n x: number,\n y: number,\n scaledWidth: number,\n scaledHeight: number\n): void {\n wrapper.style.left = x - scaledWidth / 2 + 'px';\n wrapper.style.top = y - scaledHeight / 2 + 'px';\n}\n\n/**\n * Creates and sets a custom drag image for desktop drag and drop.\n * This is required for Safari to show a drag preview properly.\n *\n * @param event - The drag event\n * @param nodeElement - The node element being dragged\n * @returns Cleanup function to remove the temporary drag image\n */\nexport function setDesktopDragImage(\n event: DragEvent,\n nodeElement: HTMLElement\n): void {\n if (!event.dataTransfer) return;\n\n // Create a styled clone for the drag image\n const dragImage = cloneNodeWithStyles(nodeElement);\n dragImage.style.position = 'absolute';\n dragImage.style.top = '-9999px';\n dragImage.style.left = '-9999px';\n dragImage.style.opacity = '0.8';\n document.body.appendChild(dragImage);\n\n const rect = nodeElement.getBoundingClientRect();\n const offsetX = event.clientX - rect.left;\n const offsetY = event.clientY - rect.top;\n event.dataTransfer.setDragImage(dragImage, offsetX, offsetY);\n\n setTimeout(() => {\n if (document.body.contains(dragImage)) {\n document.body.removeChild(dragImage);\n }\n }, 0);\n}\n","import { NgStyle } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n output,\n signal,\n viewChild,\n OnDestroy,\n} from '@angular/core';\nimport { PanZoom } from 'panzoom';\n\nexport type MiniMapPosition =\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right';\n\nexport interface MiniMapTheme {\n readonly background?: string;\n readonly borderColor?: string;\n readonly borderRadius?: string;\n readonly shadow?: string;\n readonly nodeColor?: string;\n readonly viewportBackground?: string;\n readonly viewportBorderColor?: string;\n readonly viewportBorderWidth?: string;\n}\n\ninterface ContentBounds {\n readonly left: number;\n readonly top: number;\n readonly width: number;\n readonly height: number;\n}\n\ninterface Transform {\n readonly scale: number;\n readonly x: number;\n readonly y: number;\n}\n\nconst DEFAULT_THEME: Required<MiniMapTheme> = {\n background: 'rgba(255, 255, 255, 0.95)',\n borderColor: 'rgba(0, 0, 0, 0.15)',\n borderRadius: '8px',\n shadow:\n '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n nodeColor: 'rgba(0, 0, 0, 0.6)',\n viewportBackground: 'rgba(59, 130, 246, 0.2)',\n viewportBorderColor: 'rgb(59, 130, 246)',\n viewportBorderWidth: '2px',\n};\n\nconst REDRAW_DEBOUNCE_MS = 100;\nconst CONTENT_PADDING_RATIO = 0.9;\nconst CSS_VAR_REGEX = /var\\((--[^)]+)\\)/;\n\n@Component({\n selector: 'ngx-org-chart-mini-map',\n standalone: true,\n imports: [NgStyle],\n templateUrl: './mini-map.component.html',\n styleUrls: ['./mini-map.component.scss'],\n})\nexport class MiniMapComponent implements OnDestroy {\n readonly #injector = inject(Injector);\n readonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n readonly panZoomInstance = input.required<PanZoom | null>();\n readonly chartContainer = input.required<HTMLElement | null>();\n readonly position = input<MiniMapPosition>('bottom-right');\n readonly width = input<number>(200);\n readonly height = input<number>(150);\n readonly visible = input<boolean>(true);\n readonly themeOptions = input<MiniMapTheme | undefined>();\n\n readonly navigate = output<{ x: number; y: number }>();\n\n protected readonly canvasRef =\n viewChild<ElementRef<HTMLCanvasElement>>('miniMapCanvas');\n protected readonly viewportRef =\n viewChild<ElementRef<HTMLDivElement>>('viewport');\n\n protected readonly viewportStyle = signal<Record<string, string>>({});\n\n protected readonly miniMapStyle = computed(() => {\n const theme = this.themeOptions();\n return {\n width: `${this.width()}px`,\n height: `${this.height()}px`,\n backgroundColor: theme?.background ?? DEFAULT_THEME.background,\n borderColor: theme?.borderColor ?? DEFAULT_THEME.borderColor,\n borderRadius: theme?.borderRadius ?? DEFAULT_THEME.borderRadius,\n boxShadow: theme?.shadow ?? DEFAULT_THEME.shadow,\n };\n });\n\n protected readonly viewportIndicatorStyle = computed(() => {\n const theme = this.themeOptions();\n return {\n ...this.viewportStyle(),\n backgroundColor:\n theme?.viewportBackground ?? DEFAULT_THEME.viewportBackground,\n borderColor:\n theme?.viewportBorderColor ?? DEFAULT_THEME.viewportBorderColor,\n borderWidth:\n theme?.viewportBorderWidth ?? DEFAULT_THEME.viewportBorderWidth,\n };\n });\n\n protected readonly nodeColor = computed(\n () => this.themeOptions()?.nodeColor ?? DEFAULT_THEME.nodeColor\n );\n\n #animationFrameId: number | null = null;\n #isDragging = false;\n #mutationObserver: MutationObserver | null = null;\n #themeObserver: MutationObserver | null = null;\n #redrawTimeout: number | null = null;\n\n constructor() {\n this.#initializeEffects();\n this.#setupThemeObserver();\n }\n\n ngOnDestroy(): void {\n this.#cleanup();\n }\n\n protected onMouseDown(event: MouseEvent): void {\n event.preventDefault();\n this.#isDragging = true;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (this.#isDragging) {\n this.#navigateToPoint(e);\n }\n };\n\n const handleMouseUp = () => {\n this.#isDragging = false;\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n #initializeEffects(): void {\n effect(\n () => {\n const panZoom = this.panZoomInstance();\n panZoom ? this.#startTracking() : this.#stopTracking();\n },\n { injector: this.#injector }\n );\n\n effect(\n () => {\n const container = this.chartContainer();\n\n if (container) {\n this.#setupMutationObserver(container);\n this.#drawMiniMap();\n } else {\n this.#disconnectMutationObserver();\n }\n },\n { injector: this.#injector }\n );\n\n effect(\n () => {\n this.themeOptions();\n this.#scheduleRedraw();\n },\n { injector: this.#injector }\n );\n }\n\n #setupThemeObserver(): void {\n this.#themeObserver = new MutationObserver(() => this.#scheduleRedraw());\n\n [document.documentElement, document.body].forEach(target => {\n this.#themeObserver!.observe(target, {\n attributes: true,\n attributeFilter: ['class', 'data-theme', 'data-mode'],\n });\n });\n }\n\n #disconnectThemeObserver(): void {\n this.#themeObserver?.disconnect();\n this.#themeObserver = null;\n }\n\n #setupMutationObserver(container: HTMLElement): void {\n this.#disconnectMutationObserver();\n\n this.#mutationObserver = new MutationObserver(() => this.#scheduleRedraw());\n this.#mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['class', 'style'],\n });\n }\n\n #disconnectMutationObserver(): void {\n this.#mutationObserver?.disconnect();\n this.#mutationObserver = null;\n }\n\n #scheduleRedraw(): void {\n if (this.#redrawTimeout !== null) {\n clearTimeout(this.#redrawTimeout);\n }\n\n this.#redrawTimeout = setTimeout(() => {\n this.#drawMiniMap();\n this.#redrawTimeout = null;\n }, REDRAW_DEBOUNCE_MS) as unknown as number;\n }\n\n #startTracking(): void {\n if (this.#animationFrameId !== null) return;\n\n const update = () => {\n this.#updateViewport();\n this.#animationFrameId = requestAnimationFrame(update);\n };\n\n this.#animationFrameId = requestAnimationFrame(update);\n }\n\n #stopTracking(): void {\n if (this.#animationFrameId !== null) {\n cancelAnimationFrame(this.#animationFrameId);\n this.#animationFrameId = null;\n }\n }\n\n #drawMiniMap(): void {\n const canvas = this.canvasRef()?.nativeElement;\n const container = this.chartContainer();\n\n if (!canvas || !container) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n canvas.width = this.width();\n canvas.height = this.height();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n const contentBounds = this.#getContentBounds(container);\n if (!contentBounds) return;\n\n const { scale, offsetX, offsetY } = this.#calculateMiniMapTransform(\n canvas,\n contentBounds\n );\n const transform = this.#getCurrentTransform();\n\n this.#drawNodes(\n ctx,\n container,\n contentBounds,\n scale,\n offsetX,\n offsetY,\n transform\n );\n }\n\n #getContentBounds(container: HTMLElement): ContentBounds | null {\n const nodes = container.querySelectorAll('.node-content');\n if (nodes.length === 0) return null;\n\n const transform = this.#getCurrentTransform();\n const containerRect = container.getBoundingClientRect();\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n nodes.forEach(node => {\n const rect = node.getBoundingClientRect();\n const relX =\n (rect.left - containerRect.left - transform.x) / transform.scale;\n const relY =\n (rect.top - containerRect.top - transform.y) / transform.scale;\n const width = rect.width / transform.scale;\n const height = rect.height / transform.scale;\n\n minX = Math.min(minX, relX);\n minY = Math.min(minY, relY);\n maxX = Math.max(maxX, relX + width);\n maxY = Math.max(maxY, relY + height);\n });\n\n return {\n left: minX,\n top: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n\n #calculateMiniMapTransform(\n canvas: HTMLCanvasElement,\n contentBounds: ContentBounds\n ): { scale: number; offsetX: number; offsetY: number } {\n const scaleX = canvas.width / contentBounds.width;\n const scaleY = canvas.height / contentBounds.height;\n const scale = Math.min(scaleX, scaleY) * CONTENT_PADDING_RATIO;\n\n const offsetX = (canvas.width - contentBounds.width * scale) / 2;\n const offsetY = (canvas.height - contentBounds.height * scale) / 2;\n\n return { scale, offsetX, offsetY };\n }\n\n #drawNodes(\n ctx: CanvasRenderingContext2D,\n container: HTMLElement,\n contentBounds: ContentBounds,\n scale: number,\n offsetX: number,\n offsetY: number,\n transform: Transform\n ): void {\n const resolvedNodeColor = this.#resolveColor(this.nodeColor());\n ctx.fillStyle = resolvedNodeColor;\n ctx.strokeStyle = resolvedNodeColor;\n ctx.lineWidth = 1;\n\n const nodes = container.querySelectorAll('.node-content');\n const containerRect = container.getBoundingClientRect();\n\n nodes.forEach(node => {\n const rect = node.getBoundingClientRect();\n\n const relX =\n (rect.left - containerRect.left - transform.x) / transform.scale;\n const relY =\n (rect.top - containerRect.top - transform.y) / transform.scale;\n const w = rect.width / transform.scale;\n const h = rect.height / transform.scale;\n\n const x = (relX - contentBounds.left) * scale + offsetX;\n const y = (relY - contentBounds.top) * scale + offsetY;\n const scaledW = w * scale;\n const scaledH = h * scale;\n\n ctx.fillRect(x, y, scaledW, scaledH);\n });\n }\n\n #updateViewport(): void {\n const panZoom = this.panZoomInstance();\n const container = this.chartContainer();\n const canvas = this.canvasRef()?.nativeElement;\n\n if (!panZoom || !container || !canvas) return;\n\n const transform = panZoom.getTransform();\n const contentBounds = this.#getContentBounds(container);\n\n if (!contentBounds) return;\n\n const { scale, offsetX, offsetY } = this.#calculateMiniMapTransform(\n canvas,\n contentBounds\n );\n\n const containerRect = container.getBoundingClientRect();\n const viewportWidth = containerRect.width / transform.scale;\n const viewportHeight = containerRect.height / transform.scale;\n\n const viewportX = -transform.x / transform.scale - contentBounds.left;\n const viewportY = -transform.y / transform.scale - contentBounds.top;\n\n const miniViewportX = viewportX * scale + offsetX;\n const miniViewportY = viewportY * scale + offsetY;\n const miniViewportWidth = viewportWidth * scale;\n const miniViewportHeight = viewportHeight * scale;\n\n this.viewportStyle.set({\n left: `${miniViewportX}px`,\n top: `${miniViewportY}px`,\n width: `${miniViewportWidth}px`,\n height: `${miniViewportHeight}px`,\n });\n }\n\n #navigateToPoint(event: MouseEvent): void {\n const canvas = this.canvasRef()?.nativeElement;\n const container = this.chartContainer();\n const panZoom = this.panZoomInstance();\n\n if (!canvas || !container || !panZoom) return;\n\n const rect = canvas.getBoundingClientRect();\n const clickX = event.clientX - rect.left;\n const clickY = event.clientY - rect.top;\n\n const contentBounds = this.#getContentBounds(container);\n if (!contentBounds) return;\n\n const { scale, offsetX, offsetY } = this.#calculateMiniMapTransform(\n canvas,\n contentBounds\n );\n\n const contentX = (clickX - offsetX) / scale + contentBounds.left;\n const contentY = (clickY - offsetY) / scale + contentBounds.top;\n\n const transform = panZoom.getTransform();\n const containerRect = container.getBoundingClientRect();\n\n const newX = -(contentX * transform.scale - containerRect.width / 2);\n const newY = -(contentY * transform.scale - containerRect.height / 2);\n\n panZoom.moveTo(newX, newY);\n this.navigate.emit({ x: newX, y: newY });\n }\n\n #resolveColor(color: string): string {\n if (!color.includes('var(')) return color;\n\n const computedStyle = getComputedStyle(this.#elementRef.nativeElement);\n const match = color.match(CSS_VAR_REGEX);\n\n if (match) {\n const propertyName = match[1];\n const resolvedColor = computedStyle.getPropertyValue(propertyName).trim();\n return resolvedColor || color;\n }\n\n return color;\n }\n\n #getCurrentTransform(): Transform {\n const panZoom = this.panZoomInstance();\n return panZoom?.getTransform() ?? { scale: 1, x: 0, y: 0 };\n }\n\n #cleanup(): void {\n this.#stopTracking();\n this.#disconnectMutationObserver();\n this.#disconnectThemeObserver();\n\n if (this.#redrawTimeout !== null) {\n clearTimeout(this.#redrawTimeout);\n this.#redrawTimeout = null;\n }\n }\n}\n","@if (visible()) {\n <div\n class=\"mini-map-container\"\n [class]=\"'position-' + position()\"\n [ngStyle]=\"miniMapStyle()\"\n (mousedown)=\"onMouseDown($event)\"\n >\n <canvas #miniMapCanvas class=\"mini-map-canvas\"></canvas>\n <div #viewport class=\"viewport-indicator\" [ngStyle]=\"viewportIndicatorStyle()\"></div>\n </div>\n}\n","import { NgxInteractiveOrgChartTheme } from '../../models';\n\nexport const DEFAULT_THEME_OPTIONS: NgxInteractiveOrgChartTheme = {\n node: {\n background: '#ffffff',\n color: '#4a4a4a',\n activeOutlineColor: '#3b82f6',\n outlineWidth: '2px',\n shadow: '0 2px 10px rgba(0, 0, 0, 0.1)',\n outlineColor: '#d1d5db',\n highlightShadowColor: 'rgba(121, 59, 246, 0)',\n padding: '12px 16px',\n borderRadius: '8px',\n containerSpacing: '20px',\n activeColor: '#3b82f6',\n maxWidth: 'auto',\n minWidth: 'auto',\n maxHeight: 'auto',\n minHeight: 'auto',\n dragOverOutlineColor: '#3b82f6',\n },\n connector: {\n color: '#d1d5db',\n activeColor: '#3b82f6',\n borderRadius: '10px',\n width: '1.5px',\n },\n collapseButton: {\n size: '20px',\n borderColor: '#d1d5db',\n borderRadius: '0.25rem',\n color: '#4a4a4a',\n background: '#ffffff',\n hoverColor: '#3b82f6',\n hoverBackground: '#f3f4f6',\n hoverShadow: '0 2px 4px rgba(0, 0, 0, 0.1)',\n hoverTransformScale: '1.05',\n focusOutline: '2px solid #3b82f6',\n countFontSize: '0.75rem',\n },\n container: {\n background: 'transparent',\n border: 'none',\n },\n miniMap: {\n background: 'rgba(255, 255, 255, 0.95)',\n borderColor: 'rgba(0, 0, 0, 0.15)',\n borderRadius: '8px',\n shadow:\n '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n nodeColor: 'rgba(0, 0, 0, 0.6)',\n viewportBackground: 'rgba(59, 130, 246, 0.2)',\n viewportBorderColor: 'rgb(59, 130, 246)',\n viewportBorderWidth: '2px',\n },\n};\n","import { NgClass, NgStyle, NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n AfterViewInit,\n Component,\n computed,\n ContentChild,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n OnDestroy,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport {\n NgxInteractiveOrgChartLayout,\n NgxInteractiveOrgChartTheme,\n OrgChartDropNodeEventArgs,\n OrgChartNode,\n} from '../../models';\nimport {\n mapNodesRecursively,\n toggleNodeCollapse,\n createTouchDragGhost,\n updateTouchGhostPosition,\n setDesktopDragImage,\n} from '../../helpers';\nimport { MiniMapComponent } from '../mini-map/mini-map.component';\n\nimport createPanZoom, { PanZoom } from 'panzoom';\nimport { animate, style, transition, trigger } from '@angular/animations';\nimport { DEFAULT_THEME_OPTIONS } from './default-theme-options';\n\n// Constants\nconst RESET_DELAY = 300; // ms\nconst TOUCH_DRAG_THRESHOLD = 10; // pixels\nconst AUTO_PAN_EDGE_THRESHOLD = 0.1; // 10% of container dimensions\nconst AUTO_PAN_SPEED = 15; // pixels per frame\n\n/**\n * State for tracking touch drag operations.\n */\ninterface TouchDragState<T> {\n active: boolean;\n node: OrgChartNode<T> | null;\n startX: number;\n startY: number;\n currentX: number;\n currentY: number;\n dragThreshold: number;\n ghostElement: HTMLElement | null;\n ghostScaledWidth: number;\n ghostScaledHeight: number;\n}\n\n@Component({\n standalone: true,\n selector: 'ngx-interactive-org-chart',\n imports: [NgTemplateOutlet, NgClass, NgStyle, MiniMapComponent],\n templateUrl: './ngx-interactive-org-chart.component.html',\n styleUrls: ['./ngx-interactive-org-chart.component.scss'],\n animations: [\n trigger('toggleNode', [\n transition(':enter', [\n style({ width: '0', height: '0', opacity: 0, transform: 'scale(0.8)' }),\n animate(\n '300ms ease-out',\n style({ width: '*', height: '*', opacity: 1, transform: 'scale(1)' })\n ),\n ]),\n transition(':leave', [\n style({ width: '*', height: '*' }),\n animate(\n '300ms ease-out',\n style({\n width: '0',\n height: '0',\n opacity: 0,\n transform: 'scale(0.8)',\n })\n ),\n ]),\n ]),\n ],\n host: {\n '[style.--node-background]': 'finalThemeOptions().node!.background',\n '[style.--node-color]': 'finalThemeOptions().node!.color',\n '[style.--node-shadow]': 'finalThemeOptions().node!.shadow',\n '[style.--node-outline-color]': 'finalThemeOptions().node!.outlineColor',\n '[style.--node-outline-width]': 'finalThemeOptions().node!.outlineWidth',\n '[style.--node-active-outline-color]':\n 'finalThemeOptions().node!.activeOutlineColor',\n '[style.--node-highlight-shadow-color]':\n 'finalThemeOptions().node!.highlightShadowColor',\n '[style.--node-padding]': 'finalThemeOptions().node!.padding',\n '[style.--node-border-radius]': 'finalThemeOptions().node!.borderRadius',\n '[style.--node-active-color]': 'finalThemeOptions().node!.activeColor',\n '[style.--node-max-width]': 'finalThemeOptions().node!.maxWidth',\n '[style.--node-min-width]': 'finalThemeOptions().node!.minWidth',\n '[style.--node-max-height]': 'finalThemeOptions().node!.maxHeight',\n '[style.--node-min-height]': 'finalThemeOptions().node!.minHeight',\n '[style.--node-drag-over-outline-color]':\n 'finalThemeOptions().node!.dragOverOutlineColor',\n '[style.--connector-color]': 'finalThemeOptions().connector!.color',\n '[style.--connector-active-color]':\n 'finalThemeOptions().connector!.activeColor',\n '[style.--connector-border-radius]':\n 'finalThemeOptions().connector!.borderRadius',\n '[style.--node-container-spacing]':\n 'finalThemeOptions().node!.containerSpacing',\n '[style.--connector-width]': 'finalThemeOptions().connector!.width',\n '[style.--collapse-button-size]':\n 'finalThemeOptions().collapseButton!.size',\n '[style.--collapse-button-border-color]':\n 'finalThemeOptions().collapseButton!.borderColor',\n '[style.--collapse-button-border-radius]':\n 'finalThemeOptions().collapseButton!.borderRadius',\n '[style.--collapse-button-color]':\n 'finalThemeOptions().collapseButton!.color',\n '[style.--collapse-button-background]':\n 'finalThemeOptions().collapseButton!.background',\n '[style.--collapse-button-hover-color]':\n 'finalThemeOptions().collapseButton!.hoverColor',\n '[style.--collapse-button-hover-background]':\n 'finalThemeOptions().collapseButton!.hoverBackground',\n '[style.--collapse-button-hover-shadow]':\n 'finalThemeOptions().collapseButton!.hoverShadow',\n '[style.--collapse-button-hover-transform-scale]':\n 'finalThemeOptions().collapseButton!.hoverTransformScale',\n '[style.--collapse-button-focus-outline]':\n 'finalThemeOptions().collapseButton!.focusOutline',\n '[style.--collapse-button-count-font-size]':\n 'finalThemeOptions().collapseButton!.countFontSize',\n '[style.--container-background]':\n 'finalThemeOptions().container!.background',\n '[style.--container-border]': 'finalThemeOptions().container!.border',\n '[attr.data-layout]': 'layout()',\n },\n})\nexport class NgxInteractiveOrgChart<T> implements AfterViewInit, OnDestroy {\n readonly #elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly #injector = inject(Injector);\n\n /**\n * Optional template for a custom node.\n * When provided, this template will be used to render each node in the org chart.\n *\n * @remarks\n * The template context includes:\n * - `$implicit`: The node data\n * - `node`: The node data (alternative accessor)\n *\n * @example\n * ```html\n * <ngx-interactive-org-chart>\n * <ng-template #nodeTemplate let-node=\"node\">\n * <div class=\"custom-node\">\n * <h3>{{ node.data?.name }}</h3>\n * <p>{{ node.data?.age }}</p>\n * </div>\n * </ng-template>\n * </ngx-interactive-org-chart>\n * ```\n */\n @ContentChild('nodeTemplate', { static: false })\n protected readonly customNodeTemplate?: TemplateRef<unknown>;\n\n /**\n * Optional template for a custom drag handle.\n * When provided, only this element will be draggable instead of the entire node.\n *\n * @remarks\n * The template context includes:\n * - `$implicit`: The node data\n * - `node`: The node data (alternative accessor)\n *\n * @example\n * ```html\n * <ngx-interactive-org-chart [draggable]=\"true\">\n * <ng-template #dragHandleTemplate let-node=\"node\">\n * <button class=\"drag-handle\" title=\"Drag to move\">\n * <svg><!-- Drag icon --></svg>\n * </button>\n * </ng-template>\n * </ngx-interactive-org-chart>\n * ```\n */\n @ContentChild('dragHandleTemplate', { static: false })\n protected readonly customDragHandleTemplate?: TemplateRef<unknown>;\n\n protected readonly panZoomContainer =\n viewChild.required<ElementRef<HTMLElement>>('panZoomContainer');\n\n private readonly orgChartContainer =\n viewChild.required<ElementRef<HTMLElement>>('orgChartContainer');\n\n private readonly container =\n viewChild.required<ElementRef<HTMLElement>>('container');\n\n /**\n * The data for the org chart.\n */\n readonly data = input.required<OrgChartNode<T>>();\n /**\n * The initial zoom level for the chart.\n */\n readonly initialZoom = input<number>();\n /**\n * The minimum zoom level for the chart\n */\n readonly minZoom = input<number>(0.1);\n /**\n * The maximum zoom level for the chart.\n */\n readonly maxZoom = input<number>(5);\n /**\n * The speed at which the chart zooms in/out on wheel or pinch.\n */\n readonly zoomSpeed = input<number>(1);\n /**\n * The speed at which the chart zooms in/out on double-click.\n */\n readonly zoomDoubleClickSpeed = input<number>(2);\n /**\n * Whether the nodes can be collapsed/expanded.\n */\n readonly collapsible = input<boolean>(true);\n /**\n * The CSS class to apply to each node element.\n */\n readonly nodeClass = input<string>();\n /**\n * If set to `true`, all the nodes will be initially collapsed.\n */\n readonly initialCollapsed = input<boolean>();\n /**\n * Whether to enable RTL (right-to-left) layout.\n */\n readonly isRtl = input<boolean>();\n /**\n * The layout direction of the org chart tree.\n * - 'vertical': Traditional top-to-bottom tree layout\n * - 'horizontal': Left-to-right tree layout\n */\n readonly layout = input<NgxInteractiveOrgChartLayout>('vertical');\n /**\n * Whether to focus on the node when it is collapsed and focus on its children when it is expanded.\n */\n readonly focusOnCollapseOrExpand = input<boolean>(false);\n /**\n * Whether to display the count of children for each node on expand/collapse button.\n */\n readonly displayChildrenCount = input<boolean>(true);\n /**\n * The ratio of the node's width to the viewport's width when highlighting.\n */\n readonly highlightZoomNodeWidthRatio = input<number>(0.3);\n\n /**\n * The ratio of the node's height to the viewport's height when highlighting.\n */\n readonly highlightZoomNodeHeightRatio = input<number>(0.4);\n /**\n * Whether to enable drag and drop functionality for nodes.\n * When enabled, nodes can be dragged and dropped onto other nodes.\n *\n * @remarks\n * By default, the entire node is draggable. To use a custom drag handle instead,\n * provide a `dragHandleTemplate` template with the selector `#dragHandleTemplate`.\n *\n * @example\n * ```html\n * <ngx-interactive-org-chart [draggable]=\"true\">\n * <!-- Custom drag handle template -->\n * <ng-template #dragHandleTemplate let-node=\"node\">\n * <span class=\"drag-handle\">⋮⋮</span>\n * </ng-template>\n * </ngx-interactive-org-chart>\n * ```\n */\n readonly draggable = input<boolean>(false);\n\n /**\n * Predicate function to determine if a specific node can be dragged.\n *\n * @param node - The node to check\n * @returns true if the node can be dragged, false otherwise\n *\n * @example\n * ```typescript\n * // Prevent CEO node from being dragged\n * canDragNode = (node: OrgChartNode) => node.data?.role !== 'CEO';\n * ```\n */\n readonly canDragNode = input<(node: OrgChartNode<T>) => boolean>();\n\n /**\n * Predicate function to determine if a node can accept drops.\n *\n * @param draggedNode - The node being dragged\n * @param targetNode - The potential drop target\n * @returns true if the drop is allowed, false otherwise\n *\n * @example\n * ```typescript\n * // Don't allow employees to have subordinates\n * canDropNode = (dragged: OrgChartNode, target: OrgChartNode) => {\n * return target.data?.type !== 'Employee';\n * };\n * ```\n */\n readonly canDropNode =\n input<\n (draggedNode: OrgChartNode<T>, targetNode: OrgChartNode<T>) => boolean\n >();\n\n /**\n * The distance in pixels from the viewport edge to trigger auto-panning during drag.\n * The threshold is calculated automatically as 10% of the container dimensions for better responsiveness across different screen sizes.\n * @default 0.1\n */\n readonly dragEdgeThreshold = input<number>(AUTO_PAN_EDGE_THRESHOLD);\n\n /**\n * The speed of auto-panning in pixels per frame during drag.\n * @default 15\n */\n readonly dragAutoPanSpeed = input<number>(AUTO_PAN_SPEED);\n\n /**\n * The minimum zoom level for the chart when highlighting a node.\n */\n readonly highlightZoomMinimum = input<number>(0.8);\n\n /**\n * The theme options for the org chart.\n * This allows customization of the chart's appearance, including node styles, connector styles, and\n * other visual elements.\n */\n readonly themeOptions = input<NgxInteractiveOrgChartTheme>();\n\n /**\n * Whether to show the mini map navigation tool.\n * @default false\n */\n readonly showMiniMap = input<boolean>(false);\n\n /**\n * Position of the mini map on the screen.\n * @default 'bottom-right'\n */\n readonly miniMapPosition = input<\n 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n >('bottom-right');\n\n /**\n * Width of the mini map in pixels.\n * @default 200\n */\n readonly miniMapWidth = input<number>(200);\n\n /**\n * Height of the mini map in pixels.\n * @default 150\n */\n readonly miniMapHeight = input<number>(150);\n\n /**\n * Event emitted when a node is dropped onto another node.\n * Provides the dragged node and the target node.\n */\n readonly nodeDrop = output<OrgChartDropNodeEventArgs<T>>();\n\n /**\n * Event emitted when a node drag operation starts.\n */\n readonly nodeDragStart = output<OrgChartNode<T>>();\n\n /**\n * Event emitted when a node drag operation ends.\n */\n readonly nodeDragEnd = output<OrgChartNode<T>>();\n\n private readonly defaultThemeOptions: NgxInteractiveOrgChartTheme =\n DEFAULT_THEME_OPTIONS;\n\n protected readonly finalThemeOptions = computed<NgxInteractiveOrgChartTheme>(\n () => {\n const themeOptions = this.themeOptions();\n\n return {\n node: {\n ...this.defaultThemeOptions.node,\n ...themeOptions?.node,\n },\n connector: {\n ...this.defaultThemeOptions.connector,\n ...themeOptions?.connector,\n },\n collapseButton: {\n ...this.defaultThemeOptions.collapseButton,\n ...themeOptions?.collapseButton,\n },\n container: {\n ...this.defaultThemeOptions.container,\n ...themeOptions?.container,\n },\n miniMap: {\n ...this.defaultThemeOptions.miniMap,\n ...themeOptions?.miniMap,\n },\n };\n }\n );\n\n protected readonly nodes = signal<OrgChartNode<T> | null>(null);\n\n protected readonly scale = signal<number>(0);\n\n protected readonly draggedNode = signal<OrgChartNode<T> | null>(null);\n\n protected readonly dragOverNode = signal<OrgChartNode<T> | null>(null);\n\n private readonly currentDragOverElement = signal<HTMLElement | null>(null);\n\n private autoPanInterval: number | null = null;\n private keyboardListener: ((event: KeyboardEvent) => void) | null = null;\n\n private touchDragState: TouchDragState<T> = {\n active: false,\n node: null,\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n dragThreshold: TOUCH_DRAG_THRESHOLD,\n ghostElement: null,\n ghostScaledWidth: 0,\n ghostScaledHeight: 0,\n };\n\n protected panZoomInstance: PanZoom | null = null;\n\n protected readonly containerElement = computed<HTMLElement | null>(() => {\n return this.container()?.nativeElement || null;\n });\n\n /**\n * A computed property that returns the current scale of the org chart.\n * @returns {number} The current scale of the org chart.\n */\n readonly getScale = computed(() => this.scale());\n\n /**\n * A computed property that flattens the org chart nodes into a single array.\n * It recursively traverses the nodes and their children, returning a flat array of OrgChartNode<T>.\n * This is useful for operations that require a single list of all nodes, such as searching or displaying all nodes in a list.\n * @returns {OrgChartNode<T>[]} An array of all nodes in the org chart, flattened from the hierarchical structure.\n */\n readonly flattenedNodes = computed(() => {\n const nodes = this.nodes();\n\n if (!nodes) return [];\n\n const flatten = (node: OrgChartNode<T>): OrgChartNode<T>[] => {\n const children: OrgChartNode<T>[] =\n (node.children as OrgChartNode<T>[] | undefined)?.flatMap(flatten) ||\n [];\n return [node, ...children];\n };\n\n return nodes ? flatten(nodes) : [];\n });\n\n private readonly setNodes = effect(() => {\n const data = this.data();\n const initialCollapsed = this.initialCollapsed();\n\n if (data) {\n this.nodes.set(mapNodesRecursively(data, initialCollapsed));\n }\n });\n\n ngAfterViewInit(): void {\n this.initiatePanZoom();\n this.disableChildDragging();\n }\n\n /**\n * Initializes the pan-zoom functionality for the org chart.\n * This method creates a new panZoom instance and sets it up with the container element.\n * It also ensures that any existing panZoom instance is disposed of before creating a new one.\n */\n initiatePanZoom(): void {\n if (this.panZoomInstance) {\n this.panZoomInstance.dispose();\n }\n\n const container = this.panZoomContainer()?.nativeElement;\n\n this.panZoomInstance = createPanZoom(container, {\n initialZoom: this.getFitScale(),\n initialX: container.offsetWidth / 2,\n initialY: container.offsetHeight / 2,\n enableTextSelection: false,\n minZoom: this.minZoom(),\n maxZoom: this.maxZoom(),\n zoomSpeed: this.zoomSpeed(),\n smoothScroll: true,\n zoomDoubleClickSpeed: this.zoomDoubleClickSpeed(),\n });\n\n this.calculateScale();\n\n this.panZoomInstance?.on('zoom', e => {\n this.calculateScale();\n });\n }\n\n /**\n * Zooms in of the org chart.\n * @param {Object} options - Options for zooming.\n * @param {number} [options.by=10] - The percentage to zoom in or out by.\n * @param {boolean} [options.relative=true] - Whether to zoom relative to the current zoom level.\n * If true, zooms in by a percentage of the current zoom level.\n * If false, zooms to an absolute scale.\n */\n zoomIn(\n { by, relative }: { by?: number; relative?: boolean } = { relative: true }\n ): void {\n this.zoom({ type: 'in', by, relative });\n }\n\n /**\n * Zooms out of the org chart.\n * @param {Object} options - Options for zooming.\n * @param {number} [options.by=10] - The percentage to zoom in or out by.\n * @param {boolean} [options.relative=true] - Whether to zoom relative to the current zoom level.\n * If true, zooms out by a percentage of the current zoom level.\n * If false, zooms to an absolute scale.\n */\n zoomOut(\n { by, relative }: { by?: number; relative?: boolean } = { relative: true }\n ): void {\n this.zoom({ type: 'out', by, relative });\n }\n\n /**\n * Highlights a specific node in the org chart and pans to it.\n * @param {string} nodeId - The ID of the node to highlight.\n */\n highlightNode(nodeId: string | number): void {\n this.toggleCollapseAll(false);\n\n setTimeout(() => {\n const nodeElement = this.#elementRef?.nativeElement.querySelector(\n `#${this.getNodeId(nodeId)}`\n ) as HTMLElement;\n\n this.panZoomToNode({\n nodeElement,\n });\n }, 200);\n }\n\n /**\n * Pans the view of the org chart.\n * @param x The horizontal offset to pan to.\n * @param y The vertical offset to pan to.\n * @param smooth Whether to animate the panning.\n * @returns void\n */\n pan(x: number, y: number, smooth: boolean): void {\n const container = this.orgChartContainer()?.nativeElement;\n\n if (!container || !this.panZoomInstance) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const panZoomRect =\n this.panZoomContainer()?.nativeElement.getBoundingClientRect();\n\n const transformedX = x - containerRect.x + panZoomRect.x;\n const transformedY = y - containerRect.y + panZoomRect.y;\n\n if (smooth) {\n this.panZoomInstance.smoothMoveTo(transformedX, transformedY);\n } else {\n this.panZoomInstance.moveTo(transformedX, transformedY);\n }\n }\n\n /**\n * Resets the pan position of the org chart to center it horizontally and vertically.\n * This method calculates the center position based on the container's dimensions\n * and the hosting element's dimensions, then moves the panZoom instance to that position.\n */\n resetPan(): void {\n const container = this.panZoomContainer()?.nativeElement;\n\n if (!container || !this.panZoomInstance) {\n return;\n }\n\n const containerRect = container.getBoundingClientRect();\n const hostingElement = this.#elementRef.nativeElement;\n const windowWidth = hostingElement.getBoundingClientRect().width;\n const windowHeight = hostingElement.getBoundingClientRect().height;\n\n let x = (-1 * containerRect.width) / 2 + windowWidth / 2;\n\n if (this.layout() === 'horizontal') {\n if (this.isRtl()) {\n x = windowWidth - containerRect.width;\n } else {\n x = 0;\n }\n }\n\n const y = (-1 * containerRect.height) / 2 + windowHeight / 2;\n\n this.panZoomInstance?.smoothMoveTo(x, y);\n }\n\n /**\n * Resets the zoom level of the org chart to fit the content within the container.\n * This method calculates the optimal scale to fit the content and applies it.\n * @param {number} [padding=20] - Optional padding around the content when calculating the fit scale.\n */\n resetZoom(padding: number = 20): void {\n if (!this.panZoomInstance) {\n return;\n }\n\n const container = this.panZoomContainer()?.nativeElement;\n\n if (!container) {\n return;\n }\n\n this.zoomOut({ by: this.getFitScale(padding) });\n }\n\n /**\n * Resets both the pan position and zoom level of the org chart.\n * This method first resets the pan position, then resets the zoom level after a short delay.\n * @param {number} [padding=20] - Optional padding around the content when calculating the fit scale.\n */\n resetPanAndZoom(padding = 20): void {\n this.resetPan();\n\n setTimeout(() => {\n this.resetZoom(padding);\n }, RESET_DELAY);\n }\n\n /**\n * Toggles the collapse state of all nodes in the org chart.\n * If `collapse` is provided, it will collapse or expand all nodes accordingly.\n * If not provided, it will toggle the current state of the root node.\n */\n toggleCollapseAll(collapse?: boolean): void {\n const nodes = this.nodes();\n\n if (nodes?.children?.length && this.collapsible()) {\n this.onToggleCollapse({ node: nodes, collapse });\n }\n }\n\n /**\n * Toggles the collapse state of a specific node in the org chart.\n * If `collapse` is provided, it will collapse or expand the node accordingly.\n * If not provided, it will toggle the current state of the node.\n * @param {Object} options - Options for toggling collapse.\n * @param {OrgChartNode<T>} options.node - The node to toggle.\n * @param {boolean} [options.collapse] - Whether to collapse or expand the node.\n * @param {boolean} [options.highlightNode=false] - Whether to highlight the node after toggling.\n * @param {boolean} [options.playAnimation=false] - Whether to play animation when highlighting.\n */\n onToggleCollapse({\n node,\n collapse,\n highlightNode = false,\n playAnimation = false,\n }: {\n node: OrgChartNode<T>;\n collapse?: boolean;\n highlightNode?: boolean;\n playAnimation?: boolean;\n }): void {\n if (!this.collapsible()) {\n return;\n }\n\n const nodeId = node.id as string;\n const wasCollapsed = node.collapsed;\n\n const nodes = toggleNodeCollapse<T>({\n node: this.nodes() as OrgChartNode<T>,\n targetNode: nodeId,\n collapse,\n });\n\n this.nodes.set(nodes);\n\n this.panZoomInstance?.resume();\n\n if (highlightNode) {\n setTimeout(() => {\n const nodeElement = this.#elementRef?.nativeElement.querySelector(\n `#${\n wasCollapsed\n ? this.getNodeChildrenId(nodeId)\n : this.getNodeId(nodeId)\n }`\n ) as HTMLElement;\n\n this.panZoomToNode({\n nodeElement,\n skipZoom: true,\n playAnimation,\n });\n }, 200); // allow the DOM finish animation before highlighting\n }\n }\n\n protected zoom({\n type,\n by = 10,\n relative,\n }: {\n type: 'in' | 'out';\n by?: number;\n relative?: boolean;\n }): void {\n const containerEl = this.panZoomContainer()?.nativeElement;\n const containerRect = containerEl.getBoundingClientRect();\n const hostElement = this.#elementRef?.nativeElement;\n const hostElementRect = hostElement.getBoundingClientRect();\n const { scale } = this.panZoomInstance?.getTransform() ?? {\n scale: 1,\n };\n\n let centerX = containerRect.width / 2 + containerRect.x - hostElementRect.x;\n const centerY =\n containerRect.height / 2 + containerRect.y - hostElementRect.y;\n\n if (this.layout() === 'horizontal') {\n if (this.isRtl()) {\n centerX = containerRect.width + containerRect.x - hostElementRect.x;\n } else {\n centerX = 0;\n }\n }\n\n const newScale = relative\n ? type === 'in'\n ? scale * (1 + by / 100)\n : scale / (1 + by / 100)\n : by;\n\n this.panZoomInstance?.smoothZoomAbs(centerX, centerY, newScale);\n }\n\n protected panZoomToNode({\n nodeElement,\n skipZoom,\n playAnimation = true,\n }: {\n nodeElement: HTMLElement;\n skipZoom?: boolean;\n playAnimation?: boolean;\n }): void {\n const container = this.panZoomContainer()?.nativeElement;\n\n if (!container || !nodeElement || !this.panZoomInstance) {\n return;\n }\n\n const highlightedElements = container.querySelectorAll('.highlighted');\n highlightedElements.forEach(el => {\n el.classList.remove('highlighted');\n });\n\n this.panZoomInstance?.pause();\n this.panZoomInstance?.resume();\n\n setTimeout(() => {\n const hostElementRect =\n this.#elementRef.nativeElement.getBoundingClientRect();\n\n const nodeRect1 = nodeElement.getBoundingClientRect();\n const clientX = nodeRect1.x - nodeRect1.width / 2 - hostElementRect.x;\n const clientY = nodeRect1.y - nodeRect1.height / 2 - hostElementRect.y;\n\n if (!skipZoom) {\n const dynamicZoom = this.calculateOptimalZoom(nodeElement);\n this.panZoomInstance?.smoothZoomAbs(clientX, clientY, dynamicZoom);\n }\n }, 10);\n\n setTimeout(() => {\n const containerRect = container.getBoundingClientRect();\n const nodeRect = nodeElement.getBoundingClientRect();\n const hostingElement = this.#elementRef.nativeElement;\n const windowWidth = hostingElement.getBoundingClientRect().width;\n const windowHeight = hostingElement.getBoundingClientRect().height;\n\n const transformedNodeX = -1 * (nodeRect.x - containerRect.x);\n const transformedNodeY = -1 * (nodeRect.y - containerRect.y);\n\n const windowCenterX = windowWidth / 2;\n const windowCenterY = windowHeight / 2;\n const x = transformedNodeX + windowCenterX - nodeRect.width / 2;\n const y = transformedNodeY + windowCenterY - nodeRect.height / 2;\n\n this.panZoomInstance?.smoothMoveTo(x, y);\n\n if (playAnimation) {\n nodeElement.classList.add('highlighted');\n setTimeout(() => {\n nodeElement.classList.remove('highlighted');\n }, 2300);\n }\n }, 200); // allow some time for the zoom to take effect\n }\n\n protected getNodeId(nodeId: string | number): string {\n return `node-${nodeId}`;\n }\n\n protected getNodeChildrenId(nodeId: string | number): string {\n return `node-children-${nodeId}`;\n }\n\n /**\n * Handles the drag start event for a node.\n * @param event - The drag event\n * @param node - The node being dragged\n */\n protected onDragStart(event: DragEvent, node: OrgChartNode<T>): void {\n if (!this.draggable()) return;\n\n const canDrag = this.canDragNode();\n\n if (canDrag && !canDrag(node)) {\n event.preventDefault();\n\n return;\n }\n\n this.draggedNode.set(node);\n this.nodeDragStart.emit(node);\n\n this.panZoomInstance?.pause();\n\n const target = event.target as HTMLElement;\n const nodeContent = target.closest('.node-content') as HTMLElement;\n\n if (event.dataTransfer && nodeContent) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', node.id?.toString() || '');\n\n // Set custom drag image for Safari compatibility\n setDesktopDragImage(event, nodeContent);\n }\n\n if (nodeContent) {\n setTimeout(() => {\n nodeContent.classList.add('dragging');\n }, 0);\n }\n\n this.setupKeyboardListener();\n }\n\n /**\n * Sets up keyboard event listener for drag cancellation.\n */\n private setupKeyboardListener(): void {\n this.removeKeyboardListener();\n\n this.keyboardListener = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.draggedNode()) {\n this.cancelDrag();\n }\n };\n\n document.addEventListener('keydown', this.keyboardListener);\n }\n\n /**\n * Removes the keyboard event listener.\n */\n private removeKeyboardListener(): void {\n if (this.keyboardListener) {\n document.removeEventListener('keydown', this.keyboardListener);\n\n this.keyboardListener = null;\n }\n }\n\n private cancelDrag(): void {\n if (!this.draggedNode()) return;\n\n this.stopAutoPan();\n this.panZoomInstance?.resume();\n\n const allNodes =\n this.#elementRef.nativeElement.querySelectorAll('.node-content');\n allNodes.forEach(node => {\n node.classList.remove('drag-over');\n node.classList.remove('dragging');\n node.classList.remove('drag-not-allowed');\n });\n\n this.draggedNode.set(null);\n this.dragOverNode.set(null);\n\n this.removeKeyboardListener();\n\n // Clean up touch drag state if active\n if (this.touchDragState.active) {\n this.removeTouchGhostElement();\n this.removeTouchListeners();\n this.resetTouchDragState();\n }\n }\n\n /**\n * Handles the drag end event for a node.\n * @param event - The drag event\n * @param node - The node that was being dragged\n */\n protected onDragEnd(event: DragEvent, node: OrgChartNode<T>): void {\n if (!this.draggable()) return;\n\n this.nodeDragEnd.emit(node);\n this.draggedNode.set(null);\n this.dragOverNode.set(null);\n this.currentDragOverElement.set(null);\n\n this.stopAutoPan();\n this.removeKeyboardListener();\n\n this.panZoomInstance?.resume();\n\n const target = event.target as HTMLElement;\n const nodeContent = target.closest('.node-content') as HTMLElement;\n\n if (nodeContent) {\n nodeContent.classList.remove('dragging');\n }\n\n const allNodes =\n this.#elementRef.nativeElement.querySelectorAll('.node-content');\n allNodes.forEach(node => node.classList.remove('drag-over'));\n }\n\n /**\n * Handles the drag over event for a node.\n * @param event - The drag event\n * @param node - The node being dragged over\n */\n protected onDragOver(event: DragEvent, node: OrgChartNode<T>): void {\n if (!this.draggable() || !this.draggedNode()) return;\n\n event.preventDefault();\n\n const draggedNode = this.draggedNode();\n if (!draggedNode) return;\n\n if (this.isNodeDescendant(node, draggedNode)) {\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'none';\n }\n return;\n }\n\n const canDrop = this.canDropNode();\n\n if (canDrop && !canDrop(draggedNode, node)) {\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'none';\n }\n return;\n }\n\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n\n this.dragOverNode.set(node);\n }\n\n /**\n * Handles the drag over event on the container for auto-panning.\n * @param event - The drag event\n */\n protected onContainerDragOver(event: DragEvent): void {\n if (!this.draggable() || !this.draggedNode()) return;\n\n event.preventDefault();\n\n this.handleAutoPan(event);\n }\n\n /**\n * Handles the drag enter event for a node.\n * @param event - The drag event\n * @param node - The node being entered\n */\n protected onDragEnter(event: DragEvent, node: OrgChartNode<T>): void {\n if (!this.draggable() || !this.draggedNode()) return;\n\n const draggedNode = this.draggedNode();\n if (!draggedNode) return;\n\n if (this.isNodeDescendant(node, draggedNode)) {\n return;\n }\n\n const canDrop = this.canDropNode();\n\n if (canDrop && !canDrop(draggedNode, node)) {\n return;\n }\n\n const target = event.target as HTMLElement;\n const nodeElement = target.closest('.node-content') as HTMLElement;\n\n if (nodeElement) {\n // Remove highlight from previous element\n if (\n this.currentDragOverElement() &&\n this.currentDragOverElement() !== nodeElement\n ) {\n this.currentDragOverElement()?.classList.remove('drag-over');\n }\n\n // Add highlight to current element\n nodeElement.classList.add('drag-over');\n this.currentDragOverElement.set(nodeElement);\n }\n }\n\n /**\n * Handles the drag leave event for a node.\n * @param event - The drag event\n */\n protected onDragLeave(event: DragEvent): void {\n if (!this.draggable()) return;\n\n const target = event.target as HTMLElement;\n const nodeElement = target.closest('.node-content') as HTMLElement;\n\n // Only remove highlight if we're leaving the entire node-content element\n // Check if the event is leaving to go outside the node element\n if (nodeElement && this.currentDragOverElement() === nodeElement) {\n const rect = nodeElement.getBoundingClientRect();\n const isOutside =\n event.clientX < rect.left ||\n event.clientX > rect.right ||\n event.clientY < rect.top ||\n event.clientY > rect.bottom;\n\n if (isOutside) {\n nodeElement.classList.remove('drag-over');\n this.currentDragOverElement.set(null);\n }\n }\n }\n\n /**\n * Handles the drop event for a node.\n * @param event - The drag event\n * @param targetNode - The node where the drop occurred\n */\n protected onDrop(event: DragEvent, targetNode: OrgChartNode<T>): void {\n if (!this.draggable()) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const draggedNode = this.draggedNode();\n if (!draggedNode) return;\n\n if (this.isNodeDescendant(targetNode, draggedNode)) {\n return;\n }\n\n const canDrop = this.canDropNode();\n\n if (canDrop && !canDrop(draggedNode, targetNode)) {\n return;\n }\n\n this.nodeDrop.emit({\n draggedNode,\n targetNode,\n });\n\n const target = event.target as HTMLElement;\n const nodeElement = target.closest('.node-content') as HTMLElement;\n\n if (nodeElement) {\n nodeElement.classList.remove('drag-over');\n }\n\n this.currentDragOverElement.set(null);\n this.dragOverNode.set(null);\n\n this.stopAutoPan();\n this.panZoomInstance?.resume();\n\n afterNextRender(\n () => {\n this.disableChildDragging();\n },\n {\n injector: this.#injector,\n }\n );\n }\n\n /**\n * Checks if a node is a descendant of another node.\n * @param node - The node to check\n * @param potentialAncestor - The potential ancestor node\n * @returns true if node is a descendant of potentialAncestor\n */\n private isNodeDescendant(\n node: OrgChartNode<T>,\n potentialAncestor: OrgChartNode<T>\n ): boolean {\n if (node.id === potentialAncestor.id) {\n return true;\n }\n\n if (!potentialAncestor.children?.length) {\n return false;\n }\n\n return potentialAncestor.children.some(child =>\n this.isNodeDescendant(node, child as OrgChartNode<T>)\n );\n }\n\n /**\n * Handles the touch start event for drag on mobile devices.\n * @param event - The touch event\n * @param node - The node being touched\n */\n protected onTouchStart(event: TouchEvent, node: OrgChartNode<T>): void {\n if (!this.draggable()) return;\n\n const canDrag = this.canDragNode();\n if (canDrag && !canDrag(node)) {\n return;\n }\n\n const touch = event.touches[0];\n if (!touch) return;\n\n this.touchDragState.node = node;\n this.touchDragState.startX = touch.clientX;\n this.touchDragState.startY = touch.clientY;\n this.touchDragState.currentX = touch.clientX;\n this.touchDragState.currentY = touch.clientY;\n this.touchDragState.active = false;\n\n document.addEventListener('touchmove', this.onTouchMoveDocument, {\n passive: false,\n });\n\n document.addEventListener('touchend', this.onTouchEndDocument);\n document.addEventListener('touchcancel', this.onTouchEndDocument);\n }\n\n /**\n * Handles touch move event during drag on mobile devices.\n */\n private onTouchMoveDocument = (event: TouchEvent): void => {\n if (!this.touchDragState.node) return;\n\n const touch = event.touches[0];\n if (!touch) return;\n\n this.touchDragState.currentX = touch.clientX;\n this.touchDragState.currentY = touch.clientY;\n\n if (!this.touchDragState.active) {\n const deltaX = Math.abs(touch.clientX - this.touchDragState.startX);\n const deltaY = Math.abs(touch.clientY - this.touchDragState.startY);\n const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n\n if (distance >= this.touchDragState.dragThreshold) {\n this.touchDragState.active = true;\n this.draggedNode.set(this.touchDragState.node);\n this.nodeDragStart.emit(this.touchDragState.node);\n this.setupKeyboardListener();\n\n this.panZoomInstance?.pause();\n\n this.createTouchGhostElement(this.touchDragState.node);\n\n const nodeElement = this.getNodeElement(this.touchDragState.node);\n if (nodeElement) {\n nodeElement.classList.add('dragging');\n }\n }\n }\n\n if (this.touchDragState.active) {\n event.preventDefault();\n\n this.updateTouchGhostPosition(touch.clientX, touch.clientY);\n\n this.handleTouchAutoPan(touch.clientX, touch.clientY);\n\n const elementUnderTouch = this.getElementUnderTouch(\n touch.clientX,\n touch.clientY\n );\n\n if (elementUnderTouch) {\n const nodeElement = elementUnderTouch.closest(\n '.node-content'\n ) as HTMLElement;\n\n if (nodeElement && nodeElement.id) {\n const nodeId = this.getNodeIdFromElement(nodeElement);\n const node = this.findNodeById(nodeId);\n\n if (node) {\n this.handleTouchDragOver(node);\n } else {\n this.clearDragOverState();\n }\n } else {\n this.clearDragOverState();\n }\n } else {\n this.clearDragOverState();\n }\n }\n };\n\n /**\n * Handles touch end event during drag on mobile devices.\n */\n private onTouchEndDocument = (event: TouchEvent): void => {\n if (!this.touchDragState.node) return;\n\n if (this.touchDragState.active) {\n let targetNode: OrgChartNode<T> | null = null;\n\n const touch =\n event.changedTouches[0] ||\n (event.touches.length > 0 ? event.touches[0] : null);\n\n if (touch) {\n const elementUnderTouch = this.getElementUnderTouch(\n touch.clientX,\n touch.clientY\n );\n\n if (elementUnderTouch) {\n const nodeElement = elementUnderTouch.closest(\n '.node-content'\n ) as HTMLElement;\n\n if (nodeElement && nodeElement.id) {\n const nodeId = this.getNodeIdFromElement(nodeElement);\n targetNode = this.findNodeById(nodeId);\n }\n }\n }\n\n const draggedNode = this.draggedNode();\n\n if (targetNode && draggedNode && targetNode.id !== draggedNode.id) {\n const isDescendant = this.isNodeDescendant(targetNode, draggedNode);\n const canDrop = this.canDropNode();\n const dropAllowed =\n !isDescendant && (!canDrop || canDrop(draggedNode, targetNode));\n\n if (dropAllowed) {\n this.nodeDrop.emit({\n draggedNode,\n targetNode,\n });\n }\n }\n\n this.removeTouchGhostElement();\n this.nodeDragEnd.emit(this.touchDragState.node);\n\n const nodeElement = this.getNodeElement(this.touchDragState.node);\n if (nodeElement) {\n nodeElement.classList.remove('dragging');\n }\n\n this.clearDragOverState();\n this.draggedNode.set(null);\n this.stopAutoPan();\n this.removeKeyboardListener();\n this.panZoomInstance?.resume();\n }\n\n this.resetTouchDragState();\n this.removeTouchListeners();\n };\n\n /**\n * Resets the touch drag state to its initial values.\n */\n private resetTouchDragState(): void {\n this.touchDragState = {\n active: false,\n node: null,\n startX: 0,\n startY: 0,\n currentX: 0,\n currentY: 0,\n dragThreshold: TOUCH_DRAG_THRESHOLD,\n ghostElement: null,\n ghostScaledWidth: 0,\n ghostScaledHeight: 0,\n };\n }\n\n /**\n * Removes touch event listeners from the document.\n */\n private removeTouchListeners(): void {\n document.removeEventListener('touchmove', this.onTouchMoveDocument);\n document.removeEventListener('touchend', this.onTouchEndDocument);\n document.removeEventListener('touchcancel', this.onTouchEndDocument);\n }\n\n /**\n * Creates a ghost element to follow the touch during drag.\n */\n private createTouchGhostElement(node: OrgChartNode<T>): void {\n const nodeElement = this.getNodeElement(node);\n if (!nodeElement) return;\n\n const currentScale = this.panZoomInstance?.getTransform()?.scale ?? 1;\n\n const result = createTouchDragGhost({\n nodeElement,\n currentScale,\n touchX: this.touchDragState.currentX,\n touchY: this.touchDragState.currentY,\n });\n\n this.touchDragState.ghostElement = result.wrapper;\n this.touchDragState.ghostScaledWidth = result.scaledWidth;\n this.touchDragState.ghostScaledHeight = result.scaledHeight;\n }\n\n /**\n * Updates the position of the touch ghost element.\n */\n private updateTouchGhostPosition(x: number, y: number): void {\n if (!this.touchDragState.ghostElement) return;\n\n updateTouchGhostPosition(\n this.touchDragState.ghostElement,\n x,\n y,\n this.touchDragState.ghostScaledWidth,\n this.touchDragState.ghostScaledHeight\n );\n }\n\n /**\n * Removes the touch ghost element.\n */\n private removeTouchGhostElement(): void {\n if (this.touchDragState.ghostElement) {\n this.touchDragState.ghostElement.remove();\n this.touchDragState.ghostElement = null;\n }\n }\n\n /**\n * Gets the element under a touch point.\n */\n private getElementUnderTouch(x: number, y: number): Element | null {\n const ghost = this.touchDragState.ghostElement;\n const originalDisplay = ghost ? ghost.style.display : '';\n\n if (ghost) {\n ghost.style.display = 'none';\n }\n\n const element = document.elementFromPoint(x, y);\n\n if (ghost) {\n ghost.style.display = originalDisplay;\n }\n\n return element;\n }\n\n /**\n * Handles touch drag over a node.\n */\n private handleTouchDragOver(node: OrgChartNode<T>): void {\n const draggedNode = this.draggedNode();\n if (!draggedNode) return;\n\n if (node.id === draggedNode.id) {\n this.clearDragOverState();\n return;\n }\n\n if (this.isNodeDescendant(node, draggedNode)) {\n this.clearDragOverState();\n const nodeElement = this.getNodeElement(node);\n\n if (nodeElement) {\n nodeElement.classList.add('drag-not-allowed');\n }\n\n return;\n }\n\n const canDrop = this.canDropNode();\n\n if (canDrop && !canDrop(draggedNode, node)) {\n this.clearDragOverState();\n\n const nodeElement = this.getNodeElement(node);\n\n if (nodeElement) {\n nodeElement.classList.add('drag-not-allowed');\n }\n\n return;\n }\n\n if (this.dragOverNode() !== node) {\n this.clearDragOverState();\n\n this.dragOverNode.set(node);\n const nodeElement = this.getNodeElement(node);\n\n if (nodeElement) {\n nodeElement.classList.add('drag-over');\n }\n }\n }\n\n /**\n * Clears all drag-over visual states.\n */\n private clearDragOverState(): void {\n const allNodes =\n this.#elementRef.nativeElement.querySelectorAll('.node-content');\n\n allNodes.forEach(node => {\n node.classList.remove('drag-over');\n node.classList.remove('drag-not-allowed');\n });\n\n this.dragOverNode.set(null);\n }\n\n /**\n * Gets a node element by node data.\n */\n private getNodeElement(node: OrgChartNode<T>): HTMLElement | null {\n if (!node.id) return null;\n\n const nodeId = this.getNodeId(node.id);\n\n return this.#elementRef.nativeElement.querySelector(`#${nodeId}`);\n }\n\n /**\n * Gets node ID from a DOM element.\n */\n private getNodeIdFromElement(element: HTMLElement): string | number {\n const id = element.id.replace('node-', '');\n const numId = parseInt(id, 10);\n\n return isNaN(numId) ? id : numId;\n }\n\n /**\n * Finds a node by ID in the tree.\n */\n private findNodeById(id: string | number): OrgChartNode<T> | null {\n const nodes = this.nodes();\n if (!nodes) return null;\n\n const search = (node: OrgChartNode<T>): OrgChartNode<T> | null => {\n if (node.id === id || node.id?.toString() === id.toString()) {\n return node;\n }\n\n if (node.children) {\n for (const child of node.children as OrgChartNode<T>[]) {\n const found = search(child);\n if (found) return found;\n }\n }\n return null;\n };\n\n return search(nodes);\n }\n\n /**\n * Handles auto-panning during touch drag.\n */\n private handleTouchAutoPan(x: number, y: number): void {\n const hostElement = this.#elementRef.nativeElement;\n const rect = hostElement.getBoundingClientRect();\n\n const touchX = x - rect.left;\n const touchY = y - rect.top;\n\n const thresholdX = rect.width * this.dragEdgeThreshold();\n const thresholdY = rect.height * this.dragEdgeThreshold();\n\n let panX = 0;\n let panY = 0;\n\n if (touchX < thresholdX) {\n panX = this.dragAutoPanSpeed();\n } else if (touchX > rect.width - thresholdX) {\n panX = -this.dragAutoPanSpeed();\n }\n\n if (touchY < thresholdY) {\n panY = this.dragAutoPanSpeed();\n } else if (touchY > rect.height - thresholdY) {\n panY = -this.dragAutoPanSpeed();\n }\n\n if (panX !== 0 || panY !== 0) {\n this.startAutoPan(panX, panY);\n } else {\n this.stopAutoPan();\n }\n }\n\n private handleAutoPan(event: DragEvent): void {\n const hostElement = this.#elementRef.nativeElement;\n const rect = hostElement.getBoundingClientRect();\n\n const mouseX = event.clientX - rect.left;\n const mouseY = event.clientY - rect.top;\n\n const thresholdX = rect.width * this.dragEdgeThreshold();\n const thresholdY = rect.height * this.dragEdgeThreshold();\n\n let panX = 0;\n let panY = 0;\n\n if (mouseX < thresholdX) {\n panX = this.dragAutoPanSpeed();\n } else if (mouseX > rect.width - thresholdX) {\n panX = -this.dragAutoPanSpeed();\n }\n\n if (mouseY < thresholdY) {\n panY = this.dragAutoPanSpeed();\n } else if (mouseY > rect.height - thresholdY) {\n panY = -this.dragAutoPanSpeed();\n }\n\n if (panX !== 0 || panY !== 0) {\n this.startAutoPan(panX, panY);\n } else {\n this.stopAutoPan();\n }\n }\n\n private startAutoPan(panX: number, panY: number): void {\n this.stopAutoPan();\n\n this.autoPanInterval = window.setInterval(() => {\n if (!this.panZoomInstance) return;\n\n const transform = this.panZoomInstance.getTransform();\n const newX = transform.x + panX;\n const newY = transform.y + panY;\n\n this.panZoomInstance.moveTo(newX, newY);\n }, 16); // ~60fps\n }\n\n private stopAutoPan(): void {\n if (this.autoPanInterval !== null) {\n clearInterval(this.autoPanInterval);\n\n this.autoPanInterval = null;\n }\n }\n\n private calculateScale(): void {\n const transform = this.panZoomInstance?.getTransform();\n const currentScale = transform?.scale ?? 0;\n\n const minZoom = this.minZoom();\n const maxZoom = this.maxZoom();\n\n if (minZoom === maxZoom) {\n this.scale.set(0);\n\n return;\n }\n\n const ratio = (currentScale - minZoom) / (maxZoom - minZoom);\n const scalePercentage = Math.round(ratio * 10000) / 100;\n\n this.scale.set(scalePercentage);\n }\n\n private getFitScale(padding: number = 20): number {\n const hostingElement = this.#elementRef?.nativeElement;\n const contentEl = this.orgChartContainer()?.nativeElement;\n\n if (!hostingElement || !contentEl) return 1;\n\n const containerRect = hostingElement.getBoundingClientRect();\n const containerWidth = containerRect.width;\n const containerHeight = containerRect.height;\n\n // Use actual unscaled dimensions of content\n const contentWidth = contentEl.clientWidth;\n const contentHeight = contentEl.clientHeight;\n\n // Optional padding around the content\n const availableWidth = containerWidth - padding * 2;\n const availableHeight = containerHeight - padding * 2;\n\n const scaleX = availableWidth / contentWidth;\n const scaleY = availableHeight / contentHeight;\n\n // Never upscale beyond 1\n const fitScale = Math.min(scaleX, scaleY, 1);\n\n return fitScale;\n }\n\n /**\n * Calculates the optimal zoom level for highlighting a specific node.\n * The zoom is calculated to ensure the node is appropriately sized relative to the container,\n * while respecting the minimum and maximum zoom constraints.\n * @param {HTMLElement} nodeElement - The node element to calculate zoom for.\n * @returns {number} The optimal zoom level for the node.\n */\n private calculateOptimalZoom(nodeElement: HTMLElement): number {\n const hostingElement = this.#elementRef?.nativeElement;\n\n if (!hostingElement || !nodeElement) {\n return 1.5; // fallback to original value\n }\n\n const containerRect = hostingElement.getBoundingClientRect();\n const nodeRect = nodeElement.getBoundingClientRect();\n\n // Calculate the current transform to get actual node dimensions\n const currentTransform = this.panZoomInstance?.getTransform();\n const currentScale = currentTransform?.scale || 1;\n\n // Get the actual unscaled node dimensions\n const actualNodeWidth = nodeRect.width / currentScale;\n const actualNodeHeight = nodeRect.height / currentScale;\n\n // Use configurable ratios for target node size\n const targetNodeWidthRatio = this.highlightZoomNodeWidthRatio();\n const targetNodeHeightRatio = this.highlightZoomNodeHeightRatio();\n\n // Calculate zoom levels needed for width and height constraints\n const zoomForWidth =\n (containerRect.width * targetNodeWidthRatio) / actualNodeWidth;\n const zoomForHeight =\n (containerRect.height * targetNodeHeightRatio) / actualNodeHeight;\n\n // Use the smaller zoom to ensure the node fits well in both dimensions\n let optimalZoom = Math.min(zoomForWidth, zoomForHeight);\n\n // Apply zoom constraints\n const minZoom = this.minZoom();\n const maxZoom = this.maxZoom();\n optimalZoom = Math.max(minZoom, Math.min(maxZoom, optimalZoom));\n\n // Ensure a configurable minimum reasonable zoom for visibility\n const minimumZoom = this.highlightZoomMinimum();\n optimalZoom = Math.max(minimumZoom, optimalZoom);\n\n return optimalZoom;\n }\n\n ngOnDestroy(): void {\n this.stopAutoPan();\n this.removeKeyboardListener();\n this.panZoomInstance?.dispose();\n }\n\n /**\n * Disables native dragging on child elements (images, SVGs, anchors) within nodes.\n * This prevents child elements from interfering with the node's drag functionality.\n * Called automatically via effect when nodes change.\n */\n private disableChildDragging(): void {\n const hostingElement = this.#elementRef?.nativeElement;\n if (!hostingElement) return;\n\n const draggableChildren = hostingElement.querySelectorAll(\n '.node-content-wrapper img, .node-content-wrapper a, .node-content-wrapper svg'\n );\n\n draggableChildren.forEach((element: Element) => {\n (element as HTMLElement).setAttribute('draggable', 'false');\n });\n }\n}\n","<section\n class=\"org-chart-container\"\n #container\n [class.rtl]=\"isRtl()\"\n (dragover)=\"onContainerDragOver($event)\"\n>\n <section class=\"org-chart\" #panZoomContainer>\n @if (nodes()?.id) {\n <ul class=\"node-container\">\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{ node: nodes() }\"\n ></ng-container>\n </ul>\n }\n </section>\n\n <!-- Mini Map -->\n @if (showMiniMap()) {\n <ngx-org-chart-mini-map\n [panZoomInstance]=\"panZoomInstance\"\n [chartContainer]=\"containerElement()\"\n [position]=\"miniMapPosition()\"\n [width]=\"miniMapWidth()\"\n [height]=\"miniMapHeight()\"\n [themeOptions]=\"finalThemeOptions().miniMap\"\n />\n }\n</section>\n\n<ng-template #nodeTemplate let-node=\"node\">\n <li class=\"org-node\" [class.collapsed]=\"node.collapsed\" #orgChartContainer>\n <a\n [ngClass]=\"[node?.nodeClass ?? '', nodeClass() ?? '', 'node-content']\"\n [ngStyle]=\"node.style\"\n [id]=\"getNodeId(node.id)\"\n [attr.aria-expanded]=\"node.children?.length ? !node.collapsed : null\"\n [attr.aria-label]=\"\n node.name + (node.children?.length ? (node.collapsed ? ' (collapsed)' : ' (expanded)') : '')\n \"\n [attr.draggable]=\"draggable() && !customDragHandleTemplate ? true : null\"\n (dragstart)=\"customDragHandleTemplate ? null : onDragStart($event, node)\"\n (dragend)=\"customDragHandleTemplate ? null : onDragEnd($event, node)\"\n (dragover)=\"onDragOver($event, node)\"\n (dragenter)=\"onDragEnter($event, node)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, node)\"\n (touchstart)=\"customDragHandleTemplate ? null : onTouchStart($event, node)\"\n >\n <div class=\"node-content-wrapper\">\n @if (customNodeTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"customNodeTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: node,\n node: node,\n }\"\n ></ng-container>\n } @else {\n <span>{{ node.name }}</span>\n }\n </div>\n @if (customDragHandleTemplate && draggable()) {\n <span\n class=\"drag-handle\"\n [attr.draggable]=\"true\"\n (dragstart)=\"onDragStart($event, node)\"\n (dragend)=\"onDragEnd($event, node)\"\n (touchstart)=\"onTouchStart($event, node)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customDragHandleTemplate\"\n [ngTemplateOutletContext]=\"{\n $implicit: node,\n node: node,\n }\"\n ></ng-container>\n </span>\n }\n @if (collapsible() && node.children?.length) {\n <button\n class=\"collapse-btn\"\n (click)=\"onToggleCollapse({ node, highlightNode: focusOnCollapseOrExpand() })\"\n [class.collapsed]=\"node.collapsed\"\n (mouseenter)=\"panZoomInstance?.pause()\"\n (mousewheel)=\"panZoomInstance?.resume()\"\n (mouseleave)=\"panZoomInstance?.resume()\"\n (pointerenter)=\"panZoomInstance?.pause()\"\n (pointerleave)=\"panZoomInstance?.resume()\"\n [attr.aria-label]=\"(node.collapsed ? 'Expand' : 'Collapse') + ' ' + node.name\"\n type=\"button\"\n >\n @if (displayChildrenCount()) {\n <small class=\"children-count\">{{ node.descendantsCount }}</small>\n }\n <svg fill=\"none\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M11.9995 16.8001C11.2995 16.8001 10.5995 16.5301 10.0695 16.0001L3.54953 9.48014C3.25953 9.19014 3.25953 8.71014 3.54953 8.42014C3.83953 8.13014 4.31953 8.13014 4.60953 8.42014L11.1295 14.9401C11.6095 15.4201 12.3895 15.4201 12.8695 14.9401L19.3895 8.42014C19.6795 8.13014 20.1595 8.13014 20.4495 8.42014C20.7395 8.71014 20.7395 9.19014 20.4495 9.48014L13.9295 16.0001C13.3995 16.5301 12.6995 16.8001 11.9995 16.8001Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n }\n </a>\n\n @if (node.children?.length && !node.hidden && !node.collapsed) {\n <ul\n class=\"node-container\"\n [id]=\"getNodeChildrenId(node.id)\"\n [class.collapsed]=\"node.collapsed\"\n [class.instant-animation]=\"true\"\n [attr.aria-hidden]=\"node.collapsed\"\n @toggleNode\n >\n @for (child of node.children; track child.id) {\n @if (!child.hidden) {\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate\"\n [ngTemplateOutletContext]=\"{\n node: child,\n nodeTemplate: nodeTemplate,\n }\"\n ></ng-container>\n }\n }\n </ul>\n }\n </li>\n</ng-template>\n","import { OrgChartNode } from '../models';\n\n/**\n * Moves a node from its current position to become a child of a target node.\n * This is a pure function that returns a new tree structure without modifying the original.\n *\n * @param rootNode - The root node of the tree\n * @param draggedNodeId - The ID of the node to move\n * @param targetNodeId - The ID of the node that will become the parent\n * @returns A new tree structure with the node moved, or null if the operation fails\n *\n * @example\n * ```typescript\n * const updatedTree = moveNode(currentTree, '5', '3');\n * if (updatedTree) {\n * this.data.set(updatedTree);\n * }\n * ```\n */\nexport function moveNode<T>(\n rootNode: OrgChartNode<T>,\n draggedNodeId: string | number,\n targetNodeId: string | number\n): OrgChartNode<T> | null {\n // First, find and extract the dragged node\n const draggedNode = findNode(rootNode, draggedNodeId);\n if (!draggedNode) {\n return null;\n }\n\n // Check if target is a descendant of dragged node (prevent circular references)\n if (isNodeDescendant(draggedNode, targetNodeId)) {\n return null;\n }\n\n // Remove the dragged node from its current position\n const treeWithoutNode = removeNode(rootNode, draggedNodeId);\n\n if (!treeWithoutNode) {\n return null;\n }\n\n // Add the dragged node to the target node's children\n const finalTree = addNodeToParent(treeWithoutNode, targetNodeId, draggedNode);\n\n return finalTree;\n}\n\n/**\n * Finds a node in the tree by its ID.\n *\n * @param node - The node to search in\n * @param nodeId - The ID of the node to find\n * @returns The found node or null\n */\nexport function findNode<T>(\n node: OrgChartNode<T>,\n nodeId: string | number\n): OrgChartNode<T> | null {\n if (node.id === nodeId) {\n return node;\n }\n\n if (node.children) {\n for (const child of node.children) {\n const found = findNode(child as OrgChartNode<T>, nodeId);\n if (found) {\n return found;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Checks if a node is a descendant of another node.\n *\n * @param node - The potential ancestor node\n * @param descendantId - The ID of the potential descendant\n * @returns true if the node with descendantId is a descendant of node\n */\nexport function isNodeDescendant<T>(\n node: OrgChartNode<T>,\n descendantId: string | number\n): boolean {\n if (node.id === descendantId) {\n return true;\n }\n\n if (!node.children?.length) {\n return false;\n }\n\n return node.children.some(child =>\n isNodeDescendant(child as OrgChartNode<T>, descendantId)\n );\n}\n\n/**\n * Removes a node from the tree structure.\n * Returns a new tree without the specified node.\n *\n * @param node - The root node to search in\n * @param nodeIdToRemove - The ID of the node to remove\n * @returns A new tree structure without the removed node\n */\nexport function removeNode<T>(\n node: OrgChartNode<T>,\n nodeIdToRemove: string | number\n): OrgChartNode<T> | null {\n // Don't remove the root node\n if (node.id === nodeIdToRemove) {\n return null;\n }\n\n // Create a shallow copy\n const clonedNode: OrgChartNode<T> = {\n ...node,\n children: node.children ? [...node.children] : undefined,\n };\n\n if (!clonedNode.children) {\n return clonedNode;\n }\n\n // Filter out the node to remove and recursively process children\n const updatedChildren = clonedNode.children\n .filter(child => child.id !== nodeIdToRemove)\n .map(child => removeNode(child as OrgChartNode<T>, nodeIdToRemove))\n .filter((child): child is OrgChartNode<T> => child !== null);\n\n return {\n ...clonedNode,\n children: updatedChildren.length > 0 ? updatedChildren : undefined,\n };\n}\n\n/**\n * Adds a node as a child of the target parent node.\n * Returns a new tree structure with the node added.\n *\n * @param node - The root node to search in\n * @param targetParentId - The ID of the node that will become the parent\n * @param nodeToAdd - The node to add as a child\n * @returns A new tree structure with the node added\n */\nexport function addNodeToParent<T>(\n node: OrgChartNode<T>,\n targetParentId: string | number,\n nodeToAdd: OrgChartNode<T>\n): OrgChartNode<T> | null {\n if (node.id === targetParentId) {\n // Found the target parent - add the node to its children\n const currentChildren = node.children || [];\n return {\n ...node,\n children: [...currentChildren, { ...nodeToAdd }],\n };\n }\n\n // Recursively search in children\n if (node.children) {\n const updatedChildren = node.children\n .map(child =>\n addNodeToParent(child as OrgChartNode<T>, targetParentId, nodeToAdd)\n )\n .filter((child): child is OrgChartNode<T> => child !== null);\n\n return {\n ...node,\n children: updatedChildren,\n };\n }\n\n return node;\n}\n","/*\n * Public API Surface of org-chart\n */\n\nexport * from './lib/components';\nexport * from './lib/models';\nexport * from './lib/helpers/ngx-interactive-org-chart-drag-drop.helper';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tic-nova/ngx-interactive-org-chart",
|
|
3
|
+
"version": "1.4.0",
|
|
4
|
+
"description": "Modern Angular organizational chart component with interactive pan/zoom functionality and more..",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"organizational-chart",
|
|
8
|
+
"ngx-interactive-org-chart",
|
|
9
|
+
"org-chart",
|
|
10
|
+
"organizational-chart",
|
|
11
|
+
"hierarchy",
|
|
12
|
+
"interactive",
|
|
13
|
+
"panzoom",
|
|
14
|
+
"typescript",
|
|
15
|
+
"org-chart",
|
|
16
|
+
"ngx"
|
|
17
|
+
],
|
|
18
|
+
"author": "Zeyad Alshafey <am6515729@gmail.com>",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/zeyadelshaf3y/ngx-interactive-org-chart.git"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://zeyadelshaf3y.github.io/ngx-interactive-org-chart",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/zeyadelshaf3y/ngx-interactive-org-chart/issues"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@angular/animations": "^20.0.0",
|
|
30
|
+
"@angular/common": "^20.0.0",
|
|
31
|
+
"@angular/core": "^20.0.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"tslib": "^2.3.0",
|
|
35
|
+
"panzoom": "^9.4.3"
|
|
36
|
+
},
|
|
37
|
+
"sideEffects": false,
|
|
38
|
+
"module": "fesm2022/tic-nova-ngx-interactive-org-chart.mjs",
|
|
39
|
+
"typings": "types/tic-nova-ngx-interactive-org-chart.d.ts",
|
|
40
|
+
"exports": {
|
|
41
|
+
"./package.json": {
|
|
42
|
+
"default": "./package.json"
|
|
43
|
+
},
|
|
44
|
+
".": {
|
|
45
|
+
"types": "./types/tic-nova-ngx-interactive-org-chart.d.ts",
|
|
46
|
+
"default": "./fesm2022/tic-nova-ngx-interactive-org-chart.mjs"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|