From 0f68ce05b8b37a7992def0f3178fdc5d8d5dc570 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 23 Aug 2017 15:14:12 +0200
Subject: [PATCH] when uploading file projectId and converter are set up
 accordingly

---
 .../src/main/js/gui/admin/AddProjectDialog.js | 185 ++++++++++++++++--
 .../js/gui/admin/AddProjectDialog-test.js     |  22 +++
 2 files changed, 187 insertions(+), 20 deletions(-)

diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
index 7b07c1e37d..b795684725 100644
--- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
@@ -14,6 +14,7 @@ var guiUtils = new (require('../leftPanel/GuiUtils'))();
 function AddProjectDialog(params) {
   AbstractGuiElement.call(this, params);
   var self = this;
+  self.registerListenerType("onFileUpload");
   $(self.getElement()).addClass("minerva-edit-project-dialog");
 
   self.createGui();
@@ -97,6 +98,39 @@ AddProjectDialog.prototype.createGeneralTabContent = function() {
   });
   result.appendChild(table);
 
+  var fileInput = Functions.createElement({
+    type : "input",
+    inputType : "file",
+    name : "project-file",
+  });
+  fileInput.addEventListener("change", function() {
+    return self.callListeners("onFileUpload", fileInput.files[0]);
+  }, false);
+  self.addListener("onFileUpload", function(e) {
+    var file = e.arg;
+    return self.processFile(file);
+  });
+  self.addListener("onFileUpload", function(e) {
+    var file = e.arg;
+    if (file.name.lastIndexOf('.') > 0) {
+      return self.setProjectId(file.name.substring(0, file.name.lastIndexOf('.')));
+    } else {
+      return file.name;
+    }
+  });
+  self.addListener("onFileUpload", function(e) {
+    var file = e.arg;
+    return self.setFileParserForFilename(file.name);
+  });
+  table.appendChild(self.createRow(guiUtils.createLabel("Upload file: "), fileInput));
+
+  var fileFormatSelect = Functions.createElement({
+    type : "select",
+    name : "project-format",
+  });
+
+  table.appendChild(self.createRow(guiUtils.createLabel("File format: "), fileFormatSelect));
+
   table.appendChild(self.createInputRow("ProjectId:", "id", "project-id"));
   table.appendChild(self.createInputRow("Project name:", "UNKNOWN DISEASE MAP", "project-name"));
   table.appendChild(self.createInputRow("Project Disease:", "", "project-disease"));
@@ -140,45 +174,63 @@ AddProjectDialog.prototype.createGeneralTabContent = function() {
   return result;
 };
 AddProjectDialog.prototype.createInputRow = function(labelName, defaultValue, inputName) {
-  var result = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  result.appendChild(new Functions.createElement({
+  var label = new Functions.createElement({
     type : "div",
     style : "display:table-cell",
     content : labelName,
-  }));
-  result.appendChild(new Functions.createElement({
+  });
+  var input = new Functions.createElement({
     type : "div",
     style : "display:table-cell",
     content : "<input name='" + inputName + "' value='" + defaultValue + "'/>",
-  }));
-  return result;
+  });
+  return this.createRow(label, input);
 };
 
 AddProjectDialog.prototype.createCheckboxRow = function(labelName, defaultValue, inputName) {
-  var result = new Functions.createElement({
-    type : "div",
-    style : "display:table-row"
-  });
-  result.appendChild(new Functions.createElement({
+  var label = new Functions.createElement({
     type : "div",
     style : "display:table-cell",
     content : labelName,
-  }));
+  });
   var checked = "";
   if (defaultValue) {
     checked = "checked";
   }
-  result.appendChild(new Functions.createElement({
+  var checkbox = new Functions.createElement({
     type : "div",
     style : "display:table-cell",
-    content : "<checkbox name='" + inputName + "' " + checked + "/>",
-  }));
-  return result;
+    content : "<input type='checkbox' name='" + inputName + "' " + checked + "/>",
+  });
+  return this.createRow(label, checkbox);
 };
 
+AddProjectDialog.prototype.createRow = function(label, value) {
+  var result = new Functions.createElement({
+    type : "div",
+    style : "display:table-row"
+  });
+  if (label.tagName.toLowerCase() !== 'div') {
+    var labelContainer = new Functions.createElement({
+      type : "div",
+      style : "display:table-cell",
+    });
+    labelContainer.appendChild(label);
+    label = labelContainer;
+  }
+  result.appendChild(label);
+  if (value.tagName.toLowerCase() !== 'div') {
+    var valueContainer = new Functions.createElement({
+      type : "div",
+      style : "display:table-cell",
+    });
+    valueContainer.appendChild(value);
+    value = valueContainer;
+  }
+  result.appendChild(value);
+  return result;
+
+};
 AddProjectDialog.prototype.createOverlaysTab = function(tabMenuDiv, tabContentDiv) {
   var self = this;
   self.addTab({
@@ -247,7 +299,27 @@ AddProjectDialog.prototype.createOverviewImagesTabContent = function() {
 };
 
 AddProjectDialog.prototype.init = function() {
-  return Promise.resolve();
+  var self = this;
+  return ServerConnector.getConfiguration().then(function(configuration) {
+    var select = $("[name='project-format']", self.getElement())[0];
+    var option = Functions.createElement({
+      type : "option",
+      content : "---",
+    });
+    option.selected = true;
+    select.appendChild(option);
+    var converters = configuration.getModelConverters();
+    for (var i = 0; i < converters.length; i++) {
+      var converter = converters[i];
+      option = Functions.createElement({
+        type : "option",
+        content : converter.name,
+      });
+      option.data = converter.extension;
+      option.value = converter.handler;
+      select.appendChild(option);
+    }
+  });
 };
 
 AddProjectDialog.prototype.destroy = function() {
@@ -275,7 +347,80 @@ AddProjectDialog.prototype.close = function() {
 AddProjectDialog.prototype.clear = function() {
   var self = this;
   $("input", self.getElement()).val("");
+  self.setFileContent(undefined);
   return Promise.resolve();
 };
 
+AddProjectDialog.prototype.processFile = function(file) {
+  var self = this;
+  self.setFileContent(null);
+  if (file) {
+    return new Promise(function(resolve, reject) {
+      var reader = new FileReader();
+      reader.readAsText(file, "UTF-8");
+      reader.onload = function(evt) {
+        try {
+          self.setFileContent(evt.target.result);
+          resolve(self.getFileContent());
+        } catch (error) {
+          reject(error);
+        }
+      };
+      reader.onerror = function() {
+        reject(new Error("Problem reading file"));
+      };
+    });
+  } else {
+    return Promise.resolve(null);
+  }
+};
+
+AddProjectDialog.prototype.setFileContent = function(fileContent) {
+  this._fileContent = fileContent;
+};
+AddProjectDialog.prototype.getFileContent = function() {
+  return this._fileContent;
+};
+
+AddProjectDialog.prototype.setProjectId = function(projectId) {
+  $("[name='project-id']", this.getElement()).val(projectId);
+};
+
+AddProjectDialog.prototype.getProjectId = function() {
+  return $("[name='project-id']", this.getElement()).val();
+};
+
+AddProjectDialog.prototype.setFileParserForFilename = function(filename) {
+  var self = this;
+  var select = $("[name='project-format']", self.getElement)[0];
+  var options = select.options;
+  var optionId = 0;
+  for (var i = 0; i < options.length; i++) {
+    var option = options[i];
+    if (option.value !== undefined) {
+      var extension = option.data;
+      if (filename.endsWith(extension) && optionId <= 0) {
+        optionId = i;
+      }
+    }
+  }
+  options[optionId].selected = true;
+};
+AddProjectDialog.prototype.getConverter = function() {
+  var self = this;
+  var select = $("[name='project-format']", self.getElement)[0];
+  return ServerConnector.getConfiguration().then(function(configuration) {
+    var options = select.options;
+    var handler = select.options[select.selectedIndex].value;
+    var converters = configuration.getModelConverters();
+    for (var i = 0; i < converters.length; i++) {
+      var converter = converters[i];
+      if (handler === converter.handler) {
+        return converter;
+      }
+    }
+    return null;
+  });
+};
+
 module.exports = AddProjectDialog;
diff --git a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
index cf366e7591..dcb98ffb1e 100644
--- a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
+++ b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
@@ -16,4 +16,26 @@ describe('AddProjectDialog', function() {
     });
     return dialog.init();
   });
+
+  describe('onFileUpload', function() {
+    it('default', function() {
+      var dialog = new AddProjectDialog({
+        element : testDiv,
+        customMap : null
+      });
+
+      var file = new Blob([ "<node></node>" ]);
+      file.name = "test.xml";
+      return dialog.init().then(function() {
+        return dialog.callListeners("onFileUpload", file);
+      }).then(function() {
+        assert.ok(dialog.getFileContent());
+        assert.equal("test", dialog.getProjectId());
+        return dialog.getConverter();
+      }).then(function(converter) {
+        assert.equal("xml", converter.extension);
+      });
+    });
+  });
+
 });
-- 
GitLab