2024-12-02 19:41:11 +02:00
|
|
|
let isScriptExecuted = false;
|
|
|
|
if (!isScriptExecuted) {
|
|
|
|
isScriptExecuted = true;
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
document.querySelectorAll(".custom-file-chooser").forEach(setupFileInput);
|
|
|
|
});
|
|
|
|
}
|
2023-06-02 20:15:10 +01:00
|
|
|
|
2023-08-02 22:49:43 +01:00
|
|
|
function setupFileInput(chooser) {
|
2024-02-16 22:49:06 +01:00
|
|
|
const elementId = chooser.getAttribute("data-bs-element-id");
|
|
|
|
const filesSelected = chooser.getAttribute("data-bs-files-selected");
|
|
|
|
const pdfPrompt = chooser.getAttribute("data-bs-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 = "<p>Drop files anywhere to upload</p>";
|
|
|
|
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;
|
|
|
|
|
2024-11-29 19:31:14 +02:00
|
|
|
const fileInput = document.getElementById(elementId);
|
|
|
|
if (fileInput?.hasAttribute("multiple")) {
|
|
|
|
files.forEach(file => allFiles.push(file));
|
|
|
|
} else if (fileInput) {
|
|
|
|
allFiles = [files[0]];
|
2024-02-16 22:49:06 +01:00
|
|
|
}
|
|
|
|
|
2024-05-23 19:52:49 +01:00
|
|
|
const dataTransfer = new DataTransfer();
|
|
|
|
allFiles.forEach((file) => dataTransfer.items.add(file));
|
|
|
|
|
2024-02-16 22:49:06 +01:00
|
|
|
fileInput.files = dataTransfer.files;
|
2023-07-13 22:03:23 +01:00
|
|
|
|
2024-02-16 22:49:06 +01:00
|
|
|
if (overlay) {
|
|
|
|
overlay.remove();
|
|
|
|
overlay = null;
|
2023-07-13 22:03:23 +01:00
|
|
|
}
|
|
|
|
|
2024-02-16 22:49:06 +01:00
|
|
|
dragCounter = 0;
|
|
|
|
|
2024-11-26 22:41:08 +02:00
|
|
|
fileInput.dispatchEvent(new CustomEvent("change", { bubbles: true, detail: {source: 'drag-drop'} }));
|
2024-02-16 22:49:06 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
["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) {
|
2024-11-26 22:41:08 +02:00
|
|
|
let element = e.target;
|
|
|
|
const isDragAndDrop = e.detail?.source == 'drag-drop';
|
2024-12-02 19:41:11 +02:00
|
|
|
|
2024-11-26 22:41:08 +02:00
|
|
|
if (element instanceof HTMLInputElement && element.hasAttribute("multiple")) {
|
|
|
|
allFiles = isDragAndDrop ? allFiles : [... allFiles, ... element.files];
|
2024-11-29 15:11:59 +00:00
|
|
|
} else {
|
|
|
|
allFiles = Array.from(isDragAndDrop ? allFiles : [element.files[0]]);
|
|
|
|
}
|
2024-11-26 22:41:08 +02:00
|
|
|
|
|
|
|
if (!isDragAndDrop) {
|
2024-11-29 15:11:59 +00:00
|
|
|
let dataTransfer = new DataTransfer();
|
|
|
|
allFiles.forEach(file => dataTransfer.items.add(file));
|
|
|
|
element.files = dataTransfer.files;
|
2024-11-26 22:41:08 +02:00
|
|
|
}
|
|
|
|
|
2024-02-16 22:49:06 +01:00
|
|
|
handleFileInputChange(this);
|
2024-11-26 22:41:08 +02:00
|
|
|
this.dispatchEvent(new CustomEvent("file-input-change", { bubbles: true }));
|
2024-11-29 15:11:59 +00:00
|
|
|
});
|
2024-02-16 22:49:06 +01:00
|
|
|
|
|
|
|
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("<div>" + fileName + "</div>");
|
|
|
|
});
|
|
|
|
if (fileNames.length === 1) {
|
|
|
|
$(inputElement).siblings(".custom-file-label").addClass("selected").html(fileNames[0]);
|
|
|
|
} else if (fileNames.length > 1) {
|
|
|
|
$(inputElement)
|
|
|
|
.siblings(".custom-file-label")
|
|
|
|
.addClass("selected")
|
|
|
|
.html(fileNames.length + " " + filesSelected);
|
|
|
|
} else {
|
|
|
|
$(inputElement).siblings(".custom-file-label").addClass("selected").html(pdfPrompt);
|
2023-08-02 22:49:43 +01:00
|
|
|
}
|
2024-02-16 22:49:06 +01:00
|
|
|
}
|
2024-05-23 19:52:49 +01:00
|
|
|
//Listen for event of file being removed and the filter it out of the allFiles array
|
|
|
|
document.addEventListener("fileRemoved", function (e) {
|
|
|
|
const fileName = e.detail;
|
|
|
|
allFiles = allFiles.filter(file => file.name !== fileName);
|
|
|
|
});
|
2023-08-02 22:49:43 +01:00
|
|
|
}
|