From f3048f489dfd7b5b7bc41db5c002e12379abc8b9 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 30 Jan 2017 11:36:33 +0100
Subject: [PATCH] adding overlays implemented

---
 frontend-js/package.json                      |   1 +
 frontend-js/src/main/js/gui/OverlayPanel.js   | 130 +++++++++++++++++-
 frontend-js/src/main/js/gui/Panel.js          |  13 +-
 .../src/test/js/gui/OverlayPanel-test.js      |  32 +++++
 frontend-js/src/test/js/helper.js             |   4 +
 frontend-js/testFiles/overlay/good.txt        |   8 ++
 .../WEB-INF/components/map/layoutPanel.xhtml  |   1 +
 web/src/main/webapp/resources/css/style.css   |   2 +-
 8 files changed, 188 insertions(+), 3 deletions(-)
 create mode 100644 frontend-js/testFiles/overlay/good.txt

diff --git a/frontend-js/package.json b/frontend-js/package.json
index 432f0545ae..68b9ecf5ed 100644
--- a/frontend-js/package.json
+++ b/frontend-js/package.json
@@ -12,6 +12,7 @@
   "author": "Piotr Gawron",
   "devDependencies": {
     "assert": "1.4.1",
+    "blob-util": "^1.2.1",
     "bluebird": "^3.4.6",
     "bootstrap": "^3.3.7",
     "browserify": "^13.1.1",
diff --git a/frontend-js/src/main/js/gui/OverlayPanel.js b/frontend-js/src/main/js/gui/OverlayPanel.js
index 5999775fa1..10703fffc6 100644
--- a/frontend-js/src/main/js/gui/OverlayPanel.js
+++ b/frontend-js/src/main/js/gui/OverlayPanel.js
@@ -29,10 +29,19 @@ function OverlayPanel(params) {
   if (self.getCustomOverlaysTitleElement() === undefined) {
     throw new Error("Couldn't find element: customOverlaysTitle");
   }
+
   if (self.getCustomOverlaysTabElement() === undefined) {
     throw new Error("Couldn't find element: customOverlaysTab");
   }
 
+  if (self.getAddButtonElement() === undefined) {
+    throw new Error("Couldn't find element: getAddButtonElement");
+  } else {
+    self.getAddButtonElement().onclick = function(){
+      self.openAddOverlayDialog();
+    }
+  }
+
   self.setCustomOverlaysMessage(self.getCustomOverlaysTitleElement().innerHTML);
 
   self.refresh();
@@ -206,7 +215,7 @@ OverlayPanel.prototype.refresh = function() {
   var user = null;
 
   var overlayTypes = [];
-  
+
   return ServerConnector.getOverlayTypes().then(function(types) {
     overlayTypes = types;
     return ServerConnector.getLoggedUser();
@@ -248,10 +257,13 @@ OverlayPanel.prototype.refresh = function() {
     }
 
     var title = self.getCustomOverlaysTitleElement();
+    var addButton = self.getAddButtonElement();
     if (user.getLogin() === "anonymous") {
       title.innerHTML = "YOU ARE NOT LOGGED IN. PLEASE, LOG IN TO UPLOAD AND VIEW CUSTOM OVERLAYS";
+      addButton.style.display="none";
     } else {
       title.innerHTML = self.getCustomOverlaysMessage();
+      addButton.style.display="block";
 
       table = self.getCustomOverlaysTabElement();
       table.appendChild(self.createTableHeader(true));
@@ -282,6 +294,9 @@ OverlayPanel.prototype.getCustomOverlaysElement = function() {
 OverlayPanel.prototype.getCustomOverlaysTitleElement = function() {
   return this.getElementByName(this.getElement(), "customOverlaysTitle");
 };
+OverlayPanel.prototype.getAddButtonElement = function() {
+  return this.getElementByName(this.getElement(), "addOverlay");
+};
 OverlayPanel.prototype.getCustomOverlaysTabElement = function() {
   return this.getElementByName(this.getElement(), "customOverlaysTab");
 };
@@ -294,4 +309,117 @@ OverlayPanel.prototype.getCustomOverlaysMessage = function() {
   return this._customOverlaysMessage;
 };
 
+OverlayPanel.prototype.parseFile = function(fileContent) {
+  var result = {};
+  var lines = fileContent.split("\n");
+  for (var i=0;i<lines.length;i++) {
+    var line = lines[i];
+    if (line.startsWith("#")) {
+      if (line.indexOf("=")>0) {
+        var name = line.substring(1, line.indexOf("=")).trim();
+        var value = line.substring(line.indexOf("=")+1).trim();
+        if (name==="NAME") {
+          result.name = value;
+        } else if (name==="DESCRIPTION") {
+          result.description= value;
+        } else if (name==="TYPE") {
+          result.type= value;
+        }
+      } else {
+        logger.warn("Invalid overlay header line: "+line);
+      }
+    } else {
+      break;
+    }
+  }
+  return result;
+};
+
+OverlayPanel.prototype.openAddOverlayDialog = function() {
+  var self = this;
+  var fileContent = null;
+  return new Promise(function(resolve, reject){
+
+    var content = document.createElement("div");
+    content.style.width="100%";
+    content.style.height="100%";
+    content.appendChild(self.createLabel("Name"));
+    var nameInput = self.createInputText();
+    content.appendChild(nameInput);
+    content.appendChild(self.createNewLine());
+
+    content.appendChild(self.createLabel("Description"));
+    content.appendChild(self.createNewLine());
+    var descriptionInput = self.createTextArea();
+    content.appendChild(descriptionInput);
+    content.appendChild(self.createNewLine());
+
+    content.appendChild(self.createLabel("File"));
+    var fileInput = self.createFileButton();
+    fileInput.addEventListener("change", function(){
+      fileContent = null;
+      var file = fileInput.files[0];
+      if (file) {
+        var reader = new FileReader();
+        reader.readAsText(file, "UTF-8");
+        reader.onload = function (evt) {
+          fileContent = evt.target.result;
+          var data = self.parseFile(fileContent);
+          if (data.name!==undefined) {
+            nameInput.value =data.name; 
+          } else {
+            var filename = fileInput.value;
+            if (filename.indexOf(".")>0) {
+              filename.substr(0,filename.indexOf(".")-1);
+            }
+            nameInput.value =filename; 
+          }
+          if (data.description!==undefined) {
+            descriptionInput.value =data.description; 
+          }
+        }
+        reader.onerror = function (evt) {
+          GuiConnector.alert("Problem reading file");
+        }
+      }
+    }, false);
+    content.appendChild(fileInput);
+    content.appendChild(self.createNewLine());
+
+    var buttons = [ {
+      text : "UPLOAD",
+      click : function() {
+        var dialog = this;
+        if (fileContent===null) {
+          GuiConnector.alert("No file was selected");
+        } else {
+          var data = {
+              name : nameInput.value,
+              description : descriptionInput.value,
+              content : fileContent,
+              filename : fileInput.value
+          }          
+          return ServerConnector.addOverlay(data).then(function(){
+            return self.refresh();
+          }).then(function(){
+            $(dialog).dialog("close");
+          });
+        }
+      }
+    }, {
+      text : "CANCEL",
+      click : function() {
+        $(this).dialog("close");
+      }
+    } ];
+    self.openDialog(content, {
+      id : "addOverlay",
+      modal: true,
+      buttons : buttons,
+    });
+
+    resolve();
+  });
+};
+
 module.exports = OverlayPanel;
diff --git a/frontend-js/src/main/js/gui/Panel.js b/frontend-js/src/main/js/gui/Panel.js
index 7789372c18..d0eb10276e 100644
--- a/frontend-js/src/main/js/gui/Panel.js
+++ b/frontend-js/src/main/js/gui/Panel.js
@@ -221,6 +221,11 @@ Panel.prototype.createTextArea = function(value) {
   }
   return result;
 };
+Panel.prototype.createFileButton = function() {
+  var result = document.createElement("input");
+  result.setAttribute('type', 'file');
+  return result;
+};
 
 Panel.prototype.createParamLine = function(label, value) {
   var result = document.createElement("div");
@@ -358,8 +363,14 @@ Panel.prototype.openDialog = function(content, options) {
     contentDiv.removeChild(contentDiv.lastChild);
   }
   contentDiv.appendChild(content);
+  contentDiv.style.display="block";
 
-  $(div).dialog();
+  $(div).dialog({
+    close : function() {
+      contentDiv.style.display="none";
+      $(this).dialog('destroy');
+    }
+  });
 
   this.assignDialogOptions(div, options);
 
diff --git a/frontend-js/src/test/js/gui/OverlayPanel-test.js b/frontend-js/src/test/js/gui/OverlayPanel-test.js
index c15b99bbb4..d3053c6703 100644
--- a/frontend-js/src/test/js/gui/OverlayPanel-test.js
+++ b/frontend-js/src/test/js/gui/OverlayPanel-test.js
@@ -9,6 +9,7 @@ var OverlayPanel = require('../../../main/js/gui/OverlayPanel');
 var chai = require('chai');
 var assert = chai.assert;
 var logger = require('../logger');
+var blobUtil = require('blob-util');
 
 describe('OverlayPanel', function() {
 
@@ -105,4 +106,35 @@ describe('OverlayPanel', function() {
     });
   });
 
+  it('openAddOverlayDialog', function() {
+    var div = helper.createOverlayTab();
+
+    var map = helper.createCustomMap();
+
+    var panel = new OverlayPanel({
+      element : div,
+      customMap : map
+    });
+
+    return panel.openAddOverlayDialog();
+  });
+
+  it('parse overlay file', function() {
+    var div = helper.createOverlayTab();
+
+    var map = helper.createCustomMap();
+
+    var panel = new OverlayPanel({
+      element : div,
+      customMap : map
+    });
+
+    return ServerConnector.readFile("testFiles/overlay/good.txt").then(function(fileContent) {
+      var obj = panel.parseFile(fileContent);
+      assert.equal(obj.name, "example name");
+      assert.equal(obj.description, "layout description");
+      assert.equal(obj.type, "GENERIC");
+    });
+  });
+
 });
diff --git a/frontend-js/src/test/js/helper.js b/frontend-js/src/test/js/helper.js
index 5523e620c9..efe13fa5e5 100644
--- a/frontend-js/src/test/js/helper.js
+++ b/frontend-js/src/test/js/helper.js
@@ -102,6 +102,10 @@ Helper.prototype.createOverlayTab = function() {
   customOverlaysTitleDiv.setAttribute("name", "customOverlaysTitle");
   customOverlaysDiv.appendChild(customOverlaysTitleDiv);
   
+  var addButton = document.createElement("button");
+  addButton.setAttribute("name", "addOverlay");
+  customOverlaysDiv.appendChild(addButton);
+  
   return result;
 };
 
diff --git a/frontend-js/testFiles/overlay/good.txt b/frontend-js/testFiles/overlay/good.txt
new file mode 100644
index 0000000000..ecc8403333
--- /dev/null
+++ b/frontend-js/testFiles/overlay/good.txt
@@ -0,0 +1,8 @@
+#TYPE=GENERIC						
+# VERSION=1.0
+# NAME=example name
+# DESCRIPTION=layout description
+value	identifier	Chebi
+-0,943978048	HGNC:11138	
+-0,941309505		CHEBI:15377
+1		CHEBI:15376
diff --git a/web/src/main/webapp/WEB-INF/components/map/layoutPanel.xhtml b/web/src/main/webapp/WEB-INF/components/map/layoutPanel.xhtml
index 315b5ce612..2a566c9e51 100644
--- a/web/src/main/webapp/WEB-INF/components/map/layoutPanel.xhtml
+++ b/web/src/main/webapp/WEB-INF/components/map/layoutPanel.xhtml
@@ -17,6 +17,7 @@
 	<div name="customOverlays" class="searchPanel">	
 		<h5 name="customOverlaysTitle">USER-PROVIDED OVERLAYS:</h5>
 		<table cellpadding="4" name="customOverlaysTab" class="table table-bordered"  style="width:100%"/>
+		<center><button name="addOverlay">Add overlay</button></center>
 	</div>
 
 </div>
diff --git a/web/src/main/webapp/resources/css/style.css b/web/src/main/webapp/resources/css/style.css
index 88f02e9ba1..a9c506e11a 100644
--- a/web/src/main/webapp/resources/css/style.css
+++ b/web/src/main/webapp/resources/css/style.css
@@ -1057,7 +1057,7 @@ a.mainTitle:hover {background-color:#000000; transition: background-color 0.4s e
 
 /*form format*/
 
-input[type=file] {width:280px !important; height:7px !important; top:15px !important;}
+input[type=file] {width:280px !important; top:15px !important;}
 
 
 .ui-inputtext, .ui-password, .ui-autocomplete-input{
-- 
GitLab