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