diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index fc34aa3f..37673674 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=يجب ألا يكون الملف فارغًا أو خ database.failedImportFile=فشل استيراد الملف session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 8f9dc2db..4d92ae1f 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Файлът не трябва да е нулев ил database.failedImportFile=Неуспешно импортиране на файл session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 8569f410..02d1c556 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index e4920e4f..1fd579b2 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 47740a2d..bc236d05 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Fil må ikke være null eller tom database.failedImportFile=Kunne ikke importere fil session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 87dc3f79..41791505 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Datei darf nicht null oder leer sein database.failedImportFile=Dateiimport fehlgeschlagen session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index e6939cf5..bdc60f14 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index f124bec8..ebfce1f5 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed to import file session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 2da78640..363e8345 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index a5b9a212..04951c50 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=El archivo no debe ser nulo o vacío. database.failedImportFile=Archivo de importación fallido session.expired=Tu sesión ha caducado. Actualice la página e inténtelo de nuevo. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 8bbb78d2..a778d12a 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index ff7277c8..8d4b4024 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Votre session a expiré. Veuillez recharger la page et réessayer. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 07735d0c..c4d7fde6 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Níor cheart go mbeadh an comhad ar neamhní nó folamh database.failedImportFile=Theip ar iompórtáil an chomhaid session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 65fd2e69..f7b4b0a5 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index acc2b3d0..2ec26341 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 50d22e1b..98e4aebb 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 80611663..94ea40a4 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Berkas tidak boleh null atau kosong database.failedImportFile=Impor Berkas Gagal session.expired=Sesi Anda telah kedaluwarsa. Silakan muat ulang halaman dan coba lagi. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 899b9d73..0899a191 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Il file non deve essere nullo o vuoto database.failedImportFile=Importazione file non riuscita session.expired=La tua sessione è scaduta. Aggiorna la pagina e riprova. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 992ddcb5..94e6ba1b 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=ファイルは null または空であってはなり database.failedImportFile=ファイルのインポートに失敗 session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index a26578d2..794a2b79 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index cdbfbe71..124a2a89 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 3b174504..e86f4b9e 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Fil må ikke være tom eller null database.failedImportFile=Import av fil mislyktes session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index a384c870..4db148c1 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Plik nie może być pusty database.failedImportFile=Nie udało się zaimportować pliku session.expired=Twoja sesja wygasła. Odśwież stronę i spróbuj ponownie. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 5cc5c8db..10605c7b 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=O arquivo não pode estar nulo ou vazio database.failedImportFile=Falha ao importar arquivo session.expired=Sua sessão expirou. Por gentileza atualize a página e tente novamente. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 6ee92eb6..7624092e 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 3d1f7d47..f86a2d73 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Fișierul nu trebuie să fie nul sau gol database.failedImportFile=Importul Fișierului a Eșuat session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 8c915bb4..097ef55c 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index d87128a6..f2881d77 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 61a7d942..f0ff41eb 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index d39d4b3a..9943f946 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Filen får inte vara null eller tom database.failedImportFile=Misslyckades med att importera fil session.expired=Din session har löpt ut. Uppdatera sidan och försök igen. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 68b9d36d..25ca1d57 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=ไฟล์ต้องไม่ว่างเปล database.failedImportFile=การนำเข้าไฟล์ล้มเหลว session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 60e2e5f4..b731da02 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Dosya yok veya boş olmamalıdır database.failedImportFile=Dosya İçe Aktarılamadı session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 2027a834..ca018b93 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=File must not be null or empty database.failedImportFile=Failed Import File session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index b7a4d1ed..15ca0653 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=Tệp không được để trống hoặc rỗng database.failedImportFile=Không thể nhập tệp session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 7be7cb78..506dee41 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=文件不能为空 database.failedImportFile=导入文件失败 session.expired=Your session has expired. Please refresh the page and try again. +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index fd212da9..98d72902 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -246,6 +246,7 @@ database.fileNullOrEmpty=檔案不得為空或空白 database.failedImportFile=匯入檔案失敗 session.expired=您的工作階段已過期。請重新整理頁面並再試一次。 +session.refreshPage=Refresh Page ############# # HOME-PAGE # diff --git a/src/main/resources/static/js/downloader.js b/src/main/resources/static/js/downloader.js index bbe16ba5..1933c4fb 100644 --- a/src/main/resources/static/js/downloader.js +++ b/src/main/resources/static/js/downloader.js @@ -1,288 +1,294 @@ -function showErrorBanner(message, stackTrace) { - const errorContainer = document.getElementById("errorContainer"); - errorContainer.style.display = "block"; // Display the banner - document.querySelector("#errorContainer .alert-heading").textContent = "Error"; - document.querySelector("#errorContainer p").textContent = message; - document.querySelector("#traceContent").textContent = stackTrace; -} +(function() { -function showSessionExpiredPrompt() { - const errorContainer = document.getElementById("errorContainer"); - errorContainer.style.display = "block"; - document.querySelector("#errorContainer .alert-heading").textContent = sessionExpired; - document.querySelector("#errorContainer p").textContent = sessionExpired; - document.querySelector("#traceContent").textContent = ""; + const { pdfPasswordPrompt, multipleInputsForSingleRequest, disableMultipleFiles, remoteCall, sessionExpired, refreshPage, error } = window.stirlingPDF; - // Optional: Add a refresh button - const refreshButton = document.createElement("button"); - refreshButton.textContent = "Refresh Page"; - refreshButton.className = "btn btn-primary mt-3"; - refreshButton.onclick = () => location.reload(); - errorContainer.appendChild(refreshButton); -} + function showErrorBanner(message, stackTrace) { + const errorContainer = document.getElementById("errorContainer"); + errorContainer.style.display = "block"; // Display the banner + errorContainer.querySelector(".alert-heading").textContent = error; + errorContainer.querySelector("p").textContent = message; + document.querySelector("#traceContent").textContent = stackTrace; + } -let firstErrorOccurred = false; + function showSessionExpiredPrompt() { + const errorContainer = document.getElementById("errorContainer"); + errorContainer.style.display = "block"; + errorContainer.querySelector(".alert-heading").textContent = sessionExpired; + errorContainer.querySelector("p").textContent = sessionExpired; + document.querySelector("#traceContent").textContent = ""; -$(document).ready(function () { - $("form").submit(async function (event) { - event.preventDefault(); - firstErrorOccurred = false; - const url = this.action; - const files = $("#fileInput-input")[0].files; - const formData = new FormData(this); + // Optional: Add a refresh button + const refreshButton = document.createElement("button"); + refreshButton.textContent = refreshPage; + refreshButton.className = "btn btn-primary mt-3"; + refreshButton.onclick = () => location.reload(); + errorContainer.appendChild(refreshButton); + } + let firstErrorOccurred = false; + + $(document).ready(function () { + $("form").submit(async function (event) { + event.preventDefault(); + firstErrorOccurred = false; + const url = this.action; + const files = $("#fileInput-input")[0].files; + const formData = new FormData(this); + + // Remove empty file entries + for (let [key, value] of formData.entries()) { + if (value instanceof File && !value.name) { + formData.delete(key); + } + } + const override = $("#override").val() || ""; + const originalButtonText = $("#submitBtn").text(); + $("#submitBtn").text("Processing..."); + console.log(override); + + // Set a timeout to show the game button if operation takes more than 5 seconds + const timeoutId = setTimeout(() => { + var boredWaiting = localStorage.getItem("boredWaiting") || "disabled"; + const showGameBtn = document.getElementById("show-game-btn"); + if (boredWaiting === "enabled" && showGameBtn) { + showGameBtn.style.display = "block"; + showGameBtn.parentNode.insertBefore(document.createElement('br'), showGameBtn.nextSibling); + } + }, 5000); + + try { + if (remoteCall === true) { + if (override === "multi" || (!multipleInputsForSingleRequest && files.length > 1 && override !== "single")) { + await submitMultiPdfForm(url, files); + } else { + await handleSingleDownload(url, formData); + } + } + clearTimeout(timeoutId); + $("#submitBtn").text(originalButtonText); + + // After process finishes, check for boredWaiting and gameDialog open status + const boredWaiting = localStorage.getItem("boredWaiting") || "disabled"; + const gameDialog = document.getElementById('game-container-wrapper'); + if (boredWaiting === "enabled" && gameDialog && gameDialog.open) { + // Display a green banner at the bottom of the screen saying "Download complete" + let downloadCompleteText = "Download Complete"; + if(window.downloadCompleteText){ + downloadCompleteText = window.downloadCompleteText; + } + $("body").append('
'+ downloadCompleteText + '
'); + setTimeout(function() { + $("#download-complete-banner").fadeOut("slow", function() { + $(this).remove(); // Remove the banner after fading out + }); + }, 5000); // Banner will fade out after 5 seconds + } + + } catch (error) { + clearTimeout(timeoutId); + handleDownloadError(error); + $("#submitBtn").text(originalButtonText); + console.error(error); + } + }); + }); + + async function handleSingleDownload(url, formData, isMulti = false, isZip = false) { + try { + const response = await fetch(url, { method: "POST", body: formData }); + const contentType = response.headers.get("content-type"); + + if (!response.ok) { + if (response.status === 401) { + // Handle 401 Unauthorized error + showSessionExpiredPrompt(); + return; + } + if (contentType && contentType.includes("application/json")) { + console.error("Throwing error banner, response was not okay"); + return handleJsonResponse(response); + } + throw new Error(`HTTP error! status: ${response.status}`); + } + + const contentDisposition = response.headers.get("Content-Disposition"); + let filename = getFilenameFromContentDisposition(contentDisposition); + + const blob = await response.blob(); + if (contentType.includes("application/pdf") || contentType.includes("image/")) { + return handleResponse(blob, filename, !isMulti, isZip); + } else { + return handleResponse(blob, filename, false, isZip); + } + } catch (error) { + console.error("Error in handleSingleDownload:", error); + throw error; + } + } + + function getFilenameFromContentDisposition(contentDisposition) { + let filename; + + if (contentDisposition && contentDisposition.indexOf("attachment") !== -1) { + filename = decodeURIComponent(contentDisposition.split("filename=")[1].replace(/"/g, "")).trim(); + } else { + // If the Content-Disposition header is not present or does not contain the filename, use a default filename + filename = "download"; + } + + return filename; + } + + async function handleJsonResponse(response) { + const json = await response.json(); + const errorMessage = JSON.stringify(json, null, 2); + if ( + errorMessage.toLowerCase().includes("the password is incorrect") || + errorMessage.toLowerCase().includes("Password is not provided") || + errorMessage.toLowerCase().includes("PDF contains an encryption dictionary") + ) { + if (!firstErrorOccurred) { + firstErrorOccurred = true; + alert(pdfPasswordPrompt); + } + } else { + showErrorBanner(json.error + ":" + json.message, json.trace); + } + } + + async function handleResponse(blob, filename, considerViewOptions = false, isZip = false) { + if (!blob) return; + const downloadOption = localStorage.getItem("downloadOption"); + if (considerViewOptions) { + if (downloadOption === "sameWindow") { + const url = URL.createObjectURL(blob); + window.location.href = url; + return; + } else if (downloadOption === "newWindow") { + const url = URL.createObjectURL(blob); + window.open(url, "_blank"); + return; + } + } + if (!isZip) { + downloadFile(blob, filename); + } + return { filename, blob }; + } + + function handleDownloadError(error) { + const errorMessage = error.message; + showErrorBanner(errorMessage); + } + + let urls = []; // An array to hold all the URLs + + function downloadFile(blob, filename) { + if (!(blob instanceof Blob)) { + console.error("Invalid blob passed to downloadFile function"); + return; + } + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + a.click(); + urls.push(url); // Store the URL so it doesn't get garbage collected too soon + + return { filename, blob }; + } + + async function submitMultiPdfForm(url, files) { + const zipThreshold = parseInt(localStorage.getItem("zipThreshold"), 10) || 4; + const zipFiles = files.length > zipThreshold; + let jszip = null; + // Add Space below Progress Bar before Showing + $('.progressBarContainer').after($('
')); + $(".progressBarContainer").show(); + // Initialize the progress bar + + let progressBar = $(".progressBar"); + progressBar.css("width", "0%"); + progressBar.attr("aria-valuenow", 0); + progressBar.attr("aria-valuemax", files.length); + + if (zipFiles) { + jszip = new JSZip(); + } + + // Get the form with the method attribute set to POST + let postForm = document.querySelector('form[method="POST"]'); + + // Get existing form data + let formData; + if (postForm) { + formData = new FormData($(postForm)[0]); // Convert the form to a jQuery object and get the raw DOM element + } else { + console.log("No form with POST method found."); + } + //Remove file to reuse parameters for other runs + formData.delete("fileInput"); // Remove empty file entries for (let [key, value] of formData.entries()) { if (value instanceof File && !value.name) { formData.delete(key); } } - const override = $("#override").val() || ""; - const originalButtonText = $("#submitBtn").text(); - $("#submitBtn").text("Processing..."); - console.log(override); + const CONCURRENCY_LIMIT = 8; + const chunks = []; + for (let i = 0; i < Array.from(files).length; i += CONCURRENCY_LIMIT) { + chunks.push(Array.from(files).slice(i, i + CONCURRENCY_LIMIT)); + } - // Set a timeout to show the game button if operation takes more than 5 seconds - const timeoutId = setTimeout(() => { - var boredWaiting = localStorage.getItem("boredWaiting") || "disabled"; - const showGameBtn = document.getElementById("show-game-btn"); - if (boredWaiting === "enabled" && showGameBtn) { - showGameBtn.style.display = "block"; - showGameBtn.parentNode.insertBefore(document.createElement('br'), showGameBtn.nextSibling); - } - }, 5000); + for (const chunk of chunks) { + const promises = chunk.map(async (file) => { + let fileFormData = new FormData(); + fileFormData.append("fileInput", file); + console.log(fileFormData); + // Add other form data + for (let pair of formData.entries()) { + fileFormData.append(pair[0], pair[1]); + console.log(pair[0] + ", " + pair[1]); + } - try { - if (remoteCall === true) { - if (override === "multi" || (!multipleInputsForSingleRequest && files.length > 1 && override !== "single")) { - await submitMultiPdfForm(url, files); - } else { - await handleSingleDownload(url, formData); + try { + const downloadDetails = await handleSingleDownload(url, fileFormData, true, zipFiles); + console.log(downloadDetails); + if (zipFiles) { + jszip.file(downloadDetails.filename, downloadDetails.blob); + } else { + //downloadFile(downloadDetails.blob, downloadDetails.filename); + } + updateProgressBar(progressBar, Array.from(files).length); + } catch (error) { + handleDownloadError(error); + console.error(error); } + }); + await Promise.all(promises); + } + + if (zipFiles) { + try { + const content = await jszip.generateAsync({ type: "blob" }); + downloadFile(content, "files.zip"); + } catch (error) { + console.error("Error generating ZIP file: " + error); } - clearTimeout(timeoutId); - $("#submitBtn").text(originalButtonText); - - // After process finishes, check for boredWaiting and gameDialog open status - const boredWaiting = localStorage.getItem("boredWaiting") || "disabled"; - const gameDialog = document.getElementById('game-container-wrapper'); - if (boredWaiting === "enabled" && gameDialog && gameDialog.open) { - // Display a green banner at the bottom of the screen saying "Download complete" - let downloadCompleteText = "Download Complete"; - if(window.downloadCompleteText){ - downloadCompleteText = window.downloadCompleteText; - } - $("body").append('
'+ downloadCompleteText + '
'); - setTimeout(function() { - $("#download-complete-banner").fadeOut("slow", function() { - $(this).remove(); // Remove the banner after fading out - }); - }, 5000); // Banner will fade out after 5 seconds - } - - } catch (error) { - clearTimeout(timeoutId); - handleDownloadError(error); - $("#submitBtn").text(originalButtonText); - console.error(error); + } + progressBar.css("width", "100%"); + progressBar.attr("aria-valuenow", Array.from(files).length); + } + + function updateProgressBar(progressBar, files) { + let progress = (progressBar.attr("aria-valuenow") / files.length) * 100 + 100 / files.length; + progressBar.css("width", progress + "%"); + progressBar.attr("aria-valuenow", parseInt(progressBar.attr("aria-valuenow")) + 1); + } + window.addEventListener("unload", () => { + for (const url of urls) { + URL.revokeObjectURL(url); } }); -}); -async function handleSingleDownload(url, formData, isMulti = false, isZip = false) { - try { - const response = await fetch(url, { method: "POST", body: formData }); - const contentType = response.headers.get("content-type"); - - if (!response.ok) { - if (response.status === 401) { - // Handle 401 Unauthorized error - showSessionExpiredPrompt(); - return; - } - if (contentType && contentType.includes("application/json")) { - console.error("Throwing error banner, response was not okay"); - return handleJsonResponse(response); - } - throw new Error(`HTTP error! status: ${response.status}`); - } - - const contentDisposition = response.headers.get("Content-Disposition"); - let filename = getFilenameFromContentDisposition(contentDisposition); - - const blob = await response.blob(); - if (contentType.includes("application/pdf") || contentType.includes("image/")) { - return handleResponse(blob, filename, !isMulti, isZip); - } else { - return handleResponse(blob, filename, false, isZip); - } - } catch (error) { - console.error("Error in handleSingleDownload:", error); - throw error; - } -} - -function getFilenameFromContentDisposition(contentDisposition) { - let filename; - - if (contentDisposition && contentDisposition.indexOf("attachment") !== -1) { - filename = decodeURIComponent(contentDisposition.split("filename=")[1].replace(/"/g, "")).trim(); - } else { - // If the Content-Disposition header is not present or does not contain the filename, use a default filename - filename = "download"; - } - - return filename; -} - -async function handleJsonResponse(response) { - const json = await response.json(); - const errorMessage = JSON.stringify(json, null, 2); - if ( - errorMessage.toLowerCase().includes("the password is incorrect") || - errorMessage.toLowerCase().includes("Password is not provided") || - errorMessage.toLowerCase().includes("PDF contains an encryption dictionary") - ) { - if (!firstErrorOccurred) { - firstErrorOccurred = true; - alert(pdfPasswordPrompt); - } - } else { - showErrorBanner(json.error + ":" + json.message, json.trace); - } -} - -async function handleResponse(blob, filename, considerViewOptions = false, isZip = false) { - if (!blob) return; - const downloadOption = localStorage.getItem("downloadOption"); - if (considerViewOptions) { - if (downloadOption === "sameWindow") { - const url = URL.createObjectURL(blob); - window.location.href = url; - return; - } else if (downloadOption === "newWindow") { - const url = URL.createObjectURL(blob); - window.open(url, "_blank"); - return; - } - } - if (!isZip) { - downloadFile(blob, filename); - } - return { filename, blob }; -} - -function handleDownloadError(error) { - const errorMessage = error.message; - showErrorBanner(errorMessage); -} - -let urls = []; // An array to hold all the URLs - -function downloadFile(blob, filename) { - if (!(blob instanceof Blob)) { - console.error("Invalid blob passed to downloadFile function"); - return; - } - const url = URL.createObjectURL(blob); - const a = document.createElement("a"); - a.href = url; - a.download = filename; - a.click(); - urls.push(url); // Store the URL so it doesn't get garbage collected too soon - - return { filename, blob }; -} - -async function submitMultiPdfForm(url, files) { - const zipThreshold = parseInt(localStorage.getItem("zipThreshold"), 10) || 4; - const zipFiles = files.length > zipThreshold; - let jszip = null; - // Add Space below Progress Bar before Showing - $('.progressBarContainer').after($('
')); - $(".progressBarContainer").show(); - // Initialize the progress bar - - let progressBar = $(".progressBar"); - progressBar.css("width", "0%"); - progressBar.attr("aria-valuenow", 0); - progressBar.attr("aria-valuemax", files.length); - - if (zipFiles) { - jszip = new JSZip(); - } - - // Get the form with the method attribute set to POST - let postForm = document.querySelector('form[method="POST"]'); - - // Get existing form data - let formData; - if (postForm) { - formData = new FormData($(postForm)[0]); // Convert the form to a jQuery object and get the raw DOM element - } else { - console.log("No form with POST method found."); - } - //Remove file to reuse parameters for other runs - formData.delete("fileInput"); - // Remove empty file entries - for (let [key, value] of formData.entries()) { - if (value instanceof File && !value.name) { - formData.delete(key); - } - } - const CONCURRENCY_LIMIT = 8; - const chunks = []; - for (let i = 0; i < Array.from(files).length; i += CONCURRENCY_LIMIT) { - chunks.push(Array.from(files).slice(i, i + CONCURRENCY_LIMIT)); - } - - for (const chunk of chunks) { - const promises = chunk.map(async (file) => { - let fileFormData = new FormData(); - fileFormData.append("fileInput", file); - console.log(fileFormData); - // Add other form data - for (let pair of formData.entries()) { - fileFormData.append(pair[0], pair[1]); - console.log(pair[0] + ", " + pair[1]); - } - - try { - const downloadDetails = await handleSingleDownload(url, fileFormData, true, zipFiles); - console.log(downloadDetails); - if (zipFiles) { - jszip.file(downloadDetails.filename, downloadDetails.blob); - } else { - //downloadFile(downloadDetails.blob, downloadDetails.filename); - } - updateProgressBar(progressBar, Array.from(files).length); - } catch (error) { - handleDownloadError(error); - console.error(error); - } - }); - await Promise.all(promises); - } - - if (zipFiles) { - try { - const content = await jszip.generateAsync({ type: "blob" }); - downloadFile(content, "files.zip"); - } catch (error) { - console.error("Error generating ZIP file: " + error); - } - } - progressBar.css("width", "100%"); - progressBar.attr("aria-valuenow", Array.from(files).length); -} - -function updateProgressBar(progressBar, files) { - let progress = (progressBar.attr("aria-valuenow") / files.length) * 100 + 100 / files.length; - progressBar.css("width", progress + "%"); - progressBar.attr("aria-valuenow", parseInt(progressBar.attr("aria-valuenow")) + 1); -} -window.addEventListener("unload", () => { - for (const url of urls) { - URL.revokeObjectURL(url); - } -}); +})(); diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 293a8549..dd74d388 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -21,6 +21,10 @@ + + @@ -187,11 +191,15 @@ @@ -210,4 +218,4 @@ - + \ No newline at end of file