diff --git a/frontend-js/src/main/js/Configuration.js b/frontend-js/src/main/js/Configuration.js index 230456ab5f1732e68be0c03752656d422b2ce697..e0245933d5ef9d7a15113dcb1070b74bf3f32425 100644 --- a/frontend-js/src/main/js/Configuration.js +++ b/frontend-js/src/main/js/Configuration.js @@ -322,6 +322,25 @@ Configuration.prototype.getSimpleElementTypeNames = function () { return result; }; +/** + * + * @return {string[]} + */ +Configuration.prototype.getReactionTypeNames = function () { + var classesToBeExcluded = {}; + var i; + for (i = 0; i < this._reactionTypes.length; i++) { + classesToBeExcluded[this._reactionTypes[i].parentClass] = true; + } + var result = []; + for (i = 0; i < this._reactionTypes.length; i++) { + if (classesToBeExcluded[this._reactionTypes[i].className] === undefined) { + result.push(this._reactionTypes[i].name); + } + } + return result; +}; + /** * * @param {BioEntityType[]} reactionTypes diff --git a/frontend-js/src/main/js/gui/Panel.js b/frontend-js/src/main/js/gui/Panel.js index c4fd1786b69d25393106452b42302af2791ffe52..8f21f244472e35c939fc871f140d85d0d38628e6 100644 --- a/frontend-js/src/main/js/gui/Panel.js +++ b/frontend-js/src/main/js/gui/Panel.js @@ -335,7 +335,10 @@ Panel.prototype.onresize = function () { var self = this; var footerPosition = window.innerHeight; - footerPosition -= Math.max(0, $(".minerva-logo-footer, .minerva-footer-table").outerHeight()); + var footer =$(".minerva-logo-footer, .minerva-footer-table") + if (footer.length > 0) { + footerPosition -= Math.max(0, footer.outerHeight()); + } // compute the width (we can only compute it for visible elements) var size = 100000; diff --git a/frontend-js/src/main/js/gui/export/AbstractExportPanel.js b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js index 39cfcd95e1b58550053eb1a6f30eb0b045a6e40d..345bac1d5238bf2bf4f6ff34e65fa8a943464f9c 100644 --- a/frontend-js/src/main/js/gui/export/AbstractExportPanel.js +++ b/frontend-js/src/main/js/gui/export/AbstractExportPanel.js @@ -135,17 +135,21 @@ AbstractExportPanel.prototype.createDualListbox = function (selectElement) { /** * * @param {BioEntityType[]} elementTypes + * @param {string} [panelName] * @returns {HTMLElement} * @protected */ -AbstractExportPanel.prototype._createSelectTypeDiv = function (elementTypes) { +AbstractExportPanel.prototype._createSelectTypeDiv = function (elementTypes, panelName) { + if (panelName === undefined) { + panelName = " TYPE:"; + } var typeDiv = Functions.createElement({ type: "div", name: "typeSelectDiv" }); typeDiv.appendChild(Functions.createElement({ type: "h4", - content: " TYPE:" + content: panelName })); var choicesContainer = Functions.createElement({ type: "ul", @@ -181,12 +185,16 @@ AbstractExportPanel.prototype._createSelectTypeDiv = function (elementTypes) { /** * + * @param {HTMLElement} [htmlElement] * @returns {Promise<BioEntityType[]>} */ -AbstractExportPanel.prototype.getSelectedTypes = function () { +AbstractExportPanel.prototype.getSelectedTypes = function (htmlElement) { var self = this; + if (htmlElement === undefined) { + htmlElement = self.getElement(); + } - var div = $("div[name='typeSelectDiv']", $(self.getElement()))[0]; + var div = $("div[name='typeSelectDiv']", $(htmlElement))[0]; var result = []; var selectedAll = false; $(":checked", $(div)).each(function (index, element) { @@ -196,8 +204,11 @@ AbstractExportPanel.prototype.getSelectedTypes = function () { result.push(element.value); }); if (selectedAll) { - return ServerConnector.getConfiguration().then(function (configuration) { - return configuration.getSimpleElementTypeNames(); + result = []; + $("input[type='checkbox']", $(div)).each(function (index, element) { + if (element.value !== "ALL") { + result.push(element.value); + } }); } diff --git a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js index b681dad5c99cbbb7fc169da644b903b9755938e6..cc5941f29795fe8e83edca8eeb1b1e534ecc4edf 100644 --- a/frontend-js/src/main/js/gui/export/NetworkExportPanel.js +++ b/frontend-js/src/main/js/gui/export/NetworkExportPanel.js @@ -7,6 +7,7 @@ var AbstractExportPanel = require('./AbstractExportPanel'); var Promise = require("bluebird"); // noinspection JSUnusedLocalSymbols var logger = require('../../logger'); +var Functions = require('../../Functions'); var GuiMessageError = require('../GuiMessageError'); var Alias = require('../../map/data/Alias'); @@ -39,8 +40,12 @@ NetworkExportPanel.prototype.init = function () { var self = this; var element = self.getElement(); var configuration = self.getConfiguration(); - var typeDiv = self._createSelectTypeDiv(configuration.getElementTypes()); - element.appendChild(typeDiv); + var elementTypeDiv = Functions.createElement({type: "div", name: "elementTypes"}); + elementTypeDiv.appendChild(self._createSelectTypeDiv(configuration.getElementTypes(), "Element type")); + element.appendChild(elementTypeDiv); + var reactionTypeDiv = Functions.createElement({type: "div", name: "reactionTypes"}); + reactionTypeDiv.appendChild(self._createSelectTypeDiv(configuration.getReactionTypes(), "Reaction type")); + element.appendChild(reactionTypeDiv); element.appendChild(self._createSelectColumnDiv(self.getAllColumns())); return self.getServerConnector().getProjectStatistics(self.getProject().getProjectId()).then(function (statistics) { return self._createMiriamTypeDiv(statistics.getReactionAnnotations()); @@ -118,6 +123,10 @@ NetworkExportPanel.prototype.getAllColumns = function () { "columnName": "subsystem", "method": "getSubsystem", "name": "Subsystem" + }, { + "columnName": "type", + "method": "getType", + "name": "Reaction type" }]); }; @@ -125,9 +134,13 @@ NetworkExportPanel.prototype.getAllColumns = function () { * * @param {Reaction} reaction * @param {Object<string,boolean>} elementIds + * @param {string[]} reactionTypes * @returns {boolean} */ -function matchReaction(reaction, elementIds) { +function matchReaction(reaction, elementIds, reactionTypes) { + if ($.inArray(reaction.getType(), reactionTypes) === -1) { + return false; + } var count = 0; reaction.getElements().forEach(function (element) { if (elementIds[element.getId()]) { @@ -143,18 +156,26 @@ function matchReaction(reaction, elementIds) { */ NetworkExportPanel.prototype.createResponseString = function () { var self = this; - var types, miriamTypes; + var elementTypes, reactionTypes, miriamTypes; var includedCompartmentIds = []; var excludedCompartmentIds = []; var models = self.getProject().getModels(); var elementIds = []; var reactions = []; - return self.getSelectedTypes().then(function (result) { + var elementTypesDiv = $("[name='elementTypes']", self.getElement())[0]; + var reactionTypesDiv = $("[name='reactionTypes']", self.getElement())[0]; + return self.getSelectedTypes(elementTypesDiv).then(function (result) { + if (result.length === 0) { + return Promise.reject(new GuiMessageError("You must select at least one element type")); + } + elementTypes = result; + return self.getSelectedTypes(reactionTypesDiv); + }).then(function (result) { if (result.length === 0) { - return Promise.reject(new GuiMessageError("You must select at least one type")); + return Promise.reject(new GuiMessageError("You must select at least one reaction type")); } - types = result; + reactionTypes = result; return self.getSelectedIncludedCompartments(); }).then(function (result) { result.forEach(function (compartment) { @@ -169,7 +190,7 @@ NetworkExportPanel.prototype.createResponseString = function () { var promises = []; for (var i = 0; i < models.length; i++) { promises.push(models[i].getAliases({ - type: types, + type: elementTypes, complete: true, includedCompartmentIds: includedCompartmentIds, excludedCompartmentIds: excludedCompartmentIds @@ -189,7 +210,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)) { + if (matchReaction(reaction, elementIds, reactionTypes)) { reactions.push(reaction); } } diff --git a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js index be02659da4ce6fae6acc7a9f322adfc661a1f46c..65a91982efe8e56d9ee6a180ed2f6908c7b190f6 100644 --- a/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js +++ b/frontend-js/src/test/js/gui/export/ElementExportPanel-test.js @@ -42,9 +42,13 @@ describe('ElementExportPanel', function () { it('select all', function () { var exportObject; var project; - var elementTypes; - elementTypes = helper.getConfiguration().getSimpleElementTypeNames(); + function onlyUnique(value, index, self) { + return self.indexOf(value) === index; + } + + var elementTypes = helper.getConfiguration().getSimpleElementTypeNames().filter(onlyUnique); + return ServerConnector.getProject().then(function (result) { project = result; exportObject = createExportPanel(project);