From f00796eae6125806f64457524a56a0482eee61b3 Mon Sep 17 00:00:00 2001
From: Matthias Konitzny <konitzny@ibr.cs.tu-bs.de>
Date: Tue, 15 Jun 2021 18:51:44 +0200
Subject: [PATCH] Added a detail view which is automatically opened on node
 click and fed with information based on the clicked node.

---
 graph.js     | 63 ++++++++++++++++++++++++++++++++++++++++++++--------
 kg-style.css | 36 +++++++++++++++++++++++++++---
 2 files changed, 87 insertions(+), 12 deletions(-)

diff --git a/graph.js b/graph.js
index dc39b0d..d5f7972 100644
--- a/graph.js
+++ b/graph.js
@@ -20,12 +20,12 @@ async function loadGraph() {
         .nodeAutoColorBy('group')
         .nodeColor(node => highlightNodes.has(node) ? node === hoverNode ? 'rgb(255,0,0,1)' : 'rgba(255,160,0,0.8)' : 'rgba(0,255,255,0.6)')
         .linkWidth(link => highlightLinks.has(link) ? 4 : 1)
-        .onNodeClick(focusOnNode)
+        .onNodeClick(handleNodeClick)
         .onNodeHover(nodeHover)
         .onLinkHover(linkHover)
         .linkColor(linkColor)
         .linkOpacity(0.8)
-        .onEngineTick(loadComponents);
+        .onEngineTick(loadComponents).width(800);
 }
 
 
@@ -34,7 +34,8 @@ function loadComponents() {
         mapEdgeColors();
         updateLinks();
         add_background();
-        drawOverlay();
+        createLinkOverlay();
+        createInfoOverlay();
         firstTick = false;
     }
 }
@@ -53,11 +54,45 @@ function getLinkClasses() {
     return [... new Set(linkClasses)];
 }
 
-function drawOverlay() {
+function getCanvasDivNode() {
     const domNode = document.getElementById('3d-graph');
-    const sceneNode = domNode.firstChild.firstChild.firstChild
+    return domNode.firstChild.firstChild.firstChild;
+}
+
+
+function createInfoOverlay() {
+    const sceneNode = getCanvasDivNode();
+    const overlayNode = document.createElement('div');
+    overlayNode.id = 'infoOverlay'
+    overlayNode.className = 'detail-view';
+    //overlayNode.innerText = 'Hello there!';
+    sceneNode.insertBefore(overlayNode, sceneNode.childNodes[2]);
+
+    const headline = document.createElement('h2');
+    headline.id = 'infoOverlayHeadline';
+    headline.innerText = 'Default Text';
+    headline.className = 'detail-view-headline'
+    overlayNode.appendChild(headline)
+
+    const close = document.createElement('div');
+    close.innerHTML = '<p>&#10006;</p>';
+    close.id = 'infoOverlayCloseButton';
+    close.className = 'close-button'
+    overlayNode.appendChild(close);
+
+    jQuery('#infoOverlayCloseButton').click(function () {
+        jQuery('#infoOverlay').slideUp('fast');
+    });
+
+    //sceneNode.appendChild(overlayNode);
+
+}
+
+
+function createLinkOverlay() {
+    const sceneNode = getCanvasDivNode();
     const overlayNode = document.createElement('div');
-    overlayNode.className = 'kg-overlay';
+    overlayNode.className = 'link-overlay';
     //overlayNode.innerText = 'Hello there!';
     sceneNode.insertBefore(overlayNode, sceneNode.childNodes[2])
 
@@ -75,9 +110,6 @@ function drawOverlay() {
         colorStrip.style = "background-color: " + edgeColors[linkClasses[i]] + "; width: " + 10 * chars + "px;";
         relation.appendChild(colorStrip);
     }
-
-    //sceneNode.appendChild(overlayNode);
-
 }
 
 
@@ -115,6 +147,19 @@ function updateLinks() {
 }
 
 
+
+function handleNodeClick(node) {
+    focusOnNode(node);
+    updateInfoOverlay(node);
+}
+
+
+function updateInfoOverlay(node) {
+    jQuery('#infoOverlayHeadline').text(node.name);
+    jQuery('#infoOverlay').slideDown('fast');
+}
+
+
 function focusOnNode(node) {
     // Aim at node from outside it
     const distance = 250;
diff --git a/kg-style.css b/kg-style.css
index d890f6c..3bf3dbf 100644
--- a/kg-style.css
+++ b/kg-style.css
@@ -2,17 +2,47 @@
     display: flex;
 }
 
-.kg-overlay {
+.close-button {
+    pointer-events: all;
+    z-index: 99;
+    cursor: pointer;
+    right: 10px;
+    top: 5px;
+    position: absolute;
+    font-size: 20px;
+}
+
+
+.detail-view {
+    position: absolute;
+    top: 0;
+    right: 0;
+    width: 250px;
+    height: 100%;
+    background-color: whitesmoke;
+    padding: 10px;
+}
+
+.detail-view-headline {
+    font-weight: bold;
+    text-align: center;
+    font-family: CuratorRegular,Helvetica Neue,Helvetica,Arial,sans-serif;
+    word-wrap: break-word;
+    hyphens: auto;
+    font-size: 2.0vw;
+}
+
+
+.link-overlay {
     position: absolute;
     bottom: 0;
     pointer-events: none;
     width: 350px;
     max-width: 400px;
-    padding-left: 10px;
+    padding: 10px;
     left: 0px;
     display: block;
     background-color: rgba(0,0,0,.6);
-    padding: 5px;
 }
 
 .relation {
-- 
GitLab