Skip to content
Open
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
32 changes: 32 additions & 0 deletions assets/src/legacy/timemanager.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ var lizTimemanager = function() {
var filter = null;
var tmAnimationTimer;
var tmCurrentDate;
// Filter each controlled layer already had when the time manager was
// opened, by layer name. The date filter is combined with it, instead
// of replacing it.
var tmBaseFilters = {};
var tmStartDate = -Infinity; // lower bound of when values
var tmEndDate = Infinity; // upper value of when values

Expand All @@ -84,6 +88,16 @@ var lizTimemanager = function() {
// hourglass
//$('#loading').dialog('open');

// Keep the filter the layers may already have, e.g. set from the
// form filter, so that the date filter is combined with it (#6773)
tmBaseFilters = {};
for (var tmLayer in config.timemanagerLayers) {
var tmLayerRequestParams = config.layers[tmLayer]?.['request_params'];
if (tmLayerRequestParams?.['exp_filter']) {
tmBaseFilters[tmLayer] = tmLayerRequestParams['exp_filter'];
}
}

// Get min and max timestamps from layers
var minTime = Infinity, maxTime = -Infinity ;
for (var l in config.timemanagerLayers) {
Expand Down Expand Up @@ -352,6 +366,15 @@ var lizTimemanager = function() {
// Set filter for each vector layer
for (var l in config.timemanagerLayers){
filter = buildDateFilter(config.timemanagerLayers[l], lowerBoundary, upperBoundary);

// Combine the date filter with the filter the layer already had,
// otherwise the time manager would drop it (#6773)
if (tmBaseFilters[l]) {
filter = filter
? '( ' + tmBaseFilters[l] + ' ) AND ' + filter
: tmBaseFilters[l];
}

lizMap.triggerLayerFilter(l, filter);
}
}
Expand Down Expand Up @@ -516,6 +539,14 @@ var lizTimemanager = function() {
function unFilterTimeLayers() {
// Remove filter
for(var layerName in lizMap.config.timemanagerLayers){
// The layer was already filtered before the time manager was
// opened: only remove the date part, by restoring that filter.
// `triggerLayerFilter` refreshes plots and popups on its own.
if (tmBaseFilters[layerName]) {
lizMap.triggerLayerFilter(layerName, tmBaseFilters[layerName]);
continue;
}

lizMap.deactivateMaplayerFilter(layerName);
// Refresh plots and popups
lizMap.config.layers[layerName]['request_params']['filtertoken'] = null;
Expand All @@ -527,6 +558,7 @@ var lizTimemanager = function() {
}
);
}
tmBaseFilters = {};
}

/**
Expand Down
37 changes: 37 additions & 0 deletions tests/end2end/playwright/time-manager.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -371,5 +371,42 @@ test.describe('Time Manager @readonly', () => {
responseExpect(getMapNoFilterResponse).toBeImagePng();
});

test('Keeps the filter already set on the layer', async ({ page }) => {
// https://github.com/3liz/lizmap-web-client/issues/6773
const project = new ProjectPage(page, 'time_manager');
await project.open();

// Filter the layer with the form filter, keeping the features with gid <= 2
await page.locator('#button-filter').click();
let getFilterTokenRequestPromise = project.waitForGetFilterTokenRequest();
await page.locator('#liz-filter-field-max-numericgid').fill('2');
// The numeric field applies its filter on `change`, which `fill()` alone
// does not trigger on a number input
await page.locator('#liz-filter-field-max-numericgid').dispatchEvent('change');

// The form filter is applied on its own
let getFilterTokenRequest = await getFilterTokenRequestPromise;
expect(decodeURIComponent(getFilterTokenRequest.postData() ?? '')).toContain('"gid"');

// Opening the time manager applies its date filter
getFilterTokenRequestPromise = project.waitForGetFilterTokenRequest();
await page.locator('#button-timemanager').click();
getFilterTokenRequest = await getFilterTokenRequestPromise;
const timeFilter = decodeURIComponent(getFilterTokenRequest.postData() ?? '');

expect(timeFilter).toContain('"test_date"');
// Bug #6773: the filter already set on the layer used to be replaced,
// so the time manager had no visible effect on the filtered features
expect(timeFilter).toContain('"gid"');

// Closing the time manager restores the filter of the layer alone
getFilterTokenRequestPromise = project.waitForGetFilterTokenRequest();
await page.locator('.btn-timemanager-clear').click();
getFilterTokenRequest = await getFilterTokenRequestPromise;
const restoredFilter = decodeURIComponent(getFilterTokenRequest.postData() ?? '');

expect(restoredFilter).toContain('"gid"');
expect(restoredFilter).not.toContain('"test_date"');
});

});
12 changes: 11 additions & 1 deletion tests/qgis-projects/tests/time_manager.qgs.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -124,5 +124,15 @@
},
"layers": []
},
"formFilterLayers": {}
"formFilterLayers": {
"0": {
"layerId": "time_manager_f272466b_c160_439c_bb9b_6c4b8c5ff74d",
"title": "gid",
"type": "numeric",
"start_field": "gid",
"end_field": "gid",
"order": 0,
"provider": "postgres"
}
}
}
Loading