From ca310b198bc811ab3c610953054d1463a9caf228 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 21 Aug 2017 18:43:39 +0200
Subject: [PATCH] visualization of user project privileges

---
 frontend-js/src/main/js/Configuration.js      |   4 +
 .../main/js/gui/admin/EditProjectDialog.js    | 130 +++++++++++++++++-
 .../src/main/js/map/data/PrivilegeType.js     |  49 +++++++
 frontend-js/src/main/js/map/data/User.js      |  12 ++
 4 files changed, 192 insertions(+), 3 deletions(-)
 create mode 100644 frontend-js/src/main/js/map/data/PrivilegeType.js

diff --git a/frontend-js/src/main/js/Configuration.js b/frontend-js/src/main/js/Configuration.js
index e480bfa184..dbd30aead7 100644
--- a/frontend-js/src/main/js/Configuration.js
+++ b/frontend-js/src/main/js/Configuration.js
@@ -114,6 +114,10 @@ Configuration.prototype.setPrivilegeTypes = function(privilegeTypes) {
   }
 };
 
+Configuration.prototype.getPrivilegeTypes = function() {
+  return this._privilegeTypes;
+};
+
 Configuration.prototype.getMiriamTypeByName = function(name) {
   var self = this;
   for (var i = 0; i < self._miriamTypes.length; i++) {
diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
index ae2eb07d08..9ab7a20cc9 100644
--- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js
@@ -347,19 +347,88 @@ EditProjectDialog.prototype.createUsersTab = function(tabMenuDiv, tabContentDiv)
 };
 
 EditProjectDialog.prototype.createUsersTabContent = function() {
-  return Functions.createElement({
+  var self = this;
+
+  var result = Functions.createElement({
     type : "div",
-    content : "Bye",
+    style : "margin-top:10px;",
+  });
+
+  var usersTable = Functions.createElement({
+    type : "table",
+    name : "usersTable",
+    className : "display",
+    style : "width:100%",
   });
+  result.appendChild(usersTable);
+
+  $(usersTable).on("click", "[name='saveUser']", function() {
+    var button = this;
+    GuiConnector.showProcessing("Updating");
+    return self.saveUser($(button).attr("data")).then(function() {
+      GuiConnector.hideProcessing();
+      GuiConnector.info("User updated successfully");
+    }, function(error) {
+      GuiConnector.hideProcessing();
+      GuiConnector.alert(error);
+    });
+  });
+
+  return result;
+};
+
+EditProjectDialog.prototype.createUserPrivilegeColumns = function() {
+  var self = this;
+
+  if (self._userPrivilegeColumns !== undefined) {
+    return Promise.resolve(self._userPrivilegeColumns);
+  }
+
+  return ServerConnector.getConfiguration().then(function(configuration) {
+    self._userPrivilegeColumns = [ {
+      title : "Name"
+    } ];
+    var privilegeTypes = configuration.getPrivilegeTypes();
+    for (var i = 0; i < privilegeTypes.length; i++) {
+      var type = privilegeTypes[i];
+      if (type.getObjectType() === "Project") {
+        self._userPrivilegeColumns.push({
+          "title" : type.getCommonName(),
+          privilegeType : type,
+        });
+      }
+    }
+    self._userPrivilegeColumns.push({
+      "title" : "Update"
+    });
+    return self._userPrivilegeColumns;
+  });
+
 };
 
 EditProjectDialog.prototype.init = function() {
   var self = this;
-  return self.refreshOverlays().then(function() {
+  return self.initUsersTab().then(function() {
+    return self.refreshUsers();
+  }).then(function() {
+    return self.refreshOverlays();
+  }).then(function() {
     $(window).trigger('resize');
   });
 };
 
+EditProjectDialog.prototype.initUsersTab = function() {
+  var self = this;
+
+  var usersTable = $("[name=usersTable]", self.getElement())[0];
+
+  return self.createUserPrivilegeColumns().then(function(columns) {
+    $(usersTable).DataTable({
+      columns : columns,
+    });
+  });
+};
+
 EditProjectDialog.prototype.refreshOverlays = function() {
   var self = this;
   return ServerConnector.getOverlays({
@@ -369,6 +438,13 @@ EditProjectDialog.prototype.refreshOverlays = function() {
   });
 };
 
+EditProjectDialog.prototype.refreshUsers = function() {
+  var self = this;
+  return ServerConnector.getUsers().then(function(users) {
+    return self.setUsers(users);
+  });
+};
+
 EditProjectDialog.prototype.setOverlays = function(overlays) {
   var self = this;
   self._overlayById = [];
@@ -385,6 +461,49 @@ EditProjectDialog.prototype.setOverlays = function(overlays) {
   });
 };
 
+EditProjectDialog.prototype.setUsers = function(users) {
+  var self = this;
+  self._userByLogin = [];
+  return self.createUserPrivilegeColumns().then(function(columns) {
+    var dataTable = $($("[name='usersTable']", self.getElement())[0]).DataTable();
+    var data = [];
+    for (var i = 0; i < users.length; i++) {
+      var user = users[i];
+      self._userByLogin[user.getLogin()] = user;
+      var rowData = self.userToTableRow(user, columns);
+      data.push(rowData);
+    }
+    dataTable.clear().rows.add(data).draw();
+  });
+};
+
+EditProjectDialog.prototype.userToTableRow = function(user, columns) {
+  var self = this;
+  var row = [];
+  var login = user.getLogin();
+
+  row[0] = user.getName() + " " + user.getSurname() + " (" + login + ")";
+  for (var i = 1; i < columns.length; i++) {
+    var column = columns[i];
+    if (column.privilegeType !== undefined) {
+      if (column.privilegeType.getValueType() === "boolean") {
+        var checked = '';
+        if (user.hasPrivilege(column.privilegeType, self.getProject().getId())) {
+          checked = 'checked';
+        }
+        row[i] = "<input type='checkbox' name='privilege-" + login + "' data='" + column.privilegeType.getName() + "' "
+            + checked + "/>";
+      } else {
+        throw new Error("Unsupported type: " + column.privilegeType.getValueType());
+      }
+    }
+  }
+
+  row.push("<button name='saveUser' data='" + login + "'>SAVE</button>");
+
+  return row;
+};
+
 EditProjectDialog.prototype.overlayToTableRow = function(overlay, users) {
   var row = [];
   var id = overlay.getId();
@@ -492,6 +611,11 @@ EditProjectDialog.prototype.saveOverlay = function(overlayId) {
 
   return ServerConnector.updateOverlay(overlay);
 };
+
+EditProjectDialog.prototype.saveUser = function(login) {
+  return Promise.reject(Error("not implemented"));
+};
+
 EditProjectDialog.prototype.removeOverlay = function(overlayId) {
   var self = this;
   return ServerConnector.removeOverlay({
diff --git a/frontend-js/src/main/js/map/data/PrivilegeType.js b/frontend-js/src/main/js/map/data/PrivilegeType.js
new file mode 100644
index 0000000000..4b48d3fd78
--- /dev/null
+++ b/frontend-js/src/main/js/map/data/PrivilegeType.js
@@ -0,0 +1,49 @@
+"use strict";
+
+var ObjectWithListeners = require('../../ObjectWithListeners');
+
+function PrivilegeType(data, name) {
+  // call super constructor
+  ObjectWithListeners.call(this);
+
+  var self = this;
+  self.setName(name);
+  self.setCommonName(data.commonName);
+  self.setObjectType(data.objectType);
+  self.setValueType(data.valueType);
+}
+
+PrivilegeType.prototype = Object.create(ObjectWithListeners.prototype);
+PrivilegeType.prototype.constructor = PrivilegeType;
+
+PrivilegeType.prototype.setObjectType = function(objectType) {
+  this._objectType = objectType;
+};
+
+PrivilegeType.prototype.getObjectType = function() {
+  return this._objectType;
+};
+PrivilegeType.prototype.setValueType = function(valueType) {
+  this._valueType = valueType;
+};
+
+PrivilegeType.prototype.getValueType = function() {
+  return this._valueType;
+};
+PrivilegeType.prototype.setCommonName = function(commonName) {
+  this._commonName = commonName;
+};
+
+PrivilegeType.prototype.getCommonName = function() {
+  return this._commonName;
+};
+
+PrivilegeType.prototype.setName = function(name) {
+  this._name = name;
+};
+
+PrivilegeType.prototype.getName = function() {
+  return this._name;
+};
+
+module.exports = PrivilegeType;
diff --git a/frontend-js/src/main/js/map/data/User.js b/frontend-js/src/main/js/map/data/User.js
index 4aa7c3bce7..93e3bc45be 100644
--- a/frontend-js/src/main/js/map/data/User.js
+++ b/frontend-js/src/main/js/map/data/User.js
@@ -88,6 +88,18 @@ User.prototype.getPrivileges = function() {
   return this._privileges;
 };
 
+User.prototype.hasPrivilege = function(type, objectId) {
+  for (var i = 0; i < this._privileges.length; i++) {
+    var privilege = this._privileges[i];
+    if (privilege.type === type.getName()) {
+      if (objectId === privilege.objectId) {
+        return privilege.value > 0;
+      }
+    }
+  }
+  return false;
+};
+
 User.prototype.update = function(user) {
   this.setLogin(user.getLogin());
   this.setName(user.getName());
-- 
GitLab