From deed0773f3f4a45b6c481930cdb89037c42e091c Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 21 Dec 2018 14:26:55 +0100
Subject: [PATCH] opening submap changes url GET parameter

---
 frontend-js/src/main/js/GuiConnector.js       | 21 +++++++++++++++
 .../src/main/js/ObjectWithListeners.js        |  6 ++++-
 frontend-js/src/main/js/map/CustomMap.js      | 26 ++++++++++---------
 frontend-js/src/main/js/minerva.js            | 11 ++++++++
 4 files changed, 51 insertions(+), 13 deletions(-)

diff --git a/frontend-js/src/main/js/GuiConnector.js b/frontend-js/src/main/js/GuiConnector.js
index b15a812aaf..24437c1873 100644
--- a/frontend-js/src/main/js/GuiConnector.js
+++ b/frontend-js/src/main/js/GuiConnector.js
@@ -109,6 +109,27 @@ GuiConnector.prototype.init = function () {
   }
 };
 
+
+/**
+ *
+ * @param {string} key
+ * @param {string} value
+ */
+GuiConnector.prototype.setUrlParam = function (key, value) {
+  var self = this;
+  if (self.getParams[key] !== value) {
+    self.getParams[key] = value;
+    var url = location.pathname + '?';
+    for (var getParamKey in self.getParams) {
+      if (self.getParams.hasOwnProperty(getParamKey)) {
+        var getParamValue = self.getParams[getParamKey];
+        url += getParamKey + "=" + getParamValue + "&";
+      }
+    }
+    window.history.replaceState(null, null, url);
+  }
+};
+
 /**
  *
  * @param {function} handler
diff --git a/frontend-js/src/main/js/ObjectWithListeners.js b/frontend-js/src/main/js/ObjectWithListeners.js
index 219b102584..ce215052b8 100644
--- a/frontend-js/src/main/js/ObjectWithListeners.js
+++ b/frontend-js/src/main/js/ObjectWithListeners.js
@@ -16,8 +16,12 @@ function ObjectWithListeners() {
 
 /**
  * @callback ListenerCallback
- * @param event
+ * @param {Object} event
+ * @param {string} event.type
+ * @param {ObjectWithListeners} event.object
+ * @param {Object} event.arg
  */
+
 /**
  * Adds a listener function to the object.
  *
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 4209da61ba..bfc79ed439 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -45,6 +45,7 @@ function CustomMap(options) {
   this.registerListenerType("onShowOverlay");
   this.registerListenerType("onHideOverlay");
   this.registerListenerType("onBackgroundOverlayChange");
+  this.registerListenerType("onSubmapOpen");
 
   // @type {boolean[]}
   this._selectedOverlays = [];
@@ -479,11 +480,12 @@ CustomMap.prototype.openSubmap = function (id) {
           return self.refreshMarkers();
         });
       }
+    }).then(function (value) {
+      return self.callListeners("onSubmapOpen", {mapId: id});
     });
   } else {
     return Promise.resolve();
   }
-
 };
 
 /**
@@ -1218,26 +1220,26 @@ CustomMap.prototype.getDistance = function (params) {
         if (element.getY() <= y && element.getY() + element.getHeight() >= y) {
           return 0;
         } else {
-          return Math.min( 
-            Math.abs(element.getY() - y), 
-            Math.abs(element.getY() + element.getHeight() - y) 
+          return Math.min(
+            Math.abs(element.getY() - y),
+            Math.abs(element.getY() + element.getHeight() - y)
           );
         }
       } else if (element.getY() <= y && element.getY() + element.getHeight() >= y) {
-        return Math.min( 
-          Math.abs(element.getX() - x), 
-          Math.abs(element.getX() + element.getWidth() - x) 
+        return Math.min(
+          Math.abs(element.getX() - x),
+          Math.abs(element.getX() + element.getWidth() - x)
         );
       } else {
         var elementX = element.getX();
         var elementY = element.getY();
         var elementWidth = element.getWidth();
         var elementHeight = element.getHeight();
-        return Math.min( 
-          Functions.distance(p1, new Point(elementX, y)), 
-          Functions.distance(p1, new Point(elementX + elementWidth, elementY)), 
-          Functions.distance(p1, new Point(elementX, elementY + elementHeight)), 
-          Functions.distance(p1, new Point(elementX + elementWidth, elementY + elementHeight)) 
+        return Math.min(
+          Functions.distance(p1, new Point(elementX, y)),
+          Functions.distance(p1, new Point(elementX + elementWidth, elementY)),
+          Functions.distance(p1, new Point(elementX, elementY + elementHeight)),
+          Functions.distance(p1, new Point(elementX + elementWidth, elementY + elementHeight))
         );
       }
     } else if (element instanceof Reaction) {
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 9a82fd917f..cfd3876fdd 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -317,6 +317,16 @@ function assignSplitBarHandler(customMap, pluginManager) {
   });
 }
 
+/**
+ *
+ * @param {CustomMap} customMap
+ */
+function addUrlChangeListenersToCustomMap(customMap) {
+  customMap.addListener("onSubmapOpen", function (event) {
+    GuiConnector.setUrlParam("submap", event.arg.mapId.toString());
+  });
+}
+
 /**
  *
  * @param {CustomMapOptions|*} params
@@ -367,6 +377,7 @@ function create(params) {
 
     customMap = new CustomMap(params);
 
+    addUrlChangeListenersToCustomMap(customMap);
 
     new DbOverlayCollection({
       map: customMap
-- 
GitLab