Skip to content

Commit

Permalink
Merge pull request #4299 from rldhont/fix-print-base-layers
Browse files Browse the repository at this point in the history
[Bugfix] Printing base layers withlayer in hidden group
  • Loading branch information
rldhont authored Mar 13, 2024
2 parents 2cbe540 + 6626c78 commit 66c0f1b
Show file tree
Hide file tree
Showing 6 changed files with 960 additions and 498 deletions.
22 changes: 2 additions & 20 deletions assets/src/components/Print.js
Original file line number Diff line number Diff line change
Expand Up @@ -232,28 +232,10 @@ export default class Print extends HTMLElement {
const styleLayers = [];
const opacityLayers = [];

// Get active baselayer, and add the corresponding QGIS layer if needed
const activeBaseLayerName = mainLizmap._lizmap3.map.baseLayer.name;
const externalBaselayersReplacement = mainLizmap._lizmap3.getExternalBaselayersReplacement();
const exbl = externalBaselayersReplacement?.[activeBaseLayerName];
if (mainLizmap.config.layers?.[exbl]) {
const activeBaseLayerConfig = mainLizmap.config.layers[exbl];
if (activeBaseLayerConfig?.id && mainLizmap.config.options?.useLayerIDs == 'True') {
printLayers.push(activeBaseLayerConfig.id);
} else if (activeBaseLayerConfig?.shortname) {
printLayers.push(activeBaseLayerConfig.shortname);
} else {
printLayers.push(exbl);
}
styleLayers.push('');
// TODO: handle baselayers opacity
opacityLayers.push(255);
}

// Add selected base layer if any
const selectedBaseLayer = lizMap.mainLizmap.state.baseLayers.selectedBaseLayer;
if (selectedBaseLayer && selectedBaseLayer.layerConfig !== null) {
printLayers.push(selectedBaseLayer.layerConfig.shortname);
if (selectedBaseLayer && selectedBaseLayer.hasItemState) {
printLayers.push(selectedBaseLayer.itemState.wmsName);
styleLayers.push(selectedBaseLayer.itemState.wmsSelectedStyleName);
opacityLayers.push(parseInt(255 * selectedBaseLayer.itemState.opacity * selectedBaseLayer.layerConfig.opacity));
}
Expand Down
9 changes: 8 additions & 1 deletion assets/src/modules/Config.js
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,14 @@ export class Config {
break;
}
}
this._baselayers = new BaseLayersConfig(baseLayersCfg, this._theConfig.options, this.layers, baseLayerTreeItem);
let hiddenTreeItem = null;
for (const layerTreeItem of this.layerTree.getChildren()) {
if ( layerTreeItem.name.toLowerCase() == 'hidden') {
hiddenTreeItem = layerTreeItem;
break;
}
}
this._baselayers = new BaseLayersConfig(baseLayersCfg, this._theConfig.options, this.layers, baseLayerTreeItem, hiddenTreeItem);
return this._baselayers;
}

Expand Down
13 changes: 12 additions & 1 deletion assets/src/modules/config/BaseLayer.js
Original file line number Diff line number Diff line change
Expand Up @@ -758,8 +758,9 @@ export class BaseLayersConfig {
* @param {object} options - the lizmap config object for options
* @param {LayersConfig} layers - the lizmap layers config
* @param {LayerTreeGroupConfig} [baseLayersTreeGroup] - the layer tree group config which contains base layers
* @param {LayerTreeGroupConfig} [hiddenTreeGroup] - the layer tree group config which contains hidden layers and in old config base layers
*/
constructor(cfg, options, layers, baseLayersTreeGroup) {
constructor(cfg, options, layers, baseLayersTreeGroup, hiddenTreeGroup) {
if (!cfg || typeof cfg !== "object") {
throw new ValidationError('The cfg parameter is not an Object!');
}
Expand Down Expand Up @@ -802,6 +803,16 @@ export class BaseLayersConfig {
}
}

// Add base layers config from hidden tree group
if (hiddenTreeGroup) {
for (const layerTreeItem of hiddenTreeGroup.getChildren()) {
if ( !extendedCfg.hasOwnProperty(layerTreeItem.name) ) {
continue;
}
extendedCfg[layerTreeItem.name].layerConfig = layerTreeItem.layerConfig;
}
}

// Add base layers from tree and collect names
let names = [];
if (baseLayersTreeGroup) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// @ts-check
import { test, expect } from '@playwright/test';

test.describe('Print', () => {
Expand Down Expand Up @@ -208,7 +209,7 @@ test.describe('Print in popup', () => {
test.beforeEach(async ({ page }) => {
const url = '/index.php/view/map/?repository=testsrepository&project=print';
await page.goto(url, { waitUntil: 'networkidle' });
let getFeatureInfoRequestPromise = page.waitForRequest(request => request.method() === 'POST' && request.postData() != null && request.postData().includes('GetFeatureInfo'));
let getFeatureInfoRequestPromise = page.waitForRequest(request => request.method() === 'POST' && request.postData()?.includes('GetFeatureInfo') === true);
await page.locator('#newOlMap').click({ position: { x: 409, y: 186 } });
let getFeatureInfoRequest = await getFeatureInfoRequestPromise;
expect(getFeatureInfoRequest.postData()).toMatch(/GetFeatureInfo/);
Expand Down Expand Up @@ -493,3 +494,124 @@ test.describe('Print 3857', () => {
await page.locator('#print-launch').click();
});
});

test.describe('Print base layers', () => {
test.beforeEach(async ({ page }) => {
const url = '/index.php/view/map/?repository=testsrepository&project=base_layers';
await page.goto(url, { waitUntil: 'networkidle' });

await page.locator('#button-print').click();

await page.locator('#print-scale').selectOption('72224');
});

test('Print requests', async ({ page }) => {
// Print osm-mapnik
let getPrintRequestPromise = page.waitForRequest(request => request.method() === 'POST' && request.postData()?.includes('GetPrint') === true);
await page.locator('#print-launch').click();

let getPrintRequest = await getPrintRequestPromise;
let getPrintPostData = getPrintRequest.postData();
expect(getPrintPostData).toContain('SERVICE=WMS')
expect(getPrintPostData).toContain('REQUEST=GetPrint')
expect(getPrintPostData).toContain('VERSION=1.3.0')
expect(getPrintPostData).toContain('FORMAT=pdf')
expect(getPrintPostData).toContain('TRANSPARENT=true')
expect(getPrintPostData).toContain('CRS=EPSG%3A3857')
expect(getPrintPostData).toContain('DPI=100')
expect(getPrintPostData).toContain('TEMPLATE=simple')
//expect(postData).toContain('map0%3AEXTENT=')
expect(getPrintPostData).toContain('map0%3ASCALE=72224')
expect(getPrintPostData).toContain('map0%3ALAYERS=osm-mapnik&')
expect(getPrintPostData).toContain('map0%3ASTYLES=d%C3%A9faut&')
expect(getPrintPostData).toContain('map0%3AOPACITIES=255')

let getPrintResponse = await getPrintRequest.response();
expect(getPrintResponse?.headers()['content-type']).toBe('application/pdf');

// Print osm-mapnik & quartiers
let getMapRequestPromise = page.waitForRequest(/REQUEST=GetMap/);
await page.getByLabel('quartiers').check();
let getMapRequest = await getMapRequestPromise;
await getMapRequest.response();

getPrintRequestPromise = page.waitForRequest(request => request.method() === 'POST' && request.postData()?.includes('GetPrint') === true);
await page.locator('#print-launch').click();

getPrintRequest = await getPrintRequestPromise;
getPrintPostData = getPrintRequest.postData();
expect(getPrintPostData).not.toBeNull()
expect(getPrintPostData).toContain('SERVICE=WMS')
expect(getPrintPostData).toContain('REQUEST=GetPrint')
expect(getPrintPostData).toContain('VERSION=1.3.0')
expect(getPrintPostData).toContain('FORMAT=pdf')
expect(getPrintPostData).toContain('TRANSPARENT=true')
expect(getPrintPostData).toContain('CRS=EPSG%3A3857')
expect(getPrintPostData).toContain('DPI=100')
expect(getPrintPostData).toContain('TEMPLATE=simple')
//expect(postData).toContain('map0%3AEXTENT=')
expect(getPrintPostData).toContain('map0%3ASCALE=72224')
expect(getPrintPostData).toContain('map0%3ALAYERS=osm-mapnik%2Cquartiers&')
expect(getPrintPostData).toContain('map0%3ASTYLES=d%C3%A9faut%2Cdefault&')
expect(getPrintPostData).toContain('map0%3AOPACITIES=255%2C255')

getPrintResponse = await getPrintRequest.response();
expect(getPrintResponse?.headers()['content-type']).toBe('application/pdf');

// Print quartiers not open-topo-map
await page.locator('#switcher-baselayer').getByRole('combobox').selectOption('open-topo-map');

await page.waitForResponse(response => response.status() === 200 && response.headers()['content-type'] === 'image/png');

getPrintRequestPromise = page.waitForRequest(request => request.method() === 'POST' && request.postData()?.includes('GetPrint') === true);
await page.locator('#print-launch').click();

getPrintRequest = await getPrintRequestPromise;
getPrintPostData = getPrintRequest.postData();
expect(getPrintPostData).not.toBeNull()
expect(getPrintPostData).toContain('SERVICE=WMS')
expect(getPrintPostData).toContain('REQUEST=GetPrint')
expect(getPrintPostData).toContain('VERSION=1.3.0')
expect(getPrintPostData).toContain('FORMAT=pdf')
expect(getPrintPostData).toContain('TRANSPARENT=true')
expect(getPrintPostData).toContain('CRS=EPSG%3A3857')
expect(getPrintPostData).toContain('DPI=100')
expect(getPrintPostData).toContain('TEMPLATE=simple')
//expect(postData).toContain('map0%3AEXTENT=')
expect(getPrintPostData).toContain('map0%3ASCALE=72224')
expect(getPrintPostData).toContain('map0%3ALAYERS=quartiers&')
expect(getPrintPostData).toContain('map0%3ASTYLES=default&')
expect(getPrintPostData).toContain('map0%3AOPACITIES=255')

getPrintResponse = await getPrintRequest.response();
expect(getPrintResponse?.headers()['content-type']).toBe('application/pdf');

// Print quartiers_baselayer & quartiers
await page.locator('#switcher-baselayer').getByRole('combobox').selectOption('quartiers_baselayer');
getMapRequest = await getMapRequestPromise;
await getMapRequest.response();

getPrintRequestPromise = page.waitForRequest(request => request.method() === 'POST' && request.postData()?.includes('GetPrint') === true);
await page.locator('#print-launch').click();

getPrintRequest = await getPrintRequestPromise;
getPrintPostData = getPrintRequest.postData();
expect(getPrintPostData).not.toBeNull()
expect(getPrintPostData).toContain('SERVICE=WMS')
expect(getPrintPostData).toContain('REQUEST=GetPrint')
expect(getPrintPostData).toContain('VERSION=1.3.0')
expect(getPrintPostData).toContain('FORMAT=pdf')
expect(getPrintPostData).toContain('TRANSPARENT=true')
expect(getPrintPostData).toContain('CRS=EPSG%3A3857')
expect(getPrintPostData).toContain('DPI=100')
expect(getPrintPostData).toContain('TEMPLATE=simple')
//expect(postData).toContain('map0%3AEXTENT=')
expect(getPrintPostData).toContain('map0%3ASCALE=72224')
expect(getPrintPostData).toContain('map0%3ALAYERS=quartiers_baselayer%2Cquartiers&')
expect(getPrintPostData).toContain('map0%3ASTYLES=default%2Cdefault&')
expect(getPrintPostData).toContain('map0%3AOPACITIES=255%2C255')

getPrintResponse = await getPrintRequest.response();
expect(getPrintResponse?.headers()['content-type']).toBe('application/pdf');
});
});
Loading

0 comments on commit 66c0f1b

Please sign in to comment.