diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index b75bca3bcd09416e247ca12ee98a9806cf756b67..cb9c8e5c83af74c46b5912a3e903265b1c960fa3 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -420,14 +420,32 @@ ServerConnector.getSbmlParameterUrl = function (queryParams, filterParams) { }); }; +/** + * + * @param {Object} queryParams + * @param {string} [queryParams.version] + * @param {string} [queryParams.organism] + * @param {string} [queryParams.type] + * @param {string} [queryParams.genomeId] + * @param {Object} filterParams + * + * @returns {string} + */ ServerConnector.getReferenceGenomeUrl = function (queryParams, filterParams) { - var version = this.getIdOrAsterisk(queryParams.version); + if (queryParams.genomeId !== undefined) { + return this.getApiUrl({ + type: "genomics/" + queryParams.genomeId + "/", + params: filterParams + }); + } else { + var version = this.getIdOrAsterisk(queryParams.version); - return this.getApiUrl({ - type: "genomics/taxonomies/" + queryParams.organism + "/genomeTypes/" + queryParams.type + "/versions/" + version - + "/", - params: filterParams - }); + return this.getApiUrl({ + type: "genomics/taxonomies/" + queryParams.organism + "/genomeTypes/" + queryParams.type + "/versions/" + version + + "/", + params: filterParams + }); + } }; ServerConnector.loginUrl = function () { @@ -1985,12 +2003,46 @@ ServerConnector.getPublications = function (params) { }); }; +/** + * + * @param {Object} params + * @param {string} [params.version] + * @param {string} [params.organism] + * @param {string} [params.type] + * @param {string} [params.genomeId] + * + * @returns {Promise} + */ ServerConnector.getReferenceGenome = function (params) { var self = this; var filterParams = {}; - return self.sendGetRequest(self.getReferenceGenomeUrl(params, filterParams)).then(function (content) { - return new ReferenceGenome(JSON.parse(content)); - }); + if (params.genomeId !== undefined) { + return self.getReferenceGenomes().then(function (referenceGenomes) { + for (var i = 0; i < referenceGenomes.leftPanel; i++) { + var genome = referenceGenomes[i]; + if (genome.getId() === params.genomeId()) { + return genome; + } + } + return null; + }); + } else { + return self.sendGetRequest(self.getReferenceGenomeUrl(params, filterParams)).then(function (content) { + return new ReferenceGenome(JSON.parse(content)); + }); + } +}; + +/** + * + * @param {Object} params + * @param {string} params.genomeId + * @returns {Promise} + */ +ServerConnector.removeReferenceGenome = function (params) { + var self = this; + var filterParams = {}; + return self.sendDeleteRequest(self.getReferenceGenomeUrl(params, filterParams)); }; ServerConnector.uploadFile = function (params) { diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js index 0ab83e41a584db1d9547d034a2ff23d553578a4d..a436197c2afc643d766b5fcb0159975209c58744 100644 --- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js +++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js @@ -160,11 +160,11 @@ AddProjectDialog.prototype.showValidatorsDialog = function () { AddProjectDialog.prototype.createGeneralTabContent = function () { var self = this; - var result = new Functions.createElement({ + var result = Functions.createElement({ type: "div" }); - var table = new Functions.createElement({ + var table = Functions.createElement({ type: "div", style: "display:table; width:100%" }); @@ -352,12 +352,12 @@ AddProjectDialog.prototype.createInputRow = function (params) { if (params.defaultValue === undefined) { params.defaultValue = ""; } - var label = new Functions.createElement({ + var label = Functions.createElement({ type: "div", style: "display:table-cell; width:200px", content: xss(params.labelName) }); - var input = new Functions.createElement({ + var input = Functions.createElement({ type: "div", style: "display:table-cell", content: "<input name='" + xss(params.inputName) + "' value='" + xss(params.defaultValue) + "' style='width:100%'/>", @@ -409,7 +409,7 @@ AddProjectDialog.prototype.createCheckboxRow = function (params) { }; AddProjectDialog.prototype.createRow = function (elements) { - var result = new Functions.createElement({ + var result = Functions.createElement({ type: "div", style: "display:table-row" }); @@ -420,7 +420,7 @@ AddProjectDialog.prototype.createRow = function (elements) { if (columnNumber === 0) { style += "width:200px;"; } - var labelContainer = new Functions.createElement({ + var labelContainer = Functions.createElement({ type: "div", style: style }); diff --git a/frontend-js/src/main/js/gui/admin/EditGenomeDialog.js b/frontend-js/src/main/js/gui/admin/EditGenomeDialog.js new file mode 100644 index 0000000000000000000000000000000000000000..0d9dfc25b58abefeb0bced9cf32959ffc11ab46c --- /dev/null +++ b/frontend-js/src/main/js/gui/admin/EditGenomeDialog.js @@ -0,0 +1,287 @@ +"use strict"; + +var Promise = require("bluebird"); + +var AbstractGuiElement = require('../AbstractGuiElement'); +var GuiConnector = require('../../GuiConnector'); + +var Functions = require('../../Functions'); +// noinspection JSUnusedLocalSymbols +var logger = require('../../logger'); + +var guiUtils = new (require('../leftPanel/GuiUtils'))(); + +/** + * + * @param {Object} params + * @param {HTMLElement} params.element + * @param {CustomMap} params.customMap + * @param {Configuration} params.configuration + * @param {ReferenceGenome} params.referenceGenome + * @param {ServerConnector} [params.serverConnector] + + * @constructor + * + * @extends AbstractGuiElement + */ +function EditGenomeDialog(params) { + AbstractGuiElement.call(this, params); + var self = this; + self.setReferenceGenome(params.referenceGenome); + + $(self.getElement()).css({overflow: "hidden"}); + + self.createGui(); + self.registerListenerType("onSave"); +} + +EditGenomeDialog.prototype = Object.create(AbstractGuiElement.prototype); +EditGenomeDialog.prototype.constructor = EditGenomeDialog; + +/** + * + * @param {ReferenceGenome} referenceGenome + */ +EditGenomeDialog.prototype.setReferenceGenome = function (referenceGenome) { + this._referenceGenome = referenceGenome; +}; + +/** + * + * @returns {ReferenceGenome} + */ +EditGenomeDialog.prototype.getReferenceGenome = function () { + return this._referenceGenome; +}; + +/** + * + * @returns {boolean} + */ +EditGenomeDialog.prototype.isNew = function () { + return this.getReferenceGenome().getId() === undefined; +}; + +/** + * + */ +EditGenomeDialog.prototype.createGui = function () { + var self = this; + var element = self.getElement(); + + var tabDiv = Functions.createElement({ + type: "div", + name: "tabView", + className: "tabbable boxed parentTabs", + style: "position:absolute;top:10px;bottom:40px;left:10px;right:10px" + }); + element.appendChild(tabDiv); + + var tabMenuDiv = Functions.createElement({ + type: "ul", + className: "nav nav-tabs" + }); + tabDiv.appendChild(tabMenuDiv); + + var tabContentDiv = Functions.createElement({ + type: "div", + className: "tab-content", + style: "height:100%" + }); + tabDiv.appendChild(tabContentDiv); + + self.createGeneralTab(tabMenuDiv, tabContentDiv); + $("a", tabMenuDiv).bind("click", function () { + //workaround for some css issues... + tabDiv.style.top = "40px"; + tabDiv.style.bottom = "10px"; + }); +}; + +/** + * + * @param {HTMLElement} tabMenuDiv + * @param {HTMLElement} tabContentDiv + */ +EditGenomeDialog.prototype.createGeneralTab = function (tabMenuDiv, tabContentDiv) { + var self = this; + self.addTab({ + tabMenuDiv: tabMenuDiv, + tabContentDiv: tabContentDiv, + name: "DETAILS", + content: self.createGeneralTabContent() + }); + +}; + +var id_counter = 0; + +/** + * + * @param {string} tab_name + * @returns {string} + */ +EditGenomeDialog.prototype.generateTabId = function (tab_name) { + var self = this; + var id = self.getReferenceGenome().getId(); + if (id === undefined) { + id = "new_genome_" + (id_counter++); + } + return id + tab_name.replace(" ", "_") + "_TAB"; +}; + +EditGenomeDialog.prototype.addTab = function (params) { + var id = this.generateTabId(params.name); + + var navLi = guiUtils.createTabMenuObject({ + id: id, + name: params.name, + navigationBar: params.tabMenuDiv + }); + params.tabMenuDiv.appendChild(navLi); + + var contentDiv = guiUtils.createTabContentObject({ + id: id, + navigationObject: navLi, + navigationBar: params.tabMenuDiv + }); + + $(contentDiv).css("overflow", "auto"); + if (params.content !== undefined) { + contentDiv.appendChild(params.content); + } + + params.tabContentDiv.appendChild(contentDiv); +}; + +/** + * + * @returns {HTMLElement} + */ +EditGenomeDialog.prototype.createGeneralTabContent = function () { + + var self = this; + + var result = Functions.createElement({ + type: "div", + style: "margin-top:10px;" + }); + + var table = Functions.createElement({ + type: "table", + name: "detailsTable", + className: "display", + style: "width:100%" + }); + result.appendChild(table); + + var menuRow = Functions.createElement({ + type: "div", + className: "minerva-menu-row", + style: "display:table-row; margin:10px" + }); + result.appendChild(menuRow); + + var saveUserButton = Functions.createElement({ + type: "button", + name: "saveUser", + content: '<span class="ui-icon ui-icon-disk"></span> SAVE', + onclick: function () { + return self.onSaveClicked().then(function () { + return self.close(); + }, GuiConnector.alert); + }, + xss: false + }); + var cancelButton = Functions.createElement({ + type: "button", + name: "cancelProject", + content: '<span class="ui-icon ui-icon-cancel"></span> CANCEL', + onclick: function () { + return self.close(); + }, + xss: false + }); + menuRow.appendChild(saveUserButton); + menuRow.appendChild(cancelButton); + + return result; +}; + +/** + * + * @returns {Promise} + */ +EditGenomeDialog.prototype.init = function () { + var self = this; + + var detailsTable = $("[name=detailsTable]", self.getElement())[0]; + + var dataTable = $(detailsTable).DataTable({ + columns: [{ + title: "Name" + }, { + title: "Value" + }], + paging: false, + ordering: false, + searching: false, + bInfo: false + }); + var data = []; + + var genome = self.getReferenceGenome(); + + data.push(['Type', '']); + data.push(['Organism', '']); + data.push(['Version', '']); + data.push(['Source url', '']); + data.push(['Local url', '']); + data.push(['Progress', '']); + + dataTable.clear().rows.add(data).draw(); + + return Promise.resolve(); +}; + +EditGenomeDialog.prototype.destroy = function () { + var self = this; + var div = self.getElement(); + + var detailsTable = $("[name=detailsTable]", div)[0]; + if ($.fn.DataTable.isDataTable(detailsTable)) { + $(detailsTable).DataTable().destroy(); + } + + + if ($(div).hasClass("ui-dialog-content")) { + $(div).dialog("destroy"); + } +}; + +EditGenomeDialog.prototype.open = function () { + var self = this; + var div = self.getElement(); + var title; + if (self.isNew()) { + title = "Download genome"; + } else { + var genome = self.getReferenceGenome(); + title = genome.getType() + " " + genome.getOrganism().getResource() + " " + genome.getVersion(); + } + if (!$(div).hasClass("ui-dialog-content")) { + $(div).dialog({ + title: title, + width: window.innerWidth / 2, + height: window.innerHeight / 2 + }); + } + $(div).dialog("open"); +}; + +EditGenomeDialog.prototype.close = function () { + var self = this; + $(self.getElement()).dialog("close"); +}; + +module.exports = EditGenomeDialog; diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js index dc3e4c6681148590e707f5f9075ed2aab1ce43b1..3d5cc604188aa6f5a0d98faca79f3c54b1890dda 100644 --- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js +++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js @@ -138,22 +138,22 @@ EditProjectDialog.prototype.createGeneralTabContent = function () { var self = this; var project = self.getProject(); - var result = new Functions.createElement({ + var result = Functions.createElement({ type: "div" }); - var table = new Functions.createElement({ + var table = Functions.createElement({ type: "div", style: "display:table" }); result.appendChild(table); - var projectIdRow = new Functions.createElement({ + var projectIdRow = Functions.createElement({ type: "div", style: "display:table-row" }); table.appendChild(projectIdRow); - projectIdRow.appendChild(new Functions.createElement({ + projectIdRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "ProjectId" @@ -204,46 +204,46 @@ EditProjectDialog.prototype.createGeneralTabContent = function () { }) })); - var nameRow = new Functions.createElement({ + var nameRow = Functions.createElement({ type: "div", style: "display:table-row" }); table.appendChild(nameRow); - nameRow.appendChild(new Functions.createElement({ + nameRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "Name" })); - nameRow.appendChild(new Functions.createElement({ + nameRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "<input name='projectName' value='" + xss(project.getName()) + "'/>", xss: false })); - var versionRow = new Functions.createElement({ + var versionRow = Functions.createElement({ type: "div", style: "display:table-row" }); table.appendChild(versionRow); - versionRow.appendChild(new Functions.createElement({ + versionRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "Version" })); - versionRow.appendChild(new Functions.createElement({ + versionRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "<input name='projectVersion' value='" + xss(project.getVersion()) + "'/>", xss: false })); - var diseaseRow = new Functions.createElement({ + var diseaseRow = Functions.createElement({ type: "div", style: "display:table-row" }); table.appendChild(diseaseRow); - diseaseRow.appendChild(new Functions.createElement({ + diseaseRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "Disease" @@ -252,19 +252,19 @@ EditProjectDialog.prototype.createGeneralTabContent = function () { if (project.getDisease() !== undefined) { disease = xss(project.getDisease().getResource()); } - diseaseRow.appendChild(new Functions.createElement({ + diseaseRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "<input name='projectDisease' value='" + disease + "'/>", xss: false })); - var organismRow = new Functions.createElement({ + var organismRow = Functions.createElement({ type: "div", style: "display:table-row" }); table.appendChild(organismRow); - organismRow.appendChild(new Functions.createElement({ + organismRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "Organism" @@ -273,19 +273,19 @@ EditProjectDialog.prototype.createGeneralTabContent = function () { if (project.getOrganism() !== undefined) { organism = xss(project.getOrganism().getResource()); } - organismRow.appendChild(new Functions.createElement({ + organismRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "<input name='projectOrganism' value='" + organism + "'/>", xss: false })); - var emailRow = new Functions.createElement({ + var emailRow = Functions.createElement({ type: "div", style: "display:table-row" }); table.appendChild(emailRow); - emailRow.appendChild(new Functions.createElement({ + emailRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "Notify email" @@ -294,7 +294,7 @@ EditProjectDialog.prototype.createGeneralTabContent = function () { if (project.getNotifyEmail() !== undefined) { email = xss(project.getNotifyEmail()); } - emailRow.appendChild(new Functions.createElement({ + emailRow.appendChild(Functions.createElement({ type: "div", style: "display:table-cell", content: "<input name='projectNotifyEmail' value='" + email + "'/>", diff --git a/frontend-js/src/main/js/gui/admin/EditUserDialog.js b/frontend-js/src/main/js/gui/admin/EditUserDialog.js index 6b631121bd8f81047778829264d5299aaed40cd0..3030c8cab407a8ce2f5c38275cba2f4acd858435 100644 --- a/frontend-js/src/main/js/gui/admin/EditUserDialog.js +++ b/frontend-js/src/main/js/gui/admin/EditUserDialog.js @@ -145,12 +145,12 @@ EditUserDialog.prototype.createGeneralTabContent = function () { var self = this; - var result = new Functions.createElement({ + var result = Functions.createElement({ type: "div", style: "margin-top:10px;" }); - var table = new Functions.createElement({ + var table = Functions.createElement({ type: "table", name: "detailsTable", className: "display", diff --git a/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js b/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js index bfb7483b08cd9770fa15b9f6a773147577aa3203..133633f9daadb40963923e56cd1c906643d5c11a 100644 --- a/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js +++ b/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js @@ -1,15 +1,18 @@ "use strict"; -/* exported Promise*/ - var AbstractAdminPanel = require('./AbstractAdminPanel'); +var EditGenomeDialog = require('./EditGenomeDialog'); var Functions = require('../../Functions'); +var GuiConnector = require('../../GuiConnector'); var PrivilegeType = require('../../map/data/PrivilegeType'); +var ReferenceGenome = require('../../map/data/ReferenceGenome'); // noinspection JSUnusedLocalSymbols var logger = require('../../logger'); +var Promise = require('bluebird'); + /** * * @param {Configuration} params.configuration @@ -88,6 +91,24 @@ GenomeAdminPanel.prototype._createGui = function () { } }); + $(genomesTable).on("click", "[name='removeGenome']", function () { + var button = this; + return self.askConfirmRemoval({ + title: "INFO", + content: "Do you really want to remove this genome?", + input: false + }).then(function (param) { + if (param.status) { + return self.getServerConnector().removeReferenceGenome({genomeId: $(button).attr("data")}); + } + }).catch(GuiConnector.alert); + }); + + $(genomesTable).on("click", "[name='editGenome']", function () { + var button = this; + return self.showEditDialog($(button).attr("data")).catch(GuiConnector.alert); + }); + }; /** @@ -163,7 +184,7 @@ GenomeAdminPanel.prototype.genomeToTableRow = function (genome, user) { if (user.hasPrivilege(self.getConfiguration().getPrivilegeType(PrivilegeType.MANAGE_GENOMES))) { disabled = ""; } - row[5] = "<button name='showEditDialog' data='" + genome.getId() + "'" + disabled + "><i class='fa fa-edit' style='font-size:17px'></i></button>"; + row[5] = "<button name='editGenome' data='" + genome.getId() + "'" + disabled + "><i class='fa fa-edit' style='font-size:17px'></i></button>"; row[6] = "<button name='removeGenome' data='" + genome.getId() + "'" + disabled + "><i class='fa fa-trash-o' style='font-size:17px'></button>"; return row; @@ -180,7 +201,68 @@ GenomeAdminPanel.prototype.destroy = function () { if ($.fn.DataTable.isDataTable(table)) { $(table).DataTable().destroy(); } - return AbstractAdminPanel.prototype.destroy.call(self); + var promises = []; + for (var key in self._dialogs) { + if (self._dialogs.hasOwnProperty(key)) { + promises.push(self._dialogs[key].destroy()); + } + } + promises.push(AbstractAdminPanel.prototype.destroy.call(self)); + + return Promise.all(promises); }; +/** + * + * @param {ReferenceGenome} [genome] + * @returns {Promise} + */ +GenomeAdminPanel.prototype.getDialog = function (genome) { + var self = this; + if (self._dialogs === undefined) { + self._dialogs = []; + } + var id = genome.getId(); + var dialog = self._dialogs[id]; + if (dialog === undefined) { + dialog = new EditGenomeDialog({ + element: Functions.createElement({ + type: "div" + }), + configuration: self.getConfiguration(), + referenceGenome: genome, + customMap: null + }); + self._dialogs[id] = dialog; + if (id === "null") { + dialog.addListener("onSave", function () { + return self.onRefreshClicked(); + }); + } + return dialog.init().then(function () { + return dialog; + }); + } else { + return Promise.resolve(dialog); + } +}; + +GenomeAdminPanel.prototype.showEditDialog = function (id) { + var self = this; + GuiConnector.showProcessing(); + return self.getServerConnector().getReferenceGenome({genomeId: id}).then(function (referenceGenome) { + if (referenceGenome === null) { + referenceGenome = new ReferenceGenome(); + } + return self.getDialog(referenceGenome); + }).then(function (dialog) { + dialog.open(); + GuiConnector.hideProcessing(); + }).catch(function (error) { + GuiConnector.hideProcessing(); + return Promise.reject(error); + }); +}; + + module.exports = GenomeAdminPanel; diff --git a/frontend-js/src/test/js/gui/admin/EditGenomeDialog-test.js b/frontend-js/src/test/js/gui/admin/EditGenomeDialog-test.js new file mode 100644 index 0000000000000000000000000000000000000000..40544872deb3d50c62aa656d88ce6e3b1d8ed7c0 --- /dev/null +++ b/frontend-js/src/test/js/gui/admin/EditGenomeDialog-test.js @@ -0,0 +1,38 @@ +"use strict"; + +require("../../mocha-config"); + +var EditGenomeDialog = require('../../../../main/js/gui/admin/EditGenomeDialog'); +var ReferenceGenome = require('../../../../main/js/map/data/ReferenceGenome'); +var ValidationError = require('../../../../main/js/ValidationError'); +var ServerConnector = require('../../ServerConnector-mock'); + +var logger = require('../../logger'); + +var chai = require('chai'); +var assert = chai.assert; +var expect = chai.expect; + +describe('EditGenomeDialog', function () { + + describe('init', function () { + it('new genome', function () { + var dialog; + var project; + var genome = new ReferenceGenome(); + return ServerConnector.getProject().then(function (result) { + project = result; + dialog = new EditGenomeDialog({ + element: testDiv, + project: project, + referenceGenome: genome, + customMap: null + }); + return dialog.init(); + }).then(function () { + dialog.destroy(); + }); + }); + }); + +}); diff --git a/frontend-js/src/test/js/gui/admin/GenomeAdminPanel-test.js b/frontend-js/src/test/js/gui/admin/GenomeAdminPanel-test.js index a1a4567a41efe66be04531e05f10c49a5464d76a..0c0b1b69591f990aee296392fcbd36166d4fd0a8 100644 --- a/frontend-js/src/test/js/gui/admin/GenomeAdminPanel-test.js +++ b/frontend-js/src/test/js/gui/admin/GenomeAdminPanel-test.js @@ -6,6 +6,7 @@ var GenomeAdminPanel = require('../../../../main/js/gui/admin/GenomeAdminPanel') var ConfigurationType = require('../../../../main/js/ConfigurationType'); var ServerConnector = require('../../ServerConnector-mock'); var logger = require('../../logger'); +var Promise = require('bluebird'); var chai = require('chai'); var assert = chai.assert; @@ -28,4 +29,44 @@ describe('GenomeAdminPanel', function () { }); }); }); + it('open edit dialog', function () { + helper.loginAsAdmin(); + var mapTab; + return ServerConnector.getConfiguration().then(function (configuration) { + mapTab = new GenomeAdminPanel({ + element: testDiv, + configuration: configuration, + serverConnector: ServerConnector + }); + return mapTab.init(); + }).then(function () { + assert.equal(0, logger.getWarnings().length); + var element = $("[name='editGenome']")[0]; + return helper.triggerJqueryEvent(element, "click"); + }).then(function () { + return mapTab.destroy(); + }); + }); + + it('remove genome', function () { + helper.loginAsAdmin(); + var mapTab; + return ServerConnector.getConfiguration().then(function (configuration) { + mapTab = new GenomeAdminPanel({ + element: testDiv, + configuration: configuration, + serverConnector: ServerConnector + }); + return mapTab.init(); + }).then(function () { + mapTab.askConfirmRemoval = function () { + return Promise.resolve({status: true}); + }; + assert.equal(0, logger.getWarnings().length); + var element = $("[name='removeGenome']")[0]; + return helper.triggerJqueryEvent(element, "click"); + }).then(function () { + return mapTab.destroy(); + }); + }); }); diff --git a/frontend-js/testFiles/apiCalls/genomics/43/DELETE_token=ADMIN_TOKEN_ID& b/frontend-js/testFiles/apiCalls/genomics/43/DELETE_token=ADMIN_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..9e26dfeeb6e641a33dae4961196235bdb965b21b --- /dev/null +++ b/frontend-js/testFiles/apiCalls/genomics/43/DELETE_token=ADMIN_TOKEN_ID& @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeController.java b/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeController.java index 51342dd986d13258b352f1d76087517dea660e20..b8c950515a2726d63ff106aed1b03ba30ac2833e 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeController.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.api.genomics; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -67,5 +68,13 @@ public class ReferenceGenomeController extends BaseController { ) throws SecurityException, QueryException, ObjectNotFoundException { return referenceGenomeController.getReferenceGenomes(token); } + + @RequestMapping(value = "/genomics/{genomeId}/", method = { RequestMethod.DELETE }, produces = { MediaType.APPLICATION_JSON_VALUE }) + public Map<String, Object> removeGenome(// + @PathVariable(value = "genomeId") String genomeId, // + @CookieValue(value = Configuration.AUTH_TOKEN) String token // + ) throws SecurityException, IOException { + return referenceGenomeController.removeGenome(genomeId, token); + } } \ No newline at end of file diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeRestImpl.java index a47b01f80e3029e457ad8a9b4965d476e3a7b248..cedb3cc467f21ed1c7d78cbcdd53bc5f8d345c39 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/genomics/ReferenceGenomeRestImpl.java @@ -1,6 +1,7 @@ package lcsb.mapviewer.api.genomics; import java.io.FileNotFoundException; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -23,6 +24,8 @@ import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.layout.ReferenceGenome; import lcsb.mapviewer.model.map.layout.ReferenceGenomeGeneMapping; import lcsb.mapviewer.model.map.layout.ReferenceGenomeType; +import lcsb.mapviewer.model.user.PrivilegeType; +import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.services.SecurityException; import lcsb.mapviewer.services.interfaces.IReferenceGenomeService; @@ -178,4 +181,13 @@ public class ReferenceGenomeRestImpl extends BaseRestImpl { return result; } + public Map<String, Object> removeGenome(String genomeId, String token) throws SecurityException, IOException { + if (!getUserService().userHasPrivilege(token, PrivilegeType.MANAGE_GENOMES)) { + throw new SecurityException("Access denied"); + } + ReferenceGenome genome = referenceGenomeService.getReferenceGenomeById(Integer.parseInt(genomeId), token); + referenceGenomeService.removeGenome(genome); + return okStatus(); + } + } diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ReferenceGenomeService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ReferenceGenomeService.java index b3bc006549d1391246bc18d19aead5a5caeea55e..b7c1d54c7cf902a28928bacde42af146d56458ae 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ReferenceGenomeService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ReferenceGenomeService.java @@ -143,4 +143,9 @@ public class ReferenceGenomeService implements IReferenceGenomeService { return null; } + @Override + public ReferenceGenome getReferenceGenomeById(int id, String authenticationToken) { + return referenceGenomeDao.getById(id); + } + } diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IReferenceGenomeService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IReferenceGenomeService.java index c87597d001d25c1ba154cbac89389ebdf9d9f7d1..71af2fae75eedd66a5a6b5648d7d85eb0b1f0d73 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IReferenceGenomeService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IReferenceGenomeService.java @@ -142,4 +142,6 @@ public interface IReferenceGenomeService { */ ReferenceGenome getReferenceGenomeViewByParams(MiriamData organism, ReferenceGenomeType genomeType, String version, String authenticationToken); + + ReferenceGenome getReferenceGenomeById(int id, String authenticationToken); }