From add727c3119e1d473d481ce2981b2a39a7511ad8 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 28 Aug 2019 14:39:30 +0200
Subject: [PATCH] admin/curatorprivileges is using radio button

---
 .../src/main/js/gui/admin/EditUserDialog.js   | 185 +++++++-----------
 .../test/js/gui/admin/EditUserDialog-test.js  |   5 +-
 ...CREATE_OVERLAYS=true&token=ADMIN_TOKEN_ID& |   1 +
 ...ileges.IS_ADMIN=true&token=ADMIN_TOKEN_ID& |   1 -
 4 files changed, 72 insertions(+), 120 deletions(-)
 create mode 100644 frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.CAN_CREATE_OVERLAYS=true&token=ADMIN_TOKEN_ID&
 delete mode 100644 frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.IS_ADMIN=true&token=ADMIN_TOKEN_ID&

diff --git a/frontend-js/src/main/js/gui/admin/EditUserDialog.js b/frontend-js/src/main/js/gui/admin/EditUserDialog.js
index 3cc088725d..36d991ec91 100644
--- a/frontend-js/src/main/js/gui/admin/EditUserDialog.js
+++ b/frontend-js/src/main/js/gui/admin/EditUserDialog.js
@@ -86,10 +86,6 @@ EditUserDialog.prototype.createGui = function () {
     name: "DETAILS",
     content: self.createGeneralTabContent()
   });
-  guiUtils.addTab(self, {
-    name: "GLOBAL PRIVILEGES",
-    content: self.createPrivilegesTabContent()
-  });
   guiUtils.addTab(self, {
     name: "PROJECT PRIVILEGES",
     content: self.createProjectsTabContent()
@@ -199,47 +195,40 @@ EditUserDialog.prototype.createGeneralTabContent = function () {
       }
     }
   });
-  return result;
-
-};
-
-/**
- *
- * @returns {HTMLElement}
- */
-EditUserDialog.prototype.createPrivilegesTabContent = function () {
-  var self = this;
-  var result = Functions.createElement({
-    type: "div",
-    style: "margin-top:10px;"
-  });
-  result.appendChild(self._createPrivilegesTable());
-  return result;
-};
-
-/**
- *
- * @returns {HTMLElement}
- * @private
- */
-EditUserDialog.prototype._createPrivilegesTable = function () {
-  var result = Functions.createElement({
-    type: "div",
-    style: "margin-top:10px;"
+  $(result).on('change', '[name="user-can-create-overlay"]', function () {
+    if ($(this).is(":checked")) {
+      return self.grantPrivilege({privilegeType: PrivilegeType.CAN_CREATE_OVERLAYS});
+    } else {
+      return self.revokePrivilege({privilegeType: PrivilegeType.CAN_CREATE_OVERLAYS});
+    }
   });
 
-  var privilegesTable = Functions.createElement({
-    type: "table",
-    name: "privilegesTable",
-    className: "display",
-    style: "width:100%"
-  });
-  result.appendChild(privilegesTable);
 
+  $(result).on("click", "[name='userRole']", function () {
+      var field = this;
+      var role = $('[name="user-role-' + self.getUser().getLogin() + '"]:checked', field).val();
+      var promises = [];
+      if (role === "ADMIN") {
+        promises.push(self.grantPrivilege({privilegeType: PrivilegeType.IS_ADMIN}));
+        promises.push(self.revokePrivilege({privilegeType: PrivilegeType.IS_CURATOR}));
+        $("[name='user-can-create-overlay-div']", result).css("display", "none");
+      } else if (role === "CURATOR") {
+        promises.push(self.revokePrivilege({privilegeType: PrivilegeType.IS_ADMIN}));
+        promises.push(self.grantPrivilege({privilegeType: PrivilegeType.IS_CURATOR}));
+        $("[name='user-can-create-overlay-div']", result).css("display", "none");
+      } else if (role === "USER") {
+        promises.push(self.revokePrivilege({privilegeType: PrivilegeType.IS_ADMIN}));
+        promises.push(self.revokePrivilege({privilegeType: PrivilegeType.IS_CURATOR}));
+        $("[name='user-can-create-overlay-div']", result).css("display", "block");
+      } else {
+        GuiConnector.alert("Invalid role: " + role);
+      }
+      return Promise.all(promises);
+    }
+  );
   return result;
 };
 
-
 /**
  *
  * @returns {HTMLElement}
@@ -303,7 +292,6 @@ EditUserDialog.prototype.init = function () {
   });
 
   self.initProjectsTab();
-  self.initPrivilegesTab();
 
   return self.refresh().then(function () {
     $(window).trigger('resize');
@@ -331,11 +319,48 @@ EditUserDialog.prototype.refresh = function () {
   data.push(['Surname', '<input name="userSurname" value="' + getStringIfDefined(user.getSurname()) + '"/>']);
   data.push(['Email', '<input name="userEmail" value="' + getStringIfDefined(user.getEmail()) + '"/>']);
 
+  var userRoleId = 'user-role-' + user.getLogin();
+
+  var adminChecked = '';
+  var curatorChecked = '';
+  var userChecked = '';
+  var canCreateOverlayDisplay = "none";
+  var canCreateOverlayChecked = "";
+
+  if (self.getIsNewUser()) {
+    var option = self.getConfiguration().getOption('DEFAULT_' + PrivilegeType.CAN_CREATE_OVERLAYS);
+    if (option !== null && option !== undefined) {
+      if (option.getValue().toLowerCase() === "true") {
+        user.setPrivilege({privilegeType: PrivilegeType.CAN_CREATE_OVERLAYS});
+      }
+    }
+  }
+
+  if (user.hasPrivilege(self.getConfiguration().getPrivilegeType(PrivilegeType.CAN_CREATE_OVERLAYS))) {
+    canCreateOverlayChecked = " checked ";
+  }
+
+  if (user.hasPrivilege(self.getConfiguration().getPrivilegeType(PrivilegeType.IS_ADMIN))) {
+    adminChecked = " checked ";
+  } else if (user.hasPrivilege(self.getConfiguration().getPrivilegeType(PrivilegeType.IS_CURATOR))) {
+    curatorChecked = " checked ";
+  } else {
+    canCreateOverlayDisplay = "block";
+    userChecked = " checked ";
+  }
+  data.push(["Role",
+    "<fieldset name='userRole' id='" + userRoleId + "'> " +
+    "<input type='radio' name='" + userRoleId + "' value='ADMIN' " + adminChecked + "> ADMIN<br/>" +
+    "<input type='radio' name='" + userRoleId + "' value='CURATOR' " + curatorChecked + "> CURATOR<br/>" +
+    "<input type='radio' name='" + userRoleId + "' value='USER' " + userChecked + "> USER <br/>" +
+    "<div name='user-can-create-overlay-div' style='display:" + canCreateOverlayDisplay + ";'>" +
+    "<input type='checkbox' style='float:left; ' name='user-can-create-overlay' " + canCreateOverlayChecked + "> User can create overlays " +
+    "</div>" +
+    "</fieldset>"]);
+
   dataTable.clear().rows.add(data).draw();
 
-  return self.refreshProjects().then(function () {
-    return self.refreshPrivilegesTab();
-  });
+  return self.refreshProjects();
 };
 
 /**
@@ -385,36 +410,6 @@ EditUserDialog.prototype.initProjectsTab = function () {
   });
 };
 
-/**
- *
- */
-EditUserDialog.prototype.initPrivilegesTab = function () {
-  var self = this;
-
-  var privilegesTable = $("[name=privilegesTable]", self.getElement())[0];
-
-  var columns = [{
-    title: "Name"
-  }, {
-    title: "Value"
-  }];
-
-  $(privilegesTable).DataTable({
-    columns: columns
-  });
-
-  $(privilegesTable).on("click", "[name='privilege-checkbox']", function () {
-    var data = $(this).attr("data").split(":");
-    var type = data[0];
-    var projectId = data[1];
-    if ($(this).is(":checked")) {
-      return self.grantPrivilege({privilegeType: type, objectId: projectId});
-    } else {
-      return self.revokePrivilege({privilegeType: type, objectId: projectId});
-    }
-  });
-};
-
 /**
  *
  * @param {Authority} privilege
@@ -453,45 +448,6 @@ EditUserDialog.prototype.revokePrivilege = function (privilege) {
   }
 };
 
-/**
- *
- */
-EditUserDialog.prototype.refreshPrivilegesTab = function () {
-  var self = this;
-
-  var dataTable = $("[name=privilegesTable]", self.getElement()).DataTable();
-
-  var data = [];
-  var configuration = self.getConfiguration();
-  for (var i = 0; i < configuration.getPrivilegeTypes().length; i++) {
-    var privilege = configuration.getPrivilegeTypes()[i];
-    var option;
-    if (privilege.getObjectType() === null) {
-      if (privilege.getValueType() === "boolean") {
-        var checked = "";
-        if (self.getUser().hasPrivilege(privilege)) {
-          checked = "checked"
-        } else if (this.getIsNewUser()) {
-          option = this.getConfiguration().getOption('DEFAULT_' + privilege.getName());
-          if (option !== null && option !== undefined) {
-            if (option.getValue().toLowerCase() === "true") {
-              self.getUser().setPrivilege({privilegeType: privilege.getName()});
-              checked = "checked";
-            }
-          }
-        }
-        data.push([
-          "<span>" + privilege.getCommonName() + "</span>",
-          "<input type='checkbox' name='privilege-checkbox' data='" + privilege.getName() + "' " + checked + " />"
-        ]);
-      } else {
-        throw new Error("Not implemented");
-      }
-    }
-  }
-  dataTable.clear().rows.add(data).draw();
-};
-
 /**
  *
  * @returns {Promise}
@@ -593,11 +549,6 @@ EditUserDialog.prototype.destroy = function () {
     $(usersTable).DataTable().destroy();
   }
 
-  var privilegesTable = $("[name=privilegesTable]", div)[0];
-  if ($.fn.DataTable.isDataTable(privilegesTable)) {
-    $(privilegesTable).DataTable().destroy();
-  }
-
   var detailsTable = $("[name=detailsTable]", div)[0];
   if ($.fn.DataTable.isDataTable(detailsTable)) {
     $(detailsTable).DataTable().destroy();
diff --git a/frontend-js/src/test/js/gui/admin/EditUserDialog-test.js b/frontend-js/src/test/js/gui/admin/EditUserDialog-test.js
index fffbc379b3..2b46af2001 100644
--- a/frontend-js/src/test/js/gui/admin/EditUserDialog-test.js
+++ b/frontend-js/src/test/js/gui/admin/EditUserDialog-test.js
@@ -138,11 +138,12 @@ describe('EditUserDialog', function () {
         dialog = createEditUserDialog(user);
         return dialog.init();
       }).then(function () {
-        var checkbox = $("[name=privilege-checkbox]", dialog.getElement())[0];
+        var checkbox = $("[name=user-can-create-overlay]", dialog.getElement())[0];
         checkbox.checked = !checkbox.checked;
-        return helper.triggerJqueryEvent(checkbox, "click");
+        return helper.triggerJqueryEvent(checkbox, "change");
       }).then(function () {
         expect(serializedPrivileges).not.to.deep.equal(user.getPrivileges());
+      }).finally(function(){
         dialog.destroy();
       });
     });
diff --git a/frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.CAN_CREATE_OVERLAYS=true&token=ADMIN_TOKEN_ID& b/frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.CAN_CREATE_OVERLAYS=true&token=ADMIN_TOKEN_ID&
new file mode 100644
index 0000000000..8dd908e302
--- /dev/null
+++ b/frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.CAN_CREATE_OVERLAYS=true&token=ADMIN_TOKEN_ID&
@@ -0,0 +1 @@
+{"connectedToLdap":false,"email":"","id":3,"ldapAccountAvailable":false,"login":"anonymous","maxColor":null,"minColor":null,"name":"","neutralColor":null,"privileges":[{"objectId":null,"privilegeType":"CAN_CREATE_OVERLAYS"}, {"objectId":"empty","privilegeType":"READ_PROJECT"},{"objectId":"parameter","privilegeType":"READ_PROJECT"},{"objectId":"drug_target_sample","privilegeType":"READ_PROJECT"},{"objectId":"GSTP1_subnetwork_220214","privilegeType":"READ_PROJECT"},{"objectId":"pdmap_jun16_test","privilegeType":"READ_PROJECT"},{"objectId":"CDlayerin_v2-semantic","privilegeType":"READ_PROJECT"},{"objectId":"PD_150625_3","privilegeType":"READ_PROJECT"},{"objectId":"doi","privilegeType":"READ_PROJECT"},{"objectId":"complex_model_with_images","privilegeType":"READ_PROJECT"},{"objectId":"complex_model_with_submaps","privilegeType":"READ_PROJECT"},{"objectId":"images","privilegeType":"READ_PROJECT"},{"objectId":"kinteics_test","privilegeType":"READ_PROJECT"},{"objectId":"species_with_boundary_cond","privilegeType":"READ_PROJECT"},{"objectId":"sample","privilegeType":"READ_PROJECT"},{"objectId":"complex_model_with_layouts","privilegeType":"READ_PROJECT"},{"objectId":"pdmap_jan17","privilegeType":"READ_PROJECT"},{"objectId":"ASTHMA_V40_Test9","privilegeType":"READ_PROJECT"},{"objectId":"CDlayerin_v2","privilegeType":"READ_PROJECT"}],"removed":false,"simpleColor":null,"surname":"","termsOfUseConsent":false}
\ No newline at end of file
diff --git a/frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.IS_ADMIN=true&token=ADMIN_TOKEN_ID& b/frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.IS_ADMIN=true&token=ADMIN_TOKEN_ID&
deleted file mode 100644
index 2fd3a0360c..0000000000
--- a/frontend-js/testFiles/apiCalls/users/anonymous.updatePrivileges/PATCH_privileges.IS_ADMIN=true&token=ADMIN_TOKEN_ID&
+++ /dev/null
@@ -1 +0,0 @@
-{"connectedToLdap":false,"email":"","id":3,"ldapAccountAvailable":false,"login":"anonymous","maxColor":null,"minColor":null,"name":"","neutralColor":null,"privileges":[{"objectId":null,"privilegeType":"IS_ADMIN"}, {"objectId":"empty","privilegeType":"READ_PROJECT"},{"objectId":"parameter","privilegeType":"READ_PROJECT"},{"objectId":"drug_target_sample","privilegeType":"READ_PROJECT"},{"objectId":"GSTP1_subnetwork_220214","privilegeType":"READ_PROJECT"},{"objectId":"pdmap_jun16_test","privilegeType":"READ_PROJECT"},{"objectId":"CDlayerin_v2-semantic","privilegeType":"READ_PROJECT"},{"objectId":"PD_150625_3","privilegeType":"READ_PROJECT"},{"objectId":"doi","privilegeType":"READ_PROJECT"},{"objectId":"complex_model_with_images","privilegeType":"READ_PROJECT"},{"objectId":"complex_model_with_submaps","privilegeType":"READ_PROJECT"},{"objectId":"images","privilegeType":"READ_PROJECT"},{"objectId":"kinteics_test","privilegeType":"READ_PROJECT"},{"objectId":"species_with_boundary_cond","privilegeType":"READ_PROJECT"},{"objectId":"sample","privilegeType":"READ_PROJECT"},{"objectId":"complex_model_with_layouts","privilegeType":"READ_PROJECT"},{"objectId":"pdmap_jan17","privilegeType":"READ_PROJECT"},{"objectId":"ASTHMA_V40_Test9","privilegeType":"READ_PROJECT"},{"objectId":"CDlayerin_v2","privilegeType":"READ_PROJECT"}],"removed":false,"simpleColor":null,"surname":"","termsOfUseConsent":false}
\ No newline at end of file
-- 
GitLab