2024-05-18 16:24:06 +00:00
|
|
|
var draggingData = {
|
|
|
|
id: 0,
|
|
|
|
roomTypeId: 0,
|
|
|
|
parentRoomId: 0
|
|
|
|
}
|
|
|
|
|
2024-05-16 21:52:09 +00:00
|
|
|
function initObjects (){
|
|
|
|
draggables = document.querySelectorAll("div.grid.people div.edit-drag");
|
|
|
|
rooms = document.querySelectorAll("main.container>div.room");
|
|
|
|
Array.from(draggables).forEach(element => {
|
|
|
|
element.addEventListener('dragstart', dragStart);
|
|
|
|
element.addEventListener('dragend', dragEnd);
|
|
|
|
});
|
|
|
|
Array.from(rooms).forEach(room => {
|
|
|
|
room.addEventListener('dragenter', dragEnter)
|
|
|
|
room.addEventListener('dragover', dragOver);
|
|
|
|
room.addEventListener('dragleave', dragLeave);
|
|
|
|
room.addEventListener('drop', drop);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-05-18 16:24:06 +00:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param {DragEvent} e
|
|
|
|
*/
|
2024-05-16 21:52:09 +00:00
|
|
|
function dragStart(e) {
|
|
|
|
element = e.target;
|
|
|
|
room = element.closest('div.room')
|
2024-05-18 16:24:06 +00:00
|
|
|
setData(element.id, element.getAttribute('room-type'), room.id)
|
|
|
|
e.dataTransfer.effectAllowed = 'move';
|
|
|
|
setTimeout(()=>toggleRoomSelection(true), 0);
|
2024-05-16 21:52:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function dragEnd(e) {
|
|
|
|
toggleRoomSelection(false);
|
2024-05-18 16:24:06 +00:00
|
|
|
resetData ();
|
2024-05-16 21:52:09 +00:00
|
|
|
e.stopPropagation();
|
|
|
|
}
|
|
|
|
|
|
|
|
function dragEnter(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
e.target.classList.add('drag-over');
|
2024-05-18 16:24:06 +00:00
|
|
|
checkDragLocation (getData(), e.target);
|
2024-05-16 21:52:09 +00:00
|
|
|
e.stopPropagation();
|
|
|
|
}
|
|
|
|
|
|
|
|
function dragOver(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
e.target.classList.add('drag-over');
|
2024-05-18 16:24:06 +00:00
|
|
|
checkDragLocation (getData(), e.target)
|
2024-05-16 21:52:09 +00:00
|
|
|
e.stopPropagation();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param {Element} target
|
|
|
|
*/
|
|
|
|
function checkDragLocation (data, target) {
|
|
|
|
let toReturn = true;
|
|
|
|
const isInfinite = target.getAttribute("infinite");
|
|
|
|
const maxSizeReached = target.getAttribute("current-size") >= target.getAttribute("room-size");
|
2024-05-18 16:24:06 +00:00
|
|
|
const roomTypeMismatch = data.roomTypeId !== target.getAttribute("room-type");
|
2024-05-16 21:52:09 +00:00
|
|
|
if (!isInfinite && (maxSizeReached || roomTypeMismatch)) {
|
|
|
|
target.classList.add('drag-forbidden');
|
|
|
|
toReturn = false;
|
2024-05-18 16:24:06 +00:00
|
|
|
} else {
|
|
|
|
target.classList.remove('drag-forbidden');
|
2024-05-16 21:52:09 +00:00
|
|
|
}
|
|
|
|
return toReturn;
|
|
|
|
}
|
|
|
|
|
|
|
|
function dragLeave(e) {
|
|
|
|
e.target.classList.remove('drag-over');
|
|
|
|
e.target.classList.remove('drag-forbidden');
|
|
|
|
}
|
|
|
|
|
|
|
|
function drop(e) {
|
|
|
|
e.target.classList.remove('drag-over');
|
|
|
|
toggleRoomSelection(false);
|
2024-05-18 16:24:06 +00:00
|
|
|
if (checkDragLocation(getData(), e.target) === true) {
|
|
|
|
const data = getData();
|
2024-05-16 21:52:09 +00:00
|
|
|
let item = document.getElementById (data.id)
|
2024-05-18 16:24:06 +00:00
|
|
|
let oldParent = document.getElementById (data.parentRoomId)
|
2024-05-16 21:52:09 +00:00
|
|
|
let newParent = e.target;
|
|
|
|
let newParentContainer = newParent.querySelector('div.grid.people')
|
|
|
|
newParentContainer.appendChild (item);
|
|
|
|
oldParent.setAttribute("current-size", parseInt(oldParent.getAttribute("current-size") - 1))
|
|
|
|
newParent.setAttribute("current-size", parseInt(newParent.getAttribute("current-size") + 1))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function toggleRoomSelection(newStatus) {
|
|
|
|
rooms = document.querySelectorAll("main.container>div.room");
|
|
|
|
Array.from(rooms).forEach(room=>{
|
|
|
|
room.classList.toggle('interactless', newStatus);
|
|
|
|
room.classList.remove('drag-over');
|
|
|
|
room.classList.remove('drag-forbidden');
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2024-05-18 16:24:06 +00:00
|
|
|
function setData (id, roomType, parentRoomId) {
|
|
|
|
draggingData.id = id;
|
|
|
|
draggingData.roomTypeId = roomType;
|
|
|
|
draggingData.parentRoomId = parentRoomId;
|
|
|
|
}
|
|
|
|
|
|
|
|
function resetData (){
|
|
|
|
setData(0, 0, 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
function getData () {
|
|
|
|
return draggingData;
|
|
|
|
}
|
|
|
|
|
2024-05-16 21:52:09 +00:00
|
|
|
initObjects ();
|