From 51f662b749cc9e99eb94d282b30ef2df6a07fc03 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 26 Jun 2017 14:12:13 +0200
Subject: [PATCH] when creating two markers for the same element, second
 creation is update

---
 frontend-js/src/main/js/map/CustomMap.js      | 25 ++++++++-------
 .../src/main/js/map/marker/AbstractMarker.js  | 19 ++++++++++-
 .../src/main/js/map/marker/AliasMarker.js     |  7 ----
 frontend-js/src/test/js/google-map-mock.js    |  3 ++
 frontend-js/src/test/js/map/CustomMap-test.js | 32 +++++++++++++++----
 5 files changed, 60 insertions(+), 26 deletions(-)

diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index bab6b40568..8f61639fcf 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -726,10 +726,7 @@ CustomMap.prototype.renderOverlayCollection = function(overlayCollection, fitBou
       var icon = element.getIcon();
       if (icon !== null && icon !== undefined) {
         return self.createMarkerForDbOverlay(element, overlayCollection).then(function(marker) {
-          if (marker !== null) {
-            overlayCollection.markers[element.getType()][element.getId()] = marker;
-            markers.push(marker);
-          }
+          markers.push(marker);
         });
       } else {
         return self.createMapOverlayForDbOverlay(element, overlayCollection).then(function(mapOverlay) {
@@ -1227,27 +1224,31 @@ CustomMap.prototype.getVisibleDataOverlays = function() {
 CustomMap.prototype.createMarkerForDbOverlay = function(element, dbOverlay) {
   var self = this;
 
-  if (dbOverlay.markers[element.getType()][element.getId()] !== undefined) {
-    if (element.getType() === "ALIAS") {
-      logger.warn("More than one marker in " + dbOverlay.getName() + " for alias " + element.getId()
-          + ". Skipping duplicates.");
-    }
-    return Promise.resolve(null);
+  var result = dbOverlay.markers[element.getType()][element.getId()];
+  if (result !== undefined) {
+    result.updateIdentifiedElement(element);
+    dbOverlay.markers[element.getType()][element.getId()] = result;
+    return Promise.resolve(result);
   }
 
   var model = self.getSubmapById(element.getModelId());
   if (element.getType() === "ALIAS") {
     var marker = new AliasMarker(element, self);
     return marker.init().then(function() {
+      dbOverlay.markers[element.getType()][element.getId()] = marker;
       return marker;
     });
   } else if (element.getType() === "REACTION") {
     return model.getModel().getReactionById(element.getId()).then(function(reactionData) {
-      return new ReactionMarker(element.getId(), element.getIcon(), reactionData, model);
+      result = new ReactionMarker(element.getId(), element.getIcon(), reactionData, model);
+      dbOverlay.markers[element.getType()][element.getId()] = result;
+      return result;
     });
   } else if (element.getType() === "POINT") {
     var pointData = model.getModel().getPointDataByPoint(element.getPoint());
-    return Promise.resolve(new PointMarker(pointData, element.getIcon(), model));
+    var result = new PointMarker(pointData, element.getIcon(), model);
+    dbOverlay.markers[element.getType()][element.getId()] = result;
+    return Promise.resolve(result);
   } else {
     throw new Error("Unknown type of the element in overlay: " + element.type);
   }
diff --git a/frontend-js/src/main/js/map/marker/AbstractMarker.js b/frontend-js/src/main/js/map/marker/AbstractMarker.js
index 82b1fd7454..9abae7876b 100644
--- a/frontend-js/src/main/js/map/marker/AbstractMarker.js
+++ b/frontend-js/src/main/js/map/marker/AbstractMarker.js
@@ -29,7 +29,12 @@ AbstractMarker.prototype.getIcon = function() {
 };
 
 AbstractMarker.prototype.setIcon = function(icon) {
-  this._icon = icon;
+  var self = this;
+  self._icon = icon;
+  var googleMarker = self.getGoogleMarker();
+  if (googleMarker !== undefined) {
+    googleMarker.setIcon(GuiConnector.getImgPrefix() + self.getIcon());
+  }
 };
 
 /**
@@ -150,4 +155,16 @@ AbstractMarker.prototype.getType = function() {
   throw new Error("Not implemented");
 };
 
+AbstractMarker.prototype.getIdentifiedElement = function() {
+  return this._identifiedElement;
+};
+
+AbstractMarker.prototype.updateIdentifiedElement = function(identifiedElement) {
+  this.setIcon(identifiedElement.getIcon());
+};
+
+AbstractMarker.prototype.setIdentifiedElement = function(identifiedElement) {
+  this._identifiedElement = identifiedElement;
+};
+
 module.exports = AbstractMarker;
diff --git a/frontend-js/src/main/js/map/marker/AliasMarker.js b/frontend-js/src/main/js/map/marker/AliasMarker.js
index b06f3ae9b3..51c6200f66 100644
--- a/frontend-js/src/main/js/map/marker/AliasMarker.js
+++ b/frontend-js/src/main/js/map/marker/AliasMarker.js
@@ -84,12 +84,5 @@ AliasMarker.prototype.init = function() {
   });
 };
 
-AliasMarker.prototype.getIdentifiedElement = function() {
-  return this._identifiedElement;
-};
-
-AliasMarker.prototype.setIdentifiedElement = function(identifiedElement) {
-  this._identifiedElement = identifiedElement;
-};
 
 module.exports = AliasMarker;
diff --git a/frontend-js/src/test/js/google-map-mock.js b/frontend-js/src/test/js/google-map-mock.js
index 4c30bd8636..241ae6b789 100644
--- a/frontend-js/src/test/js/google-map-mock.js
+++ b/frontend-js/src/test/js/google-map-mock.js
@@ -141,6 +141,9 @@ var google = {
       this.setMap = function(map) {
         this.options.map = map;
       };
+      this.setIcon = function(icon) {
+        this.options.icon = icon;
+      };
     },
 
     MarkerImage : function() {
diff --git a/frontend-js/src/test/js/map/CustomMap-test.js b/frontend-js/src/test/js/map/CustomMap-test.js
index cb49a04241..4e119dc683 100644
--- a/frontend-js/src/test/js/map/CustomMap-test.js
+++ b/frontend-js/src/test/js/map/CustomMap-test.js
@@ -33,12 +33,6 @@ describe('CustomMap', function() {
     assert.ok(map);
   });
 
-  it("contructor", function() {
-    var options = helper.createCustomMapOptions();
-    var map = new CustomMap(options);
-    assert.ok(map);
-  });
-
   it("contructor with submaps", function() {
     var options = helper.createCustomMapOptions();
 
@@ -830,4 +824,30 @@ describe('CustomMap', function() {
     assert.equal(map.getSelectedArea(), null);
   });
 
+  describe("createMarkerForDbOverlay", function() {
+    it("update marker", function() {
+      var map;
+      var marker1, marker2;
+      var element = new IdentifiedElement({
+        id : 329159,
+        modelId : 15781,
+        type : "ALIAS"
+      });
+      var overlay;
+      return ServerConnector.getProject().then(function(project) {
+        var options = helper.createCustomMapOptions(project);
+        map = new CustomMap(options);
+        overlay = helper.createDbOverlay(map);
+        return map.createMarkerForDbOverlay(element, overlay);
+      }).then(function(result){
+        marker1 = result;
+        element.setIcon("another.png");
+        return map.createMarkerForDbOverlay(element, overlay);
+      }).then(function(result){
+        marker2 = result;
+        assert.equal(marker1, marker2);
+      });
+    });
+  });
+
 });
-- 
GitLab