diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 00000000..13566b81
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/src/main/resources/static/css/dark-mode.css b/src/main/resources/static/css/dark-mode.css
index cf2e028d..82e01676 100644
--- a/src/main/resources/static/css/dark-mode.css
+++ b/src/main/resources/static/css/dark-mode.css
@@ -91,3 +91,26 @@ hr {
border-color: rgba(255, 255, 255, 0.6); /* semi-transparent white */
background-color: rgba(255, 255, 255, 0.6); /* for some browsers that might use background instead of border for
*/
}
+
+#global-buttons-container input {
+ background-color: #323948;
+ caret-color: #ffffff;
+ color: #ffffff;
+}
+#global-buttons-container input::placeholder {
+ color: #ffffff;
+}
+
+#global-buttons-container input:disabled::-webkit-input-placeholder { /* WebKit browsers */
+ color: #6E6865;
+}
+#global-buttons-container input:disabled:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
+ color: #6E6865;
+}
+#global-buttons-container input:disabled::-moz-placeholder { /* Mozilla Firefox 19+ */
+ color: #6E6865;
+}
+#global-buttons-container input:disabled:-ms-input-placeholder { /* Internet Explorer 10+ */
+ color: #6E6865;
+}
+
diff --git a/src/main/resources/static/css/light-mode.css b/src/main/resources/static/css/light-mode.css
index b696c036..08efbf4c 100644
--- a/src/main/resources/static/css/light-mode.css
+++ b/src/main/resources/static/css/light-mode.css
@@ -2,4 +2,23 @@
body {
--body-background-color: 255, 255, 255;
--base-font-color: 33, 37, 41;
-}
\ No newline at end of file
+}
+
+
+#global-buttons-container input {
+ background-color: #ffffff;
+ /*caret-color: #ffffff;*/
+ /*color: #ffffff;*/
+}
+/*#global-buttons-container input:disabled::-webkit-input-placeholder { !* WebKit browsers *!*/
+/* color: #98A0AB;*/
+/*}*/
+/*#global-buttons-container input:disabled:-moz-placeholder { !* Mozilla Firefox 4 to 18 *!*/
+/* color: #98A0AB;*/
+/*}*/
+/*#global-buttons-container input:disabled::-moz-placeholder { !* Mozilla Firefox 19+ *!*/
+/* color: #98A0AB;*/
+/*}*/
+/*#global-buttons-container input:disabled:-ms-input-placeholder { !* Internet Explorer 10+ *!*/
+/* color: #98A0AB;*/
+/*}*/
diff --git a/src/main/resources/static/js/multitool/PdfActionsManager.js b/src/main/resources/static/js/multitool/PdfActionsManager.js
index 4bff39e3..3a4fd33d 100644
--- a/src/main/resources/static/js/multitool/PdfActionsManager.js
+++ b/src/main/resources/static/js/multitool/PdfActionsManager.js
@@ -55,6 +55,17 @@ class PdfActionsManager {
deletePageButtonCallback(e) {
var imgContainer = this.getPageContainer(e.target);
this.pagesContainer.removeChild(imgContainer);
+ if (this.pagesContainer.childElementCount === 0) {
+ const filenameInput = document.getElementById('filename-input');
+ const filenameParagraph = document.getElementById('filename');
+ const downloadBtn = document.getElementById('export-button');
+
+ filenameInput.disabled = true;
+ filenameInput.value = "";
+ filenameParagraph.innerText = "";
+
+ downloadBtn.disabled = true;
+ }
};
insertFileButtonCallback(e) {
diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js
index 45c92be1..4c7c8497 100644
--- a/src/main/resources/static/js/multitool/PdfContainer.js
+++ b/src/main/resources/static/js/multitool/PdfContainer.js
@@ -3,17 +3,21 @@ class PdfContainer {
pagesContainer;
pagesContainerWrapper;
pdfAdapters;
+ downloadLink;
constructor(id, wrapperId, pdfAdapters) {
- this.fileName = null;
this.pagesContainer = document.getElementById(id)
this.pagesContainerWrapper = document.getElementById(wrapperId);
+ this.downloadLink = null;
this.movePageTo = this.movePageTo.bind(this);
this.addPdfs = this.addPdfs.bind(this);
this.addPdfsFromFiles = this.addPdfsFromFiles.bind(this);
this.rotateElement = this.rotateElement.bind(this);
this.rotateAll = this.rotateAll.bind(this);
this.exportPdf = this.exportPdf.bind(this);
+ this.updateFilename = this.updateFilename.bind(this);
+ this.setDownloadAttribute = this.setDownloadAttribute.bind(this);
+ this.preventIllegalChars = this.preventIllegalChars.bind(this);
this.pdfAdapters = pdfAdapters;
@@ -28,6 +32,15 @@ class PdfContainer {
window.addPdfs = this.addPdfs;
window.exportPdf = this.exportPdf;
window.rotateAll = this.rotateAll;
+
+ const filenameInput = document.getElementById('filename-input');
+ const downloadBtn = document.getElementById('export-button');
+
+ filenameInput.onkeyup = this.updateFilename;
+ filenameInput.onkeydown = this.preventIllegalChars;
+ filenameInput.disabled = true;
+ filenameInput.innerText = "";
+ downloadBtn.disabled = true;
}
movePageTo(startElement, endElement, scrollTo = false) {
@@ -60,6 +73,29 @@ class PdfContainer {
input.setAttribute("accept", "application/pdf");
input.onchange = async(e) => {
const files = e.target.files;
+ if (files.length > 0) {
+ const filenameInput = document.getElementById('filename-input');
+ const pagesContainer = document.getElementById('pages-container');
+ const downloadBtn = document.getElementById('export-button');
+
+ filenameInput.disabled = false;
+
+ if (pagesContainer.childElementCount === 0) {
+ filenameInput.value = "";
+ this.filename = null;
+ downloadBtn.disabled = true;
+ } else {
+ this.filename = filenameInput.value;
+ }
+
+ if (this.filename === null || this.filename === undefined) {
+ filenameInput.value = files[0].name;
+ } else {
+ filenameInput.value = this.filename;
+ }
+
+ }
+
this.addPdfsFromFiles(files, nextSiblingElement);
}
@@ -192,6 +228,27 @@ class PdfContainer {
const url = URL.createObjectURL(pdfBlob);
const downloadOption = localStorage.getItem('downloadOption');
+ const filenameInput = document.getElementById('filename-input');
+
+ let inputArr = filenameInput.value.split('.');
+
+ if (inputArr !== null && inputArr !== undefined && inputArr.length > 0) {
+
+ inputArr = inputArr.filter(n => n); // remove all empty strings, nulls or undefined
+
+ if (inputArr.length > 1) {
+ inputArr.pop(); // remove right part after last dot
+ }
+
+ filenameInput.value = inputArr.join('');
+ this.filename = filenameInput.value;
+ }
+
+ if (!filenameInput.value.includes('.pdf')) {
+ filenameInput.value = filenameInput.value + '.pdf';
+ this.filename = filenameInput.value;
+ }
+
if (downloadOption === 'sameWindow') {
// Open the file in the same window
window.location.href = url;
@@ -200,12 +257,45 @@ class PdfContainer {
window.open(url, '_blank');
} else {
// Download the file
- const downloadLink = document.createElement('a');
- downloadLink.href = url;
- downloadLink.download = this.fileName ? this.fileName : 'managed.pdf';
- downloadLink.click();
+ this.downloadLink = document.createElement('a');
+ this.downloadLink.id = 'download-link';
+ this.downloadLink.href = url;
+ // downloadLink.download = this.fileName ? this.fileName : 'managed.pdf';
+ // downloadLink.download = this.fileName;
+ this.downloadLink.setAttribute('download', this.filename ? this.fileName : 'managed.pdf');
+ this.downloadLink.setAttribute('target', '_blank');
+ this.downloadLink.onclick = this.setDownloadAttribute;
+ this.downloadLink.click();
}
}
+
+ setDownloadAttribute() {
+ this.downloadLink.setAttribute("download", this.filename ? this.filename : 'managed.pdf');
+ }
+
+ updateFilename() {
+ const filenameInput = document.getElementById('filename-input');
+ const downloadBtn = document.getElementById('export-button');
+
+ if (filenameInput.value === "") {
+ downloadBtn.disabled = true;
+ return;
+ }
+
+ downloadBtn.disabled = false;
+ this.filename = filenameInput.value;
+ }
+
+ preventIllegalChars(e) {
+ // const filenameInput = document.getElementById('filename-input');
+ //
+ // filenameInput.value = filenameInput.value.replace('.pdf', '');
+ //
+ // // prevent .
+ // if (filenameInput.value.includes('.')) {
+ // filenameInput.value.replace('.','');
+ // }
+ }
}
export default PdfContainer;
diff --git a/src/main/resources/templates/multi-tool.html b/src/main/resources/templates/multi-tool.html
index 0b1d7b8a..167d6849 100644
--- a/src/main/resources/templates/multi-tool.html
+++ b/src/main/resources/templates/multi-tool.html
@@ -20,15 +20,22 @@