diff --git a/frontend-js/src/main/js/Admin.js b/frontend-js/src/main/js/Admin.js new file mode 100644 index 0000000000000000000000000000000000000000..e0fc04712c39710da93c5c7e08c72afa666aec5a --- /dev/null +++ b/frontend-js/src/main/js/Admin.js @@ -0,0 +1,178 @@ +"use strict"; + +/* exported logger */ + +var Promise = require("bluebird"); + +var CustomMapOptions = require('./map/CustomMapOptions'); +var Header = require('./gui/Header'); +var ObjectWithListeners = require('./ObjectWithListeners'); + +var CommentsAdminPanel = require('./gui/admin/CommentsAdminPanel'); +var ConfigurationAdminPanel = require('./gui/admin/ConfigurationAdminPanel'); +var MapsAdminPanel = require('./gui/admin/MapsAdminPanel'); +var ServicesAdminPanel = require('./gui/admin/ServicesAdminPanel'); +var UsersAdminPanel = require('./gui/admin/UsersAdminPanel'); + + +var logger = require('./logger'); +var Functions = require('./Functions'); + +/** + * Default constructor. + * + * @param options + * CustomMapOptions object representing all parameters needed for map + * creation + */ +function Admin(options) { + var self = this; + self._panels = []; + self._tabIdCount = 0; + if (!(options instanceof CustomMapOptions)) { + options = new CustomMapOptions(options); + } + self.setProject(options.getProject()); + self.setElement(options.getElement()); + + self.setConfiguration(options.getConfiguration()); + self._createGui(); +} + +Admin.prototype = Object.create(ObjectWithListeners.prototype); +Admin.prototype.constructor = ObjectWithListeners; + +Admin.prototype._createGui = function() { + var self = this; + self.getElement().innerHTML = ""; + var headerDiv = Functions.createElement({ + type : "div" + }); + new Header({ + element : headerDiv, + customMap : null, + project : self.getProject(), + }); + self.getElement().appendChild(headerDiv); + + var panels = [ { + name : "COMMENTS", + panelClass : CommentsAdminPanel, + }, { + name : "MAPS", + panelClass : MapsAdminPanel, + }, { + name : "USERS", + panelClass : UsersAdminPanel, + }, { + name : "SERVICES", + panelClass : ServicesAdminPanel, + }, { + name : "CONFIGURATION", + panelClass : ConfigurationAdminPanel, + } ]; + + var tabDiv = Functions.createElement({ + type : "div", + name : "tabView", + className : "tabbable boxed parentTabs" + }); + self.getElement().appendChild(tabDiv); + + var tabMenuDiv = Functions.createElement({ + type : "ul", + className : "nav nav-tabs" + }); + tabDiv.appendChild(tabMenuDiv); + + var tabContentDiv = Functions.createElement({ + type : "div", + className : "tab-content" + }); + tabDiv.appendChild(tabContentDiv); + + for (var i = 0; i < panels.length; i++) { + self.addTab(panels[i], tabMenuDiv, tabContentDiv); + } +}; + +Admin.prototype.addTab = function(params, navElement, contentElement) { + var self = this; + + var name = params.name; + + var tabId = "export_panel_tab_" + this._tabIdCount; + self._tabIdCount++; + + var navClass = ''; + var contentClass = 'tab-pane'; + if (navElement.children.length === 0) { + navClass = "active"; + contentClass = "tab-pane active"; + } + + var navLi = document.createElement("li"); + navLi.className = navClass; + + var navLink = document.createElement("a"); + navLink.href = "#" + tabId; + if (name !== undefined) { + if (name.length > 12) { + name = name.substring(0, 10) + "..."; + } + navLink.innerHTML = name; + } + navLink.onclick = function() { + $(this).tab('show'); + }; + navLi.appendChild(navLink); + if (name !== undefined) { + navLink.innerHTML = name; + } + navElement.appendChild(navLi); + + var contentDiv = document.createElement("div"); + contentDiv.style.height = "100%"; + contentDiv.className = contentClass; + contentDiv.id = tabId; + + contentElement.appendChild(contentDiv); + + this._panels.push(new params.panelClass({ + element : contentDiv, + project : self.getProject(), + configuration : self.getConfiguration(), + })); +}; + +Admin.prototype.setProject = function(project) { + this._project = project; +}; +Admin.prototype.getProject = function() { + return this._project; +}; + +Admin.prototype.setElement = function(element) { + this._element = element; +}; +Admin.prototype.getElement = function() { + return this._element; +}; + +Admin.prototype.init = function() { + var promises = []; + for (var i = 0; i < this._panels.length; i++) { + promises.push(this._panels[i].init()); + } + return Promise.all(promises); +}; + +Admin.prototype.setConfiguration = function(configuration) { + this._configuration = configuration; +}; + +Admin.prototype.getConfiguration = function() { + return this._configuration; +}; + +module.exports = Admin; diff --git a/frontend-js/src/main/js/gui/admin/CommentsAdminPanel.js b/frontend-js/src/main/js/gui/admin/CommentsAdminPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..722dfeaea27a53cadbe9d24c9bd8f84f81f47515 --- /dev/null +++ b/frontend-js/src/main/js/gui/admin/CommentsAdminPanel.js @@ -0,0 +1,22 @@ +"use strict"; + +/* exported logger */ + +var Panel = require('../Panel'); + +var Promise = require("bluebird"); + +function CommentsAdminPanel(params) { + params.scrollable = true; + Panel.call(this, params); + +} + +CommentsAdminPanel.prototype = Object.create(Panel.prototype); +CommentsAdminPanel.prototype.constructor = CommentsAdminPanel; + +CommentsAdminPanel.prototype.init = function() { + +}; + +module.exports = CommentsAdminPanel; diff --git a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..43f8ec6a08d919f4695f31e6209894ef56867bc9 --- /dev/null +++ b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js @@ -0,0 +1,22 @@ +"use strict"; + +/* exported logger */ + +var Panel = require('../Panel'); + +var Promise = require("bluebird"); + +function ConfigurationAdminPanel(params) { + params.scrollable = true; + Panel.call(this, params); + +} + +ConfigurationAdminPanel.prototype = Object.create(Panel.prototype); +ConfigurationAdminPanel.prototype.constructor = ConfigurationAdminPanel; + +ConfigurationAdminPanel.prototype.init = function() { + +}; + +module.exports = ConfigurationAdminPanel; diff --git a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..32afe0ce966c341775cef682c7c3a589846e8413 --- /dev/null +++ b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js @@ -0,0 +1,22 @@ +"use strict"; + +/* exported logger */ + +var Panel = require('../Panel'); + +var Promise = require("bluebird"); + +function MapsAdminPanel(params) { + params.scrollable = true; + Panel.call(this, params); + +} + +MapsAdminPanel.prototype = Object.create(Panel.prototype); +MapsAdminPanel.prototype.constructor = MapsAdminPanel; + +MapsAdminPanel.prototype.init = function() { + +}; + +module.exports = MapsAdminPanel; diff --git a/frontend-js/src/main/js/gui/admin/ServicesAdminPanel.js b/frontend-js/src/main/js/gui/admin/ServicesAdminPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..a13151a7223b4431fc443c87d91a472017cd6e1e --- /dev/null +++ b/frontend-js/src/main/js/gui/admin/ServicesAdminPanel.js @@ -0,0 +1,22 @@ +"use strict"; + +/* exported logger */ + +var Panel = require('../Panel'); + +var Promise = require("bluebird"); + +function ServicesAdminPanel(params) { + params.scrollable = true; + Panel.call(this, params); + +} + +ServicesAdminPanel.prototype = Object.create(Panel.prototype); +ServicesAdminPanel.prototype.constructor = ServicesAdminPanel; + +ServicesAdminPanel.prototype.init = function() { + +}; + +module.exports = ServicesAdminPanel; diff --git a/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..16277062e1cad1783b2fbc4a815143d7fbd5cc76 --- /dev/null +++ b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js @@ -0,0 +1,22 @@ +"use strict"; + +/* exported logger */ + +var Panel = require('../Panel'); + +var Promise = require("bluebird"); + +function UsersAdminPanel(params) { + params.scrollable = true; + Panel.call(this, params); + +} + +UsersAdminPanel.prototype = Object.create(Panel.prototype); +UsersAdminPanel.prototype.constructor = UsersAdminPanel; + +UsersAdminPanel.prototype.init = function() { + +}; + +module.exports = UsersAdminPanel; diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index 933be3de49a330565fa38e3298f98c7345015ebe..b05b7afac513ea1a7074f59db4b9469bd269332e 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -5,6 +5,7 @@ var functions = require('./Functions'); var IdentifiedElement = require('./map/data/IdentifiedElement'); var AbstractDbOverlay = require('./map/overlay/AbstractDbOverlay'); +var Admin = require('./Admin'); var DbOverlayCollection = require('./map/overlay/DbOverlayCollection'); var ConfigurationType = require('./ConfigurationType'); var CustomMap = require('./map/CustomMap'); @@ -586,9 +587,36 @@ function createExport(params) { }); } +function createAdmin(params) { + params = modifyParamsForTouchInterface(params); + if (!(params instanceof CustomMapOptions)) { + params = new CustomMapOptions(params); + } + initGlobals(params); + params.getElement().style.display = "table"; + params.getElement().innerHTML = "<div style='vertical-align:middle;display:table-cell;text-align: center'>" + + "<img src='resources/images/icons/ajax-loader.gif'/>" + "</div>"; + + var result; + // make sure that we are logged in + return ServerConnector.getToken().then(function() { + return ServerConnector.getConfiguration(); + }).then(function(configuration) { + params.setConfiguration(configuration); + return getProject(params); + }).then(function(project) { + params.setProject(project); + result = new Admin(params); + return result.init(); + }).then(function() { + return result; + }); +} + var minerva = { create : create, createExport : createExport, + createAdmin: createAdmin, ServerConnector : OriginalServerConnector, GuiConnector : OriginalGuiConnector, DualListbox : require('dual-listbox').DualListbox, diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js index 9425790ab9708720eff2d41940ace5093fffc956..e456807931a2a974c718051a3457ae4e85b2b7a2 100644 --- a/frontend-js/src/test/js/minerva-test.js +++ b/frontend-js/src/test/js/minerva-test.js @@ -496,4 +496,16 @@ describe('minerva global', function() { }); }); + it('create Admin', function() { + var options = null; + return ServerConnectorMock.getProject().then(function(project) { + options = helper.createCustomMapOptions(project); + + return minerva.createAdmin(options); + }).then(function(result) { + assert.ok(result); + assert.equal(logger.getWarnings().length, 0); + }); + }); + }); diff --git a/web/src/main/webapp/WEB-INF/security-context.xml b/web/src/main/webapp/WEB-INF/security-context.xml index c1378aa39af79cc4c024ae85f1c9fbb4a63df063..e152ccd84870449b60082b2beddd3014c3e0c54a 100644 --- a/web/src/main/webapp/WEB-INF/security-context.xml +++ b/web/src/main/webapp/WEB-INF/security-context.xml @@ -23,9 +23,7 @@ <security:intercept-url pattern="/login**" access="permitAll"/> <security:intercept-url pattern="/index**" access="permitAll"/> - <security:intercept-url pattern="/miriam**" access="permitAll"/> <security:intercept-url pattern="/export**" access="permitAll"/> - <security:intercept-url pattern="/expire**" access="permitAll"/> <security:intercept-url pattern="/galaxy**" access="permitAll"/> <security:intercept-url pattern="/map**" access="permitAll"/> <security:intercept-url pattern="/map/**" access="permitAll"/> diff --git a/web/src/main/webapp/admin-new.xhtml b/web/src/main/webapp/admin-new.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..4e7805363de34c76de86e07b44d9ff59179d4da8 --- /dev/null +++ b/web/src/main/webapp/admin-new.xhtml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:h="http://java.sun.com/jsf/html" + xmlns:f="http://java.sun.com/jsf/core" + xmlns:ui="http://java.sun.com/jsf/facelets" + xmlns:p="http://primefaces.org/ui"> + +<f:view contentType="text/html"> +<h:head> + <script src="https://maps.google.com/maps/api/js?libraries=drawing&v=3.26" type="text/javascript"/> + + <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"/> + <script src="https://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.min.js" type="text/javascript"/> + + <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> + <script src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script> + + + <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.13/css/jquery.dataTables.min.css"/> + <link rel="stylesheet" type="text/css" href="https://code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"/> + + <link rel="shortcut icon" href="./resources/images/favicon.png" type="image/png" /> + + <h:outputScript library="js" name="minerva.js" /> + + <script type="text/javascript"> +//<![CDATA[ + +function initMap(){ + var element = document.getElementById('minervaAppDiv'); + return minerva.createAdmin({ + element : element, + }).then(function(result){ + customMap = result; + document.title = result.getProject().getName(); + }).catch(function(rejectReason){ + minerva.GuiConnector.alert(rejectReason); + }); +} + +//]]> + </script> +</h:head> +<h:body onload="initMap();" > +<h:outputStylesheet library="css" name="style.css"/> +<h:outputStylesheet library="css" name="minerva.css" /> +<h:outputStylesheet library="css" name="pileup.css"/> +<h:outputStylesheet library="css" name="bootstrap.min.css"/> + + <h:outputScript library="primefaces" name="jquery/jquery.js" target="head" /> + <div id="minervaAppDiv" style="height: 100%;width: 100%;margin: 0;"/> + +</h:body> +</f:view> +</html>