diff --git a/frontend-js/src/main/js/gui/ContextMenu.js b/frontend-js/src/main/js/gui/ContextMenu.js index c45f45e80b007f0be4085871d3fa00c1079d94b3..80d2ed8064b8ea7e2b6680b56392eddb2bd4485e 100644 --- a/frontend-js/src/main/js/gui/ContextMenu.js +++ b/frontend-js/src/main/js/gui/ContextMenu.js @@ -79,9 +79,17 @@ ContextMenu.prototype.hide = function() { $(this.getElement()).hide(); }; +function extractDataOverlayIds(dataOverlays) { + var ids = []; + for (var i = 0; i < dataOverlays.length; i++) { + ids.push(dataOverlays[i].getId()); + } + return ids; +} + ContextMenu.prototype.createExportAsImageSubmenu = function() { var self = this; - return ServerConnector.getImageConverters().then(function(converters){ + return ServerConnector.getImageConverters().then(function(converters) { var li = Functions.createElement({ type : "li" }); @@ -92,18 +100,21 @@ ContextMenu.prototype.createExportAsImageSubmenu = function() { }); var map = self.getMap(); - converters.forEach(function(converter){ - submenu.addOption(converter.name, function(){ - return ServerConnector.getImageDownloadUrl({ - polygonString: map.getSelectedPolygon(), - modelId: map.getActiveSubmapId(), - handlerClass: converter.handler, - backgroundOverlayId: map.getGoogleMap().getMapTypeId(), - zoomLevel:map. getGoogleMap().getZoom(), - overlayIds: map.getSelectedLayouts(), - }).then(function(url){ + converters.forEach(function(converter) { + submenu.addOption(converter.name, function() { + return map.getVisibleDataOverlays().then(function(visibleDataOverlays) { + + return ServerConnector.getImageDownloadUrl({ + polygonString : map.getSelectedPolygon(), + modelId : map.getActiveSubmapId(), + handlerClass : converter.handler, + backgroundOverlayId : map.getGoogleMap().getMapTypeId(), + zoomLevel : map.getGoogleMap().getZoom(), + overlayIds : extractDataOverlayIds(visibleDataOverlays), + }); + }).then(function(url) { return self.downloadFile(url); - }).catch(GuiConnector.alert); + }).then(null, GuiConnector.alert); }); }); return submenu; @@ -112,7 +123,7 @@ ContextMenu.prototype.createExportAsImageSubmenu = function() { ContextMenu.prototype.createExportAsModelSubmenu = function() { var self = this; - return ServerConnector.getModelConverters().then(function(converters){ + return ServerConnector.getModelConverters().then(function(converters) { var li = Functions.createElement({ type : "li" }); @@ -123,18 +134,20 @@ ContextMenu.prototype.createExportAsModelSubmenu = function() { }); var map = self.getMap(); - converters.forEach(function(converter){ - submenu.addOption(converter.name, function(){ - return ServerConnector.getModelDownloadUrl({ - polygonString: map.getSelectedPolygon(), - modelId: map.getActiveSubmapId(), - handlerClass: converter.handler, - backgroundOverlayId: map.getGoogleMap().getMapTypeId(), - zoomLevel:map. getGoogleMap().getZoom(), - overlayIds: map.getSelectedLayouts(), - }).then(function(url){ + converters.forEach(function(converter) { + submenu.addOption(converter.name, function() { + return map.getVisibleDataOverlays().then(function(visibleDataOverlays) { + return ServerConnector.getModelDownloadUrl({ + polygonString : map.getSelectedPolygon(), + modelId : map.getActiveSubmapId(), + handlerClass : converter.handler, + backgroundOverlayId : map.getGoogleMap().getMapTypeId(), + zoomLevel : map.getGoogleMap().getZoom(), + overlayIds : extractDataOverlayIds(visibleDataOverlays), + }); + }).then(function(url) { return self.downloadFile(url); - }).catch(GuiConnector.alert); + }).then(null, GuiConnector.alert); }); }); return submenu; diff --git a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js index 8a914feb625fcbd0f8ae862c47a7339e1de7ac90..3af19f332ae04132266da0066cba0c169101bd65 100644 --- a/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js +++ b/frontend-js/src/main/js/gui/leftPanel/OverlayPanel.js @@ -237,20 +237,22 @@ OverlayPanel.prototype.refresh = function() { var user = null; var overlayTypes = []; + var selectedOverlay = []; return ServerConnector.getOverlayTypes().then(function(types) { overlayTypes = types; return ServerConnector.getLoggedUser(); }).then(function(loggedUser) { user = loggedUser; + return self.getMap().getVisibleDataOverlays(); + }).then(function(visibleDataOverlays) { + for (var j = 0; j < visibleDataOverlays.length; j++) { + selectedOverlay[visibleDataOverlays[j].getId()] = true; + } + return ServerConnector.getOverlays(); }).then(function(customOverlays) { - var selectedOverlayIds = self.getMap().getSelectedLayouts(); - var selectedOverlay = []; - for (var j = 0; j < selectedOverlayIds.length; j++) { - selectedOverlay[selectedOverlayIds[j]] = true; - } var id = self.getMap().getGoogleMap().getMapTypeId().substring(2); selectedOverlay[id] = true; diff --git a/frontend-js/src/main/js/map/AbstractCustomMap.js b/frontend-js/src/main/js/map/AbstractCustomMap.js index b3f7cd08c55e97ec965287f78834e9d9ee58d141..6c6e637c90a09c43ddcc8261222a026ff0b6b1d9 100644 --- a/frontend-js/src/main/js/map/AbstractCustomMap.js +++ b/frontend-js/src/main/js/map/AbstractCustomMap.js @@ -665,15 +665,11 @@ AbstractCustomMap.prototype._openInfoWindowForAlias = function(aliasId) { * {@link Alias} in all currently visualized layouts */ AbstractCustomMap.prototype.getAliasVisibleLayoutsData = function(aliasId) { - var layoutIds = this.getTopMap().getSelectedLayouts(); - var promises = []; - for (var i = 0; i < layoutIds.length; i++) { - promises.push(this.getModel().getLayoutDataById(layoutIds[i])); - } - return Promise.all(promises).then(function(layouts) { + var self = this; + return self.getTopMap().getVisibleDataOverlays().then(function(visibleDataOverlays) { var result = []; - for (var i = 0; i < layouts.length; i++) { - var layout = layouts[i]; + for (var i = 0; i < visibleDataOverlays.length; i++) { + var layout = visibleDataOverlays[i]; if (layout !== null && layout !== undefined) { result.push(layout.getFullAliasById(aliasId)); } else { diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js index 282aea9044b3e8cba58ce42ba8de39ac1d961694..9759aea82818fdce466b28a226784450d2ac9c3f 100644 --- a/frontend-js/src/main/js/map/CustomMap.js +++ b/frontend-js/src/main/js/map/CustomMap.js @@ -226,27 +226,34 @@ CustomMap.prototype.openDataOverlay = function(param) { if (index === null) { throw new Error("You have no privileges for selected overlay"); } else { - if (overlayToOpen.getInputDataAvailable()) { - if (self._selectedOverlays[identifier] === true) { - logger.warn("Overlay " + identifier + " already selected"); - return Promise.resolve(); + return overlayToOpen.init().then(function() { + if (overlayToOpen.getInputDataAvailable()) { + if (self._selectedOverlays[identifier] === true) { + logger.warn("Overlay " + identifier + " already selected"); + return Promise.resolve(); + } else { + self._selectedOverlays[identifier] = true; + return self.getVisibleDataOverlays().then(function(visibleDataOverlays) { + var ids = []; + for (var i = 0; i < visibleDataOverlays.length; i++) { + ids.push(visibleDataOverlays[i].getId()); + } + ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(ids); + return self.refreshSelectedLayouts(); + }); + + } } else { - self._selectedOverlays[identifier] = true; - ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(self.getSelectedLayouts()); - return self.getModel().initLayoutDataByLayoutId(identifier).then(function() { - return self.refreshSelectedLayouts(); - }); - } - } else { - this.getGoogleMap().setMapTypeId(identifier.toString()); + self.getGoogleMap().setMapTypeId(identifier.toString()); - var submaps = self.getSubmaps(); - for (var i = 0; i < submaps.length; i++) { - var submap = submaps[i]; - submap.openDataOverlay(submap.getModel().getLayouts()[index].getId()); + var submaps = self.getSubmaps(); + for (var i = 0; i < submaps.length; i++) { + var submap = submaps[i]; + submap.openDataOverlay(submap.getModel().getLayouts()[index].getId()); + } + return Promise.resolve(); } - return Promise.resolve(); - } + }); } }; @@ -419,23 +426,23 @@ CustomMap.prototype.openSubmap = function(id) { submap.open(dialogDiv); // we have to perform it on top map, because on submaps id is different - this.openDataOverlay(this.getGoogleMap().getMapTypeId()); - - // now we have to visualize layouts - var layouts = []; - - // get list of layouts - for ( var key in this._selectedOverlays) { - if (this._selectedOverlays.hasOwnProperty(key) && this._selectedOverlays[key] === true) { - layouts.push(key); + return this.openDataOverlay(self.getGoogleMap().getMapTypeId()).then(function() { + // now we have to visualize layouts + var layouts = []; + + // get list of layouts + for ( var key in self._selectedOverlays) { + if (self._selectedOverlays.hasOwnProperty(key) && self._selectedOverlays[key] === true) { + layouts.push(key); + } } - } - // show layouts that should be visualized (resize or show them) - for (var i = 0; i < layouts.length; i++) { - var layoutId = layouts[i]; - submap._showSelectedLayout(layoutId, i, layouts.length); - } + // show layouts that should be visualized (resize or show them) + for (var i = 0; i < layouts.length; i++) { + var layoutId = layouts[i]; + submap._showSelectedLayout(layoutId, i, layouts.length); + } + }); } }; @@ -464,7 +471,6 @@ CustomMap.prototype.customizeGoogleMapView = function(div) { } }; - /** * Creates listeners for google.maps.Map object that will actualize the data in * user session. @@ -525,24 +531,6 @@ CustomMap.prototype.removeSelection = function() { } }; -/** - * Returns list of layouts that are selected and visualized by javascript. - * - * @return array with a list of selected layotus - * - */ -CustomMap.prototype.getSelectedLayouts = function() { - var layouts = []; - - // get list of layouts - for ( var key in this._selectedOverlays) { - if (this._selectedOverlays.hasOwnProperty(key) && this._selectedOverlays[key] === true) { - layouts.push(key); - } - } - return layouts; -}; - /** * Removes layout from visualization. * @@ -551,14 +539,24 @@ CustomMap.prototype.getSelectedLayouts = function() { * */ CustomMap.prototype.removeSelectedLayout = function(identifier) { + var self = this; logger.debug("Removing layout: " + identifier); if (this._selectedOverlays[identifier] !== true) { logger.warn("Overlay " + identifier + " is not selected"); + return Promise.resolve(); } else { - this._selectedOverlays[identifier] = false; - this.refreshSelectedLayouts(); - ServerConnector.getSessionData(this.getProject()).setVisibleOverlays(this.getSelectedLayouts()); + self._selectedOverlays[identifier] = false; + return self.refreshSelectedLayouts().then(function() { + return self.getVisibleDataOverlays(); + }).then(function(visibleDataOverlays) { + var ids = []; + for (var i = 0; i < visibleDataOverlays.length; i++) { + ids.push(visibleDataOverlays[i].getId()); + } + ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(ids); + return self.refreshSelectedLayouts(); + }); } }; @@ -568,28 +566,29 @@ CustomMap.prototype.removeSelectedLayout = function(identifier) { CustomMap.prototype.refreshSelectedLayouts = function() { logger.debug("Refreshing layouts"); var self = this; - var layouts = self.getSelectedLayouts(); - // show layouts that should be visualized (resize or show them) - var promises = []; - for (var i = 0; i < layouts.length; i++) { - var layoutId = layouts[i]; - if (self.layoutContainsOverlays(layoutId)) { - // resize element on the map - promises.push(self.resizeSelectedLayout(layoutId, i, layouts.length)); - } else { - promises.push(self.showSelectedLayout(layoutId, i, layouts.length)); + return self.getVisibleDataOverlays().then(function(visibleDataOverlays) { + // show layouts that should be visualized (resize or show them) + var promises = []; + for (var i = 0; i < visibleDataOverlays.length; i++) { + var layoutId = visibleDataOverlays[i].getId(); + if (self.layoutContainsOverlays(layoutId)) { + // resize element on the map + promises.push(self.resizeSelectedLayout(layoutId, i, visibleDataOverlays.length)); + } else { + promises.push(self.showSelectedLayout(layoutId, i, visibleDataOverlays.length)); + } } - } - return Promise.all(promises).then(function() { - // remove layouts that were - for ( var key in self.selectedLayoutOverlays) { - if (!self._selectedOverlays.hasOwnProperty(key) || self._selectedOverlays[key] === false) { - if (self.layoutContainsOverlays(key)) { - self.hideSelectedLayout(key); + return Promise.all(promises).then(function() { + // remove layouts that were + for ( var key in self.selectedLayoutOverlays) { + if (!self._selectedOverlays.hasOwnProperty(key) || self._selectedOverlays[key] === false) { + if (self.layoutContainsOverlays(key)) { + self.hideSelectedLayout(key); + } } } - } - return self.refreshInfoWindows(); + return self.refreshInfoWindows(); + }); }); }; @@ -1277,9 +1276,8 @@ CustomMap.prototype.getVisibleDataOverlays = function() { dataOverlayPromises.push(this.getModel().getLayoutDataById(key)); } } - + return Promise.all(dataOverlayPromises); }; - module.exports = CustomMap; diff --git a/frontend-js/src/main/js/map/data/LayoutData.js b/frontend-js/src/main/js/map/data/LayoutData.js index 3275fc9312ae5ad3f78804ef6c3e5fee79a8f0e6..a31227f460dcbf779f5ee24a5c5a3778011a32f4 100644 --- a/frontend-js/src/main/js/map/data/LayoutData.js +++ b/frontend-js/src/main/js/map/data/LayoutData.js @@ -24,6 +24,9 @@ function LayoutData(layoutId, name) { this.setDescription(object.description); this.setCreator(object.creator); this.setInputDataAvailable(object.inputDataAvailable); + if (!this.getInputDataAvailable()) { + this.setInitialized(true); + } } else { // default two param call this.setId(layoutId); diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js index fa2ccf0a065bdfe6f8b8d4deff2489f412a20300..65800e99dc8b194e995e9580ace6446ac6cde5c3 100644 --- a/frontend-js/src/main/js/minerva.js +++ b/frontend-js/src/main/js/minerva.js @@ -168,8 +168,8 @@ function getOverlayByName(customMap, dbOverlayName) { } function createResult(customMap) { return { - getSelectedDataOverlays : function() { - return customMap.getSelectedLayouts(); + getVisibleDataOverlays : function() { + return customMap.getVisibleDataOverlays(); }, addListener : function(dbOverlayName, type, callback) { var dbOverlay = getOverlayByName(customMap, dbOverlayName); diff --git a/frontend-js/src/test/js/gui/SelectionContextMentu-test.js b/frontend-js/src/test/js/gui/SelectionContextMentu-test.js index a0101d9c5f206ec06b379df5a879f9aa1f3a2891..44e6562fdd79be2ef14738070cc9d8da6cd19ec7 100644 --- a/frontend-js/src/test/js/gui/SelectionContextMentu-test.js +++ b/frontend-js/src/test/js/gui/SelectionContextMentu-test.js @@ -50,4 +50,24 @@ describe('SelectionContextMenu', function() { map.destroy(); }); }); + + it('download cell designer file', function() { + var map; + return ServerConnector.getProject().then(function(project) { + map = helper.createCustomMap(project); + + var contextMenu = new SelectionContextMenu({ + element : testDiv, + customMap : map + }); + return contextMenu.init(); + }).then(function(){ + map.setActiveSubmapId(map.getProject().getModel().getId()); + map.setActiveSubmapClickCoordinates(new google.maps.Point(2, 12)); + var handler = $($("a:contains('CellDesigner')", $(testDiv))[0]).data("handler"); + return handler(); + }).then(function() { + map.destroy(); + }); + }); }); diff --git a/frontend-js/src/test/js/map/CustomMap-test.js b/frontend-js/src/test/js/map/CustomMap-test.js index 90e95a14fb85acc77823dfe7ea14d5cbcb0926e5..02bea72b160a0fc934babb204b675aff56e99a62 100644 --- a/frontend-js/src/test/js/map/CustomMap-test.js +++ b/frontend-js/src/test/js/map/CustomMap-test.js @@ -117,10 +117,12 @@ describe('CustomMap', function() { var map = helper.createCustomMap(); var layout = helper.createLayout(); layout.setInitialized(true); + layout.setInputDataAvailable(true); map.getModel().addLayout(layout); return map.openDataOverlay(layout.getId()).then(function() { - map.removeSelectedLayout(layout.getId()); + return map.removeSelectedLayout(layout.getId()); + }).then(function() { var vLayouts = ServerConnector.getSessionData(map.getProject()).getVisibleOverlays(); assert.equal(0, vLayouts.length); }); @@ -173,16 +175,19 @@ describe('CustomMap', function() { var projectId = "complex_model_with_submaps"; helper.setUrl("http://test/?id=" + projectId); GuiConnector.getParams["id"] = projectId; + var customMap; + var emptySubmodelId = 16730; + var filledSubmodelId = 16731; + var overlayId = 18083; + return ServerConnector.getProject(projectId).then(function(project) { var options = helper.createCustomMapOptions(project); - var customMap = new CustomMap(options); - var overlayId = 18083; - - var emptySubmodelId = 16730; - var filledSubmodelId = 16731; - - customMap.openSubmap(emptySubmodelId); - customMap.openSubmap(filledSubmodelId); + customMap = new CustomMap(options); + + return customMap.openSubmap(emptySubmodelId); + }).then(function() { + return customMap.openSubmap(filledSubmodelId); + }).then(function() { var emptySubmap = customMap.getSubmapById(emptySubmodelId); var filledSubmap = customMap.getSubmapById(filledSubmodelId); diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js index 8f3f9bb82c881d4542c59b02e8f164b0108abb69..dd7ba497f36b0b331fd82d0bb627d8f63dff67ad 100644 --- a/frontend-js/src/test/js/minerva-test.js +++ b/frontend-js/src/test/js/minerva-test.js @@ -105,7 +105,10 @@ describe('minerva global', function() { return minerva.create(options).then(function(result) { assert.ok(result); // input file is not available so it's the background - assert.equal(result.getSelectedDataOverlays().length, 0); + return result.getVisibleDataOverlays(); + }).then(function(visibleDataOverlays){ + // input file is available so it's not the background file but overlay + assert.equal(visibleDataOverlays.length, 0); assert.equal(ServerConnector.getSessionData(project).getSelectedBackgroundOverlay(), layoutId); assert.equal(logger.getWarnings().length, 0); }); @@ -146,8 +149,10 @@ describe('minerva global', function() { return minerva.create(options).then(function(result) { assert.ok(result); + return result.getVisibleDataOverlays(); + }).then(function(visibleDataOverlays){ // input file is available so it's not the background file but overlay - assert.equal(result.getSelectedDataOverlays().length, 1); + assert.equal(visibleDataOverlays.length, 1); assert.equal(logger.getWarnings().length, 0); }); });