163 lines
4.9 KiB
JavaScript
163 lines
4.9 KiB
JavaScript
|
|
/* 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();
|
||
|
|
}
|
||
|
|
})();
|