diff --git a/CHANGELOG b/CHANGELOG index 309805f5fa9a0b621a22b1647ef74175854ff34d..903e067c1df6858cb4664e9fc76c094f19cb0bcf 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,8 @@ minerva (12.2.0~alpha.0) stable; urgency=medium * Bug fix: export/import to/from SBML handles Heterodimer Association reaction properly * Small improvement: export to SBML includes unit factors + * Feature: url GET parameters support all kind of search and selected overlays + highligh minerva (12.1.3) stable; urgency=medium diff --git a/frontend-js/src/main/css/global.css b/frontend-js/src/main/css/global.css index c4707dce0155faf7e80eb3b38537e0092c22be97..d6566bc39c280ae8ea4504d5c7799f35e9471938 100644 --- a/frontend-js/src/main/css/global.css +++ b/frontend-js/src/main/css/global.css @@ -36,6 +36,20 @@ transition: background-color 0.4s ease-in-out 0s; } +.minerva-header .minerva-loading-div { + display: none; + float: right; +} + +.minerva-header .minerva-loading-div img { + height: 35px; +} + +.minerva-header .minerva-menu-link { + padding-right: 5px; + float: right; +} + .minerva-checkbox-grid li { display: block; float: left; diff --git a/frontend-js/src/main/js/Export.js b/frontend-js/src/main/js/Export.js index fa7484677ee79c57857590a742b91cf751e81a46..fd8dd9261c316b1709123354c0142eded1389dda 100644 --- a/frontend-js/src/main/js/Export.js +++ b/frontend-js/src/main/js/Export.js @@ -55,7 +55,8 @@ Export.prototype._createGui = function () { element: headerDiv, customMap: null, project: self.getProject(), - configuration: self.getConfiguration() + configuration: self.getConfiguration(), + serverConnector: self.getServerConnector() }); self.getElement().appendChild(headerDiv); diff --git a/frontend-js/src/main/js/GuiConnector.js b/frontend-js/src/main/js/GuiConnector.js index b15a812aaf317e9537f6f26afa06b8b32de0b8df..e3bc805638c1c8c823601d0abb0b20576ef198f8 100644 --- a/frontend-js/src/main/js/GuiConnector.js +++ b/frontend-js/src/main/js/GuiConnector.js @@ -8,7 +8,6 @@ var Functions = require('./Functions'); var SecurityError = require('./SecurityError'); var ValidationError = require('./ValidationError'); var GuiMessageError = require('./gui/GuiMessageError'); -var NetworkError = require('./NetworkError'); /** * This static global object contains set of functions that returns/set data in @@ -51,7 +50,7 @@ GuiConnector.prototype.init = function () { return d >= 0 && this.lastIndexOf(pattern) === d; }; } - // noinspection PointlessBooleanExpressionJS + // noinspection PointlessBooleanExpressionJS,JSUnresolvedVariable var isIE = /* @cc_on!@ */false || !!document.documentMode; if (isIE) { @@ -107,6 +106,44 @@ GuiConnector.prototype.init = function () { } }; } + newUrl = ""; +}; + + +var newUrl = ""; + +setInterval(function () { + if (global.window !== undefined && newUrl !== "") { + if (!global.window.location.href.endsWith(newUrl)) { + global.window.history.replaceState(null, null, newUrl); + } + } +}, 250); + + +/** + * + * @param {string} key + * @param {string} value + */ +GuiConnector.prototype.setUrlParam = function (key, value) { + var self = this; + if (value === null || value === "") { + value = undefined; + } + if (self.getParams[key] !== value) { + self.getParams[key] = value; + var url = window.location.pathname + '?'; + for (var getParamKey in self.getParams) { + if (self.getParams.hasOwnProperty(getParamKey)) { + var getParamValue = self.getParams[getParamKey]; + if (getParamValue !== undefined) { + url += getParamKey + "=" + getParamValue + "&"; + } + } + } + newUrl = url; + } }; /** @@ -351,6 +388,7 @@ GuiConnector.prototype.destroy = function () { } if (self._warnDialog !== undefined) { $(self._warnDialog).dialog("destroy").remove(); + self._warnDialog = undefined; } if (self._processingDialog !== undefined) { $(self._processingDialog).dialog("destroy").remove(); @@ -371,7 +409,7 @@ GuiConnector.prototype.destroy = function () { * @param {string} message */ GuiConnector.prototype.warn = function (message) { - var self = GuiConnector; + var self = returnThisOrSingleton(this); logger.warn(message); if (self._warnDialog === undefined) { self._warnDialog = document.createElement("div"); diff --git a/frontend-js/src/main/js/ObjectWithListeners.js b/frontend-js/src/main/js/ObjectWithListeners.js index 219b102584047cffa147a2700984cd134a2cb59b..ce215052b81963637019ccfa8ef6b18fda616414 100644 --- a/frontend-js/src/main/js/ObjectWithListeners.js +++ b/frontend-js/src/main/js/ObjectWithListeners.js @@ -16,8 +16,12 @@ function ObjectWithListeners() { /** * @callback ListenerCallback - * @param event + * @param {Object} event + * @param {string} event.type + * @param {ObjectWithListeners} event.object + * @param {Object} event.arg */ + /** * Adds a listener function to the object. * diff --git a/frontend-js/src/main/js/gui/Header.js b/frontend-js/src/main/js/gui/Header.js index d0b472d0785c53cbb61b8b96d4c5f5c9ca0c6acd..da36929e10484acbb8465a18826c1d1cca3a91d7 100644 --- a/frontend-js/src/main/js/gui/Header.js +++ b/frontend-js/src/main/js/gui/Header.js @@ -3,7 +3,6 @@ /* exported logger */ var AbstractGuiElement = require('./AbstractGuiElement'); -var GuiConnector = require('../GuiConnector'); var PanelControlElementType = require('./PanelControlElementType'); var Functions = require('../Functions'); var OptionsMenu = require('./OptionsMenu'); @@ -18,8 +17,9 @@ var xss = require('xss'); * @param {Object} params * @param {HTMLElement} params.element * @param {CustomMap} params.customMap + * @param {boolean} [params.optionsMenu=false] * @param {Configuration} params.configuration - * @param {Project} params.project + * @param {Project} [params.project] * @param {ServerConnector} [params.serverConnector] * * @constructor @@ -31,12 +31,8 @@ function Header(params) { var self = this; var guiParams = { - adminLink: true, optionsMenu: params.optionsMenu }; - if (params.adminLink !== undefined) { - guiParams.adminLink = params.adminLink; - } self._createHeaderGui(guiParams); } @@ -47,7 +43,6 @@ Header.prototype.constructor = Header; /** * * @param {Object} guiParams - * @param {boolean} guiParams.adminLink * @param {boolean} guiParams.optionsMenu * @private */ @@ -60,28 +55,24 @@ Header.prototype._createHeaderGui = function (guiParams) { var loadingDiv = Functions.createElement({ type: "div", - style: "display:none; " + className: "minerva-loading-div" }); - loadingDiv.style.float = "right"; var loadingImg = Functions.createElement({ type: "img", src: 'resources/images/icons/ajax-loader.gif' }); - loadingImg.style.height = "35px"; loadingDiv.appendChild(loadingImg); this.setControlElement(PanelControlElementType.FOOTER_LOADING_DIV, loadingDiv); - if (guiParams.adminLink) { - var link = Functions.createElement({ - type: "a", - style: "padding-right:15px; float:right", - content: '<i class="fa fa-lock" style="font-size:17px"></i> ', - xss: false - }); - link.href = ServerConnector.getServerBaseUrl() + "admin.xhtml?id=" + projectId; - self.getElement().appendChild(link); - } + var link = Functions.createElement({ + type: "a", + style: "padding-right:15px; float:right", + content: '<i class="fa fa-lock" style="font-size:17px"></i> ', + xss: false + }); + link.href = self.getServerConnector().getServerBaseUrl() + "admin.xhtml?id=" + projectId; + self.getElement().appendChild(link); if (guiParams.optionsMenu) { var optionsElement = Functions.createElement({type: "ul"}); @@ -94,10 +85,10 @@ Header.prototype._createHeaderGui = function (guiParams) { var menuLink = Functions.createElement({ type: "a", - style: "padding-right:5px; float:right", + className: "minerva-menu-link", content: '<i class="fa fa-bars" style="font-size:17px"></i> ', href: "#", - onclick: function (e) { + onclick: function () { var link = $(menuLink); var offset = link.offset(); @@ -120,7 +111,7 @@ Header.prototype._createHeaderGui = function (guiParams) { content: '<i class="fa fa-home" style="font-size:17px"></i> ' + projectName, xss: false }); - homeLink.href = ServerConnector.getServerBaseUrl() + "?id=" + projectId; + homeLink.href = self.getServerConnector().getServerBaseUrl() + "?id=" + projectId; self.getElement().appendChild(homeLink); }; @@ -158,7 +149,7 @@ Header.prototype.init = function () { self._loadMessages = []; self._onDataLoadStart = function (e) { self.addLoadMessage(e.arg); - div.style.display = "block"; + $(div).show(); div.title = e.arg; }; @@ -167,11 +158,11 @@ Header.prototype.init = function () { if (self._loadMessages.length > 0) { div.title = self._loadMessages[0]; } else { - div.style.display = "none"; + $(div).hide(); } }; - ServerConnector.addListener("onDataLoadStart", self._onDataLoadStart); - ServerConnector.addListener("onDataLoadStop", self._onDataLoadStop); + self.getServerConnector().addListener("onDataLoadStart", self._onDataLoadStart); + self.getServerConnector().addListener("onDataLoadStop", self._onDataLoadStop); resolve(); }); }; @@ -182,8 +173,8 @@ Header.prototype.init = function () { Header.prototype.destroy = function () { var self = this; if (self._onDataLoadStart) { - ServerConnector.removeListener("onDataLoadStart", self._onDataLoadStart); - ServerConnector.removeListener("onDataLoadStop", self._onDataLoadStop); + self.getServerConnector().removeListener("onDataLoadStart", self._onDataLoadStart); + self.getServerConnector().removeListener("onDataLoadStop", self._onDataLoadStop); } if (self._optionsMenu !== undefined) { document.body.removeChild(self._optionsMenu.getElement()); diff --git a/frontend-js/src/main/js/gui/OptionsMenu.js b/frontend-js/src/main/js/gui/OptionsMenu.js index 959335c3f2c6e37523f4a527e289f6d6efafb3e7..7155aacd73f9fc7b689a6af231617fea4a76a900 100644 --- a/frontend-js/src/main/js/gui/OptionsMenu.js +++ b/frontend-js/src/main/js/gui/OptionsMenu.js @@ -10,7 +10,7 @@ var Promise = require('bluebird'); * @param {HTMLElement} params.element * @param {CustomMap} params.customMap * @param {Configuration} params.configuration - * @param {Project} params.project + * @param {Project} [params.project] * @param {ServerConnector} [params.serverConnector] * * @constructor diff --git a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js index 77cde470d08e121e9e8ffebcb1f98ccd9e442c49..2f1266695f14b3a9a7f32dd625394eb43d8bc345 100644 --- a/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js +++ b/frontend-js/src/main/js/gui/leftPanel/LeftPanel.js @@ -18,6 +18,7 @@ var SearchPanel = require('./SearchPanel'); var SubmapPanel = require('./SubmapPanel'); var Functions = require('../../Functions'); +// noinspection JSUnusedLocalSymbols var logger = require('../../logger'); /** diff --git a/frontend-js/src/main/js/gui/topMenu/TopMenu.js b/frontend-js/src/main/js/gui/topMenu/TopMenu.js index 713ea5cbc2161f165f2af1bba5b8199f1e8354ac..a1ccf8e4bfe0b0908c0e15f57d05062755aef473 100644 --- a/frontend-js/src/main/js/gui/topMenu/TopMenu.js +++ b/frontend-js/src/main/js/gui/topMenu/TopMenu.js @@ -31,6 +31,7 @@ function TopMenu(params) { AbstractGuiElement.call(this, params); var self = this; + self.registerListenerType("onShowCommentsToggle"); self._createGui(); self._cronFunction = function () { @@ -195,7 +196,9 @@ TopMenu.prototype.init = function () { } else { $(refreshCommentButton).css("display", "none"); } - return self.getMap().refreshComments().then(null, GuiConnector.alert); + return self.getMap().refreshComments().then(function () { + return self.callListeners("onShowCommentsToggle", commentCheckbox.checked); + }).catch(GuiConnector.alert); }; refreshCommentButton.onclick = (function () { return function () { diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js index 4209da61ba51c7513b497764a73ae3f79db68773..bfc79ed439828157436e634882804b352972d56c 100644 --- a/frontend-js/src/main/js/map/CustomMap.js +++ b/frontend-js/src/main/js/map/CustomMap.js @@ -45,6 +45,7 @@ function CustomMap(options) { this.registerListenerType("onShowOverlay"); this.registerListenerType("onHideOverlay"); this.registerListenerType("onBackgroundOverlayChange"); + this.registerListenerType("onSubmapOpen"); // @type {boolean[]} this._selectedOverlays = []; @@ -479,11 +480,12 @@ CustomMap.prototype.openSubmap = function (id) { return self.refreshMarkers(); }); } + }).then(function (value) { + return self.callListeners("onSubmapOpen", {mapId: id}); }); } else { return Promise.resolve(); } - }; /** @@ -1218,26 +1220,26 @@ CustomMap.prototype.getDistance = function (params) { if (element.getY() <= y && element.getY() + element.getHeight() >= y) { return 0; } else { - return Math.min( - Math.abs(element.getY() - y), - Math.abs(element.getY() + element.getHeight() - y) + return Math.min( + Math.abs(element.getY() - y), + Math.abs(element.getY() + element.getHeight() - y) ); } } else if (element.getY() <= y && element.getY() + element.getHeight() >= y) { - return Math.min( - Math.abs(element.getX() - x), - Math.abs(element.getX() + element.getWidth() - x) + return Math.min( + Math.abs(element.getX() - x), + Math.abs(element.getX() + element.getWidth() - x) ); } else { var elementX = element.getX(); var elementY = element.getY(); var elementWidth = element.getWidth(); var elementHeight = element.getHeight(); - return Math.min( - Functions.distance(p1, new Point(elementX, y)), - Functions.distance(p1, new Point(elementX + elementWidth, elementY)), - Functions.distance(p1, new Point(elementX, elementY + elementHeight)), - Functions.distance(p1, new Point(elementX + elementWidth, elementY + elementHeight)) + return Math.min( + Functions.distance(p1, new Point(elementX, y)), + Functions.distance(p1, new Point(elementX + elementWidth, elementY)), + Functions.distance(p1, new Point(elementX, elementY + elementHeight)), + Functions.distance(p1, new Point(elementX + elementWidth, elementY + elementHeight)) ); } } else if (element instanceof Reaction) { diff --git a/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js b/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js index 46e8a6d43509b3c1f1253e1d6daaddb5b2c8fa2d..9be86716daf868493c5aa935da9ca52f34e476e9 100644 --- a/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js +++ b/frontend-js/src/main/js/map/overlay/AbstractDbOverlay.js @@ -169,7 +169,8 @@ AbstractDbOverlay.prototype.searchByQuery = function (originalQuery, perfect, fi return self.callListeners('onSearch', { fitBounds: fitBounds, identifiedElements: res, - type: AbstractDbOverlay.QueryType.SEARCH_BY_QUERY + type: AbstractDbOverlay.QueryType.SEARCH_BY_QUERY, + query: originalQuery }); }).then(function () { return res; diff --git a/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js b/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js index 68c15f0929562f79e611c9f576ee69f54d96edf6..4dd244a74b572cc3e706c62c0a24acfcf6d260fa 100644 --- a/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js +++ b/frontend-js/src/main/js/map/overlay/SearchDbOverlay.js @@ -237,12 +237,16 @@ SearchDbOverlay.prototype.searchByCoordinates = function (params) { ServerConnector.getSessionData().setSearchQuery(query); + console.log(zoom); if (self._elementsByQuery[query] !== undefined) { self.setQueries([query]); return self.callListeners('onSearch', { fitBounds: false, identifiedElements: [self._elementsByQuery[query]], - type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES + type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES, + coordinates: coordinates, + modelId: modelId, + zoom: zoom }).then(function () { return Promise.resolve(self._elementsByQuery[query]); }); @@ -311,7 +315,10 @@ SearchDbOverlay.prototype.searchByCoordinates = function (params) { return self.callListeners('onSearch', { fitBounds: params.fitBounds, identifiedElements: [self._elementsByQuery[query]], - type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES + type: AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES, + coordinates: params.coordinates, + modelId: modelId, + zoom: zoom }); }).then(function () { return self._elementsByQuery[query]; diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index 9a82fd917fd643cd9e60c9eea3a9818b8cf4f5d2..547a64bb24b20eeeba4d0c4e4e4b5d5c1cddbc88 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -57,14 +57,48 @@ function processUrlGetParams(params) { sessionData.setZoomLevel(model, GuiConnector.getParams["zoom"]); } + if (GuiConnector.getParams["background"] !== undefined) { + sessionData.setSelectedBackgroundOverlay(GuiConnector.getParams["background"]); + } + + if (GuiConnector.getParams["overlays"] !== undefined) { + sessionData.setVisibleOverlays(GuiConnector.getParams["overlays"].split(",")); + } + if (GuiConnector.getParams["comments"] === "on") { sessionData.setShowComments(true); } + var query; if (GuiConnector.getParams["search"] !== undefined) { - var query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY, + query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY, GuiConnector.getParams["search"]); sessionData.setSearchQuery(query); } + if (GuiConnector.getParams["drugSearch"] !== undefined) { + query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY, + GuiConnector.getParams["drugSearch"]); + sessionData.setDrugQuery(query); + } + if (GuiConnector.getParams["chemicalSearch"] !== undefined) { + query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY, + GuiConnector.getParams["chemicalSearch"]); + sessionData.setChemicalQuery(query); + } + if (GuiConnector.getParams["mirnaSearch"] !== undefined) { + query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_QUERY, + GuiConnector.getParams["mirnaSearch"]); + sessionData.setMiRnaQuery(query); + } + if (GuiConnector.getParams["searchCoordinates"] !== undefined) { + var array = GuiConnector.getParams["searchCoordinates"].split(","); + var x = parseInt(array[0]); + var y = parseInt(array[1]); + var searchModelId = parseInt(array[2]); + var searchZoom = parseInt(array[3]); + query = SearchDbOverlay.prototype.encodeQuery(AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES, + searchModelId, new Point(x, y), searchZoom); + sessionData.setSearchQuery(query); + } } @@ -317,6 +351,107 @@ function assignSplitBarHandler(customMap, pluginManager) { }); } +/** + * + * @param {CustomMap} customMap + */ +function addUrlChangeListenersToCustomMap(customMap) { + customMap.addListener("onSubmapOpen", function (event) { + GuiConnector.setUrlParam("submap", event.arg.mapId.toString()); + }); + var onCenterChangedHandler = function (event) { + if (event.object.getId() !== customMap.getId()) { + GuiConnector.setUrlParam("submap", event.object.getId().toString()); + } else { + GuiConnector.setUrlParam("submap", ""); + } + GuiConnector.setUrlParam("x", Math.round(event.arg.x).toString()); + // noinspection JSSuspiciousNameCombination + GuiConnector.setUrlParam("y", Math.round(event.arg.y).toString()); + }; + + var onZoomChangedHandler = function (event) { + if (event.object.getId() !== customMap.getId()) { + GuiConnector.setUrlParam("submap", event.object.getId().toString()); + } else { + GuiConnector.setUrlParam("submap", ""); + } + GuiConnector.setUrlParam("zoom", event.arg.toString()); + }; + + customMap.addListener("onCenterChanged", onCenterChangedHandler); + customMap.addListener("onZoomChanged", onZoomChangedHandler); + + customMap.getSubmaps().forEach(function (submap) { + submap.addListener("onCenterChanged", onCenterChangedHandler); + submap.addListener("onZoomChanged", onZoomChangedHandler); + }); + + customMap.getOverlayByName("search").addListener("onSearch", function (e) { + GuiConnector.setUrlParam("search", undefined); + GuiConnector.setUrlParam("searchCoordinates", undefined); + if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_COORDINATES) { + // noinspection JSSuspiciousNameCombination + GuiConnector.setUrlParam("searchCoordinates", Math.round(e.arg.coordinates.x) + "," + Math.round(e.arg.coordinates.y) + "," + + e.arg.modelId + "," + e.arg.zoom); + } else if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) { + GuiConnector.setUrlParam("search", e.arg.query); + } + }); + + customMap.getOverlayByName("drug").addListener("onSearch", function (e) { + if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) { + GuiConnector.setUrlParam("drugSearch", e.arg.query); + } + }); + + customMap.getOverlayByName("mirna").addListener("onSearch", function (e) { + if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) { + GuiConnector.setUrlParam("mirnaSearch", e.arg.query); + } + }); + + customMap.getOverlayByName("chemical").addListener("onSearch", function (e) { + if (e.arg.type === AbstractDbOverlay.QueryType.SEARCH_BY_QUERY) { + GuiConnector.setUrlParam("chemicalSearch", e.arg.query); + } + }); + + + var onOverlaysChangedHandler = function () { + return customMap.getVisibleDataOverlays().then(function (dataOverlays) { + var ids = []; + for (var i = 0; i < dataOverlays.length; i++) { + ids.push(dataOverlays[i].getId()); + } + GuiConnector.setUrlParam("overlays", ids.join(",")); + }) + }; + + customMap.addListener("onShowOverlay", onOverlaysChangedHandler); + customMap.addListener("onHideOverlay", onOverlaysChangedHandler); + + customMap.addListener("onBackgroundOverlayChange", function (event) { + GuiConnector.setUrlParam("background", event.arg); + }); + + +} + +/** + * + * @param {TopMenu} topMenu + */ +function addUrlChangeListenersToTopMenu(topMenu) { + topMenu.addListener("onShowCommentsToggle", function (event) { + if (event.arg) { + GuiConnector.setUrlParam("comments", "on"); + } else { + GuiConnector.setUrlParam("comments", ""); + } + }); +} + /** * * @param {CustomMapOptions|*} params @@ -417,7 +552,7 @@ function create(params) { return customMap.init(); }).then(function () { - return insertGoogleAnalyticsCode(customMap); + return insertGoogleAnalyticsCode(); }).then(function () { return leftPanel.init(); }).then(function () { @@ -429,11 +564,16 @@ function create(params) { }).then(function () { return mapContextMenu.init(); }).then(function () { + addUrlChangeListenersToCustomMap(customMap); + addUrlChangeListenersToTopMenu(topMenu); + if (GuiConnector.getParams["layout"] !== undefined) { var overlays = params.getProject().getDataOverlays(); for (var j = 0; j < overlays.length; j++) { var overlay = overlays[j]; if (overlay.getName() === GuiConnector.getParams["layout"]) { + GuiConnector.warn("'layout' GET parameter in url is deprecated. Please use 'overlays' GET param instead (take a look at current url)"); + GuiConnector.setUrlParam("layout", undefined); return customMap.openDataOverlay(overlay); } } @@ -464,6 +604,8 @@ function create(params) { return leftPanel.destroy().then(function () { customMap.destroy(); return topMenu.destroy(); + }).then(function () { + return GuiConnector.destroy(); }); }, getProject: function () { diff --git a/frontend-js/src/test/js/gui/Header-test.js b/frontend-js/src/test/js/gui/Header-test.js index 090b9a3870f5755c9cb86e33106b1a95009def81..eb76c462261d10ba821f3a89102a43db25eb4a2c 100644 --- a/frontend-js/src/test/js/gui/Header-test.js +++ b/frontend-js/src/test/js/gui/Header-test.js @@ -16,27 +16,18 @@ describe('Header', function () { new Header({ element: testDiv, + configuration: helper.getConfiguration(), customMap: map }); assert.equal(logger.getWarnings().length, 0); assert.equal(1, $(".fa-lock", $(testDiv)).length); }); - it('without admin-link', function () { - var map = helper.createCustomMap(); - - new Header({ - element: testDiv, - customMap: map, - adminLink: false - }); - assert.equal(logger.getWarnings().length, 0); - assert.equal(0, $(".fa-lock", $(testDiv)).length); - }); it('with options-link', function () { var map = helper.createCustomMap(); var header = new Header({ element: testDiv, + configuration: helper.getConfiguration(), customMap: map, optionsMenu: true }); @@ -51,6 +42,7 @@ describe('Header', function () { var header = new Header({ element: testDiv, + configuration: helper.getConfiguration(), customMap: map }); @@ -59,4 +51,24 @@ describe('Header', function () { }); }); + it('open menu', function () { + var map = helper.createCustomMap(); + + var header = new Header({ + element: testDiv, + configuration: helper.getConfiguration(), + customMap: map, + optionsMenu: true + }); + + return header.init().then(function () { + assert.ok($(".dropdown-menu").css('display') === 'none'); + return $(".minerva-menu-link", testDiv)[0].onclick(); + }).then(function () { + assert.notOk($(".dropdown-menu").css('display') === 'none'); + return header.destroy(); + }); + }); + + }); diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js index 5d5ba8387b15c92e3dd9fa6a1d7a67194a6be827..166feb4183022a2f435f83609dbd0e3bcfdca5b9 100644 --- a/frontend-js/src/test/js/minerva-test.js +++ b/frontend-js/src/test/js/minerva-test.js @@ -7,7 +7,7 @@ var Promise = require("bluebird"); var minerva = require('../../main/js/minerva'); var SecurityError = require('../../main/js/SecurityError'); var ServerConnectorMock = require('./ServerConnector-mock'); -var Point= require('../../main/js/map/canvas/Point'); +var Point = require('../../main/js/map/canvas/Point'); var ProxyAccessPlugin = require('./plugin/ProxyAccessPlugin'); var chai = require('chai'); @@ -126,31 +126,67 @@ describe('minerva global', function () { }); }); - it('create with overlay', function () { - var overlay, project, plugin, map; - return ServerConnectorMock.getProject().then(function (result) { - project = result; - var options = helper.createCustomMapOptions(project); + describe('create with overlay', function () { + it('background as layout param in URL', function () { + var overlay, project, plugin, map; + return ServerConnectorMock.getProject().then(function (result) { + project = result; + var options = helper.createCustomMapOptions(project); - plugin = new ProxyAccessPlugin({}); - options.getPlugins().push(plugin); + plugin = new ProxyAccessPlugin({}); + options.getPlugins().push(plugin); - overlay = project.getDataOverlays()[1]; + overlay = project.getDataOverlays()[1]; - helper.setUrl("http://test/?layout=" + overlay.getName()); + helper.setUrl("http://test/?layout=" + overlay.getName()); - return minerva.create(options); - }).then(function (result) { - map = result; - assert.ok(result); - // input file is not available so it's the background - return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays(); - }).then(function (visibleDataOverlays) { - // input file is available so it's not the background file but overlay - assert.equal(visibleDataOverlays.length, 0); - assert.equal(ServerConnectorMock.getSessionData(project).getSelectedBackgroundOverlay(), overlay.getId()); - assert.equal(logger.getWarnings().length, 0); - return map.destroy(); + return minerva.create(options); + }).then(function (result) { + map = result; + assert.ok(result); + // input file is not available so it's the background + return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays(); + }).then(function (visibleDataOverlays) { + // input file is available so it's not the background file but overlay + assert.equal(visibleDataOverlays.length, 0); + assert.equal(ServerConnectorMock.getSessionData(project).getSelectedBackgroundOverlay(), overlay.getId()); + assert.equal(logger.getWarnings().length, 1); + return map.destroy(); + }); + }); + it('overlay as layout param in URL', function () { + helper.setUrl("http://test/?layout=xxx"); + var globalObject, plugin; + return ServerConnectorMock.getProject().then(function (project) { + var options = helper.createCustomMapOptions(project); + plugin = new ProxyAccessPlugin(); + options.getPlugins().push(plugin); + return minerva.create(options); + }).then(function (result) { + globalObject = result; + assert.ok(result); + return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays(); + }).then(function (visibleDataOverlays) { + // input file is available so it's not the background file but overlay + assert.equal(visibleDataOverlays.length, 1); + assert.equal(logger.getWarnings().length, 1); + return globalObject.destroy(); + }); + }); + it('layout from session data', function () { + var layout; + return ServerConnectorMock.getProject().then(function (project) { + var options = helper.createCustomMapOptions(project); + + layout = project.getDataOverlays()[1]; + + ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId()); + + return minerva.create(options); + }).then(function (result) { + assert.equal(ServerConnectorMock.getSessionData().getSelectedBackgroundOverlay(), layout.getId()); + return result.destroy(); + }); }); }); @@ -175,41 +211,6 @@ describe('minerva global', function () { }); }); - it('create with layout from session data', function () { - var layout; - return ServerConnectorMock.getProject().then(function (project) { - var options = helper.createCustomMapOptions(project); - - layout = project.getDataOverlays()[1]; - - ServerConnectorMock.getSessionData(project).setSelectedBackgroundOverlay(layout.getId()); - - return minerva.create(options); - }).then(function (result) { - assert.equal(ServerConnectorMock.getSessionData().getSelectedBackgroundOverlay(), layout.getId()); - return result.destroy(); - }); - }); - - it('create with layout 2', function () { - helper.setUrl("http://test/?layout=xxx"); - var globalObject, plugin; - return ServerConnectorMock.getProject().then(function (project) { - var options = helper.createCustomMapOptions(project); - plugin = new ProxyAccessPlugin(); - options.getPlugins().push(plugin); - return minerva.create(options); - }).then(function (result) { - globalObject = result; - assert.ok(result); - return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays(); - }).then(function (visibleDataOverlays) { - // input file is available so it's not the background file but overlay - assert.equal(visibleDataOverlays.length, 1); - assert.equal(logger.getWarnings().length, 0); - return globalObject.destroy(); - }); - }); it('create with search overlay and GET search param', function () { helper.setUrl("http://test/?search=s1"); diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js index c4bc6e3a92b212f3c54ab8511b16afd9c774fdd9..72f180aafbd82593ad38a86d65fd54c52d177b2a 100644 --- a/frontend-js/src/test/js/mocha-config.js +++ b/frontend-js/src/test/js/mocha-config.js @@ -199,6 +199,7 @@ before(function () { }); beforeEach(function () { + Helper.prototype.setUrl.call(this, "http://test/"); window.onresize = undefined; @@ -219,8 +220,6 @@ beforeEach(function () { return ServerConnector.getConfiguration().then(function (configuration) { global.helper = new Helper(configuration); - helper.setUrl("http://test/"); - GuiConnector.init(); }).catch(function (error) { logger.error(error); throw error;