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