From c337bf436e2fb95f2faaf159b87d247b55918a84 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 5 Apr 2018 11:44:01 +0200
Subject: [PATCH] copying annotators settings from other elemnts in tree and
 applying settings to subtree added

---
 frontend-js/package-lock.json                 |  54 ++++-----
 frontend-js/src/main/js/ServerConnector.js    |   2 +-
 .../src/main/js/gui/admin/AddProjectDialog.js |   3 +-
 .../js/gui/admin/ChooseAnnotatorsDialog.js    | 114 +++++++++++++++---
 .../src/main/js/map/data/UserPreferences.js   |   3 +-
 .../gui/admin/ChooseAnnotatorsDialog-test.js  |  41 +++++--
 .../PATCH_token=MOCK_TOKEN_ID&                |   1 +
 7 files changed, 164 insertions(+), 54 deletions(-)
 create mode 100644 frontend-js/testFiles/apiCalls/users/anonymous.updatePreferences/PATCH_token=MOCK_TOKEN_ID&

diff --git a/frontend-js/package-lock.json b/frontend-js/package-lock.json
index 693e8cf2b7..5db0016f8d 100644
--- a/frontend-js/package-lock.json
+++ b/frontend-js/package-lock.json
@@ -45,30 +45,38 @@
         "litemol": "github:dsehnal/LiteMol#a5419c696faa84530dd93acd55b747cf8136902b"
       },
       "dependencies": {
+        "ProtVista": {
+          "version": "git://github.com/davidhoksza/protvista.git#4e4bb737ba1e183291505bd25f8bae2e651ce21e",
+          "dev": true,
+          "requires": {
+            "d3": "3.5.17",
+            "file-saver": "1.3.3",
+            "jquery": "2.2.4",
+            "jszip": "3.1.4",
+            "underscore": "1.8.3"
+          },
+          "dependencies": {
+            "jquery": {
+              "version": "2.2.4",
+              "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz",
+              "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=",
+              "dev": true
+            }
+          }
+        },
         "jquery": {
           "version": "3.3.1",
           "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz",
           "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==",
           "dev": true
-        }
-      }
-    },
-    "ProtVista": {
-      "version": "git://github.com/davidhoksza/protvista.git#4e4bb737ba1e183291505bd25f8bae2e651ce21e",
-      "dev": true,
-      "requires": {
-        "d3": "3.5.17",
-        "file-saver": "1.3.3",
-        "jquery": "2.2.4",
-        "jszip": "3.1.4",
-        "underscore": "1.8.3"
-      },
-      "dependencies": {
-        "jquery": {
-          "version": "2.2.4",
-          "resolved": "https://registry.npmjs.org/jquery/-/jquery-2.2.4.tgz",
-          "integrity": "sha1-LInWiJterFIqfuoywUUhVZxsvwI=",
-          "dev": true
+        },
+        "litemol": {
+          "version": "github:dsehnal/LiteMol#a5419c696faa84530dd93acd55b747cf8136902b",
+          "dev": true,
+          "requires": {
+            "@types/react": "15.6.15",
+            "@types/react-dom": "15.5.7"
+          }
         }
       }
     },
@@ -2050,14 +2058,6 @@
         "immediate": "3.0.6"
       }
     },
-    "litemol": {
-      "version": "github:dsehnal/LiteMol#a5419c696faa84530dd93acd55b747cf8136902b",
-      "dev": true,
-      "requires": {
-        "@types/react": "15.6.15",
-        "@types/react-dom": "15.5.7"
-      }
-    },
     "lodash": {
       "version": "4.17.4",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 48c374d88e..c08e3bddbe 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -1105,7 +1105,7 @@ ServerConnector.updateUserPreferences = function (params) {
     var obj = JSON.parse(content);
     var user = new User(obj);
     if (self._usersByLogin[user.getLogin()] !== undefined) {
-      self._usersByLogin[user.getLogin()].update(user);
+      self._usersByLogin[user.getLogin()].getPreferences().update(user.getPreferences());
     } else {
       self._usersByLogin[user.getLogin()] = user;
     }
diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
index 22d5dc4f98..d6bc264d41 100644
--- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
@@ -129,7 +129,8 @@ AddProjectDialog.prototype.showAnnotatorsDialog = function () {
   if (self._annotatorsDialog === undefined) {
     self._annotatorsDialog = new ChooseAnnotatorsDialog({
       element: Functions.createElement({type: "div"}),
-      customMap: null
+      customMap: null,
+      configuration: self.getConfiguration()
     });
     promise = self._annotatorsDialog.init();
   } else {
diff --git a/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js b/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js
index 53b4b2b31d..2282b96c74 100644
--- a/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js
+++ b/frontend-js/src/main/js/gui/admin/ChooseAnnotatorsDialog.js
@@ -62,15 +62,53 @@ function onChangeParameterValue(element, user) {
   return ServerConnector.updateUserPreferences({user: user, preferences: data}).then(null, GuiConnector.alert);
 }
 
+ChooseAnnotatorsDialog.prototype.saveAnnotatorsInfo = function (elementTypes, selectedAnnotators) {
+  selectedAnnotators = selectedAnnotators.slice();
+  return ServerConnector.getLoggedUser().then(function (user) {
+
+    var data = new UserPreferences();
+
+    var elementAnnotators = {};
+    for (var i = 0; i < elementTypes.length; i++) {
+      elementAnnotators[elementTypes[i].className] = selectedAnnotators;
+
+      var userAnnotators = user.getPreferences().getElementAnnotators(elementTypes[i].className);
+      userAnnotators.length = 0;
+      userAnnotators.push.apply(userAnnotators, selectedAnnotators);
+    }
+    data.setElementAnnotators(elementAnnotators);
+    return ServerConnector.updateUserPreferences({
+      user: user,
+      preferences: data
+    });
+  }).catch(GuiConnector.alert);
+};
+
+ChooseAnnotatorsDialog.prototype.getAllChildrenTypesIfNeeded = function (elementType, includeChildren) {
+  var result = [elementType];
+  if (includeChildren) {
+    var queue = [elementType];
+    var elementTypes = this.getConfiguration().getElementTypes();
+    while (queue.length > 0) {
+      var type = queue.shift();
+      for (var i = 0; i < elementTypes.length; i++) {
+        if (type.className === elementTypes[i].parentClass) {
+          queue.push(elementTypes[i]);
+          result.push(elementTypes[i]);
+        }
+      }
+    }
+  }
+  return result;
+};
+
+
 ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) {
   var self = this;
 
-  var configuration;
+  var configuration = self.getConfiguration();
 
-  return ServerConnector.getConfiguration().then(function (result) {
-    configuration = result;
-    return ServerConnector.getLoggedUser();
-  }).then(function (user) {
+  return ServerConnector.getLoggedUser().then(function (user) {
     var element = $("[name='annotatorListBox']", self.getElement())[0];
     var annotatorsParams = $(".minerva-annotators-params", self.getElement())[0];
     Functions.removeChildren(element);
@@ -81,6 +119,52 @@ ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) {
     });
 
     element.appendChild(selectElement);
+    var includeChildrenCheckbox = Functions.createElement({type: "input", inputType: "checkbox"});
+    element.appendChild(includeChildrenCheckbox);
+    element.appendChild(Functions.createElement({type: "span", content: "Apply to all in subtree"}));
+    element.appendChild(Functions.createElement({type: "br"}));
+    var copyFromButton = Functions.createElement({
+      type: "button", content: "Copy from", onclick: function () {
+        var typeClassName = copyFromSelect.value;
+        var annotators;
+        for (var i = 0; i < configuration.getElementTypes().length; i++) {
+          var type = configuration.getElementTypes()[i];
+          if (typeClassName === type.className) {
+            annotators = user.getPreferences().getElementAnnotators(typeClassName);
+          }
+        }
+        if (annotators === undefined) {
+          return GuiConnector.alert("Invalid element type: " + copyFromSelect.value);
+        } else {
+          var includeChildren = includeChildrenCheckbox.checked;
+          return self.saveAnnotatorsInfo(self.getAllChildrenTypesIfNeeded(elementType, includeChildren), annotators).then(function () {
+            return self.setElementType(elementType);
+          });
+        }
+      }
+    });
+    element.appendChild(copyFromButton);
+    var copyFromSelect = Functions.createElement({type: "select", style: "margin:5px"});
+    element.appendChild(copyFromSelect);
+    var options = [], i;
+    for (i = 0; i < configuration.getElementTypes().length; i++) {
+      var type = configuration.getElementTypes()[i];
+      var name = type.className;
+      if (name.indexOf(".") > 0) {
+        name = name.substr(name.lastIndexOf(".") + 1);
+      }
+      options.push(Functions.createElement({
+        type: "option",
+        value: type.className,
+        content: name
+      }));
+    }
+    options.sort(function (a, b) {
+      return a.text === b.text ? 0 : a.text < b.text ? -1 : 1
+    });
+    for (i = 0; i < options.length; i++) {
+      copyFromSelect.appendChild(options[i]);
+    }
 
     var annotators = configuration.getElementAnnotators(elementType);
 
@@ -90,7 +174,7 @@ ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) {
 
     var entries = [];
 
-    for (var i = 0; i < annotators.length; i++) {
+    for (i = 0; i < annotators.length; i++) {
       var annotator = annotators[i];
       var entry = {name: annotator.getName(), value: annotator.getClassName(), selected: false};
       for (var j = 0; j < selectedAnnotators.length; j++) {
@@ -115,9 +199,6 @@ ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) {
           annotator = annotators[i];
         }
       }
-      var data = new UserPreferences();
-
-      var elementAnnotators = {};
       if (selected) {
         selectedAnnotators.push(annotator.getName());
       } else {
@@ -127,13 +208,12 @@ ChooseAnnotatorsDialog.prototype.setElementType = function (elementType) {
         }
       }
       createAnnotatorsParams();
-
-      elementAnnotators[elementType.className] = selectedAnnotators;
-      data.setElementAnnotators(elementAnnotators);
-      return ServerConnector.updateUserPreferences({
-        user: user,
-        preferences: data
-      }).then(null, GuiConnector.alert);
+      var includeChildren = includeChildrenCheckbox.checked;
+      return self.saveAnnotatorsInfo(self.getAllChildrenTypesIfNeeded(elementType, includeChildren), selectedAnnotators);
+    };
+    includeChildrenCheckbox.onchange = function () {
+      var includeChildren = includeChildrenCheckbox.checked;
+      return self.saveAnnotatorsInfo(self.getAllChildrenTypesIfNeeded(elementType, includeChildren), selectedAnnotators);
     };
 
     checkboxList.addListener("select", function (element) {
@@ -295,7 +375,7 @@ ChooseAnnotatorsDialog.prototype.open = function () {
     });
   }
   $(div).dialog("open");
-  $(div).css("overflow","hidden");
+  $(div).css("overflow", "hidden");
 };
 
 module.exports = ChooseAnnotatorsDialog;
diff --git a/frontend-js/src/main/js/map/data/UserPreferences.js b/frontend-js/src/main/js/map/data/UserPreferences.js
index 750c295553..36ff821d76 100644
--- a/frontend-js/src/main/js/map/data/UserPreferences.js
+++ b/frontend-js/src/main/js/map/data/UserPreferences.js
@@ -81,7 +81,8 @@ UserPreferences.prototype.setElementAnnotators = function (elementAnnotators) {
 UserPreferences.prototype.getElementAnnotators = function (className) {
   var result = this._elementAnnotators[className];
   if (result === undefined) {
-    result = [];
+    this._elementAnnotators[className] = [];
+    result = this._elementAnnotators[className];
   }
   return result;
 };
diff --git a/frontend-js/src/test/js/gui/admin/ChooseAnnotatorsDialog-test.js b/frontend-js/src/test/js/gui/admin/ChooseAnnotatorsDialog-test.js
index cc5fb69cf8..ee6700ba89 100644
--- a/frontend-js/src/test/js/gui/admin/ChooseAnnotatorsDialog-test.js
+++ b/frontend-js/src/test/js/gui/admin/ChooseAnnotatorsDialog-test.js
@@ -10,23 +10,50 @@ var chai = require('chai');
 var assert = chai.assert;
 
 describe('ChooseAnnotatorsDialog', function () {
-  it('init', function () {
-    var dialog = new ChooseAnnotatorsDialog({
+  function createDialog() {
+    return new ChooseAnnotatorsDialog({
       element: testDiv,
-      customMap: null
+      customMap: null,
+      configuration: helper.getConfiguration()
     });
+  }
+
+  it('init', function () {
+    var dialog = createDialog();
     assert.equal(0, logger.getWarnings().length);
     return dialog.init();
   });
 
   it('setElementType', function () {
-    var dialog = new ChooseAnnotatorsDialog({
-      element: testDiv,
-      customMap: null
-    });
+    var dialog = createDialog();
     return ServerConnector.getConfiguration().then(function (configuration) {
       return dialog.setElementType(configuration.getReactionTypes()[0]);
     })
   });
 
+  it('saveAnnotatorsInfo', function () {
+    var dialog = createDialog();
+    var user;
+    return ServerConnector.getLoggedUser().then(function (result) {
+      user = result;
+      return ServerConnector.getConfiguration();
+    }).then(function (configuration) {
+      var elementTypes = configuration.getElementTypes();
+      return dialog.saveAnnotatorsInfo(elementTypes, []);
+    });
+  });
+
+  it('getAllChildrenTypesIfNeeded', function () {
+    var dialog = createDialog();
+    var configuration = helper.getConfiguration();
+    var elementTypes = configuration.getElementTypes();
+    var elementType;
+    for (var i = 0; i < elementTypes.length; i++) {
+      if (elementTypes[i].className === "lcsb.mapviewer.model.map.species.Protein") {
+        elementType = elementTypes[i];
+      }
+    }
+    assert.equal(1, dialog.getAllChildrenTypesIfNeeded(elementType, false).length);
+    assert.ok(dialog.getAllChildrenTypesIfNeeded(elementType, true).length >= 5);
+  });
 });
diff --git a/frontend-js/testFiles/apiCalls/users/anonymous.updatePreferences/PATCH_token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/users/anonymous.updatePreferences/PATCH_token=MOCK_TOKEN_ID&
new file mode 100644
index 0000000000..c194425b27
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/users/anonymous.updatePreferences/PATCH_token=MOCK_TOKEN_ID&
@@ -0,0 +1 @@
+{"preferences":{"annotators-parameters":{},"element-annotators":{"lcsb.mapviewer.model.map.BioEntity":[],"lcsb.mapviewer.model.map.compartment.BottomSquareCompartment":["Gene Ontology"],"lcsb.mapviewer.model.map.compartment.Compartment":["Gene Ontology"],"lcsb.mapviewer.model.map.compartment.LeftSquareCompartment":["Gene Ontology"],"lcsb.mapviewer.model.map.compartment.OvalCompartment":["Gene Ontology"],"lcsb.mapviewer.model.map.compartment.PathwayCompartment":["Gene Ontology"],"lcsb.mapviewer.model.map.compartment.RightSquareCompartment":["Gene Ontology"],"lcsb.mapviewer.model.map.compartment.SquareCompartment":["Gene Ontology"],"lcsb.mapviewer.model.map.compartment.TopSquareCompartment":["Gene Ontology"],"lcsb.mapviewer.model.map.reaction.Reaction":[],"lcsb.mapviewer.model.map.reaction.type.BooleanLogicGateReaction":[],"lcsb.mapviewer.model.map.reaction.type.DissociationReaction":[],"lcsb.mapviewer.model.map.reaction.type.HeterodimerAssociationReaction":[],"lcsb.mapviewer.model.map.reaction.type.KnownTransitionOmittedReaction":[],"lcsb.mapviewer.model.map.reaction.type.NegativeInfluenceReaction":[],"lcsb.mapviewer.model.map.reaction.type.PositiveInfluenceReaction":[],"lcsb.mapviewer.model.map.reaction.type.ReducedModulationReaction":[],"lcsb.mapviewer.model.map.reaction.type.ReducedPhysicalStimulationReaction":[],"lcsb.mapviewer.model.map.reaction.type.ReducedTriggerReaction":[],"lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction":[],"lcsb.mapviewer.model.map.reaction.type.TranscriptionReaction":[],"lcsb.mapviewer.model.map.reaction.type.TranslationReaction":[],"lcsb.mapviewer.model.map.reaction.type.TransportReaction":[],"lcsb.mapviewer.model.map.reaction.type.TruncationReaction":[],"lcsb.mapviewer.model.map.reaction.type.UnknownNegativeInfluenceReaction":[],"lcsb.mapviewer.model.map.reaction.type.UnknownPositiveInfluenceReaction":[],"lcsb.mapviewer.model.map.reaction.type.UnknownReducedModulationReaction":[],"lcsb.mapviewer.model.map.reaction.type.UnknownReducedPhysicalStimulationReaction":[],"lcsb.mapviewer.model.map.reaction.type.UnknownReducedTriggerReaction":[],"lcsb.mapviewer.model.map.reaction.type.UnknownTransitionReaction":[],"lcsb.mapviewer.model.map.species.AntisenseRna":[],"lcsb.mapviewer.model.map.species.Chemical":["Chebi"],"lcsb.mapviewer.model.map.species.Complex":["Gene Ontology"],"lcsb.mapviewer.model.map.species.Degraded":[],"lcsb.mapviewer.model.map.species.Drug":[],"lcsb.mapviewer.model.map.species.Element":[],"lcsb.mapviewer.model.map.species.Gene":["HGNC"],"lcsb.mapviewer.model.map.species.GenericProtein":["Biocompendium","HGNC"],"lcsb.mapviewer.model.map.species.Ion":["Chebi"],"lcsb.mapviewer.model.map.species.IonChannelProtein":["Biocompendium","HGNC"],"lcsb.mapviewer.model.map.species.Phenotype":["Gene Ontology"],"lcsb.mapviewer.model.map.species.Protein":["Biocompendium","HGNC"],"lcsb.mapviewer.model.map.species.ReceptorProtein":["Biocompendium","HGNC"],"lcsb.mapviewer.model.map.species.Rna":["HGNC"],"lcsb.mapviewer.model.map.species.SimpleMolecule":["Chebi"],"lcsb.mapviewer.model.map.species.Species":[],"lcsb.mapviewer.model.map.species.TruncatedProtein":["Biocompendium","HGNC"],"lcsb.mapviewer.model.map.species.Unknown":[]},"element-required-annotations":{"lcsb.mapviewer.model.map.BioEntity":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.BottomSquareCompartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.Compartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.LeftSquareCompartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.OvalCompartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.PathwayCompartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.RightSquareCompartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.SquareCompartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.compartment.TopSquareCompartment":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.Reaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.BooleanLogicGateReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.DissociationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.HeterodimerAssociationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.KnownTransitionOmittedReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.NegativeInfluenceReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.PositiveInfluenceReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.ReducedModulationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.ReducedPhysicalStimulationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.ReducedTriggerReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.TranscriptionReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.TranslationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.TransportReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.TruncationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.UnknownNegativeInfluenceReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.UnknownPositiveInfluenceReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.UnknownReducedModulationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.UnknownReducedPhysicalStimulationReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.UnknownReducedTriggerReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.reaction.type.UnknownTransitionReaction":{"annotation-list":["PUBMED"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.AntisenseRna":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Chemical":{"annotation-list":["CHEBI","PUBCHEM","PUBCHEM_SUBSTANCE"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Complex":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Degraded":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Drug":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Element":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Gene":{"annotation-list":["HGNC","HGNC_SYMBOL"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.GenericProtein":{"annotation-list":["HGNC","HGNC_SYMBOL"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Ion":{"annotation-list":["CHEBI","PUBCHEM","PUBCHEM_SUBSTANCE"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.IonChannelProtein":{"annotation-list":["HGNC","HGNC_SYMBOL"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Phenotype":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Protein":{"annotation-list":["HGNC","HGNC_SYMBOL"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.ReceptorProtein":{"annotation-list":["HGNC","HGNC_SYMBOL"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Rna":{"annotation-list":["HGNC","HGNC_SYMBOL"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.SimpleMolecule":{"annotation-list":["CHEBI","PUBCHEM","PUBCHEM_SUBSTANCE"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Species":{"annotation-list":[],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.TruncatedProtein":{"annotation-list":["HGNC","HGNC_SYMBOL","CHEMBL_COMPOUND"],"require-at-least-one":true},"lcsb.mapviewer.model.map.species.Unknown":{"annotation-list":[],"require-at-least-one":true}},"element-valid-annotations":{"lcsb.mapviewer.model.map.BioEntity":["PUBMED"],"lcsb.mapviewer.model.map.compartment.BottomSquareCompartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.compartment.Compartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.compartment.LeftSquareCompartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.compartment.OvalCompartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.compartment.PathwayCompartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.compartment.RightSquareCompartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.compartment.SquareCompartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.compartment.TopSquareCompartment":["GO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.reaction.Reaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.BooleanLogicGateReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.DissociationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.HeterodimerAssociationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.KnownTransitionOmittedReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.NegativeInfluenceReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.PositiveInfluenceReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.ReducedModulationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.ReducedPhysicalStimulationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.ReducedTriggerReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.TranscriptionReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.TranslationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.TransportReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.TruncationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.UnknownNegativeInfluenceReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.UnknownPositiveInfluenceReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.UnknownReducedModulationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.UnknownReducedPhysicalStimulationReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.UnknownReducedTriggerReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.reaction.type.UnknownTransitionReaction":["KEGG_PATHWAY","KEGG_REACTION","PUBMED","REACTOME"],"lcsb.mapviewer.model.map.species.AntisenseRna":["PUBMED"],"lcsb.mapviewer.model.map.species.Chemical":["CHEBI","HMDB","KEGG_COMPOUND","PUBCHEM","PUBCHEM_SUBSTANCE","PUBMED"],"lcsb.mapviewer.model.map.species.Complex":["CHEMBL_TARGET","EC","GO","INTERPRO","MESH_2012","PUBMED"],"lcsb.mapviewer.model.map.species.Degraded":["PUBMED"],"lcsb.mapviewer.model.map.species.Drug":["CHEBI","CHEMBL_COMPOUND","DRUGBANK","HMDB","PUBMED"],"lcsb.mapviewer.model.map.species.Element":["PUBMED"],"lcsb.mapviewer.model.map.species.Gene":["ENSEMBL","ENTREZ","HGNC","HGNC_SYMBOL","KEGG_GENES","MGD","PANTHER","PUBMED","REFSEQ","UNIPROT"],"lcsb.mapviewer.model.map.species.GenericProtein":["CHEMBL_TARGET","EC","ENSEMBL","ENTREZ","HGNC","HGNC_SYMBOL","INTERPRO","KEGG_GENES","MGD","PANTHER","PUBMED","REFSEQ","UNIPROT","UNIPROT_ISOFORM"],"lcsb.mapviewer.model.map.species.Ion":["CHEBI","HMDB","KEGG_COMPOUND","PUBCHEM","PUBCHEM_SUBSTANCE","PUBMED"],"lcsb.mapviewer.model.map.species.IonChannelProtein":["CHEMBL_TARGET","EC","ENSEMBL","ENTREZ","HGNC","HGNC_SYMBOL","INTERPRO","KEGG_GENES","MGD","PANTHER","PUBMED","REFSEQ","UNIPROT","UNIPROT_ISOFORM"],"lcsb.mapviewer.model.map.species.Phenotype":["GO","MESH_2012","OMIM","PUBMED"],"lcsb.mapviewer.model.map.species.Protein":["CHEMBL_TARGET","EC","ENSEMBL","ENTREZ","HGNC","HGNC_SYMBOL","INTERPRO","KEGG_GENES","MGD","PANTHER","PUBMED","REFSEQ","UNIPROT","UNIPROT_ISOFORM","CHEMBL_COMPOUND"],"lcsb.mapviewer.model.map.species.ReceptorProtein":["CHEMBL_TARGET","EC","ENSEMBL","ENTREZ","HGNC","HGNC_SYMBOL","INTERPRO","KEGG_GENES","MGD","PANTHER","PUBMED","REFSEQ","UNIPROT","UNIPROT_ISOFORM"],"lcsb.mapviewer.model.map.species.Rna":["ENSEMBL","ENTREZ","HGNC","HGNC_SYMBOL","KEGG_GENES","MGD","PANTHER","PUBMED","REFSEQ","UNIPROT"],"lcsb.mapviewer.model.map.species.SimpleMolecule":["CHEBI","HMDB","KEGG_COMPOUND","PUBCHEM","PUBCHEM_SUBSTANCE","PUBMED"],"lcsb.mapviewer.model.map.species.Species":["PUBMED"],"lcsb.mapviewer.model.map.species.TruncatedProtein":["CHEMBL_TARGET","EC","ENSEMBL","ENTREZ","HGNC","HGNC_SYMBOL","INTERPRO","KEGG_GENES","MGD","PANTHER","PUBMED","REFSEQ","UNIPROT","UNIPROT_ISOFORM","CHEMBL_COMPOUND"],"lcsb.mapviewer.model.map.species.Unknown":["PUBMED"]},"gui-preferences":{"admin-projects-datatable-length":"10"},"project-upload":{"annotate-model":false,"auto-resize":true,"cache-data":false,"sbgn":false,"semantic-zooming":false,"validate-miriam":true}}}
\ No newline at end of file
-- 
GitLab