(function () { 'use strict'; const {modalManager, FileUploader, showNotification} = window.sharedUtils; /* ======================= * SELECT/DELETE FILES LOGIC * ======================= */ class FileSelectionManager { constructor() { this.selectAllCheckbox = document.getElementById('select-all-checkbox'); this.fileCheckboxes = document.querySelectorAll('.file-select-checkbox'); this.fileCards = document.querySelectorAll('.file-card'); this.deleteMultipleForm = document.querySelector('.multiple-delete-form'); this.downloadMultipleForm = document.querySelector('.multiple-download-form'); this.deleteMultipleBtn = document.getElementById('delete-multiple-btn'); this.downloadMultipleBtn = document.getElementById('download-multiple-btn'); this.multipleFileNamesInput = document.getElementById('multiple-file-names'); this.multipleDownloadNamesInput = document.getElementById('multiple-download-names'); this.init(); } init() { if (this.selectAllCheckbox) { this.selectAllCheckbox.addEventListener('change', () => this.toggleSelectAll()); } this.fileCheckboxes.forEach(checkbox => { checkbox.addEventListener('change', () => this.updateSelectionState()); }); this.fileCards.forEach(card => { card.addEventListener('click', (e) => this.handleCardClick(e, card)); }); if (this.deleteMultipleForm) { this.deleteMultipleForm.addEventListener('submit', (e) => this.handleMultipleDelete(e)); } if (this.downloadMultipleForm) { this.downloadMultipleForm.addEventListener('submit', (e) => this.handleMultipleDownload(e)); } } handleCardClick(e, card) { if (e.target.closest('.file-card-actions') || e.target.closest('.file-action-btn') || e.target.closest('.delete-form') || e.target.closest('a')) { return; } const checkbox = card.querySelector('.file-select-checkbox'); if (checkbox) { checkbox.checked = !checkbox.checked; checkbox.dispatchEvent(new Event('change')); } } toggleSelectAll() { const isChecked = this.selectAllCheckbox.checked; this.fileCheckboxes.forEach(checkbox => { checkbox.checked = isChecked; checkbox.dispatchEvent(new Event('change')); }); this.updateSelectionState(); } updateSelectionState() { const selectedFiles = Array.from(this.fileCheckboxes) .filter(cb => cb.checked) .map(cb => cb.value); // flash selected this.fileCards.forEach(card => { const fileName = card.dataset.fileName; if (selectedFiles.includes(fileName)) { card.classList.add('selected'); } else { card.classList.remove('selected'); } }); // show/hide action-buttons if (selectedFiles.length > 0) { this.deleteMultipleForm.style.display = 'block'; this.downloadMultipleForm.style.display = 'inline-block'; this.multipleFileNamesInput.value = JSON.stringify(selectedFiles); this.multipleDownloadNamesInput.value = JSON.stringify(selectedFiles); this.deleteMultipleBtn.innerHTML = ` Delete Selected (${selectedFiles.length}) `; this.downloadMultipleBtn.innerHTML = ` Download Selected (${selectedFiles.length}) `; } else { this.deleteMultipleForm.style.display = 'none'; this.downloadMultipleForm.style.display = 'none'; } // refresh select all if (this.selectAllCheckbox) { this.selectAllCheckbox.checked = selectedFiles.length === this.fileCheckboxes.length && this.fileCheckboxes.length > 0; this.selectAllCheckbox.indeterminate = selectedFiles.length > 0 && selectedFiles.length < this.fileCheckboxes.length; } } handleMultipleDelete(e) { if (!confirm('Are you sure you want to delete selected files?')) { e.preventDefault(); return false; } return true; } handleMultipleDownload(e) { console.log('Downloading selected files...'); return true; } } /* ======================= * FILE PREVIEW * ======================= */ class FilePreviewManager { constructor(fileInput, previewContainer) { this.fileInput = fileInput; this.previewContainer = previewContainer; this.img = previewContainer.querySelector('img'); this.info = previewContainer.querySelector('.file-info'); this.init(); } init() { this.fileInput.addEventListener('change', () => this.updatePreview()); } updatePreview() { const file = this.fileInput.files[0]; if (!file) { this.previewContainer.style.display = 'none'; return; } this.previewContainer.style.display = 'block'; this.info.innerHTML = `