From e59f4f7a6742d0ec4d28a71d45f2254f39d0b194 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 3 May 2018 15:21:17 +0200
Subject: [PATCH] AbstractCustomMap contains reference to ServerConnector

---
 frontend-js/src/main/js/ServerConnector.js    |  6 ++--
 .../main/js/gui/leftPanel/ChemicalPanel.js    |  2 +-
 .../src/main/js/gui/leftPanel/DrugPanel.js    |  3 +-
 .../src/main/js/map/AbstractCustomMap.js      | 25 +++++++++++++---
 frontend-js/src/main/js/map/CustomMap.js      | 21 +++++++-------
 .../src/main/js/map/CustomMapOptions.js       | 29 +++++++++++++++++++
 frontend-js/src/main/js/map/Submap.js         |  3 +-
 frontend-js/src/main/js/minerva.js            |  1 +
 .../src/test/js/gui/OverviewDialog-test.js    |  6 ++--
 frontend-js/src/test/js/helper.js             | 24 +++++++--------
 frontend-js/src/test/js/map/CustomMap-test.js |  7 +++--
 frontend-js/src/test/js/minerva-test.js       |  2 +-
 frontend-js/src/test/js/mocha-config.js       |  1 +
 13 files changed, 90 insertions(+), 40 deletions(-)

diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 68da060293..82c4d0d0d8 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -1403,10 +1403,10 @@ ServerConnector.getSessionData = function (project) {
  * @param {number} params.modelId
  * @param {number} [params.projectId]
  * @param {Point} params.coordinates
- * @param {number} params.count
- * @param {string} params.type
+ * @param {number} [params.count]
+ * @param {string} [params.type]
  *
- * @returns {PromiseLike<BioEntity[]>}
+ * @returns {PromiseLike<IdentifiedElement[]>}
  */
 ServerConnector.getClosestElementsByCoordinates = function (params) {
   var self = this;
diff --git a/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js b/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js
index daff6715ab..579599f37b 100644
--- a/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/ChemicalPanel.js
@@ -28,7 +28,7 @@ function ChemicalPanel(params) {
       "Choose an appropriate MeSH code and provide it in the via the Admin section of this MINERVA platform. " +
       "See User Manual for more details ");
   } else {
-    this.getControlElement(PanelControlElementType.SEARCH_LABEL).innerHTML = "SEARCH FOR TARGETS OF:";
+    self.getControlElement(PanelControlElementType.SEARCH_LABEL).innerHTML = "SEARCH FOR TARGETS OF:";
   }
 }
 
diff --git a/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js b/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js
index f41ef4b34f..ee96cfe765 100644
--- a/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/DrugPanel.js
@@ -22,7 +22,8 @@ function DrugPanel(params) {
   params.placeholder = "drug, synonym, brand name";
 
   AbstractDbPanel.call(this, params);
-  this.getControlElement(PanelControlElementType.SEARCH_LABEL).innerHTML = "SEARCH FOR TARGETS OF:";
+  var self = this;
+  self.getControlElement(PanelControlElementType.SEARCH_LABEL).innerHTML = "SEARCH FOR TARGETS OF:";
 }
 
 DrugPanel.prototype = Object.create(AbstractDbPanel.prototype);
diff --git a/frontend-js/src/main/js/map/AbstractCustomMap.js b/frontend-js/src/main/js/map/AbstractCustomMap.js
index 1e9b6aeb68..c9d547fbb0 100644
--- a/frontend-js/src/main/js/map/AbstractCustomMap.js
+++ b/frontend-js/src/main/js/map/AbstractCustomMap.js
@@ -45,6 +45,7 @@ function AbstractCustomMap(model, options) {
   this.setElement(options.getElement());
   this.setConfiguration(options.getConfiguration());
   this.setProject(options.getProject());
+  this.setServerConnector(options.getServerConnector());
 
   this.setModel(model);
 
@@ -92,7 +93,7 @@ AbstractCustomMap.prototype.getMarkerSurfaceCollection = function () {
 AbstractCustomMap.prototype.createMapOptions = function () {
   var self = this;
   var model = self.getModel();
-  var zoom = ServerConnector.getSessionData(self.getProject()).getZoomLevel(model);
+  var zoom = self.getServerConnector().getSessionData(self.getProject()).getZoomLevel(model);
   if (zoom === undefined) {
     zoom = model.getDefaultZoomLevel();
   }
@@ -100,7 +101,7 @@ AbstractCustomMap.prototype.createMapOptions = function () {
     zoom = self.getMinZoom();
   }
 
-  var point = ServerConnector.getSessionData(self.getProject()).getCenter(model);
+  var point = self.getServerConnector().getSessionData(self.getProject()).getCenter(model);
   if (point === undefined) {
     var x = model.getDefaultCenterX();
     var y = model.getDefaultCenterY();
@@ -238,7 +239,7 @@ AbstractCustomMap.prototype.registerMapClickEvents = function () {
  */
 function activateMolStarLink(coordinates, map) {
 
-  return ServerConnector.getClosestElementsByCoordinates({
+  return map.getServerConnector().getClosestElementsByCoordinates({
     modelId: map.getId(),
     coordinates: coordinates,
     count: 1
@@ -641,7 +642,7 @@ AbstractCustomMap.prototype.setConfiguration = function (configuration) {
 
 AbstractCustomMap.prototype._createMapChangedCallbacks = function () {
   var self = this;
-  var sessionData = ServerConnector.getSessionData(self.getTopMap().getProject());
+  var sessionData = self.getServerConnector().getSessionData(self.getTopMap().getProject());
   // listener for changing zoom level
   this.getMapCanvas().addListener('zoom_changed', function () {
     sessionData.setZoomLevel(self.getModel(), self.getZoom());
@@ -968,6 +969,22 @@ AbstractCustomMap.prototype.getProject = function () {
   return this._project;
 };
 
+/**
+ *
+ * @param {ServerConnector} serverConnector
+ */
+AbstractCustomMap.prototype.setServerConnector = function (serverConnector) {
+  this._serverConnector = serverConnector;
+};
+
+/**
+ *
+ * @returns {ServerConnector}
+ */
+AbstractCustomMap.prototype.getServerConnector = function () {
+  return this._serverConnector;
+};
+
 AbstractCustomMap.prototype.destroy = function () {
   $(this.getElement()).off("touchstart");
 };
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 2d6db63d2b..f2989dc1a5 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -85,7 +85,7 @@ CustomMap.prototype.constructor = CustomMap;
  */
 CustomMap.prototype.init = function () {
   var self = this;
-  var sessionData = ServerConnector.getSessionData(self.getProject());
+  var sessionData = self.getServerConnector().getSessionData(self.getProject());
 
   // if we have background overlay stored in the session then restore it
   var mapType = sessionData.getSelectedBackgroundOverlay();
@@ -107,7 +107,7 @@ CustomMap.prototype.init = function () {
       }
     }
   }).then(function () {
-    return ServerConnector.getLogoImg();
+    return self.getServerConnector().getLogoImg();
   }).then(function (url) {
     var logo2 = self.getControl(ControlType.LOGO_2_IMG);
     if (!/^(f|ht)tps?:\/\//i.test(url)) {
@@ -131,13 +131,14 @@ CustomMap.prototype.createSubmaps = function () {
  * Creates logo and put it on the google map.
  */
 CustomMap.prototype.createLogo = function () {
+  var self = this;
   var logoControlDiv2 = Functions.createElement({type: "div", index: 0});
   var logo2 = Functions.createElement({
     type: 'IMG',
     style: "cursor: pointer; width: 80px",
     id: ControlType.LOGO_2_IMG,
     onclick: function () {
-      return ServerConnector.getLogoLink().then(function (url) {
+      return self.getServerConnector().getLogoLink().then(function (url) {
         var win = window.open(url, '_blank');
         win.focus();
       }).catch(GuiConnector.alert);
@@ -226,7 +227,7 @@ CustomMap.prototype.openDataOverlay = function (param) {
             for (var i = 0; i < visibleDataOverlays.length; i++) {
               ids.push(visibleDataOverlays[i].getId());
             }
-            ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(ids);
+            self.getServerConnector().getSessionData(self.getProject()).setVisibleOverlays(ids);
             return self.redrawSelectedDataOverlays();
           }).then(function () {
             var backgroundToOpen;
@@ -341,7 +342,7 @@ CustomMap.prototype.refreshComments = function () {
 
   var commentDbOverlay = self.getOverlayByName("comment");
   if (commentDbOverlay !== undefined) {
-    if (ServerConnector.getSessionData(self.getProject()).getShowComments()) {
+    if (self.getServerConnector().getSessionData(self.getProject()).getShowComments()) {
       return commentDbOverlay.refresh();
     } else {
       return commentDbOverlay.clear();
@@ -484,7 +485,7 @@ CustomMap.prototype.customizeGoogleMapView = function (div) {
   var x = self.getModel().getDefaultCenterX();
   var y = self.getModel().getDefaultCenterY();
   var zoom = self.getModel().getDefaultZoomLevel();
-  if (ServerConnector.getSessionData(self.getProject()).getCenter(self.getModel()) === undefined &&
+  if (self.getServerConnector().getSessionData(self.getProject()).getCenter(self.getModel()) === undefined &&
     (x === undefined || y === undefined || zoom === undefined ||
       x === null || y === null || zoom === null
     )) {
@@ -503,7 +504,7 @@ CustomMap.prototype.customizeGoogleMapView = function (div) {
 CustomMap.prototype.createMapChangedCallbacks = function () {
   this._createMapChangedCallbacks();
   var self = this;
-  var sessionData = ServerConnector.getSessionData(self.getProject());
+  var sessionData = self.getServerConnector().getSessionData(self.getProject());
 
   // listener for changing type of background overlay
   // noinspection SpellCheckingInspection
@@ -570,7 +571,7 @@ CustomMap.prototype.hideDataOverlay = function (identifier) {
       for (var i = 0; i < visibleDataOverlays.length; i++) {
         ids.push(visibleDataOverlays[i].getId());
       }
-      ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(ids);
+      self.getServerConnector().getSessionData(self.getProject()).setVisibleOverlays(ids);
       return self.redrawSelectedDataOverlays();
     }).then(function () {
       return self.getProject().getDataOverlayById(identifier);
@@ -1018,7 +1019,7 @@ CustomMap.prototype.getReferenceGenome = function (type, version) {
     self._referenceGenome[type] = [];
   }
   if (self._referenceGenome[type][version] === undefined) {
-    return ServerConnector.getReferenceGenome({
+    return self.getServerConnector().getReferenceGenome({
       type: type,
       version: version,
       organism: self.getProject().getOrganism().getResource()
@@ -1119,7 +1120,7 @@ CustomMap.prototype.getSelectionContextMenu = function () {
  */
 CustomMap.prototype.openCommentDialog = function () {
   var self = this;
-  return ServerConnector.getClosestElementsByCoordinates({
+  return self.getServerConnector().getClosestElementsByCoordinates({
     modelId: this.getActiveSubmapId(),
     coordinates: this.getActiveSubmapClickCoordinates()
   }).then(function (elements) {
diff --git a/frontend-js/src/main/js/map/CustomMapOptions.js b/frontend-js/src/main/js/map/CustomMapOptions.js
index 0c57bb21a4..e992f2a2e7 100644
--- a/frontend-js/src/main/js/map/CustomMapOptions.js
+++ b/frontend-js/src/main/js/map/CustomMapOptions.js
@@ -5,6 +5,18 @@ var logger = require('./../logger');
 /**
  * Object representing information needed for constructing {@link CustomMap}
  * objects.
+ *
+ * @param {Object|CustomMapOptions} params
+ * @param {HTMLElement} params.element
+ * @param {Configuration} params.configuration
+ * @param {Project} [params.project]
+ * @param {string} params.projectId
+ * @param {ServerConnector} params.serverConnector
+ * @param {boolean} [params.bigLogo]
+ * @param {boolean} [params.debug]
+ * @param {Object} [params.plugins]
+ *
+ * @constructor
  */
 function CustomMapOptions(params) {
   if (params.element === undefined) {
@@ -14,6 +26,7 @@ function CustomMapOptions(params) {
   this.setConfiguration(params.configuration);
   this.setProject(params.project);
   this.setProjectId(params.projectId);
+  this.setServerConnector(params.serverConnector);
 
   if (params.bigLogo !== undefined) {
     if (typeof params.bigLogo === "boolean") {
@@ -55,6 +68,22 @@ CustomMapOptions.prototype.setProject = function (project) {
   this._project = project;
 };
 
+/**
+ *
+ * @returns {ServerConnector}
+ */
+CustomMapOptions.prototype.getServerConnector = function () {
+  return this._serverConnector;
+};
+
+/**
+ *
+ * @param {ServerConnector} serverConnector
+ */
+CustomMapOptions.prototype.setServerConnector = function (serverConnector) {
+  this._serverConnector = serverConnector;
+};
+
 CustomMapOptions.prototype.getPlugins = function () {
   return this._plugins;
 };
diff --git a/frontend-js/src/main/js/map/Submap.js b/frontend-js/src/main/js/map/Submap.js
index fec5c2b175..13ec12a02c 100644
--- a/frontend-js/src/main/js/map/Submap.js
+++ b/frontend-js/src/main/js/map/Submap.js
@@ -25,7 +25,8 @@ function Submap(customMap, model) {
     element: customMap.getElement(),
     bigLogo: customMap.isBigLogo(),
     project: null,
-    debug: customMap.isDebug()
+    debug: customMap.isDebug(),
+    serverConnector: customMap.getServerConnector()
   }));
 
   this.initialized = false;
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 57afada15a..5ea1711372 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -240,6 +240,7 @@ function create(params) {
   if (!(params instanceof CustomMapOptions)) {
     params = new CustomMapOptions(params);
   }
+  params.setServerConnector(ServerConnector);
   initGlobals(params);
   params.getElement().style.display = "table";
   params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
diff --git a/frontend-js/src/test/js/gui/OverviewDialog-test.js b/frontend-js/src/test/js/gui/OverviewDialog-test.js
index bde482dc83..8b4480f8e6 100644
--- a/frontend-js/src/test/js/gui/OverviewDialog-test.js
+++ b/frontend-js/src/test/js/gui/OverviewDialog-test.js
@@ -15,8 +15,7 @@ describe('OverviewDialog', function () {
   it('open image', function () {
     helper.setUrl("http://test/?id=complex_model_with_images");
     return ServerConnector.getProject().then(function (project) {
-      var options = helper.createOptions(project);
-      var map = new CustomMap(options);
+      var map = helper.createCustomMap(project);
 
       var dialog = new OverviewDialog({
         element: testDiv,
@@ -31,8 +30,7 @@ describe('OverviewDialog', function () {
   it('open invalid image', function () {
     helper.setUrl("http://test/?id=complex_model_with_images");
     return ServerConnector.getProject().then(function (project) {
-      var options = helper.createOptions(project);
-      var map = new CustomMap(options);
+      var map = helper.createCustomMap(project);
 
       var dialog = new OverviewDialog({
         element: testDiv,
diff --git a/frontend-js/src/test/js/helper.js b/frontend-js/src/test/js/helper.js
index 8ce42ecdcf..bb88684237 100644
--- a/frontend-js/src/test/js/helper.js
+++ b/frontend-js/src/test/js/helper.js
@@ -328,18 +328,10 @@ Helper.prototype.createReaction = function (map, complete) {
   return result;
 };
 
-Helper.prototype.createOptions = function (project) {
-  if (project === undefined) {
-    project = this.createProject();
-  }
-
-  return {
-    mapDiv: testDiv,
-    element: testDiv,
-    project: project
-  };
-};
-
+/**
+ *
+ * @returns {MapModel}
+ */
 Helper.prototype.createModel = function () {
   var result = new Model();
   result.setId(this.idCounter++);
@@ -369,6 +361,11 @@ Helper.prototype.createOverlay = function (model) {
   });
 };
 
+/**
+ *
+ * @param {Project} [project]
+ * @returns {CustomMapOptions}
+ */
 Helper.prototype.createCustomMapOptions = function (project) {
   if (project === undefined) {
     project = this.createProject();
@@ -378,7 +375,8 @@ Helper.prototype.createCustomMapOptions = function (project) {
     project: project,
     element: testDiv,
     mapDiv: testDiv,
-    configuration: this.getConfiguration()
+    configuration: this.getConfiguration(),
+    serverConnector: ServerConnector
   });
 
 };
diff --git a/frontend-js/src/test/js/map/CustomMap-test.js b/frontend-js/src/test/js/map/CustomMap-test.js
index f5600552d5..231b15f5b1 100644
--- a/frontend-js/src/test/js/map/CustomMap-test.js
+++ b/frontend-js/src/test/js/map/CustomMap-test.js
@@ -199,7 +199,8 @@ describe('CustomMap', function () {
         assert.ok(map.selectedLayoutOverlays[layout.getId()][1] instanceof ReactionSurface);
 
         // now hide the layout
-        map._hideSelectedLayout(layout.getId());
+        return map._hideSelectedLayout(layout.getId());
+      }).then(function () {
         assert.ok(map.selectedLayoutOverlays[layout.getId()]);
         assert.equal(0, map.selectedLayoutOverlays[layout.getId()].length);
       });
@@ -233,7 +234,9 @@ describe('CustomMap', function () {
           assert.equal(0, emptySubmap.selectedLayoutOverlays[overlayId].length);
 
           // now hide the layout
-          customMap.hideSelectedLayout(overlayId);
+
+          return customMap.hideSelectedLayout(overlayId);
+        }).then(function () {
           assert.equal(0, customMap.selectedLayoutOverlays[overlayId].length);
           assert.equal(0, filledSubmap.selectedLayoutOverlays[overlayId].length);
           assert.equal(0, emptySubmap.selectedLayoutOverlays[overlayId].length);
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index 1c33cb48be..48bdb5c1e3 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -51,7 +51,7 @@ describe('minerva global', function () {
       helper.setUrl("http://test/?id=complex_model_with_images");
       var customMap;
       return ServerConnectorMock.getProject().then(function (project) {
-        var options = helper.createOptions(project);
+        var options = helper.createCustomMapOptions(project);
 
         return minerva.create(options);
       }).then(function (result) {
diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js
index 27d5e2275c..c1b8448957 100644
--- a/frontend-js/src/test/js/mocha-config.js
+++ b/frontend-js/src/test/js/mocha-config.js
@@ -210,6 +210,7 @@ beforeEach(function () {
   ServerConnector.getSessionData(null).setLogin("anonymous");
 
 
+  // @type HTMLElement
   global.testDiv = document.createElement("div");
   global.testDiv.id = "test";
   document.body.appendChild(testDiv);
-- 
GitLab