This commit is contained in:
nnduc
2026-10-24 14:03:52 +07:00
commit 4fe046de58
4790 changed files with 311146 additions and 0 deletions
@@ -0,0 +1,70 @@
ul#spacerooms_widget {
overflow: hidden;
}
ul#spacerooms_widget>li {
user-select: none;
}
ul#spacerooms_widget li div.controls {
position: absolute;
right: 0;
top: 0;
transform: translateX(100%);
background-color: rgb(var(--movim-background));
transition: transform 0.2s var(--accelerate-easing);
box-shadow: var(--elevation-1);
height: 5.25rem;
}
ul#spacerooms_widget li div.controls span {
padding: 0 1rem;
line-height: 5.25rem;
height: 5.25rem;
display: inline-block;
}
ul#spacerooms_widget li div.controls span:hover {
cursor: pointer;
user-select: none;
background-color: rgba(var(--movim-element-action), 0.1);
font-variation-settings: 'FILL' 1;
}
ul#spacerooms_widget li:hover div.controls {
transform: translateX(0);
transition: transform 0.2s var(--decelerate-easing) 0.75s;
}
ul#spacerooms_widget li.dragging:active {
cursor: grabbing;
}
ul#spacerooms_widget:has(li.subheader.dragging) li:not(.dragging):not(.subheader) div {
opacity: 0.15;
}
ul#spacerooms_widget li.dragging {
opacity: 0.5;
}
ul#spacerooms_widget li {
transition: padding-bottom 0.1s ease;
}
ul#spacerooms_widget li.dropping {
padding-bottom: 2rem;
}
ul#spacerooms_widget li.dropping:before {
animation: fadeIn 0.3s;
content: '';
display: block;
width: calc(100% - 3rem);
height: 0.5rem;
background-color: var(--movim-accent);
border-radius: 1rem;
position: absolute;
top: 6rem;
left: 1.5rem;
}
+126
View File
@@ -0,0 +1,126 @@
var SpaceRooms = {
draggingDirectory: false,
init: function () {
document.querySelectorAll('ul#spacerooms_widget > li > ul.list > li:not(.subheader)[data-jid]').forEach(li => {
const jid = li.dataset.jid;
li.onclick = () => Chat.getRoom(jid);
if (MovimUtils.isMobile()) {
let touchTimer;
let isMoving = false;
li.ontouchstart = () => {
isMoving = false;
touchTimer = setTimeout(() => {
if (!isMoving) SpaceRooms_ajaxAskEdit(jid);
}, 500);
};
li.ontouchmove = () => { isMoving = true; };
li.ontouchend = () => clearTimeout(touchTimer);
}
});
},
editable: function () {
var items = document.querySelectorAll('ul#spacerooms_widget > li');
items.forEach(item => {
item.addEventListener('dragstart', () => item.classList.add('dragging'));
item.addEventListener("dragend", () => {
let dropped = document.querySelector('li.dropping');
item.classList.remove("dragging");
items.forEach(subheader => subheader.classList.remove('dropping'));
if (dropped) {
dropped.after(item);
const [server, node] = MovimUtils.urlParts().params;
if (SpaceRooms.draggingDirectory == true) {
if (dropped.classList.contains('subheader')) {
SpaceRooms_ajaxSortDirectories(
server,
node,
Array.from(
document.querySelectorAll('ul#spacerooms_widget > li.subheader'),
node => node.dataset.id
)
);
}
} else {
let firstItem = item;
let directoryId = null;
// Find the first item and see if its a directory
while (firstItem.previousElementSibling && !firstItem.previousElementSibling.classList.contains('subheader')) {
firstItem = firstItem.previousElementSibling;
}
if (firstItem.previousElementSibling?.classList.contains('subheader')) {
directoryId = firstItem.previousElementSibling.dataset.id;
}
// Then we iterate on the items of the directory
if (firstItem) {
let currentItem = firstItem;
let weight = 0;
// Extract URL parameters once to avoid repeating the function calls inside a loop
while (currentItem && !currentItem.classList.contains('subheader')) {
SpaceRooms_ajaxSetHierarchy(
server,
node,
currentItem.dataset.jid,
weight++,
directoryId
);
currentItem = currentItem.nextElementSibling;
}
}
}
}
SpaceRooms.draggingDirectory = false;
});
item.addEventListener('dragover', (event) => {
event.preventDefault();
let elements = document.querySelectorAll('ul#spacerooms_widget > li:not(.dragging)');
let siblings = [...elements];
let nextSibling = siblings.reduce((closest, child) => {
const box = child.getBoundingClientRect();
const offset = event.clientY - box.top - box.height / 2;
if (offset < 0 && offset > closest.offset) {
return { offset: offset, element: child };
} else {
return closest;
}
}, { offset: Number.NEGATIVE_INFINITY }).element;
elements.forEach(subheader => {
if (!subheader.isSameNode(nextSibling)) {
subheader.classList.remove('dropping')
}
});
if (nextSibling) {
if ((SpaceRooms.draggingDirectory && nextSibling.classList.contains('subheader'))
|| (SpaceRooms.draggingDirectory == false)) {
nextSibling.classList.add('dropping');
}
}
})
});
var directories = document.querySelectorAll('ul#spacerooms_widget > li.subheader');
directories.forEach(directory => {
directory.addEventListener('dragstart', () => SpaceRooms.draggingDirectory = true);
});
}
}