diff --git a/CHANGELOG b/CHANGELOG index b52f97704a8c7539c1d4437e59e5d396727a0471..0ab4fff7fee1ccebcf60421562a9d86dfc9e156f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -27,6 +27,13 @@ minerva (14.0.0~alpha.0) unstable; urgency=low -- Sascha Herzinger <sascha.herzinger@uni.lu> Wed, 22 May 2019 10:30:00 +0200 +minerva (13.1.2) stable; urgency=medium + * Bug fix: Information about problematic zip file is more specific (#865) + * Bug fix: Url didn't contain list of opened plugins and they weren't reload + automatically on refresh (#866) + + -- Piotr Gawron <piotr.gawron@uni.lu> Mon, 22 Jul 2019 17:00:00 +0200 + minerva (13.1.1) stable; urgency=medium * Bug fix: adding gene mapping before the genome caused an error (#835) * Bug fix: "Terms of Use" change to "Terms of Service" in all places (#843) diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index 2932d855a5691532a61bb332c562df3e00d791a4..10f8a5872451f8fd30200abfa50e1e5d55215588 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -1355,6 +1355,19 @@ ServerConnector.getPluginsData = function () { }); }; +/** + * + * @param {string} hash + * @returns {Promise<PluginData>} + */ +ServerConnector.getPluginData = function (hash) { + var self = this; + return self.sendGetRequest(self.getPluginUrl({hash: hash})).then(function (content) { + var data = JSON.parse(content); + return new PluginData(data); + }).catch(self.processNetworkError); +}; + /** * * @param {Object} params diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js index 13a64f3a094dd371ea1e2152c84ee9af5fd328e9..7f821bd6a90d7031f7eb4af60776c44b9ba3d28d 100644 --- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js +++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js @@ -157,7 +157,7 @@ AddProjectDialog.prototype.createGeneralTabContent = function () { name: "project-file" }); fileInput.addEventListener("change", function () { - return self.callListeners("onFileUpload", fileInput.files[0]).then(null, GuiConnector.alert); + return self.callListeners("onFileUpload", fileInput.files[0]).catch(GuiConnector.alert); }, false); self.addListener("onFileUpload", function (e) { var file = e.arg; @@ -1449,7 +1449,12 @@ AddProjectDialog.prototype.createZipEntry = function (jsZipEntry, zipObject) { type = "MAP"; data.root = true; } else { - throw new ValidationError("Unrecognized file: " + filename); + var version = self.getConfiguration().getVersion(); + var minorVersion = version.split(".")[0] + "." + version.split(".")[1]; + + var url = 'https://minerva.pages.uni.lu/doc/admin_manual/v' + minorVersion + '/advanced_upload/'; + throw new ValidationError("Unrecognized file: " + filename + ". Please refer to <a target='#' href='" + url + + "'>manual</a> for information about allowed zip file content"); } if (type === "MAP") { var name = jsZipEntry.name.toLowerCase(); diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index 3cc3ebde00ce30c352b3690ac50a4d529307d0f0..041461972608c65ef9a178b61fd177b89a040ff6 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -584,6 +584,18 @@ function create(params) { for (var i = 0; i < params.getPlugins().length; i++) { promises.push(leftPanel.getPluginManager().addPlugin(params.getPlugins()[i])) } + if (GuiConnector.getParams['plugins'] !== undefined) { + var hashes = GuiConnector.getParams['plugins'].split(","); + for (i = 0; i < hashes.length; i++) { + promises.push(ServerConnector.getPluginData(hashes[i]).then(function (plugin) { + if (plugin !== null) { + return leftPanel.getPluginManager().addPlugin({url: plugin.getUrls()[0]}); + } else { + GuiConnector.warn("Plugin list contains invalid object."); + } + })) + } + } return Promise.all(promises); }).then(function () { return ServerConnector.getLoggedUser(); diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js index c513e2839d1593b6869f83a2809ab84d84f8bcea..e1c97d61db3396a0f2ec89db3d53fd8efbcbe871 100644 --- a/frontend-js/src/main/js/plugin/Plugin.js +++ b/frontend-js/src/main/js/plugin/Plugin.js @@ -39,6 +39,12 @@ var pluginId = 0; function Plugin(options) { ObjectWithListeners.call(this); var self = this; + /** + * + * @type {string} + * @private + */ + self._hash = ''; self.setOptions(options); self.registerListenerType("onUnload"); self.registerListenerType("onResize"); @@ -162,6 +168,7 @@ Plugin.prototype.load = function () { version: self.getVersion() })); }).then(function () { + self._hash = hash; if (error) { return Promise.reject(error); } @@ -243,6 +250,14 @@ Plugin.prototype.getName = function () { return this.getLoadedPluginData().getName(); }; +/** + * + * @returns {string} + */ +Plugin.prototype.getHash = function () { + return this._hash; +}; + /** * * @returns {string} diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js index a04aa1628d816b381b5c08bec12e2bcf2c7e57ad..d577830ae4baf19d4e5e47b1b959c090f967f9cb 100644 --- a/frontend-js/src/main/js/plugin/PluginManager.js +++ b/frontend-js/src/main/js/plugin/PluginManager.js @@ -27,6 +27,10 @@ var Functions = require('../Functions'); function PluginManager(options) { AbstractGuiElement.call(this, options); var self = this; + /** + * @type Plugin[] + */ + self._plugins = []; self._pluginOnResizeHandlers = {}; @@ -132,6 +136,7 @@ PluginManager.prototype.addPlugin = function (options) { } } }).then(function () { + GuiConnector.setUrlParam("plugins", self._getLoadedPluginsAsHashList()); return plugin; }).catch(function (e) { return plugin.unload().then(function () { @@ -149,6 +154,26 @@ PluginManager.prototype.isValidUrl = function (url) { return isUrl(url); }; +/** + * + * @return {string} + * @private + */ +PluginManager.prototype._getLoadedPluginsAsHashList = function () { + var self = this; + var hashes = ''; + for (var i = 0; i < self._plugins.length; i++) { + if (hashes !== '') { + hashes += ","; + } + hashes += self._plugins[i].getHash(); + } + if (hashes === '') { + hashes = undefined; + } + return hashes; +}; + /** * * @returns {Promise|PromiseLike} @@ -193,6 +218,7 @@ PluginManager.prototype.removePlugin = function (plugin) { } GuiConnector.removeWindowResizeEvent(self._pluginOnResizeHandlers[plugin.getPluginId()]); return plugin.unload().then(function () { + GuiConnector.setUrlParam("plugins", self._getLoadedPluginsAsHashList()); if (self._plugins.length === 0) { $(self.getElement()).hide(); return self.getMap().getMapCanvas().triggerListeners("resize"); diff --git a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js index ab76c0c9c4724f41d9f8fd2d12715b134b891ea1..4460649174c7f6cc2fee3caabd5c9625dba3a204 100644 --- a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js +++ b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js @@ -97,6 +97,20 @@ describe('AddProjectDialog', function () { return dialog.destroy(); }); }); + it('invalid zip', function () { + var dialog = createDialog(); + var file; + + var buf = fs.readFileSync("testFiles/map/invalid-project.zip"); + buf.name = "invalid-project.zip"; + return dialog.init().then(function () { + return dialog.setZipFileContent(buf); + }).catch(function (e) { + assert.ok(e instanceof ValidationError); + }).finally(function () { + return dialog.destroy(); + }); + }); it('CellDesigner file', function () { var dialog = createDialog(); var file; diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js index b8ff7f823d3d0c7d1a40b8ba183cb32c652d595a..3daf81da2473b2a5e3f1e6202fdb76edaf70f287 100644 --- a/frontend-js/src/test/js/plugin/PluginManager-test.js +++ b/frontend-js/src/test/js/plugin/PluginManager-test.js @@ -6,6 +6,8 @@ var Plugin = require('../../../main/js/plugin/Plugin'); var PluginManager = require('../../../main/js/plugin/PluginManager'); var ProxyAccessPlugin = require('./ProxyAccessPlugin'); +var GuiConnector = require('../../../main/js/GuiConnector'); + var logger = require('../logger'); var chai = require('chai'); var assert = chai.assert; @@ -45,6 +47,12 @@ describe('PluginManager', function () { assert.equal(1, manager.getPlugins().length); }); }); + it('check url', function () { + var manager = createPluginManager(); + return manager.addPlugin({url: "./testFiles/plugin/empty.js"}).then(function () { + assert.ok(GuiConnector.getParams['plugins']); + }); + }); it('with min width', function () { var manager = createPluginManager(); return manager.addPlugin({url: "./testFiles/plugin/min-width.js"}).then(function () { @@ -125,6 +133,16 @@ describe('PluginManager', function () { assert.equal(-1, testDiv.innerHTML.indexOf("tab-pane")); }); }); + + it('check url', function () { + var manager = createPluginManager(); + return manager.addPlugin({url: "./testFiles/plugin/empty.js"}).then(function (plugin) { + return manager.removePlugin(plugin); + }).then(function () { + assert.notOk(GuiConnector.getParams['plugins']); + }); + }); + it('removing non existing plugin', function () { var manager = createPluginManager(); var plugin = new Plugin({url: "testFiles/plugin/empty.js"}); diff --git a/frontend-js/testFiles/map/invalid-project.zip b/frontend-js/testFiles/map/invalid-project.zip new file mode 100644 index 0000000000000000000000000000000000000000..af75098cf794ec71062a223af5338e0823819100 Binary files /dev/null and b/frontend-js/testFiles/map/invalid-project.zip differ