Merge pull request #1370 from umap-project/drag-n-drop
Add experimental drag and drop of file on the map container
This commit is contained in:
commit
412a159cc2
3 changed files with 77 additions and 6 deletions
|
@ -813,6 +813,25 @@ input:invalid {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* *********** */
|
||||||
|
/* Various */
|
||||||
|
/* *********** */
|
||||||
|
|
||||||
|
.umap-dragover:before {
|
||||||
|
content: ' ';
|
||||||
|
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="200" height="200" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="arcs">%3Cpath d="M3 15v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2v-4M17 9l-5 5-5-5M12 12.8V2.5"/>%3C/svg>');
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
background-color: #323e56;
|
||||||
|
z-index: 401;
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* *********** */
|
/* *********** */
|
||||||
/* Mobile */
|
/* Mobile */
|
||||||
/* *********** */
|
/* *********** */
|
||||||
|
|
|
@ -313,6 +313,54 @@ L.U.DrawToolbar = L.Toolbar.Control.extend({
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
L.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 (e) {
|
||||||
|
L.DomEvent.stop(e)
|
||||||
|
this.map.scrollWheelZoom.disable()
|
||||||
|
this.dropzone.classList.add('umap-dragover')
|
||||||
|
},
|
||||||
|
|
||||||
|
dragover: function (e) {
|
||||||
|
L.DomEvent.stop(e)
|
||||||
|
},
|
||||||
|
|
||||||
|
drop: function (e) {
|
||||||
|
this.map.scrollWheelZoom.enable()
|
||||||
|
this.dropzone.classList.remove('umap-dragover')
|
||||||
|
L.DomEvent.stop(e)
|
||||||
|
for (let i = 0, file; (file = e.dataTransfer.files[i]); i++) {
|
||||||
|
this.map.processFileToImport(file)
|
||||||
|
}
|
||||||
|
this.map.onceDataLoaded(this.map.fitDataBounds)
|
||||||
|
},
|
||||||
|
|
||||||
|
dragleave: function () {
|
||||||
|
this.map.scrollWheelZoom.enable()
|
||||||
|
this.dropzone.classList.remove('umap-dragover')
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
L.U.EditControl = L.Control.extend({
|
L.U.EditControl = L.Control.extend({
|
||||||
options: {
|
options: {
|
||||||
position: 'topright',
|
position: 'topright',
|
||||||
|
|
|
@ -340,6 +340,7 @@ L.U.Map.include({
|
||||||
if (this.options.scrollWheelZoom) this.scrollWheelZoom.enable()
|
if (this.options.scrollWheelZoom) this.scrollWheelZoom.enable()
|
||||||
else this.scrollWheelZoom.disable()
|
else this.scrollWheelZoom.disable()
|
||||||
this.browser = new L.U.Browser(this)
|
this.browser = new L.U.Browser(this)
|
||||||
|
this.drop = new L.U.DropControl(this)
|
||||||
this.renderControls()
|
this.renderControls()
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -670,6 +671,12 @@ L.U.Map.include({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
fitDataBounds: function () {
|
||||||
|
const bounds = this.getLayersBounds()
|
||||||
|
if (!this.hasData() || !bounds.isValid()) return false
|
||||||
|
this.fitBounds(bounds)
|
||||||
|
},
|
||||||
|
|
||||||
initCenter: function () {
|
initCenter: function () {
|
||||||
if (this.options.hash && this._hash.parseHash(location.hash)) {
|
if (this.options.hash && this._hash.parseHash(location.hash)) {
|
||||||
// FIXME An invalid hash will cause the load to fail
|
// FIXME An invalid hash will cause the load to fail
|
||||||
|
@ -679,12 +686,7 @@ L.U.Map.include({
|
||||||
this._controls.locate.start()
|
this._controls.locate.start()
|
||||||
} else if (this.options.defaultView === 'data') {
|
} else if (this.options.defaultView === 'data') {
|
||||||
this.onceDataLoaded(() => {
|
this.onceDataLoaded(() => {
|
||||||
const bounds = this.getLayersBounds()
|
if (!this.fitDataBounds()) return this._setDefaultCenter()
|
||||||
if (!this.hasData() || !bounds.isValid()) {
|
|
||||||
this._setDefaultCenter()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
this.fitBounds(bounds)
|
|
||||||
})
|
})
|
||||||
} else if (this.options.defaultView === 'latest') {
|
} else if (this.options.defaultView === 'latest') {
|
||||||
this.onceDataLoaded(() => {
|
this.onceDataLoaded(() => {
|
||||||
|
@ -1710,11 +1712,13 @@ L.U.Map.include({
|
||||||
enableEdit: function () {
|
enableEdit: function () {
|
||||||
L.DomUtil.addClass(document.body, 'umap-edit-enabled')
|
L.DomUtil.addClass(document.body, 'umap-edit-enabled')
|
||||||
this.editEnabled = true
|
this.editEnabled = true
|
||||||
|
this.drop.enable()
|
||||||
this.fire('edit:enabled')
|
this.fire('edit:enabled')
|
||||||
},
|
},
|
||||||
|
|
||||||
disableEdit: function () {
|
disableEdit: function () {
|
||||||
if (this.isDirty) return
|
if (this.isDirty) return
|
||||||
|
this.drop.disable()
|
||||||
L.DomUtil.removeClass(document.body, 'umap-edit-enabled')
|
L.DomUtil.removeClass(document.body, 'umap-edit-enabled')
|
||||||
this.editedFeature = null
|
this.editedFeature = null
|
||||||
this.editEnabled = false
|
this.editEnabled = false
|
||||||
|
|
Loading…
Reference in a new issue