From 4cc8ae3d1fe295f2424592197e7b12af68253308 Mon Sep 17 00:00:00 2001 From: David Larlet Date: Mon, 23 Dec 2024 12:26:40 -0500 Subject: [PATCH] chore: extract DropControl to a module --- umap/static/umap/js/modules/drop.js | 55 ++++++++++++++++++++ umap/static/umap/js/modules/rendering/map.js | 3 +- umap/static/umap/js/umap.controls.js | 46 ---------------- 3 files changed, 57 insertions(+), 47 deletions(-) create mode 100644 umap/static/umap/js/modules/drop.js diff --git a/umap/static/umap/js/modules/drop.js b/umap/static/umap/js/modules/drop.js new file mode 100644 index 00000000..a757a6f0 --- /dev/null +++ b/umap/static/umap/js/modules/drop.js @@ -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') + } +} diff --git a/umap/static/umap/js/modules/rendering/map.js b/umap/static/umap/js/modules/rendering/map.js index ae92c684..b969c5ed 100644 --- a/umap/static/umap/js/modules/rendering/map.js +++ b/umap/static/umap/js/modules/rendering/map.js @@ -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) }, diff --git a/umap/static/umap/js/umap.controls.js b/umap/static/umap/js/umap.controls.js index 350207df..f402d81c 100644 --- a/umap/static/umap/js/umap.controls.js +++ b/umap/static/umap/js/umap.controls.js @@ -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',