From 6df0f0afd5a6d843110ea5d95541eedfb1b1d40c Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Mon, 22 Jul 2019 17:51:09 +0200 Subject: [PATCH] list of plugins is automatically reloaded on refresh page --- CHANGELOG | 2 ++ frontend-js/src/main/js/ServerConnector.js | 13 ++++++++++ frontend-js/src/main/js/minerva.js | 20 +++++++++++--- frontend-js/src/main/js/plugin/Plugin.js | 15 +++++++++++ .../src/main/js/plugin/PluginManager.js | 26 +++++++++++++++++++ .../src/test/js/plugin/PluginManager-test.js | 18 +++++++++++++ 6 files changed, 90 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index abb708fb12..0ff7dcb6ba 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ 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 diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index 6ee653204b..24251d4b3e 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -1320,6 +1320,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/minerva.js b/frontend-js/src/main/js/minerva.js index 0f8596a7d3..2d7d2320ae 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -278,13 +278,13 @@ function initGlobals(params) { if (global.ServerConnector === undefined) { global.ServerConnector = ServerConnector; if (params.isDebug()) { - logger.level="debug"; + logger.level = "debug"; } else { - logger.level="info"; + logger.level = "info"; } GuiConnector.init(); if (GuiConnector.getParams['debug'] !== undefined) { - logger.level="debug"; + logger.level = "debug"; } } else { logger.warn("global ServerConnector found"); @@ -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(); @@ -674,7 +686,7 @@ function createLoginDiv(configuration) { className: "minerva-login-caps-lock-warning", content: "Warning: Caps lock is on" })); - GuiConnector.addListener("onCapsLockChange",function(e){ + GuiConnector.addListener("onCapsLockChange", function (e) { if (e.arg) { $(".minerva-login-caps-lock-warning").css("display", "block"); } else { diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js index c513e2839d..e1c97d61db 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 a04aa1628d..d577830ae4 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/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js index b8ff7f823d..3daf81da24 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"}); -- GitLab