From a8392823dbb5353accdb3df20bed0126afd9701e Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 30 Aug 2018 16:11:59 +0200
Subject: [PATCH] when uploading project with semantic zooming there is
 possibility to include/exclude zoom-specific layouts

---
 .../src/main/js/gui/admin/AddProjectDialog.js    | 15 +++++++++++++++
 .../src/main/js/map/data/UserPreferences.js      |  4 +++-
 .../model/user/UserAnnotationSchema.java         |  9 +++++++++
 ...30__add_user_preferences_semantic_zooming.sql |  2 ++
 .../mapviewer/api/projects/ProjectRestImpl.java  |  1 +
 .../lcsb/mapviewer/api/users/UserRestImpl.java   |  3 +++
 .../mapviewer/services/impl/ProjectService.java  |  4 ++--
 .../services/utils/CreateProjectParams.java      | 16 +++++++++++++++-
 8 files changed, 50 insertions(+), 4 deletions(-)
 create mode 100644 persist/src/main/resources/db/migration/12.1.0~alpha.1/V12.1.0.20180830__add_user_preferences_semantic_zooming.sql

diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
index c3c79221e1..85621deee6 100644
--- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
@@ -291,6 +291,11 @@ AddProjectDialog.prototype.createGeneralTabContent = function () {
     defaultValue: false,
     inputName: "project-semantic-zooming"
   }));
+  table.appendChild(self.createCheckboxRow({
+    labelName: "Semantic zooming contains multiple overlays:",
+    defaultValue: false,
+    inputName: "project-semantic-zooming-contains-multiple-overlays"
+  }));
 
   var saveProjectButton = Functions.createElement({
     type: "button",
@@ -705,6 +710,7 @@ AddProjectDialog.prototype.init = function () {
     self.bindProjectUploadPreferences(user, "validateMiriam", "project-verify-annotations");
     self.bindProjectUploadPreferences(user, "cacheData", "project-cache-data");
     self.bindProjectUploadPreferences(user, "semanticZooming", "project-semantic-zooming");
+    self.bindProjectUploadPreferences(user, "semanticZoomingContainsMultipleOverlays", "project-semantic-zooming-contains-multiple-overlays");
     self.bindProjectUploadPreferences(user, "sbgn", "project-sbgn-visualization");
   });
 };
@@ -1074,6 +1080,14 @@ AddProjectDialog.prototype.isSemanticZooming = function () {
   return $("[name='project-semantic-zooming']", this.getElement()).is(':checked');
 };
 
+/**
+ *
+ * @returns {boolean}
+ */
+AddProjectDialog.prototype.isSemanticZoomingContainsMultipleOverlays = function () {
+  return $("[name='project-semantic-zooming-contains-multiple-overlays']", this.getElement()).is(':checked');
+};
+
 /**
  *
  * @param {string} filename
@@ -1145,6 +1159,7 @@ AddProjectDialog.prototype.onSaveClicked = function () {
       "mapCanvasType": self.getMapCanvasTypeId(),
       "sbgn": self.isSbgn(),
       "semantic-zoom": self.isSemanticZooming(),
+      "semantic-zoom-contains-multiple-layouts": self.isSemanticZoomingContainsMultipleOverlays(),
       "annotate": self.isAnnotateAutomatically(),
       "verify-annotations": self.isVerifyAnnotations(),
       "zip-entries": self.getZipEntries()
diff --git a/frontend-js/src/main/js/map/data/UserPreferences.js b/frontend-js/src/main/js/map/data/UserPreferences.js
index 634c42897d..fba86c1bec 100644
--- a/frontend-js/src/main/js/map/data/UserPreferences.js
+++ b/frontend-js/src/main/js/map/data/UserPreferences.js
@@ -66,6 +66,7 @@ UserPreferences.prototype.setProjectUpload = function (projectUpload) {
     annotateModel: projectUpload["annotate-model"],
     cacheData: projectUpload["cache-data"],
     semanticZooming: projectUpload["semantic-zooming"],
+    semanticZoomingContainsMultipleOverlays: projectUpload["semantic-zooming-contains-multiple-overlays"],
     sbgn: projectUpload["sbgn"]
   };
 };
@@ -182,7 +183,8 @@ UserPreferences.prototype.toExport = function () {
       "annotate-model": this._projectUpload.annotateModel,
       "cache-data": this._projectUpload.cacheData,
       "sbgn": this._projectUpload.sbgn,
-      "semantic-zooming": this._projectUpload.semanticZooming
+      "semantic-zooming": this._projectUpload.semanticZooming,
+      "semantic-zooming-contains-multiple-overlays":this._projectUpload.semanticZoomingContainsMultipleOverlays
     },
     "element-annotators": this._elementAnnotators,
     "element-valid-annotations": this._elementValidAnnotations,
diff --git a/model/src/main/java/lcsb/mapviewer/model/user/UserAnnotationSchema.java b/model/src/main/java/lcsb/mapviewer/model/user/UserAnnotationSchema.java
index 79ae0db71f..afe8badee0 100644
--- a/model/src/main/java/lcsb/mapviewer/model/user/UserAnnotationSchema.java
+++ b/model/src/main/java/lcsb/mapviewer/model/user/UserAnnotationSchema.java
@@ -74,6 +74,7 @@ public class UserAnnotationSchema implements Serializable {
   private Boolean autoResizeMap = true;
 
   private Boolean semanticZooming = false;
+  private Boolean semanticZoomContainsMultipleOverlays = false;
 
   /**
    * Should map be visualized as sbgn?
@@ -528,4 +529,12 @@ public class UserAnnotationSchema implements Serializable {
     option.setValue(value);
   }
 
+  public Boolean getSemanticZoomContainsMultipleOverlays() {
+    return semanticZoomContainsMultipleOverlays;
+  }
+
+  public void setSemanticZoomContainsMultipleOverlays(Boolean semanticZoomContainsMultipleOverlays) {
+    this.semanticZoomContainsMultipleOverlays = semanticZoomContainsMultipleOverlays;
+  }
+
 }
diff --git a/persist/src/main/resources/db/migration/12.1.0~alpha.1/V12.1.0.20180830__add_user_preferences_semantic_zooming.sql b/persist/src/main/resources/db/migration/12.1.0~alpha.1/V12.1.0.20180830__add_user_preferences_semantic_zooming.sql
new file mode 100644
index 0000000000..3b6ff23788
--- /dev/null
+++ b/persist/src/main/resources/db/migration/12.1.0~alpha.1/V12.1.0.20180830__add_user_preferences_semantic_zooming.sql
@@ -0,0 +1,2 @@
+--user prferences for semantic zooming
+alter table user_annotation_schema_table add column semanticzoomcontainsmultipleoverlays boolean default false;
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
index f7201f9c88..ec2559f0b9 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectRestImpl.java
@@ -635,6 +635,7 @@ public class ProjectRestImpl extends BaseRestImpl {
     params.projectOrganism(getFirstValue(data.get("organism")));
     params.sbgnFormat(getFirstValue(data.get("sbgn")));
     params.semanticZoom(getFirstValue(data.get("semantic-zoom")));
+    params.semanticZoomContainsMultipleLayouts(getFirstValue(data.get("semantic-zoom-contains-multiple-layouts")));
     params.version(getFirstValue(data.get("version")));
     params.annotations(getFirstValue(data.get("annotate")));
     MapCanvasType mapCanvasType;
diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
index 4753bfa1e5..069b94fa57 100644
--- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
+++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java
@@ -325,6 +325,7 @@ public class UserRestImpl extends BaseRestImpl {
     result.put("cache-data", schema.getCacheData());
     result.put("auto-resize", schema.getAutoResizeMap());
     result.put("semantic-zooming", schema.getSemanticZooming());
+    result.put("semantic-zooming-contains-multiple-overlays", schema.getSemanticZoomContainsMultipleOverlays());
     result.put("sbgn", schema.getSbgnFormat());
     return result;
   }
@@ -522,6 +523,8 @@ public class UserRestImpl extends BaseRestImpl {
           schema.setAutoResizeMap(value);
         } else if (key.equals("semantic-zooming")) {
           schema.setSemanticZooming(value);
+        } else if (key.equals("semantic-zooming-contains-multiple-overlays")) {
+          schema.setSemanticZoomContainsMultipleOverlays(value);
         } else if (key.equals("sbgn")) {
           schema.setSbgnFormat(value);
         } else {
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
index ad62006ce7..5afc54a15a 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -643,7 +643,7 @@ public class ProjectService implements IProjectService {
       topModel.addLayout(0, topLayout);
       int submodelId = 1;
       List<Layout> semanticLevelOverlays = new ArrayList<>();
-      if (buildInLayout.equals(BuildInLayout.SEMANTIC)) {
+      if (buildInLayout.equals(BuildInLayout.SEMANTIC) && params.isSemanticZoomContainsMultipleLayouts()) {
         for (int i = 0; i <= topModel.getZoomLevels(); i++) {
           String directory = params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + "-" + i + "-"
               + topModel.getId() + "/";
@@ -667,7 +667,7 @@ public class ProjectService implements IProjectService {
 
         connection.getSubmodel().setZoomLevels(generator.computeZoomLevels(connection.getSubmodel().getModel()));
         connection.getSubmodel().setTileSize(MapGenerator.TILE_SIZE);
-        if (buildInLayout.equals(BuildInLayout.SEMANTIC)) {
+        if (buildInLayout.equals(BuildInLayout.SEMANTIC) && params.isSemanticZoomContainsMultipleLayouts()) {
           for (int i = 0; i <= topModel.getZoomLevels(); i++) {
             String directory = params.getProjectDir() + "/" + buildInLayout.getDirectorySuffix() + "-" + i + "-"
                 + submodelId + "/";
diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
index aa3cf038b8..80e1f978fa 100644
--- a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
+++ b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
@@ -64,11 +64,12 @@ public class CreateProjectParams {
    */
   private boolean complex;
   private boolean semanticZoom;
+  private boolean semanticZoomContainsMultipleLayouts = false;
 
   /**
    * List of zip entries in the complex model definition.
    */
-  private List<ZipEntryFile> zipEntries = new ArrayList<ZipEntryFile>();
+  private List<ZipEntryFile> zipEntries = new ArrayList<>();
 
   /**
    * Should the elements be annotated by the external resources.
@@ -794,6 +795,19 @@ public class CreateProjectParams {
     return this.semanticZoom;
   }
 
+  public CreateProjectParams semanticZoomContainsMultipleLayouts(boolean semanticZoomContainsMultipleLayouts) {
+    this.semanticZoomContainsMultipleLayouts = semanticZoomContainsMultipleLayouts;
+    return this;
+  }
+
+  public CreateProjectParams semanticZoomContainsMultipleLayouts(String value) {
+    return this.semanticZoomContainsMultipleLayouts("true".equals(value));
+  }
+
+  public boolean isSemanticZoomContainsMultipleLayouts() {
+    return this.semanticZoomContainsMultipleLayouts;
+  }
+
   public IConverter getParser() {
     return this.parser;
   }
-- 
GitLab