diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index ae6de2653f56a887a2917c84be3e55616535e267..01b15bbea04f35ae7e9b73a9cf86eb5da8760bf3 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -1937,6 +1937,20 @@ ServerConnector.getImageDownloadUrl = function (params) { }); }; +/** + * + * @param {Object} params + * @param {string} [params.projectId] + * @param {number} params.modelId + * @param {string} [params.polygonString] + * @param {string} params.handlerClass + * @param {number} [params.backgroundOverlayId] + * @param {number} [params.zoomLevel] + * @param {number[]} [params.overlayIds] + * @param {number[]} [params.elementIds] + * @param {number[]} [params.reactionIds] + * @returns {Promise} + */ ServerConnector.getModelDownloadUrl = function (params) { var self = this; var queryParams = { @@ -1944,12 +1958,13 @@ ServerConnector.getModelDownloadUrl = function (params) { modelId: params.modelId }; var filterParams = { - token: params.token, polygonString: params.polygonString, handlerClass: params.handlerClass, backgroundOverlayId: params.backgroundOverlayId, zoomLevel: params.zoomLevel, - overlayIds: this.idsToString(params.overlayIds) + overlayIds: this.idsToString(params.overlayIds), + elementIds: this.idsToString(params.elementIds), + reactionIds: this.idsToString(params.reactionIds) }; return self.getProjectId(params.projectId).then(function (result) { queryParams.projectId = result; @@ -1957,6 +1972,41 @@ ServerConnector.getModelDownloadUrl = function (params) { }); }; +/** + * + * @param {Object} params + * @param {string} [params.projectId] + * @param {number} params.modelId + * @param {string} [params.polygonString] + * @param {string} params.handlerClass + * @param {number} [params.backgroundOverlayId] + * @param {number} [params.zoomLevel] + * @param {number[]} [params.overlayIds] + * @param {number[]} [params.elementIds] + * @param {number[]} [params.reactionIds] + * @returns {Promise} + */ +ServerConnector.getPartOfModelInExportFormat = function (params) { + var self = this; + var queryParams = { + projectId: params.projectId, + modelId: params.modelId + }; + var filterParams = { + polygonString: params.polygonString, + handlerClass: params.handlerClass, + backgroundOverlayId: params.backgroundOverlayId, + zoomLevel: params.zoomLevel, + overlayIds: this.idsToString(params.overlayIds), + elementIds: this.idsToString(params.elementIds), + reactionIds: this.idsToString(params.reactionIds) + }; + return self.getProjectId(params.projectId).then(function (result) { + queryParams.projectId = result; + return self.sendPostRequest(self.getModelPartUrl(queryParams), filterParams); + }); +}; + ServerConnector.getImageConverters = function () { var self = this; return self.getConfiguration().then(function (configuration) { diff --git a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js index 6a30568a937a07888ecc4bd7b106fbfde43e8a02..15fbc9e6587bbb7ce763ac7e7200e7bfbd206cf5 100644 --- a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js +++ b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js @@ -137,6 +137,38 @@ function createProjectData(options) { } }); }, + /** + * Export part of the map that includes bioEntities into a known format. + * + * @param {Object} param + * @param {string} param.handlerClass format defined in {Configuration#getModelConverters} + * @param {number} param.modelId id of the model + * @param {Array} param.bioEntities + * @returns {Promise} + */ + exportToMapFormat: function (param) { + var exportParams = { + projectId: map.getProject().getProjectId(), + modelId: param.modelId, + handlerClass: param.handlerClass, + elementIds: [], + reactionIds: [] + }; + for (var i = 0; i < param.bioEntities.length; i++) { + var ie = new IdentifiedElement(param.bioEntities[i]); + if (ie.getType() === "ALIAS") { + exportParams.elementIds.push(ie.getId()); + } else if (ie.getType() === "REACTION") { + exportParams.reactionIds.push(ie.getId()); + } else { + return Promise.reject(new Error("Unsupported bioentity type: " + ie.getType())); + } + if (ie.getModelId() !== param.modelId) { + return Promise.reject(new Error("Export of bioEntities from few maps is not supported. ModelId: " + param.modelId + "; element modelId: " + ie.getModelId())); + } + } + return options.map.getServerConnector().getPartOfModelInExportFormat(exportParams); + }, getAllBioEntities: function () { var models = map.getProject().getModels(); var result = []; @@ -312,7 +344,7 @@ function createWrapperFunctionForDialogGuiUpdate(param) { * @param {CustomMap} options.map * @param {Plugin} options.plugin * @param {string} options.pluginId - * @returns {{getVisibleDataOverlays: function(): (Promise<DataOverlay[]>|*), addListener: addListener, removeListener: removeListener, removeAllListeners: function(): Array, getHighlightedBioEntities: function(*=): *, showBioEntity: function(*=): *, hideBioEntity: function(*=): Promise<T>, setCenter: function(*): PromiseLike, getCenter: function(*): Point, getBounds: function(*): Bounds, fitBounds: function(*): void, setZoom: function(*): *, getZoom: function(*): number, openMap: function(*): PromiseLike}} + * @returns {{getVisibleDataOverlays: (function(): (Promise<DataOverlay[]>|*)), addListener: addListener, removeListener: removeListener, removeAllListeners: (function(): Array), getHighlightedBioEntities: (function(*=): Promise<Array | never>), showBioEntity: (function(*=): *), hideBioEntity: (function(*=): Promise<any | never>), setCenter: (function(*): PromiseLike), getCenter: (function(*): Point), getBounds: (function(*): Bounds), fitBounds: (function(*): void), setZoom: (function(*): *), getZoom: (function(*): number), openMap: (function(*): PromiseLike)}} */ function createProjectMap(options) { var map = options.map; @@ -569,7 +601,7 @@ function createProjectMap(options) { * @param {CustomMap} options.map * @param {Plugin} options.plugin * @param {string} options.pluginId - * @returns {{data: {getBioEntityById: function(*=): Promise<any>, getAllBioEntities: function(): *, getReactionsWithElement: function(*=): *, getProjectId: function(): string, getName: function(): string, getVersion: function(): string, getDisease: getDisease, getOrganism: getOrganism, getModels: function(): *[]}, map: {getVisibleDataOverlays: function(): (Promise<DataOverlay[]>|*), addListener: addListener, removeListener: removeListener, removeAllListeners: function(): Array, getHighlightedBioEntities: function(*=): *, showBioEntity: function(*=): *, hideBioEntity: function(*=): Promise<T>, setCenter: function(*): PromiseLike, getCenter: function(*): Point, getBounds: function(*): Bounds, fitBounds: function(*): void, setZoom: function(*): *, getZoom: function(*): number, openMap: function(*): PromiseLike}}} + * @returns {{data: {getBioEntityById: (function(*=): Promise<any>), getAllBioEntities: (function(): *), getReactionsWithElement: (function(*=): *), getProjectId: (function(): string), getName: (function(): string), getVersion: (function(): string), getDisease: getDisease, getOrganism: getOrganism, getModels: (function(): *[])}, map: {getVisibleDataOverlays: (function(): (Promise<DataOverlay[]>|*)), addListener: addListener, removeListener: removeListener, removeAllListeners: (function(): Array), getHighlightedBioEntities: (function(*=): Promise<Array|never>), showBioEntity: (function(*=): *), hideBioEntity: (function(*=): Promise<any|never>), setCenter: (function(*): PromiseLike), getCenter: (function(*): Point), getBounds: (function(*): Bounds), fitBounds: (function(*): void), setZoom: (function(*): *), getZoom: (function(*): number), openMap: (function(*): PromiseLike)}}} */ function createProject(options) { return { @@ -635,17 +667,16 @@ function createPluginData(options) { * @param {HTMLElement} options.element * @param {Configuration} options.configuration * @param {ServerConnector} options.serverConnector - * @returns {{pluginId: string|string, element: *, project: {data: {getBioEntityById: function(*=): Promise<any>, getAllBioEntities: function(): *, getReactionsWithElement: function(*=): *, getProjectId: function(): string, getName: function(): string, getVersion: function(): string, getDisease: getDisease, getOrganism: getOrganism, getModels: function(): *[]}, map: {getVisibleDataOverlays: function(): (Promise<DataOverlay[]>|*), addListener: addListener, removeListener: removeListener, removeAllListeners: function(): Array, getHighlightedBioEntities: function(*=): *, showBioEntity: function(*=): *, hideBioEntity: function(*=): Promise<T>, setCenter: function(*): PromiseLike, getCenter: function(*): Point, getBounds: function(*): Bounds, fitBounds: function(*): void, setZoom: function(*): *, getZoom: function(*): number, openMap: function(*): PromiseLike}}, configuration: {options: ConfigurationOption[], overlayTypes: string[], imageConverters: ImageConverter[], modelConverters: ModelConverter[], elementTypes: BioEntityType[], reactionTypes: BioEntityType[], miriamTypes: MiriamType[], mapTypes: MapType[], modificationStateTypes: ModificationStateType[], privilegeTypes: PrivilegeType[], annotators: Annotator[]}, pluginData: {setGlobalParam: function(*=, *=): *, getGlobalParam: function(*=): *, setUserParam: function(*=, *=): *, getUserParam: function(*=): *}}} + * @returns {{pluginId: (string|string), element: HTMLElement, project: {data: {getBioEntityById: (function(*=): Promise<any>), getAllBioEntities: (function(): *), getReactionsWithElement: (function(*=): *), getProjectId: (function(): string), getName: (function(): string), getVersion: (function(): string), getDisease: getDisease, getOrganism: getOrganism, getModels: (function(): *[])}, map: {getVisibleDataOverlays: (function(): (Promise<DataOverlay[]>|*)), addListener: addListener, removeListener: removeListener, removeAllListeners: (function(): Array), getHighlightedBioEntities: (function(*=): Promise<Array|never>), showBioEntity: (function(*=): *), hideBioEntity: (function(*=): Promise<any|never>), setCenter: (function(*): PromiseLike), getCenter: (function(*): Point), getBounds: (function(*): Bounds), fitBounds: (function(*): void), setZoom: (function(*): *), getZoom: (function(*): number), openMap: (function(*): PromiseLike)}}, configuration: {options: ConfigurationOption[], overlayTypes: string[], imageConverters: ImageConverter[], modelConverters: ModelConverter[], elementTypes: BioEntityType[], reactionTypes: BioEntityType[], miriamTypes: MiriamType[], mapTypes: MapType[], modificationStateTypes: ModificationStateType[], privilegeTypes: PrivilegeType[], annotators: Annotator[]}, pluginData: {setGlobalParam: (function(*=, *=): *), getGlobalParam: (function(*=): *), setUserParam: (function(*=, *=): *), getUserParam: (function(*=): *)}}} * @constructor */ function MinervaPluginProxy(options) { - return { - pluginId: options.pluginId, - element: options.element, - project: createProject(options), - configuration: createConfiguration(options), - pluginData: createPluginData(options) - }; + this.pluginId = options.pluginId; + this.element = options.element; + this.project = createProject(options); + this.configuration = createConfiguration(options); + this.pluginData = createPluginData(options); + } module.exports = MinervaPluginProxy; diff --git a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js index 4715ed3b0fed6036022550d246f856fe9a689e75..116e8d8537e7e2190081c191c07ee9c6a2910d54 100644 --- a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js +++ b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js @@ -181,10 +181,10 @@ describe('MinervaPluginProxy', function () { describe("getBioEntityById", function () { it("for alias", function () { - var map, proxy; + var map; return ServerConnector.getProject().then(function (project) { map = helper.createCustomMap(project); - proxy = createProxy(map); + var proxy = createProxy(map); return proxy.project.data.getBioEntityById({ id: 329177, modelId: 15781, @@ -198,10 +198,10 @@ describe('MinervaPluginProxy', function () { }); it("for reaction", function () { - var map, proxy; + var map; return ServerConnector.getProject().then(function (project) { map = helper.createCustomMap(project); - proxy = createProxy(map); + var proxy = createProxy(map); return proxy.project.data.getBioEntityById({ id: 153508, modelId: 15781, @@ -216,6 +216,26 @@ describe('MinervaPluginProxy', function () { }); }); + describe("exportToMapFormat", function () { + it("for alias", function () { + var map; + return ServerConnector.getProject().then(function (project) { + map = helper.createCustomMap(project); + var proxy = createProxy(map); + return proxy.project.data.exportToMapFormat({ + modelId: 15781, + bioEntities: [{id: 329177, modelId: 15781, type: "ALIAS"}], + handlerClass: helper.getConfiguration().getModelConverters()[0].handler + }); + }).then(function (result) { + assert.ok(result); + }).then(function () { + map.destroy(); + }); + }); + + }); + describe("showElement", function () { it("alias", function () { var elementToShow = { @@ -238,7 +258,8 @@ describe('MinervaPluginProxy', function () { color: "#FF0000" } }; - var map, proxy; + var map; + var proxy; return ServerConnector.getProject().then(function (project) { map = helper.createCustomMap(project); proxy = createProxy(map); diff --git a/frontend-js/testFiles/apiCalls/projects/sample/models/15781.downloadModel/POST_elementIds=329177&handlerClass=lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/sample/models/15781.downloadModel/POST_elementIds=329177&handlerClass=lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser&token=MOCK_TOKEN_ID& new file mode 100644 index 0000000000000000000000000000000000000000..c83f0983baeb47529744650af680789d24fa844e --- /dev/null +++ b/frontend-js/testFiles/apiCalls/projects/sample/models/15781.downloadModel/POST_elementIds=329177&handlerClass=lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser&token=MOCK_TOKEN_ID& @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sbml xmlns="http://www.sbml.org/sbml/level2/version4" xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" level="2" version="4"> +<model metaid="untitled" id="untitled"> +<listOfUnitDefinitions> +</listOfUnitDefinitions> +<listOfFunctionDefinitions> +</listOfFunctionDefinitions> +<annotation> +<celldesigner:extension> +<celldesigner:modelVersion>4.0</celldesigner:modelVersion> +<celldesigner:modelDisplay sizeX="1305" sizeY="473"/> +<celldesigner:listOfIncludedSpecies> +</celldesigner:listOfIncludedSpecies> +<celldesigner:listOfCompartmentAliases> +</celldesigner:listOfCompartmentAliases> +<celldesigner:listOfComplexSpeciesAliases> +</celldesigner:listOfComplexSpeciesAliases> +<celldesigner:listOfSpeciesAliases> +<celldesigner:speciesAlias id="sa10" species="s_id_sa10" > +<celldesigner:activity>inactive</celldesigner:activity> +<celldesigner:bounds x="0.0" y="186.0" w="80.0" h="30.0" /> +<celldesigner:font size="12.0"/> +<celldesigner:view state="usual"/> +<celldesigner:usualView><celldesigner:innerPosition x="0.0" y="186.0"/><celldesigner:boxSize width="80.0" height="30.0"/><celldesigner:singleLine width="1.0"/><celldesigner:paint color="FFFF00FF" scheme="Color"/></celldesigner:usualView> +<celldesigner:briefView><celldesigner:innerPosition x="0.0" y="186.0"/><celldesigner:boxSize width="80.0" height="30.0"/><celldesigner:singleLine width="1.0"/><celldesigner:paint color="FFFF00FF" scheme="Color"/></celldesigner:briefView> +</celldesigner:speciesAlias> +</celldesigner:listOfSpeciesAliases> +<celldesigner:listOfProteins></celldesigner:listOfProteins> +<celldesigner:listOfGenes></celldesigner:listOfGenes> +<celldesigner:listOfRNAs></celldesigner:listOfRNAs> +<celldesigner:listOfAntisenseRNAs></celldesigner:listOfAntisenseRNAs> +<celldesigner:listOfLayers></celldesigner:listOfLayers> +</celldesigner:extension> +</annotation> +<listOfCompartments> +<compartment metaid="default" id="default" name="" size="1" units="volume" > +<annotation> +<celldesigner:extension> +<celldesigner:name></celldesigner:name> +</celldesigner:extension> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/" xmlns:bqmodel="http://biomodels.net/model-qualifiers/"> +<rdf:Description rdf:about="#"> +</rdf:Description> +</rdf:RDF> +</annotation> +<notes><html xmlns="http://www.w3.org/1999/xhtml"><head><title/></head><body> +</body></html></notes> +</compartment> +</listOfCompartments> +<listOfSpecies><species name="s10" id="s_id_sa10" metaid="s_id_sa10" initialAmount="0.0" compartment="default"><annotation><celldesigner:extension><celldesigner:positionToCompartment>inside</celldesigner:positionToCompartment><celldesigner:speciesIdentity><celldesigner:class>DRUG</celldesigner:class> +<celldesigner:name>s10</celldesigner:name> +</celldesigner:speciesIdentity> +</celldesigner:extension> +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#" xmlns:bqbiol="http://biomodels.net/biology-qualifiers/" xmlns:bqmodel="http://biomodels.net/model-qualifiers/"> +<rdf:Description rdf:about="#"> +</rdf:Description> +</rdf:RDF> +</annotation> +</species> +</listOfSpecies> +<listOfReactions> +</listOfReactions> +<notes></notes></model></sbml> \ No newline at end of file