diff --git a/assets/src/components/ActionSelector.js b/assets/src/components/ActionSelector.js index 2453a46628..a590801977 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.querySelector('#project-action-selector-container lizmap-digitizing')?.remove(); + // Get the host component let host = event.target.closest("lizmap-action-selector"); @@ -93,6 +96,11 @@ export default class ActionSelector extends HTMLElement { if ('description' in action && action.description) { description = action.description; } + if (action?.geometry) { + this._digitizingElement = ``; + document.querySelector('.action-selector-container').insertAdjacentHTML('afterend', this._digitizingElement); + mainLizmap.digitizing.context = "action"; + } } descriptionSpan.textContent = description; diff --git a/assets/src/modules/Action.js b/assets/src/modules/Action.js index d7ad26ac26..a2f66ce7aa 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); 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..ac3a48d6c3 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,23 @@ 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 + $$, + lizmap_project, + wkt, + parameters->>'buffer_size' + ); END IF; -- actions for the layer scope