diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index cb419086e9453c8bf57c7d7fa59b4e24ade3c2f5..19c3339fd9c9915eb5b8554c578e0d88288d3f06 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -11,6 +11,7 @@ var request = require('request'); var HttpStatus = require('http-status-codes'); var Alias = require('./map/data/Alias'); +var Annotation = require('./map/data/Annotation'); var Chemical = require('./map/data/Chemical'); var Comment = require('./map/data/Comment'); var Configuration = require('./Configuration'); @@ -619,6 +620,49 @@ ServerConnector.getProject = function(projectId) { }); }; +ServerConnector.updateProject = function(project) { + var self = this; + var queryParams = { + projectId : project.getProjectId() + }; + var filterParams = { + project : { + name : project.getName(), + version : project.getVersion(), + notifyEmail : project.getNotifyEmail(), + organism : self.serialize(project.getOrganism()), + disease : self.serialize(project.getDisease()), + }, + }; + return self.sendPatchRequest(self.getProjectUrl(queryParams), filterParams).then(function(content) { + var downloadedProject = new Project(content); + project.update(downloadedProject); + return project; + }).then(null, function(error) { + if ((error instanceof NetworkError)) { + switch (error.statusCode) { + case HttpStatus.FORBIDDEN: + return Promise.reject(new SecurityError("Access denied.")); + default: + return Promise.reject(error); + } + } else { + return Promise.reject(error); + } + }); +}; + +ServerConnector.serialize = function(object) { + var result = {}; + if (object instanceof Annotation) { + result.type = object.getType(); + result.resource = object.getResource(); + } else { + throw new Error("Unhandled object type: " + (typeof object)); + } + return result; +}; + ServerConnector.getProjects = function(reload) { var self = this; if (self._projects.length > 0 && !reload) { diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js index 1c70a7d3bdf5b0133d1fc094e838adcc2be7b4c1..543276cac52382101e7e19df5f4de3ff3b2b0947 100644 --- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js +++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js @@ -3,6 +3,7 @@ /* exported logger */ var AbstractGuiElement = require('../AbstractGuiElement'); +var Annotation = require('../../map/data/Annotation'); var GuiConnector = require('../../GuiConnector'); var Functions = require('../../functions'); @@ -125,7 +126,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() { nameRow.appendChild(new Functions.createElement({ type : "div", style : "display:table-cell", - content : "<input value='" + project.getName() + "'/>", + content : "<input name='projectName' value='" + project.getName() + "'/>", })); var versionRow = new Functions.createElement({ @@ -141,7 +142,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() { versionRow.appendChild(new Functions.createElement({ type : "div", style : "display:table-cell", - content : "<input value='" + project.getVersion() + "'/>", + content : "<input name='projectVersion' value='" + project.getVersion() + "'/>", })); var diseaseRow = new Functions.createElement({ @@ -161,7 +162,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() { diseaseRow.appendChild(new Functions.createElement({ type : "div", style : "display:table-cell", - content : "<input value='" + disease + "'/>", + content : "<input name='projectDisease' value='" + disease + "'/>", })); var organismRow = new Functions.createElement({ @@ -181,7 +182,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() { organismRow.appendChild(new Functions.createElement({ type : "div", style : "display:table-cell", - content : "<input value='" + organism + "'/>", + content : "<input name='projectOrganism' value='" + organism + "'/>", })); var emailRow = new Functions.createElement({ @@ -201,7 +202,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function() { emailRow.appendChild(new Functions.createElement({ type : "div", style : "display:table-cell", - content : "<input value='" + email + "'/>", + content : "<input name='projectNotifyEmail' value='" + email + "'/>", })); var menuRow = Functions.createElement({ @@ -216,7 +217,9 @@ EditProjectDialog.prototype.createGeneralTabContent = function() { name : "saveProject", content : '<span class="ui-icon ui-icon-disk"></span> SAVE', onclick : function() { - return self.onSaveClicked().then(null, GuiConnector.alert); + return self.onSaveClicked().then(function() { + return self.close(); + }, GuiConnector.alert); }, }); var cancelButton = Functions.createElement({ @@ -289,6 +292,30 @@ EditProjectDialog.prototype.open = function() { $(div).dialog("open"); }; +var prepareMiriamData = function(type, resource) { + if (resource === "" || resource === undefined || resource === null) { + return null; + } else { + return new Annotation({ + type : type, + resource : resource + }); + } +} + +EditProjectDialog.prototype.onSaveClicked = function() { + var self = this; + var project = self.getProject(); + var element = self.getElement(); + project.setName($("[name='projectName']", element)[0].value); + project.setVersion($("[name='projectVersion']", element)[0].value); + project.setNotifyEmail($("[name='projectNotifyEmail']", element)[0].value); + var organism = prepareMiriamData("TAXONOMY", $("[name='projectOrganism']", element)[0].value); + project.setOrganism(organism); + var disease = prepareMiriamData("MESH_2012", $("[name='projectDisease']", element)[0].value); + project.setDisease(disease); + return ServerConnector.updateProject(project); +}; EditProjectDialog.prototype.close = function() { $(this.getElement()).dialog("close"); }; diff --git a/frontend-js/src/test/js/ServerConnector-test.js b/frontend-js/src/test/js/ServerConnector-test.js index 3bf7e2c47e3b1407a384d80d39a66a689d7f65b8..7397a0351b677d352806465f5a574e38429145ae 100644 --- a/frontend-js/src/test/js/ServerConnector-test.js +++ b/frontend-js/src/test/js/ServerConnector-test.js @@ -45,6 +45,21 @@ describe('ServerConnector', function() { }); }); + describe('updateProject', function() { + it('default', function() { + var project; + var newVersion = "2.01"; + return ServerConnector.getProject().then(function(result) { + project = result; + project.setVersion(newVersion); + return ServerConnector.updateProject(project); + }).then(function(result) { + assert.ok(project === result); + assert.equal(newVersion, result.getVersion()); + }); + }); + }); + it('getModels', function() { return ServerConnector.getModels("sample").then(function(models) { assert.equal(1, models.length); diff --git a/frontend-js/src/test/js/gui/admin/EditProjectDialog.js b/frontend-js/src/test/js/gui/admin/EditProjectDialog.js index b60c090763b4177374ea1616914d3f21fd1d5946..78ffb0c1eab810bb32810584141cbccc512ad4b2 100644 --- a/frontend-js/src/test/js/gui/admin/EditProjectDialog.js +++ b/frontend-js/src/test/js/gui/admin/EditProjectDialog.js @@ -26,4 +26,21 @@ describe('EditProjectDialog', function() { }); }); + it('onSaveClicked', function() { + var dialog; + var project; + return ServerConnector.getProject().then(function(result) { + project = result; + project.setVersion("2.01"); + dialog = new EditProjectDialog({ + element : testDiv, + project : project, + customMap : null, + }); + return dialog.onSaveClicked(); + }).then(function(result) { + assert.ok(project === result); + }); + }); + }); diff --git a/frontend-js/testFiles/apiCalls/projects/sample/PATCH_project.disease.resource=D010300&project.disease.type=MESH_2012&project.name=UNKNOWN DISEASE MAP&project.organism.resource=1570291&project.organism.type=TAXONOMY&project.version=2.01&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/PATCH_project.disease.resource=D010300&project.disease.type=MESH_2012&project.name=UNKNOWN DISEASE MAP&project.organism.resource=1570291&project.organism.type=TAXONOMY&project.version=2.01&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..559ba91e6805e1a77b91b716b6c59dfbd8e15586 --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/PATCH_project.disease.resource=D010300&project.disease.type=MESH_2012&project.name=UNKNOWN DISEASE MAP&project.organism.resource=1570291&project.organism.type=TAXONOMY&project.version=2.01&token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +{"version":"2.01","disease":{"resource":"D010300","link":"http://bioportal.bioontology.org/ontologies/1351?p=terms&conceptid=D010300","id":1104479,"type":"MESH_2012"},"organism":{"resource":"1570291","link":"http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Info&id=1570291","id":1104480,"type":"TAXONOMY"},"idObject":14898,"status":"Ok","progress":100.0,"name":"UNKNOWN DISEASE MAP","projectId":"sample","overviewImageViews":[],"topOverviewImage":null} \ No newline at end of file