diff --git a/src/vpu-pdf-preview.js b/src/vpu-pdf-preview.js index 2d07e9051767bd34a41ebf7658e95c94f09f6793..f8176fe878f2624ebffc5844264da27741346b87 100644 --- a/src/vpu-pdf-preview.js +++ b/src/vpu-pdf-preview.js @@ -89,6 +89,11 @@ export class PdfPreview extends ScopedElementsMixin(VPULitElement) { await that.showPage(that.currentPage); }; + // Safari can't use that yet + // new ResizeObserver(async () => { + // await that.showPage(that.currentPage); + // }).observe(this._('#pdf-main-container')); + // add fabric.js canvas for signature positioning this.fabricCanvas = new fabric.Canvas(this._('#fabric-canvas')); // add signature image @@ -144,6 +149,11 @@ export class PdfPreview extends ScopedElementsMixin(VPULitElement) { * @param page_no */ async showPage(page_no) { + // we need to wait unil the last rendering is finished + if (this.isPageRenderingInProgress) { + return; + } + const that = this; this.isPageRenderingInProgress = true; this.currentPage = page_no; @@ -154,9 +164,9 @@ export class PdfPreview extends ScopedElementsMixin(VPULitElement) { // original width of the pdf page at scale 1 const pdf_original_width = page.getViewport({ scale: 1 }).width; - // set the canvas width to the width of the container - this.fabricCanvas.setWidth(this._('#pdf-main-container').clientWidth); - this.canvas.width = this._('#pdf-main-container').clientWidth; + // set the canvas width to the width of the container (minus the borders) + this.fabricCanvas.setWidth(this._('#pdf-main-container').clientWidth - 2); + this.canvas.width = this._('#pdf-main-container').clientWidth - 2; // as the canvas is of a fixed width we need to adjust the scale of the viewport where page is rendered // const scale_required = this.fabricCanvas.width / pdf_original_width; @@ -187,10 +197,12 @@ export class PdfPreview extends ScopedElementsMixin(VPULitElement) { }); } catch(error) { console.error(error.message); + that.isPageRenderingInProgress = false; } }); } catch(error) { console.error(error.message); + that.isPageRenderingInProgress = false; } } diff --git a/src/vpu-qualified-signature-pdf-upload.js b/src/vpu-qualified-signature-pdf-upload.js index c049f10cecefadbd56d7feca67ccdb4add0b6324..bff5d6ecb3000150862bac7fabb5f2355ab3fefc 100644 --- a/src/vpu-qualified-signature-pdf-upload.js +++ b/src/vpu-qualified-signature-pdf-upload.js @@ -430,18 +430,7 @@ class QualifiedSignaturePdfUpload extends ScopedElementsMixin(VPUSignatureLitEle ${commonStyles.getButtonCSS()} ${commonStyles.getNotificationCSS()} - .flex-container { - display: flex; - flex-flow: row wrap; - } - - .flex-container > div { - margin-right: 20px; - } - #pdf-preview { - flex: 1 0; - margin-right: 0; min-width: 320px; } @@ -498,9 +487,23 @@ class QualifiedSignaturePdfUpload extends ScopedElementsMixin(VPUSignatureLitEle color: #e4154b; } - .emtpy-queue { + .empty-queue { margin: 10px 0; } + + #grid-container { + display: flex; + flex-flow: row wrap; + } + + #grid-container > div { + margin-right: 20px; + } + + #grid-container > div:last-child { + margin-right: 0; + flex: 1 0; + } `; } @@ -577,77 +580,81 @@ class QualifiedSignaturePdfUpload extends ScopedElementsMixin(VPUSignatureLitEle ></vpu-fileupload> </div> </div> - <div class="flex-container"> - <div class="files-block field ${classMap({hidden: !this.queueBlockEnabled})}"> - <h2>${i18n.t('qualified-pdf-upload.queued-files-label')}</h2> - <div class="control"> - ${this.getQueuedFilesHtml()} + <div id="grid-container"> + <div class="left-container"> + <div class="files-block field ${classMap({hidden: !this.queueBlockEnabled})}"> + <h2>${i18n.t('qualified-pdf-upload.queued-files-label')}</h2> + <div class="control"> + ${this.getQueuedFilesHtml()} + </div> + <div class="empty-queue control ${classMap({hidden: this.queuedFilesCount !== 0})}"> + ${i18n.t('qualified-pdf-upload.queued-files-empty1')}<br /> + ${i18n.t('qualified-pdf-upload.queued-files-empty2')} + </div> + <div class="control"> + <button @click="${() => { this.signingProcessEnabled = true; }}" + ?disabled="${this.queuedFilesCount === 0}" + class="button is-primary ${classMap({hidden: this.signingProcessEnabled})}"> + ${i18n.t('qualified-pdf-upload.start-signing-process-button')} + </button> + <button @click="${() => { this.signingProcessEnabled = false; this.externalAuthInProgress = false; }}" + ?disabled="${this.queuedFilesCount === 0}" + class="button ${classMap({hidden: !this.signingProcessEnabled})}"> + ${i18n.t('qualified-pdf-upload.stop-signing-process-button')} + </button> + </div> </div> - <div class="emtpy-queue control ${classMap({hidden: this.queuedFilesCount !== 0})}"> - ${i18n.t('qualified-pdf-upload.queued-files-empty1')}<br /> - ${i18n.t('qualified-pdf-upload.queued-files-empty2')} + <div class="files-block field ${classMap({hidden: this.signedFilesCount === 0})}"> + <h2>${i18n.t('qualified-pdf-upload.signed-files-label')}</h2> + <div class="control"> + ${this.getSignedFilesHtml()} + </div> </div> - <div class="control"> - <button @click="${() => { this.signingProcessEnabled = true; }}" - ?disabled="${this.queuedFilesCount === 0}" - class="button is-primary ${classMap({hidden: this.signingProcessEnabled})}"> - ${i18n.t('qualified-pdf-upload.start-signing-process-button')} - </button> - <button @click="${() => { this.signingProcessEnabled = false; this.externalAuthInProgress = false; }}" - ?disabled="${this.queuedFilesCount === 0}" - class="button ${classMap({hidden: !this.signingProcessEnabled})}"> - ${i18n.t('qualified-pdf-upload.stop-signing-process-button')} - </button> + <div class="field ${classMap({hidden: this.signedFilesCount === 0})}"> + <div class="control"> + <vpu-button id="zip-download-button" value="${i18n.t('qualified-pdf-upload.download-zip-button')}" title="${i18n.t('qualified-pdf-upload.download-zip-button-tooltip')}" @click="${this.zipDownloadClickHandler}" type="is-primary"></vpu-button> + </div> </div> - </div> - <div id="pdf-preview" class="field ${classMap({hidden: !this.signaturePlacementInProgress})}"> - <h2>${i18n.t('qualified-pdf-upload.signature-placement-label')}</h2> - <div class="file"> - <a class="is-remove" title="${i18n.t('qualified-pdf-upload.close-preview')}" - @click="${() => { this.signaturePlacementInProgress = false; }}"> - ${this.currentFile.name} (${humanFileSize(this.currentFile !== undefined ? this.currentFile.size : 0)}) - <vpu-icon name="close" style="font-size: 0.7em"></vpu-icon> - </a> + <div class="files-block error-files field ${classMap({hidden: this.errorFilesCount === 0})}"> + <h2 class="error">${i18n.t('qualified-pdf-upload.error-files-label')}</h2> + <div class="control"> + ${this.getErrorFilesHtml()} + </div> </div> - <vpu-pdf-preview lang="${this.lang}" @vpu-pdf-preview-accept="${this.storePDFData}"></vpu-pdf-preview> - </div> - <div class="field notification is-info ${classMap({hidden: !this.uploadInProgress})}"> - <vpu-mini-spinner></vpu-mini-spinner> - <strong>${this.uploadStatusFileName}</strong> - ${this.uploadStatusText} - </div> - <div class="files-block field ${classMap({hidden: !this.externalAuthInProgress})}"> - <h2>${i18n.t('qualified-pdf-upload.current-signing-process-label')}</h2> - <div class="file"> - <a class="is-remove" title="${i18n.t('qualified-pdf-upload.remove-current-file-button-title')}" - @click="${() => { this.externalAuthInProgress = false; }}"> - ${this.currentFileName} (${humanFileSize(this.currentFile.file !== undefined ? this.currentFile.file.size : 0)}) - <vpu-icon name="close" style="font-size: 0.7em"></vpu-icon> - </a> + <div class="field ${classMap({hidden: this.errorFilesCount === 0})}"> + <div class="control"> + <vpu-button id="re-upload-all-button" ?disabled="${this.uploadInProgress}" value="${i18n.t('qualified-pdf-upload.re-upload-all-button')}" title="${i18n.t('qualified-pdf-upload.re-upload-all-button-title')}" @click="${this.reUploadAllClickHandler}" type="is-primary"></vpu-button> + </div> </div> - <iframe name="external_iframe" id="iframe"></iframe> - </div> - </div> - <div class="files-block field ${classMap({hidden: this.signedFilesCount === 0})}"> - <h2>${i18n.t('qualified-pdf-upload.signed-files-label')}</h2> - <div class="control"> - ${this.getSignedFilesHtml()} - </div> - </div> - <div class="field ${classMap({hidden: this.signedFilesCount === 0})}"> - <div class="control"> - <vpu-button id="zip-download-button" value="${i18n.t('qualified-pdf-upload.download-zip-button')}" title="${i18n.t('qualified-pdf-upload.download-zip-button-tooltip')}" @click="${this.zipDownloadClickHandler}" type="is-primary"></vpu-button> </div> - </div> - <div class="files-block error-files field ${classMap({hidden: this.errorFilesCount === 0})}"> - <h2 class="error">${i18n.t('qualified-pdf-upload.error-files-label')}</h2> - <div class="control"> - ${this.getErrorFilesHtml()} - </div> - </div> - <div class="field ${classMap({hidden: this.errorFilesCount === 0})}"> - <div class="control"> - <vpu-button id="re-upload-all-button" ?disabled="${this.uploadInProgress}" value="${i18n.t('qualified-pdf-upload.re-upload-all-button')}" title="${i18n.t('qualified-pdf-upload.re-upload-all-button-title')}" @click="${this.reUploadAllClickHandler}" type="is-primary"></vpu-button> + <div class="right-container"> + <div id="pdf-preview" class="field ${classMap({hidden: !this.signaturePlacementInProgress})}"> + <h2>${i18n.t('qualified-pdf-upload.signature-placement-label')}</h2> + <div class="file"> + <a class="is-remove" title="${i18n.t('qualified-pdf-upload.close-preview')}" + @click="${() => { this.signaturePlacementInProgress = false; }}"> + ${this.currentFile.name} (${humanFileSize(this.currentFile !== undefined ? this.currentFile.size : 0)}) + <vpu-icon name="close" style="font-size: 0.7em"></vpu-icon> + </a> + </div> + <vpu-pdf-preview lang="${this.lang}" @vpu-pdf-preview-accept="${this.storePDFData}"></vpu-pdf-preview> + </div> + <div class="field notification is-info ${classMap({hidden: !this.uploadInProgress})}"> + <vpu-mini-spinner></vpu-mini-spinner> + <strong>${this.uploadStatusFileName}</strong> + ${this.uploadStatusText} + </div> + <div class="files-block field ${classMap({hidden: !this.externalAuthInProgress})}"> + <h2>${i18n.t('qualified-pdf-upload.current-signing-process-label')}</h2> + <div class="file"> + <a class="is-remove" title="${i18n.t('qualified-pdf-upload.remove-current-file-button-title')}" + @click="${() => { this.externalAuthInProgress = false; }}"> + ${this.currentFileName} (${humanFileSize(this.currentFile.file !== undefined ? this.currentFile.file.size : 0)}) + <vpu-icon name="close" style="font-size: 0.7em"></vpu-icon> + </a> + </div> + <iframe name="external_iframe" id="iframe"></iframe> + </div> </div> </div> </div>