From 8c5e77d01b671eda2d8f29fb58b04a75b76419e9 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 27 Apr 2018 15:15:50 +0200
Subject: [PATCH] frontend uses information from model when deciding which
 canvas implementation to use

---
 .../src/main/js/map/AbstractCustomMap.js      | 21 +++++++++++++++++++
 frontend-js/src/main/js/map/CustomMap.js      | 11 +++++-----
 frontend-js/src/main/js/map/Submap.js         |  4 +---
 frontend-js/src/main/js/map/data/Project.js   |  2 +-
 frontend-js/src/test/js/helper.js             | 21 +++++++++++++++----
 .../GoogleMaps/GoogleMapsApiCanvas-test.js    |  6 ++++--
 6 files changed, 49 insertions(+), 16 deletions(-)

diff --git a/frontend-js/src/main/js/map/AbstractCustomMap.js b/frontend-js/src/main/js/map/AbstractCustomMap.js
index c90cd3d6b8..cdbbcd533d 100644
--- a/frontend-js/src/main/js/map/AbstractCustomMap.js
+++ b/frontend-js/src/main/js/map/AbstractCustomMap.js
@@ -21,6 +21,8 @@ var ReactionSurface = require('./surface/ReactionSurface');
 var MarkerSurfaceCollection = require('./marker/MarkerSurfaceCollection');
 
 var MapCanvas = require('./canvas/MapCanvas');
+var GoogleMapsApiCanvas = require('./canvas/GoogleMaps/GoogleMapsApiCanvas');
+var OpenLayerCanvas = require('./canvas/OpenLayers/OpenLayerCanvas');
 
 /**
  * Default constructor.
@@ -902,6 +904,11 @@ AbstractCustomMap.prototype.fitBounds = function (markers) {
 AbstractCustomMap.prototype.setProject = function (project) {
   this._project = project;
 };
+
+/**
+ *
+ * @returns {Project}
+ */
 AbstractCustomMap.prototype.getProject = function () {
   return this._project;
 };
@@ -926,5 +933,19 @@ AbstractCustomMap.prototype.triggerEvent = function (type, data) {
   }
 };
 
+AbstractCustomMap.prototype.createMapCanvas = function (div) {
+  var self = this;
+
+  var mapCanvasType = self.getProject().getMapCanvasType();
+  if (mapCanvasType === "GOOGLE_MAPS_API") {
+    self.setMapCanvas(new GoogleMapsApiCanvas(div, self.createMapOptions()));
+  } else if (mapCanvasType === "OPEN_LAYERS") {
+    self.setMapCanvas(new OpenLayerCanvas(div, self.createMapOptions()));
+  } else {
+    throw new Error("Unknown mapCanvasType: " + mapCanvasType);
+  }
+  self.registerMapClickEvents();
+};
+
 
 module.exports = AbstractCustomMap;
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 408becc5a1..3c144e71c9 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -19,8 +19,6 @@ var ReferenceGenome = require('./data/ReferenceGenome');
 var SecurityError = require('../SecurityError');
 var Submap = require('./Submap');
 
-var GoogleMapsApiCanvas = require('./canvas/GoogleMaps/GoogleMapsApiCanvas');
-var OpenLayerCanvas = require('./canvas/OpenLayers/OpenLayerCanvas');
 var Bounds = require('./canvas/Bounds');
 var Point = require('./canvas/Point');
 
@@ -456,10 +454,7 @@ CustomMap.prototype.openSubmap = function (id) {
 CustomMap.prototype.customizeGoogleMapView = function (div) {
   var self = this;
 
-  self.setMapCanvas(new OpenLayerCanvas(div, self.createMapOptions()));
-  // self.setMapCanvas(new GoogleMapsApiCanvas(div, self.createMapOptions()));
-
-  self.registerMapClickEvents();
+  self.createMapCanvas(div);
 
   self.createLogo();
 
@@ -976,6 +971,10 @@ CustomMap.prototype.getInfoWindowForIdentifiedElement = function (identifiedElem
   return infoWindow;
 };
 
+/**
+ *
+ * @returns {null|number}
+ */
 CustomMap.prototype.getActiveSubmapId = function () {
   return this._activeSubmapId;
 };
diff --git a/frontend-js/src/main/js/map/Submap.js b/frontend-js/src/main/js/map/Submap.js
index 561af0afdd..8a7e7e5d86 100644
--- a/frontend-js/src/main/js/map/Submap.js
+++ b/frontend-js/src/main/js/map/Submap.js
@@ -77,14 +77,12 @@ Submap.prototype.open = function (htmlTag) {
 
     $(self.getElement()).dialog("open");
 
-    self.setMapCanvas(new GoogleMapsApiCanvas(mapDiv, self.createMapOptions()));
+    self.createMapCanvas(mapDiv);
 
     self._createMapChangedCallbacks();
 
     self.getMapCanvas().triggerListeners('resize');
 
-    self.registerMapClickEvents();
-
     self.initialized = true;
   } else {
     $(self.getElement()).dialog("open");
diff --git a/frontend-js/src/main/js/map/data/Project.js b/frontend-js/src/main/js/map/data/Project.js
index 43dbd5051a..9c5748edd7 100644
--- a/frontend-js/src/main/js/map/data/Project.js
+++ b/frontend-js/src/main/js/map/data/Project.js
@@ -15,7 +15,7 @@ var logger = require('../../logger');
 
 /**
  *
- * @param {Project|string} data
+ * @param {Project|string} [data]
  * @constructor
  */
 function Project(data) {
diff --git a/frontend-js/src/test/js/helper.js b/frontend-js/src/test/js/helper.js
index 04e9c7480d..f2a49e295f 100644
--- a/frontend-js/src/test/js/helper.js
+++ b/frontend-js/src/test/js/helper.js
@@ -152,13 +152,26 @@ Helper.prototype.createComment = function (element) {
   });
 };
 
-Helper.prototype.createProject = function () {
+/**
+ *
+ * @param {Object} [params]
+ * @param {string} [params.mapCanvasType=OPEN_LAYERS]
+ * @returns {Project}
+ */
+Helper.prototype.createProject = function (params) {
+  if (params === undefined) {
+    params = {};
+  }
+  if (params.mapCanvasType === undefined) {
+    params.mapCanvasType = "OPEN_LAYERS";
+  }
   var result = new Project();
   result.setProjectId("testId");
   result.setId(this.idCounter++);
   result.addModel(this.createModel());
-  var overlay = this.createOverlay(result);
-  result.addDataOverlay(overlay);
+  var overlay = this.createOverlay(result.getModels()[0]);
+  result.addDataOverlay(overlay, false);
+  result.setMapCanvasType(params.mapCanvasType);
   return result;
 };
 
@@ -330,7 +343,7 @@ Helper.prototype.createModel = function () {
 
 /**
  *
- * @param {Model} [model]
+ * @param {MapModel} [model]
  * @returns {DataOverlay}
  */
 Helper.prototype.createOverlay = function (model) {
diff --git a/frontend-js/src/test/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas-test.js b/frontend-js/src/test/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas-test.js
index c245f6e71d..c124fc6299 100644
--- a/frontend-js/src/test/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas-test.js
+++ b/frontend-js/src/test/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas-test.js
@@ -93,7 +93,8 @@ describe('GoogleMapsApiCanvas', function () {
   });
 
   it("create polygon through drawingManager", function () {
-    var map = helper.createCustomMap();
+    var project = helper.createProject({mapCanvasType: "GOOGLE_MAPS_API"});
+    var map = helper.createCustomMap(project);
     var canvas = map.getMapCanvas();
 
     map.setSelectionContextMenu(new SelectionContextMenu({
@@ -188,7 +189,8 @@ describe('GoogleMapsApiCanvas', function () {
   });
 
   it("removeSelection", function () {
-    var map = helper.createCustomMap();
+    var project = helper.createProject({mapCanvasType: "GOOGLE_MAPS_API"});
+    var map = helper.createCustomMap(project);
     map.setActiveSubmapId(map.getId());
     map.getMapCanvas().setSelectedArea(new google.maps.Rectangle({}));
 
-- 
GitLab