From d7f142ab4e40a435a24c3bff6edbc14e0099fa95 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Fri, 5 Apr 2019 10:41:20 +0200 Subject: [PATCH] exporting reactions allow to filter by submap --- CHANGELOG | 2 + .../main/js/gui/export/AbstractExportPanel.js | 65 +++++++++++++++++++ .../main/js/gui/export/NetworkExportPanel.js | 15 ++++- 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ea9fc6127b..4ed22bfd9a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -35,6 +35,8 @@ minerva (12.3.0~alpha.0) unstable; urgency=low type (#784) * Small improvement: when plugin listeners crash the system notifies user about problem with a plugin (#767) + * Small improvement: when exporting list of reaction there is possibility to + filter by (sub)map (#615) * Bug fix: progress bar of gene genome mapping upload is refreshing properly (#728) * Bug fix: when editing project Disease and Organism could not be removed diff --git a/frontend-js/src/main/js/gui/export/AbstractExportPanel.js b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js index 345bac1d52..167770bd57 100644 --- a/frontend-js/src/main/js/gui/export/AbstractExportPanel.js +++ b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js @@ -183,6 +183,71 @@ AbstractExportPanel.prototype._createSelectTypeDiv = function (elementTypes, pan return typeDiv; }; +/** + * + * @param {MapModel[]} models + * @returns {HTMLElement} + * @protected + */ +AbstractExportPanel.prototype._createSelectSubmapDiv = function (models) { + var panelName = " (sub)map:"; + var mapDiv = Functions.createElement({ + type: "div", + name: "mapSelectDiv" + }); + mapDiv.appendChild(Functions.createElement({ + type: "h4", + content: panelName + })); + var choicesContainer = Functions.createElement({ + type: "ul", + className: "minerva-checkbox-grid" + }); + mapDiv.appendChild(choicesContainer); + + var sortedModels = models.slice(); + sortedModels.sort(function(a, b) { + if (a.getName() < b.getName()) { + return -1; + } + if (a.getName() > b.getName()) { + return 1; + } + return 0; + }); + + for (var i = 0; i < sortedModels.length; i++) { + var model = sortedModels[i]; + var name = model.getName(); + var id = model.getId(); + var row = Functions.createElement({ + type: "li", + content: "<div class=\"checkbox\"><label> <input type=\"checkbox\" name=\"" + name + "\" value=\"" + id + "\" />" + name + "</label></div>", + xss: false + }); + choicesContainer.appendChild(row); + } + return mapDiv; +}; + +/** + * + * @param {HTMLElement} [htmlElement] + * @returns {number[]} + */ +AbstractExportPanel.prototype.getSelectedSubmapIds = function (htmlElement) { + var self = this; + if (htmlElement === undefined) { + htmlElement = self.getElement(); + } + var div = $("div[name='mapSelectDiv']", $(htmlElement))[0]; + var result = []; + $(":checked", $(div)).each(function (index, element) { + result.push(parseInt($(element).val())); + }); + return result; +}; + /** * * @param {HTMLElement} [htmlElement] diff --git a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js index 4f84e0ead6..7e5bed4223 100644 --- a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js +++ b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js @@ -46,6 +46,10 @@ NetworkExportPanel.prototype.init = function () { var reactionTypeDiv = Functions.createElement({type: "div", name: "reactionTypes"}); reactionTypeDiv.appendChild(self._createSelectTypeDiv(configuration.getReactionTypes(), "Reaction type")); element.appendChild(reactionTypeDiv); + var submapDiv = Functions.createElement({type: "div", name: "submapTypes"}); + submapDiv.appendChild(self._createSelectSubmapDiv(self.getProject().getModels())); + element.appendChild(submapDiv); + element.appendChild(self._createSelectColumnDiv(self.getAllColumns())); return self.getServerConnector().getProjectStatistics(self.getProject().getProjectId()).then(function (statistics) { return self._createMiriamTypeDiv(statistics.getReactionAnnotations()); @@ -135,12 +139,18 @@ NetworkExportPanel.prototype.getAllColumns = function () { * @param {Reaction} reaction * @param {Object<string,boolean>} elementIds * @param {string[]} reactionTypes + * @param {number[]} submapIds * @returns {boolean} */ -function matchReaction(reaction, elementIds, reactionTypes) { +function matchReaction(reaction, elementIds, reactionTypes, submapIds) { if ($.inArray(reaction.getType(), reactionTypes) === -1) { return false; } + if (submapIds.length > 0) { + if ($.inArray(reaction.getModelId(), submapIds) === -1) { + return false; + } + } var count = 0; reaction.getElements().forEach(function (element) { if (elementIds[element.getId()]) { @@ -157,6 +167,7 @@ function matchReaction(reaction, elementIds, reactionTypes) { NetworkExportPanel.prototype.createResponseString = function () { var self = this; var elementTypes, reactionTypes, miriamTypes; + var submapIds = self.getSelectedSubmapIds(); var includedCompartmentIds = []; var excludedCompartmentIds = []; var models = self.getProject().getModels(); @@ -210,7 +221,7 @@ NetworkExportPanel.prototype.createResponseString = function () { for (var i = 0; i < models.length; i++) { for (var j = 0; j < reactionsByModel[i].length; j++) { var reaction = reactionsByModel[i][j]; - if (matchReaction(reaction, elementIds, reactionTypes)) { + if (matchReaction(reaction, elementIds, reactionTypes, submapIds)) { reactions.push(reaction); } } -- GitLab