"use strict"; window.addEventListener('DOMContentLoaded', (event) => { // The implementation of this drag-drop logic is largely based on the // answer described in . // // The gist is this: every time the drag enters a new DOM object, it will // fire a new 'dragenter' event on that element. That is a pain, because // we do not know which element will be the last to receive a dragleave // event, in case the user aborts the process. // // Therefore, we use an Ugly Hackā„¢. There will be an element with id // 'dropZone', which blocks the complete page. When a 'dragenter' event // is received on any DOM element, we will unhide this modal page-blocker. // This will guarantee us that the next 'enter' event will be received on // this page-block element. This event we shall ignore. // // Then, whenever the user stop their drag action, we will receive the // 'dragleave' on the '#dropZone' element. Now we know when exactly // a drag action is cancelled (and we will hide the modal element // accordingly). let dropZone = document.getElementById("dropZone"); window.addEventListener("dragenter", (event) => { // User starts a drag action dropZone.style.visibility = ""; dropZone.style.opacity = 1; }); dropZone.addEventListener("drop", (event) => { // User drops a file event.preventDefault(); document.getElementById("fileUploadField").files = event.dataTransfer.files; document.getElementById("fileUploadForm").submit(); }); dropZone.addEventListener("dragleave", (event) => { // User cancels drag action dropZone.style.visibility = "hidden"; dropZone.style.opacity = 0; }); window.addEventListener("dragover", (event) => { // Prevent the browser from opening the file, because of a drop event // on the window. () event.preventDefault(); }); });