diff --git a/assets/src/components/GroupPopupByLayer.js b/assets/src/components/GroupPopupByLayer.js
new file mode 100644
index 0000000000..620fbc0a75
--- /dev/null
+++ b/assets/src/components/GroupPopupByLayer.js
@@ -0,0 +1,243 @@
+/**
+ * @module components/GroupPopupByLayer.js
+ * @name GroupPopupByLayer
+ * @copyright 2026 3Liz
+ * @license MPL-2.0
+ */
+
+import { html, render } from 'lit-html';
+import { mainLizmap } from '../modules/Globals.js';
+import { Utils } from '../modules/Utils.js';
+
+export default class GroupPopupByLayer extends HTMLElement {
+ constructor(){
+ super();
+ // add support for slot elements
+ this.attachShadow({ mode: "open" });
+
+ this._slottedElement = null;
+ this._currentFeature = null;
+ this._currentLayer = null;
+ this._currentPopupsElements = null;
+
+ // injects global stylesheets
+ Utils.addGlobalStylesToShadowRoot(this.shadowRoot);
+
+ this._template = () => html`
+
+ ${!this._currentFeature ? html`
+
${lizDict['groupPopupByLayer.title']}
+
+
+ ${Object.keys(this._currentPopupsElements).map((k) => html`
+
+ {
+ this.currentLayer = e.currentTarget.getAttribute('layer-id');
+ return this._displayLayerFeature();
+ }
+ }>
+ | ${this._currentPopupsElements[k].title} |
+ (${this._currentPopupsElements[k].features.length}) |
+
+
+ `)}
+
+
+ ` : html`
+
+
+ ${this.totalCurrentLayerFeatures > 1 ? html`
+
+ ${this.selectedFeatureIndex + 1}/${this.totalCurrentLayerFeatures}
+
+
+
+
+
+ ` : ''}
+
+ `}
+
+
+ `
+ }
+
+ connectedCallback(){
+ // clone the main state
+ this._currentPopupsElements = {...mainLizmap.groupPopupByLayers.currentPopupsPerLayer};
+
+ this._render(true);
+ const slot = this.shadowRoot.querySelector( 'slot' );
+ if(slot.assignedElements() && slot.assignedElements().length == 1) {
+ this._slottedElement = slot.assignedElements()[0];
+ }
+
+ if(!this._slottedElement) throw new Error('No content to display');
+
+ // If there is only one feature to display among all the queried layers,
+ // it is simply displayed and the main component is left hidden to emulate standard behavior.
+ if (this.features.length == 1){
+ this.features[0].style.display = 'initial';
+ return;
+ } else {
+ // else show the component table element
+ this.shadowRoot.querySelector('.lizmap-gpl-container').style.display = 'block';
+ }
+ }
+
+ disconnectedCallback(){ }
+
+ /**
+ * Returns the current layer state
+ * @type {object}
+ */
+ get currentLayerState(){
+ return this._currentPopupsElements[this._currentLayer];
+ }
+
+ /**
+ * Return the total number of features for the current layer
+ * @type {number}
+ */
+ get totalCurrentLayerFeatures(){
+ return this.currentLayerState.features.length;
+ }
+
+ /**
+ * Returns the index of the current selected feature
+ * @type {number}
+ */
+ get selectedFeatureIndex(){
+ return this.currentLayerState.features.indexOf(this.currentLayerState.selectedFeature);
+ }
+
+ /**
+ * Returns a list of all the html features popups
+ * @type {NodeList}
+ */
+ get features(){
+ return this._slottedElement.querySelectorAll(`:scope > .${mainLizmap.groupPopupByLayers.singleFeatureClass}`);
+ }
+
+ /**
+ * Setting the current feature layer
+ * @param {string} layerId - the layer id
+ */
+ set currentLayer(layerId){
+ this._currentLayer = layerId;
+ }
+
+ /**
+ * Setting the current feature popup
+ * @param {null|HTMLElement} htmlFeat - the current feature or null
+ */
+ set currentFeature(htmlFeat){
+ this._currentFeature = htmlFeat;
+ if(!this._currentFeature) {
+ this._currentLayer = null;
+ this._hideFeatures();
+ }
+ this._render();
+ }
+
+ /**
+ * Renders the main template and performs side operations on user interface
+ * @param {boolean} firstRender - true if is called from the connectedCallback method
+ * @returns {void}
+ */
+ _render(firstRender = false){
+ render(this._template(), this.shadowRoot);
+ if (!firstRender) {
+ this._componentUI();
+ this._highlightFeatures();
+ }
+ }
+
+ /**
+ * Display the current select feature popup
+ * @returns {void}
+ */
+ _displayLayerFeature(){
+ let featureOnDisplay = null;
+ this.features.forEach((f) => {
+ if (f.getAttribute('data-layer-id') == this._currentLayer &&
+ f.getAttribute('data-feature-id') == this.currentLayerState.selectedFeature) {
+ featureOnDisplay = f;
+ f.style.display = 'initial';
+ } else {
+ f.style.display ='none';
+ }
+ });
+
+ this.currentFeature = featureOnDisplay;
+ }
+
+ /**
+ * Highlights the current feature geometry on map, if any.
+ * If no specific feature is selected, highlights all geometries.
+ * @returns {void}
+ */
+ _highlightFeatures(){
+ const geometries = [];
+ const selector = ':scope > .lizmapPopupDiv input.lizmap-popup-layer-feature-geometry';
+ let features = [];
+ if (this._currentFeature){
+ features.push(this._currentFeature);
+ } else {
+ features = Array.from(this.features);
+ }
+ if(!features.length) return;
+ features.forEach((f) => {
+ const geomInput = f.querySelector(selector);
+ if (geomInput) {
+ geometries.push(geomInput.value)
+ }
+ })
+
+ if(geometries.length) {
+ mainLizmap.map.clearHighlightFeatures();
+ lizMap.mainLizmap.map.setHighlightFeatures(`GEOMETRYCOLLECTION(${geometries.join()})`, "wkt");
+ }
+ }
+
+ /**
+ * Conditionally adjusts component elements after template rendering
+ * @returns {void}
+ */
+ _componentUI(){
+ if (this._currentFeature && this.totalCurrentLayerFeatures > 1) {
+ this.shadowRoot.querySelector('button.gpl-prev-popup').disabled = this.selectedFeatureIndex == 0;
+ this.shadowRoot.querySelector('button.gpl-next-popup').disabled = this.selectedFeatureIndex == this.totalCurrentLayerFeatures - 1;
+ }
+ }
+
+ /**
+ * Hides all popups
+ * @returns {void}
+ */
+ _hideFeatures(){
+ this.features.forEach((f)=> f.style.display = 'none');
+ }
+}
diff --git a/assets/src/index.js b/assets/src/index.js
index e21814091b..365599e92f 100644
--- a/assets/src/index.js
+++ b/assets/src/index.js
@@ -29,6 +29,7 @@ import NavBar from './components/NavBar.js';
import Tooltip from './components/Tooltip.js';
import Message from './components/Message.js';
import TypeAHead from './components/TypeAHead.js';
+import GroupPopupByLayer from './components/GroupPopupByLayer.js';
import { mainLizmap, mainEventDispatcher } from './modules/Globals.js';
import executeJSFromServer from './modules/ExecuteJSFromServer.js';
@@ -105,23 +106,24 @@ const definedCustomElements = () => {
window.customElements.define('lizmap-tooltip', Tooltip);
window.customElements.define('lizmap-message', Message);
window.customElements.define('lizmap-typeahead', TypeAHead);
+ window.customElements.define('lizmap-group-popup-layer', GroupPopupByLayer);
/**
- * At this point the user interface is fully loaded.
- * External javascripts can subscribe to this event to perform post load
- * operations or cutomizations
- *
- * Example in my_custom_script.js
- *
- * lizMap.subscribe(() => {
- * // pseudo-code
- * intercatWithPrintPanel();
- * interactWithSelectionPanel();
- * inteactWithLocateByLayerPanel();
- * },
- * 'lizmap.uicreated'
- * );
- */
+ * At this point the user interface is fully loaded.
+ * External javascripts can subscribe to this event to perform post load
+ * operations or customizations
+ *
+ * Example in my_custom_script.js
+ *
+ * lizMap.subscribe(() => {
+ * // pseudo-code
+ * intercatWithPrintPanel();
+ * interactWithSelectionPanel();
+ * inteactWithLocateByLayerPanel();
+ * },
+ * 'lizmap.uicreated'
+ * );
+ */
lizMap.mainEventDispatcher.dispatch('lizmap.uicreated');
}
diff --git a/assets/src/legacy/map.js b/assets/src/legacy/map.js
index 65d7ab6b29..ee2aeb9027 100644
--- a/assets/src/legacy/map.js
+++ b/assets/src/legacy/map.js
@@ -854,6 +854,10 @@ window.lizMap = function() {
text = text.replace( popupReg, 'table table-condensed table-striped table-bordered lizmapPopupTable');
var pcontent = '';
var hasPopupContent = (!(!text || text == null || text == ''));
+ // wrap the popups in lizmap-group-popup-layer, if the corresponding mode is enabled
+ if (lizMap.mainLizmap.groupPopupByLayers.isActive) {
+ pcontent = `${lizMap.mainLizmap.groupPopupByLayers.groupPopups(pcontent)}`
+ }
document.querySelector('#popupcontent div.menu-content').innerHTML = pcontent;
if ( !$('#mapmenu .nav-list > li.popupcontent').is(':visible') )
$('#mapmenu .nav-list > li.popupcontent').show();
@@ -893,6 +897,11 @@ window.lizMap = function() {
return false;
}
+ // wrap the popups in lizmap-group-popup-layer, if the corresponding mode is enabled
+ if (lizMap.mainLizmap.groupPopupByLayers.isActive) {
+ text = `${lizMap.mainLizmap.groupPopupByLayers.groupPopups(text)}`
+ }
+
document.getElementById('liz_layer_popup_contentDiv').innerHTML = text;
if (coordinate) {
lizMap.mainLizmap.popup.mapPopup.setPosition(coordinate);
diff --git a/assets/src/modules/GroupPopupByLayer.js b/assets/src/modules/GroupPopupByLayer.js
new file mode 100644
index 0000000000..273a316d0b
--- /dev/null
+++ b/assets/src/modules/GroupPopupByLayer.js
@@ -0,0 +1,94 @@
+/**
+ * @module modules/GroupPopupByLayer.js
+ * @copyright 2026 3Liz
+ * @license MPL-2.0
+ */
+import { Config } from './Config.js';
+
+export default class GroupPopupByLayer {
+ /**
+ * Create a group popup by layer instance
+ * @param {Config} initialConfig - The lizmap initial config instance
+ */
+ constructor(initialConfig) {
+ this._initialConfig = initialConfig;
+ this._isActive = initialConfig.options?.group_popup_by_layer;
+ this._popupMapLocation = initialConfig.options?.popupLocation == 'map';
+ this._singleFeatureClass = 'lizmapPopupSingleFeature';
+ this._singleFeatureTitleSelector = 'lizmapPopupTitle';
+ }
+
+ /**
+ * group popup by layer mode activated
+ * @type {boolean}
+ */
+ get isActive(){
+ return this._isActive;
+ }
+
+ /**
+ * Current module state
+ * @type {object}
+ */
+ get currentPopupsPerLayer(){
+ return this._currentPopupsPerLayer;
+ }
+
+ /**
+ * Class selector for the single feature popup element
+ * @type {string}
+ */
+ get singleFeatureClass(){
+ return this._singleFeatureClass;
+ }
+
+ /**
+ * Creates the current state and returns a
+ * modified string suitable to be injected in the lizmap-group-popup-layer HTML component
+ *
+ * @param {string} htmlPopup - the string representing the HTML popup
+ * @returns {string}
+ */
+ groupPopups(htmlPopup){
+ // reset state
+ this._currentPopupsPerLayer = {};
+
+ if(!this._isActive) return htmlPopup;
+
+ // group popups
+ const tpl = document.createElement('template');
+
+ // if the popup location is on the map, wrap the html popup in a slot
+ if (this._popupMapLocation){
+ tpl.innerHTML = ``;
+ tpl.content.querySelector('div[slot="popup"]').innerHTML = htmlPopup;
+ } else {
+ // else use the provided lizmapPopupContent div as the slot
+ tpl.innerHTML = htmlPopup;
+ tpl.content.querySelector('.lizmapPopupContent').setAttribute('slot','popup');
+ }
+
+ // select all first level single feature (exclude children, if any)
+ const singleFeatures = tpl.content.querySelectorAll(`div[slot="popup"] > .${this._singleFeatureClass}`);
+ // create initial state
+ singleFeatures.forEach((f)=>{
+ const layerId = f.getAttribute('data-layer-id');
+ const featureId = f.getAttribute('data-feature-id');
+ const title = f.querySelector(`.${this._singleFeatureTitleSelector}`).innerText;
+ if(!this._currentPopupsPerLayer.hasOwnProperty(layerId)){
+ this._currentPopupsPerLayer[layerId] = {
+ layerId: layerId,
+ title: title,
+ features: [],
+ selectedFeature:featureId,
+ }
+ }
+ this._currentPopupsPerLayer[layerId].features.push(featureId);
+
+ // hide single feature, its visibility will be managed by the lizmap-group-popup-layer HTML component
+ f.style.display = 'none';
+ })
+
+ return tpl.innerHTML;
+ }
+}
diff --git a/assets/src/modules/Lizmap.js b/assets/src/modules/Lizmap.js
index cdf3e1abbc..091b6f2cfb 100644
--- a/assets/src/modules/Lizmap.js
+++ b/assets/src/modules/Lizmap.js
@@ -28,6 +28,7 @@ import Permalink from './Permalink.js';
import Search from './Search.js';
import Tooltip from './Tooltip.js';
import LocateByLayer from './LocateByLayer.js';
+import GroupPopupByLayer from './GroupPopupByLayer.js';
import WMSCapabilities from 'ol/format/WMSCapabilities.js';
import WFSCapabilities from 'ol-wfs-capabilities';
@@ -188,6 +189,7 @@ export default class Lizmap {
this.map,
this._lizmap3
);
+ this.groupPopupByLayers = new GroupPopupByLayer(this.initialConfig);
/**
* Modules initialized.
* @event ModulesInitialized
diff --git a/assets/src/modules/Utils.js b/assets/src/modules/Utils.js
index a73e21c041..e117174768 100644
--- a/assets/src/modules/Utils.js
+++ b/assets/src/modules/Utils.js
@@ -150,7 +150,7 @@ export class FileDownloader {
* @name Utils
*/
export class Utils {
-
+ static globalStyleSheets = null;
/**
* Download a file provided as a string
* @static
@@ -344,4 +344,25 @@ export class Utils {
}
});
}
+
+ /**
+ * Injects global stylesheets into the given shadowRoot instance
+ * @param {ShadowRoot} shadowRoot - component shadowRoot instance
+ * @returns {void}
+ */
+ static addGlobalStylesToShadowRoot(shadowRoot) {
+ if (!Utils.globalStyleSheets) {
+ Utils.globalStyleSheets = Array.from(document.styleSheets)
+ .map(x => {
+ const sheet = new CSSStyleSheet();
+ const css = Array.from(x.cssRules).map(rule => rule.cssText).join(' ');
+ sheet.replaceSync(css);
+ return sheet;
+ });
+ }
+
+ shadowRoot.adoptedStyleSheets.push(
+ ...Utils.globalStyleSheets
+ );
+ }
}
diff --git a/assets/src/modules/config/Options.js b/assets/src/modules/config/Options.js
index 921c3525c0..2a4a5b4d0a 100644
--- a/assets/src/modules/config/Options.js
+++ b/assets/src/modules/config/Options.js
@@ -41,6 +41,7 @@ const optionalProperties = {
'automatic_permalink': { type: 'boolean', default: false },
'wms_single_request_for_all_layers' : { type:'boolean', default: false },
'exclude_basemaps_from_single_wms' : { type:'boolean', default: false },
+ 'group_popup_by_layer' : { type:'boolean', default: false },
};
/**
@@ -80,6 +81,7 @@ export class OptionsConfig extends BaseObjectConfig {
* @param {boolean} [cfg.automatic_permalink] - is automatic permalink activated ?
* @param {boolean} [cfg.wms_single_request_for_all_layers] - are layers loaded as single WMS image ?
* @param {boolean} [cfg.exclude_basemaps_from_single_wms] - are basemaps excluded from single WMS request ?
+ * @param {boolean} [cfg.group_popup_by_layer] - are popups grouped by layer ?
*/
constructor(cfg) {
if (!cfg || typeof cfg !== "object") {
@@ -325,4 +327,12 @@ export class OptionsConfig extends BaseObjectConfig {
return this._exclude_basemaps_from_single_wms;
}
+ /**
+ * Features popups are displayed grouped by layer name
+ * @type {boolean}
+ */
+ get group_popup_by_layer() {
+ return this._group_popup_by_layer;
+ }
+
}
diff --git a/lizmap/modules/view/locales/en_US/dictionnary.UTF-8.properties b/lizmap/modules/view/locales/en_US/dictionnary.UTF-8.properties
index 545acbc367..7eacfdc4d8 100644
--- a/lizmap/modules/view/locales/en_US/dictionnary.UTF-8.properties
+++ b/lizmap/modules/view/locales/en_US/dictionnary.UTF-8.properties
@@ -320,6 +320,11 @@ featuresTable.item.draggable.hover=You can drag and drop the feature to move it
featuresTable.item.draggable.dropped=You have successfully moved this feature
featuresTable.empty.message=This table is empty. There are no items to display.
+groupPopupByLayer.title=Features by layer
+groupPopupByLayer.nav.prev=Go to the previous feature
+groupPopupByLayer.nav.next=Go to the next feature
+groupPopupByLayer.nav.back=Return to layers list
+
startup.features.error=Zooming to the feature given in the URL parameter is not possible: an error occurred while fetching the feature data.
startup.features.empty=No features to display
startup.features.loading=Loading features, please wait...
diff --git a/lizmap/www/assets/css/map.css b/lizmap/www/assets/css/map.css
index f3400395e1..3bf036f812 100644
--- a/lizmap/www/assets/css/map.css
+++ b/lizmap/www/assets/css/map.css
@@ -4069,6 +4069,76 @@ div.lizmap-features-table.popup-displayed > table.lizmap-features-table-containe
z-index:5001 !important;
}
+/* lizmap-group-popup-layer web component */
+
+.lizmap-gpl-container {
+ margin-bottom: 1em;
+ margin-top:1em;
+}
+
+.lizmap-gpl-table {
+ font-size:0.9em;
+}
+
+.lizmap-gpl-table tr:hover td{
+ color: var(--color-contrasted-elements);
+ cursor:pointer;
+}
+
+.lizmap-gpl-container h4 {
+ font-size: 1em;
+ color: var(--color-contrasted-elements);
+}
+
+.lizmap-gpl-nav {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap:10px;
+}
+
+.gpl-counter {
+ font-size: 0.8em;
+ flex:0 1 30px;
+}
+
+.gpl-back {
+ font-size:0.7em;
+ flex: 1 0 auto;
+}
+
+.gpl-nav-buttons{
+ display:flex;
+ gap:5px;
+}
+
+.gpl-nav-buttons button {
+ background-color: var(--color-contrasted-elements-light);
+ color: var(--color-contrasted-elements);
+ width: 25px;
+ height: 25px;
+
+ &:hover, &:focus, &:active {
+ background-position: center;
+ }
+ }
+
+.lizmap-gpl-container button.gpl-prev-popup {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Cpath d='M10.8284 12.0007L15.7782 16.9504L14.364 18.3646L8 12.0007L14.364 5.63672L15.7782 7.05093L10.8284 12.0007Z'%3E%3C/path%3E%3C/svg%3E");
+
+ &.first {
+ display: none;
+ }
+}
+
+.lizmap-gpl-container button.gpl-next-popup {
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Cpath d='M13.1717 12.0007L8.22192 7.05093L9.63614 5.63672L16.0001 12.0007L9.63614 18.3646L8.22192 16.9504L13.1717 12.0007Z'%3E%3C/path%3E%3C/svg%3E");
+
+ &.last {
+ display: none;
+ }
+}
+
/* Deactivate the OLD bootstrap-2 modal
This is needed for LWC >=3.9 and the migration to bootstrap 5
This prevent old JS scripts to make the map unusable
diff --git a/tests/end2end/playwright/pages/project.js b/tests/end2end/playwright/pages/project.js
index f382d598d6..01907f78c0 100644
--- a/tests/end2end/playwright/pages/project.js
+++ b/tests/end2end/playwright/pages/project.js
@@ -824,6 +824,67 @@ export class ProjectPage extends BasePage {
await this.page.locator('#dock-close').click();
}
+ /**
+ * Checks group popup by layers component table and returns table rows
+ * @param {object[]} expectedResults array of expected values for each group
+ * @returns {Promise}
+ */
+ async checkGroupPopupByLayersGroups(expectedResults){
+ await expect(this.page.locator('lizmap-group-popup-layer')).toHaveCount(1);
+ let groups = this.page.locator('lizmap-group-popup-layer .lizmap-gpl-table tr');
+
+ await expect(groups).toHaveCount(expectedResults.length);
+ for (let i=0; i< expectedResults.length; i++) {
+ await expect(groups.nth(i).locator('td').nth(0)).toHaveText(expectedResults[i].name);
+ await expect(groups.nth(i).locator('td').nth(1)).toHaveText(`(${expectedResults[i].count})`);
+ }
+
+ return groups;
+ }
+
+ /**
+ * Checks the group popup by layers component single feature interface
+ * @param {number} backItemLength "Back to layers list" selector expected length
+ * @param {number} counterLength Counter selector expected length
+ * @param {string} counterText Counter selector expected text
+ * @param {number} navButtonsLength Nav buttons selector expected length
+ * @returns {Promise}
+ */
+ async checkGroupPopupByLayersFeatures(backItemLength, counterLength, counterText, navButtonsLength){
+ await expect(this.page.locator('lizmap-group-popup-layer .gpl-back')).toHaveCount(backItemLength);
+ await expect(this.page.locator('lizmap-group-popup-layer .gpl-counter')).toHaveCount(counterLength);
+ if(counterText) {
+ await expect(this.page.locator('lizmap-group-popup-layer .gpl-counter')).toHaveText(counterText);
+ }
+ await expect(this.page.locator('lizmap-group-popup-layer .gpl-nav-buttons button')).toHaveCount(navButtonsLength);
+ }
+
+ /**
+ * Group popup by layers: navigate features list back/forth based on direction parameter
+ * @param {string} direction possible values are 'next' or 'prev', default 'next'
+ */
+ async groupPopupByLayersSwitchFeature(direction = 'next'){
+ await this.page.locator(`lizmap-group-popup-layer .gpl-${direction}-popup`).click();
+ }
+
+ /**
+ * Group popup by layers: back to layers list
+ * @returns {Promise}
+ */
+ async groupPopupByLayersBackToList(){
+ await this.page.locator('lizmap-group-popup-layer .gpl-back').click();
+ }
+
+ /**
+ * Returns first level popup single features
+ * @param {boolean} groupPopupByLayer
+ * @returns {Promise}
+ */
+ async getPopupSingleFeatures(groupPopupByLayer = false){
+ const singleFeaturesSelector = `${groupPopupByLayer ? 'lizmap-group-popup-layer div[slot="popup"]':'.lizmapPopupContent'} > .lizmapPopupSingleFeature`;
+ return this.page.locator(singleFeaturesSelector);
+ }
+
/**
* clickOnMap function
* Click on the map at the given position
diff --git a/tests/end2end/playwright/popup.spec.js b/tests/end2end/playwright/popup.spec.js
index 9ad5f3d009..d5742f75f7 100644
--- a/tests/end2end/playwright/popup.spec.js
+++ b/tests/end2end/playwright/popup.spec.js
@@ -712,3 +712,210 @@ test.describe('Drag and drop design with relations', () => {
});
});
+
+test.describe('Group popup by layers @readonly', () => {
+
+ ['dock','map','minidock'].forEach((popupLocation) => {
+ test(`popup on ${popupLocation}`, async ({ page }) => {
+ if (popupLocation != 'minidock') {
+ await page.route('**/service/getProjectConfig*', async route => {
+ const response = await route.fetch();
+ const json = await response.json();
+ json.options['popupLocation'] = popupLocation;
+ await route.fulfill({ response, json });
+ });
+ }
+
+ const project = new ProjectPage(page, `popup_grouped_by_layer${popupLocation == 'minidock' ? '_minidock' : ''}`);
+ await project.open();
+ await project.closeLeftDock();
+
+ // Remove catching GetProjectConfig
+ if (popupLocation != 'minidock') {
+ await page.unroute('**/service/getProjectConfig*');
+ }
+ let getFeatureInfoPromise = project.waitForGetFeatureInfoRequest();
+ await project.clickOnMap(417, 289);
+ let getFeatureInfoRequest = await getFeatureInfoPromise;
+ let getFeatureInfoResponse = await getFeatureInfoRequest.response();
+ responseExpect(getFeatureInfoResponse).toBeHtml();
+ await page.waitForTimeout(500);
+
+ const loc = await page.evaluate('lizMap.config.options.popupLocation');
+ await expect(loc).toBe(popupLocation);
+
+ // check grouped layers
+ let groups = await project.checkGroupPopupByLayersGroups([
+ {
+ name: 'single_wms_points',
+ count: 4
+ },
+ {
+ name: 'single_wms_lines',
+ count: 1
+ },
+ {
+ name: 'single_wms_baselayer',
+ count: 1
+ },
+ ]);
+
+ // check first layer
+ await groups.nth(0).click();
+ await project.checkGroupPopupByLayersFeatures(1,1,'1/4',2);
+ let features = await project.getPopupSingleFeatures(true);
+ await expect(features).toHaveCount(6);
+
+ await expect(features.nth(0)).toBeVisible();
+ await expect(features.nth(0).locator('.lizmapPopupTitle')).toHaveText('single_wms_points');
+ await expect(features.nth(1)).not.toBeVisible();
+ await expect(features.nth(2)).not.toBeVisible();
+ await expect(features.nth(3)).not.toBeVisible();
+ await expect(features.nth(4)).not.toBeVisible();
+ await expect(features.nth(5)).not.toBeVisible();
+
+ // switch feature
+ await project.groupPopupByLayersSwitchFeature();
+
+ await project.checkGroupPopupByLayersFeatures(1,1,'2/4',2);
+
+ await expect(features.nth(0)).not.toBeVisible();
+ await expect(features.nth(1)).toBeVisible();
+ await expect(features.nth(2)).not.toBeVisible();
+ await expect(features.nth(3)).not.toBeVisible();
+ await expect(features.nth(4)).not.toBeVisible();
+ await expect(features.nth(5)).not.toBeVisible();
+
+ await project.groupPopupByLayersSwitchFeature();
+ await project.checkGroupPopupByLayersFeatures(1,1,'3/4',2);
+
+ await expect(features.nth(0)).not.toBeVisible();
+ await expect(features.nth(1)).not.toBeVisible();
+ await expect(features.nth(2)).toBeVisible();
+ await expect(features.nth(3)).not.toBeVisible();
+ await expect(features.nth(4)).not.toBeVisible();
+ await expect(features.nth(5)).not.toBeVisible();
+
+ await project.groupPopupByLayersSwitchFeature('prev');
+
+ await project.checkGroupPopupByLayersFeatures(1,1,'2/4',2);
+
+ await expect(features.nth(0)).not.toBeVisible();
+ await expect(features.nth(1)).toBeVisible();
+ await expect(features.nth(2)).not.toBeVisible();
+ await expect(features.nth(3)).not.toBeVisible();
+ await expect(features.nth(4)).not.toBeVisible();
+ await expect(features.nth(5)).not.toBeVisible();
+
+ await project.groupPopupByLayersSwitchFeature();
+
+ // back to layers list
+ await project.groupPopupByLayersBackToList();
+ groups = await project.checkGroupPopupByLayersGroups([
+ {
+ name: 'single_wms_points',
+ count: 4
+ },
+ {
+ name: 'single_wms_lines',
+ count: 1
+ },
+ {
+ name: 'single_wms_baselayer',
+ count: 1
+ },
+ ]);
+
+ await groups.nth(1).click();
+ await project.checkGroupPopupByLayersFeatures(1,0,'',0);
+
+ await expect(features.nth(0)).not.toBeVisible();
+ await expect(features.nth(1)).not.toBeVisible();
+ await expect(features.nth(2)).not.toBeVisible();
+ await expect(features.nth(3)).not.toBeVisible();
+ await expect(features.nth(4)).toBeVisible();
+ await expect(features.nth(4).locator('.lizmapPopupTitle')).toHaveText('single_wms_lines');
+ await expect(features.nth(5)).not.toBeVisible();
+
+ // check wether lizmap features table component is rendered
+ await expect(features.nth(4).locator('lizmap-features-table')).toHaveCount(1);
+
+ await project.groupPopupByLayersBackToList();
+ groups = await project.checkGroupPopupByLayersGroups([
+ {
+ name: 'single_wms_points',
+ count: 4
+ },
+ {
+ name: 'single_wms_lines',
+ count: 1
+ },
+ {
+ name: 'single_wms_baselayer',
+ count: 1
+ },
+ ]);
+
+ await groups.nth(2).click();
+ await project.checkGroupPopupByLayersFeatures(1,0,'',0);
+ await expect(page.locator('lizmap-group-popup-layer .gpl-back')).toHaveCount(1);
+ await expect(page.locator('lizmap-group-popup-layer .gpl-counter')).toHaveCount(0);
+ await expect(page.locator('lizmap-group-popup-layer .gpl-nav-buttons')).toHaveCount(0);
+ await expect(features.nth(0)).not.toBeVisible();
+ await expect(features.nth(1)).not.toBeVisible();
+ await expect(features.nth(2)).not.toBeVisible();
+ await expect(features.nth(3)).not.toBeVisible();
+ await expect(features.nth(4)).not.toBeVisible();
+ await expect(features.nth(5)).toBeVisible();
+ await expect(features.nth(5).locator('.lizmapPopupTitle')).toHaveText('single_wms_baselayer');
+
+ // the status is mantained
+ await project.groupPopupByLayersBackToList();
+ groups = await project.checkGroupPopupByLayersGroups([
+ {
+ name: 'single_wms_points',
+ count: 4
+ },
+ {
+ name: 'single_wms_lines',
+ count: 1
+ },
+ {
+ name: 'single_wms_baselayer',
+ count: 1
+ },
+ ]);
+
+ await groups.nth(0).click();
+ await project.checkGroupPopupByLayersFeatures(1,1,'3/4',2);
+
+ await expect(features.nth(0)).not.toBeVisible();
+ await expect(features.nth(1)).not.toBeVisible();
+ await expect(features.nth(2)).toBeVisible();
+ await expect(features.nth(3)).not.toBeVisible();
+ await expect(features.nth(4)).not.toBeVisible();
+ await expect(features.nth(5)).not.toBeVisible();
+
+ // check if relation is visible
+ await features.nth(2).locator('.nav-item').nth(1).click();
+ expect(features.nth(2).locator('.lizmapPopupSingleFeature[data-layer-id="table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74"]')).toBeVisible()
+
+ await project.switcher.click();
+ //turn off all layers except the single_wms_baselayer and then reuqest popup
+ await page.getByTestId('single_wms_polygons').locator('input').first().uncheck();
+ await page.getByTestId('single_wms_points').locator('input').first().uncheck();
+ await page.getByTestId('single_wms_lines_group').locator('input').first().uncheck();
+ await page.getByTestId('single_wms_lines').locator('input').first().uncheck();
+
+ getFeatureInfoPromise = project.waitForGetFeatureInfoRequest();
+ await project.clickOnMap(417, 289);
+ getFeatureInfoRequest = await getFeatureInfoPromise;
+ getFeatureInfoResponse = await getFeatureInfoRequest.response();
+ responseExpect(getFeatureInfoResponse).toBeHtml();
+ await page.waitForTimeout(500);
+
+ await project.checkGroupPopupByLayersFeatures(0,0,'',0);
+ })
+ })
+
+})
diff --git a/tests/js-units/data/popup_grouped_by_layer-capabilities.json b/tests/js-units/data/popup_grouped_by_layer-capabilities.json
new file mode 100644
index 0000000000..4b3f8281ff
--- /dev/null
+++ b/tests/js-units/data/popup_grouped_by_layer-capabilities.json
@@ -0,0 +1,549 @@
+{
+ "version": "1.3.0",
+ "Service": {
+ "Name": "WMS",
+ "Title": "popup_grouped_by_layer",
+ "KeywordList": [
+ "infoMapAccessService"
+ ],
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer",
+ "Fees": "conditions unknown",
+ "AccessConstraints": "None",
+ "MaxWidth": 3000,
+ "MaxHeight": 3000
+ },
+ "Capability": {
+ "Request": {
+ "GetCapabilities": {
+ "Format": [
+ "text/xml"
+ ],
+ "DCPType": [
+ {
+ "HTTP": {
+ "Get": {
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&"
+ }
+ }
+ }
+ ]
+ },
+ "GetMap": {
+ "Format": [
+ "image/jpeg",
+ "image/png",
+ "image/png; mode=16bit",
+ "image/png; mode=8bit",
+ "image/png; mode=1bit",
+ "application/dxf",
+ "application/pdf"
+ ],
+ "DCPType": [
+ {
+ "HTTP": {
+ "Get": {
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&"
+ }
+ }
+ }
+ ]
+ },
+ "GetFeatureInfo": {
+ "Format": [
+ "text/plain",
+ "text/html",
+ "text/xml",
+ "application/vnd.ogc.gml",
+ "application/vnd.ogc.gml/3.1.1",
+ "application/json",
+ "application/geo+json"
+ ],
+ "DCPType": [
+ {
+ "HTTP": {
+ "Get": {
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&"
+ }
+ }
+ }
+ ]
+ },
+ "GetLegendGraphic": {
+ "Format": [
+ "image/jpeg",
+ "image/png",
+ "application/json"
+ ],
+ "DCPType": [
+ {
+ "HTTP": {
+ "Get": {
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&"
+ }
+ }
+ }
+ ]
+ },
+ "DescribeLayer": {
+ "Format": [
+ "text/xml"
+ ],
+ "DCPType": [
+ {
+ "HTTP": {
+ "Get": {
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "Exception": [
+ "XML"
+ ],
+ "UserDefinedSymbolization": {
+ "SupportSLD": true,
+ "UserLayer": false,
+ "UserStyle": true,
+ "RemoteWFS": false,
+ "InlineFeatureData": false,
+ "RemoteWCS": false
+ },
+ "Layer": {
+ "Name": "popup_grouped_by_layer",
+ "Title": "popup_grouped_by_layer",
+ "KeywordList": [
+ "infoMapAccessService"
+ ],
+ "CRS": [
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857"
+ ],
+ "EX_GeographicBoundingBox": [
+ 3.532182,
+ 43.307761,
+ 4.284083,
+ 43.899598
+ ],
+ "BoundingBox": [
+ {
+ "extent": [
+ 393200.796,
+ 5358934.272,
+ 476901.936,
+ 5449917.762
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:3857"
+ },
+ {
+ "extent": [
+ 43.307761,
+ 3.532182,
+ 43.899598,
+ 4.284083
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:4326"
+ }
+ ],
+ "Layer": [
+ {
+ "Name": "single_wms_polygons",
+ "Title": "single_wms_polygons",
+ "CRS": [
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857",
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857"
+ ],
+ "EX_GeographicBoundingBox": [
+ 3.839991,
+ 43.573568,
+ 3.936443,
+ 43.637548
+ ],
+ "BoundingBox": [
+ {
+ "extent": [
+ 427465.947,
+ 5399686.412,
+ 438202.806,
+ 5409522.095
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:3857"
+ },
+ {
+ "extent": [
+ 43.573568,
+ 3.839991,
+ 43.637548,
+ 3.936443
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:4326"
+ }
+ ],
+ "Style": [
+ {
+ "Name": "default",
+ "Title": "default",
+ "LegendURL": [
+ {
+ "Format": "image/png",
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=single_wms_polygons&FORMAT=image/png&STYLE=default&SLD_VERSION=1.1.0",
+ "size": [
+ null,
+ null
+ ]
+ }
+ ]
+ }
+ ],
+ "queryable": true,
+ "opaque": false,
+ "noSubsets": false
+ },
+ {
+ "Name": "table_for_relationnal_value",
+ "Title": "table_for_relationnal_value",
+ "Style": [
+ {
+ "Name": "default",
+ "Title": "default",
+ "LegendURL": [
+ {
+ "Format": "image/png",
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=table_for_relationnal_value&FORMAT=image/png&STYLE=default&SLD_VERSION=1.1.0",
+ "size": [
+ null,
+ null
+ ]
+ }
+ ]
+ }
+ ],
+ "queryable": true,
+ "opaque": false,
+ "noSubsets": false,
+ "CRS": [
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857"
+ ],
+ "BoundingBox": [
+ {
+ "extent": [
+ 393200.796,
+ 5358934.272,
+ 476901.936,
+ 5449917.762
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:3857"
+ },
+ {
+ "extent": [
+ 43.307761,
+ 3.532182,
+ 43.899598,
+ 4.284083
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:4326"
+ }
+ ],
+ "EX_GeographicBoundingBox": [
+ 3.532182,
+ 43.307761,
+ 4.284083,
+ 43.899598
+ ]
+ },
+ {
+ "Name": "single_wms_points",
+ "Title": "single_wms_points",
+ "CRS": [
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857",
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857"
+ ],
+ "EX_GeographicBoundingBox": [
+ 3.856645,
+ 43.571055,
+ 3.954022,
+ 43.622983
+ ],
+ "BoundingBox": [
+ {
+ "extent": [
+ 429319.793,
+ 5399300.194,
+ 440159.643,
+ 5407282.031
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:3857"
+ },
+ {
+ "extent": [
+ 43.571055,
+ 3.856645,
+ 43.622983,
+ 3.954022
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:4326"
+ }
+ ],
+ "Style": [
+ {
+ "Name": "default",
+ "Title": "default",
+ "LegendURL": [
+ {
+ "Format": "image/png",
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=single_wms_points&FORMAT=image/png&STYLE=default&SLD_VERSION=1.1.0",
+ "size": [
+ null,
+ null
+ ]
+ }
+ ]
+ }
+ ],
+ "queryable": true,
+ "opaque": false,
+ "noSubsets": false
+ },
+ {
+ "Name": "single_wms_lines_group",
+ "Title": "single_wms_lines_group",
+ "CRS": [
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857",
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857"
+ ],
+ "EX_GeographicBoundingBox": [
+ 3.881741,
+ 43.620052,
+ 3.893769,
+ 43.629094
+ ],
+ "BoundingBox": [
+ {
+ "extent": [
+ 432113.436,
+ 5406831.442,
+ 433452.326,
+ 5408221.828
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:3857"
+ },
+ {
+ "extent": [
+ 43.620052,
+ 3.881741,
+ 43.629094,
+ 3.893769
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:4326"
+ }
+ ],
+ "Style": [
+ {
+ "Name": "default",
+ "Title": "default",
+ "LegendURL": [
+ {
+ "Format": "image/png",
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=single_wms_lines_group&FORMAT=image/png&STYLE=default&SLD_VERSION=1.1.0",
+ "size": [
+ null,
+ null
+ ]
+ }
+ ]
+ }
+ ],
+ "queryable": true,
+ "opaque": false,
+ "noSubsets": false
+ },
+ {
+ "Name": "single_wms_lines",
+ "Title": "single_wms_lines",
+ "CRS": [
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857",
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857"
+ ],
+ "EX_GeographicBoundingBox": [
+ 3.812698,
+ 43.564016,
+ 3.914007,
+ 43.627504
+ ],
+ "BoundingBox": [
+ {
+ "extent": [
+ 424427.7,
+ 5398218.784,
+ 435705.263,
+ 5407977.223
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:3857"
+ },
+ {
+ "extent": [
+ 43.564016,
+ 3.812698,
+ 43.627504,
+ 3.914007
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:4326"
+ }
+ ],
+ "Style": [
+ {
+ "Name": "default",
+ "Title": "default",
+ "LegendURL": [
+ {
+ "Format": "image/png",
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=single_wms_lines&FORMAT=image/png&STYLE=default&SLD_VERSION=1.1.0",
+ "size": [
+ null,
+ null
+ ]
+ }
+ ]
+ }
+ ],
+ "queryable": true,
+ "opaque": false,
+ "noSubsets": false
+ },
+ {
+ "Name": "single_wms_baselayer",
+ "Title": "single_wms_baselayer",
+ "CRS": [
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857",
+ "CRS:84",
+ "EPSG:4326",
+ "EPSG:3857"
+ ],
+ "EX_GeographicBoundingBox": [
+ 3.802984,
+ 43.5641,
+ 3.982009,
+ 43.657046
+ ],
+ "BoundingBox": [
+ {
+ "extent": [
+ 423346.29,
+ 5398231.658,
+ 443275.134,
+ 5412521.72
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:3857"
+ },
+ {
+ "extent": [
+ 43.5641,
+ 3.802984,
+ 43.657046,
+ 3.982009
+ ],
+ "res": [
+ null,
+ null
+ ],
+ "crs": "EPSG:4326"
+ }
+ ],
+ "Style": [
+ {
+ "Name": "default",
+ "Title": "default",
+ "LegendURL": [
+ {
+ "Format": "image/png",
+ "OnlineResource": "http://localhost:8130/index.php/lizmap/service?repository=testsrepository&project=popup_grouped_by_layer&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetLegendGraphic&LAYER=single_wms_baselayer&FORMAT=image/png&STYLE=default&SLD_VERSION=1.1.0",
+ "size": [
+ null,
+ null
+ ]
+ }
+ ]
+ }
+ ],
+ "queryable": true,
+ "opaque": false,
+ "noSubsets": false
+ }
+ ]
+ }
+ }
+ }
diff --git a/tests/js-units/data/popup_grouped_by_layer-config.json b/tests/js-units/data/popup_grouped_by_layer-config.json
new file mode 100644
index 0000000000..113cda8f28
--- /dev/null
+++ b/tests/js-units/data/popup_grouped_by_layer-config.json
@@ -0,0 +1,306 @@
+{
+ "metadata": {
+ "qgis_desktop_version": 34010,
+ "lizmap_plugin_version_str": "4.5.9",
+ "lizmap_plugin_version": 40509,
+ "lizmap_web_client_target_version": 31100,
+ "lizmap_web_client_target_status": "Dev",
+ "instance_target_url": "http://localhost:8130/",
+ "instance_target_repository": "intranet"
+ },
+ "warnings": {},
+ "debug": {
+ "total_time": 0
+ },
+ "options": {
+ "projection": {
+ "proj4": "+proj=longlat +datum=WGS84 +no_defs",
+ "ref": "EPSG:4326"
+ },
+ "bbox": [
+ "3.53218285499999984",
+ "43.30776180400000186",
+ "4.28408297699999974",
+ "43.89959731999999804"
+ ],
+ "mapScales": [
+ 10000,
+ 25000,
+ 50000,
+ 100000,
+ 250000,
+ 500000
+ ],
+ "minScale": 1,
+ "maxScale": 1000000000,
+ "use_native_zoom_levels": false,
+ "hide_numeric_scale_value": false,
+ "initialExtent": [
+ 3.532182855,
+ 43.307761804,
+ 4.284082977,
+ 43.89959732
+ ],
+ "popupLocation": "dock",
+ "pointTolerance": 25,
+ "lineTolerance": 10,
+ "polygonTolerance": 5,
+ "automatic_permalink": false,
+ "tmTimeFrameSize": 10,
+ "group_popup_by_layer": true,
+ "tmTimeFrameType": "seconds",
+ "tmAnimationFrameLength": 1000,
+ "datavizLocation": "dock",
+ "theme": "dark",
+ "fixed_scale_overview_map": true,
+ "dataviz_drag_drop": []
+ },
+ "layers": {
+ "single_wms_polygons": {
+ "id": "single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb",
+ "name": "single_wms_polygons",
+ "type": "layer",
+ "geometryType": "polygon",
+ "extent": [
+ 3.839991945080798,
+ 43.57356896293618,
+ 3.936442772758097,
+ 43.63754756174983
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_polygons",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "table_for_relationnal_value": {
+ "id": "table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74",
+ "name": "table_for_relationnal_value",
+ "type": "layer",
+ "geometryType": "none",
+ "extent": [
+ 1.7976931348623157e+308,
+ 1.7976931348623157e+308,
+ -1.7976931348623157e+308,
+ -1.7976931348623157e+308
+ ],
+ "crs": "",
+ "title": "table_for_relationnal_value",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "False",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_points": {
+ "id": "single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05",
+ "name": "single_wms_points",
+ "type": "layer",
+ "geometryType": "point",
+ "extent": [
+ 3.85664532539918,
+ 43.57105532588823,
+ 3.954021340871944,
+ 43.62298250356228
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_points",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "form",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "True",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_lines_group": {
+ "id": "single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918",
+ "name": "single_wms_lines_group",
+ "type": "layer",
+ "geometryType": "line",
+ "extent": [
+ 3.881741044351187,
+ 43.62005232408322,
+ 3.89376848569224,
+ 43.62909356120091
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_lines_group",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_lines": {
+ "id": "single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5",
+ "name": "single_wms_lines",
+ "type": "layer",
+ "geometryType": "line",
+ "extent": [
+ 3.81269890511456,
+ 43.564016584018404,
+ 3.914006968718052,
+ 43.627503071758575
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_lines",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": true,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_baselayer": {
+ "id": "single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937",
+ "name": "single_wms_baselayer",
+ "type": "layer",
+ "geometryType": "polygon",
+ "extent": [
+ 3.802984433262168,
+ 43.56410038340208,
+ 3.982008271684779,
+ 43.657045818700006
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_baselayer",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ }
+ },
+ "atlas": {
+ "layers": []
+ },
+ "locateByLayer": {},
+ "attributeLayers": {
+ "table_for_relationnal_value": {
+ "layerId": "table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74",
+ "primaryKey": "gid",
+ "export_enabled": true,
+ "pivot": "False",
+ "hideAsChild": "False",
+ "hideLayer": "False",
+ "custom_config": "False",
+ "order": 0
+ }
+ },
+ "tooltipLayers": {},
+ "editionLayers": {},
+ "layouts": {
+ "config": {
+ "default_popup_print": false
+ },
+ "list": []
+ },
+ "loginFilteredLayers": {},
+ "timemanagerLayers": {},
+ "datavizLayers": {},
+ "filter_by_polygon": {
+ "config": {
+ "polygon_layer_id": "single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937",
+ "group_field": "id",
+ "filter_by_user": false
+ },
+ "layers": []
+ },
+ "formFilterLayers": {}
+}
diff --git a/tests/js-units/node/config.test.js b/tests/js-units/node/config.test.js
index cbe3a861ba..91aad2bdc6 100644
--- a/tests/js-units/node/config.test.js
+++ b/tests/js-units/node/config.test.js
@@ -169,4 +169,18 @@ describe('Config', function () {
expect(initialConfig.options.exclude_basemaps_from_single_wms).to.be.eq(false)
})
+ it('Group Popup by Layer Config', function () {
+ const capabilities = JSON.parse(readFileSync('./tests/js-units/data/popup_grouped_by_layer-capabilities.json', 'utf8'));
+ expect(capabilities).to.not.be.undefined
+ expect(capabilities.Capability).to.not.be.undefined
+
+ const config = JSON.parse(readFileSync('./tests/js-units/data/popup_grouped_by_layer-config.json', 'utf8'));
+ expect(config).to.not.be.undefined
+
+ const initialConfig = new Config(config, capabilities);
+
+ expect(initialConfig.options).to.be.instanceOf(OptionsConfig)
+ expect(initialConfig.options.group_popup_by_layer).to.be.eq(true)
+ })
+
})
diff --git a/tests/qgis-projects/tests/popup_grouped_by_layer.qgs b/tests/qgis-projects/tests/popup_grouped_by_layer.qgs
new file mode 100644
index 0000000000..0a01744493
--- /dev/null
+++ b/tests/qgis-projects/tests/popup_grouped_by_layer.qgs
@@ -0,0 +1,2799 @@
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937
+ - single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5
+ - single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918
+ - single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05
+ - single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ degrees
+
+ 3.73088700589161171
+ 43.52275789326798616
+ 4.08334018778612595
+ 43.70574421901084605
+
+ 0
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+ 0
+
+
+
+
+
+
+ Annotations_5593efa9_1bf5_405f_9bb1_cfd646d4e237
+
+
+
+
+ Annotations
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+ 1
+ 0
+
+
+
+
+
+ 3.80298443326216784
+ 43.56410038340207791
+ 3.98200827168477911
+ 43.65704581870000567
+
+
+ 3.80298443326216784
+ 43.56410038340207791
+ 3.98200827168477911
+ 43.65704581870000567
+
+ single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=Polygon checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_baselayer" (geom)
+ single_wms_baselayer
+
+
+
+ single_wms_baselayer
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+ 3.81269890511455989
+ 43.56401658401840393
+ 3.91400696871805209
+ 43.627503071758575
+
+
+ 3.81269890511455989
+ 43.56401658401840393
+ 3.91400696871805209
+ 43.627503071758575
+
+ single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=LineString checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_lines" (geom)
+ single_wms_lines
+
+
+
+ single_wms_lines
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+ 3.88174104435118705
+ 43.62005232408321831
+ 3.89376848569223988
+ 43.62909356120091076
+
+
+ 3.88174104435118705
+ 43.62005232408321831
+ 3.89376848569223988
+ 43.62909356120091076
+
+ single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=LineString checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_lines_group" (geom)
+ single_wms_lines_group
+
+
+
+ single_wms_lines_group
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "title"
+
+
+
+
+ 3.85664532539917992
+ 43.57105532588823138
+ 3.95402134087194401
+ 43.62298250356227669
+
+
+ 3.85664532539917992
+ 43.57105532588823138
+ 3.95402134087194401
+ 43.62298250356227669
+
+ single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=Point checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_points" (geom)
+ single_wms_points
+
+
+
+ single_wms_points
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ tablayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "title"
+
+
+
+
+ 3.839991945080798
+ 43.57356896293617865
+ 3.93644277275809706
+ 43.63754756174982674
+
+
+ 3.839991945080798
+ 43.57356896293617865
+ 3.93644277275809706
+ 43.63754756174982674
+
+ single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=Polygon checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_polygons" (geom)
+ single_wms_polygons
+
+
+
+ single_wms_polygons
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+ table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74
+ service='lizmapdb' key='gid' checkPrimaryKeyUnicity='1' table="tests_projects"."table_for_relationnal_value"
+ table_for_relationnal_value
+
+
+
+ table_for_relationnal_value
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "label"
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 255
+ 255
+ 255
+ 255
+ 0
+ 255
+ 255
+
+
+
+
+
+
+ EPSG:7030
+
+
+ m2
+ meters
+
+
+ 5
+ 2.5
+ false
+ false
+ false
+ 1
+ 0
+ false
+ false
+ true
+ 0
+ 255,0,0,255,rgb:1,0,0,1
+
+
+ false
+
+
+ true
+ 2
+
+ false
+
+ 1
+
+
+
+ lizmap_repository
+ lizmap_user
+ lizmap_user_groups
+
+
+ intranet
+
+
+
+
+
+
+
+ single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937
+ single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5
+ single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918
+ single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05
+ single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb
+ table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74
+
+
+ 8
+ 8
+ 8
+ 8
+ 8
+ 8
+
+
+
+
+
+
+
+ None
+ false
+ true
+
+
+
+
+
+ 1
+
+ 3.53218285499999984
+ 43.30776180400000186
+ 4.28408297699999974
+ 43.89959731999999804
+
+ false
+ conditions unknown
+ 90
+
+
+
+ 1
+
+ 8
+ popup_grouped_by_layer
+ false
+
+ true
+ popup_grouped_by_layer
+ false
+ 0
+
+ false
+
+
+
+
+
+
+
+ false
+
+
+
+
+ false
+
+ 5000
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Riccardo Beltrami
+ 2026-03-27T10:46:29
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
diff --git a/tests/qgis-projects/tests/popup_grouped_by_layer.qgs.cfg b/tests/qgis-projects/tests/popup_grouped_by_layer.qgs.cfg
new file mode 100644
index 0000000000..9f6cfc32fc
--- /dev/null
+++ b/tests/qgis-projects/tests/popup_grouped_by_layer.qgs.cfg
@@ -0,0 +1,307 @@
+{
+ "metadata": {
+ "qgis_desktop_version": 34010,
+ "lizmap_plugin_version_str": "4.5.9",
+ "lizmap_plugin_version": 40509,
+ "lizmap_web_client_target_version": 31100,
+ "lizmap_web_client_target_status": "Dev",
+ "instance_target_url": "http://localhost:8130/",
+ "instance_target_repository": "intranet"
+ },
+ "warnings": {},
+ "debug": {
+ "total_time": 0
+ },
+ "options": {
+ "projection": {
+ "proj4": "+proj=longlat +datum=WGS84 +no_defs",
+ "ref": "EPSG:4326"
+ },
+ "bbox": [
+ "3.53218285499999984",
+ "43.30776180400000186",
+ "4.28408297699999974",
+ "43.89959731999999804"
+ ],
+ "mapScales": [
+ 10000,
+ 25000,
+ 50000,
+ 100000,
+ 250000,
+ 500000
+ ],
+ "minScale": 1,
+ "maxScale": 1000000000,
+ "use_native_zoom_levels": false,
+ "hide_numeric_scale_value": false,
+ "initialExtent": [
+ 3.532182855,
+ 43.307761804,
+ 4.284082977,
+ 43.89959732
+ ],
+ "popupLocation": "dock",
+ "pointTolerance": 25,
+ "lineTolerance": 10,
+ "polygonTolerance": 5,
+ "automatic_permalink": false,
+ "wms_single_request_for_all_layers": true,
+ "group_popup_by_layer": true,
+ "tmTimeFrameSize": 10,
+ "tmTimeFrameType": "seconds",
+ "tmAnimationFrameLength": 1000,
+ "datavizLocation": "dock",
+ "theme": "dark",
+ "fixed_scale_overview_map": true,
+ "dataviz_drag_drop": []
+ },
+ "layers": {
+ "single_wms_polygons": {
+ "id": "single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb",
+ "name": "single_wms_polygons",
+ "type": "layer",
+ "geometryType": "polygon",
+ "extent": [
+ 3.839991945080798,
+ 43.57356896293618,
+ 3.936442772758097,
+ 43.63754756174983
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_polygons",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "table_for_relationnal_value": {
+ "id": "table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74",
+ "name": "table_for_relationnal_value",
+ "type": "layer",
+ "geometryType": "none",
+ "extent": [
+ 1.7976931348623157e+308,
+ 1.7976931348623157e+308,
+ -1.7976931348623157e+308,
+ -1.7976931348623157e+308
+ ],
+ "crs": "",
+ "title": "table_for_relationnal_value",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "False",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_points": {
+ "id": "single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05",
+ "name": "single_wms_points",
+ "type": "layer",
+ "geometryType": "point",
+ "extent": [
+ 3.85664532539918,
+ 43.57105532588823,
+ 3.954021340871944,
+ 43.62298250356228
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_points",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "form",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "True",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_lines_group": {
+ "id": "single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918",
+ "name": "single_wms_lines_group",
+ "type": "layer",
+ "geometryType": "line",
+ "extent": [
+ 3.881741044351187,
+ 43.62005232408322,
+ 3.89376848569224,
+ 43.62909356120091
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_lines_group",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_lines": {
+ "id": "single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5",
+ "name": "single_wms_lines",
+ "type": "layer",
+ "geometryType": "line",
+ "extent": [
+ 3.81269890511456,
+ 43.564016584018404,
+ 3.914006968718052,
+ 43.627503071758575
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_lines",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": true,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_baselayer": {
+ "id": "single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937",
+ "name": "single_wms_baselayer",
+ "type": "layer",
+ "geometryType": "polygon",
+ "extent": [
+ 3.802984433262168,
+ 43.56410038340208,
+ 3.982008271684779,
+ 43.657045818700006
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_baselayer",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ }
+ },
+ "atlas": {
+ "layers": []
+ },
+ "locateByLayer": {},
+ "attributeLayers": {
+ "table_for_relationnal_value": {
+ "layerId": "table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74",
+ "primaryKey": "gid",
+ "export_enabled": true,
+ "pivot": "False",
+ "hideAsChild": "False",
+ "hideLayer": "False",
+ "custom_config": "False",
+ "order": 0
+ }
+ },
+ "tooltipLayers": {},
+ "editionLayers": {},
+ "layouts": {
+ "config": {
+ "default_popup_print": false
+ },
+ "list": []
+ },
+ "loginFilteredLayers": {},
+ "timemanagerLayers": {},
+ "datavizLayers": {},
+ "filter_by_polygon": {
+ "config": {
+ "polygon_layer_id": "single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937",
+ "group_field": "id",
+ "filter_by_user": false
+ },
+ "layers": []
+ },
+ "formFilterLayers": {}
+}
diff --git a/tests/qgis-projects/tests/popup_grouped_by_layer_minidock.qgs b/tests/qgis-projects/tests/popup_grouped_by_layer_minidock.qgs
new file mode 100644
index 0000000000..29a9efa61d
--- /dev/null
+++ b/tests/qgis-projects/tests/popup_grouped_by_layer_minidock.qgs
@@ -0,0 +1,2799 @@
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937
+ - single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5
+ - single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918
+ - single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05
+ - single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ degrees
+
+ 3.73088700589161171
+ 43.52275789326798616
+ 4.08334018778612595
+ 43.70574421901084605
+
+ 0
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+ 0
+
+
+
+
+
+
+ Annotations_5593efa9_1bf5_405f_9bb1_cfd646d4e237
+
+
+
+
+ Annotations
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+ 1
+ 0
+
+
+
+
+
+ 3.80298443326216784
+ 43.56410038340207791
+ 3.98200827168477911
+ 43.65704581870000567
+
+
+ 3.80298443326216784
+ 43.56410038340207791
+ 3.98200827168477911
+ 43.65704581870000567
+
+ single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=Polygon checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_baselayer" (geom)
+ single_wms_baselayer
+
+
+
+ single_wms_baselayer
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+ 3.81269890511455989
+ 43.56401658401840393
+ 3.91400696871805209
+ 43.627503071758575
+
+
+ 3.81269890511455989
+ 43.56401658401840393
+ 3.91400696871805209
+ 43.627503071758575
+
+ single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=LineString checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_lines" (geom)
+ single_wms_lines
+
+
+
+ single_wms_lines
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+ 3.88174104435118705
+ 43.62005232408321831
+ 3.89376848569223988
+ 43.62909356120091076
+
+
+ 3.88174104435118705
+ 43.62005232408321831
+ 3.89376848569223988
+ 43.62909356120091076
+
+ single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=LineString checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_lines_group" (geom)
+ single_wms_lines_group
+
+
+
+ single_wms_lines_group
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "title"
+
+
+
+
+ 3.85664532539917992
+ 43.57105532588823138
+ 3.95402134087194401
+ 43.62298250356227669
+
+
+ 3.85664532539917992
+ 43.57105532588823138
+ 3.95402134087194401
+ 43.62298250356227669
+
+ single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=Point checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_points" (geom)
+ single_wms_points
+
+
+
+ single_wms_points
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ tablayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "title"
+
+
+
+
+ 3.839991945080798
+ 43.57356896293617865
+ 3.93644277275809706
+ 43.63754756174982674
+
+
+ 3.839991945080798
+ 43.57356896293617865
+ 3.93644277275809706
+ 43.63754756174982674
+
+ single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb
+ service='lizmapdb' key='id' estimatedmetadata=true srid=4326 type=Polygon checkPrimaryKeyUnicity='1' table="tests_projects"."single_wms_polygons" (geom)
+ single_wms_polygons
+
+
+
+ single_wms_polygons
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+ table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74
+ service='lizmapdb' key='gid' checkPrimaryKeyUnicity='1' table="tests_projects"."table_for_relationnal_value"
+ table_for_relationnal_value
+
+
+
+ table_for_relationnal_value
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+ dataset
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+ postgres
+
+
+
+
+
+
+
+
+
+
+ 1
+ 1
+ 1
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 0
+ generatedlayout
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ "label"
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+ 255
+ 255
+ 255
+ 255
+ 0
+ 255
+ 255
+
+
+
+
+
+
+ EPSG:7030
+
+
+ m2
+ meters
+
+
+ 5
+ 2.5
+ false
+ false
+ false
+ 1
+ 0
+ false
+ false
+ true
+ 0
+ 255,0,0,255,rgb:1,0,0,1
+
+
+ false
+
+
+ true
+ 2
+
+ false
+
+ 1
+
+
+
+ lizmap_repository
+ lizmap_user
+ lizmap_user_groups
+
+
+ intranet
+
+
+
+
+
+
+
+ single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937
+ single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5
+ single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918
+ single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05
+ single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb
+ table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74
+
+
+ 8
+ 8
+ 8
+ 8
+ 8
+ 8
+
+
+
+
+
+
+
+ None
+ false
+ true
+
+
+
+
+
+ 1
+
+ 3.53218285499999984
+ 43.30776180400000186
+ 4.28408297699999974
+ 43.89959731999999804
+
+ false
+ conditions unknown
+ 90
+
+
+
+ 1
+
+ 8
+ popup_grouped_by_layer_minidock
+ false
+
+ true
+ popup_grouped_by_layer_minidock
+ false
+ 0
+
+ false
+
+
+
+
+
+
+
+ false
+
+
+
+
+ false
+
+ 5000
+
+
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Riccardo Beltrami
+ 2026-03-27T10:46:29
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ GEOGCRS["WGS 84",ENSEMBLE["World Geodetic System 1984 ensemble",MEMBER["World Geodetic System 1984 (Transit)"],MEMBER["World Geodetic System 1984 (G730)"],MEMBER["World Geodetic System 1984 (G873)"],MEMBER["World Geodetic System 1984 (G1150)"],MEMBER["World Geodetic System 1984 (G1674)"],MEMBER["World Geodetic System 1984 (G1762)"],MEMBER["World Geodetic System 1984 (G2139)"],MEMBER["World Geodetic System 1984 (G2296)"],ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ENSEMBLEACCURACY[2.0]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]
+ +proj=longlat +datum=WGS84 +no_defs
+ 3452
+ 4326
+ EPSG:4326
+ WGS 84
+ longlat
+ EPSG:7030
+ true
+
+
+
+
+
+
+
diff --git a/tests/qgis-projects/tests/popup_grouped_by_layer_minidock.qgs.cfg b/tests/qgis-projects/tests/popup_grouped_by_layer_minidock.qgs.cfg
new file mode 100644
index 0000000000..75a4e8a55b
--- /dev/null
+++ b/tests/qgis-projects/tests/popup_grouped_by_layer_minidock.qgs.cfg
@@ -0,0 +1,306 @@
+{
+ "metadata": {
+ "qgis_desktop_version": 34010,
+ "lizmap_plugin_version_str": "4.5.9",
+ "lizmap_plugin_version": 40509,
+ "lizmap_web_client_target_version": 31100,
+ "lizmap_web_client_target_status": "Dev",
+ "instance_target_url": "http://localhost:8130/",
+ "instance_target_repository": "intranet"
+ },
+ "warnings": {},
+ "debug": {
+ "total_time": 0.164
+ },
+ "options": {
+ "projection": {
+ "proj4": "+proj=longlat +datum=WGS84 +no_defs",
+ "ref": "EPSG:4326"
+ },
+ "bbox": [
+ "3.53218285499999984",
+ "43.30776180400000186",
+ "4.28408297699999974",
+ "43.89959731999999804"
+ ],
+ "mapScales": [
+ 10000,
+ 25000,
+ 50000,
+ 100000,
+ 250000,
+ 500000
+ ],
+ "minScale": 1,
+ "maxScale": 1000000000,
+ "use_native_zoom_levels": false,
+ "hide_numeric_scale_value": false,
+ "initialExtent": [
+ 3.532182855,
+ 43.307761804,
+ 4.284082977,
+ 43.89959732
+ ],
+ "popupLocation": "minidock",
+ "pointTolerance": 25,
+ "lineTolerance": 10,
+ "polygonTolerance": 5,
+ "automatic_permalink": false,
+ "group_popup_by_layer": true,
+ "tmTimeFrameSize": 10,
+ "tmTimeFrameType": "seconds",
+ "tmAnimationFrameLength": 1000,
+ "datavizLocation": "dock",
+ "theme": "dark",
+ "fixed_scale_overview_map": true,
+ "dataviz_drag_drop": []
+ },
+ "layers": {
+ "single_wms_polygons": {
+ "id": "single_wms_polygons_9beb2388_97f6_455f_854a_351fff0ba5cb",
+ "name": "single_wms_polygons",
+ "type": "layer",
+ "geometryType": "polygon",
+ "extent": [
+ 3.839991945080798,
+ 43.57356896293618,
+ 3.936442772758097,
+ 43.63754756174983
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_polygons",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "table_for_relationnal_value": {
+ "id": "table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74",
+ "name": "table_for_relationnal_value",
+ "type": "layer",
+ "geometryType": "none",
+ "extent": [
+ 1.7976931348623157e+308,
+ 1.7976931348623157e+308,
+ -1.7976931348623157e+308,
+ -1.7976931348623157e+308
+ ],
+ "crs": "",
+ "title": "table_for_relationnal_value",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "False",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_points": {
+ "id": "single_wms_points_d024c177_c07b_4f22_95eb_94c54ee87c05",
+ "name": "single_wms_points",
+ "type": "layer",
+ "geometryType": "point",
+ "extent": [
+ 3.85664532539918,
+ 43.57105532588823,
+ 3.954021340871944,
+ 43.62298250356228
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_points",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "form",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "True",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_lines_group": {
+ "id": "single_wms_lines_group_7e1171a1_1c40_4b82_af30_8b64d5c8f918",
+ "name": "single_wms_lines_group",
+ "type": "layer",
+ "geometryType": "line",
+ "extent": [
+ 3.881741044351187,
+ 43.62005232408322,
+ 3.89376848569224,
+ 43.62909356120091
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_lines_group",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_lines": {
+ "id": "single_wms_lines_3c59223a_66b7_4f40_98fe_b7afe35b5ce5",
+ "name": "single_wms_lines",
+ "type": "layer",
+ "geometryType": "line",
+ "extent": [
+ 3.81269890511456,
+ 43.564016584018404,
+ 3.914006968718052,
+ 43.627503071758575
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_lines",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": true,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ },
+ "single_wms_baselayer": {
+ "id": "single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937",
+ "name": "single_wms_baselayer",
+ "type": "layer",
+ "geometryType": "polygon",
+ "extent": [
+ 3.802984433262168,
+ 43.56410038340208,
+ 3.982008271684779,
+ 43.657045818700006
+ ],
+ "crs": "EPSG:4326",
+ "title": "single_wms_baselayer",
+ "abstract": "",
+ "link": "",
+ "minScale": 1,
+ "maxScale": 1000000000000,
+ "toggled": "True",
+ "popup": "True",
+ "popupSource": "auto",
+ "popupTemplate": "",
+ "popupMaxFeatures": 10,
+ "children_lizmap_features_table": false,
+ "popupDisplayChildren": "False",
+ "popup_allow_download": true,
+ "legend_image_option": "hide_at_startup",
+ "groupAsLayer": "False",
+ "baseLayer": "False",
+ "displayInLegend": "True",
+ "group_visibility": [],
+ "singleTile": "True",
+ "imageFormat": "image/png",
+ "cached": "False",
+ "clientCacheExpiration": 300
+ }
+ },
+ "atlas": {
+ "layers": []
+ },
+ "locateByLayer": {},
+ "attributeLayers": {
+ "table_for_relationnal_value": {
+ "layerId": "table_for_relationnal_value_fbba335b_1fa6_4560_9eed_7591c0aa9b74",
+ "primaryKey": "gid",
+ "export_enabled": true,
+ "pivot": "False",
+ "hideAsChild": "False",
+ "hideLayer": "False",
+ "custom_config": "False",
+ "order": 0
+ }
+ },
+ "tooltipLayers": {},
+ "editionLayers": {},
+ "layouts": {
+ "config": {
+ "default_popup_print": false
+ },
+ "list": []
+ },
+ "loginFilteredLayers": {},
+ "timemanagerLayers": {},
+ "datavizLayers": {},
+ "filter_by_polygon": {
+ "config": {
+ "polygon_layer_id": "single_wms_baselayer_00d2213e_7c10_4806_83ef_a91f58fbd937",
+ "group_field": "id",
+ "filter_by_user": false
+ },
+ "layers": []
+ },
+ "formFilterLayers": {}
+}