fix: prevent feature.edit to be called twice on polygon/line end edit

When finishing drawing a polygon/line, Leaflet.Editable will send
both `editable:drawing:end` and `editable:drawing:commit`. In normal
flow, we only need to listen to the later, and we only need to
listen for the former in the case of pressing escape while drawing.
This commit is contained in:
Yohan Boniface 2024-10-24 20:05:18 +02:00
parent 71b55e7759
commit b36c03a203
2 changed files with 17 additions and 13 deletions

View file

@ -666,7 +666,7 @@ const ControlsMixin = {
const connectedPeersCount = L.DomUtil.createButton( const connectedPeersCount = L.DomUtil.createButton(
'leaflet-control-connected-peers', 'leaflet-control-connected-peers',
rightContainer, rightContainer,
'', ''
) )
L.DomEvent.on(connectedPeersCount, 'mouseover', () => { L.DomEvent.on(connectedPeersCount, 'mouseover', () => {
this.tooltip.open({ this.tooltip.open({
@ -1182,17 +1182,6 @@ U.Editable = L.Editable.extend({
initialize: function (map, options) { initialize: function (map, options) {
L.Editable.prototype.initialize.call(this, map, options) L.Editable.prototype.initialize.call(this, map, options)
this.on('editable:drawing:click editable:drawing:move', this.drawingTooltip) this.on('editable:drawing:click editable:drawing:move', this.drawingTooltip)
this.on('editable:drawing:end', (event) => {
this.map.tooltip.close()
// Leaflet.Editable will delete the drawn shape if invalid
// (eg. line has only one drawn point)
// So let's check if the layer has no more shape
if (!event.layer.feature.hasGeom()) {
event.layer.feature.del()
} else {
event.layer.feature.edit()
}
})
// Layer for items added by users // Layer for items added by users
this.on('editable:drawing:cancel', (event) => { this.on('editable:drawing:cancel', (event) => {
if (event.layer instanceof U.LeafletMarker) event.layer.feature.del() if (event.layer instanceof U.LeafletMarker) event.layer.feature.del()
@ -1322,4 +1311,19 @@ U.Editable = L.Editable.extend({
L.DomEvent.stop(e) L.DomEvent.stop(e)
e.cancel() e.cancel()
}, },
onEscape: function () {
this.once('editable:drawing:end', (event) => {
this.map.tooltip.close()
// Leaflet.Editable will delete the drawn shape if invalid
// (eg. line has only one drawn point)
// So let's check if the layer has no more shape
if (!event.layer.feature.hasGeom()) {
event.layer.feature.del()
} else {
event.layer.feature.edit()
}
})
this.stopDrawing()
},
}) })

View file

@ -563,7 +563,7 @@ U.Map = L.Map.extend({
if (this.importer.dialog.visible) { if (this.importer.dialog.visible) {
this.importer.dialog.close() this.importer.dialog.close()
} else if (this.editEnabled && this.editTools.drawing()) { } else if (this.editEnabled && this.editTools.drawing()) {
this.editTools.stopDrawing() this.editTools.onEscape()
} else if (this.measureTools.enabled()) { } else if (this.measureTools.enabled()) {
this.measureTools.stopDrawing() this.measureTools.stopDrawing()
} else if (this.fullPanel?.isOpen()) { } else if (this.fullPanel?.isOpen()) {