diff --git a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js index aea48af20d4b7ed44e2e0138aa4e3afb1b4563d7..5e94d1de03ee10f2abed10d2ce2b771e1dfb9291 100644 --- a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js +++ b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js @@ -12,6 +12,7 @@ var GuiConnector = require('../../GuiConnector'); var NetworkError = require('../../NetworkError'); var ValidationError = require('../../ValidationError'); var SignUpDapiDialog = require('./SignUpDapiDialog'); +var SignInDapiDialog = require('./SignInDapiDialog'); var logger = require('../../logger'); var HttpStatus = require('http-status-codes'); @@ -124,6 +125,30 @@ ConfigurationAdminPanel.prototype._createGui = function () { return dialog.open(); }); }); + $(self.getElement()).on("click", ".minerva-dapi-logout", function () { + var loginOption = self.getConfiguration().getOption(ConfigurationType.DAPI_LOGIN); + var passwordOption = self.getConfiguration().getOption(ConfigurationType.DAPI_PASSWORD); + loginOption.setValue(""); + passwordOption.setValue(""); + return Promise.all([self.getServerConnector().updateConfigurationOption(loginOption), + self.getServerConnector().updateConfigurationOption(passwordOption)]); + }); + + $(self.getElement()).on("click", ".minerva-dapi-sign-in", function () { + var dialog = new SignInDapiDialog({ + element: Functions.createElement({ + type: "div" + }), + configuration: self.getConfiguration(), + customMap: null, + serverConnector: self.getServerConnector() + } + ); + self._signInDialog = dialog; + return dialog.init().then(function () { + return dialog.open(); + }); + }); $(self.getElement()).on("click", ".minerva-accept-dapi-release", function () { var button = this; @@ -145,7 +170,8 @@ ConfigurationAdminPanel.prototype._createGui = function () { }).catch(GuiConnector.alert); }); -}; +} +; /** * @@ -282,6 +308,12 @@ ConfigurationAdminPanel.prototype.createDapiConfiguration = function (options) { self.getGuiUtils().addTab(self, {name: type, content: contentDiv}); return self.refreshDapiData(options, type).then(function () { + self.getConfiguration().addListener("onOptionChanged", function (e) { + var option = e.arg; + if (option.getGroup() === type) { + return self.refreshDapiData(self.getConfiguration().getOptions()); + } + }); return contentDiv; }); @@ -291,33 +323,22 @@ ConfigurationAdminPanel.prototype.refreshDapiData = function (options) { var self = this; var dataTable = $(".minerva-dapi-configuration", self.getElement()).DataTable(); - var type = "Data-API configuration"; var data = []; - for (var i = 0; i < options.length; i++) { - var option = options[i]; - if (option.getGroup() === type) { - var rowData = self.optionToTableRow(option); - data.push(rowData); - } - } + + var loginOption = self.getConfiguration().getOption(ConfigurationType.DAPI_LOGIN); + var login = xss(loginOption.getValue()); return self.getServerConnector().isDapiConnectionValid().then(function (isValid) { var row = []; row[0] = "DAPI connection validity"; if (isValid) { - row[1] = "
" + - ""; + row[1] = "
User logged in (" + login + ")
" + + ""; } else { - row[1] = "
" + - ""; + row[1] = "
No user logged in
" + + " "; } data.push(row); - self.getConfiguration().addListener("onOptionChanged", function (e) { - var option = e.arg; - if (option.getGroup() === type) { - return self.refreshDapiData(self.getConfiguration().getOptions()); - } - }); if (isValid) { return self.getReleasesRows(); } else { diff --git a/frontend-js/src/main/js/gui/admin/SignInDapiDialog.js b/frontend-js/src/main/js/gui/admin/SignInDapiDialog.js new file mode 100644 index 0000000000000000000000000000000000000000..19f8cc386e449261b0f8baa3ec81f1037e96e339 --- /dev/null +++ b/frontend-js/src/main/js/gui/admin/SignInDapiDialog.js @@ -0,0 +1,201 @@ +"use strict"; + +var Promise = require("bluebird"); +var $ = require('jquery'); + +var AbstractGuiElement = require('../AbstractGuiElement'); +var GuiConnector = require('../../GuiConnector'); + +var ConfigurationType = require('../../ConfigurationType'); + +var Functions = require('../../Functions'); + +// noinspection JSUnusedLocalSymbols +var logger = require('../../logger'); + +/** + * + * @param {Object} params + * @param {HTMLElement} params.element + * @param {Configuration} params.configuration + * @param {ServerConnector} params.serverConnector + + * @constructor + * + * @extends AbstractGuiElement + */ +function SignInDapiDialog(params) { + params["customMap"] = null; + AbstractGuiElement.call(this, params); + var self = this; + + $(self.getElement()).css({overflow: "hidden"}); + + self.createGui(); + self.registerListenerType("onSave"); +} + +SignInDapiDialog.prototype = Object.create(AbstractGuiElement.prototype); +SignInDapiDialog.prototype.constructor = SignInDapiDialog; + +/** + * + */ +SignInDapiDialog.prototype.createGui = function () { + var self = this; + + var result = Functions.createElement({ + type: "div", + className: "minerva-dapi-sign-form-content" + }); + + var table = Functions.createElement({ + type: "table", + className: "display" + }); + result.appendChild(table); + + + var menuRow = Functions.createElement({ + type: "div", + className: "minerva-menu-row" + }); + result.appendChild(menuRow); + + var saveUserButton = Functions.createElement({ + type: "button", + class: "minerva-create-dapi-account", + content: ' LOG IN', + onclick: function () { + return self.onSaveClicked().then(function () { + return self.close(); + }).catch(GuiConnector.alert); + }, + xss: false + }); + var cancelButton = Functions.createElement({ + type: "button", + content: ' CANCEL', + onclick: function () { + return self.close(); + }, + xss: false + }); + menuRow.appendChild(saveUserButton); + menuRow.appendChild(cancelButton); + + return self.getElement().appendChild(result); +}; + +/** + * + * @returns {Promise} + */ +SignInDapiDialog.prototype.onSaveClicked = function () { + var self = this; + var login = $("[name='dapi-login']", self.getElement()).val(); + var password = $("[name='dapi-password']", self.getElement()).val(); + + var loginOption = self.getConfiguration().getOption(ConfigurationType.DAPI_LOGIN); + var passwordOption = self.getConfiguration().getOption(ConfigurationType.DAPI_PASSWORD); + loginOption.setValue(login); + passwordOption.setValue(password); + GuiConnector.showProcessing(); + return Promise.all([self.getServerConnector().updateConfigurationOption(loginOption), + self.getServerConnector().updateConfigurationOption(passwordOption)] + ).then(function () { + return self.getServerConnector().isDapiConnectionValid(); + }).then(function (isValid) { + if (isValid) { + GuiConnector.info("Login successful"); + } else { + GuiConnector.warn("Invalid credentials"); + } + self.close(); + return self.callListeners("onSave", {login: login, password: password}); + }).finally(GuiConnector.hideProcessing); +}; + +/** + * + * @returns {Promise} + */ +SignInDapiDialog.prototype.init = function () { + var self = this; + var detailsTable = $(".minerva-dapi-sign-form-content table", self.getElement())[0]; + + // noinspection JSCheckFunctionSignatures + var dataTable = $(detailsTable).DataTable({ + columns: [{ + title: "Name" + }, { + title: "Value" + }], + paging: false, + ordering: false, + searching: false, + bInfo: false + }); + + var data = []; + + data.push(['Login', ""]); + data.push(['Password', ""]); + + dataTable.clear().rows.add(data).draw(); + + return Promise.resolve(); +}; + +/** + * + * + * @returns {Promise} + */ +SignInDapiDialog.prototype.destroy = function () { + var self = this; + var div = self.getElement(); + + var detailsTable = $("[name=detailsTable]", div)[0]; + if ($.fn.DataTable.isDataTable(detailsTable)) { + $(detailsTable).DataTable().destroy(); + } + if ($(div).hasClass("ui-dialog-content")) { + $(div).dialog("destroy"); + } + return Promise.resolve(); +}; + +/** + * + */ +SignInDapiDialog.prototype.open = function () { + var self = this; + var div = self.getElement(); + if (!$(div).hasClass("ui-dialog-content")) { + $(div).dialog({ + dialogClass: 'minerva-sign-up-dapi-dialog', + title: "Log in to DAPI", + width: 420, + height: 240 + }); + } + self.clear(); + $(div).dialog("open"); +}; + +SignInDapiDialog.prototype.clear = function () { + var self = this; + $("[name='dapi-login']", self.getElement()).val(""); + $("[name='dapi-password']", self.getElement()).val(""); +}; + +/** + * + */ +SignInDapiDialog.prototype.close = function () { + var self = this; + $(self.getElement()).dialog("close"); +}; + +module.exports = SignInDapiDialog; diff --git a/frontend-js/src/main/js/gui/admin/SignUpDapiDialog.js b/frontend-js/src/main/js/gui/admin/SignUpDapiDialog.js index b55606753389d3e7d267fafd86bc14400f6a3658..02f2b0910162e3207f69cca56b2d756ae93ca87f 100644 --- a/frontend-js/src/main/js/gui/admin/SignUpDapiDialog.js +++ b/frontend-js/src/main/js/gui/admin/SignUpDapiDialog.js @@ -7,7 +7,7 @@ var AbstractGuiElement = require('../AbstractGuiElement'); var GuiConnector = require('../../GuiConnector'); var ObjectExistsError = require('../../ObjectExistsError'); -var NetworkError = require('../../NetworkError'); +var ValidationError = require('../../ValidationError'); var Functions = require('../../Functions'); @@ -97,7 +97,11 @@ SignUpDapiDialog.prototype.onSaveClicked = function () { var self = this; var login = $("[name='dapi-login']", self.getElement()).val(); var password = $("[name='dapi-password']", self.getElement()).val(); + var password2 = $("[name='dapi-password-2']", self.getElement()).val(); + if (password!==password2) { + return Promise.reject(new ValidationError("Password does not match")); + } return self.getServerConnector().registerDapiUser({ login: login, password: password, @@ -140,6 +144,7 @@ SignUpDapiDialog.prototype.init = function () { data.push(['Login', ""]); data.push(['Password', ""]); + data.push(['Repeat password', ""]); data.push(['Email address', ""]); dataTable.clear().rows.add(data).draw(); @@ -176,8 +181,8 @@ SignUpDapiDialog.prototype.open = function () { $(div).dialog({ dialogClass: 'minerva-sign-up-dapi-dialog', title: "Create DAPI account", - width: window.innerWidth / 2, - height: window.innerHeight / 2 + width: 420, + height: 360 }); } self.clear(); @@ -188,6 +193,7 @@ SignUpDapiDialog.prototype.clear = function () { var self = this; $("[name='dapi-login']", self.getElement()).val(""); $("[name='dapi-password']", self.getElement()).val(""); + $("[name='dapi-password-2']", self.getElement()).val(""); $("[name='dapi-email']", self.getElement()).val(""); };