Initial implementation
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
export const dropzoneMixin = function(superClass) {
|
||||
return class extends superClass {
|
||||
constructor() {
|
||||
super();
|
||||
this._boundOnDragStart = this._onDragStart.bind(this);
|
||||
this._boundOnDrag = this._onDrag.bind(this);
|
||||
this._boundOnDrag = this._onDrag.bind(this);
|
||||
this._boundOnLeave = this._onLeave.bind(this);
|
||||
this._boundOnDrop = this._onDrop.bind(this);
|
||||
}
|
||||
|
||||
connectedCallback() {
|
||||
super.connectedCallback();
|
||||
this.addEventListener('dragstart', this._boundOnDragStart, false)
|
||||
this.addEventListener('dragenter', this._boundOnDrag, false)
|
||||
this.addEventListener('dragover', this._boundOnDrag, false)
|
||||
this.addEventListener('dragleave', this._boundOnLeave, false)
|
||||
this.addEventListener('drop', this._boundOnDrop, false)
|
||||
}
|
||||
|
||||
disconnectedCallback() {
|
||||
super.disconnectedCallback();
|
||||
this.removeEventListener('dragstart', this._boundOnDragStart, false)
|
||||
this.removeEventListener('dragenter', this._boundOnDrag, false)
|
||||
this.removeEventListener('dragover', this._boundOnDrag, false)
|
||||
this.removeEventListener('dragleave', this._boundOnLeave, false)
|
||||
this.removeEventListener('drop', this._boundOnDrop, false)
|
||||
}
|
||||
|
||||
// This event is only triggered if the dragging motion was started inside the browser window.
|
||||
// If that's the case, we know that it can't be image dragged from external. In that case this event isn't triggered because the browser doesn't have focus.
|
||||
_onDragStart() {
|
||||
this._interDragStart = true;
|
||||
}
|
||||
|
||||
_onDrag(e) {
|
||||
if (this._interDragStart) return;
|
||||
this._stopPropagation(e);
|
||||
this.isDraggedOn = true;
|
||||
}
|
||||
|
||||
_onLeave(e) {
|
||||
this._stopPropagation(e);
|
||||
this.isDraggedOn = false;
|
||||
this._interDragStart = false;
|
||||
}
|
||||
|
||||
_onDrop(e) {
|
||||
this._stopPropagation(e);
|
||||
this._interDragStart = false;
|
||||
this.isDraggedOn = false;
|
||||
this.dispatchEvent(new CustomEvent('dropped', { detail: e.dataTransfer, bubbles: true, composed: true }));
|
||||
}
|
||||
|
||||
_stopPropagation(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user