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