mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-21 00:42:15 +00:00
100 lines
2.7 KiB
JavaScript
100 lines
2.7 KiB
JavaScript
/**
|
|
* TODO(chris): This needs serious rework!!!
|
|
*/
|
|
export default {
|
|
mounted(el, binding, vnode) {
|
|
if (binding.arg == 'draggable') {
|
|
el.addEventListener('update-my-value', evt => {
|
|
evt.preventDefault();
|
|
binding.value = evt.detail.item;
|
|
});
|
|
el.addEventListener('dragstart', evt => {
|
|
el.dispatchEvent(new CustomEvent('calendar-dragstart', {
|
|
cancelable: true,
|
|
bubbles: true,
|
|
detail: {
|
|
item: binding.value,
|
|
x: evt.offsetX / el.offsetWidth,
|
|
y: evt.offsetY / el.offsetHeight,
|
|
originalEvent: evt
|
|
}
|
|
}));
|
|
});
|
|
el.addEventListener('dragend', evt => {
|
|
el.dispatchEvent(new CustomEvent('calendar-dragend', {
|
|
cancelable: true,
|
|
bubbles: true,
|
|
detail: {
|
|
item: binding.value,
|
|
originalEvent: evt
|
|
}
|
|
}));
|
|
});
|
|
} else if (binding.arg == 'dropcage') {
|
|
let hitbox = null;
|
|
el.addEventListener('dragover', evt => {
|
|
if (hitbox)
|
|
return;
|
|
hitbox = el.getBoundingClientRect();
|
|
return el.dispatchEvent(new CustomEvent('calendar-dragenter', {
|
|
detail: { originalEvent: evt }
|
|
}));
|
|
});
|
|
window.addEventListener('dragleave', evt => {
|
|
if (!hitbox)
|
|
return;
|
|
let pos;
|
|
if (typeof evt.clientX === 'undefined')
|
|
pos = {
|
|
x: evt.pageX + document.documentElement.scrollLeft,
|
|
y: evt.pageY + document.documentElement.scrollTop
|
|
};
|
|
else
|
|
pos = {
|
|
x: evt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft,
|
|
y: evt.clientY + document.body.scrollTop + document.documentElement.scrollTop
|
|
};
|
|
if (pos.x > hitbox.left + hitbox.width - 1 || pos.x < hitbox.left || pos.y > hitbox.top + hitbox.height - 1 || pos.y < hitbox.top) {
|
|
hitbox = null;
|
|
return el.dispatchEvent(new CustomEvent('calendar-dragleave', {
|
|
detail: { originalEvent: evt }
|
|
}));
|
|
}
|
|
});
|
|
window.addEventListener('drop', evt => {
|
|
if (!hitbox)
|
|
return;
|
|
|
|
hitbox = null;
|
|
return el.dispatchEvent(new CustomEvent('calendar-dragleave', {
|
|
detail: { originalEvent: evt }
|
|
}));
|
|
});
|
|
} else if (binding.arg == 'dropzone') {
|
|
el.addEventListener(
|
|
binding.modifiers.once ? 'dragenter' : 'dragover',
|
|
evt => {
|
|
const timestamp = binding.value instanceof Function
|
|
? binding.value(evt)
|
|
: binding.value;
|
|
const detail = timestamp.timestamp ? timestamp : { timestamp };
|
|
el.dispatchEvent(new CustomEvent('calendar-dragchange', {
|
|
cancelable: true,
|
|
bubbles: true,
|
|
detail
|
|
}));
|
|
}
|
|
);
|
|
}
|
|
},
|
|
updated(el, binding, vnode, prevVnode) {
|
|
if (binding.arg == 'draggable') {
|
|
el.dispatchEvent(new CustomEvent('update-my-value', {
|
|
cancelable: true,
|
|
detail: {
|
|
item: binding.value
|
|
}
|
|
}));
|
|
}
|
|
}
|
|
} |