From 4a358f8bc5509286c4a375e2aaf5d02e07fff288 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 27 Dec 2018 09:42:31 +0100
Subject: [PATCH] data overlay ids are stored in url GET param

---
 frontend-js/src/main/js/GuiConnector.js |   3 +-
 frontend-js/src/main/js/minerva.js      |  32 ++++++-
 frontend-js/src/test/js/minerva-test.js | 115 ++++++++++++------------
 3 files changed, 91 insertions(+), 59 deletions(-)

diff --git a/frontend-js/src/main/js/GuiConnector.js b/frontend-js/src/main/js/GuiConnector.js
index 4fd72b8073..e3bc805638 100644
--- a/frontend-js/src/main/js/GuiConnector.js
+++ b/frontend-js/src/main/js/GuiConnector.js
@@ -388,6 +388,7 @@ GuiConnector.prototype.destroy = function () {
   }
   if (self._warnDialog !== undefined) {
     $(self._warnDialog).dialog("destroy").remove();
+    self._warnDialog = undefined;
   }
   if (self._processingDialog !== undefined) {
     $(self._processingDialog).dialog("destroy").remove();
@@ -408,7 +409,7 @@ GuiConnector.prototype.destroy = function () {
  * @param {string} message
  */
 GuiConnector.prototype.warn = function (message) {
-  var self = GuiConnector;
+  var self = returnThisOrSingleton(this);
   logger.warn(message);
   if (self._warnDialog === undefined) {
     self._warnDialog = document.createElement("div");
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 177c948a91..d01dd93d85 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -57,6 +57,14 @@ function processUrlGetParams(params) {
     sessionData.setZoomLevel(model, GuiConnector.getParams["zoom"]);
   }
 
+  if (GuiConnector.getParams["background"] !== undefined) {
+    sessionData.setSelectedBackgroundOverlay(GuiConnector.getParams["background"]);
+  }
+
+  if (GuiConnector.getParams["overlays"] !== undefined) {
+    sessionData.setVisibleOverlays(GuiConnector.getParams["overlays"].split(","));
+  }
+
   if (GuiConnector.getParams["comments"] === "on") {
     sessionData.setShowComments(true);
   }
@@ -363,6 +371,24 @@ function addUrlChangeListenersToCustomMap(customMap) {
   });
 
 
+  var onOverlaysChangedHandler = function () {
+    return customMap.getVisibleDataOverlays().then(function (dataOverlays) {
+      var ids = [];
+      for (var i = 0; i < dataOverlays.length; i++) {
+        ids.push(dataOverlays[i].getId());
+      }
+      GuiConnector.setUrlParam("overlays", ids.join(","));
+    })
+  };
+
+  customMap.addListener("onShowOverlay", onOverlaysChangedHandler);
+  customMap.addListener("onHideOverlay", onOverlaysChangedHandler);
+
+  customMap.addListener("onBackgroundOverlayChange", function (event) {
+    GuiConnector.setUrlParam("background", event.arg);
+  });
+
+
 }
 
 /**
@@ -479,7 +505,7 @@ function create(params) {
 
     return customMap.init();
   }).then(function () {
-    return insertGoogleAnalyticsCode(customMap);
+    return insertGoogleAnalyticsCode();
   }).then(function () {
     return leftPanel.init();
   }).then(function () {
@@ -499,6 +525,8 @@ function create(params) {
       for (var j = 0; j < overlays.length; j++) {
         var overlay = overlays[j];
         if (overlay.getName() === GuiConnector.getParams["layout"]) {
+          GuiConnector.warn("'layout' GET parameter in url is deprecated. Please use 'overlays' GET param instead (take a look at current url)");
+          GuiConnector.setUrlParam("layout", undefined);
           return customMap.openDataOverlay(overlay);
         }
       }
@@ -529,6 +557,8 @@ function create(params) {
         return leftPanel.destroy().then(function () {
           customMap.destroy();
           return topMenu.destroy();
+        }).then(function () {
+          return GuiConnector.destroy();
         });
       },
       getProject: function () {
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index 5d5ba8387b..166feb4183 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -7,7 +7,7 @@ var Promise = require("bluebird");
 var minerva = require('../../main/js/minerva');
 var SecurityError = require('../../main/js/SecurityError');
 var ServerConnectorMock = require('./ServerConnector-mock');
-var Point= require('../../main/js/map/canvas/Point');
+var Point = require('../../main/js/map/canvas/Point');
 var ProxyAccessPlugin = require('./plugin/ProxyAccessPlugin');
 
 var chai = require('chai');
@@ -126,31 +126,67 @@ describe('minerva global', function () {
     });
   });
 
-  it('create with overlay', function () {
-    var overlay, project, plugin, map;
-    return ServerConnectorMock.getProject().then(function (result) {
-      project = result;
-      var options = helper.createCustomMapOptions(project);
+  describe('create with overlay', function () {
+    it('background as layout param in URL', function () {
+      var overlay, project, plugin, map;
+      return ServerConnectorMock.getProject().then(function (result) {
+        project = result;
+        var options = helper.createCustomMapOptions(project);
 
-      plugin = new ProxyAccessPlugin({});
-      options.getPlugins().push(plugin);
+        plugin = new ProxyAccessPlugin({});
+        options.getPlugins().push(plugin);
 
-      overlay = project.getDataOverlays()[1];
+        overlay = project.getDataOverlays()[1];
 
-      helper.setUrl("http://test/?layout=" + overlay.getName());
+        helper.setUrl("http://test/?layout=" + overlay.getName());
 
-      return minerva.create(options);
-    }).then(function (result) {
-      map = result;
-      assert.ok(result);
-      // input file is not available so it's the background
-      return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
-    }).then(function (visibleDataOverlays) {
-      // input file is available so it's not the background file but overlay
-      assert.equal(visibleDataOverlays.length, 0);
-      assert.equal(ServerConnectorMock.getSessionData(project).getSelectedBackgroundOverlay(), overlay.getId());
-      assert.equal(logger.getWarnings().length, 0);
-      return map.destroy();
+        return minerva.create(options);
+      }).then(function (result) {
+        map = result;
+        assert.ok(result);
+        // input file is not available so it's the background
+        return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
+      }).then(function (visibleDataOverlays) {
+        // input file is available so it's not the background file but overlay
+        assert.equal(visibleDataOverlays.length, 0);
+        assert.equal(ServerConnectorMock.getSessionData(project).getSelectedBackgroundOverlay(), overlay.getId());
+        assert.equal(logger.getWarnings().length, 1);
+        return map.destroy();
+      });
+    });
+    it('overlay as layout param in URL', function () {
+      helper.setUrl("http://test/?layout=xxx");
+      var globalObject, plugin;
+      return ServerConnectorMock.getProject().then(function (project) {
+        var options = helper.createCustomMapOptions(project);
+        plugin = new ProxyAccessPlugin();
+        options.getPlugins().push(plugin);
+        return minerva.create(options);
+      }).then(function (result) {
+        globalObject = result;
+        assert.ok(result);
+        return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
+      }).then(function (visibleDataOverlays) {
+        // input file is available so it's not the background file but overlay
+        assert.equal(visibleDataOverlays.length, 1);
+        assert.equal(logger.getWarnings().length, 1);
+        return globalObject.destroy();
+      });
+    });
+    it('layout from session data', function () {
+      var layout;
+      return ServerConnectorMock.getProject().then(function (project) {
+        var options = helper.createCustomMapOptions(project);
+
+        layout = project.getDataOverlays()[1];
+
+        ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId());
+
+        return minerva.create(options);
+      }).then(function (result) {
+        assert.equal(ServerConnectorMock.getSessionData().getSelectedBackgroundOverlay(), layout.getId());
+        return result.destroy();
+      });
     });
   });
 
@@ -175,41 +211,6 @@ describe('minerva global', function () {
     });
   });
 
-  it('create with layout from session data', function () {
-    var layout;
-    return ServerConnectorMock.getProject().then(function (project) {
-      var options = helper.createCustomMapOptions(project);
-
-      layout = project.getDataOverlays()[1];
-
-      ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId());
-
-      return minerva.create(options);
-    }).then(function (result) {
-      assert.equal(ServerConnectorMock.getSessionData().getSelectedBackgroundOverlay(), layout.getId());
-      return result.destroy();
-    });
-  });
-
-  it('create with layout 2', function () {
-    helper.setUrl("http://test/?layout=xxx");
-    var globalObject, plugin;
-    return ServerConnectorMock.getProject().then(function (project) {
-      var options = helper.createCustomMapOptions(project);
-      plugin = new ProxyAccessPlugin();
-      options.getPlugins().push(plugin);
-      return minerva.create(options);
-    }).then(function (result) {
-      globalObject = result;
-      assert.ok(result);
-      return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
-    }).then(function (visibleDataOverlays) {
-      // input file is available so it's not the background file but overlay
-      assert.equal(visibleDataOverlays.length, 1);
-      assert.equal(logger.getWarnings().length, 0);
-      return globalObject.destroy();
-    });
-  });
 
   it('create with search overlay and GET search param', function () {
     helper.setUrl("http://test/?search=s1");
-- 
GitLab