From 4bce0ed85e45b480f306f5bb09eb45930365fbdb Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 28 Jun 2018 14:01:59 +0200
Subject: [PATCH] configuration tab is disabled when user has no access

---
 frontend-js/src/main/js/Configuration.js      |  2 +-
 .../js/gui/admin/ConfigurationAdminPanel.js   | 31 ++++++++++++++-----
 .../gui/admin/ConfigurationAdminPanel-test.js | 27 ++++++++--------
 ...option.value=sample&token=ADMIN_TOKEN_ID&} |  0
 4 files changed, 39 insertions(+), 21 deletions(-)
 rename frontend-js/testFiles/apiCalls/configuration/options/DEFAULT_MAP/{PATCH_option.type=DEFAULT_MAP&option.value=sample&token=MOCK_TOKEN_ID& => PATCH_option.type=DEFAULT_MAP&option.value=sample&token=ADMIN_TOKEN_ID&} (100%)

diff --git a/frontend-js/src/main/js/Configuration.js b/frontend-js/src/main/js/Configuration.js
index 4fea03415f..8254c7ae0b 100644
--- a/frontend-js/src/main/js/Configuration.js
+++ b/frontend-js/src/main/js/Configuration.js
@@ -107,7 +107,7 @@ Configuration.prototype.getOption = function (type) {
 
 /**
  *
- * @returns {Array}
+ * @returns {ConfigurationOption[]}
  */
 Configuration.prototype.getOptions = function () {
   var self = this;
diff --git a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js
index 5bd068d520..f1f7fc9072 100644
--- a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js
@@ -115,17 +115,28 @@ ConfigurationAdminPanel.prototype._createGui = function () {
   });
 };
 
+/**
+ *
+ * @returns {Promise}
+ */
 ConfigurationAdminPanel.prototype.init = function () {
   var self = this;
-  var user;
-  return ServerConnector.getLoggedUser().then(function (result) {
-    user = result;
+  return self.getServerConnector().getLoggedUser().then(function (user) {
     var configuration = self.getConfiguration();
     var privilege = configuration.getPrivilegeType(PrivilegeType.CONFIGURATION_MANAGE);
-    self.setOptions(configuration.getOptions(), user.hasPrivilege(privilege));
+    if (user.hasPrivilege(privilege)) {
+      self.setOptions(configuration.getOptions(), true);
+    } else {
+      self.disablePanel("You have no privilege to manage configuration");
+    }
   });
 };
 
+/**
+ *
+ * @param {ConfigurationOption[]} options
+ * @param {boolean} editable
+ */
 ConfigurationAdminPanel.prototype.setOptions = function (options, editable) {
   var self = this;
   var dataTable = $("[name='configurationTable']", self.getElement()).DataTable();
@@ -155,6 +166,12 @@ ConfigurationAdminPanel.prototype.setOptions = function (options, editable) {
   dataTable.clear().rows.add(data).draw();
 };
 
+/**
+ *
+ * @param {ConfigurationOption} option
+ * @param {boolean} editable
+ * @returns {Array}
+ */
 ConfigurationAdminPanel.prototype.optionToTableRow = function (option, editable) {
   var value = option.getValue();
   var row = [];
@@ -186,7 +203,7 @@ ConfigurationAdminPanel.prototype.optionToTableRow = function (option, editable)
       "</div>";
   } else {
     logger.warn("Don't know how to handle: " + option.getValueType());
-    editOption = "<input name='edit-" + option.getType() + "' value='" + value + "'readonly/>";
+    editOption = "<input name='edit-" + option.getType() + "' value='" + value + "' readonly/>";
   }
   var group = option.getGroup();
   if (group === undefined) {
@@ -201,7 +218,7 @@ ConfigurationAdminPanel.prototype.optionToTableRow = function (option, editable)
 
 ConfigurationAdminPanel.prototype.saveOption = function (type) {
   var self = this;
-  return ServerConnector.getConfiguration().then(function (configuration) {
+  return self.getServerConnector().getConfiguration().then(function (configuration) {
     var option = configuration.getOption(type);
     var element = $("[name='edit-" + type + "']", self.getElement());
     var value;
@@ -215,7 +232,7 @@ ConfigurationAdminPanel.prototype.saveOption = function (type) {
       value = element.val();
     }
     option.setValue(value);
-    return ServerConnector.updateConfigurationOption(option);
+    return self.getServerConnector().updateConfigurationOption(option);
   });
 };
 ConfigurationAdminPanel.prototype.destroy = function () {
diff --git a/frontend-js/src/test/js/gui/admin/ConfigurationAdminPanel-test.js b/frontend-js/src/test/js/gui/admin/ConfigurationAdminPanel-test.js
index 8e2aa3f562..88c7e88371 100644
--- a/frontend-js/src/test/js/gui/admin/ConfigurationAdminPanel-test.js
+++ b/frontend-js/src/test/js/gui/admin/ConfigurationAdminPanel-test.js
@@ -10,6 +10,14 @@ var logger = require('../../logger');
 var chai = require('chai');
 var assert = chai.assert;
 
+function createConfigurationTab(configuration) {
+  return new ConfigurationAdminPanel({
+    element: testDiv,
+    configuration: configuration,
+    serverConnector: ServerConnector
+  });
+}
+
 describe('ConfigurationAdminPanel', function () {
 
   describe('init', function () {
@@ -17,13 +25,11 @@ describe('ConfigurationAdminPanel', function () {
       helper.loginAsAdmin();
       var mapTab;
       return ServerConnector.getConfiguration().then(function (configuration) {
-        mapTab = new ConfigurationAdminPanel({
-          element: testDiv,
-          configuration: configuration
-        });
+        mapTab = createConfigurationTab(configuration);
         return mapTab.init();
       }).then(function () {
         assert.equal(0, logger.getWarnings().length);
+        assert.ok($("[name='saveOption']", testDiv).length > 0);
         assert.notOk($("[name='saveOption']", testDiv).prop('disabled'));
         return mapTab.destroy();
       });
@@ -32,25 +38,20 @@ describe('ConfigurationAdminPanel', function () {
       helper.loginWithoutAccess();
       var mapTab;
       return ServerConnector.getConfiguration().then(function (configuration) {
-        mapTab = new ConfigurationAdminPanel({
-          element: testDiv,
-          configuration: configuration
-        });
+        mapTab = createConfigurationTab(configuration);
         return mapTab.init();
       }).then(function () {
         assert.equal(0, logger.getWarnings().length);
-        assert.ok($("[name='saveOption']", testDiv).prop('disabled'));
+        assert.equal($("[name='saveOption']", testDiv).length, 0);
         return mapTab.destroy();
       });
     });
   });
   it('saveOption', function () {
+    helper.loginAsAdmin();
     var mapTab;
     return ServerConnector.getConfiguration().then(function (configuration) {
-      mapTab = new ConfigurationAdminPanel({
-        element: testDiv,
-        configuration: configuration
-      });
+      mapTab = createConfigurationTab(configuration);
       return mapTab.init();
     }).then(function () {
       return mapTab.saveOption(ConfigurationType.DEFAULT_MAP);
diff --git a/frontend-js/testFiles/apiCalls/configuration/options/DEFAULT_MAP/PATCH_option.type=DEFAULT_MAP&option.value=sample&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/configuration/options/DEFAULT_MAP/PATCH_option.type=DEFAULT_MAP&option.value=sample&token=ADMIN_TOKEN_ID&
similarity index 100%
rename from frontend-js/testFiles/apiCalls/configuration/options/DEFAULT_MAP/PATCH_option.type=DEFAULT_MAP&option.value=sample&token=MOCK_TOKEN_ID&
rename to frontend-js/testFiles/apiCalls/configuration/options/DEFAULT_MAP/PATCH_option.type=DEFAULT_MAP&option.value=sample&token=ADMIN_TOKEN_ID&
-- 
GitLab