From 8eb43e7e3f4a1874bbfb187c6e879f35b9af672d Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 11 Apr 2019 11:38:34 +0200
Subject: [PATCH] save button removed from edit project (there is autosave
 functionality)

---
 frontend-js/src/main/js/ServerConnector.js    |   7 +-
 .../main/js/gui/admin/EditProjectDialog.js    | 170 ++++++++++--------
 .../src/main/js/gui/admin/MapsAdminPanel.js   |  25 +--
 .../js/gui/admin/EditProjectDialog-test.js    |  19 --
 .../test/js/gui/admin/MapsAdminPanel-test.js  |   6 +-
 frontend-js/src/test/js/mocha-config.js       |   2 +
 6 files changed, 115 insertions(+), 114 deletions(-)

diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 29a4e7f14d..ad46d788b6 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -1074,15 +1074,18 @@ ServerConnector.getProject = function (projectId) {
     if (content === null) {
       return null;
     } else {
+      var promises = [];
       var downloadedProject = new Project(content);
       if (self._projectsById[projectId] instanceof Project) {
-        self._projectsById[projectId].update(downloadedProject);
+        promises.push(self._projectsById[projectId].update(downloadedProject));
       } else {
         self._projectsById[projectId] = downloadedProject;
       }
       project = self._projectsById[projectId];
 
-      return self.getModels(projectId).then(function (models) {
+      return Promise.all(promises).then(function() {
+        return self.getModels(projectId);
+      }).then(function (models) {
         project.setModels(models);
         return self.getOverlays({
           projectId: projectId,
diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
index 1f6cc6d1ee..d54381e890 100644
--- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
@@ -35,7 +35,6 @@ function EditProjectDialog(params) {
   var self = this;
   guiUtils.setConfiguration(params.configuration);
   self.setConfiguration(params.configuration);
-  self.registerListenerType("onSave");
   $(self.getElement()).addClass("minerva-edit-project-dialog");
   $(self.getElement()).css({overflow: "hidden"});
 
@@ -133,7 +132,30 @@ EditProjectDialog.prototype.createGeneralTabContent = function () {
     style: "display:table-cell",
     content: Functions.createElement({
       type: "select",
-      name: "project-map-canvas-type"
+      name: "project-map-canvas-type",
+      onchange: function () {
+        var select = this;
+        var licenceCheckbox = $("[name='project-google-maps-license']", self.getElement())[0];
+        var licenceDiv = licenceCheckbox.parentElement.parentElement;
+
+        var update = true;
+        var mapType;
+        $("option:selected", select).each(function () {
+          mapType = $(this).val();
+          if (mapType === "GOOGLE_MAPS_API") {
+            update = false;
+            $(licenceDiv).css("display", "table-row");
+          } else {
+            $(licenceDiv).css("display", "none");
+          }
+          self.setLicenseAccepted(false);
+        });
+        if (update) {
+          var project = self.getProject();
+          project.setMapCanvasType(self.getMapCanvasTypeId());
+          return self.updateProject(project);
+        }
+      }
     })
   }));
 
@@ -154,7 +176,28 @@ EditProjectDialog.prototype.createGeneralTabContent = function () {
     content: Functions.createElement({
       type: "input",
       inputType: "checkbox",
-      name: "project-google-maps-license"
+      name: "project-google-maps-license",
+      onchange: function () {
+        var select = $("[name='project-map-canvas-type']", self.getElement())[0];
+        var licenceCheckbox = $("[name='project-google-maps-license']", self.getElement())[0];
+
+        var update = true;
+        var mapType;
+        $("option:selected", select).each(function () {
+          mapType = $(this).val();
+          if (mapType === "GOOGLE_MAPS_API") {
+            update = self.isLicenseAccepted();
+          }
+        });
+        if (self.isLicenseAccepted()) {
+          $(licenceCheckbox).prop("disabled", true);
+        }
+        if (update) {
+          var project = self.getProject();
+          project.setMapCanvasType(self.getMapCanvasTypeId());
+          return self.updateProject(project);
+        }
+      }
     })
   }));
 
@@ -172,7 +215,12 @@ EditProjectDialog.prototype.createGeneralTabContent = function () {
     type: "div",
     style: "display:table-cell",
     content: "<input name='projectName'/>",
-    xss: false
+    xss: false,
+    onchange: function () {
+      var project = self.getProject();
+      project.setName($("[name='projectName']", this).val());
+      return self.updateProject(project);
+    }
   }));
 
   var versionRow = Functions.createElement({
@@ -189,7 +237,12 @@ EditProjectDialog.prototype.createGeneralTabContent = function () {
     type: "div",
     style: "display:table-cell",
     content: "<input name='projectVersion'/>",
-    xss: false
+    xss: false,
+    onchange: function () {
+      var project = self.getProject();
+      project.setVersion($("[name='projectVersion']", this).val());
+      return self.updateProject(project);
+    }
   }));
 
   var diseaseRow = Functions.createElement({
@@ -206,7 +259,12 @@ EditProjectDialog.prototype.createGeneralTabContent = function () {
     type: "div",
     style: "display:table-cell",
     content: "<input name='projectDisease'/>",
-    xss: false
+    xss: false,
+    onchange: function () {
+      var project = self.getProject();
+      project.setDisease(prepareMiriamData("MESH_2012", $("[name='projectDisease']", this).val()));
+      return self.updateProject(project);
+    }
   }));
 
   var organismRow = Functions.createElement({
@@ -223,7 +281,12 @@ EditProjectDialog.prototype.createGeneralTabContent = function () {
     type: "div",
     style: "display:table-cell",
     content: "<input name='projectOrganism'/>",
-    xss: false
+    xss: false,
+    onchange: function () {
+      var project = self.getProject();
+      project.setOrganism(prepareMiriamData("TAXONOMY", $("[name='projectOrganism']", this).val()));
+      return self.updateProject(project);
+    }
   }));
 
   var emailRow = Functions.createElement({
@@ -240,50 +303,15 @@ EditProjectDialog.prototype.createGeneralTabContent = function () {
     type: "div",
     style: "display:table-cell",
     content: "<input name='projectNotifyEmail'/>",
-    xss: false
+    xss: false,
+    onchange: function () {
+      var project = self.getProject();
+      project.setNotifyEmail($("[name='projectNotifyEmail']", this).val());
+      return self.updateProject(project);
+    }
   }));
 
-  var menuRow = Functions.createElement({
-    type: "div",
-    className: "minerva-menu-row",
-    style: "display:table-row; margin:10px"
-  });
-  result.appendChild(menuRow);
-
-  var saveProjectButton = Functions.createElement({
-    type: "button",
-    name: "saveProject",
-    content: '<span class="ui-icon ui-icon-disk"></span>&nbsp;SAVE',
-    onclick: function () {
-      return self.onSaveClicked().then(function () {
-        return self.callListeners("onSave");
-      }).then(function () {
-        return self.close();
-      }).catch(function (error) {
-
-        if ((error instanceof NetworkError && error.statusCode === HttpStatus.BAD_REQUEST)) {
-          GuiConnector.alert(error.content.reason);
-        } else {
-          GuiConnector.alert(error);
-        }
-      });
-    },
-    xss: false
-  });
-  var cancelButton = Functions.createElement({
-    type: "button",
-    name: "cancelProject",
-    content: '<span class="ui-icon ui-icon-cancel"></span>&nbsp;CANCEL',
-    onclick: function () {
-      return self.close();
-    },
-    xss: false
-  });
-  menuRow.appendChild(saveProjectButton);
-  menuRow.appendChild(cancelButton);
-
   return result;
-
 };
 
 /**
@@ -437,7 +465,7 @@ EditProjectDialog.prototype._createOverlayTable = function () {
     var button = this;
     return self.getServerConnector().getOverlaySourceDownloadUrl({
       overlayId: $(button).attr("data"),
-      projectId:self.getProject().getProjectId()
+      projectId: self.getProject().getProjectId()
     }).then(function (url) {
       return self.downloadFile(url);
     }).then(null, GuiConnector.alert);
@@ -523,21 +551,6 @@ EditProjectDialog.prototype.createUserPrivilegeColumns = function () {
  */
 EditProjectDialog.prototype.init = function () {
   var self = this;
-  var select = $("[name='project-map-canvas-type']", self.getElement())[0];
-  var licenceCheckbox = $("[name='project-google-maps-license']", self.getElement())[0];
-  var licenceDiv = licenceCheckbox.parentElement.parentElement;
-
-  $(select).change(function () {
-    $("option:selected", select).each(function () {
-      if ($(this).val() === "GOOGLE_MAPS_API") {
-        $(licenceDiv).css("display", "table-row");
-      } else {
-        $(licenceDiv).css("display", "none");
-      }
-      self.setLicenseAccepted(false);
-    });
-  });
-
   return self.initUsersTab().then(function () {
     return self.refresh()
   }).then(function () {
@@ -928,23 +941,20 @@ var prepareMiriamData = function (type, resource) {
 
 /**
  *
+ * @param {Project} project
  * @returns {Promise}
  */
-EditProjectDialog.prototype.onSaveClicked = function () {
+EditProjectDialog.prototype.updateProject = function (project) {
   var self = this;
-  var project = self.getProject();
-  var element = self.getElement();
-  return self.checkValidity().then(function () {
-    project.setName($("[name='projectName']", element)[0].value);
-    project.setVersion($("[name='projectVersion']", element)[0].value);
-    project.setNotifyEmail($("[name='projectNotifyEmail']", element)[0].value);
-    var organism = prepareMiriamData("TAXONOMY", $("[name='projectOrganism']", element)[0].value);
-    project.setOrganism(organism);
-    var disease = prepareMiriamData("MESH_2012", $("[name='projectDisease']", element)[0].value);
-    project.setDisease(disease);
-    project.setMapCanvasType(self.getMapCanvasTypeId());
-    return self.getServerConnector().updateProject(project);
-  });
+
+  GuiConnector.showProcessing();
+  return self.getServerConnector().updateProject(project).catch(function (error) {
+    if ((error instanceof NetworkError && error.statusCode === HttpStatus.BAD_REQUEST)) {
+      GuiConnector.alert(error.content.reason);
+    } else {
+      GuiConnector.alert(error);
+    }
+  }).finally(GuiConnector.hideProcessing);
 };
 
 /**
@@ -1168,7 +1178,9 @@ EditProjectDialog.prototype.getMapCanvasTypeId = function () {
  * @param {boolean} isLicenseAccepted
  */
 EditProjectDialog.prototype.setLicenseAccepted = function (isLicenseAccepted) {
-  $("[name='project-google-maps-license']", this.getElement()).prop("checked", isLicenseAccepted);
+  var licenceCheckbox = $("[name='project-google-maps-license']", this.getElement());
+  licenceCheckbox.prop("checked", isLicenseAccepted);
+  licenceCheckbox.prop("disabled", isLicenseAccepted);
 };
 
 /**
diff --git a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
index 8324b0fe71..1c588437a2 100644
--- a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
@@ -292,7 +292,7 @@ MapsAdminPanel.prototype.setProjects = function (projects) {
     for (var i = 0; i < projects.length; i++) {
       var project = projects[i];
       var rowData = self.projectToTableRow(project, undefined, user);
-      self.addUpdateListener(project, rowData);
+      self.addUpdateListener(project);
       data.push(rowData);
       if (project.getStatus().toLowerCase() !== "ok" && project.getStatus().toLowerCase() !== "failure") {
         requireUpdate = true;
@@ -313,9 +313,8 @@ MapsAdminPanel.prototype.setProjects = function (projects) {
 /**
  *
  * @param {Project} project
- * @param {Array} dataTableRow
  */
-MapsAdminPanel.prototype.addUpdateListener = function (project, dataTableRow) {
+MapsAdminPanel.prototype.addUpdateListener = function (project) {
   var self = this;
 
   var listenerName = "PROJECT_LIST_LISTENER";
@@ -327,10 +326,16 @@ MapsAdminPanel.prototype.addUpdateListener = function (project, dataTableRow) {
   }
   var listener = function () {
     return self.getServerConnector().getLoggedUser().then(function (user) {
-      self.projectToTableRow(project, dataTableRow, user);
-      var row = $($("[name='projectsTable']", self.getElement())[0]).DataTable().row("#" + project.getProjectId());
-      if (row.length > 0) {
-        row.data(dataTableRow).draw();
+      var dataTable = $($("[name='projectsTable']", self.getElement())[0]).DataTable();
+
+      var length = dataTable.data().length;
+      for (var i = 0; i < length; i++) {
+        var row = dataTable.row(i);
+        var data = row.data();
+        if (data[0].indexOf(">" + project.getProjectId() + "<")>=0) {
+          self.projectToTableRow(project, data, user);
+          row.data(data).draw();
+        }
       }
     });
   };
@@ -421,7 +426,7 @@ MapsAdminPanel.prototype.onRefreshClicked = function () {
 
 /**
  *
- * @param project
+ * @param {Project} project
  * @returns {*}
  */
 MapsAdminPanel.prototype.getDialog = function (project) {
@@ -442,10 +447,6 @@ MapsAdminPanel.prototype.getDialog = function (project) {
     });
     self._dialogs[project.getProjectId()] = dialog;
     return dialog.init().then(function () {
-      return dialog.addListener("onSave", function () {
-        return self.onRefreshClicked()
-      });
-    }).then(function () {
       return dialog;
     });
   } else {
diff --git a/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
index 52ea725632..edd4449c6a 100644
--- a/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
+++ b/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js
@@ -99,25 +99,6 @@ describe('EditProjectDialog', function () {
     });
   });
 
-
-  it('onSaveClicked', function () {
-    var dialog;
-    var project;
-    return ServerConnector.getProject().then(function (result) {
-      project = result;
-      project.setVersion("2.01");
-      return createDialog(project);
-    }).then(function (result) {
-      dialog = result;
-      return dialog.init();
-    }).then(function () {
-      return dialog.onSaveClicked();
-    }).then(function (result) {
-      assert.ok(project === result);
-      dialog.destroy();
-    });
-  });
-
   it('openAddOverlayDialog', function () {
     var dialog;
     return createDialog().then(function (result) {
diff --git a/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js b/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
index 2633963d10..9367efbaac 100644
--- a/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
+++ b/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
@@ -69,12 +69,14 @@ describe('MapsAdminPanel', function () {
   it('getDialog', function () {
     helper.loginAsAdmin();
     var mapTab = createMapsAdminPanel();
+    var project;
     return mapTab.init().then(function () {
       return ServerConnector.getProject();
-    }).then(function (project) {
+    }).then(function (result) {
+      project = result;
       return mapTab.getDialog(project);
     }).then(function (dialog) {
-      assert.ok(dialog.getListeners("onSave").length > 0);
+      assert.ok(project.getListeners("onreload").length > 0);
       return mapTab.destroy();
     });
   });
diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js
index ccc71a8bbb..a3a6cca787 100644
--- a/frontend-js/src/test/js/mocha-config.js
+++ b/frontend-js/src/test/js/mocha-config.js
@@ -228,6 +228,8 @@ afterEach(function () {
       document.body.innerHTML = "";
       this.test.error(new Error("Test didn't left clean document. Found: " + content));
     } else if ($._data(window, "events").resize) {
+      var events = $._data(window, "events").resize;
+      logger.warn(events);
       $(window).off("resize");
       this.test.error(new Error("Test didn't left clean resize events handlers."));
     }
-- 
GitLab