diff --git a/README.md b/README.md index 480abd567..2f7838606 100644 --- a/README.md +++ b/README.md @@ -128,14 +128,14 @@ Stirling-PDF currently supports 39 languages! | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![92%](https://geps.dev/progress/92) | -| German (Deutsch) (de_DE) | ![94%](https://geps.dev/progress/94) | +| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | | Greek (Ελληνικά) (el_GR) | ![91%](https://geps.dev/progress/91) | | Hindi (हिंदी) (hi_IN) | ![92%](https://geps.dev/progress/92) | | Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | | Indonesian (Bahasa Indonesia) (id_ID) | ![81%](https://geps.dev/progress/81) | | Irish (Gaeilge) (ga_IE) | ![92%](https://geps.dev/progress/92) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![89%](https://geps.dev/progress/89) | +| Japanese (日本語) (ja_JP) | ![94%](https://geps.dev/progress/94) | | Korean (한국어) (ko_KR) | ![92%](https://geps.dev/progress/92) | | Norwegian (Norsk) (no_NB) | ![86%](https://geps.dev/progress/86) | | Persian (فارسی) (fa_IR) | ![88%](https://geps.dev/progress/88) | diff --git a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java index 7bc0cc9bd..5ca7df214 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java @@ -141,7 +141,7 @@ public class UserBasedRateLimitingFilter extends OncePerRequestFilter { .build(); return Bucket.builder().addLimit(limit).build(); } - + private static String stripNewlines(final String s) { return s.replaceAll("[\n\r]", ""); } diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 72dd7f4c0..32c34ba46 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -34,7 +34,8 @@ class PdfContainer { this.splitPDF = this.splitPDF.bind(this); this.splitAll = this.splitAll.bind(this); this.deleteSelected = this.deleteSelected.bind(this); - this.toggleSelectAll = this.toggleSelectAll.bind(this); + this.selectAll = this.selectAll.bind(this); + this.deselectAll = this.deselectAll.bind(this); this.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay.bind(this); this.toggleSelectPageVisibility = this.toggleSelectPageVisibility.bind(this); this.updatePagesFromCSV = this.updatePagesFromCSV.bind(this); @@ -63,7 +64,8 @@ class PdfContainer { window.rotateAll = this.rotateAll; window.splitAll = this.splitAll; window.deleteSelected = this.deleteSelected; - window.toggleSelectAll = this.toggleSelectAll; + window.selectAll = this.selectAll; + window.deselectAll = this.deselectAll; window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay; window.toggleSelectPageVisibility = this.toggleSelectPageVisibility; window.updatePagesFromCSV = this.updatePagesFromCSV; @@ -72,7 +74,6 @@ class PdfContainer { window.addFilesBlankAll = this.addFilesBlankAll; window.removeAllElements = this.removeAllElements; window.resetPages = this.resetPages; - window.selectAll = false; let undoBtn = document.getElementById('undo-btn'); let redoBtn = document.getElementById('redo-btn'); @@ -433,33 +434,43 @@ class PdfContainer { this.undoManager.pushUndoClearRedo(removeSelectedCommand); } - toggleSelectAll() { + selectAll() { const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); - window.selectAll = !window.selectAll; const selectIcon = document.getElementById('select-All-Container'); const deselectIcon = document.getElementById('deselect-All-Container'); - if (!window.selectAll) { - this.showButton(selectIcon, true); - this.showButton(deselectIcon, false); - } else { - this.showButton(selectIcon, false); - this.showButton(deselectIcon, true); - } + this.showButton(selectIcon, false); + this.showButton(deselectIcon, true); + checkboxes.forEach((checkbox) => { - checkbox.checked = window.selectAll; + checkbox.checked = true; const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; - if (checkbox.checked) { - if (!window.selectedPages.includes(pageNumber)) { - window.selectedPages.push(pageNumber); - } - } else { - const index = window.selectedPages.indexOf(pageNumber); - if (index !== -1) { - window.selectedPages.splice(index, 1); - } + if (!window.selectedPages.includes(pageNumber)) { + window.selectedPages.push(pageNumber); + } + }); + + this.updateSelectedPagesDisplay(); + } + + deselectAll() { + const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); + const selectIcon = document.getElementById('select-All-Container'); + const deselectIcon = document.getElementById('deselect-All-Container'); + + this.showButton(selectIcon, true); + this.showButton(deselectIcon, false); + + checkboxes.forEach((checkbox) => { + checkbox.checked = false; + + const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; + + const index = window.selectedPages.indexOf(pageNumber); + if (index !== -1) { + window.selectedPages.splice(index, 1); } }); @@ -569,6 +580,34 @@ class PdfContainer { // Update the input field with the formatted page list selectedPagesInput.value = this.formatSelectedPages(window.selectedPages); + + const selectIcon = document.getElementById('select-All-Container'); + const deselectIcon = document.getElementById('deselect-All-Container'); + + if (window.selectPage) { // Check if selectPage mode is active + console.log("Page Select on. Showing buttons"); + //Check if no pages are selected + if (window.selectedPages.length === 0) { + this.showButton(selectIcon, true); + this.showButton(deselectIcon, false); + } else { + this.showButton(deselectIcon, true); + } + + //Check if all pages are selected + const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox'); + const allSelected = Array.from(allCheckboxes).every((checkbox) => checkbox.checked); + if (allSelected) { + this.showButton(selectIcon, false); + this.showButton(deselectIcon, true); + } else { + this.showButton(selectIcon, true); + } + } else { + console.log("Page Select off. Hidding buttons"); + this.showButton(selectIcon, false); + this.showButton(deselectIcon, false); + } } parsePageRanges(ranges) { @@ -793,13 +832,9 @@ class PdfContainer { }); const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); - window.selectAll = false; const selectIcon = document.getElementById('select-All-Container'); const deselectIcon = document.getElementById('deselect-All-Container'); - selectIcon.style.display = 'inline'; - deselectIcon.style.display = 'none'; - checkboxes.forEach((checkbox) => { const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; @@ -852,18 +887,30 @@ class PdfContainer { deleteButton.classList.toggle('hidden', !window.selectPage); const selectedPages = document.getElementById('selected-pages-display'); selectedPages.classList.toggle('hidden', !window.selectPage); + if(!window.selectPage) { this.showButton(document.getElementById('deselect-All-Container'), false); this.showButton(document.getElementById('select-All-Container'), false); - } - else if(window.selectAll){ - this.showButton(document.getElementById('deselect-All-Container'), true); - this.showButton(document.getElementById('select-All-Container'), false); + + // Uncheck all checkboxes and clear selected pages + const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox'); + allCheckboxes.forEach((checkbox) => { + checkbox.checked = false; + }); + window.selectedPages = []; + this.updateSelectedPagesDisplay(); } else{ - this.showButton(document.getElementById('deselect-All-Container'), false); - this.showButton(document.getElementById('select-All-Container'), true); + const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox'); + const allSelected = Array.from(allCheckboxes).every((checkbox) => checkbox.checked); + if (!allSelected) { + this.showButton(document.getElementById('select-All-Container'), true); + } + + if (window.selectedPages.length > 0) { + this.showButton(document.getElementById('deselect-All-Container'), true); + } } const exportSelected = document.getElementById('export-selected-button'); diff --git a/src/main/resources/templates/multi-tool.html b/src/main/resources/templates/multi-tool.html index 3c6c60fba..173b92838 100644 --- a/src/main/resources/templates/multi-tool.html +++ b/src/main/resources/templates/multi-tool.html @@ -94,11 +94,11 @@