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