From eea632d932f80d6c0ce1d836d59f778a5c80531a Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 16 Oct 2019 14:49:51 +0200
Subject: [PATCH] when opening map without data overlay there was unhandled
 error

---
 CHANGELOG                                           |  2 +-
 .../src/main/js/gui/leftPanel/OverlayPanel.js       |  4 ++++
 frontend-js/src/main/js/map/CustomMap.js            |  9 ++++++---
 frontend-js/src/test/js/map/CustomMap-test.js       | 13 +++++++++++++
 4 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 80dc264e44..76fa5f2ebe 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -11,7 +11,7 @@ minerva (14.0.3) stable; urgency=medium
   * Bug fix: refresh button in overlay panel synchronise list of general and
     user provided data overlays (#975)
   * Bug fix: changing order of data overlays is reflected in info window
-
+  * Bug fix: opening map with no available background crashed (#964)
 
  -- Piotr Gawron <piotr.gawron@uni.lu>  Wed, 16 Oct 2019 9:00:00 +0200
 
diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
index fa82f9ca39..caa9c9529e 100644
--- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
+++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js
@@ -8,6 +8,7 @@ require('datatables.net-rowreorder')();
 var AddOverlayDialog = require('../AddOverlayDialog');
 var Panel = require('../Panel');
 var PanelControlElementType = require('../PanelControlElementType');
+var ValidationError  = require('../../ValidationError');
 
 var GuiConnector = require('../../GuiConnector');
 // noinspection JSUnusedLocalSymbols
@@ -473,6 +474,9 @@ OverlayPanel.prototype.refresh = function (showDefault) {
     self.getProject().addOrUpdateDataOverlays(overlaysFromServer);
 
     if (!showDefault) {
+      if (overlaysFromServer.length === 0) {
+        return Promise.reject(new ValidationError("Project doesn't have a background defined. Please re-upload map in admin panel."));
+      }
       var id = self.getMap().getBackgroundDataOverlay().getId();
       selectedOverlay[id] = true;
     }
diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 2ccfb1bca4..e185ff683a 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -19,6 +19,7 @@ var Reaction = require('./data/Reaction');
 var ReferenceGenome = require('./data/ReferenceGenome');
 var SecurityError = require('../SecurityError');
 var Submap = require('./Submap');
+var ValidationError = require('../ValidationError');
 
 var Bounds = require('./canvas/Bounds');
 var Point = require('./canvas/Point');
@@ -93,7 +94,7 @@ CustomMap.prototype.init = function () {
   var mapType = sessionData.getSelectedBackgroundOverlay();
   // if we have user data overlays stored in the session then restore it
   var ids = sessionData.getVisibleOverlays();
-  if (mapType !== undefined) {
+  if (mapType !== undefined && !isNaN(mapType)) {
     ids.push(mapType);
   }
 
@@ -107,7 +108,7 @@ CustomMap.prototype.init = function () {
     (x === undefined || y === undefined || zoom === undefined ||
       x === null || y === null || zoom === null
     )) {
-    autoFit= true;
+    autoFit = true;
   }
 
   return Promise.all([self.getMapCanvas().triggerListeners('resize'),
@@ -124,11 +125,13 @@ CustomMap.prototype.init = function () {
       self.getMapCanvas().fitBounds(bounds);
     }
 
-
     return Promise.each(ids, function (overlayId) {
       return self.openDataOverlay(overlayId).catch(function (e) {
         if (e instanceof SecurityError) {
           logger.debug(e.message);
+          if (self.getProject().getDataOverlays().length === 0) {
+            return Promise.reject(new ValidationError("Project doesn't have a background defined. Please re-upload map in admin panel."));
+          }
           sessionData.setSelectedBackgroundOverlay(self.getProject().getDataOverlays()[0].getId());
         } else {
           return Promise.reject(e);
diff --git a/frontend-js/src/test/js/map/CustomMap-test.js b/frontend-js/src/test/js/map/CustomMap-test.js
index 966b31a50b..b070ff6124 100644
--- a/frontend-js/src/test/js/map/CustomMap-test.js
+++ b/frontend-js/src/test/js/map/CustomMap-test.js
@@ -19,6 +19,7 @@ var ReactionMarker = require('../../../main/js/map/marker/ReactionMarker');
 var ReactionSurface = require('../../../main/js/map/surface/ReactionSurface');
 
 var ServerConnector = require('./../ServerConnector-mock');
+var ValidationError = require('../../../main/js/ValidationError');
 
 var logger = require('./../logger');
 
@@ -978,6 +979,18 @@ describe('CustomMap', function () {
       })
     });
 
+    it("project without overlay", function () {
+      var options = helper.createCustomMapOptions();
+      options.getProject().removeDataOverlay(options.getProject().getDataOverlays()[0]);
+      ServerConnector.getSessionData(options.getProject()).setVisibleOverlays([-1]);
+      var map = new CustomMap(options);
+      return map.init().then(function () {
+        assert.fail();
+      }).catch(function(e){
+        assert.ok(e instanceof ValidationError);
+      });
+    });
+
     it("with session data overlays", function () {
       var project = helper.createProject();
       var overlay1 = helper.createOverlay();
-- 
GitLab