diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js index a09ffb94f0f06043855c2276e63b96fffcfa6f09..da7011f327e098a5ef8726ce679712686bfcc467 100644 --- a/frontend-js/src/main/js/ServerConnector.js +++ b/frontend-js/src/main/js/ServerConnector.js @@ -1631,7 +1631,8 @@ ServerConnector.updateOverlay = function (overlay) { name: overlay.getName(), description: overlay.getDescription(), creator: overlay.getCreator(), - publicOverlay: overlay.getPublicOverlay() + publicOverlay: overlay.getPublicOverlay(), + defaultOverlay: overlay.isDefaultOverlay() } }; return self.sendPatchRequest(self.updateOverlayUrl(queryParams), filterParams); diff --git a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js index 971eabefe339389b03f8f7d3c47c2c90812910b3..e2787d54924ec822a91244b216cfb8c4dca5a2e9 100644 --- a/frontend-js/src/main/js/gui/admin/EditProjectDialog.js +++ b/frontend-js/src/main/js/gui/admin/EditProjectDialog.js @@ -287,6 +287,8 @@ EditProjectDialog.prototype._createOverlayTable = function () { title: 'Description' }, { title: 'Public' + }, { + title: 'Default' }, { title: 'Owner' }, { @@ -536,6 +538,12 @@ EditProjectDialog.prototype.overlayToTableRow = function (overlay, users) { } var publicOverlayCheckbox = "<input type='checkbox' name='publicOverlay-" + id + "' " + checked + "/>"; + checked = ''; + if (overlay.isDefaultOverlay()) { + checked = "checked"; + } + var defaultOverlayCheckbox = "<input type='checkbox' name='defaultOverlay-" + id + "' " + checked + "/>"; + var downloadSourceButton; if (overlay.getInputDataAvailable()) { downloadSourceButton = "<button name='downloadSource' data='" + id + "'>" @@ -548,10 +556,11 @@ EditProjectDialog.prototype.overlayToTableRow = function (overlay, users) { row[1] = "<input name='name-" + id + "' value='" + overlay.getName() + "'/>"; row[2] = "<input name='description-" + id + "' value='" + overlay.getDescription() + "'/>"; row[3] = publicOverlayCheckbox; - row[4] = creatorSelect; - row[5] = downloadSourceButton; - row[6] = "<button name='saveOverlay' data='" + id + "'>SAVE</button>"; - row[7] = "<button name='removeOverlay' data='" + id + "'>REMOVE</button>"; + row[4] = defaultOverlayCheckbox; + row[5] = creatorSelect; + row[6] = downloadSourceButton; + row[7] = "<button name='saveOverlay' data='" + id + "'>SAVE</button>"; + row[8] = "<button name='removeOverlay' data='" + id + "'>REMOVE</button>"; return row; }; @@ -625,6 +634,7 @@ EditProjectDialog.prototype.saveOverlay = function (overlayId) { overlay.setName($("[name='name-" + overlayId + "']", self.getElement())[0].value); overlay.setDescription($("[name='description-" + overlayId + "']", self.getElement())[0].value); overlay.setPublicOverlay($("[name='publicOverlay-" + overlayId + "']", self.getElement())[0].checked); + overlay.setDefaultOverlay($("[name='defaultOverlay-" + overlayId + "']", self.getElement())[0].checked); overlay.setCreator($("[name='creator-" + overlayId + "']", self.getElement())[0].value); return ServerConnector.updateOverlay(overlay); diff --git a/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js b/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js index d6ebbb214bda55b40fb90e0bddb5ac6090dbe514..f463cc86b00bbc855fe243a25577ee2b4d0b5196 100644 --- a/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js +++ b/frontend-js/src/main/js/gui/leftPanel/GuiUtils.js @@ -243,6 +243,16 @@ GuiUtils.prototype.createTextArea = function (value) { return result; }; +GuiUtils.prototype.createCheckbox = function (value) { + var result = document.createElement("input"); + result.type = "checkbox"; + + if (value) { + result.checked = true; + } + return result; +}; + GuiUtils.prototype.createParamLine = function (label, value) { var result = document.createElement("div"); if (value !== undefined && value !== null && value !== "") { diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js index 59a9c11b038ce6328d372d3801fa8aaa8fd67762..1300eb5498d110faf62b3b29a00bbe8323261c28 100644 --- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js +++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js @@ -7,12 +7,11 @@ var Panel = require('../Panel'); var PanelControlElementType = require('../PanelControlElementType'); var GuiConnector = require('../../GuiConnector'); +// noinspection JSUnusedLocalSymbols var logger = require('../../logger'); var Functions = require('../../Functions'); -var NetworkError = require('../../NetworkError'); var Promise = require('bluebird'); -var HttpStatus = require('http-status-codes'); function OverlayPanel(params) { params.panelName = "overlays"; @@ -148,7 +147,7 @@ OverlayPanel.prototype.createOverlayRow = function (overlay, checked) { var guiUtils = self.getGuiUtils(); var result = document.createElement("tr"); - if (checked) { + if (checked && !overlay.getInputDataAvailable()) { result.className = "active"; } @@ -262,11 +261,11 @@ OverlayPanel.prototype.openEditOverlayDialog = function (overlay) { id: overlay.getId(), buttons: buttons, title: "Data overlay: " + overlay.getName(), - className: "minerva-overlay-dialog", + className: "minerva-overlay-dialog" }); }; -OverlayPanel.prototype.refresh = function () { +OverlayPanel.prototype.refresh = function (showDefault) { var self = this; var user = null; @@ -286,65 +285,83 @@ OverlayPanel.prototype.refresh = function () { return ServerConnector.getOverlays({ publicOverlay: false, - creator: user.getLogin(), + creator: user.getLogin() }); - }).then( - function (customOverlays) { + }).then(function (customOverlays) { - var id = self.getMap().getGoogleMap().getMapTypeId().substring(2); + if (!showDefault) { + var id = self.getMap().getGoogleMap().getMapTypeId().replace(/\D/g, ''); selectedOverlay[id] = true; + } - self.clear(); + self.clear(); - var generalOverlays = []; - var overlay; + var generalOverlays = []; + var overlay; - var overlays = self.getMap().getLayouts(); - for (var i = 0; i < overlays.length; i++) { - overlay = overlays[i]; - if (overlay.getCreator() === undefined || overlay.getCreator() === "") { - generalOverlays.push(overlay); + var overlays = self.getMap().getLayouts(); + for (var i = 0; i < overlays.length; i++) { + overlay = overlays[i]; + if (overlay.getCreator() === undefined || overlay.getCreator() === "") { + generalOverlays.push(overlay); + if (showDefault && overlay.isDefaultOverlay()) { + selectedOverlay[overlay.getId()] = true; } } + } + + var table = self.getControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE); + table.appendChild(self.createTableHeader()); - var table = self.getControlElement(PanelControlElementType.OVERLAY_GENERAL_OVERLAY_TABLE); - table.appendChild(self.createTableHeader()); + var body = document.createElement("tbody"); + table.appendChild(body); + for (i = 0; i < generalOverlays.length; i++) { + overlay = generalOverlays[i]; + body.appendChild(self.createOverlayRow(overlay, selectedOverlay[overlay.getId()])); + } - var body = document.createElement("tbody"); + var title = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE); + var addButton = self.getControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON); + if (user.getLogin() === "anonymous") { + title.innerHTML = 'YOU ARE NOT LOGGED IN. PLEASE, <a href="#">LOG IN</a>' + + 'TO UPLOAD AND VIEW CUSTOM OVERLAYS<br/><center><button>LOGIN</button></center>'; + var openLoginDialog = function () { + return self.getParent().getLoginDialog().open(); + }; + $(title).find("a")[0].onclick = openLoginDialog; + $(title).find("button")[0].onclick = openLoginDialog; + addButton.style.display = "none"; + } else { + title.innerHTML = self.getCustomOverlaysMessage(); + addButton.style.display = "block"; + + table = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE); + table.appendChild(self.createTableHeader(true)); + + body = document.createElement("tbody"); table.appendChild(body); - for (i = 0; i < generalOverlays.length; i++) { - overlay = generalOverlays[i]; + for (i = 0; i < customOverlays.length; i++) { + overlay = customOverlays[i]; + if (showDefault && overlay.isDefaultOverlay()) { + selectedOverlay[overlay.getId()] = true; + } body.appendChild(self.createOverlayRow(overlay, selectedOverlay[overlay.getId()])); } + } - var title = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TITLE); - var addButton = self.getControlElement(PanelControlElementType.OVERLAY_ADD_OVERLAY_BUTTON); - if (user.getLogin() === "anonymous") { - title.innerHTML = 'YOU ARE NOT LOGGED IN. PLEASE, <a href="#">LOG IN</a>' - + 'TO UPLOAD AND VIEW CUSTOM OVERLAYS<br/><center><button>LOGIN</button></center>'; - var openLoginDialog = function () { - return self.getParent().getLoginDialog().open(); - }; - $(title).find("a")[0].onclick = openLoginDialog; - $(title).find("button")[0].onclick = openLoginDialog; - addButton.style.display = "none"; - } else { - title.innerHTML = self.getCustomOverlaysMessage(); - addButton.style.display = "block"; - - table = self.getControlElement(PanelControlElementType.OVERLAY_CUSTOM_OVERLAY_TABLE); - table.appendChild(self.createTableHeader(true)); + self.onresize(); - body = document.createElement("tbody"); - table.appendChild(body); - for (i = 0; i < customOverlays.length; i++) { - overlay = customOverlays[i]; - body.appendChild(self.createOverlayRow(overlay, selectedOverlay[overlay.getId()])); + var promises = []; + if (showDefault) { + for (var key in selectedOverlay) { + if (selectedOverlay.hasOwnProperty(key) && selectedOverlay[key]) { + logger.debug(key); + promises.push(self.getMap().openDataOverlay(key)); } } - - self.onresize(); - }); + } + return Promise.all(promises); + }); }; OverlayPanel.prototype.setCustomOverlaysMessage = function (customOverlaysMessage) { @@ -364,7 +381,7 @@ OverlayPanel.prototype.openAddOverlayDialog = function () { self._addOverlayDialog = new AddOverlayDialog({ project: self.getProject(), customMap: self.getMap(), - element: document.createElement("div"), + element: document.createElement("div") }); self._addOverlayDialog.addListener("onAddOverlay", function (e) { self.getMap().getModel().addLayout(e.arg); @@ -376,7 +393,11 @@ OverlayPanel.prototype.openAddOverlayDialog = function () { }; OverlayPanel.prototype.init = function () { - return this.refresh(); + var backgroundOverlay = ServerConnector.getSessionData().getSelectedBackgroundOverlay(); + var showDefault = (backgroundOverlay === undefined || backgroundOverlay === "undefined"); + logger.debug(ServerConnector.getSessionData().getSelectedBackgroundOverlay()); + logger.debug(showDefault); + return this.refresh(showDefault); }; OverlayPanel.prototype.destroy = function () { diff --git a/frontend-js/src/main/js/map/data/LayoutData.js b/frontend-js/src/main/js/map/data/LayoutData.js index bbf8483f1f5c7e2c3e4d620a6a785f8027194171..ff680edb956b0c4e4294793856e38ed26821eb88 100644 --- a/frontend-js/src/main/js/map/data/LayoutData.js +++ b/frontend-js/src/main/js/map/data/LayoutData.js @@ -24,6 +24,7 @@ function LayoutData(layoutId, name) { this.setContent(object.content); this.setFilename(object.filename); this.setPublicOverlay(object.publicOverlay); + this.setDefaultOverlay(object.defaultOverlay); this.setInputDataAvailable(object.inputDataAvailable); this.setType(object.type); if (!this.getInputDataAvailable()) { @@ -194,6 +195,14 @@ LayoutData.prototype.setPublicOverlay = function (publicOverlay) { this._publicOverlay = publicOverlay; }; +LayoutData.prototype.isDefaultOverlay = function () { + return this._defaultOverlay; +}; + +LayoutData.prototype.setDefaultOverlay = function (defaultOverlay) { + this._defaultOverlay = defaultOverlay; +}; + LayoutData.prototype.getContent = function () { return this._content; }; diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index 71b007ad67a6e48c7b97fdd0b4538765c3c4668a..7d4b44a5a1bced8389c427c75e431691a0162d12 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -320,11 +320,11 @@ function create(params) { return mapContextMenu.init(); }).then(function () { if (GuiConnector.getParams["layout"] !== undefined) { - var layouts = params.getProject().getModel().getLayouts(); - for (var j = 0; j < layouts.length; j++) { - var layout = layouts[j]; - if (layout.getName() === GuiConnector.getParams["layout"]) { - return customMap.openDataOverlay(layout); + var overlays = params.getProject().getModel().getLayouts(); + for (var j = 0; j < overlays.length; j++) { + var overlay = overlays[j]; + if (overlay.getName() === GuiConnector.getParams["layout"]) { + return customMap.openDataOverlay(overlay); } } } diff --git a/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js index 6e16c5a8811ec1cca06f7f218153fd2633b108ef..886be165571c46a0af9a93f43501f18653bb575e 100644 --- a/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js +++ b/frontend-js/src/test/js/gui/admin/EditProjectDialog-test.js @@ -1,10 +1,9 @@ "use strict"; -/* exported assert */ -/* exported logger */ require("../../mocha-config"); var EditProjectDialog = require('../../../../main/js/gui/admin/EditProjectDialog'); +var ServerConnector = require('../../ServerConnector-mock'); var logger = require('../../logger'); var assert = require('assert'); @@ -23,6 +22,7 @@ describe('EditProjectDialog', function () { }); return dialog.open(); }).then(function () { + assert.equal(0, logger.getWarnings().length); dialog.destroy(); }); }); diff --git a/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js b/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js index fc269f84926f0aab6fe081e53974dd1bf9e5824f..b6faaa7c7aa0fe615aeac69b9e20b88ab10a5929 100644 --- a/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js +++ b/frontend-js/src/test/js/gui/leftPanel/OverlayPanel-test.js @@ -10,99 +10,99 @@ var logger = require('../../logger'); describe('OverlayPanel', function () { - it('constructor', function () { - var map = helper.createCustomMap(); - - new OverlayPanel({ - element: testDiv, - customMap: map - }); - assert.equal(logger.getWarnings().length, 0); + it('constructor', function () { + var map = helper.createCustomMap(); + + new OverlayPanel({ + element: testDiv, + customMap: map }); + assert.equal(logger.getWarnings().length, 0); + }); - it('refresh', function () { - var map = helper.createCustomMap(); + it('refresh', function () { + var map = helper.createCustomMap(); - var panel = new OverlayPanel({ - element: testDiv, - customMap: map - }); + var panel = new OverlayPanel({ + element: testDiv, + customMap: map + }); - return panel.refresh().then(function () { - assert.ok(panel.getElement().innerHTML.indexOf("testLayout") >= 0); - assert.ok(panel.getElement().innerHTML.indexOf("YOU ARE NOT LOGGED") >= 0); - }); + return panel.refresh().then(function () { + assert.ok(panel.getElement().innerHTML.indexOf("testLayout") >= 0); + assert.ok(panel.getElement().innerHTML.indexOf("YOU ARE NOT LOGGED") >= 0); }); + }); - it('createRow', function () { - var map = helper.createCustomMap(); - - var overlay = helper.createLayout(); - overlay.setInputDataAvailable(true); - overlay.setCreator("me"); - map.getModel().addLayout(overlay); - - var panel = new OverlayPanel({ - element: testDiv, - customMap: map - }); - - var row = panel.createOverlayRow(overlay); - assert.ok(row); - - var buttons = row.getElementsByTagName("button"); - var openButton = null; - for (var i = 0; i < buttons.length; i++) { - var name = buttons[i].getAttribute("name"); - if (name !== undefined && name.indexOf("editButton") >= 0) { - openButton = buttons[i]; - } - } - assert.ok(openButton); - openButton.onclick(); - return panel.destroy(); + it('createRow', function () { + var map = helper.createCustomMap(); + + var overlay = helper.createLayout(); + overlay.setInputDataAvailable(true); + overlay.setCreator("me"); + map.getModel().addLayout(overlay); + + var panel = new OverlayPanel({ + element: testDiv, + customMap: map }); - it('download', function () { - var map = helper.createCustomMap(); - - var overlay = helper.createLayout(); - overlay.setInputDataAvailable(true); - map.getModel().addLayout(overlay); - - var panel = new OverlayPanel({ - element: testDiv, - customMap: map - }); - - return panel.refresh().then(function () { - var buttons = panel.getElement().getElementsByTagName("button"); - var downloadButton; - for (var i = 0; i < buttons.length; i++) { - var name = buttons[i].getAttribute("name"); - if (name !== undefined && name !== null && name.indexOf("download-overlay") >= 0) { - downloadButton = buttons[i]; - } - } - assert.ok(downloadButton); - assert.notOk(panel.getLastDownloadUrl()); - return downloadButton.onclick(); - }).then(function () { - assert.ok(panel.getLastDownloadUrl()); - }); + + var row = panel.createOverlayRow(overlay); + assert.ok(row); + + var buttons = row.getElementsByTagName("button"); + var openButton = null; + for (var i = 0; i < buttons.length; i++) { + var name = buttons[i].getAttribute("name"); + if (name !== undefined && name.indexOf("editButton") >= 0) { + openButton = buttons[i]; + } + } + assert.ok(openButton); + openButton.onclick(); + return panel.destroy(); + }); + it('download', function () { + var map = helper.createCustomMap(); + + var overlay = helper.createLayout(); + overlay.setInputDataAvailable(true); + map.getModel().addLayout(overlay); + + var panel = new OverlayPanel({ + element: testDiv, + customMap: map }); - it('openAddOverlayDialog', function () { - var map = helper.createCustomMap(); + return panel.refresh().then(function () { + var buttons = panel.getElement().getElementsByTagName("button"); + var downloadButton; + for (var i = 0; i < buttons.length; i++) { + var name = buttons[i].getAttribute("name"); + if (name !== undefined && name !== null && name.indexOf("download-overlay") >= 0) { + downloadButton = buttons[i]; + } + } + assert.ok(downloadButton); + assert.notOk(panel.getLastDownloadUrl()); + return downloadButton.onclick(); + }).then(function () { + assert.ok(panel.getLastDownloadUrl()); + }); + }); - var panel = new OverlayPanel({ - element: testDiv, - customMap: map - }); + it('openAddOverlayDialog', function () { + var map = helper.createCustomMap(); + + var panel = new OverlayPanel({ + element: testDiv, + customMap: map + }); - return panel.openAddOverlayDialog().then(function () { - return panel.destroy(); - }); + return panel.openAddOverlayDialog().then(function () { + return panel.destroy(); }); + }); }); diff --git a/frontend-js/testFiles/apiCalls/projects/all/overlays/14081/PATCH_overlay.name=Pathways and compartments&overlay.publicOverlay=true&token=MOCK_TOKEN_ID& b/frontend-js/testFiles/apiCalls/projects/all/overlays/14081/PATCH_overlay.defaultOverlay=false&overlay.name=Pathways and compartments&overlay.publicOverlay=true&token=MOCK_TOKEN_ID& similarity index 100% rename from frontend-js/testFiles/apiCalls/projects/all/overlays/14081/PATCH_overlay.name=Pathways and compartments&overlay.publicOverlay=true&token=MOCK_TOKEN_ID& rename to frontend-js/testFiles/apiCalls/projects/all/overlays/14081/PATCH_overlay.defaultOverlay=false&overlay.name=Pathways and compartments&overlay.publicOverlay=true&token=MOCK_TOKEN_ID&