From ddf5915c6a986973b788cdcd4246f398a8eb6211 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 13 Jul 2023 22:03:23 +0100 Subject: [PATCH] drag drop niceness --- src/main/resources/static/js/fileInput.js | 89 ++++++++++++++++++----- 1 file changed, 71 insertions(+), 18 deletions(-) diff --git a/src/main/resources/static/js/fileInput.js b/src/main/resources/static/js/fileInput.js index 87454277..d9affafc 100644 --- a/src/main/resources/static/js/fileInput.js +++ b/src/main/resources/static/js/fileInput.js @@ -1,30 +1,83 @@ document.addEventListener('DOMContentLoaded', function() { - const fileInput = document.getElementById(elementID); - // Prevent default behavior for drag events - ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { - fileInput.addEventListener(eventName, preventDefaults, false); - }); - function preventDefaults(e) { - e.preventDefault(); - e.stopPropagation(); - } + let overlay; + let dragCounter = 0; - // Add drop event listener - fileInput.addEventListener('drop', handleDrop, false); + const dragenterListener = function() { + dragCounter++; + if (!overlay) { + // Create and show the 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) { + // Hide and remove the overlay + if (overlay) { + overlay.remove(); + overlay = null; + } + } + }; + + const dropListener = function(e) { + const dt = e.dataTransfer; + const files = dt.files; + + // Access the file input element and assign dropped files + const fileInput = document.getElementById(elementID); + fileInput.files = files; + + // Hide and remove the overlay + if (overlay) { + overlay.remove(); + overlay = null; + } + + // Reset drag counter + dragCounter = 0; + + handleFileInputChange(fileInput); + }; + + // Prevent default behavior for drag events + ['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); + // Add drop event listener + document.body.addEventListener('drop', dropListener); - function handleDrop(e) { - const dt = e.dataTransfer; - const files = dt.files; - fileInput.files = files; - handleFileInputChange(fileInput) - } }); $("#"+elementID).on("change", function() { - handleFileInputChange(this); + handleFileInputChange(this); }); + function handleFileInputChange(inputElement) { const files = $(inputElement).get(0).files; const fileNames = Array.from(files).map(f => f.name);