diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index e19e237c9e5199b8c7cc4e4a3e6b1b8c59bd1648..d1794a1da07b8c7221aed9c86c538d61bf2f15ff 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -31,6 +31,7 @@ var ProjectStatistics = require('./map/data/ProjectStatistics'); var Reaction = require('./map/data/Reaction'); var ReferenceGenome = require('./map/data/ReferenceGenome'); var SbmlFunction = require('./map/data/SbmlFunction'); +var SbmlParameter = require('./map/data/SbmlParameter'); var SecurityError = require('./SecurityError'); var SessionData = require('./SessionData'); var User = require('./map/data/User'); @@ -357,6 +358,13 @@ ServerConnector.getSbmlFunctionUrl = function (queryParams, filterParams) { }); }; +ServerConnector.getSbmlParameterUrl = function (queryParams, filterParams) { + return this.getApiUrl({ + url: this.getModelsUrl(queryParams) + "parameters/" + queryParams.parameterId, + params: filterParams + }); +}; + ServerConnector.getReferenceGenomeUrl = function (queryParams, filterParams) { var version = this.getIdOrAsterisk(queryParams.version); @@ -1863,4 +1871,17 @@ ServerConnector.getSbmlFunction = function (params) { }); }; +ServerConnector.getSbmlParameter = function (params) { + var self = this; + if (params === undefined) { + params = {}; + } + return self.getProjectId(params.projectId).then(function (result) { + params.projectId = result; + return self.sendGetRequest(self.getSbmlParameterUrl(params)); + }).then(function (content) { + return new SbmlParameter(JSON.parse(content)); + }); +}; + module.exports = ServerConnector; diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js index 53e0a82877e79fee40acce379472bd534c6cfaa2..84d207a521feab98b5e740565ebb0c1211b41e0c 100644 --- a/frontend-js/src/main/js/map/data/MapModel.js +++ b/frontend-js/src/main/js/map/data/MapModel.js @@ -46,6 +46,8 @@ function MapModel(configuration) { this._submodels = []; this._sbmlFunctions = []; + this._sbmlParameters = []; + if (configuration !== undefined) { if (configuration instanceof MapModel) { @@ -831,6 +833,13 @@ MapModel.prototype.addSbmlFunction = function (sbmlFunction) { this._sbmlFunctions[sbmlFunction.getId()] = sbmlFunction; }; + +MapModel.prototype.addSbmlParameter = function (sbmlParameter) { + this._sbmlParameters[sbmlParameter.getId()] = sbmlParameter; +}; + + + MapModel.prototype.getSbmlFunctionById = function (id) { var self = this; if (self._sbmlFunctions[id] !== undefined) { @@ -843,5 +852,17 @@ MapModel.prototype.getSbmlFunctionById = function (id) { } }; +MapModel.prototype.getSbmlParameterById = function (id) { + var self = this; + if (self._sbmlParameters[id] !== undefined) { + return Promise.resolve(self._sbmlParameters[id]); + } else { + return ServerConnector.getSbmlParameter({modelId: self.getId(), parameterId: id}).then(function (sbmlParameter) { + self.addSbmlParameter(sbmlParameter); + return sbmlParameter; + }) + } +}; + module.exports = MapModel; diff --git a/frontend-js/src/main/js/map/data/SbmlParameter.js b/frontend-js/src/main/js/map/data/SbmlParameter.js new file mode 100644 index 0000000000000000000000000000000000000000..86c52d8b1b00e328939a4410c0c9898015c4fe6e --- /dev/null +++ b/frontend-js/src/main/js/map/data/SbmlParameter.js @@ -0,0 +1,56 @@ +"use strict"; + +function SbmlParameter(jsonObject) { + var self = this; + self.setParameterId(jsonObject.parameterId); + self.setValue(jsonObject.value); + self.setGlobal(jsonObject.global); + self.setName(jsonObject.name); + self.setId(jsonObject.id); + self.setUnitsId(jsonObject.unitsId); +} + +SbmlParameter.prototype.setParameterId = function (parameterId) { + this._parameterId = parameterId; +}; +SbmlParameter.prototype.getParameterId = function () { + return this._parameterId; +}; + +SbmlParameter.prototype.setUnitsId = function (unitsId) { + this._unitsId = unitsId; +}; +SbmlParameter.prototype.getUnitsId = function () { + return this._unitsId; +}; + +SbmlParameter.prototype.setValue = function (value) { + this._value = value; +}; +SbmlParameter.prototype.getValue = function () { + return this._value; +}; + +SbmlParameter.prototype.setGlobal = function (global) { + this._global = global; +}; +SbmlParameter.prototype.getGlobal = function () { + return this._global; +}; + +SbmlParameter.prototype.setName = function (name) { + this._name = name; +}; +SbmlParameter.prototype.getName = function () { + return this._name; +}; + +SbmlParameter.prototype.setId = function (id) { + this._id = id; +}; +SbmlParameter.prototype.getId = function () { + return this._id; +}; + + +module.exports = SbmlParameter; diff --git a/frontend-js/src/main/js/map/window/ReactionInfoWindow.js b/frontend-js/src/main/js/map/window/ReactionInfoWindow.js index b32de186359909e6b7dd8e04fba75614e47aa3cd..f687e2f4a303d5b221610d4b7c312183c491e9c9 100644 --- a/frontend-js/src/main/js/map/window/ReactionInfoWindow.js +++ b/frontend-js/src/main/js/map/window/ReactionInfoWindow.js @@ -58,8 +58,8 @@ ReactionInfoWindow.prototype.createContentDiv = function () { if (reaction.getKineticLaw() === undefined) { return Promise.resolve(result); } else { + var kineticLaw = reaction.getKineticLaw(); return Functions.loadScript('https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/MathJax.js?config=TeX-MML-AM_CHTML').then(function () { - var kineticLaw = reaction.getKineticLaw(); result.appendChild(Functions.createElement({type: "h4", content: "Kinetic law"})); if (kineticLaw.getMathMlPresentation() !== undefined) { @@ -80,6 +80,14 @@ ReactionInfoWindow.prototype.createContentDiv = function () { }).then(function (functions) { result.appendChild(self.createSbmlFunctionDiv(functions)); + var promises = []; + for (var i = 0; i < kineticLaw.getParameterIds().length; i++) { + promises.push(self.getCustomMap().getModel().getSbmlParameterById(kineticLaw.getParameterIds()[i])); + } + return Promise.all(promises); + }).then(function (parameters) { + result.appendChild(self.createSbmlParameterDiv(parameters)); + return Promise.resolve(result); }); } @@ -110,6 +118,22 @@ ReactionInfoWindow.prototype.createSbmlFunctionDiv = function (functions) { return result; }; +ReactionInfoWindow.prototype.createSbmlParameterDiv = function (parameters) { + var result = Functions.createElement({type: "div"}); + if (parameters.length > 0) { + result.appendChild(Functions.createElement({type: "h5", content: "Parameters: "})); + var guiUtils = new GuiUtils(); + var table = Functions.createElement({type: "div", style: "display: table;", className: "borderTable"}); + table.appendChild(guiUtils.createTableRow(["Name", "parameterId", "Value", "Global"])); + for (var i = 0; i < parameters.length; i++) { + var sbmlFunction = parameters[i]; + table.appendChild(guiUtils.createTableRow([sbmlFunction.getName(), sbmlFunction.getParameterId(), sbmlFunction.getValue(), sbmlFunction.getGlobal()])); + } + result.appendChild(table); + } + return result; +}; + ReactionInfoWindow.prototype.init = function () { var self = this; return AbstractInfoWindow.prototype.init.call(this).then(function () { diff --git a/frontend-js/src/test/js/ServerConnector-test.js b/frontend-js/src/test/js/ServerConnector-test.js index e0fc3fd77bcc2deaae9a8942b3fc1c353b98b25b..358de90d21be53977765f28462ec4aa263713476 100644 --- a/frontend-js/src/test/js/ServerConnector-test.js +++ b/frontend-js/src/test/js/ServerConnector-test.js @@ -385,5 +385,12 @@ describe('ServerConnector', function () { }); }); + it('getSbmlParameter', function () { + return ServerConnector.getSbmlParameter({parameterId: 7}).then(function (sbmlParameter) { + assert.equal("local param", sbmlParameter.getName()); + assert.equal(7, sbmlParameter.getId()); + }); + }); + }); diff --git a/frontend-js/src/test/js/helper.js b/frontend-js/src/test/js/helper.js index 9996400b766e514e2e92c2e9014f39edd777a315..c02367b163aee95a25d702b94601334161a36509 100644 --- a/frontend-js/src/test/js/helper.js +++ b/frontend-js/src/test/js/helper.js @@ -23,6 +23,7 @@ var AbstractDbOverlay = require("../../main/js/map/overlay/AbstractDbOverlay"); var Project = require("../../main/js/map/data/Project"); var Reaction = require("../../main/js/map/data/Reaction"); var SbmlFunction = require("../../main/js/map/data/SbmlFunction"); +var SbmlParameter = require("../../main/js/map/data/SbmlParameter"); var SearchDbOverlay = require("../../main/js/map/overlay/SearchDbOverlay"); var User = require("../../main/js/map/data/User"); @@ -413,6 +414,17 @@ Helper.prototype.createSbmlFunction = function () { }); }; +Helper.prototype.createSbmlParameter = function () { + return new SbmlParameter({ + "parameterId": "local_param", + "unitsId": 24, + "name": "local param", + "global": false, + "id": this.idCounter++, + "value": 5.0 + }); +}; + Helper.prototype.createKineticLaw = function () { return new KineticLaw({ "parameterIds": [], @@ -425,8 +437,6 @@ Helper.prototype.createKineticLaw = function () { }; - - Helper.EPSILON = 1e-6; module.exports = Helper; diff --git a/frontend-js/src/test/js/map/data/SbmlParameter-test.js b/frontend-js/src/test/js/map/data/SbmlParameter-test.js new file mode 100644 index 0000000000000000000000000000000000000000..151edf82bb4f34caa49c7d22ae884065acddc599 --- /dev/null +++ b/frontend-js/src/test/js/map/data/SbmlParameter-test.js @@ -0,0 +1,31 @@ +"use strict"; + +var SbmlParameter = require('../../../../main/js/map/data/SbmlParameter'); +var chai = require('chai'); +var assert = chai.assert; +var logger = require('../../logger'); + +describe('SbmlParameter', function () { + beforeEach(function () { + logger.flushBuffer(); + }); + + it("constructor", function () { + var object = new SbmlParameter({ + "parameterId": "local_param", + "unitsId": 24, + "name": "local param", + "global": false, + "id": 7, + "value": 5.0 + }); + assert.ok(object); + assert.equal("local_param", object.getParameterId()); + assert.equal(24, object.getUnitsId()); + assert.equal("local param", object.getName()); + assert.equal(false, object.getGlobal()); + assert.equal(7, object.getId()); + assert.equal(5.0, object.getValue()); + + }); +}); diff --git a/frontend-js/src/test/js/map/window/ReactionInfoWindow-test.js b/frontend-js/src/test/js/map/window/ReactionInfoWindow-test.js index 4c36cdd7fa414ce9c3d7202703aec7d17684b12d..88705cfd9c7ccb6a4ebd05855e6812110346ad05 100644 --- a/frontend-js/src/test/js/map/window/ReactionInfoWindow-test.js +++ b/frontend-js/src/test/js/map/window/ReactionInfoWindow-test.js @@ -76,7 +76,7 @@ describe('ReactionInfoWindow', function () { }); }); - it("with kinetic parameters", function () { + it("with kinetic function", function () { var map = helper.createCustomMap(); var sbmlFunction = helper.createSbmlFunction(); map.getModel().addSbmlFunction(sbmlFunction); @@ -96,5 +96,25 @@ describe('ReactionInfoWindow', function () { assert.ok(div.innerHTML.indexOf(sbmlFunction.getArguments()[0]) >= 0, "Function argument doesn't exist in the output div"); }); }); + it("with kinetic parameters", function () { + var map = helper.createCustomMap(); + var sbmlParameter = helper.createSbmlParameter(); + map.getModel().addSbmlParameter(sbmlParameter); + + var reaction = helper.createReaction(map); + reaction.setKineticLaw(helper.createKineticLaw()); + reaction.getKineticLaw().getParameterIds().push(sbmlParameter.getId()); + + var reactionWindow = new ReactionInfoWindow({ + reaction: reaction, + map: map + }); + + return reactionWindow.createContentDiv().then(function (div) { + assert.ok(div.innerHTML.indexOf("Parameters") >= 0); + assert.ok(div.innerHTML.indexOf(sbmlParameter.getName()) >= 0, "Parameter name doesn't exist in the output div"); + assert.ok(div.innerHTML.indexOf(sbmlParameter.getValue()[0]) >= 0, "Parameter value doesn't exist in the output div"); + }); + }); }); }); diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/all/parameters/7/token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/all/parameters/7/token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..9a5af5e1eea1a1c213c2c929659a8dec3f6842f2 --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/all/parameters/7/token=MOCK_TOKEN_ID& @@ -0,0 +1 @@ +{"parameterId":"local_param","unitsId":24,"name":"local param","global":false,"id":7,"value":5.0} \ No newline at end of file