document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.custom-file-chooser').forEach(setupFileInput); }); function setupFileInput(chooser) { const elementId = chooser.getAttribute('data-element-id'); const filesSelected = chooser.getAttribute('data-files-selected'); const pdfPrompt = chooser.getAttribute('data-pdf-prompt'); let allFiles = []; let overlay; let dragCounter = 0; const dragenterListener = function() { dragCounter++; if (!overlay) { overlay = document.createElement('div'); overlay.style.position = 'fixed'; overlay.style.top = 0; overlay.style.left = 0; overlay.style.width = '100%'; overlay.style.height = '100%'; overlay.style.background = 'rgba(0, 0, 0, 0.5)'; overlay.style.color = '#fff'; overlay.style.zIndex = '1000'; overlay.style.display = 'flex'; overlay.style.alignItems = 'center'; overlay.style.justifyContent = 'center'; overlay.style.pointerEvents = 'none'; overlay.innerHTML = '
Drop files anywhere to upload
'; document.getElementById('content-wrap').appendChild(overlay); } }; const dragleaveListener = function() { dragCounter--; if (dragCounter === 0) { if (overlay) { overlay.remove(); overlay = null; } } }; const dropListener = function(e) { e.preventDefault(); const dt = e.dataTransfer; const files = dt.files; for (let i = 0; i < files.length; i++) { allFiles.push(files[i]); } const dataTransfer = new DataTransfer(); allFiles.forEach(file => dataTransfer.items.add(file)); const fileInput = document.getElementById(elementId); fileInput.files = dataTransfer.files; if (overlay) { overlay.remove(); overlay = null; } dragCounter = 0; fileInput.dispatchEvent(new Event('change', { bubbles: true })); }; ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { document.body.addEventListener(eventName, preventDefaults, false); }); function preventDefaults(e) { e.preventDefault(); e.stopPropagation(); } document.body.addEventListener('dragenter', dragenterListener); document.body.addEventListener('dragleave', dragleaveListener); document.body.addEventListener('drop', dropListener); $("#" + elementId).on("change", function(e) { allFiles = Array.from(e.target.files); handleFileInputChange(this); }); function handleFileInputChange(inputElement) { const files = allFiles; const fileNames = files.map(f => f.name); const selectedFilesContainer = $(inputElement).siblings(".selected-files"); selectedFilesContainer.empty(); fileNames.forEach(fileName => { selectedFilesContainer.append("