UNPKG

@myrmidon/cadmus-graph-ui-ex

Version:

Cadmus - extensions to semantic graph components.

1 lines 189 kB
{"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        &nbsp;\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'\">&#x2b24;</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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"}