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 @@
+
+
+ + +
+
- + - + +
- +