botui/ui/suite/drive/drive.js

163 lines
4.9 KiB
JavaScript
Raw Normal View History

/* Drive Module JavaScript */
(function() {
'use strict';
let selectedFiles = [];
let currentPath = '/';
let viewMode = 'grid';
function init() {
bindNavigation();
bindFileSelection();
bindDragAndDrop();
bindContextMenu();
bindKeyboardShortcuts();
}
function bindNavigation() {
document.querySelectorAll('.drive-nav-item').forEach(item => {
item.addEventListener('click', function() {
document.querySelectorAll('.drive-nav-item').forEach(i => i.classList.remove('active'));
this.classList.add('active');
});
});
}
function bindFileSelection() {
document.querySelectorAll('.file-card, .file-list-item').forEach(file => {
file.addEventListener('click', function(e) {
if (e.ctrlKey || e.metaKey) {
this.classList.toggle('selected');
} else {
document.querySelectorAll('.file-card.selected, .file-list-item.selected')
.forEach(f => f.classList.remove('selected'));
this.classList.add('selected');
}
updateSelectedFiles();
});
file.addEventListener('dblclick', function() {
const isFolder = this.dataset.type === 'folder';
if (isFolder) {
navigateToFolder(this.dataset.path);
} else {
openFile(this.dataset.id);
}
});
});
}
function bindDragAndDrop() {
const uploadZone = document.querySelector('.upload-zone');
if (!uploadZone) return;
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(event => {
uploadZone.addEventListener(event, (e) => {
e.preventDefault();
e.stopPropagation();
});
});
['dragenter', 'dragover'].forEach(event => {
uploadZone.addEventListener(event, () => uploadZone.classList.add('dragover'));
});
['dragleave', 'drop'].forEach(event => {
uploadZone.addEventListener(event, () => uploadZone.classList.remove('dragover'));
});
uploadZone.addEventListener('drop', (e) => {
const files = e.dataTransfer.files;
handleFileUpload(files);
});
}
function bindContextMenu() {
document.addEventListener('contextmenu', (e) => {
const fileCard = e.target.closest('.file-card, .file-list-item');
if (fileCard) {
e.preventDefault();
showContextMenu(e.clientX, e.clientY, fileCard);
}
});
document.addEventListener('click', hideContextMenu);
}
function bindKeyboardShortcuts() {
document.addEventListener('keydown', (e) => {
if (e.key === 'Delete' && selectedFiles.length > 0) {
deleteSelectedFiles();
}
if (e.key === 'a' && (e.ctrlKey || e.metaKey)) {
e.preventDefault();
selectAllFiles();
}
if (e.key === 'Escape') {
deselectAllFiles();
hideContextMenu();
}
});
}
function updateSelectedFiles() {
selectedFiles = Array.from(document.querySelectorAll('.file-card.selected, .file-list-item.selected'))
.map(f => f.dataset.id);
}
function navigateToFolder(path) {
currentPath = path;
// HTMX handles actual navigation
}
function openFile(fileId) {
console.log('Opening file:', fileId);
}
function handleFileUpload(files) {
console.log('Uploading files:', files);
}
function showContextMenu(x, y, fileCard) {
hideContextMenu();
const menu = document.getElementById('context-menu');
if (menu) {
menu.style.left = x + 'px';
menu.style.top = y + 'px';
menu.classList.remove('hidden');
menu.dataset.fileId = fileCard.dataset.id;
}
}
function hideContextMenu() {
const menu = document.getElementById('context-menu');
if (menu) menu.classList.add('hidden');
}
function selectAllFiles() {
document.querySelectorAll('.file-card, .file-list-item').forEach(f => f.classList.add('selected'));
updateSelectedFiles();
}
function deselectAllFiles() {
document.querySelectorAll('.file-card.selected, .file-list-item.selected')
.forEach(f => f.classList.remove('selected'));
selectedFiles = [];
}
function deleteSelectedFiles() {
if (confirm(`Delete ${selectedFiles.length} file(s)?`)) {
console.log('Deleting:', selectedFiles);
}
}
window.DriveModule = { init };
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();