Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Map / Background layer / Fix active layer on load. #7126

Merged
merged 5 commits into from
Jun 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -745,6 +745,25 @@ <h2>{{('ui-mod-' + m) | translate}}</h2>
</div>
</div>

<div
class="row"
data-ng-switch-when="defaultToolAfterMapLoad|defaultTool"
data-ng-switch-when-separator="|"
>
<div class="col-lg-5 gn-nopadding-left">
<label class="control-label">{{('ui-' + key) | translate}}</label>
<gn-ui-config-help />
</div>

<div class="col-lg-7 gn-nopadding-right">
<select
data-ng-model="mCfg[key]"
data-ng-options="('' + tool | translate) for tool in ['', 'addLayers', 'projectionSwitcher', 'contexts', 'filter', 'layers', 'legend', 'print', 'processes']"
class="form-control"
/>
</div>
</div>

<!-- numbers -->
<div class="row" data-ng-switch-when="paginationInfo">
<div class="col-lg-5 gn-nopadding-left">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@
this.queue = queue;
this.errors = errors;

var clear = function (map) {
var type = (map && map.get && map.get("type")) || "viewer";
if (queue[type]) {
queue[type].queue.length = 0;
queue[type].errors.length = 0;
}
};

var getMapType = function (map) {
var type = (map && map.get && map.get("type")) || "viewer";
if (queue[type] === undefined) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@
processes: false
};

Object.keys(scope.activeTools).forEach(function (key) {
scope.activeTools[key] = gnViewerSettings.mapConfig.defaultTool === key;
});

/** optional tabs **/
scope.disabledTools = gnViewerSettings.mapConfig.disabledTools;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,21 @@
*/
module.directive("gnBaselayerswitcher", [
"gnViewerSettings",
"gnSearchSettings",
"gnOwsContextService",
"gnWmsQueue",
"$rootScope",
function (gnViewerSettings, gnOwsContextService, $rootScope) {
"gnMapsManager",
"gnMap",
function (
gnViewerSettings,
gnSearchSettings,
gnOwsContextService,
gnWmsQueue,
$rootScope,
gnMapsManager,
gnMap
) {
return {
restrict: "A",
templateUrl:
Expand All @@ -56,8 +68,9 @@
scope.layers.indexOf(firstLayer) < 0 &&
!scope.layers.fromCtx
) {
scope.map.getLayers().insertAt(0, scope.layers[0]);
scope.setBgLayer(scope.layers[0]);
}

scope.setBgLayer = function (layer) {
layer.setVisible(true);
var layers = scope.map.getLayers();
Expand All @@ -70,40 +83,38 @@
return false;
};

scope.changeBackground = function (layer) {
scope.setBgLayer(layer);
};

scope.$watch(
function () {
return gnViewerSettings.bgLayers;
},
function (bgLayers) {
if (bgLayers && bgLayers.length && bgLayers.length > 0) {
scope.layers = bgLayers;

//Do we remember the previous background layer?
var i = 0;
var j = 0;
bgLayers.forEach(function (layer) {
if (layer.get("currentBackground")) {
i = j;
}
j++;
});

scope.setBgLayer(scope.layers[i]);
}
}
);

scope.reset = function () {
$rootScope.$broadcast("owsContextReseted");
function loadContext() {
gnOwsContextService.loadContextFromUrl(
gnViewerSettings.defaultContext,
scope.map,
gnViewerSettings.additionalMapLayers
);
}

scope.reset = function () {
$rootScope.$broadcast("owsContextReseted");
gnWmsQueue.clear(scope.map);
var mapViewerConfig = gnMap.getMapConfig()["map-" + gnMapsManager.VIEWER_MAP];
if (gnViewerSettings.defaultContext) {
loadContext();
} else if (mapViewerConfig.layers && mapViewerConfig.layers.length > 0) {
// TODO: The map layer config does not seem to work. Something to remove?
gnViewerSettings.bgLayers.length = 0;
scope.layers.length = 0;
gnSearchSettings.viewerMap = gnMapsManager.createMap(
gnMapsManager.VIEWER_MAP
);
} else {
var defaultContext = "../../map/config-viewer.xml";
console.warn(
"Check the map viewer configuration. \n" +
"No context URL and no default layers found. \n" +
"Using " +
defaultContext
);
gnViewerSettings.defaultContext = defaultContext;
loadContext();
}
};
}
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
<div class="gn-margin-bottom" data-ng-show="layers.length > 1">
<h4 data-translate="">backgroundMap</h4>
<h4>
<span data-translate="">backgroundMap</span>
<span ng-if="map.getLayers().item(0).get('loading')">
<span class="fa fa-spin fa-spinner"></span>
</span>
</h4>

<ul class="gn-baselayer-switcher-menu list-group width-100">
<li class="list-group-item" ng-if="::layer" ng-repeat="layer in layers">
<a
href=""
data-ng-class="{'gn-map-layer-selected': layer == map.getLayers().item(0)}"
ng-click="changeBackground(layer);popoverCtrl.dismissPopover()"
ng-click="setBgLayer(layer);popoverCtrl.dismissPopover()"
>
<span ng-if="::!layer.get('loading')">
<span
class="fa gn-margin-right"
ng-class="layer == map.getLayers().item(0) ? 'fa-dot-circle-o' : 'fa-circle-o'"
></span
>{{layer.get('title')}}
</span>
<span ng-if="::layer.get('loading')">
<span class="fa fa-spin fa-spinner"></span>
</span>
<span
class="fa gn-margin-right"
ng-class="layer == map.getLayers().item(0) ? 'fa-dot-circle-o' : 'fa-circle-o'"
></span
>{{layer.get('title')}}
</a>
</li>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,8 @@
scope.mapProps = angular.extend({}, defaultMapProps);
defer.resolve(response);
},
function (data) {
console.warn(data);
function (response) {
console.warn(response);
defer.reject(response);
}
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
"gnOwsCapabilities",
"$http",
"gnViewerSettings",
"gnViewerService",
"$translate",
"$q",
"$filter",
Expand All @@ -78,6 +79,7 @@
gnOwsCapabilities,
$http,
gnViewerSettings,
gnViewerService,
$translate,
$q,
$filter,
Expand Down Expand Up @@ -117,6 +119,7 @@
if (mapType && mapConfig) {
uiConfig = mapConfig["map-" + mapType];
}
var isMainViewer = mapType === "viewer";
// first remove any existing layer
var layersToRemove = [];
map.getLayers().forEach(function (layer) {
Expand Down Expand Up @@ -215,10 +218,13 @@
if (!gnViewerSettings.bgLayers) {
gnViewerSettings.bgLayers = [];
}
gnViewerSettings.bgLayers.length = 0;
if (isMainViewer) {
gnViewerSettings.bgLayers.length = 0;
}

var bgLayers = gnViewerSettings.bgLayers;
bgLayers.fromCtx = true;
var isFirstBgLayer = false;
var isFirstActiveBgLayer = false;
// -------

for (i = 0; i < layers.length; i++) {
Expand Down Expand Up @@ -246,10 +252,12 @@
olLayer.background = true;
olLayer.set("group", "Background layers");
olLayer.setVisible(!layer.hidden);
bgLayers.push(olLayer);
if (isMainViewer) {
bgLayers.push(olLayer);
}

if (!layer.hidden && !isFirstBgLayer) {
isFirstBgLayer = true;
if (!layer.hidden && !isFirstActiveBgLayer) {
isFirstActiveBgLayer = true;
map.getLayers().setAt(0, olLayer);
}
}
Expand All @@ -265,20 +273,25 @@
visible: false
});

if (!layer.hidden && !isFirstBgLayer) {
isFirstBgLayer = true;
if (!layer.hidden && !isFirstActiveBgLayer) {
isFirstActiveBgLayer = true;
loadingLayer.set("bgLayer", true);
}

var layerIndex = bgLayers.push(loadingLayer) - 1;
var layerIndex;
if (isMainViewer) {
layerIndex = bgLayers.push(loadingLayer) - 1;
}
var p = self.createLayer(layer, map, "do not add");

(function (idx, loadingLayer) {
p.then(function (layer) {
if (!layer) {
return;
}
bgLayers[idx] = layer;
if (layerIndex) {
bgLayers[idx] = layer;
}

layer.displayInLayerManager = false;
layer.background = true;
Expand All @@ -298,7 +311,8 @@
// load extension content (JSON)
var extension =
layer.extension && layer.extension.any
? JSON.parse(layer.extension.any)
? // Formatted XML may contains extra space and line feed
JSON.parse(layer.extension.any.replaceAll(/\n +/g, " "))
: {};

var loadingId = extension.label ? extension.label : layer.name;
Expand Down Expand Up @@ -357,6 +371,23 @@
}
firstLoad = false;
}
if (!isFirstActiveBgLayer && bgLayers.length > 0) {
console.warn(
"Map context does not contain any active background layer. \n" +
"Set the hidden parameter to false to at least one layer of the group Background layers. \n" +
"Setting the first one in the group as active."
);
bgLayers[0].set("bgLayer", true);
map.getLayers().setAt(0, bgLayers[0]);
}

if (
gnGlobalSettings.gnCfg.mods.map.defaultToolAfterMapLoad
) {
gnViewerService.openTool(
gnGlobalSettings.gnCfg.mods.map.defaultToolAfterMapLoad
);
}
}
};

Expand Down Expand Up @@ -687,8 +718,11 @@
* @param {numeric} index of the layer in the tree
*/
this.createLayer = function (layer, map, bgIdx, index, style) {
var server = layer.server[0];
var res = server.onlineResource[0];
var res = { href: "" };
if (layer.server) {
var server = layer.server[0];
res = server.onlineResource[0];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess server.onlineResource[0] contains an object like { href: "XXXXX" }?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usually yes, but it is a corner case in Sextant where the map context can define custom layer types without server.

}
var createOnly = angular.isDefined(bgIdx) || angular.isDefined(index);

if (layer.name && layer.name.match(reT)) {
Expand Down
2 changes: 2 additions & 0 deletions web-ui/src/main/resources/catalog/js/CatController.js
Original file line number Diff line number Diff line change
Expand Up @@ -815,6 +815,8 @@
syncAllLayers: false,
drawVector: false
},
defaultTool: "layers",
defaultToolAfterMapLoad: "layers",
graticuleOgcService: {},
"map-viewer": {
context: "../../map/config-viewer.xml",
Expand Down
3 changes: 3 additions & 0 deletions web-ui/src/main/resources/catalog/locales/en-v4.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@
"remoteRecordUrl-help": "Remote record can be linked to record in this catalog by pointing to an URL of the remote record. If the remote record is in a GeoNetwork catalog, the landing page of the record is recommended (eg. https://catalog/geonetwork/srv/api/records/{uuid}). For GeoNode, the HTML page can work. For others, XML document can be used (eg. API call or CSW GetRecordById request).",
"remoteRecordPropertiesError": "Failed to extract title and UUID for remote record. Check the target document.",
"remoteRecordUrlReturnedError": "Failed to access URL: ",
"ui-defaultTool": "Default active tool",
"ui-defaultToolAfterMapLoad": "Active tool after map load",
"ui-defaultToolAfterMapLoad-help": "User can open a map from different location (eg. home page maps, record view, map selector panel, URL). Define which tool panel to open by default after map is loaded. Can be empty to not activate any tool. 'layers' or 'legend' allows to easily view the list of layers in the map.",
"ui-searchOptions": "Search options",
"ui-languageStrategy": "Language strategy",
"ui-languageStrategy-help": "Language strategy can be: <ul><li>searchInAllLanguages: search using any.* fields (more records are returned)</li><li>searchInDetectedLanguage: restrict the search to the language detected based on user search. If language detection fails, search in all languages.</li><li>searchInThatLanguage: Force a language using searchInThatLanguage:fre (recommended if only one language used)</li><li>searchInUILanguage: search in UI languages eg. full text field is any.langfre if French</li></ul>",
Expand Down