@myrmidon/cadmus-graph-ui-ex
Version:
Cadmus - extensions to semantic graph components.
1 lines • 189 kB
Source Map (JSON)
{"version":3,"file":"myrmidon-cadmus-graph-ui-ex.mjs","sources":["../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/force-graph-renderer/force-graph-renderer.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/triple-filter/triple-filter.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/triple-filter/triple-filter.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-node-filter/linked-node-filter.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-node-filter/linked-node-filter.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-literal-filter/linked-literal-filter.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/linked-literal-filter/linked-literal-filter.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/pipes/graph-node-label.pipe.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/graph-walker.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/graph-walker/graph-walker.component.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/components/graph-walker/graph-walker.component.html","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/lib/graph-interfaces.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/public-api.ts","../../../../projects/myrmidon/cadmus-graph-ui-ex/src/myrmidon-cadmus-graph-ui-ex.ts"],"sourcesContent":["import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n AfterViewInit,\r\n OnDestroy,\r\n effect,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { takeUntil } from 'rxjs/operators';\r\n\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\n\r\nimport * as ForceGraph from 'force-graph';\r\nimport * as ForceGraph3D from '3d-force-graph';\r\nimport * as d3 from 'd3-force';\r\nimport * as THREE from 'three';\r\n\r\nimport { GraphNode, Edge } from '../../graph-interfaces';\r\n\r\n// force graph types\r\ninterface ForceGraphNode {\r\n id: string | number;\r\n name?: string;\r\n val?: number;\r\n color?: string;\r\n group?: string;\r\n x?: number;\r\n y?: number;\r\n z?: number;\r\n fx?: number;\r\n fy?: number;\r\n fz?: number;\r\n __nodeData?: GraphNode;\r\n}\r\n\r\ninterface ForceGraphLink {\r\n source: string | number;\r\n target: string | number;\r\n color?: string;\r\n width?: number;\r\n label?: string;\r\n __linkData?: Edge;\r\n}\r\n\r\ninterface ForceGraphData {\r\n nodes: ForceGraphNode[];\r\n links: ForceGraphLink[];\r\n}\r\n\r\nexport type GraphMode = '2d' | '3d';\r\n\r\n/**\r\n * Force graph renderer component that can display graphs in 2D or 3D\r\n * using force-graph and 3d-force-graph libraries.\r\n */\r\n@Component({\r\n selector: 'cadmus-force-graph-renderer',\r\n template: `\r\n <div class=\"renderer-container\">\r\n <div class=\"controls\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Switch to {{ mode() === '2d' ? '3D' : '2D' }} view\"\r\n (click)=\"toggleMode()\"\r\n >\r\n <mat-icon>{{\r\n mode() === '2d' ? 'view_in_ar' : 'view_quilt'\r\n }}</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Center view\"\r\n (click)=\"centerView()\"\r\n >\r\n <mat-icon>filter_center_focus</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Zoom to fit\"\r\n (click)=\"zoomToFit()\"\r\n >\r\n <mat-icon>fit_screen</mat-icon>\r\n </button>\r\n </div>\r\n <div #graphContainer class=\"graph-container\"></div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .renderer-container {\r\n width: 100%;\r\n height: 100%;\r\n min-height: 600px;\r\n position: relative;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .controls {\r\n position: absolute;\r\n top: 10px;\r\n right: 10px;\r\n z-index: 1000;\r\n display: flex;\r\n gap: 4px;\r\n background: rgba(255, 255, 255, 0.9);\r\n border-radius: 4px;\r\n padding: 4px;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n .graph-container {\r\n width: 100%;\r\n height: 100%;\r\n min-height: 600px;\r\n flex: 1;\r\n position: relative;\r\n }\r\n `,\r\n ],\r\n imports: [MatButtonModule, MatIconModule, MatTooltipModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ForceGraphRendererComponent implements AfterViewInit, OnDestroy {\r\n @ViewChild('graphContainer', { static: true })\r\n graphContainer!: ElementRef<HTMLDivElement>;\r\n\r\n public readonly nodes = input<GraphNode[]>([]);\r\n public readonly edges = input<Edge[]>([]);\r\n public readonly mode = input<GraphMode>('2d');\r\n public readonly update$ = input<Subject<boolean>>();\r\n public readonly center$ = input<Subject<boolean>>();\r\n public readonly zoomToFit$ = input<Subject<any>>();\r\n\r\n public readonly nodeSelect = output<GraphNode>();\r\n public readonly nodeDoubleClick = output<GraphNode>();\r\n public readonly modeChange = output<GraphMode>();\r\n\r\n private graph: any = null;\r\n private currentMode: GraphMode = '2d';\r\n private clickTimeout: any = null;\r\n private resizeObserver?: ResizeObserver;\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor() {\r\n // React to mode changes after graph initialization\r\n effect(() => {\r\n const m = this.mode();\r\n if (!this.graph) return;\r\n this.switchMode(m);\r\n });\r\n\r\n // React to data changes after graph initialization\r\n effect(() => {\r\n // Register signal dependencies\r\n this.nodes();\r\n this.edges();\r\n this.updateGraphData();\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.currentMode = this.mode();\r\n this.initGraph();\r\n this.setupSubscriptions();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n\r\n if (this.clickTimeout) {\r\n clearTimeout(this.clickTimeout);\r\n }\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n if (this.graph) {\r\n // Properly destroy the graph instance\r\n if (typeof this.graph._destructor === 'function') {\r\n this.graph._destructor();\r\n }\r\n this.graph = null;\r\n }\r\n }\r\n\r\n private initGraph(): void {\r\n this.createGraph();\r\n this.updateGraphData();\r\n }\r\n\r\n private createGraph(): void {\r\n if (this.graph) {\r\n if (typeof this.graph._destructor === 'function') {\r\n this.graph._destructor();\r\n }\r\n }\r\n\r\n const container = this.graphContainer.nativeElement;\r\n container.innerHTML = ''; // Clear container\r\n\r\n const width = container.clientWidth || 800;\r\n const height = container.clientHeight || 600;\r\n\r\n if (this.currentMode === '2d') {\r\n this.graph = (ForceGraph as any)\r\n .default()(container)\r\n .width(width)\r\n .height(height)\r\n .backgroundColor('rgba(0,0,0,0)')\r\n .nodeLabel('name')\r\n .nodeColor(this.getNodeColor.bind(this))\r\n .nodeVal(this.getNodeSize.bind(this))\r\n .linkColor(this.getLinkColor.bind(this))\r\n .linkWidth(this.getLinkWidth.bind(this))\r\n .linkLabel(this.getLinkLabel.bind(this))\r\n .linkDirectionalArrowLength(6)\r\n .linkDirectionalArrowRelPos(0.8)\r\n .onNodeClick(this.onNodeClick.bind(this))\r\n .onNodeHover(this.onNodeHover.bind(this))\r\n .onBackgroundClick(this.onBackgroundClick.bind(this))\r\n .nodeCanvasObject(this.drawNode.bind(this))\r\n .nodeCanvasObjectMode(() => 'replace')\r\n .linkCanvasObject(this.drawLink.bind(this))\r\n .linkCanvasObjectMode(() => 'after')\r\n // Configure d3 forces properly\r\n .d3Force('link', d3.forceLink().distance(120).strength(0.5))\r\n .d3Force('charge', d3.forceManyBody().strength(-300))\r\n .d3Force('collision', d3.forceCollide().radius(50));\r\n } else {\r\n this.graph = (ForceGraph3D as any)\r\n .default()(container)\r\n .width(width)\r\n .height(height)\r\n .backgroundColor('rgba(240,240,240,0.1)')\r\n .showNavInfo(false)\r\n // Node configuration - use nodeThreeObject for static labels\r\n .nodeThreeObject(this.createNode3DWithLabel.bind(this))\r\n // Remove link labels - they'll be shown on nodes instead\r\n // .linkThreeObject(this.createLink3DWithLabel.bind(this))\r\n // .linkThreeObjectExtend(true)\r\n .linkColor(this.getLinkColor.bind(this))\r\n .linkWidth(this.getLinkWidth.bind(this))\r\n .linkDirectionalArrowLength(4)\r\n .linkDirectionalArrowRelPos(0.8)\r\n .linkOpacity(0.6)\r\n // Keep tooltip labels for additional info on hover\r\n .nodeLabel(this.getNode3DLabel.bind(this))\r\n .linkLabel(this.getLink3DLabel.bind(this))\r\n // Event handlers\r\n .onNodeClick(this.onNodeClick.bind(this))\r\n .onNodeHover(this.onNodeHover.bind(this))\r\n .onBackgroundClick(this.onBackgroundClick.bind(this))\r\n // Configure d3 forces for 3D\r\n .d3Force('link', d3.forceLink().distance(120).strength(0.5))\r\n .d3Force('charge', d3.forceManyBody().strength(-300));\r\n }\r\n\r\n // Handle window resize\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n }\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n if (this.graph && container.clientWidth && container.clientHeight) {\r\n this.graph.width(container.clientWidth).height(container.clientHeight);\r\n }\r\n });\r\n this.resizeObserver.observe(container);\r\n }\r\n\r\n private convertToForceGraphData(): ForceGraphData {\r\n const forceNodes: ForceGraphNode[] = this.nodes().map((node) => {\r\n const label = node.label || String(node.id);\r\n const count = node.data?.count;\r\n const displayName = count ? `${label} (${count})` : label;\r\n\r\n return {\r\n id: node.id,\r\n name: displayName, // This will be used by nodeLabel\r\n val: this.getNodeSizeValue(node),\r\n color: node.data?.customColor || node.data?.color || '#69b3a2',\r\n group: node.data?.originId || String(node.id).charAt(0) || '1', // Group by first character for auto-coloring\r\n __nodeData: node,\r\n };\r\n });\r\n\r\n const forceLinks: ForceGraphLink[] = this.edges().map((edge) => {\r\n const label = edge.label || edge.data?.label || '';\r\n\r\n return {\r\n source: edge.source,\r\n target: edge.target,\r\n color: edge.data?.color || '#999',\r\n width: edge.data?.width || 1,\r\n label: this.truncateLabelFor3D(label), // Pre-truncate for 3D\r\n __linkData: edge,\r\n };\r\n });\r\n\r\n console.log('Force graph data for 3D:', {\r\n nodes: forceNodes,\r\n links: forceLinks,\r\n });\r\n return { nodes: forceNodes, links: forceLinks };\r\n }\r\n\r\n private getNode3DLabel(node: ForceGraphNode): string {\r\n const nodeData = node.__nodeData;\r\n if (!nodeData) return node.name || String(node.id);\r\n\r\n const label = nodeData.label || String(nodeData.id);\r\n // Add node count if available\r\n const count = nodeData.data?.count;\r\n const displayLabel = count ? `${label} (${count})` : label;\r\n\r\n // Truncate for 3D display\r\n return displayLabel.length > 15\r\n ? displayLabel.substring(0, 12) + '...'\r\n : displayLabel;\r\n }\r\n\r\n private getLink3DLabel(link: ForceGraphLink): string {\r\n const label = this.getLinkLabel(link);\r\n if (!label) return '';\r\n\r\n // More aggressive truncation for 3D to avoid performance issues\r\n if (label.length > 15) {\r\n if (label.includes(':')) {\r\n const parts = label.split(':');\r\n if (parts.length > 1) {\r\n return parts[0] + ':' + parts[1].substring(0, 10) + '...';\r\n }\r\n }\r\n return label.substring(0, 12) + '...';\r\n }\r\n return label;\r\n }\r\n\r\n private truncateLabelFor3D(label: string): string {\r\n if (!label) return '';\r\n\r\n // More aggressive truncation for 3D to ensure performance\r\n if (label.length > 20) {\r\n if (label.includes(':')) {\r\n const parts = label.split(':');\r\n if (parts.length > 1) {\r\n const prefix = parts[0];\r\n const suffix = parts[1];\r\n if (suffix.length > 12) {\r\n return `${prefix}:${suffix.substring(0, 9)}...`;\r\n }\r\n return `${prefix}:${suffix}`;\r\n }\r\n }\r\n return label.substring(0, 17) + '...';\r\n }\r\n return label;\r\n }\r\n\r\n private updateGraphData(): void {\r\n if (!this.graph) return;\r\n\r\n const graphData = this.convertToForceGraphData();\r\n console.log('Updating graph data:', graphData); // Debug log\r\n this.graph.graphData(graphData);\r\n }\r\n\r\n private getNodeColor(node: ForceGraphNode): string {\r\n return (\r\n node.__nodeData?.data?.customColor ||\r\n node.__nodeData?.data?.color ||\r\n node.color ||\r\n '#69b3a2'\r\n );\r\n }\r\n\r\n private getNodeSize(node: ForceGraphNode): number {\r\n if (node.__nodeData) {\r\n return node.val || this.getNodeSizeValue(node.__nodeData);\r\n }\r\n return node.val || 4;\r\n }\r\n\r\n private getNodeSizeValue(node: GraphNode | undefined): number {\r\n if (!node) return 4;\r\n\r\n // Different sizes based on node type\r\n const id = String(node.id); // Convert to string for startsWith check\r\n if (id.startsWith('N')) return 8; // Node\r\n if (id.startsWith('P')) return 6; // Property\r\n if (id.startsWith('L')) return 4; // Literal\r\n return 6;\r\n }\r\n\r\n private getLinkColor(link: ForceGraphLink): string {\r\n return link.__linkData?.data?.color || link.color || '#999';\r\n }\r\n\r\n private getLinkWidth(link: ForceGraphLink): number {\r\n return link.__linkData?.data?.width || link.width || 1;\r\n }\r\n\r\n private getLinkLabel(link: ForceGraphLink): string {\r\n return link.__linkData?.label || link.label || '';\r\n }\r\n\r\n private drawNode(\r\n node: ForceGraphNode,\r\n ctx: CanvasRenderingContext2D,\r\n globalScale: number,\r\n ): void {\r\n if (!node.__nodeData || !node.x || !node.y) return;\r\n\r\n const nodeData = node.__nodeData;\r\n const label = nodeData.label || String(nodeData.id);\r\n const isSelected = nodeData.data?.selected;\r\n\r\n // Node size and color\r\n const size = this.getNodeSize(node) / Math.max(globalScale, 0.5);\r\n const color = this.getNodeColor(node);\r\n\r\n // Draw node shape based on type\r\n ctx.save();\r\n\r\n const nodeId = String(nodeData.id);\r\n\r\n if (nodeId.startsWith('L')) {\r\n // Literal nodes - diamond shape\r\n ctx.fillStyle = color;\r\n ctx.strokeStyle = isSelected ? '#e7d211' : '#666';\r\n ctx.lineWidth = isSelected ? 2 / globalScale : 1 / globalScale;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(node.x, node.y - size);\r\n ctx.lineTo(node.x + size, node.y);\r\n ctx.lineTo(node.x, node.y + size);\r\n ctx.lineTo(node.x - size, node.y);\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.stroke();\r\n } else if (nodeId.startsWith('P')) {\r\n // Property nodes - hexagon shape\r\n ctx.fillStyle = color;\r\n ctx.strokeStyle = isSelected ? '#e7d211' : '#666';\r\n ctx.lineWidth = isSelected ? 2 / globalScale : 1 / globalScale;\r\n\r\n const sides = 6;\r\n const a = (Math.PI * 2) / sides;\r\n\r\n ctx.beginPath();\r\n for (let i = 0; i < sides; i++) {\r\n const x = node.x + Math.cos(a * i) * size;\r\n const y = node.y + Math.sin(a * i) * size;\r\n if (i === 0) ctx.moveTo(x, y);\r\n else ctx.lineTo(x, y);\r\n }\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.stroke();\r\n } else {\r\n // Regular nodes - circle\r\n ctx.fillStyle = color;\r\n ctx.strokeStyle = isSelected ? '#e7d211' : '#666';\r\n ctx.lineWidth = isSelected ? 2 / globalScale : 1 / globalScale;\r\n\r\n ctx.beginPath();\r\n ctx.arc(node.x, node.y, size, 0, 2 * Math.PI);\r\n ctx.fill();\r\n ctx.stroke();\r\n }\r\n\r\n // Draw label\r\n if (globalScale > 0.3) {\r\n const fontSize = Math.max(8, 10 / globalScale);\r\n ctx.font = `${fontSize}px Arial`;\r\n ctx.fillStyle = '#333';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n\r\n // Truncate long labels\r\n let displayLabel = label;\r\n if (displayLabel.length > 15) {\r\n displayLabel = displayLabel.substring(0, 12) + '...';\r\n }\r\n\r\n ctx.fillText(displayLabel, node.x, node.y + size + fontSize);\r\n }\r\n\r\n ctx.restore();\r\n }\r\n\r\n private drawLink(\r\n link: ForceGraphLink,\r\n ctx: CanvasRenderingContext2D,\r\n globalScale: number,\r\n ): void {\r\n if (!link.source || !link.target) return;\r\n\r\n const source = link.source as any;\r\n const target = link.target as any;\r\n\r\n if (!source.x || !source.y || !target.x || !target.y) return;\r\n\r\n const label = this.getLinkLabel(link);\r\n if (!label || globalScale < 0.3) return; // Show labels at lower zoom levels\r\n\r\n // Calculate link vector and angle\r\n const dx = target.x - source.x;\r\n const dy = target.y - source.y;\r\n const linkLength = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (linkLength === 0) return;\r\n\r\n const angle = Math.atan2(dy, dx);\r\n\r\n // Position label at 40% of the way from source to target\r\n const labelX = source.x + dx * 0.4;\r\n const labelY = source.y + dy * 0.4;\r\n\r\n // Calculate offset perpendicular to the link to avoid overlap\r\n const offsetDistance = 20 / globalScale;\r\n const offsetX = -Math.sin(angle) * offsetDistance;\r\n const offsetY = Math.cos(angle) * offsetDistance;\r\n\r\n const finalX = labelX + offsetX;\r\n const finalY = labelY + offsetY;\r\n\r\n ctx.save();\r\n\r\n // Smaller font size\r\n const fontSize = Math.max(6, 7 / globalScale);\r\n ctx.font = `${fontSize}px Arial`;\r\n\r\n // Rotate text to be parallel to the link\r\n ctx.translate(finalX, finalY);\r\n\r\n // Keep text readable by avoiding upside-down text\r\n let textAngle = angle;\r\n if (Math.abs(angle) > Math.PI / 2) {\r\n textAngle = angle + Math.PI;\r\n }\r\n\r\n ctx.rotate(textAngle);\r\n\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n\r\n // More generous truncation based on link length\r\n let displayLabel = label;\r\n const maxChars = Math.min(Math.max(15, Math.floor(linkLength / 8)), 25); // Dynamic based on link length, min 15, max 25\r\n\r\n if (displayLabel.length > maxChars) {\r\n // Try to be smart about truncation - keep the meaningful part\r\n if (displayLabel.includes(':')) {\r\n // For URIs like \"crm:P98_brought_into_existence\", try to keep the part after the colon\r\n const parts = displayLabel.split(':');\r\n if (parts.length > 1 && parts[1].length <= maxChars - 3) {\r\n displayLabel = parts[0] + ':' + parts[1];\r\n } else if (parts[1].length > maxChars - 3) {\r\n displayLabel =\r\n parts[0] + ':' + parts[1].substring(0, maxChars - 6) + '...';\r\n }\r\n } else {\r\n // Regular truncation\r\n displayLabel = displayLabel.substring(0, maxChars - 3) + '...';\r\n }\r\n }\r\n\r\n // Measure text for background\r\n const textMetrics = ctx.measureText(displayLabel);\r\n const textWidth = textMetrics.width;\r\n const textHeight = fontSize;\r\n\r\n // Draw background\r\n ctx.fillStyle = 'rgba(255, 255, 255, 0.85)';\r\n ctx.fillRect(\r\n -textWidth / 2 - 1,\r\n -textHeight / 2 - 0.5,\r\n textWidth + 2,\r\n textHeight + 1,\r\n );\r\n\r\n // Draw border\r\n ctx.strokeStyle = 'rgba(0, 0, 0, 0.15)';\r\n ctx.lineWidth = 0.3 / globalScale;\r\n ctx.strokeRect(\r\n -textWidth / 2 - 1,\r\n -textHeight / 2 - 0.5,\r\n textWidth + 2,\r\n textHeight + 1,\r\n );\r\n\r\n // Draw text\r\n ctx.fillStyle = '#333';\r\n ctx.fillText(displayLabel, 0, 0);\r\n\r\n ctx.restore();\r\n }\r\n\r\n private onNodeClick(node: ForceGraphNode, event?: MouseEvent): void {\r\n if (!node.__nodeData) return;\r\n\r\n // Handle double-click detection with timeout\r\n if (this.clickTimeout) {\r\n clearTimeout(this.clickTimeout);\r\n this.clickTimeout = null;\r\n // Double click detected\r\n this.nodeDoubleClick.emit(node.__nodeData!);\r\n } else {\r\n // Set timeout for single click\r\n this.clickTimeout = setTimeout(() => {\r\n this.clickTimeout = null;\r\n this.nodeSelect.emit(node.__nodeData!);\r\n }, 300);\r\n }\r\n }\r\n\r\n private onNodeHover(node: ForceGraphNode | null): void {\r\n if (this.graph) {\r\n // Change cursor on hover for both 2D and 3D\r\n const container = this.graphContainer.nativeElement;\r\n container.style.cursor = node ? 'pointer' : 'default';\r\n }\r\n }\r\n\r\n private onBackgroundClick(): void {\r\n // Deselect node on background click\r\n this.nodeSelect.emit(null as any);\r\n }\r\n\r\n private setupSubscriptions(): void {\r\n const update$ = this.update$();\r\n if (update$) {\r\n update$.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.updateGraphData();\r\n });\r\n }\r\n\r\n const center$ = this.center$();\r\n if (center$) {\r\n center$.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.centerView();\r\n });\r\n }\r\n\r\n const zoomToFit$ = this.zoomToFit$();\r\n if (zoomToFit$) {\r\n zoomToFit$.pipe(takeUntil(this.destroy$)).subscribe(() => {\r\n this.zoomToFit();\r\n });\r\n }\r\n }\r\n\r\n toggleMode(): void {\r\n const newMode: GraphMode = this.currentMode === '2d' ? '3d' : '2d';\r\n this.switchMode(newMode);\r\n this.modeChange.emit(newMode);\r\n }\r\n\r\n private switchMode(newMode: GraphMode): void {\r\n if (newMode === this.currentMode) return;\r\n\r\n this.currentMode = newMode;\r\n this.createGraph();\r\n this.updateGraphData();\r\n }\r\n\r\n centerView(): void {\r\n if (this.graph) {\r\n if (this.currentMode === '2d') {\r\n this.graph.centerAt(0, 0, 1000);\r\n } else {\r\n this.graph.cameraPosition(\r\n { x: 0, y: 0, z: 400 },\r\n { x: 0, y: 0, z: 0 },\r\n 1000,\r\n );\r\n }\r\n }\r\n }\r\n\r\n zoomToFit(): void {\r\n if (this.graph) {\r\n this.graph.zoomToFit(1000, 50);\r\n }\r\n }\r\n\r\n private createNode3DWithLabel(node: ForceGraphNode): any {\r\n const nodeData = node.__nodeData;\r\n if (!nodeData) return null;\r\n\r\n console.log('Creating 3D node with label for:', nodeData.label);\r\n\r\n const size = this.getNodeSize(node);\r\n const color = this.getNodeColor(node);\r\n const nodeId = String(nodeData.id);\r\n\r\n // Create a group to hold both the node and the labels\r\n const group = new THREE.Group();\r\n\r\n // Create node geometry based on type\r\n let geometry: any;\r\n if (nodeId.startsWith('L')) {\r\n geometry = new THREE.OctahedronGeometry(size);\r\n } else if (nodeId.startsWith('P')) {\r\n geometry = new THREE.CylinderGeometry(\r\n size * 0.8,\r\n size * 0.8,\r\n size * 0.5,\r\n 6,\r\n );\r\n } else {\r\n geometry = new THREE.SphereGeometry(size);\r\n }\r\n\r\n const material = new THREE.MeshLambertMaterial({ color });\r\n const mesh = new THREE.Mesh(geometry, material);\r\n group.add(mesh);\r\n\r\n // Create node label with count and incoming link labels\r\n const label = nodeData.label || String(nodeData.id);\r\n const count = nodeData.data?.count;\r\n\r\n // Get incoming link labels\r\n const incomingLinks = this.edges().filter(\r\n (edge) => edge.target === nodeData.id,\r\n );\r\n const linkLabels = incomingLinks\r\n .map((edge) => edge.label || edge.data?.label)\r\n .filter((label) => label) // Remove empty labels\r\n .slice(0, 3); // Limit to first 3 to avoid too long text\r\n\r\n // Build display text\r\n let displayText = label;\r\n\r\n if (count || linkLabels.length > 0) {\r\n const parts = [];\r\n\r\n if (count) {\r\n parts.push(count.toString());\r\n }\r\n\r\n if (linkLabels.length > 0) {\r\n // Join multiple link labels with commas\r\n const linkText = linkLabels.join(', ');\r\n parts.push(linkText);\r\n }\r\n\r\n if (parts.length > 0) {\r\n displayText = `${label} (${parts.join(': ')})`;\r\n }\r\n }\r\n\r\n // Truncate for 3D - be more generous to keep labels readable\r\n let truncatedText = displayText;\r\n if (truncatedText.length > 25) {\r\n // Try to keep the meaningful part - prioritize the link labels over the node label\r\n if (linkLabels.length > 0 && count) {\r\n // Format: \"NodeLabel (count: linkLabel1, linkLabel2)\"\r\n const linkText = linkLabels.join(', ');\r\n const maxLinkLength = 15; // Reserve space for link labels\r\n const truncatedLinkText =\r\n linkText.length > maxLinkLength\r\n ? linkText.substring(0, maxLinkLength - 3) + '...'\r\n : linkText;\r\n\r\n const nodePartLength = Math.max(\r\n 5,\r\n 25 - count.toString().length - truncatedLinkText.length - 5,\r\n ); // 5 for \" (: )\"\r\n const truncatedLabel =\r\n label.length > nodePartLength\r\n ? label.substring(0, nodePartLength - 3) + '...'\r\n : label;\r\n\r\n truncatedText = `${truncatedLabel} (${count}: ${truncatedLinkText})`;\r\n } else {\r\n // Fallback to simple truncation\r\n truncatedText = truncatedText.substring(0, 22) + '...';\r\n }\r\n }\r\n\r\n const nodeSprite = this.createTextSprite(truncatedText);\r\n nodeSprite.position.set(0, size + 15, 0); // Position above node\r\n group.add(nodeSprite);\r\n\r\n console.log('Created node sprite with text:', truncatedText);\r\n\r\n return group;\r\n }\r\n\r\n private createTextSprite(text: string): any {\r\n const fontFace = 'Arial';\r\n const fontSize = 24;\r\n const canvas = document.createElement('canvas');\r\n const context = canvas.getContext('2d')!;\r\n\r\n // Set font for measurement\r\n context.font = `Normal ${fontSize}px ${fontFace}`;\r\n const metrics = context.measureText(text);\r\n const textWidth = metrics.width;\r\n const padding = 10;\r\n\r\n // Set canvas size\r\n canvas.width = textWidth + padding * 2;\r\n canvas.height = fontSize + padding * 2;\r\n\r\n // Clear and draw background\r\n context.fillStyle = 'rgba(255, 255, 255, 0.9)';\r\n context.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Draw border\r\n context.strokeStyle = 'rgba(0, 0, 0, 0.3)';\r\n context.lineWidth = 2;\r\n context.strokeRect(0, 0, canvas.width, canvas.height);\r\n\r\n // Draw text\r\n context.font = `Normal ${fontSize}px ${fontFace}`;\r\n context.textAlign = 'center';\r\n context.textBaseline = 'middle';\r\n context.fillStyle = 'rgba(0, 0, 0, 1)';\r\n context.fillText(text, canvas.width / 2, canvas.height / 2);\r\n\r\n // Create texture and sprite\r\n const texture = new THREE.CanvasTexture(canvas);\r\n const material = new THREE.SpriteMaterial({ map: texture });\r\n const sprite = new THREE.Sprite(material);\r\n\r\n // Scale the sprite appropriately\r\n sprite.scale.set(canvas.width / 4, canvas.height / 4, 1);\r\n\r\n return sprite;\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, effect, input, model } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { PageEvent, MatPaginator } from '@angular/material/paginator';\r\nimport { forkJoin, from } from 'rxjs';\r\n\r\nimport { MatTabGroup, MatTab } from '@angular/material/tabs';\r\nimport { MatCheckbox } from '@angular/material/checkbox';\r\nimport { MatList, MatListItem } from '@angular/material/list';\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\n\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { GraphNodeLookupService } from '@myrmidon/cadmus-graph-ui';\r\nimport { GraphService, UriNode } from '@myrmidon/cadmus-api';\r\n\r\nimport { PagedTripleFilter } from '../../graph-walker';\r\n\r\n/**\r\n * Triples filter.\r\n */\r\n@Component({\r\n selector: 'cadmus-walker-triple-filter',\r\n templateUrl: './triple-filter.component.html',\r\n styleUrls: ['./triple-filter.component.css'],\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatPaginator,\r\n MatTabGroup,\r\n MatTab,\r\n RefLookupComponent,\r\n MatCheckbox,\r\n MatList,\r\n MatListItem,\r\n MatIconButton,\r\n MatIcon,\r\n MatFormField,\r\n MatInput,\r\n MatTooltip,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class TripleFilterComponent {\r\n /**\r\n * True if this component is disabled.\r\n */\r\n public readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * True if this component should show a pager.\r\n */\r\n public readonly hasPager = input<boolean>(false);\r\n\r\n /**\r\n * The total number of triples returned from the last\r\n * page fetch operation. Used when hasPager is true.\r\n */\r\n public readonly total = input<number>(0);\r\n\r\n /**\r\n * The filter.\r\n */\r\n public readonly filter = model<PagedTripleFilter>({\r\n pageNumber: 1,\r\n pageSize: 10,\r\n });\r\n\r\n public pageNumber: FormControl<number>;\r\n public pageSize: FormControl<number>;\r\n public litPattern: FormControl<string | null>;\r\n public litType: FormControl<string | null>;\r\n public litLanguage: FormControl<string | null>;\r\n public minLitNumber: FormControl<number | null>;\r\n public maxLitNumber: FormControl<number | null>;\r\n\r\n public subj: FormControl<UriNode | null>;\r\n public isNotPred: FormControl<boolean>;\r\n public preds: FormControl<UriNode[]>;\r\n public notPreds: FormControl<UriNode[]>;\r\n public hasLiteralObj: FormControl<boolean | null>;\r\n public obj: FormControl<UriNode | null>;\r\n public sid: FormControl<string | null>;\r\n public isSidPrefix: FormControl<boolean>;\r\n public tag: FormControl<string | null>;\r\n\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n public lookupService: GraphNodeLookupService,\r\n private _graphService: GraphService\r\n ) {\r\n // form\r\n this.pageNumber = formBuilder.control(1, { nonNullable: true });\r\n this.pageSize = formBuilder.control(10, { nonNullable: true });\r\n this.litPattern = formBuilder.control(null);\r\n this.litType = formBuilder.control(null);\r\n this.litLanguage = formBuilder.control(null);\r\n this.minLitNumber = formBuilder.control(null);\r\n this.maxLitNumber = formBuilder.control(null);\r\n\r\n this.subj = formBuilder.control(null);\r\n this.preds = formBuilder.control([], { nonNullable: true });\r\n this.isNotPred = formBuilder.control(false, { nonNullable: true });\r\n this.notPreds = formBuilder.control([], { nonNullable: true });\r\n this.hasLiteralObj = formBuilder.control(null);\r\n this.obj = formBuilder.control(null);\r\n this.sid = formBuilder.control(null);\r\n this.isSidPrefix = formBuilder.control(false, { nonNullable: true });\r\n this.tag = formBuilder.control(null);\r\n\r\n this.form = formBuilder.group({\r\n pageNumber: this.pageNumber,\r\n pageSize: this.pageSize,\r\n litPattern: this.litPattern,\r\n litType: this.litType,\r\n litLanguage: this.litLanguage,\r\n minLitNumber: this.minLitNumber,\r\n maxLitNumber: this.maxLitNumber,\r\n\r\n subj: this.subj,\r\n preds: this.preds,\r\n isNotPred: this.isNotPred,\r\n notPreds: this.notPreds,\r\n hasLiteralObj: this.hasLiteralObj,\r\n obj: this.obj,\r\n sid: this.sid,\r\n isSidPrefix: this.isSidPrefix,\r\n tag: this.tag,\r\n });\r\n\r\n effect(() => {\r\n this.updateForm(this.filter());\r\n });\r\n }\r\n\r\n private updateForm(filter: PagedTripleFilter): void {\r\n this.pageNumber.setValue(filter.pageNumber);\r\n this.pageSize.setValue(filter.pageSize);\r\n this.litPattern.setValue(filter.literalPattern || null);\r\n this.litType.setValue(filter.literalType || null);\r\n this.litLanguage.setValue(filter.literalLanguage || null);\r\n this.minLitNumber.setValue(filter.minLiteralNumber || null);\r\n this.maxLitNumber.setValue(filter.maxLiteralNumber || null);\r\n\r\n this.hasLiteralObj.setValue(filter.hasLiteralObject || null);\r\n this.sid.setValue(filter.sid || null);\r\n this.isSidPrefix.setValue(filter.isSidPrefix || false);\r\n this.tag.setValue(filter.tag || null);\r\n\r\n // load the referenced nodes so we can show them by label\r\n forkJoin({\r\n s: filter.subjectId\r\n ? this._graphService.getNode(filter.subjectId)\r\n : from([null]),\r\n p: filter.predicateIds?.length\r\n ? this._graphService.getNodeSet(filter.predicateIds)\r\n : from([]),\r\n o: filter.objectId\r\n ? this._graphService.getNode(filter.objectId)\r\n : from([null]),\r\n }).subscribe((result) => {\r\n this.subj.setValue(result.s);\r\n this.preds.setValue(result.p.filter((n) => n) as UriNode[]);\r\n this.obj.setValue(result.o);\r\n this.form.markAsPristine();\r\n });\r\n }\r\n\r\n private getFilter(): PagedTripleFilter {\r\n return {\r\n pageNumber: +this.pageNumber.value,\r\n pageSize: +this.pageSize.value,\r\n literalPattern: this.litPattern.value || undefined,\r\n literalType: this.litType.value || undefined,\r\n literalLanguage: this.litLanguage.value || undefined,\r\n minLiteralNumber: this.minLitNumber.value || undefined,\r\n maxLiteralNumber: this.maxLitNumber.value || undefined,\r\n\r\n subjectId: this.subj.value?.id || undefined,\r\n predicateIds: this.preds.value?.length\r\n ? this.preds.value.map((n) => n.id)\r\n : undefined,\r\n notPredicateIds: this.notPreds.value?.length\r\n ? this.notPreds.value.map((n) => n.id)\r\n : undefined,\r\n hasLiteralObject:\r\n this.hasLiteralObj.value !== null\r\n ? this.hasLiteralObj.value\r\n : undefined,\r\n objectId: this.obj.value?.id || undefined,\r\n sid: this.sid.value || undefined,\r\n isSidPrefix: this.isSidPrefix.value,\r\n tag: this.tag.value || undefined,\r\n };\r\n }\r\n\r\n public onPageChange(page: PageEvent): void {\r\n this.pageNumber.setValue(page.pageIndex + 1);\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public onSubjectNodeChange(node: unknown): void {\r\n this.subj.setValue(node as UriNode);\r\n }\r\n\r\n public onObjectNodeChange(node: unknown): void {\r\n this.obj.setValue(node as UriNode);\r\n }\r\n\r\n public onPredicateNodeChange(node: unknown): void {\r\n if (!node) {\r\n return;\r\n }\r\n const un = node as UriNode;\r\n if (this.isNotPred.value) {\r\n const nodes = [...this.notPreds.value];\r\n if (nodes.some((n) => n.id === un.id)) {\r\n return;\r\n }\r\n nodes.push(un);\r\n this.notPreds.setValue(nodes);\r\n this.notPreds.updateValueAndValidity();\r\n this.notPreds.markAsDirty();\r\n } else {\r\n const nodes = [...this.preds.value];\r\n if (nodes.some((n) => n.id === un.id)) {\r\n return;\r\n }\r\n nodes.push(un);\r\n this.preds.setValue(nodes);\r\n this.preds.updateValueAndValidity();\r\n this.preds.markAsDirty();\r\n }\r\n }\r\n\r\n public deleteNotPred(node: UriNode): void {\r\n const nodes = [...this.notPreds.value];\r\n const i = nodes.indexOf(node);\r\n nodes.splice(i, 1);\r\n this.notPreds.setValue(nodes);\r\n this.notPreds.updateValueAndValidity();\r\n this.notPreds.markAsDirty();\r\n }\r\n\r\n public deletePred(node: UriNode): void {\r\n const nodes = [...this.preds.value];\r\n const i = nodes.indexOf(node);\r\n nodes.splice(i, 1);\r\n this.preds.setValue(nodes);\r\n this.preds.updateValueAndValidity();\r\n this.preds.markAsDirty();\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public apply(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.filter.set(this.getFilter());\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" [attr.disabled]=\"disabled()\">\r\n <!-- paginator -->\r\n @if (hasPager()) {\r\n <mat-paginator\r\n [length]=\"total\"\r\n [pageSize]=\"pageSize.value || 10\"\r\n [pageSizeOptions]=\"[5, 10, 20]\"\r\n (page)=\"onPageChange($event)\"\r\n aria-label=\"Select page\"\r\n />\r\n }\r\n <mat-tab-group>\r\n <!-- TRIPLE -->\r\n <mat-tab label=\"triple\">\r\n <!-- subject ID -->\r\n <div>\r\n <cadmus-refs-lookup\r\n label=\"subject\"\r\n [service]=\"lookupService\"\r\n (itemChange)=\"onSubjectNodeChange($event)\"\r\n />\r\n </div>\r\n <!-- predicate IDs -->\r\n <div>\r\n <cadmus-refs-lookup\r\n label=\"predicate\"\r\n [service]=\"lookupService\"\r\n [baseFilter]=\"{ tag: 'property' }\"\r\n (itemChange)=\"onPredicateNodeChange($event)\"\r\n />\r\n <mat-checkbox [formControl]=\"isNotPred\">not</mat-checkbox>\r\n <!-- notPreds -->\r\n @if (isNotPred.value) {\r\n <div>\r\n <mat-list dense>\r\n @for (n of notPreds.value; track n.id) {\r\n <mat-list-item>\r\n <span>{{ n.label }}</span>\r\n <button type=\"button\" mat-icon-button (click)=\"deleteNotPred(n)\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n </div>\r\n }\r\n <!-- preds -->\r\n @if (!isNotPred.value) {\r\n <div>\r\n <mat-list dense>\r\n @for (n of preds.value; track n.id) {\r\n <mat-list-item>\r\n <span>{{ n.label }}</span>\r\n <button type=\"button\" mat-icon-button (click)=\"deletePred(n)\">\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n </mat-list-item>\r\n }\r\n </mat-list>\r\n </div>\r\n }\r\n </div>\r\n <!-- object ID -->\r\n <div>\r\n <cadmus-refs-lookup\r\n label=\"object\"\r\n [service]=\"lookupService\"\r\n (itemChange)=\"onObjectNodeChange($event)\"\r\n />\r\n </div>\r\n <!-- sid -->\r\n <div>\r\n <mat-form-field>\r\n <input\r\n matInput\r\n [formControl]=\"sid\"\r\n placeholder=\"sid\"\r\n maxlength=\"500\"\r\n />\r\n </mat-form-field>\r\n \r\n <mat-checkbox [formControl]=\"isSidPrefix\">prefix</mat-checkbox>\r\n </div>\r\n <!-- tag -->\r\n <div>\r\n <mat-form-field>\r\n <input\r\n matInput\r\n [formControl]=\"tag\"\r\n placeholder=\"tag\"\r\n maxlength=\"50\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n <!-- LITERAL -->\r\n <mat-tab label=\"literal\">\r\n <!-- litPattern -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litPattern\" placeholder=\"pattern\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litType -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litType\" placeholder=\"type\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litLanguage-->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litLanguage\" placeholder=\"language\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- minLitNumber, maxLitNumber -->\r\n <div>\r\n <mat-form-field style=\"width: 4em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"minLitNumber\"\r\n placeholder=\"min.\"\r\n />\r\n </mat-form-field>\r\n -\r\n <mat-form-field style=\"width: 4em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"maxLitNumber\"\r\n placeholder=\"max.\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </mat-tab>\r\n </mat-tab-group>\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"toolbar\"\r\n style=\"margin-bottom: 10px\"\r\n >\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n [disabled]=\"disabled()\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, effect, input, model } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { PageEvent, MatPaginator } from '@angular/material/paginator';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatSelect } from '@angular/material/select';\r\nimport { MatOption } from '@angular/material/core';\r\nimport { MatCheckbox } from '@angular/material/checkbox';\r\nimport {\r\n MatChipListbox,\r\n MatChipOption,\r\n MatChipRemove,\r\n} from '@angular/material/chips';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatIconButton } from '@angular/material/button';\r\n\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { GraphNodeLookupService } from '@myrmidon/cadmus-graph-ui';\r\nimport { GraphService, UriNode, NodeSourceType } from '@myrmidon/cadmus-api';\r\n\r\nimport { PagedLinkedNodeFilter } from '../../graph-walker';\r\n\r\n/**\r\n * Linked non-literal node filter.\r\n */\r\n@Component({\r\n selector: 'cadmus-walker-linked-node-filter',\r\n templateUrl: './linked-node-filter.component.html',\r\n styleUrls: ['./linked-node-filter.component.css'],\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatPaginator,\r\n MatFormField,\r\n MatInput,\r\n MatSelect,\r\n MatOption,\r\n MatCheckbox,\r\n RefLookupComponent,\r\n MatChipListbox,\r\n MatChipOption,\r\n MatTooltip,\r\n MatChipRemove,\r\n MatIcon,\r\n MatIconButton,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LinkedNodeFilterComponent {\r\n /**\r\n * True if this component is disabled.\r\n */\r\n public readonly disabled = input<boolean>();\r\n\r\n /**\r\n * True if this component should show a pager.\r\n */\r\n public readonly hasPager = input<boolean>(false);\r\n\r\n /**\r\n * The total number of nodes returned from the last\r\n * page fetch operation. Used when hasPager is true.\r\n */\r\n public readonly total = input<number>(0);\r\n\r\n /**\r\n * The filter.\r\n */\r\n public readonly filter = model<PagedLinkedNodeFilter>({\r\n pageNumber: 1,\r\n pageSize: 10,\r\n otherNodeId: 0,\r\n predicateId: 0,\r\n });\r\n\r\n public otherNodeId: number;\r\n public predicateId: number;\r\n public isObject: boolean;\r\n\r\n public pageNumber: FormControl<number>;\r\n public pageSize: FormControl<number>;\r\n public uid: FormControl<string | null>;\r\n public isClass: FormControl<boolean | null>;\r\n public tag: FormControl<string | null>;\r\n public label: FormControl<string | null>;\r\n public sourceType: FormControl<NodeSourceType | null>;\r\n public sid: FormControl<string | null>;\r\n public isSidPrefix: FormControl<boolean>;\r\n public classes: FormControl<UriNode[]>;\r\n\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n public lookupService: GraphNodeLookupService,\r\n private _graphService: GraphService\r\n ) {\r\n this.otherNodeId = 0;\r\n this.predicateId = 0;\r\n this.isObject = false;\r\n // form\r\n this.pageNumber = formBuilder.control(1, { nonNullable: true });\r\n this.pageSize = formBuilder.control(10, { nonNullable: true });\r\n this.uid = formBuilder.control(null);\r\n this.isClass = formBuilder.control(null);\r\n this.tag = formBuilder.control(null);\r\n this.label = formBuilder.control(null);\r\n this.sourceType = formBuilder.control(null);\r\n this.sid = formBuilder.control(null);\r\n this.isSidPrefix = formBuilder.control(false, { nonNullable: true });\r\n this.classes = formBuilder.control([], { nonNullable: true });\r\n\r\n this.form = formBuilder.group({\r\n pageNumber: this.pageNumber,\r\n pageSize: this.pageSize,\r\n uid: this.uid,\r\n isClass: this.isClass,\r\n tag: this.tag,\r\n label: this.label,\r\n sourceType: this.sourceType,\r\n sid: this.sid,\r\n isSidPrefix: this.isSidPrefix,\r\n classes: this.classes,\r\n });\r\n\r\n effect(() => {\r\n this.updateForm(this.filter());\r\n });\r\n }\r\n\r\n private updateForm(filter: PagedLinkedNodeFilter): void {\r\n this.otherNodeId = filter.otherNodeId;\r\n this.predicateId = filter.predicateId;\r\n this.isObject = filter.isObject || false;\r\n\r\n this.pageNumber.setValue(filter.pageNumber);\r\n this.pageSize.setValue(filter.pageSize);\r\n this.uid.setValue(filter.uid || null);\r\n this.isClass.setValue(filter.isClass || null);\r\n this.tag.setValue(filter.tag || null);\r\n this.label.setValue(filter.label || null);\r\n this.sourceType.setValue(filter.sourceType || null);\r\n this.sid.setValue(filter.sid || null);\r\n this.isSidPrefix.setValue(filter.isSidPrefix || false);\r\n\r\n // load the referenced class nodes so we can show them by label\r\n if (filter.classIds?.length) {\r\n this._graphService\r\n .getNodeSet(filter.classIds)\r\n .pipe(take(1))\r\n .subscribe((nodes) => {\r\n this.classes.setValue(nodes.filter((n) => n) as UriNode[]);\r\n this.form.markAsPristine();\r\n });\r\n } else {\r\n this.classes.setValue([]);\r\n this.form.markAsPristine();\r\n }\r\n }\r\n\r\n private getFilter(): PagedLinkedNodeFilter {\r\n return {\r\n pageNumber: +this.pageNumber.value,\r\n pageSize: +this.pageSize.value,\r\n uid: this.uid.value || undefined,\r\n isClass: this.isClass.value || undefined,\r\n tag: this.tag.value || undefined,\r\n label: this.label.value || undefined,\r\n sourceType: this.sourceType.value || undefined,\r\n sid: this.sid.value || undefined,\r\n isSidPrefix: this.isSidPrefix.value ? true : undefined,\r\n classIds: this.classes.value.length\r\n ? this.classes.value.map((n) => n.id)\r\n : undefined,\r\n otherNodeId: this.otherNodeId,\r\n predicateId: this.predicateId,\r\n isObject: this.isObject,\r\n };\r\n }\r\n\r\n public onPageChange(page: PageEvent): void {\r\n this.pageNumber.setValue(page.pageIndex + 1);\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public onClassAdd(node: unknown): void {\r\n if (!node) {\r\n return;\r\n }\r\n const nodes = [...this.classes.value];\r\n nodes.push(node as UriNode);\r\n this.classes.setValue(nodes);\r\n this.classes.updateValueAndValidity();\r\n this.classes.markAsDirty();\r\n }\r\n\r\n public onClassRemove(node: UriNode): void {\r\n const nodes = [...this.classes.value];\r\n const i = nodes.indexOf(node);\r\n if (i > -1) {\r\n nodes.splice(i, 1);\r\n this.classes.setValue(nodes);\r\n this.classes.updateValueAndValidity();\r\n this.classes.markAsDirty();\r\n }\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public apply(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.filter.set(this.getFilter());\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" [attr.disabled]=\"disabled()\">\r\n <!-- paginator -->\r\n @if (hasPager()) {\r\n <mat-paginator\r\n [length]=\"total\"\r\n [pageSize]=\"pageSize.value || 10\"\r\n [pageSizeOptions]=\"[5, 10, 20]\"\r\n (page)=\"onPageChange($event)\"\r\n aria-label=\"Select page\"\r\n />\r\n }\r\n\r\n <!-- label -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"label\" placeholder=\"label\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- uid -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"uid\" placeholder=\"UID\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- isClass -->\r\n <div>\r\n <mat-form-field>\r\n <mat-select [formControl]=\"isClass\" placeholder=\"class\">\r\n <mat-option [value]=\"0\">(any)</mat-option>\r\n <mat-option [value]=\"1\">not-class</mat-option>\r\n <mat-option [value]=\"2\">class</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <!-- tag -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"tag\" placeholder=\"tag\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- sourceType -->\r\n <div>\r\n <mat-form-field>\r\n <mat-select [formControl]=\"sourceType\" placeholder=\"source type\">\r\n <mat-option [value]=\"null\">(any)</mat-option>\r\n <mat-option [value]=\"0\">user</mat-option>\r\n <mat-option [value]=\"1\">item</mat-option>\r\n <mat-option [value]=\"2\">part</mat-option>\r\n <mat-option [value]=\"3\">thesaurus</mat-option>\r\n <mat-option [value]=\"4\">implicit</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- sid -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"sid\" placeholder=\"SID\" />\r\n </mat-form-field>\r\n\r\n <!-- isSidPrefix -->\r\n <mat-checkbox [formControl]=\"isSidPrefix\">prefix</mat-checkbox>\r\n </div>\r\n </div>\r\n <!-- classes -->\r\n <div>\r\n <fieldset>\r\n <legend>classes</legend>\r\n <cadmus-refs-lookup\r\n label=\"class\"\r\n [service]=\"lookupService\"\r\n [baseFilter]=\"{ isClass: true }\"\r\n (itemChange)=\"onClassAdd($event)\"\r\n />\r\n\r\n @if (classes.value.length) {\r\n <mat-chip-listbox>\r\n @for (node of classes.value; track node.id) {\r\n <mat-chip-option\r\n [removable]=\"true\"\r\n (removed)=\"onClassRemove(node)\"\r\n matTooltip=\"{{ node.uri }}\"\r\n >{{ node.label }}\r\n <button type=\"button\" matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-option>\r\n }\r\n </mat-chip-listbox>\r\n }\r\n </fieldset>\r\n </div>\r\n\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"toolbar\"\r\n style=\"margin-bottom: 10px\"\r\n >\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n [disabled]=\"disabled()\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { ChangeDetectionStrategy, Component, effect, input, model } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n} from '@angular/forms';\r\nimport { forkJoin, from } from 'rxjs';\r\n\r\nimport { MatFormField } from '@angular/material/form-field';\r\nimport { MatInput } from '@angular/material/input';\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { PageEvent, MatPaginator } from '@angular/material/paginator';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { MatIcon } from '@angular/material/icon';\r\n\r\nimport { RefLookupComponent } from '@myrmidon/cadmus-refs-lookup';\r\n\r\nimport { GraphNodeLookupService } from '@myrmidon/cadmus-graph-ui';\r\nimport { GraphService, UriNode } from '@myrmidon/cadmus-api';\r\n\r\nimport { PagedLinkedLiteralFilter } from '../../graph-walker';\r\n\r\n/**\r\n * Linked literal filter.\r\n */\r\n@Component({\r\n selector: 'cadmus-walker-linked-literal-filter',\r\n templateUrl: './linked-literal-filter.component.html',\r\n styleUrls: ['./linked-literal-filter.component.css'],\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatPaginator,\r\n RefLookupComponent,\r\n MatFormField,\r\n MatInput,\r\n MatIconButton,\r\n MatTooltip,\r\n MatIcon,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LinkedLiteralFilterComponent {\r\n /**\r\n * True if this component is disabled.\r\n */\r\n public readonly disabled = input<boolean>();\r\n\r\n /**\r\n * True if this component should show a pager.\r\n */\r\n public readonly hasPager = input<boolean>();\r\n\r\n /**\r\n * The total number of triples returned from the last\r\n * page fetch operation. Used when hasPager is true.\r\n */\r\n public readonly total = input<number>(0);\r\n\r\n /**\r\n * The filter.\r\n */\r\n public readonly filter = model<PagedLinkedLiteralFilter>({\r\n pageNumber: 1,\r\n pageSize: 10,\r\n });\r\n\r\n public pageNumber: FormControl<number>;\r\n public pageSize: FormControl<number>;\r\n public litPattern: FormControl<string | null>;\r\n public litType: FormControl<string | null>;\r\n public litLanguage: FormControl<string | null>;\r\n public minLitNumber: FormControl<number | null>;\r\n public maxLitNumber: FormControl<number | null>;\r\n\r\n public subj: FormControl<UriNode | null>;\r\n public pred: FormControl<UriNode | null>;\r\n\r\n public form: FormGroup;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n public lookupService: GraphNodeLookupService,\r\n private _graphService: GraphService\r\n ) {\r\n this.pageNumber = formBuilder.control(1, { nonNullable: true });\r\n this.pageSize = formBuilder.control(10, { nonNullable: true });\r\n this.litPattern = formBuilder.control(null);\r\n this.litType = formBuilder.control(null);\r\n this.litLanguage = formBuilder.control(null);\r\n this.minLitNumber = formBuilder.control(null);\r\n this.maxLitNumber = formBuilder.control(null);\r\n\r\n this.subj = formBuilder.control(null);\r\n this.pred = formBuilder.control(null);\r\n\r\n this.form = formBuilder.group({\r\n pageNumber: this.pageNumber,\r\n pageSize: this.pageSize,\r\n litPattern: this.litPattern,\r\n litType: this.litType,\r\n litLanguage: this.litLanguage,\r\n minLitNumber: this.minLitNumber,\r\n maxLitNumber: this.maxLitNumber,\r\n subj: this.subj,\r\n pred: this.pred,\r\n });\r\n\r\n effect(() => {\r\n this.updateForm(this.filter());\r\n });\r\n }\r\n\r\n private updateForm(filter: PagedLinkedLiteralFilter): void {\r\n this.pageNumber.setValue(filter.pageNumber);\r\n this.pageSize.setValue(filter.pageSize);\r\n this.litPattern.setValue(filter.literalPattern || null);\r\n this.litType.setValue(filter.literalType || null);\r\n this.litLanguage.setValue(filter.literalLanguage || null);\r\n this.minLitNumber.setValue(filter.minLiteralNumber || null);\r\n this.maxLitNumber.setValue(filter.maxLiteralNumber || null);\r\n\r\n // load the referenced triples so we can show them by label\r\n forkJoin({\r\n s: filter.subjectId\r\n ? this._graphService.getNode(filter.subjectId)\r\n : from([null]),\r\n p: filter.predicateId\r\n ? this._graphService.getNode(filter.predicateId)\r\n : from([]),\r\n }).subscribe((result) => {\r\n this.subj.setValue(result.s);\r\n this.pred.setValue(result.p);\r\n this.form.markAsPristine();\r\n });\r\n }\r\n\r\n private getFilter(): PagedLinkedLiteralFilter {\r\n return {\r\n pageNumber: +this.pageNumber.value,\r\n pageSize: +this.pageSize.value,\r\n literalPattern: this.litPattern.value || undefined,\r\n literalType: this.litType.value || undefined,\r\n literalLanguage: this.litLanguage.value || undefined,\r\n minLiteralNumber: this.minLitNumber.value || undefined,\r\n maxLiteralNumber: this.maxLitNumber.value || undefined,\r\n\r\n subjectId: this.subj.value?.id,\r\n predicateId: this.pred.value?.id,\r\n };\r\n }\r\n\r\n public onSubjectNodeChange(node: unknown): void {\r\n this.subj.setValue(node as UriNode);\r\n }\r\n\r\n public onPredicateNodeChange(node: unknown): void {\r\n this.pred.setValue(node as UriNode);\r\n }\r\n\r\n public onPageChange(page: PageEvent): void {\r\n this.pageNumber.setValue(page.pageIndex + 1);\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public reset(): void {\r\n this.form.reset();\r\n this.filter.set(this.getFilter());\r\n }\r\n\r\n public apply(): void {\r\n if (this.form.invalid) {\r\n return;\r\n }\r\n this.filter.set(this.getFilter());\r\n this.form.markAsPristine();\r\n }\r\n}\r\n","<form [formGroup]=\"form\" (submit)=\"apply()\" [attr.disabled]=\"disabled()\">\r\n <!-- paginator -->\r\n @if (hasPager()) {\r\n <mat-paginator\r\n [length]=\"total()\"\r\n [pageSize]=\"pageSize.value || 10\"\r\n [pageSizeOptions]=\"[5, 10, 20]\"\r\n (page)=\"onPageChange($event)\"\r\n aria-label=\"Select page\"\r\n />\r\n }\r\n\r\n <!-- subject ID -->\r\n <div>\r\n <cadmus-refs-lookup\r\n label=\"subject\"\r\n [service]=\"lookupService\"\r\n (itemChange)=\"onSubjectNodeChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- predicate ID -->\r\n <div>\r\n <cadmus-refs-lookup\r\n label=\"predicate\"\r\n [service]=\"lookupService\"\r\n [baseFilter]=\"{ tag: 'property' }\"\r\n (itemChange)=\"onPredicateNodeChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- LITERAL -->\r\n <!-- litPattern -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litPattern\" placeholder=\"pattern\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litType -->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litType\" placeholder=\"type\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- litLanguage-->\r\n <div>\r\n <mat-form-field>\r\n <input matInput [formControl]=\"litLanguage\" placeholder=\"language\" />\r\n </mat-form-field>\r\n </div>\r\n <!-- minLitNumber, maxLitNumber -->\r\n <div>\r\n <mat-form-field style=\"width: 5em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"minLitNumber\"\r\n placeholder=\"min.\"\r\n />\r\n </mat-form-field>\r\n -\r\n <mat-form-field style=\"width: 5em\">\r\n <input\r\n matInput\r\n type=\"number\"\r\n [formControl]=\"maxLitNumber\"\r\n placeholder=\"max.\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n <div\r\n class=\"btn-group\"\r\n role=\"group\"\r\n aria-label=\"toolbar\"\r\n style=\"margin-bottom: 10px\"\r\n >\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"reset()\"\r\n matTooltip=\"Reset filters\"\r\n [disabled]=\"disabled()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n mat-icon-button\r\n [disabled]=\"disabled()\"\r\n matTooltip=\"Apply filters\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n </div>\r\n</form>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { GraphNode } from '../graph-interfaces';\r\n\r\n/**\r\n * Get the extended label for the specified graph node. This returns the label\r\n * for N nodes, and the uri + \"=\" + the label for P nodes. That's because P\r\n * nodes label is just the count of the triples group, so the predicate ID is\r\n * got from the property node's data uri.\r\n */\r\n@Pipe({ name: 'graphNodeLabel' })\r\nexport class GraphNodeLabelPipe implements PipeTransform {\r\n transform(value: unknown, ...args: unknown[]): unknown {\r\n const node = value as GraphNode;\r\n if (!node?.id || !node?.label) {\r\n return value;\r\n }\r\n if (node.id.startsWith('P') && node.data.uri) {\r\n return `${node.data.uri}=${node.label}`;\r\n }\r\n return node.label;\r\n }\r\n}\r\n","import { BehaviorSubject, forkJoin, Observable } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\n\r\nimport { Edge, GraphNode } from './graph-interfaces';\r\n\r\nimport {\r\n GraphService,\r\n LinkedLiteralFilter,\r\n LinkedNodeFilter,\r\n NodeSourceType,\r\n TripleFilter,\r\n TripleGroup,\r\n UriNode,\r\n UriTriple,\r\n} from '@myrmidon/cadmus-api';\r\n\r\nexport interface PagedTripleFilter extends TripleFilter {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface PagedLinkedLiteralFilter extends LinkedLiteralFilter {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface PagedLinkedNodeFilter extends LinkedNodeFilter {\r\n pageNumber: number;\r\n pageSize: number;\r\n}\r\n\r\n// #region Shapes\r\n// All these shapes will be the data property of a Node/Edge in ngx-graph.\r\n\r\n/**\r\n * Essential graph walker data.\r\n */\r\nexport interface WalkerData {\r\n originId: string;\r\n // https://github.com/swimlane/ngx-graph/issues/312\r\n customColor?: string;\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Graph walker widget data, i.e. a node or a property group.\r\n */\r\nexport interface WalkerWidgetData extends WalkerData {\r\n selected?: boolean;\r\n expanded?: boolean;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Graph walker node data.\r\n * ID: \"N\" + nodeid (e.g. \"N3\").\r\n */\r\nexport interface WalkerNodeData extends WalkerWidgetData {\r\n uri: string;\r\n sourceType: NodeSourceType;\r\n isClass?: boolean;\r\n sid?: string;\r\n tag?: string;\r\n outFilter: PagedTripleFilter;\r\n inFilter: PagedTripleFilter;\r\n outTotal?: number;\r\n inTotal?: number;\r\n}\r\n\r\n/**\r\n * Graph walker property group data.\r\n * ID: \"P\" + propertyid + \"N\" + source nodeid (\"P2N3\").\r\n */\r\nexport interface WalkerPropData extends WalkerWidgetData {\r\n uri: string;\r\n outFilter: PagedLinkedNodeFilter;\r\n inFilter: PagedLinkedNodeFilter;\r\n litFilter: PagedLinkedLiteralFilter;\r\n outTotal?: number;\r\n inTotal?: number;\r\n litTotal?: number;\r\n}\r\n\r\n/**\r\n * Graph walker literal node data.\r\n * ID: \"L\" + tripleid (e.g. \"L5\").\r\n */\r\nexport interface WalkerLitData extends WalkerWidgetData {\r\n value: string;\r\n type?: string;\r\n language?: string;\r\n number?: number;\r\n}\r\n\r\n/**\r\n * The total counts of items fetched by each children graph nodes filter.\r\n */\r\nexport interface NodeChildTotals {\r\n pOut: number;\r\n pIn: number;\r\n pLit: number;\r\n nOut: number;\r\n nIn: number;\r\n}\r\n//#endregion\r\n\r\n/**\r\n * Graph walker.\r\n * This class encapsulates data used for interactively exploring a graph\r\n * starting from a designated origin node.\r\n */\r\nexport class GraphWalker {\r\n private readonly _nodes$: BehaviorSubject<GraphNode[]>;\r\n private readonly _edges$: BehaviorSubject<Edge[]>;\r\n private readonly _loading$: BehaviorSubject<boolean>;\r\n private readonly _error$: BehaviorSubject<string | null>;\r\n private _rootNode?: GraphNode;\r\n\r\n private readonly _selectedNode$: BehaviorSubject<GraphNode | null>;\r\n private readonly _pOutFilter$: BehaviorSubject<PagedLinkedNodeFilter | null>;\r\n private readonly _pInFilter$: BehaviorSubject<PagedLinkedNodeFilter | null>;\r\n private readonly _pLitFilter$: BehaviorSubject<PagedLinkedLiteralFilter | null>;\r\n private readonly _nOutFilter$: BehaviorSubject<PagedTripleFilter | null>;\r\n private readonly _nInFilter$: BehaviorSubject<PagedTripleFilter | null>;\r\n private readonly _childTotals$: BehaviorSubject<NodeChildTotals>;\r\n\r\n /**\r\n * The page size. Default is 10.\r\n */\r\n public pageSize: number;\r\n\r\n /**\r\n * Max length of literal value to show. Default is 30.\r\n */\r\n public maxLiteralLen: number;\r\n\r\n /**\r\n * The nodes of the walker graph, which can represent nodes, literals,\r\n * or property groups. You can easily determine the type of each node\r\n * by looking at the first character of its id (N=node, L=literal,\r\n * P=property).\r\n */\r\n public get nodes$(): Observable<GraphNode[]> {\r\n return this._nodes$.asObservable();\r\n }\r\n\r\n /**\r\n * The edges connecting nodes.\r\n */\r\n public get edges$(): Observable<Edge[]> {\r\n return this._edges$.asObservable();\r\n }\r\n\r\n /**\r\n * True if the walker is loading data.\r\n */\r\n public get loading$(): Observable<boolean> {\r\n return this._loading$.asObservable();\r\n }\r\n\r\n /**\r\n * The last error occurred in communicating with the server, if any.\r\n */\r\n public get error$(): Observable<string | null> {\r\n return this._error$.asObservable();\r\n }\r\n\r\n /**\r\n * The selected node. Only one node at a time can be selected.\r\n */\r\n public get selectedNode$(): Observable<GraphNode | null> {\r\n return this._selectedNode$.asObservable();\r\n }\r\n /**\r\n * The outbound linked nodes filter for the selected P node.\r\n */\r\n public get pOutFilter$(): Observable<PagedLinkedNodeFilter | null> {\r\n return this._pOutFilter$.asObservable();\r\n }\r\n /**\r\n * The inbound linked nodes filter for the selected P node.\r\n */\r\n public get pInFilter$(): Observable<PagedLinkedNodeFilter | null> {\r\n return this._pInFilter$.asObservable();\r\n }\r\n /**\r\n * The literal linked nodes filter for the selected P node.\r\n */\r\n public get pLitFilter$(): Observable<PagedLinkedLiteralFilter | null> {\r\n return this._pLitFilter$.asObservable();\r\n }\r\n /**\r\n * The outbound triples filter for the selected N node.\r\n */\r\n public get nOutFilter$(): Observable<PagedTripleFilter | null> {\r\n return this._nOutFilter$.asObservable();\r\n }\r\n /**\r\n * The inbound triples filter for the selected N node.\r\n */\r\n public get nInFilter$(): Observable<PagedTripleFilter | null> {\r\n return this._nInFilter$.asObservable();\r\n }\r\n /**\r\n * The total items fetched for each filter of the selected node.\r\n */\r\n public get childTotals$(): Observable<NodeChildTotals> {\r\n return this._childTotals$.asObservable();\r\n }\r\n\r\n constructor(private _graphService: GraphService) {\r\n this._nodes$ = new BehaviorSubject<GraphNode[]>([]);\r\n this._edges$ = new BehaviorSubject<Edge[]>([]);\r\n this._loading$ = new BehaviorSubject<boolean>(false);\r\n this._error$ = new BehaviorSubject<string | null>(null);\r\n this._selectedNode$ = new BehaviorSubject<GraphNode | null>(null);\r\n this._pOutFilter$ = new BehaviorSubject<PagedLinkedNodeFilter | null>(null);\r\n this._pInFilter$ = new BehaviorSubject<PagedLinkedNodeFilter | null>(null);\r\n this._pLitFilter$ = new BehaviorSubject<PagedLinkedLiteralFilter | null>(\r\n null\r\n );\r\n this._nOutFilter$ = new BehaviorSubject<PagedTripleFilter | null>(null);\r\n this._nInFilter$ = new BehaviorSubject<PagedTripleFilter | null>(null);\r\n this._childTotals$ = new BehaviorSubject<NodeChildTotals>({\r\n nOut: 0,\r\n nIn: 0,\r\n pOut: 0,\r\n pIn: 0,\r\n pLit: 0,\r\n });\r\n // defaults\r\n this.pageSize = 10;\r\n this.maxLiteralLen = 30;\r\n }\r\n\r\n public getSelectedNode(): GraphNode | null {\r\n return this._selectedNode$.value;\r\n }\r\n\r\n private toggleLoading(on: boolean): void {\r\n if (on) {\r\n this._error$.next(null);\r\n this._loading$.next(true);\r\n } else {\r\n this._loading$.next(false);\r\n }\r\n }\r\n\r\n private setError(error: any): void {\r\n if (error) {\r\n if (typeof error === 'string') {\r\n this._error$.next(error);\r\n console.error(error);\r\n } else {\r\n this._error$.next('Walker error');\r\n console.error('Walker error', error);\r\n }\r\n } else {\r\n this._error$.next('Walker error');\r\n }\r\n }\r\n\r\n private buildNodeId(id: number): string {\r\n return `N${id}`;\r\n }\r\n\r\n /**\r\n * Get the numeric ID of the data node being the source of the graph node\r\n * with the specified ID.\r\n *\r\n * @param id The graph node ID (...N + its data node numeric ID)\r\n * @returns The data node numeric ID.\r\n */\r\n private getNodeNumericId(id: string): number {\r\n const i = id.indexOf('N');\r\n return i === -1 ? 0 : +id.substring(i + 1);\r\n }\r\n\r\n private getPredicateNumericId(id: string): number {\r\n const i = id.indexOf('P');\r\n const j = id.indexOf('N');\r\n return i === -1 ? 0 : +id.substring(i + 1, j);\r\n }\r\n\r\n private buildEdgeId(source: string, target: string): string {\r\n return `E${source}_${target}`;\r\n }\r\n\r\n private buildPropertyId(predicateId: number, nodeId: number): string {\r\n return `P${predicateId}N${nodeId}`;\r\n }\r\n\r\n private buildLiteralId(tripleId: number): string {\r\n return `L${tripleId}`;\r\n }\r\n\r\n private addEdgeIfAbsent(edge: Edge, edges: Edge[]): void {\r\n const id = edge.id!;\r\n if (edges.some((e) => e.id === id)) {\r\n return;\r\n }\r\n const i = id.indexOf('_');\r\n if (i > -1) {\r\n const invId = 'E' + id.substring(i + 1) + '_' + id.substring(1, i);\r\n if (edges.some((e) => e.id === invId)) {\r\n return;\r\n }\r\n }\r\n edges.push(edge);\r\n }\r\n\r\n private resetFilters(): void {\r\n this._nOutFilter$.next(null);\r\n this._nInFilter$.next(null);\r\n this._pOutFilter$.next(null);\r\n this._pInFilter$.next(null);\r\n this._pLitFilter$.next(null);\r\n this._childTotals$.next({\r\n nOut: 0,\r\n nIn: 0,\r\n pOut: 0,\r\n pIn: 0,\r\n pLit: 0,\r\n });\r\n }\r\n\r\n /**\r\n * Select the specified node. This also implies updating all the current\r\n * filters, which depend on the selected node.\r\n *\r\n * @param id The node ID or null to deselect the selected node.\r\n */\r\n public selectNode(id: string | null): void {\r\n const node = id ? this._nodes$.value.find((n) => n.id === id) : null;\r\n if (!node) {\r\n this._selectedNode$.next(null);\r\n this.resetFilters();\r\n return;\r\n }\r\n // deselect\r\n const old = this._nodes$.value.find((n) => n.data?.selected);\r\n if (old) {\r\n old.data.selected = undefined;\r\n }\r\n // select\r\n node.data.selected = true;\r\n this._selectedNode$.next(node);\r\n\r\n switch (node.id.charAt(0)) {\r\n case 'N': // non-literal node\r\n const nd = node.data as WalkerNodeData;\r\n this._nOutFilter$.next(nd.outFilter);\r\n this._nInFilter$.next(nd.inFilter);\r\n this._pOutFilter$.next(null);\r\n this._pInFilter$.next(null);\r\n this._pLitFilter$.next(null);\r\n this._childTotals$.next({\r\n nOut: nd.outTotal || 0,\r\n nIn: nd.inTotal || 0,\r\n pOut: 0,\r\n pIn: 0,\r\n pLit: 0,\r\n });\r\n break;\r\n case 'P': // props group\r\n const pd = node.data as WalkerPropData;\r\n this._nOutFilter$.next(null);\r\n this._nInFilter$.next(null);\r\n this._pOutFilter$.next(pd.outFilter);\r\n this._pInFilter$.next(pd.inFilter);\r\n this._pLitFilter$.next(pd.litFilter);\r\n this._childTotals$.next({\r\n nOut: 0,\r\n nIn: 0,\r\n pOut: pd.outTotal || 0,\r\n pIn: pd.inTotal || 0,\r\n pLit: pd.litTotal || 0,\r\n });\r\n break;\r\n case 'L': // literal node\r\n this.resetFilters();\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Reset the graph setting its origin to the specified node.\r\n *\r\n * @param id The ID of the origin node to start from (\"root origin\").\r\n */\r\n public reset(id: number): void {\r\n this.toggleLoading(true);\r\n this._graphService\r\n .getNode(id)\r\n .pipe(take(1))\r\n .subscribe({\r\n next: (node) => {\r\n const nodes: GraphNode[] = [];\r\n const data: WalkerNodeData = {\r\n uri: node.uri,\r\n sourceType: node.sourceType,\r\n originId: '', // root origin\r\n customColor: '#F89427',\r\n outFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n },\r\n inFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n },\r\n sid: node.sid,\r\n };\r\n const n: GraphNode = {\r\n id: this.buildNodeId(node.id),\r\n label: node.label || node.uri,\r\n data: data,\r\n };\r\n nodes.push(n);\r\n this._rootNode = n;\r\n\r\n this._edges$.next([]);\r\n this._nodes$.next(nodes);\r\n this.expandNode(n);\r\n },\r\n error: (error) => {\r\n this.setError(error);\r\n },\r\n complete: () => {\r\n this.toggleLoading(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Get the source and target graph nodes IDs from the specified edge ID.\r\n *\r\n * @param edgeId The ID of the edge graph node.\r\n * @returns IDs of the source and target graph nodes.\r\n */\r\n private getEdgeEndIds(edgeId: string): string[] | null {\r\n const m = new RegExp('^E([^_]+)_(.+)$').exec(edgeId);\r\n return m ? [m[1], m[2]] : null;\r\n }\r\n\r\n /**\r\n * Remove all the nodes with the specified origin node ID.\r\n *\r\n * @param originId The ID of the origin graph node.\r\n * @param nodes The nodes array to remove nodes from.\r\n * @param removedIds The IDs of all the removed nodes.\r\n */\r\n private removeDescendantNodes(\r\n originId: string,\r\n nodes: GraphNode[],\r\n removedIds: Set<string>\r\n ) {\r\n const ids = new Set<string>();\r\n for (let i = nodes.length - 1; i > -1; i--) {\r\n if (nodes[i].data.originId === originId) {\r\n ids.add(nodes[i].id);\r\n nodes.splice(i, 1);\r\n }\r\n }\r\n\r\n // recurse for each removed node\r\n // (edges never derive from other edges directly)\r\n ids.forEach((id) => {\r\n this.removeDescendantNodes(id, nodes, removedIds);\r\n });\r\n\r\n // update the received IDs set\r\n ids.forEach((id) => {\r\n removedIds.add(id);\r\n });\r\n }\r\n\r\n /**\r\n * Remove all the children graph nodes of the specified origin graph node.\r\n *\r\n * @param originId The ID of the origin graph node.\r\n * @param nodes The nodes array to remove nodes from.\r\n * @param edges The edges array to remove edges from.\r\n */\r\n private removeChildren(\r\n originId: string,\r\n nodes: GraphNode[],\r\n edges: Edge[]\r\n ): void {\r\n const selectedId = this._selectedNode$.value?.id;\r\n\r\n // remove all the nodes whose origin ID matches,\r\n // collecting their IDs\r\n const removedIds: Set<string> = new Set<string>();\r\n this.removeDescendantNodes(originId, nodes, removedIds);\r\n\r\n // remove all the affected edges\r\n for (let i = edges.length - 1; i > -1; i--) {\r\n const endIds = this.getEdgeEndIds(edges[i].id!);\r\n if (\r\n endIds?.length &&\r\n (removedIds.has(endIds[0]) || removedIds.has(endIds[1]))\r\n ) {\r\n edges.splice(i, 1);\r\n }\r\n }\r\n\r\n // if the removed node was the selected one, select the root origin\r\n if (selectedId && removedIds.has(selectedId)) {\r\n this.selectNode(this._rootNode!.id);\r\n }\r\n }\r\n\r\n /**\r\n * Build a new graph node representing a property.\r\n *\r\n * @param sourceId The source node ID.\r\n * @param group The triple group emitting this node.\r\n * @returns A new graph node.\r\n */\r\n private buildPropertyNode(sourceId: string, group: TripleGroup): GraphNode {\r\n const nid = this.getNodeNumericId(sourceId);\r\n const data: WalkerPropData = {\r\n originId: sourceId,\r\n uri: group.predicateUri,\r\n customColor: '#FF5619',\r\n outFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n otherNodeId: nid,\r\n predicateId: group.predicateId,\r\n },\r\n inFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n otherNodeId: nid,\r\n predicateId: group.predicateId,\r\n },\r\n litFilter: {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n predicateId: group.predicateId,\r\n },\r\n };\r\n\r\n return {\r\n id: this.buildPropertyId(group.predicateId, nid),\r\n label: group.count.toString(),\r\n data: data,\r\n };\r\n }\r\n\r\n /**\r\n * Expand the specified node, by loading its property groups.\r\n *\r\n * @param node The node to expand.\r\n * @param outFilter The properties to update for the output filter.\r\n * @param inFilter The properties to update for the input filter.\r\n */\r\n public expandNode(\r\n node: GraphNode,\r\n outFilter?: Partial<PagedTripleFilter> | null,\r\n inFilter?: Partial<PagedTripleFilter> | null\r\n ): void {\r\n // prepare filters\r\n const nid = this.getNodeNumericId(node.id);\r\n // outbound: node=S\r\n const outf: PagedTripleFilter = outFilter\r\n ? Object.assign(node.data.outFilter, outFilter, {\r\n subjectId: nid,\r\n })\r\n : {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n subjectId: nid,\r\n };\r\n // inbound: node=O\r\n const inf: PagedTripleFilter = inFilter\r\n ? Object.assign(node.data.inFilter, inFilter, {\r\n objectId: nid,\r\n })\r\n : {\r\n pageNumber: 1,\r\n pageSize: this.pageSize,\r\n objectId: nid,\r\n };\r\n\r\n // load\r\n this.toggleLoading(true);\r\n const nodes = [...this._nodes$.value];\r\n const edges = [...this._edges$.value];\r\n\r\n forkJoin({\r\n outs: this._graphService.getTripleGroups(\r\n outf.pageNumber,\r\n outf.pageSize,\r\n outf\r\n ),\r\n ins: this._graphService.getTripleGroups(\r\n inf.pageNumber,\r\n inf.pageSize,\r\n inf\r\n ),\r\n }).subscribe({\r\n next: (result) => {\r\n node.data.expanded = true;\r\n\r\n // update origin's filters\r\n node.data.outFilter = outf;\r\n node.data.inFilter = inf;\r\n\r\n // remove previous children\r\n this.removeChildren(node.id, nodes, edges);\r\n\r\n // add outbound children\r\n node.data.outTotal = result.outs.total;\r\n for (let i = 0; i < result.outs.items.length; i++) {\r\n const group = result.outs.items[i];\r\n const prop = this.buildPropertyNode(node.id, group);\r\n // when expanding a node (e.g. N17) into props, the prop's ID is\r\n // P + predicate ID + N + origin node ID (e.g. P30N17).\r\n // This prop node can then be expanded, too, thus producing\r\n // a node with ID = N + node ID. When this in turn gets expanded,\r\n // it will produce also the prop node it comes from, which\r\n // must not be re-inserted in the graph. This node in the new\r\n // expansion context will get ID from the source node, which\r\n // is different from the node at the other end of the prop node:\r\n // this was e.g. N17, while the new node is e.g. N18. So, the\r\n // prop previously identified as P30N17 would now be identified\r\n // as P30N18, thus producing a duplicate. To avoid this, we\r\n // calculate an alias ID from the origin's origin: for N18,\r\n // its origin being P30N17, this will be N17. This produces an\r\n // alias P30N17, which being already present will avoid duplicates.\r\n // const aliasId = `P${group.predicateId}N${this.getNodeNumericId(\r\n // node.data.originId\r\n // )}`;\r\n // if (!nodes.some((n) => n.id === prop.id || n.id === aliasId)) {\r\n if (!nodes.some((n) => n.id === prop.id)) {\r\n nodes.push(prop);\r\n\r\n // edge from origin node to object property\r\n const edge = {\r\n id: this.buildEdgeId(node.id, prop.id),\r\n label: group.predicateUri,\r\n source: node.id,\r\n target: prop.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n }\r\n\r\n // add inbound children\r\n node.data.inTotal = result.ins.total;\r\n for (let i = 0; i < result.ins.items.length; i++) {\r\n const g = result.ins.items[i];\r\n // subject property\r\n const p = this.buildPropertyNode(node.id, g);\r\n // edge from object property to origin node\r\n const edge = {\r\n id: this.buildEdgeId(p.id, node.id),\r\n label: g.predicateUri,\r\n source: p.id,\r\n target: node.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n\r\n // do not add an edge having the same source P and target N,\r\n // whatever the P's source node\r\n const r = new RegExp(\r\n '^EP' + g.predicateId + 'N[0-9]+_' + node.id + '$'\r\n );\r\n if (!edges.some((e) => r.test(e.id!))) {\r\n if (!nodes.some((n) => n.id === p.id)) {\r\n nodes.push(p);\r\n }\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n }\r\n\r\n // update\r\n this._nodes$.next(nodes);\r\n this._edges$.next(edges);\r\n },\r\n error: (error) => {\r\n node.data.error = 'Error loading properties';\r\n this._nodes$.next(nodes);\r\n this.setError(error);\r\n },\r\n complete: () => {\r\n this.toggleLoading(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Expand the selected node, by loading its property groups.\r\n *\r\n * @param outFilter The properties to update for the output filter.\r\n * @param inFilter The properties to update for the input filter.\r\n */\r\n public expandSelectedNode(\r\n outFilter?: Partial<PagedTripleFilter> | null,\r\n inFilter?: Partial<PagedTripleFilter> | null\r\n ): void {\r\n if (\r\n !this._selectedNode$.value ||\r\n !this._selectedNode$.value.id.startsWith('N')\r\n ) {\r\n return;\r\n }\r\n const node = this._selectedNode$.value;\r\n this.expandNode(node, outFilter, inFilter);\r\n }\r\n\r\n private buildLiteralLabel(triple: UriTriple): string {\r\n let value = triple.objectLiteral || '';\r\n if (this.maxLiteralLen && value.length > this.maxLiteralLen) {\r\n value = value.substring(0, this.maxLiteralLen) + '\\u2026';\r\n }\r\n return value;\r\n }\r\n\r\n private buildNonLiteralNode(sourceId: string, node: UriNode): GraphNode {\r\n const nid = this.getNodeNumericId(sourceId);\r\n const data: WalkerNodeData = {\r\n originId: sourceId,\r\n customColor: '#80ff95',\r\n uri: node.uri,\r\n sourceType: node.sourceType,\r\n isClass: node.isClass,\r\n sid: node.sid,\r\n tag: node.tag,\r\n outFilter: {\r\n pageNumber: 0,\r\n pageSize: this.pageSize,\r\n subjectId: nid,\r\n },\r\n inFilter: {\r\n pageNumber: 0,\r\n pageSize: this.pageSize,\r\n objectId: nid,\r\n },\r\n };\r\n return {\r\n id: this.buildNodeId(node.id),\r\n label: node.label,\r\n data: data,\r\n };\r\n }\r\n\r\n private buildLiteralNode(sourceId: string, triple: UriTriple): GraphNode {\r\n const data: WalkerLitData = {\r\n originId: sourceId,\r\n customColor: '#ebe2e0',\r\n value: triple.objectLiteral || '',\r\n type: triple.literalType,\r\n language: triple.literalLanguage,\r\n number: triple.literalNumber,\r\n };\r\n return {\r\n id: this.buildLiteralId(triple.id),\r\n label: this.buildLiteralLabel(triple),\r\n data: data,\r\n };\r\n }\r\n\r\n /**\r\n * Expand the currently selected properties group node, by loading its\r\n * outbound nodes, inbound nodes, and literal nodes.\r\n *\r\n * @param node The property group node to expand.\r\n * @param outFilter The properties to update for the outbound nodes filter.\r\n * @param inFilter The properties to update for the inbound nodes filter.\r\n * @param litFilter The properties to update for the literal nodes filter.\r\n */\r\n public expandProperty(\r\n node: GraphNode,\r\n outFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n inFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n litFilter?: Partial<PagedLinkedLiteralFilter> | null\r\n ): void {\r\n // prepare filters\r\n const nid = this.getNodeNumericId(node.id);\r\n const data: WalkerPropData = node.data;\r\n const outf: PagedLinkedNodeFilter = Object.assign(\r\n data.outFilter,\r\n outFilter || {},\r\n { isObject: true }\r\n );\r\n const inf: PagedLinkedNodeFilter = Object.assign(\r\n data.inFilter,\r\n inFilter || {},\r\n {\r\n isObject: false,\r\n }\r\n );\r\n const litf: PagedLinkedLiteralFilter = Object.assign(\r\n data.litFilter,\r\n litFilter || {},\r\n { subjectId: nid, predicateId: this.getPredicateNumericId(node.id) }\r\n );\r\n\r\n // load\r\n this.toggleLoading(true);\r\n const nodes = [...this._nodes$.value];\r\n const edges = [...this._edges$.value];\r\n\r\n forkJoin({\r\n outs: this._graphService.getLinkedNodes(\r\n outf.pageNumber,\r\n outf.pageSize,\r\n outf\r\n ),\r\n ins: this._graphService.getLinkedNodes(inf.pageNumber, inf.pageSize, inf),\r\n lits: this._graphService.getLinkedLiterals(\r\n litf.pageNumber,\r\n litf.pageSize,\r\n litf\r\n ),\r\n }).subscribe({\r\n next: (result) => {\r\n node.data.expanded = true;\r\n\r\n // update origin's filters\r\n node.data.outFilter = outf;\r\n node.data.inFilter = inf;\r\n node.data.litFilter = litf;\r\n\r\n // remove previous children\r\n this.removeChildren(node.id, nodes, edges);\r\n\r\n // add outbound children\r\n node.data.outTotal = result.outs.total;\r\n for (let i = 0; i < result.outs.items.length; i++) {\r\n const child = result.outs.items[i];\r\n const obj = this.buildNonLiteralNode(node.id, child);\r\n if (!nodes.some((n) => n.id === obj.id)) {\r\n nodes.push(obj);\r\n }\r\n // edge from property to non literal object node\r\n const edge = {\r\n id: this.buildEdgeId(node.id, obj.id),\r\n label: '',\r\n source: node.id,\r\n target: obj.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n\r\n // add inbound children\r\n node.data.inTotal = result.ins.total;\r\n for (let i = 0; i < result.ins.items.length; i++) {\r\n const child = result.ins.items[i];\r\n const subj = this.buildNonLiteralNode(node.id, child);\r\n if (!nodes.some((n) => n.id === subj.id)) {\r\n nodes.push(subj);\r\n }\r\n // edge from subject node to property\r\n const edge = {\r\n id: this.buildEdgeId(subj.id, node.id),\r\n label: '',\r\n source: subj.id,\r\n target: node.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n\r\n // add literal children\r\n node.data.litTotal = result.lits.total;\r\n for (let i = 0; i < result.lits.items.length; i++) {\r\n const triple = result.lits.items[i];\r\n const lit = this.buildLiteralNode(node.id, triple);\r\n if (!nodes.some((n) => n.id === lit.id)) {\r\n nodes.push(lit);\r\n }\r\n\r\n // edge from property to literal\r\n const edge = {\r\n id: this.buildEdgeId(node.id, lit.id),\r\n label: lit.data.literalType || '',\r\n source: node.id,\r\n target: lit.id,\r\n data: {\r\n originId: node.id,\r\n },\r\n };\r\n this.addEdgeIfAbsent(edge, edges);\r\n }\r\n\r\n // update\r\n this._nodes$.next(nodes);\r\n this._edges$.next(edges);\r\n },\r\n error: (error) => {\r\n node.data.error = 'Error loading nodes';\r\n this._nodes$.next(nodes);\r\n this.setError(error);\r\n },\r\n complete: () => {\r\n this.toggleLoading(false);\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * Expand the currently selected properties group node, by loading its\r\n * outbound nodes, inbound nodes, and literal nodes. If there is no\r\n * selection, or the selected node is not a properties group node, nothing\r\n * is done.\r\n *\r\n * @param outFilter The properties to update for the outbound nodes filter.\r\n * @param inFilter The properties to update for the inbound nodes filter.\r\n * @param litFilter The properties to update for the literal nodes filter.\r\n */\r\n public expandSelectedProperty(\r\n outFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n inFilter?: Partial<PagedLinkedNodeFilter> | null,\r\n litFilter?: Partial<PagedLinkedLiteralFilter> | null\r\n ): void {\r\n if (\r\n !this._selectedNode$.value ||\r\n !this._selectedNode$.value.id.startsWith('P')\r\n ) {\r\n return;\r\n }\r\n const node = this._selectedNode$.value;\r\n this.expandProperty(node, outFilter, inFilter, litFilter);\r\n }\r\n\r\n /**\r\n * Toggle the specified node by expanding or collapsing it.\r\n *\r\n * @param node The node to toggle.\r\n */\r\n public toggleNode(node: GraphNode): void {\r\n if (node.data.expanded) {\r\n const nodes = [...this._nodes$.value];\r\n const edges = [...this._edges$.value];\r\n this.removeChildren(node.id, nodes, edges);\r\n node.data.expanded = undefined;\r\n this._nodes$.next(nodes);\r\n this._edges$.next(edges);\r\n } else {\r\n if (node.id.startsWith('N')) {\r\n this.expandNode(node);\r\n } else if (node.id.startsWith('P')) {\r\n this.expandProperty(node);\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n effect,\r\n input,\r\n OnDestroy,\r\n OnInit,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { AsyncPipe } from '@angular/common';\r\nimport { Observable, Subject, Subscription, take } from 'rxjs';\r\n\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MatTooltip } from '@angular/material/tooltip';\r\nimport { MatIcon } from '@angular/material/icon';\r\nimport { MatProgressBar } from '@angular/material/progress-bar';\r\nimport { MatTabGroup, MatTab, MatTabLabel } from '@angular/material/tabs';\r\n\r\nimport { DialogService } from '@myrmidon/ngx-mat-tools';\r\nimport { GraphService } from '@myrmidon/cadmus-api';\r\n\r\nimport { TripleFilterComponent } from '../triple-filter/triple-filter.component';\r\nimport { LinkedNodeFilterComponent } from '../linked-node-filter/linked-node-filter.component';\r\nimport { LinkedLiteralFilterComponent } from '../linked-literal-filter/linked-literal-filter.component';\r\nimport {\r\n ForceGraphRendererComponent,\r\n GraphMode,\r\n} from '../force-graph-renderer/force-graph-renderer.component';\r\nimport { GraphNodeLabelPipe } from '../../pipes/graph-node-label.pipe';\r\nimport { GraphNode, Edge, ZoomOptions } from '../../graph-interfaces';\r\nimport {\r\n GraphWalker,\r\n NodeChildTotals,\r\n PagedLinkedLiteralFilter,\r\n PagedLinkedNodeFilter,\r\n PagedTripleFilter,\r\n} from '../../graph-walker';\r\n\r\n/**\r\n * Graph walker component. This starts from a given node, and let users\r\n * walk along edges to discover new nodes.\r\n */\r\n@Component({\r\n selector: 'cadmus-graph-walker',\r\n templateUrl: './graph-walker.component.html',\r\n styleUrls: ['./graph-walker.component.css'],\r\n imports: [\r\n ForceGraphRendererComponent,\r\n MatIconButton,\r\n MatTooltip,\r\n MatIcon,\r\n MatProgressBar,\r\n MatTabGroup,\r\n MatTab,\r\n MatTabLabel,\r\n TripleFilterComponent,\r\n LinkedNodeFilterComponent,\r\n LinkedLiteralFilterComponent,\r\n AsyncPipe,\r\n GraphNodeLabelPipe,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class GraphWalkerComponent implements OnInit, OnDestroy {\r\n private _sub?: Subscription;\r\n private _walker?: GraphWalker;\r\n\r\n /**\r\n * The root origin node ID.\r\n */\r\n public readonly nodeId = input<number>(0);\r\n\r\n /**\r\n * The graph service instance to use.\r\n */\r\n public readonly graphService = input<GraphService>();\r\n\r\n /**\r\n * True if user can pick a node from the graph.\r\n */\r\n public readonly canPick = input<boolean>();\r\n\r\n /**\r\n * True if user can move to the source of a picked node when\r\n * shift-clicking it.\r\n */\r\n public readonly canMoveToSource = input<boolean>();\r\n\r\n /**\r\n * The graph visualization mode (2D or 3D).\r\n */\r\n public readonly graphMode = signal<GraphMode>('2d');\r\n\r\n /**\r\n * Emitted when a graph node is picked by user.\r\n */\r\n public readonly nodePick = output<GraphNode>();\r\n\r\n /**\r\n * Emitted when the user requests to move to the source of a picked node.\r\n */\r\n public readonly moveToSource = output<GraphNode>();\r\n\r\n // graph\r\n public nodes$: Observable<GraphNode[]>;\r\n public edges$: Observable<Edge[]>;\r\n public loading$: Observable<boolean>;\r\n public error$: Observable<string | null>;\r\n // selected node\r\n public selectedNode$: Observable<GraphNode | null>;\r\n public pOutFilter$: Observable<PagedLinkedNodeFilter | null>;\r\n public pInFilter$: Observable<PagedLinkedNodeFilter | null>;\r\n public pLitFilter$: Observable<PagedLinkedLiteralFilter | null>;\r\n public nOutFilter$: Observable<PagedTripleFilter | null>;\r\n public nInFilter$: Observable<PagedTripleFilter | null>;\r\n public childTotals$: Observable<NodeChildTotals>;\r\n\r\n // ngx-graph actions\r\n public update$: Subject<boolean> = new Subject();\r\n public center$: Subject<boolean> = new Subject();\r\n public zoomToFit$: Subject<ZoomOptions> = new Subject();\r\n\r\n constructor(private _dialog: DialogService) {\r\n // Initialize observables with empty observables initially\r\n this.nodes$ = new Observable<GraphNode[]>();\r\n this.edges$ = new Observable<Edge[]>();\r\n this.loading$ = new Observable<boolean>();\r\n this.error$ = new Observable<string | null>();\r\n this.selectedNode$ = new Observable<GraphNode | null>();\r\n this.pOutFilter$ = new Observable<PagedLinkedNodeFilter | null>();\r\n this.pInFilter$ = new Observable<PagedLinkedNodeFilter | null>();\r\n this.pLitFilter$ = new Observable<PagedLinkedLiteralFilter | null>();\r\n this.nOutFilter$ = new Observable<PagedTripleFilter | null>();\r\n this.nInFilter$ = new Observable<PagedTripleFilter | null>();\r\n this.childTotals$ = new Observable<NodeChildTotals>();\r\n\r\n // initialize walker when graphService is available\r\n effect(() => {\r\n const service = this.graphService();\r\n console.log('GraphService effect triggered:', service);\r\n if (service && !this._walker) {\r\n console.log('Creating new GraphWalker');\r\n this._walker = new GraphWalker(service);\r\n this.setupObservables();\r\n }\r\n });\r\n\r\n effect(() => {\r\n const id = this.nodeId();\r\n console.log('NodeId effect triggered:', id);\r\n if (id && this._walker) {\r\n console.log('Calling reset with id:', id);\r\n this.reset(id);\r\n }\r\n });\r\n }\r\n\r\n private setupObservables(): void {\r\n if (!this._walker) return;\r\n\r\n this.nodes$ = this._walker.nodes$;\r\n this.edges$ = this._walker.edges$;\r\n this.loading$ = this._walker.loading$;\r\n this.error$ = this._walker.error$;\r\n\r\n this.selectedNode$ = this._walker.selectedNode$;\r\n this.pOutFilter$ = this._walker.pOutFilter$;\r\n this.pInFilter$ = this._walker.pInFilter$;\r\n this.pLitFilter$ = this._walker.pLitFilter$;\r\n this.nOutFilter$ = this._walker.nOutFilter$;\r\n this.nInFilter$ = this._walker.nInFilter$;\r\n this.childTotals$ = this._walker.childTotals$;\r\n\r\n // add debugging\r\n this.nodes$.subscribe((nodes) => {\r\n console.log('GraphWalker nodes updated:', nodes);\r\n });\r\n\r\n this.edges$.subscribe((edges) => {\r\n console.log('GraphWalker edges updated:', edges);\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._sub = this.update$.subscribe((_) => {\r\n this.onReset();\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._sub?.unsubscribe();\r\n }\r\n\r\n public onNodeSelect(node: GraphNode): void {\r\n if (node) {\r\n this._walker?.selectNode(node.id);\r\n }\r\n }\r\n\r\n private reset(id: number): void {\r\n console.log('GraphWalker reset called with id:', id);\r\n if (this._walker) {\r\n this._walker.reset(id);\r\n } else {\r\n console.log('GraphWalker instance not available');\r\n }\r\n }\r\n\r\n public onReset(): void {\r\n if (!this.nodeId()) {\r\n return;\r\n }\r\n this._dialog\r\n .confirm('Reset', 'Reset the whole graph?')\r\n .pipe(take(1))\r\n .subscribe((yes) => {\r\n if (yes) {\r\n this.reset(this.nodeId());\r\n }\r\n });\r\n }\r\n\r\n public onNodeDblClick(node: GraphNode): void {\r\n this._walker?.toggleNode(node);\r\n }\r\n\r\n public onGraphModeChange(mode: GraphMode): void {\r\n this.graphMode.set(mode);\r\n }\r\n\r\n public onPOutFilterChange(filter: PagedLinkedNodeFilter): void {\r\n this._walker?.expandSelectedProperty(filter);\r\n }\r\n\r\n public onPInFilterChange(filter: PagedLinkedNodeFilter): void {\r\n this._walker?.expandSelectedProperty(null, filter);\r\n }\r\n\r\n public onPLitFilterChange(filter: PagedLinkedLiteralFilter): void {\r\n this._walker?.expandSelectedProperty(null, null, filter);\r\n }\r\n\r\n public onNOutFilterChange(filter: PagedTripleFilter): void {\r\n this._walker?.expandSelectedNode(filter);\r\n }\r\n\r\n public onNInFilterChange(filter: PagedTripleFilter): void {\r\n this._walker?.expandSelectedNode(null, filter);\r\n }\r\n\r\n public pickSelectedNode(event: MouseEvent): void {\r\n const node = this._walker?.getSelectedNode();\r\n if (!node) {\r\n return;\r\n }\r\n if (this.canMoveToSource() && event.shiftKey) {\r\n if (node.data.sid) {\r\n this.moveToSource.emit(node);\r\n }\r\n } else {\r\n this.nodePick.emit(node);\r\n }\r\n }\r\n}\r\n","<div id=\"container\">\r\n <!-- graph -->\r\n <div id=\"graph\">\r\n <cadmus-force-graph-renderer\r\n [nodes]=\"(nodes$ | async) || []\"\r\n [edges]=\"(edges$ | async) || []\"\r\n [mode]=\"graphMode()\"\r\n [update$]=\"update$\"\r\n [center$]=\"center$\"\r\n [zoomToFit$]=\"zoomToFit$\"\r\n (nodeSelect)=\"onNodeSelect($event)\"\r\n (nodeDoubleClick)=\"onNodeDblClick($event)\"\r\n (modeChange)=\"onGraphModeChange($event)\"\r\n />\r\n </div>\r\n\r\n <!-- tools -->\r\n <div id=\"tools\">\r\n <div id=\"bar\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Center\"\r\n (click)=\"center$.next(true)\"\r\n >\r\n <mat-icon>filter_center_focus</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Zoom to fit\"\r\n (click)=\"zoomToFit$.next({ force: true })\"\r\n >\r\n <mat-icon>fit_screen</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Reset\"\r\n (click)=\"update$.next(true)\"\r\n >\r\n <mat-icon class=\"mat-warn\">restart_alt</mat-icon>\r\n </button>\r\n @if (nodes$ | async; as nodes) {\r\n <span class=\"muted\"\r\n >N:{{ nodes.length }} E:{{ (edges$ | async)?.length }}</span\r\n >\r\n } @if (selectedNode$ | async; as selectedNode) {\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Toggle the selected node\"\r\n [disabled]=\"!selectedNode\"\r\n (click)=\"onNodeDblClick(selectedNode)\"\r\n >\r\n <mat-icon class=\"mat-primary\">unfold_more</mat-icon>\r\n </button>\r\n } @if (canPick()) {\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n [matTooltip]=\"\r\n canMoveToSource()\r\n ? 'Pick selected node or (shift) its source'\r\n : 'Pick the selected node'\r\n \"\r\n [disabled]=\"!(selectedNode$ | async)\"\r\n (click)=\"pickSelectedNode($event)\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n <!-- progress -->\r\n <div id=\"progress\">\r\n @if (loading$ | async) {\r\n <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar>\r\n }\r\n </div>\r\n <div id=\"filters\">\r\n @if (selectedNode$ | async; as node) {\r\n <div id=\"filter-head\">\r\n <span [style.color]=\"node.data.color || 'black'\">⬤</span>\r\n <span class=\"node-uri\" matTooltip=\"{{ node.data.uri }}\">{{\r\n node | graphNodeLabel\r\n }}</span>\r\n <span class=\"muted node-id\">{{\r\n node.id\r\n }}</span>\r\n </div>\r\n }\r\n <mat-tab-group>\r\n <!-- N-outs -->\r\n @if (nOutFilter$ | async; as nOutFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n N<mat-icon>logout</mat-icon>\r\n </ng-template>\r\n <cadmus-walker-triple-filter\r\n [filter]=\"nOutFilter\"\r\n (filterChange)=\"onNOutFilterChange($event)\"\r\n ></cadmus-walker-triple-filter>\r\n </mat-tab>\r\n }\r\n <!-- N-ins -->\r\n @if (nInFilter$ | async; as nInFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label> N<mat-icon>login</mat-icon> </ng-template>\r\n <cadmus-walker-triple-filter\r\n [filter]=\"nInFilter\"\r\n (filterChange)=\"onNInFilterChange($event)\"\r\n ></cadmus-walker-triple-filter>\r\n </mat-tab>\r\n }\r\n <!-- P-outs -->\r\n @if (pOutFilter$ | async; as pOutFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n P<mat-icon>logout</mat-icon>\r\n </ng-template>\r\n <cadmus-walker-linked-node-filter\r\n [filter]=\"pOutFilter\"\r\n (filterChange)=\"onPOutFilterChange($event)\"\r\n />\r\n </mat-tab>\r\n }\r\n <!-- P-ins -->\r\n @if (pInFilter$ | async; as pInFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label> P<mat-icon>login</mat-icon> </ng-template>\r\n <cadmus-walker-linked-node-filter\r\n [filter]=\"pInFilter\"\r\n (filterChange)=\"onPInFilterChange($event)\"\r\n />\r\n </mat-tab>\r\n }\r\n <!-- P-lit -->\r\n @if (pLitFilter$ | async; as pLitFilter) {\r\n <mat-tab>\r\n <ng-template mat-tab-label>\r\n P<mat-icon>exit_to_app</mat-icon>\r\n </ng-template>\r\n <cadmus-walker-linked-literal-filter\r\n [filter]=\"pLitFilter\"\r\n (filterChange)=\"onPLitFilterChange($event)\"\r\n />\r\n </mat-tab>\r\n }\r\n </mat-tab-group>\r\n </div>\r\n </div>\r\n</div>\r\n","/**\r\n * Graph interfaces to replace ngx-graph types\r\n */\r\n\r\nexport interface GraphNode {\r\n id: string;\r\n label?: string;\r\n data?: any;\r\n position?: {\r\n x: number;\r\n y: number;\r\n };\r\n dimension?: {\r\n width: number;\r\n height: number;\r\n };\r\n meta?: any;\r\n color?: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Edge {\r\n id?: string;\r\n source: string;\r\n target: string;\r\n label?: string;\r\n data?: any;\r\n line?: string;\r\n meta?: any;\r\n color?: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface ZoomOptions {\r\n center?: boolean;\r\n scale?: number;\r\n animationDuration?: number;\r\n force?: boolean;\r\n}\r\n\r\nexport interface Graph {\r\n nodes: GraphNode[];\r\n edges: Edge[];\r\n}\r\n","/*\r\n * Public API Surface of cadmus-graph-ui-ex\r\n */\r\n\r\nexport * from './lib/components/force-graph-renderer/force-graph-renderer.component';\r\nexport * from './lib/components/graph-walker/graph-walker.component';\r\nexport * from './lib/components/linked-literal-filter/linked-literal-filter.component';\r\nexport * from './lib/components/linked-node-filter/linked-node-filter.component';\r\nexport * from './lib/components/triple-filter/triple-filter.component';\r\n\r\nexport * from './lib/pipes/graph-node-label.pipe';\r\n\r\nexport * from './lib/graph-interfaces';\r\nexport * from './lib/graph-walker';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","take"],"mappings":"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"}