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