From e0d1c7951b52b03e0aa3909ed46e287330f89bbd Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 19 Mar 2018 12:44:48 +0100
Subject: [PATCH] icons in left panel can contain click method that zoom to the
 elements

---
 .../src/main/js/gui/leftPanel/GuiUtils.js     | 19 +++++--
 frontend-js/src/main/js/map/CustomMap.js      | 11 ++--
 .../main/js/map/data/SearchBioEntityGroup.js  |  2 +-
 .../test/js/gui/leftPanel/GuiUtils-test.js    | 19 +++++++
 .../src/test/js/map/AbstractCustomMap-test.js | 56 +++++++++++--------
 5 files changed, 74 insertions(+), 33 deletions(-)

diff --git a/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js b/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js
index f677c943f0..eb87fa1b81 100644
--- a/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js
+++ b/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js
@@ -349,13 +349,16 @@ GuiUtils.prototype.createParamLine = function (label, value) {
   return result;
 };
 
-GuiUtils.prototype.createIcon = function (icon) {
+GuiUtils.prototype.createIcon = function (icon, onclickFunction) {
   var result = document.createElement("div");
   if (icon !== undefined && icon !== null) {
     var img = document.createElement("img");
     img.src = GuiConnector.getImgPrefix() + icon;
     img.style.float = "left";
     img.hspace = "5";
+    if (onclickFunction !== undefined) {
+      img.onclick = onclickFunction;
+    }
     result.appendChild(img);
   }
   return result;
@@ -456,7 +459,15 @@ GuiUtils.prototype.createAliasElement = function (params) {
 
   if (showTitle) {
     if (icon !== undefined) {
-      div.appendChild(this.createIcon(icon));
+      div.appendChild(this.createIcon(icon, function () {
+        return self.getMap().openSubmap(alias.getModelId()).then(function () {
+          if (alias instanceof Alias) {
+            return self.getMap().getSubmapById(alias.getModelId()).fitBounds([alias]);
+          } else {
+            return self.getMap().getSubmapById(alias.getModelId()).fitBounds(alias.getBioEntities());
+          }
+        });
+      }));
     }
 
     div.appendChild(this.createParamLine(alias.getType() + ": ", alias.getName()));
@@ -487,9 +498,9 @@ GuiUtils.prototype.createAliasElement = function (params) {
 };
 GuiUtils.prototype.createSearchBioEntityGroupElement = function (group) {
   if (group.getBioEntities()[0] instanceof Alias) {
-    return this.createAliasElement({alias:group, icon:group.getIcon()});
+    return this.createAliasElement({alias: group, icon: group.getIcon()});
   } else {
-    return this.createReactionElement({reaction:group, icon:group.getIcon()});
+    return this.createReactionElement({reaction: group, icon: group.getIcon()});
   }
 };
 
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index c04d494f09..66a7fa93f2 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -433,6 +433,8 @@ CustomMap.prototype.openSubmap = function (id) {
         return self.refreshMarkers(true);
       }
     });
+  } else {
+    return Promise.resolve();
   }
 
 };
@@ -705,8 +707,6 @@ CustomMap.prototype.renderOverlayCollection = function (params) {
   var overlayCollection = params.overlayCollection;
 
   var elements;
-  var markers = [];
-
   var submaps = self.getSubmaps().concat([self]);
 
   return overlayCollection.getIdentifiedElements().then(function (identifiedElements) {
@@ -719,9 +719,6 @@ CustomMap.prototype.renderOverlayCollection = function (params) {
     }
     return Promise.all(promises);
   }).then(function (mapMarkers) {
-    for (var i = 0; i < mapMarkers.length; i++) {
-      markers = markers.concat(mapMarkers[i]);
-    }
     return Promise.each(elements, function (element) {
       var infoWindow = self.getInfoWindowForIdentifiedElement(element);
       if (infoWindow !== null && infoWindow !== undefined) {
@@ -731,10 +728,12 @@ CustomMap.prototype.renderOverlayCollection = function (params) {
       }
     });
   }).then(function () {
+    return self.fetchIdentifiedElements(elements);
+  }).then(function (fullElements) {
     var promises = [];
     if (elements.length > 0 && fitBounds) {
       for (var j = 0; j < submaps.length; j++) {
-        promises.push(submaps[j].fitBounds(markers));
+        promises.push(submaps[j].fitBounds(fullElements));
       }
     }
     return Promise.all(promises);
diff --git a/frontend-js/src/main/js/map/data/SearchBioEntityGroup.js b/frontend-js/src/main/js/map/data/SearchBioEntityGroup.js
index cfb18a2d90..bee43aa1ad 100644
--- a/frontend-js/src/main/js/map/data/SearchBioEntityGroup.js
+++ b/frontend-js/src/main/js/map/data/SearchBioEntityGroup.js
@@ -196,7 +196,7 @@ SearchAliasGroup.prototype.getMergedParameterByFunction = function (functionName
   return result;
 };
 
-SearchAliasGroup.prototype.getIntersectionListByFunction = function (functionName, comparator) {
+SearchAliasGroup.prototype.getIntersectionListByFunction = function (functionName) {
   var bioEntities = this.getBioEntities();
   var result;
   if (typeof functionName === "function") {
diff --git a/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js b/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js
index 5d3aa3a65b..bfa7e4381f 100644
--- a/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js
+++ b/frontend-js/src/test/js/gui/leftPanel/GuiUtils-test.js
@@ -136,6 +136,25 @@ describe('GuiUtils', function () {
         alias: alias
       }).innerHTML.indexOf("Full name") === -1);
     });
+
+    it('onclick function', function () {
+      var map = helper.createCustomMap();
+      helper.createSearchDbOverlay(map);
+
+      var guiUtils = new GuiUtils();
+      guiUtils.setMap(map);
+      var alias = helper.createAlias(map);
+
+      alias.setFullName("xxx");
+      var htmlElement = guiUtils.createAliasElement({
+        alias: alias,
+        icon: "empty.png"
+      });
+
+      var img = $("img", htmlElement)[0];
+
+      return img.onclick();
+    });
   });
 
   describe('createLink', function () {
diff --git a/frontend-js/src/test/js/map/AbstractCustomMap-test.js b/frontend-js/src/test/js/map/AbstractCustomMap-test.js
index 4f2c4d282f..1b76576dc5 100644
--- a/frontend-js/src/test/js/map/AbstractCustomMap-test.js
+++ b/frontend-js/src/test/js/map/AbstractCustomMap-test.js
@@ -324,30 +324,42 @@ describe('AbstractCustomMap', function () {
     assert.ok(map.isDebug());
   });
 
-  it("fitBounds", function () {
-    var map = helper.createCustomMap();
-    var alias = helper.createAlias(map);
-    var ie = new IdentifiedElement(alias);
-    var marker = new AliasMarker({
-      map: map,
-      element: ie
-    });
-    var surface = new AliasSurface({
-      map: map,
-      alias: alias,
-      gmapObj: new google.maps.Rectangle({
-        map: map.getGoogleMap(),
-        bounds: new google.maps.LatLngBounds(new google.maps.LatLng(0, 0), new google.maps.LatLng(0.5, 1))
-      })
+  describe("fitBounds", function () {
+    it("surface", function () {
+      var map = helper.createCustomMap();
+      var alias = helper.createAlias(map);
+      var ie = new IdentifiedElement(alias);
+      var marker = new AliasMarker({
+        map: map,
+        element: ie
+      });
+      var surface = new AliasSurface({
+        map: map,
+        alias: alias,
+        gmapObj: new google.maps.Rectangle({
+          map: map.getGoogleMap(),
+          bounds: new google.maps.LatLngBounds(new google.maps.LatLng(0, 0), new google.maps.LatLng(0.5, 1))
+        })
+      });
+
+      var markers = [marker, surface];
+      return marker.init().then(function () {
+
+        var center = map.getGoogleMap().getCenter();
+        map.fitBounds(markers);
+        var center2 = map.getGoogleMap().getCenter();
+        assert.ok(center.lat() !== center2.lat() || center.lng() !== center2.lng());
+      });
     });
-
-    var markers = [marker, surface];
-    return marker.init().then(function () {
-
+    it("reaction", function () {
+      var map = helper.createCustomMap();
+      var reaction = helper.createReaction(map);
       var center = map.getGoogleMap().getCenter();
-      map.fitBounds(markers);
-      var center2 = map.getGoogleMap().getCenter();
-      assert.ok(center.lat() !== center2.lat() || center.lng() !== center2.lng());
+      return map.fitBounds([reaction]).then(function () {
+
+        var center2 = map.getGoogleMap().getCenter();
+        assert.ok(center.lat() !== center2.lat() || center.lng() !== center2.lng());
+      })
     });
   });
 
-- 
GitLab