-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjavascript.js
51 lines (45 loc) · 1.81 KB
/
javascript.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
document.addEventListener('DOMContentLoaded', (event) => {
const container = document.getElementById('timeUnits');
const draggables = Array.from(container.querySelectorAll('.draggable'));
shuffleElements(draggables);
draggables.forEach(draggable => {
draggable.addEventListener('dragstart', () => {
draggable.classList.add('dragging');
});
draggable.addEventListener('dragend', () => {
draggable.classList.remove('dragging');
});
});
const dropzones = document.querySelectorAll('.dropzone');
dropzones.forEach(zone => {
zone.addEventListener('dragover', e => {
e.preventDefault();
const afterElement = getDragAfterElement(zone, e.clientY);
const draggable = document.querySelector('.dragging');
if (afterElement == null) {
zone.appendChild(draggable);
} else {
zone.insertBefore(draggable, afterElement);
}
});
});
function shuffleElements(elements) {
for (let i = elements.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
elements[i].style.order = j;
elements[j].style.order = i;
}
}
function getDragAfterElement(container, y) {
const draggableElements = [...container.querySelectorAll('.draggable:not(.dragging)')];
return draggableElements.reduce((closest, child) => {
const box = child.getBoundingClientRect();
const offset = y - box.top - box.height / 2;
if (offset < 0 && offset > closest.offset) {
return { offset: offset, element: child };
} else {
return closest;
}
}, { offset: Number.NEGATIVE_INFINITY }).element;
}
});