From 6df9f0dc40501e8f55bcc883dfe5be65e60d3c3d Mon Sep 17 00:00:00 2001 From: Bobby Date: Tue, 24 Dec 2024 06:50:59 -0500 Subject: bucket load of things --- static/js/shared/directory.js | 58 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 static/js/shared/directory.js (limited to 'static/js/shared') diff --git a/static/js/shared/directory.js b/static/js/shared/directory.js new file mode 100644 index 00000000..c3153175 --- /dev/null +++ b/static/js/shared/directory.js @@ -0,0 +1,58 @@ +class DirectoryViewer { + constructor(element) { + this.element = element; + this.folders = element.querySelectorAll('.folder-item'); + this.selectedFolder = null; + + this.setupEventListeners(); + } + + setupEventListeners() { + this.folders.forEach(folder => { + folder.addEventListener('click', (e) => this.handleFolderClick(e, folder)); + folder.addEventListener('dblclick', (e) => this.handleFolderDoubleClick(e, folder)); + }); + + // Clear selection when clicking empty space + this.element.addEventListener('click', (e) => { + if (e.target === this.element || e.target.classList.contains('directory-content')) { + this.clearSelection(); + } + }); + } + + handleFolderClick(e, folder) { + e.preventDefault(); + e.stopPropagation(); + + this.clearSelection(); + this.selectFolder(folder); + } + + handleFolderDoubleClick(e, folder) { + e.preventDefault(); + const path = folder.dataset.path; + if (!path) return; + window.location.href = path; + } + + selectFolder(folder) { + if (this.selectedFolder) { + this.selectedFolder.classList.remove('selected'); + } + folder.classList.add('selected'); + this.selectedFolder = folder; + } + + clearSelection() { + if (this.selectedFolder) { + this.selectedFolder.classList.remove('selected'); + this.selectedFolder = null; + } + } +} + +// Initialize the directory viewer +document.addEventListener('DOMContentLoaded', () => { + const dirViewer = new DirectoryViewer(document.querySelector('.directory-viewer')); +}); \ No newline at end of file -- cgit v1.2.3