From 09ff0ed8a46ffc0be3761ce5667b610648050ac1 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 14 Sep 2018 16:39:28 +0200
Subject: [PATCH] when plugin is not loaded properly plugin tab is not shown;
 the same happens after unloading all plugin

---
 frontend-js/src/main/js/plugin/Plugin.js      | 17 ++++--
 .../src/main/js/plugin/PluginManager.js       | 59 +++++++++++--------
 .../src/test/js/plugin/PluginManager-test.js  | 20 +++++++
 3 files changed, 67 insertions(+), 29 deletions(-)

diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js
index c097c0c4fa..e2c9f99dd9 100644
--- a/frontend-js/src/main/js/plugin/Plugin.js
+++ b/frontend-js/src/main/js/plugin/Plugin.js
@@ -181,12 +181,21 @@ Plugin.prototype.getMinWidth = function () {
  */
 Plugin.prototype.unload = function () {
   var self = this;
+  var validPlugin = true;
+  if (self.getLoadedPluginData() === undefined) {
+    validPlugin = false;
+    logger.warn("Plugin wasn't loaded properly");
+  }
   return Promise.resolve().then(function () {
-    return self.getLoadedPluginData().unregister();
+    if (validPlugin) {
+      return self.getLoadedPluginData().unregister();
+    }
   }).then(function () {
-    var removedListeners = self.getMinervaPluginProxy().project.map.removeAllListeners();
-    if (removedListeners.length > 0) {
-      logger.warn("'" + self.getLoadedPluginData().getName() + "' plugin didn't remove all registered listeners");
+    if (validPlugin) {
+      var removedListeners = self.getMinervaPluginProxy().project.map.removeAllListeners();
+      if (removedListeners.length > 0) {
+        logger.warn("'" + self.getLoadedPluginData().getName() + "' plugin didn't remove all registered listeners");
+      }
     }
     return self.callListeners("onUnload");
   }).then(function () {
diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js
index 064259bd8f..f3f4a59a7f 100644
--- a/frontend-js/src/main/js/plugin/PluginManager.js
+++ b/frontend-js/src/main/js/plugin/PluginManager.js
@@ -70,8 +70,8 @@ PluginManager.prototype.getGuiUtils = function () {
  */
 PluginManager.prototype.addPlugin = function (options) {
   var self = this;
+  $(self.getElement()).show();
   if (self._panels === undefined) {
-    $(self.getElement()).show();
     self.getGuiUtils().initTabContent(self);
   }
   var element = Functions.createElement({type: "div"});
@@ -79,31 +79,36 @@ PluginManager.prototype.addPlugin = function (options) {
   self.getGuiUtils().addTab(self, {name: "PLUGIN", content: element});
 
   var plugin;
-  if (options instanceof Plugin) {
-    plugin = options;
-    plugin.setOptions({
-      element: element,
-      configuration: self.getConfiguration(),
-      map: self.getMap(),
-      serverConnector: self.getServerConnector()
-    });
-  } else {
-    if (!self.isValidUrl(options.url)) {
-      return Promise.reject(new InvalidArgumentError("url: '" + options.url + "' is invalid"));
+  return Promise.resolve().then(function () {
+    if (options instanceof Plugin) {
+      plugin = options;
+      plugin.setOptions({
+        element: element,
+        configuration: self.getConfiguration(),
+        map: self.getMap(),
+        serverConnector: self.getServerConnector()
+      });
+    } else {
+      plugin = new Plugin({
+        url: options.url,
+        element: element,
+        configuration: self.getConfiguration(),
+        map: self.getMap(),
+        serverConnector: self.getServerConnector()
+      });
+      plugin.addListener("onUnload", function () {
+        self.getGuiUtils().hideTab(self, element);
+        if ($("li", self.getElement()).children(':visible').length === 0) {
+          $(self.getElement()).hide();
+        }
+      });
+      if (!self.isValidUrl(options.url)) {
+        return Promise.reject(new InvalidArgumentError("url: '" + options.url + "' is invalid"));
+      }
     }
-    plugin = new Plugin({
-      url: options.url,
-      element: element,
-      configuration: self.getConfiguration(),
-      map: self.getMap(),
-      serverConnector: self.getServerConnector()
-    });
-    plugin.addListener("onUnload", function () {
-      self.getGuiUtils().hideTab(self, element);
-    });
-  }
-  self._plugins.push(plugin);
-  return plugin.load().then(function () {
+    self._plugins.push(plugin);
+    return plugin.load();
+  }).then(function () {
     $("a[href='#" + element.parentNode.id + "']", $(self.getElement()))[0].innerHTML = plugin.getName();
     var tab = $(element.parentNode);
     var adjustHeight = function () {
@@ -120,6 +125,10 @@ PluginManager.prototype.addPlugin = function (options) {
     }
   }).then(function () {
     return plugin;
+  }).catch(function (e) {
+    return plugin.unload().then(function () {
+      GuiConnector.alert("Problem with loading plugin:<br/>" + e.message);
+    });
   });
 };
 
diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js
index 4f76d3cde9..e251c7d48b 100644
--- a/frontend-js/src/test/js/plugin/PluginManager-test.js
+++ b/frontend-js/src/test/js/plugin/PluginManager-test.js
@@ -77,6 +77,26 @@ describe('PluginManager', function () {
       });
     });
 
+    it('with error', function () {
+      var manager = createPluginManager();
+      return manager.addPlugin({url: "./invalid.js"}).then(function (plugin) {
+        assert.notOk("Expected error");
+      }).catch(function (e) {
+        assert.ok(e.message.indexOf("Problem with loading plugin") >= 0)
+      });
+    });
+    it('with invalid url', function () {
+      var manager = createPluginManager();
+      manager.isValidUrl = function () {
+        return false;
+      };
+      return manager.addPlugin({url: "xx"}).then(function (plugin) {
+        assert.notOk("Expected error");
+      }).catch(function (e) {
+        assert.ok(e.message.indexOf("Problem with loading plugin") >= 0)
+      });
+    });
+
 
   });
 
-- 
GitLab