mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-11-01 01:21:18 +01:00 
			
		
		
		
	Fix: redeclaration of const and add: tranlation placeholder for Session Expiry Messages (#2158)
Fix: redeclaration of const
This commit is contained in:
		
							parent
							
								
									a8d0d1a871
								
							
						
					
					
						commit
						cf13803fd4
					
				@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -246,6 +246,7 @@ database.fileNullOrEmpty=Файлът не трябва да е нулев ил
 | 
			
		||||
database.failedImportFile=Неуспешно импортиране на файл
 | 
			
		||||
 | 
			
		||||
session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново.
 | 
			
		||||
session.refreshPage=Refresh Page
 | 
			
		||||
 | 
			
		||||
#############
 | 
			
		||||
# HOME-PAGE #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -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 #
 | 
			
		||||
 | 
			
		||||
@ -246,6 +246,7 @@ database.fileNullOrEmpty=檔案不得為空或空白
 | 
			
		||||
database.failedImportFile=匯入檔案失敗
 | 
			
		||||
 | 
			
		||||
session.expired=您的工作階段已過期。請重新整理頁面並再試一次。
 | 
			
		||||
session.refreshPage=Refresh Page
 | 
			
		||||
 | 
			
		||||
#############
 | 
			
		||||
# HOME-PAGE #
 | 
			
		||||
 | 
			
		||||
@ -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('<div id="download-complete-banner" style="position:fixed;bottom:0;left:0;width:100%;background-color:green;color:white;text-align:center;padding:10px;font-size:16px;z-index:1000;">'+ downloadCompleteText + '</div>');
 | 
			
		||||
          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($('<br>'));
 | 
			
		||||
    $(".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('<div id="download-complete-banner" style="position:fixed;bottom:0;left:0;width:100%;background-color:green;color:white;text-align:center;padding:10px;font-size:16px;z-index:1000;">'+ downloadCompleteText + '</div>');
 | 
			
		||||
        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($('<br>'));
 | 
			
		||||
  $(".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);
 | 
			
		||||
  }
 | 
			
		||||
});
 | 
			
		||||
})();
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,10 @@
 | 
			
		||||
    <meta name="msapplication-TileColor" content="#00aba9">
 | 
			
		||||
    <meta name="theme-color" content="#ffffff">
 | 
			
		||||
 | 
			
		||||
    <script>
 | 
			
		||||
      window.stirlingPDF = window.stirlingPDF || {};
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
    <!-- jQuery -->
 | 
			
		||||
    <script th:src="@{'/js/thirdParty/jquery.min.js'}"></script>
 | 
			
		||||
    <script th:src="@{'/js/thirdParty/jquery.validate.min.js'}"></script>
 | 
			
		||||
@ -187,11 +191,15 @@
 | 
			
		||||
 | 
			
		||||
<th:block th:fragment="fileSelector(name, multipleInputsForSingleRequest)" th:with="accept=${accept} ?: '*/*', inputText=${inputText} ?: #{pdfPrompt}, remoteCall=${remoteCall} ?: true, disableMultipleFiles=${disableMultipleFiles} ?: false, notRequired=${notRequired} ?: false">
 | 
			
		||||
                <script th:inline="javascript">
 | 
			
		||||
                  const pdfPasswordPrompt = /*[[#{error.pdfPassword}]]*/ '';
 | 
			
		||||
                  const multipleInputsForSingleRequest = /*[[${multipleInputsForSingleRequest}]]*/ false;
 | 
			
		||||
                  const disableMultipleFiles = /*[[${disableMultipleFiles}]]*/ false;
 | 
			
		||||
                  const remoteCall = /*[[${remoteCall}]]*/ true;
 | 
			
		||||
                  const sessionExpired = /*[[#{session.expired}]]*/ '';
 | 
			
		||||
                  (function() {
 | 
			
		||||
                    window.stirlingPDF.pdfPasswordPrompt = /*[[#{error.pdfPassword}]]*/ '';
 | 
			
		||||
                    window.stirlingPDF.multipleInputsForSingleRequest = /*[[${multipleInputsForSingleRequest}]]*/ false;
 | 
			
		||||
                    window.stirlingPDF.disableMultipleFiles = /*[[${disableMultipleFiles}]]*/ false;
 | 
			
		||||
                    window.stirlingPDF.remoteCall = /*[[${remoteCall}]]*/ true;
 | 
			
		||||
                    window.stirlingPDF.sessionExpired = /*[[#{session.expired}]]*/ '';
 | 
			
		||||
                    window.stirlingPDF.refreshPage = /*[[#{session.refreshPage}]]*/ 'Refresh Page';
 | 
			
		||||
                    window.stirlingPDF.error = /*[[#{error}]]*/ "Error";
 | 
			
		||||
                  })();
 | 
			
		||||
                </script>
 | 
			
		||||
                <script th:src="@{'/js/downloader.js'}"></script>
 | 
			
		||||
 | 
			
		||||
@ -210,4 +218,4 @@
 | 
			
		||||
                  </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <script th:src="@{'/js/fileInput.js'}"></script>
 | 
			
		||||
</th:block>
 | 
			
		||||
</th:block>
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user