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