Skip to content

Commit 955ccde

Browse files
committed
Combine time manager filter with existing layer filter (#6773)
1 parent 9a9e9fb commit 955ccde

2 files changed

Lines changed: 71 additions & 13 deletions

File tree

CHANGELOG-3.9.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ with some extra keywords: backend, tests, test, translation, funders, important
4343
* Map - WMS baselayers from QGIS layers now proxy through QGIS Server
4444
* UI - Popup: place children features tables inside drag-and-drop relation
4545
* UI - Geolocation error
46+
* Time manager - Combine the time filter with an existing layer filter instead of overriding it (#6773)
4647

4748
### Tests
4849

assets/src/legacy/timemanager.js

Lines changed: 70 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ var lizTimemanager = function() {
5151
$("#tmSlider").slider( );
5252

5353
var filter = null;
54+
// Layer filters present before the time manager took control (#6773)
55+
var tmBaseFilters = {};
5456
var tmAnimationTimer;
5557
var tmCurrentDate;
5658
var tmStartDate = -Infinity; // lower bound of when values
@@ -71,6 +73,14 @@ var lizTimemanager = function() {
7173
*/
7274
function activateTimemanager(){
7375

76+
// Remember any filter already applied to the time-managed
77+
// layers (e.g. from the form filter panel), so the time
78+
// filter is combined with it instead of replacing it (#6773)
79+
tmBaseFilters = {};
80+
for (var bl in config.timemanagerLayers) {
81+
tmBaseFilters[bl] = getLayerBaseFilter(bl);
82+
}
83+
7484
// hourglass
7585
//$('#loading').dialog('open');
7686

@@ -328,6 +338,37 @@ var lizTimemanager = function() {
328338
}
329339

330340

341+
/**
342+
* Get the WMS-safe expression filter currently applied to a layer,
343+
* without the WMS layer-name prefix. Returns null when none (#6773).
344+
*
345+
* The full filter method stores a WMS-safe filter (built from the
346+
* primary key) in request_params.filter, prefixed with the WMS
347+
* layer name; exp_filter may instead hold a '$id ...' expression
348+
* which QGIS Server rejects, so it must not be reused as-is.
349+
* @param layerName
350+
*/
351+
function getLayerBaseFilter(layerName){
352+
var lConfig = config.layers[layerName];
353+
if( !lConfig || !lConfig['request_params'] ){
354+
return null;
355+
}
356+
var rp = lConfig['request_params'];
357+
if( rp['filter'] ){
358+
var wmsName = lConfig['shortname'] || lConfig['name'];
359+
if( wmsName && rp['filter'].indexOf(wmsName + ':') === 0 ){
360+
return rp['filter'].substring(wmsName.length + 1);
361+
}
362+
return rp['filter'];
363+
}
364+
// Simple filter method: exp_filter is a clean expression.
365+
// Skip it if it relies on '$id' (not allowed by QGIS Server).
366+
if( rp['exp_filter'] && rp['exp_filter'].indexOf('$id') === -1 ){
367+
return rp['exp_filter'];
368+
}
369+
return null;
370+
}
371+
331372
/**
332373
*
333374
* @param lowerBoundary
@@ -341,8 +382,17 @@ var lizTimemanager = function() {
341382

342383
// Set filter for each vector layer
343384
for (var l in config.timemanagerLayers){
344-
filter = buildDateFilter(config.timemanagerLayers[l], lowerBoundary, upperBoundary);
345-
lizMap.triggerLayerFilter(l, filter);
385+
var dateFilter = buildDateFilter(config.timemanagerLayers[l], lowerBoundary, upperBoundary);
386+
// Combine the time filter with any filter already on the
387+
// layer (e.g. from the form filter panel) so both apply (#6773)
388+
var baseFilter = tmBaseFilters[l] || null;
389+
var layerFilter;
390+
if (baseFilter && dateFilter) {
391+
layerFilter = '( ' + baseFilter + ' ) AND ( ' + dateFilter + ' )';
392+
} else {
393+
layerFilter = dateFilter || baseFilter;
394+
}
395+
lizMap.triggerLayerFilter(l, layerFilter);
346396
}
347397
}
348398

@@ -504,19 +554,26 @@ var lizTimemanager = function() {
504554
*
505555
*/
506556
function unFilterTimeLayers() {
507-
// Remove filter
557+
// Remove the time filter; restore any filter the layer had
558+
// before the time manager took control (#6773)
508559
for(var layerName in lizMap.config.timemanagerLayers){
509-
lizMap.deactivateMaplayerFilter(layerName);
510-
// Refresh plots and popups
511-
lizMap.config.layers[layerName]['request_params']['filtertoken'] = null;
512-
lizMap.events.triggerEvent("layerFilterParamChanged",
513-
{
514-
'featureType': layerName,
515-
'filter': null,
516-
'updateDrawing': false
517-
}
518-
);
560+
var baseFilter = tmBaseFilters[layerName] || null;
561+
if (baseFilter) {
562+
lizMap.triggerLayerFilter(layerName, baseFilter);
563+
} else {
564+
lizMap.deactivateMaplayerFilter(layerName);
565+
// Refresh plots and popups
566+
lizMap.config.layers[layerName]['request_params']['filtertoken'] = null;
567+
lizMap.events.triggerEvent("layerFilterParamChanged",
568+
{
569+
'featureType': layerName,
570+
'filter': null,
571+
'updateDrawing': false
572+
}
573+
);
574+
}
519575
}
576+
tmBaseFilters = {};
520577
}
521578

522579
/**

0 commit comments

Comments
 (0)