chore: extract DropControl to a module

This commit is contained in:
David Larlet 2024-12-23 12:26:40 -05:00
parent 3fff54baab
commit 4cc8ae3d1f
No known key found for this signature in database
GPG key ID: 3E2953A359E7E7BD
3 changed files with 57 additions and 47 deletions

View file

@ -0,0 +1,55 @@
export default class DropControl {
constructor(umap, leafletMap, dropzone) {
this._umap = umap
this._leafletMap = leafletMap
this.dropzone = dropzone
}
enable() {
this.controller = new AbortController()
this.dropzone.addEventListener('dragenter', (e) => this.dragenter(e), {
signal: this.controller.signal,
})
this.dropzone.addEventListener('dragover', (e) => this.dragover(e), {
signal: this.controller.signal,
})
this.dropzone.addEventListener('drop', (e) => this.drop(e), {
signal: this.controller.signal,
})
this.dropzone.addEventListener('dragleave', (e) => this.dragleave(e), {
signal: this.controller.signal,
})
}
disable() {
this.controller.abort()
}
dragenter(event) {
event.stopPropagation()
event.preventDefault()
this._leafletMap.scrollWheelZoom.disable()
this.dropzone.classList.add('umap-dragover')
}
dragover(event) {
event.stopPropagation()
event.preventDefault()
}
drop(event) {
this._leafletMap.scrollWheelZoom.enable()
this.dropzone.classList.remove('umap-dragover')
event.stopPropagation()
event.preventDefault()
const importer = this._umap.importer
importer.build()
importer.files = event.dataTransfer.files
importer.submit()
}
dragleave() {
this._leafletMap.scrollWheelZoom.enable()
this.dropzone.classList.remove('umap-dragover')
}
}

View file

@ -12,6 +12,7 @@ import { translate } from '../i18n.js'
import { uMapAlert as Alert } from '../../components/alerts/alert.js'
import * as Utils from '../utils.js'
import * as Icon from './icon.js'
import DropControl from '../drop.js'
// Those options are not saved on the server, so they can live here
// instead of in umap.properties
@ -96,7 +97,7 @@ const ControlsMixin = {
this._controls.more = new U.MoreControls()
this._controls.scale = L.control.scale()
this._controls.permanentCredit = new U.PermanentCreditsControl(this)
this._umap.drop = new U.DropControl(this)
this._umap.drop = new DropControl(this._umap, this, this._container)
this._controls.tilelayers = new U.TileLayerControl(this)
},

View file

@ -337,52 +337,6 @@ U.DrawToolbar = L.Toolbar.Control.extend({
},
})
U.DropControl = L.Class.extend({
initialize: function (map) {
this.map = map
this.dropzone = map._container
},
enable: function () {
L.DomEvent.on(this.dropzone, 'dragenter', this.dragenter, this)
L.DomEvent.on(this.dropzone, 'dragover', this.dragover, this)
L.DomEvent.on(this.dropzone, 'drop', this.drop, this)
L.DomEvent.on(this.dropzone, 'dragleave', this.dragleave, this)
},
disable: function () {
L.DomEvent.off(this.dropzone, 'dragenter', this.dragenter, this)
L.DomEvent.off(this.dropzone, 'dragover', this.dragover, this)
L.DomEvent.off(this.dropzone, 'drop', this.drop, this)
L.DomEvent.off(this.dropzone, 'dragleave', this.dragleave, this)
},
dragenter: function (event) {
L.DomEvent.stop(event)
this.map.scrollWheelZoom.disable()
this.dropzone.classList.add('umap-dragover')
},
dragover: (event) => {
L.DomEvent.stop(event)
},
drop: function (event) {
this.map.scrollWheelZoom.enable()
this.dropzone.classList.remove('umap-dragover')
L.DomEvent.stop(event)
const importer = this.map._umap.importer
importer.build()
importer.files = event.dataTransfer.files
importer.submit()
},
dragleave: function () {
this.map.scrollWheelZoom.enable()
this.dropzone.classList.remove('umap-dragover')
},
})
U.EditControl = L.Control.extend({
options: {
position: 'topright',