You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.4 KiB
129 lines
3.4 KiB
/**
|
|
* This file is part of the jps-like-websites lib
|
|
* URL: https://git.labos.goip.de/chris/jpc-like-websites
|
|
* @copyright by its creator Christian Martin
|
|
*/
|
|
|
|
const EventDrag = Object.freeze({
|
|
OVER: "over",
|
|
START: "start",
|
|
END: "end",
|
|
ENTER: "enter",
|
|
LEAVE: "leave"
|
|
});
|
|
|
|
/**
|
|
* Defines default functions to setup a drag/drop behaviour
|
|
*/
|
|
class DragAndDropImplementation {
|
|
_isMngmtElNeeded;
|
|
|
|
ensureManagementElementExists() {
|
|
|
|
}
|
|
|
|
getManagementElement() {
|
|
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param {string} datakey
|
|
* @param {string} selector
|
|
* @returns {Function}
|
|
*/
|
|
dragStartAction(datakey, selector) {
|
|
return function (event) {
|
|
console.log("DragEvent", event, "on", selector);
|
|
event.dataTransfer
|
|
.setData(
|
|
datakey,
|
|
JSON.stringify({
|
|
["selector"]: selector,
|
|
["relDims"]: new TwoDimPoint(
|
|
event.clientX - event.target.getBoundingClientRect().left,
|
|
event.clientY - event.target.getBoundingClientRect().top
|
|
)
|
|
})
|
|
);
|
|
}
|
|
}
|
|
|
|
dragEventAction(selector) {
|
|
return function (event) {
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
*
|
|
* @param {string} datakey
|
|
* @param {string} selector
|
|
* @returns {Function}
|
|
*/
|
|
dropEventAction(datakey, selector) {
|
|
return function (event) {
|
|
event.preventDefault();
|
|
|
|
let draggedData = JSON.parse(event.dataTransfer.getData(datakey));
|
|
let draggedElement = document.querySelector(draggedData.selector);
|
|
|
|
let target = event.target
|
|
.closest(selector);
|
|
|
|
console.log("Default drop event");
|
|
|
|
//if (![...target.childNodes].includes(draggedElement)) {
|
|
target.appendChild(draggedElement);
|
|
//}
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
const DADInPlace = new DragAndDropImplementation();
|
|
DADInPlace.dropEventAction = function (datakey, selector) {
|
|
/**
|
|
* @param {Event} event
|
|
*/
|
|
return function (event) {
|
|
event.preventDefault();
|
|
|
|
let draggedData = JSON.parse(event.dataTransfer.getData(datakey));
|
|
let draggedElement = document.querySelector(draggedData.selector);
|
|
|
|
let target = event.target
|
|
.closest(selector);
|
|
|
|
let dimsDraggedEl = new Dimensions()
|
|
.width(draggedElement.offsetWidth)
|
|
.height(draggedElement.offsetHeight);
|
|
|
|
let pagePoint = new TwoDimPoint(
|
|
event.clientX,
|
|
event.clientY
|
|
);
|
|
|
|
let parentPagePoint = new TwoDimPoint(
|
|
target.getBoundingClientRect().left,
|
|
target.getBoundingClientRect().top
|
|
);
|
|
|
|
draggedElement.style["width"] = dimsDraggedEl._fFirst + "px";
|
|
draggedElement.style["height"] = dimsDraggedEl._fSecond + "px";
|
|
|
|
// x page to relative is (parent-page), then -rel
|
|
|
|
let dropPosition = pagePoint
|
|
.minusTDP(parentPagePoint)
|
|
.minusTDP(draggedData.relDims);
|
|
|
|
draggedElement.style.position = "relative";
|
|
draggedElement.style.left = dropPosition.x + "px";
|
|
draggedElement.style.top = dropPosition.y + "px";
|
|
//if (![...target.childNodes].includes(draggedElement)) {
|
|
target.appendChild(draggedElement);
|
|
//}
|
|
}
|
|
}
|
|
|