fix: always unset editedFeature on editPanel close (#2237)

And only this panel.

This was creating a weird bug, steps to reproduce:

- create a marker
- shift-click on the marker to edit the layer (so without explicitly
closing the panel)
- try to type the layer name: the panel would close

This is also because currently the schema and render() are too dump, and
when any `name` is changed then the `data` reflow is called, while it
should not when editing the datalayer name.

We want to:
- have more targeted schema
- have more specific reflow in render

But that's for other PRs!
This commit is contained in:
Yohan Boniface 2024-10-25 15:40:47 +02:00 committed by GitHub
commit a16f6d409c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 32 additions and 15 deletions

View file

@ -32,8 +32,10 @@ const FeatureMixin = {
if (map.editedFeature === this.feature) { if (map.editedFeature === this.feature) {
this.feature._marked_for_deletion = true this.feature._marked_for_deletion = true
this.feature.endEdit() this.feature.endEdit()
if (map.editedFeature === this.feature) {
map.editPanel.close() map.editPanel.close()
} }
}
}, },
_removeIcon: function () { _removeIcon: function () {

View file

@ -25,6 +25,9 @@ export class Panel {
} }
open({ content, className, actions = [] } = {}) { open({ content, className, actions = [] } = {}) {
if (this.isOpen()) {
this.onClose()
}
this.container.className = `with-transition panel window ${this.className} ${ this.container.className = `with-transition panel window ${this.className} ${
this.mode || '' this.mode || ''
}` }`
@ -71,10 +74,13 @@ export class Panel {
close() { close() {
document.body.classList.remove(`panel-${this.className.split(' ')[0]}-on`) document.body.classList.remove(`panel-${this.className.split(' ')[0]}-on`)
this.onClose()
}
onClose() {
if (DomUtil.hasClass(this.container, 'on')) { if (DomUtil.hasClass(this.container, 'on')) {
DomUtil.removeClass(this.container, 'on') DomUtil.removeClass(this.container, 'on')
this.map.invalidateSize({ pan: false }) this.map.invalidateSize({ pan: false })
this.map.editedFeature = null
} }
} }
} }
@ -84,6 +90,11 @@ export class EditPanel extends Panel {
super(map) super(map)
this.className = 'right dark' this.className = 'right dark'
} }
onClose() {
super.onClose()
this.map.editedFeature = null
}
} }
export class FullPanel extends Panel { export class FullPanel extends Panel {

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()) {