diff --git a/assets/src/components/ActionSelector.js b/assets/src/components/ActionSelector.js index 2453a46628..2757e2eec7 100644 --- a/assets/src/components/ActionSelector.js +++ b/assets/src/components/ActionSelector.js @@ -70,6 +70,9 @@ export default class ActionSelector extends HTMLElement { } onActionSelectChange(event) { + // Remove previous digitizing tool if any + document.getElementById('action-digitizing')?.remove(); + // Get the host component let host = event.target.closest("lizmap-action-selector"); @@ -93,6 +96,18 @@ export default class ActionSelector extends HTMLElement { if ('description' in action && action.description) { description = action.description; } + if (action?.geometry) { + const actionDigitizing = `
`; + document.querySelector('.action-selector-container').insertAdjacentHTML('afterend', actionDigitizing); + mainLizmap.digitizing.context = "action"; + mainLizmap.digitizing.toggleVisibility(true); + } else { + mainLizmap.digitizing.toolSelected = 'deactivate' + mainLizmap.digitizing.toggleVisibility(false); + } + } else { + mainLizmap.digitizing.toolSelected = 'deactivate' + mainLizmap.digitizing.toggleVisibility(false); } descriptionSpan.textContent = description; @@ -117,6 +132,7 @@ export default class ActionSelector extends HTMLElement { onActionDeactivateClick(event) { // Deactivate the current active action + mainLizmap.digitizing.eraseAll(); mainLizmap.action.resetLizmapAction(); } diff --git a/assets/src/modules/Action.js b/assets/src/modules/Action.js index d7ad26ac26..6cf675cc4f 100644 --- a/assets/src/modules/Action.js +++ b/assets/src/modules/Action.js @@ -142,7 +142,13 @@ export default class Action { } }); } - + mainLizmap.lizmap3.events.on({ + minidockclosed: (event) => { + if (event.id === 'action'){ + mainLizmap.digitizing.toolSelected = 'deactivate'; + } + } + }); } /** @@ -376,11 +382,22 @@ export default class Action { return false; } + const WKTformat = new WKT(); + const projOptions = { + featureProjection: mainLizmap.projection, + dataProjection: 'EPSG:4326' + }; + // Reset the other actions // We allow only one active action at a time // We do not remove the active status of the button (btn-primary) this.resetLizmapAction(true, true, true, false); + // Take drawn geometry if any and if none exists as a parameter + if (!wkt && mainLizmap.digitizing.context === "action" && mainLizmap.digitizing.featureDrawn) { + wkt = WKTformat.writeFeatures(mainLizmap.digitizing.featureDrawn, projOptions); + } + // Set the request parameters let options = { "layerId": layerId, @@ -391,11 +408,6 @@ export default class Action { // We add the map extent and center // as WKT geometries - const WKTformat = new WKT(); - const projOptions = { - featureProjection: mainLizmap.projection, - dataProjection: 'EPSG:4326' - }; options['mapExtent'] = WKTformat.writeGeometry(fromExtent(mainLizmap.extent), projOptions); options['mapCenter'] = WKTformat.writeGeometry(new Point(mainLizmap.center), projOptions); @@ -444,6 +456,12 @@ export default class Action { if (message) { mainLizmap.lizmap3.addMessage(message, 'info', true).attr('id', 'lizmap-action-message'); } + + // Display the HTML message if given + const message_html = featureProperties?.message_html?.trim(); + if (message_html) { + document.getElementById('action-message-html').innerHTML = message_html; + } } } diff --git a/lizmap/www/assets/css/action.css b/lizmap/www/assets/css/action.css index b02ab234fd..42122c8669 100644 --- a/lizmap/www/assets/css/action.css +++ b/lizmap/www/assets/css/action.css @@ -54,3 +54,8 @@ div.action-buttons button:hover:not([disabled]) { color: white; text-shadow: none; } + +#project-action-selector-container lizmap-digitizing { + margin-bottom: 10px; + display: block; +} \ No newline at end of file diff --git a/tests/qgis-projects/tests/feature_toolbar.qgs.action b/tests/qgis-projects/tests/feature_toolbar.qgs.action index 4c76307982..992756203b 100644 --- a/tests/qgis-projects/tests/feature_toolbar.qgs.action +++ b/tests/qgis-projects/tests/feature_toolbar.qgs.action @@ -52,6 +52,23 @@ }, "callbacks": [] }, + { + "name": "project_map_drawn_point_buffer", + "title": "Get the buffer of the point drawn by the user", + "description": "This is an example action which returns a buffer around a point drawn by the user", + "scope": "project", + "icon": "icon-star", + "geometry": "point", + "options": { + "buffer_size": 2000 + }, + "style": { + "fill-color": "rgba(255,165,0,0.3)", + "stroke-width": 4, + "stroke-color": "rgba(255,0,0,0.8)" + }, + "callbacks": [] + }, { "name": "layer_spatial_extent", "title": "Get the contour of all the layer features", diff --git a/tests/qgis-projects/tests/set_tests_module_action.sql b/tests/qgis-projects/tests/set_tests_module_action.sql index 799c1df7dc..ea82debc73 100644 --- a/tests/qgis-projects/tests/set_tests_module_action.sql +++ b/tests/qgis-projects/tests/set_tests_module_action.sql @@ -97,7 +97,7 @@ BEGIN -- selects an action in the list, then click on the button IF action_scope = 'project' THEN - -- Return the buffer 500m of map center point + -- Return the buffer 2000m of map center point IF action_name = 'project_map_center_buffer' AND trim(map_center) != '' THEN datasource:= format( $$ @@ -114,6 +114,24 @@ BEGIN map_center, parameters->>'buffer_size' ); + -- Return the buffer 2000m of point drawn by user + ELSEIF action_name = 'project_map_drawn_point_buffer' AND trim(wkt) != '' THEN + datasource:= format( + $$ + SELECT + 1 AS id, + '%1$s' AS project, + ST_Buffer( + ST_GeomFromText('%2$s', 4326)::geography, + %3$s + )::geometry(POLYGON, 4326) AS geom, + 'The displayed geometry represents the buffer %3$s m of the point drawn by the user' AS message, + '

The displayed geometry represents the buffer %3$s m of the point drawn by the user

' AS message_html + $$, + lizmap_project, + wkt, + parameters->>'buffer_size' + ); END IF; -- actions for the layer scope