From a652fe5e4568f39467abcee0a0e01a0a78d77a77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Brunner?= Date: Wed, 18 Jul 2018 12:40:58 +0200 Subject: [PATCH 01/23] Removes unwanted hardcoded mobile interface --- contribs/gmf/src/search/component.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/contribs/gmf/src/search/component.js b/contribs/gmf/src/search/component.js index c5e52e71f569..b86246ea150c 100644 --- a/contribs/gmf/src/search/component.js +++ b/contribs/gmf/src/search/component.js @@ -732,14 +732,12 @@ exports.SearchController_ = class { prepare: (query, settings) => { const url = settings.url; const lang = gettextCatalog.currentLanguage; - const interfaceName = 'mobile'; // FIXME dynamic interfaces settings.xhrFields = { withCredentials: true }; settings.url = olUri.appendParams(url, { 'query': query, 'lang': lang, - 'interface': interfaceName }); return settings; } From 90c73e9aa0e9834ed1398bd1b728b9e488dce9df Mon Sep 17 00:00:00 2001 From: Laurent Lienher Date: Wed, 18 Jul 2018 16:46:14 +0200 Subject: [PATCH 02/23] Fix print layers when opacity background layer is a layer group --- src/map/LayerHelper.js | 36 +++++++++++++++++++++++++++--------- src/print/Service.js | 24 ++++++++++++++++++------ 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/src/map/LayerHelper.js b/src/map/LayerHelper.js index dce1bed41f41..dd52eb5728bf 100644 --- a/src/map/LayerHelper.js +++ b/src/map/LayerHelper.js @@ -4,7 +4,7 @@ import googAsserts from 'goog/asserts.js'; import * as olArray from 'ol/array.js'; import olFormatWMTSCapabilities from 'ol/format/WMTSCapabilities.js'; -import olLayerGroup from 'ol/layer/Group.js'; +import OlLayerGroup from 'ol/layer/Group.js'; import olLayerImage from 'ol/layer/Image.js'; import olLayerTile from 'ol/layer/Tile.js'; import * as olObj from 'ol/obj.js'; @@ -241,7 +241,7 @@ exports.prototype.createWMTSLayerFromCapabilititesObj = function( * @export */ exports.prototype.createBasicGroup = function(opt_layers) { - const group = new olLayerGroup(); + const group = new OlLayerGroup(); if (opt_layers) { group.setLayers(opt_layers); } @@ -287,26 +287,44 @@ exports.prototype.getGroupFromMap = function(map, groupName) { * @export */ exports.prototype.getFlatLayers = function(layer) { - return this.getFlatLayers_(layer, []); + if (layer instanceof OlLayerGroup) { + const sublayers = layer.getLayers().getArray(); + const hasGroupLayer = sublayers.some(sublayer => sublayer instanceof OlLayerGroup); + if (!hasGroupLayer) { + return sublayers.slice(); + } + } + return this.getFlatLayers_(layer, [], undefined); }; /** * Get an array of all layers in a group. The group can contain multiple levels - * of others groups. + * of others groups. When we flatten a group, we get the child layers. + * If opacity is defined on the group, this value is lost. + * Computed opacity is a custom 'back-up' value that contains + * the calculated value of all ancestors and the given layer. * @param {ol.layer.Base} layer The base layer, mostly a group of layers. * @param {Array.} array An array to add layers. + * @param {number|undefined} computedOpacity Opacity inherited from ancestor layer groups. * @return {Array.} Layers. * @private */ -exports.prototype.getFlatLayers_ = function(layer, array) { - if (layer instanceof olLayerGroup) { +exports.prototype.getFlatLayers_ = function(layer, array, computedOpacity) { + const opacity = layer.getOpacity(); + if (computedOpacity !== undefined) { + computedOpacity *= opacity; + } else { + computedOpacity = opacity; + } + if (layer instanceof OlLayerGroup) { const sublayers = layer.getLayers(); sublayers.forEach((l) => { - this.getFlatLayers_(l, array); + this.getFlatLayers_(l, array, computedOpacity); }); } else { if (array.indexOf(layer) < 0) { + layer.set('inheritedOpacity', computedOpacity, true); array.push(layer); } } @@ -326,7 +344,7 @@ exports.prototype.getFlatLayers_ = function(layer, array) { exports.prototype.getLayerByName = function(layerName, layers) { let found = null; layers.some((layer) => { - if (layer instanceof olLayerGroup) { + if (layer instanceof OlLayerGroup) { const sublayers = layer.getLayers().getArray(); found = this.getLayerByName(layerName, sublayers); } else if (layer.get('layerNodeName') === layerName) { @@ -440,7 +458,7 @@ exports.prototype.refreshWMSLayer = function(layer) { * @param {number} ZIndex The ZIndex for children element. */ exports.prototype.setZIndexToFirstLevelChildren = function(element, ZIndex) { - if (!(element instanceof olLayerGroup)) { + if (!(element instanceof OlLayerGroup)) { return; } const innerGroupLayers = element.getLayers(); diff --git a/src/print/Service.js b/src/print/Service.js index 822306645729..bd2043549c1d 100644 --- a/src/print/Service.js +++ b/src/print/Service.js @@ -238,19 +238,19 @@ exports.prototype.encodeImageWmsLayer_ = function(arr, layer) { const url = source.getUrl(); if (url !== undefined) { this.encodeWmsLayer_( - arr, layer.getOpacity(), url, source.getParams()); + arr, layer, url, source.getParams()); } }; /** * @param {Array.} arr Array. - * @param {number} opacity Opacity of the layer. + * @param {ol.layer.Image} layer The layer. * @param {string} url Url of the WMS server. * @param {Object} params Url parameters * @private */ -exports.prototype.encodeWmsLayer_ = function(arr, opacity, url, params) { +exports.prototype.encodeWmsLayer_ = function(arr, layer, url, params) { if (url.startsWith('//')) { url = window.location.protocol + url; } @@ -280,7 +280,7 @@ exports.prototype.encodeWmsLayer_ = function(arr, opacity, url, params) { customParams: customParams, serverType: params['SERVERTYPE'], type: 'wms', - opacity: opacity, + opacity: this.getOpacityOrInherited_(layer), version: params['VERSION'], useNativeAngle: this.printNativeAngle_, }); @@ -360,7 +360,7 @@ exports.prototype.encodeTileWmtsLayer_ = function(arr, layer) { layer: source.getLayer(), matrices: matrices, matrixSet: source.getMatrixSet(), - opacity: layer.getOpacity(), + opacity: this.getOpacityOrInherited_(layer), requestEncoding: source.getRequestEncoding(), style: source.getStyle(), type: 'WMTS', @@ -383,7 +383,7 @@ exports.prototype.encodeTileWmsLayer_ = function(arr, layer) { googAsserts.assertInstanceof(source, olSourceTileWMS); this.encodeWmsLayer_( - arr, layer.getOpacity(), source.getUrls()[0], source.getParams()); + arr, layer, source.getUrls()[0], source.getParams()); }; @@ -399,6 +399,18 @@ exports.prototype.getWmtsUrl_ = function(source) { return exports.getAbsoluteUrl_(urls[0]); }; +/** + * Return an opacity value for the specified layer. + * @param {ol.layer.Base} layer Layer. + * @returns {number} opacity Opacity value. + * @private + */ +exports.prototype.getOpacityOrInherited_ = function(layer) { + if (layer.get('inheritedOpacity') !== undefined) { + return layer.get('inheritedOpacity'); + } + return layer.getOpacity(); +}; /** * Send a create report request to the MapFish Print service. From 8e74705f61d140e80bff1061146fa20fd1344480 Mon Sep 17 00:00:00 2001 From: Benjamin Gerber Date: Wed, 25 Jul 2018 13:06:09 +0200 Subject: [PATCH 03/23] Fix position of the query grid (app) GSGMF-565 --- contribs/gmf/src/query/grid.less | 1 + 1 file changed, 1 insertion(+) diff --git a/contribs/gmf/src/query/grid.less b/contribs/gmf/src/query/grid.less index 11688d3c856a..b30a9ab4e4be 100644 --- a/contribs/gmf/src/query/grid.less +++ b/contribs/gmf/src/query/grid.less @@ -9,6 +9,7 @@ border-top: solid 1px black; background-color: white; height: @grid-height; + position: fixed; .ngeo-grid-table-container { height: @table-height; From b36783615ecb081d7558ba02b84684602a22dd0b Mon Sep 17 00:00:00 2001 From: Benjamin Gerber Date: Wed, 25 Jul 2018 14:42:01 +0200 Subject: [PATCH 04/23] Update legend on (map resolution) change GSGMF-517 --- contribs/gmf/src/layertree/component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contribs/gmf/src/layertree/component.html b/contribs/gmf/src/layertree/component.html index 0db3412a7705..3cf9d8b74da2 100644 --- a/contribs/gmf/src/layertree/component.html +++ b/contribs/gmf/src/layertree/component.html @@ -228,8 +228,8 @@ {{'Hide legend'|translate}}
-
-

{{title|translate}}

+
+

{{title|translate}}

From f1cf7a8d5ef5958e0417aa084e7b5ea10734b4d4 Mon Sep 17 00:00:00 2001 From: Laurent Lienher Date: Wed, 25 Jul 2018 15:14:42 +0200 Subject: [PATCH 05/23] Fix group translation in notifications --- contribs/gmf/src/services/treemanager.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contribs/gmf/src/services/treemanager.js b/contribs/gmf/src/services/treemanager.js index 4d2e80e6dee0..4a4baea54a11 100644 --- a/contribs/gmf/src/services/treemanager.js +++ b/contribs/gmf/src/services/treemanager.js @@ -407,7 +407,7 @@ gmf.TreeManager.prototype.notifyCantAddGroups_ = function(groups) { const names = []; const gettextCatalog = this.gettextCatalog_; groups.forEach((group) => { - names.push(group.name); + names.push(gettextCatalog.getString(group.name)); }); const msg = (names.length < 2) ? gettextCatalog.getString('group is already loaded.') : From a1666cd62059f953ed126b7020c4a71581823965 Mon Sep 17 00:00:00 2001 From: Benjamin Gerber Date: Wed, 25 Jul 2018 15:47:27 +0200 Subject: [PATCH 06/23] Inform user if the imported file is not valid GSGMF-467 --- .../src/datasource/ExternalDataSourcesManager.js | 14 ++++++++++++-- .../gmf/src/import/importdatasourceComponent.html | 8 +++++--- .../gmf/src/import/importdatasourceComponent.js | 7 ++++++- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/contribs/gmf/src/datasource/ExternalDataSourcesManager.js b/contribs/gmf/src/datasource/ExternalDataSourcesManager.js index 09d4cf96957d..7d6a01b3b14b 100644 --- a/contribs/gmf/src/datasource/ExternalDataSourcesManager.js +++ b/contribs/gmf/src/datasource/ExternalDataSourcesManager.js @@ -464,9 +464,11 @@ const exports = class { /** * @param {!File} file File. + * @param {function(boolean):*?} opt_callback Callback called with true if the file is loaded and added. + * Otherwise with false. * @export */ - createAndAddDataSourceFromFile(file) { + createAndAddDataSourceFromFile(file, opt_callback) { this.getFileDataSource_(file).then( (dataSource) => { const fileGroup = this.fileGroup_; @@ -488,9 +490,17 @@ const exports = class { // (5) Finally, add it to the ngeo collection this.dataSources_.push(dataSource); + + // call the callback. + if (opt_callback) { + opt_callback(true); + } }, (rejections) => { - googAsserts.fail(`Failed to load file: ${file.name}`); + console.error(`Failed to load file: ${file.name}`); + if (opt_callback) { + opt_callback(false); + } } ); } diff --git a/contribs/gmf/src/import/importdatasourceComponent.html b/contribs/gmf/src/import/importdatasourceComponent.html index 7f19b382ad7b..2ae8e776d4de 100644 --- a/contribs/gmf/src/import/importdatasourceComponent.html +++ b/contribs/gmf/src/import/importdatasourceComponent.html @@ -2,7 +2,8 @@
@@ -42,9 +43,10 @@ title="{{'Load a file from local' | translate}}" type="submit" ng-click="idsl_form.$valid && $ctrl.load()" - ng-disabled="$ctrl.file === undefined" + ng-disabled="$ctrl.file === undefined || $ctrl.hasError" > - {{'Load local file' | translate}} + {{'Load local file' | translate}} + {{'Unable to load the file' | translate}} diff --git a/contribs/gmf/src/import/importdatasourceComponent.js b/contribs/gmf/src/import/importdatasourceComponent.js index 902bdf4f8e5c..ea84b24c2454 100644 --- a/contribs/gmf/src/import/importdatasourceComponent.js +++ b/contribs/gmf/src/import/importdatasourceComponent.js @@ -290,6 +290,7 @@ exports.Controller_ = class { * @export */ browse() { + this.hasError = false; this.element_.find('input[type=file][name=file]').click(); } @@ -338,7 +339,11 @@ exports.Controller_ = class { */ load() { const file = googAsserts.assert(this.file); - this.gmfExternalDataSourcesManager_.createAndAddDataSourceFromFile(file); + this.gmfExternalDataSourcesManager_.createAndAddDataSourceFromFile(file, (success) => { + if (!success) { + this.hasError = true; + } + }); } /** From 6bb6609a5c48d9dc41f1e3db18d50c42619767a8 Mon Sep 17 00:00:00 2001 From: Benjamin Gerber Date: Wed, 25 Jul 2018 16:20:30 +0200 Subject: [PATCH 07/23] More visible error for import GSGMF-467 --- contribs/gmf/src/import/import.less | 4 ++++ contribs/gmf/src/import/importdatasourceComponent.html | 2 ++ 2 files changed, 6 insertions(+) diff --git a/contribs/gmf/src/import/import.less b/contribs/gmf/src/import/import.less index 0f3f9d7eb922..6a1ae6cd4d0c 100644 --- a/contribs/gmf/src/import/import.less +++ b/contribs/gmf/src/import/import.less @@ -1,6 +1,7 @@ @import "~font-awesome/less/variables.less"; @import "~gmf/less/typeahead.less"; @import "~gmf/less/vars.less"; +@import "~bootstrap/less/variables.less"; gmf-importdatasource { input[type=file] { @@ -10,6 +11,9 @@ gmf-importdatasource { .gmf-importdatasource-url-form-group { background-color: #fff; } + .btn.has-error { + color: @brand-danger; + } } gmf-wmscapabilitylayertreenode, diff --git a/contribs/gmf/src/import/importdatasourceComponent.html b/contribs/gmf/src/import/importdatasourceComponent.html index 2ae8e776d4de..09bdf142e15f 100644 --- a/contribs/gmf/src/import/importdatasourceComponent.html +++ b/contribs/gmf/src/import/importdatasourceComponent.html @@ -40,6 +40,7 @@