From 6e6ccdad17757e08f8a3309fd2a92838e986f406 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 28 Jun 2018 13:47:06 +0200
Subject: [PATCH] when user has no access to edit map he cannot click
 edit/remove button

---
 frontend-js/src/main/js/Admin.js              | 21 +++++-
 frontend-js/src/main/js/gui/Panel.js          | 13 ++++
 .../src/main/js/gui/admin/MapsAdminPanel.js   | 68 +++++++++++++------
 .../src/main/js/map/data/PrivilegeType.js     |  2 +-
 frontend-js/src/main/js/minerva.js            |  1 +
 .../test/js/gui/admin/MapsAdminPanel-test.js  | 33 ++++-----
 6 files changed, 94 insertions(+), 44 deletions(-)

diff --git a/frontend-js/src/main/js/Admin.js b/frontend-js/src/main/js/Admin.js
index 656928f373..8d779cee92 100644
--- a/frontend-js/src/main/js/Admin.js
+++ b/frontend-js/src/main/js/Admin.js
@@ -34,6 +34,7 @@ function Admin(options) {
   self.setElement(options.getElement());
 
   self.setConfiguration(options.getConfiguration());
+  self.setServerConnector(options.getServerConnector());
   self.setGuiUtils(new GuiUtils());
   self._createGui();
 }
@@ -116,7 +117,8 @@ Admin.prototype.addTab = function (params, navElement, contentElement) {
     element: contentDiv,
     name: params.name,
     project: self.getProject(),
-    configuration: self.getConfiguration()
+    configuration: self.getConfiguration(),
+    serverConnector: self.getServerConnector()
   }));
 };
 
@@ -169,4 +171,21 @@ Admin.prototype.destroy = function () {
   return Promise.all(promises);
 };
 
+/**
+ *
+ * @param {ServerConnector} serverConnector
+ */
+Admin.prototype.setServerConnector = function (serverConnector) {
+  this._serverConnector = serverConnector;
+};
+
+/**
+ *
+ * @returns {ServerConnector}
+ */
+Admin.prototype.getServerConnector = function () {
+  return this._serverConnector;
+};
+
+
 module.exports = Admin;
diff --git a/frontend-js/src/main/js/gui/Panel.js b/frontend-js/src/main/js/gui/Panel.js
index a285da4f0f..3a931f2420 100644
--- a/frontend-js/src/main/js/gui/Panel.js
+++ b/frontend-js/src/main/js/gui/Panel.js
@@ -20,6 +20,7 @@ var xss = require('xss');
  * @param {string} params.panelName
  * @param {boolean} params.scrollable
  * @param {string} [params.helpTip]
+ * @param {ServerConnector} [params.serverConnector]
  * @param params.parent
  *
  * @constructor
@@ -32,6 +33,7 @@ function Panel(params) {
   var self = this;
 
   self.setParent(params.parent);
+  self.setServerConnector(params.serverConnector);
   var configuration = params.configuration;
   if (params.configuration === undefined) {
     configuration = self.getMap().getConfiguration();
@@ -303,8 +305,19 @@ Panel.prototype.destroy = function () {
  * @returns {ServerConnector}
  */
 Panel.prototype.getServerConnector = function () {
+  if (this._serverConnector !== undefined) {
+    return this._serverConnector;
+  }
   return this.getMap().getServerConnector();
 };
 
+/**
+ *
+ * @param {ServerConnector} serverConnector
+ */
+Panel.prototype.setServerConnector = function (serverConnector) {
+  this._serverConnector = serverConnector;
+};
+
 
 module.exports = Panel;
diff --git a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
index 2e87b3d19a..939f0eb159 100644
--- a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
@@ -152,14 +152,25 @@ MapsAdminPanel.prototype._createProjectTableRow = function () {
   return projectsRow;
 };
 
+/**
+ *
+ * @returns {Promise}
+ */
 MapsAdminPanel.prototype.init = function () {
   var self = this;
-  return ServerConnector.getProjects().then(function (projects) {
+  return self.getServerConnector().getProjects().then(function (projects) {
     return self.setProjects(projects);
   });
 };
 
-MapsAdminPanel.prototype.projectToTableRow = function (project, row) {
+/**
+ *
+ * @param {Project} project
+ * @param {Array} [row]
+ * @param {User} user
+ * @returns {Array}
+ */
+MapsAdminPanel.prototype.projectToTableRow = function (project, row, user) {
   var self = this;
   var disease = self.getHtmlStringLink(project.getDisease());
   var organism = self.getHtmlStringLink(project.getOrganism());
@@ -192,8 +203,12 @@ MapsAdminPanel.prototype.projectToTableRow = function (project, row) {
   row[3] = organism;
   row[4] = status;
 
-  row[5] = "<button name='showEditDialog' data='" + project.getProjectId() + "'><i class='fa fa-edit' style='font-size:17px'></i></button>";
-  row[6] = "<button name='removeProject' data='" + project.getProjectId() + "'><i class='fa fa-trash-o' style='font-size:17px'></button>";
+  var disabled = " disabled ";
+  if (user.hasPrivilege(self.getConfiguration().getPrivilegeType(PrivilegeType.CONFIGURATION_MANAGE))) {
+    disabled = "";
+  }
+  row[5] = "<button name='showEditDialog' data='" + project.getProjectId() + "'" + disabled + "><i class='fa fa-edit' style='font-size:17px'></i></button>";
+  row[6] = "<button name='removeProject' data='" + project.getProjectId() + "'" + disabled + "><i class='fa fa-trash-o' style='font-size:17px'></button>";
 
   return row;
 };
@@ -211,20 +226,28 @@ MapsAdminPanel.prototype.getHtmlStringLink = function (annotation) {
 
 };
 
+/**
+ *
+ * @param {Project[]} projects
+ * @returns {Promise}
+ */
 MapsAdminPanel.prototype.setProjects = function (projects) {
   var self = this;
-  var dataTable = $("[name='projectsTable']", self.getElement()).DataTable();
-  var data = [];
-  var page = dataTable.page();
-
-  for (var i = 0; i < projects.length; i++) {
-    var project = projects[i];
-    var rowData = self.projectToTableRow(project);
-    self.addUpdateListener(project, rowData);
-    data.push(rowData);
-  }
-  //it should be simplified, but I couldn't make it work
-  dataTable.clear().rows.add(data).page(page).draw(false).page(page).draw(false);
+
+  return self.getServerConnector().getLoggedUser().then(function (user) {
+    var dataTable = $("[name='projectsTable']", self.getElement()).DataTable();
+    var data = [];
+    var page = dataTable.page();
+
+    for (var i = 0; i < projects.length; i++) {
+      var project = projects[i];
+      var rowData = self.projectToTableRow(project, undefined, user);
+      self.addUpdateListener(project, rowData);
+      data.push(rowData);
+    }
+    //it should be simplified, but I couldn't make it work
+    dataTable.clear().rows.add(data).page(page).draw(false).page(page).draw(false);
+  });
 };
 
 MapsAdminPanel.prototype.addUpdateListener = function (project, dataTableRow) {
@@ -238,12 +261,13 @@ MapsAdminPanel.prototype.addUpdateListener = function (project, dataTableRow) {
     }
   }
   var listener = function () {
-    self.projectToTableRow(project, dataTableRow);
-    var row = $($("[name='projectsTable']", self.getElement())[0]).DataTable().row("#" + project.getProjectId());
-    if (row.length > 0) {
-      row.data(dataTableRow).draw();
-    }
-
+    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();
+      }
+    });
   };
   listener.listenerName = listenerName;
   project.addListener("onreload", listener);
diff --git a/frontend-js/src/main/js/map/data/PrivilegeType.js b/frontend-js/src/main/js/map/data/PrivilegeType.js
index 2ec015293c..54e528f121 100644
--- a/frontend-js/src/main/js/map/data/PrivilegeType.js
+++ b/frontend-js/src/main/js/map/data/PrivilegeType.js
@@ -18,7 +18,7 @@ PrivilegeType.prototype.constructor = PrivilegeType;
 
 PrivilegeType.CONFIGURATION_MANAGE = 'CONFIGURATION_MANAGE';
 PrivilegeType.USER_MANAGEMENT = 'USER_MANAGEMENT';
-
+PrivilegeType.PROJECT_MANAGEMENT = 'PROJECT_MANAGEMENT';
 
 PrivilegeType.prototype.setObjectType = function (objectType) {
   this._objectType = objectType;
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 2382deb90c..c9fc776c29 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -611,6 +611,7 @@ function createAdmin(params) {
   if (!(params instanceof CustomMapOptions)) {
     params = new CustomMapOptions(params);
   }
+  params.setServerConnector(ServerConnector);
   initGlobals(params);
   params.getElement().style.display = "table";
   params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>"
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 432507855c..1b3a505b23 100644
--- a/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
+++ b/frontend-js/src/test/js/gui/admin/MapsAdminPanel-test.js
@@ -8,15 +8,20 @@ var logger = require('../../logger');
 
 var assert = require('assert');
 
+function createMapsAdminPanel(configuration) {
+  return new MapsAdminPanel({
+    element: testDiv,
+    configuration: configuration,
+    serverConnector: ServerConnector
+  });
+}
+
 describe('MapsAdminPanel', function () {
 
   it('refresh', function () {
     var mapTab;
     return ServerConnector.getConfiguration().then(function (configuration) {
-      mapTab = new MapsAdminPanel({
-        element: testDiv,
-        configuration: configuration
-      });
+      mapTab = createMapsAdminPanel(configuration);
       return mapTab.init();
     }).then(function () {
       return mapTab.onRefreshClicked();
@@ -28,10 +33,7 @@ describe('MapsAdminPanel', function () {
   it('showLogs', function () {
     var mapTab;
     return ServerConnector.getConfiguration().then(function (configuration) {
-      mapTab = new MapsAdminPanel({
-        element: testDiv,
-        configuration: configuration
-      });
+      mapTab = createMapsAdminPanel(configuration);
       return mapTab.init();
     }).then(function () {
       return mapTab.showLogs("sample", 'error');
@@ -45,10 +47,7 @@ describe('MapsAdminPanel', function () {
     helper.loginAsAdmin();
     var mapTab;
     return ServerConnector.getConfiguration().then(function (configuration) {
-      mapTab = new MapsAdminPanel({
-        element: testDiv,
-        configuration: configuration
-      });
+      mapTab = createMapsAdminPanel(configuration);
       return mapTab.init();
     }).then(function () {
       return ServerConnector.getProject();
@@ -65,10 +64,7 @@ describe('MapsAdminPanel', function () {
     it('default', function () {
       var mapTab;
       return ServerConnector.getConfiguration().then(function (configuration) {
-        mapTab = new MapsAdminPanel({
-          element: testDiv,
-          configuration: configuration
-        });
+        mapTab = createMapsAdminPanel(configuration);
         return mapTab.init();
       }).then(function () {
         return mapTab.onAddClicked();
@@ -79,10 +75,7 @@ describe('MapsAdminPanel', function () {
     it('close and reopen', function () {
       var mapTab;
       return ServerConnector.getConfiguration().then(function (configuration) {
-        mapTab = new MapsAdminPanel({
-          element: testDiv,
-          configuration: configuration
-        });
+        mapTab = createMapsAdminPanel(configuration);
         return mapTab.init();
       }).then(function () {
         return mapTab.onAddClicked();
-- 
GitLab