From 5c5ea0c5f5bb945b5529b29c87113758492c5f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o-Paul=20Goffic?= Date: Mon, 8 Dec 2025 14:46:11 +0100 Subject: [PATCH 1/2] Reset dragging state on DirectSelect#onStop --- src/modes/direct_select.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modes/direct_select.js b/src/modes/direct_select.js index a27749d41..31c54dde0 100644 --- a/src/modes/direct_select.js +++ b/src/modes/direct_select.js @@ -150,9 +150,10 @@ DirectSelect.onSetup = function(opts) { return state; }; -DirectSelect.onStop = function() { +DirectSelect.onStop = function(state) { doubleClickZoom.enable(this); this.clearSelectedCoordinates(); + this.stopDragging(state); }; DirectSelect.toDisplayFeatures = function(state, geojson, push) { From c0f38f300d8bf196ba70852c298dc262a610a1c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o-Paul=20Goffic?= Date: Mon, 8 Dec 2025 18:03:43 +0100 Subject: [PATCH 2/2] Add test --- test/direct_select.test.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/direct_select.test.js b/test/direct_select.test.js index 6a6ce6d65..2832080bb 100644 --- a/test/direct_select.test.js +++ b/test/direct_select.test.js @@ -294,5 +294,32 @@ test('direct_select', async (t) => { await cleanUp(); }); + await t.test('direct_select - stopping mode mid-drag should reset the plugin state', async () => { + map.dragPan.enable(); + + const [polygonId] = Draw.add(getGeoJSON('polygon')); + Draw.changeMode(Constants.modes.DIRECT_SELECT, { + featureId: polygonId + }); + + const originalPolygon = getGeoJSON('polygon'); + const centroid = turfCentroid(originalPolygon).geometry.coordinates; + await afterNextRender(); + + assert.equal(map.dragPan.isEnabled(), true, 'dragPan should be enabled initially'); + + map.fire('mousedown', makeMouseEvent(centroid[0], centroid[1])); + map.fire('mousemove', makeMouseEvent(centroid[0] + 15, centroid[1] + 15, { buttons: 1 })); + + assert.equal(map.dragPan.isEnabled(), false, 'dragPan should be disabled during drag'); + + Draw.changeMode(Constants.modes.SIMPLE_SELECT); + await afterNextRender(); + + assert.equal(map.dragPan.isEnabled(), true, 'dragPan should be re-enabled after stopping mode'); + + await cleanUp(); + }); + document.body.removeChild(mapContainer); });