v-dragon
Version:
Easy & flexible unopinionated drag & drop library for Vue.js.
129 lines (117 loc) • 4.67 kB
JavaScript
function Dragon(el, payload) {
this.el = el;
this.payload = payload;
el.setAttribute("draggable", "true");
el.addEventListener("dragstart", this.dragStart = this.dragStart.bind(this), false);
el.addEventListener("dragend", this.dragEnd = this.dragEnd.bind(this), false);
el.addEventListener("drag", this.drag = this.drag.bind(this), false);
el.addEventListener("drop", this.drop = this.drop.bind(this), false);
el.addEventListener("dragenter", this.dragEnter = this.dragEnter.bind(this), false);
el.addEventListener("dragover", this.dragOver = this.dragOver.bind(this), false);
el.addEventListener("dragleave", this.dragLeave = this.dragLeave.bind(this), false);
el.addEventListener("mouseover", this.dragEnable = this.dragEnable.bind(this), false);
el.addEventListener("mouseleave", this.dragDisable = this.dragDisable.bind(this), false);
};
Dragon.state = {};
Dragon.directive = function() {
const dir = {};
dir.bind = function(el, binding, vnode) {
vnode.dragon = new Dragon(el, function() {
return this.data.attrs["dragon-payload"];
}.bind(vnode));
}
dir.update = function(el, binding, vnode, oldVnode) {
vnode.dragon = oldVnode.dragon;
vnode.dragon.payload = function() {
return this.data.attrs["dragon-payload"];
}.bind(vnode);
}
dir.unbind = function(el, binding, vnode) {
vnode.dragon.unbind();
}
return dir;
}
Dragon.install = function(Vue) {
Vue.directive("dragon", Dragon.directive);
}
Dragon.prototype.unbind = function() {
this.el.classList.remove("dragon-use", "dragon-aim");
this.el.removeAttribute("draggable");
this.el.removeEventListener("dragstart", this.dragStart);
this.el.removeEventListener("dragend", this.dragEnd);
this.el.removeEventListener("drag", this.drag);
this.el.removeEventListener("drop", this.drop);
this.el.removeEventListener("dragenter", this.dragEnter);
this.el.removeEventListener("dragover", this.dragOver);
this.el.removeEventListener("dragleave", this.dragLeave);
this.el.removeEventListener("mouseover", this.mouseOver);
this.el.removeEventListener("mouseleave", this.mouseLeave);
}
Dragon.prototype.emit = function(from, to, keys, clientX, clientY) {
var eventObject = {
from: from,
to: to,
keyCtrl: !!keys.ctrl,
keyAlt: !!keys.alt,
keyShift: !!keys.shift,
mouseLeft: !!keys.left,
mouseMiddle: !!keys.middle,
mouseRight: !!keys.right,
clientX: clientX,
clientY: clientY,
}
//vnode.context.$emit("dragon-drop", eventObject);
var ev = new Event("dragon-drag");
ev.data = eventObject;
Dragon.state.startElement.dispatchEvent(ev);
ev = new Event("dragon-drop");
ev.data = eventObject;
this.el.dispatchEvent(ev);
}
Dragon.prototype.dragStart = function() {
Dragon.state.startPayload = this.payload();
Dragon.state.startElement = this.el;
window.event.cancelBubble = true;
window.event.dataTransfer.setData("text", JSON.stringify(this.payload()));
}
Dragon.prototype.dragEnd = function() {
}
Dragon.prototype.drag = function() {
}
Dragon.prototype.drop = function() {
window.event.cancelBubble = true;
window.event.preventDefault();
this.emit(Dragon.state.startPayload, this.payload(), {}, window.event.clientX, window.event.clientY);
var aims = document.getElementsByClassName("dragon-aim");
for (var i = 0; i < aims.length; i++) aims[i].classList.remove("dragon-aim");
}
Dragon.prototype.dragEnter = function() {
}
Dragon.prototype.dragOver = function() {
window.event.cancelBubble = true;
window.event.preventDefault();
var aims = document.getElementsByClassName("dragon-aim");
for (var i = 0; i < aims.length; i++) aims[i].classList.remove("dragon-aim");
this.el.classList.add("dragon-aim");
}
Dragon.prototype.dragLeave = function() {
this.el.classList.remove("dragon-aim");
}
Dragon.prototype.dragEnable = function() {
console.log(window.event);
var el = window.event.target;
while (el && el != window && el != this.el && !el.hasAttribute("dragon-handle")) {
el = el.parentElement;
}
if (!el || el == window || (el == this.el && !el.hasAttribute("dragon-handle") && el.querySelector("[dragon-handle]") != null)) {
this.el.removeAttribute("draggable");
return;
}
this.el.setAttribute("draggable", "true");
}
Dragon.prototype.dragDisable = function() {
this.el.removeAttribute("draggable");
}
if (typeof module == "object") module.exports = Dragon;
else if (typeof define == "function" && define.amd) define([], function() { return DragAndDrop });
else if (window.Vue) { window.Dragon = Dragon; Vue.use(Dragon); }