UNPKG

@digital-blueprint/esign-app

Version:

[GitHub Repository](https://github.com/digital-blueprint/esign-app) | [npmjs package](https://www.npmjs.com/package/@digital-blueprint/esign-app) | [Unpkg CDN](https://unpkg.com/browse/@digital-blueprint/esign-app/) | [Esign Bundle](https://gitlab.tugraz.

354 lines (349 loc) 31.8 kB
/*! * License: LGPL-2.1-or-later * Dependencies: * * @webcomponents/scoped-custom-element-registry: BSD-3-Clause * @dbp-toolkit/app-shell: LGPL-2.1-or-later * @dbp-toolkit/language-select: LGPL-2.1-or-later * @dbp-toolkit/auth: LGPL-2.1-or-later * @dbp-toolkit/notification: LGPL-2.1-or-later * @dbp-toolkit/theme-switcher: LGPL-2.1-or-later * universal-router: MIT * @dbp-toolkit/matomo: LGPL-2.1-or-later * @tugraz/web-components: LGPL-2.1-or-later */ import{A as e,J as t,L as n,M as r,Q as i,Y as a,_ as o,b as s,d as c,j as l,k as u,o as d,s as f,v as p,w as m,x as h,y as g,z as _}from"./shared/dbp-lit-element.D0c52m5A.js";import{t as v}from"./shared/notification.DW4NLT-r.js";import{t as y}from"./shared/activity.CTWe4Y15.js";import{a as b,c as x,i as S,n as C,o as w,r as T,s as E,t as D}from"./shared/table-components.CZeVF8dx.js";import"./shared/dbp-file-handling-lit-element.JMERQ6PV.js";import{t as O}from"./shared/file-source.i4fnNUd0.js";import{t as k}from"./shared/file-sink.B_LBilwm.js";var A={element:`dbp-official-signature-pdf-upload`,module_src:`dbp-official-signature-pdf-upload.js`,routing_name:`official-pdf-upload`,name:{de:`Dokumente amtssignieren`,en:`Officially sign documents`},short_name:{de:`Dokumente amtssignieren`,en:`Officially sign documents`},description:{de:`Ermöglicht das Hochladen von PDF-Dokumenten, um sie mit einer Amtssignatur zu versehen`,en:`Enables you to upload PDF documents and to sign them officially`},subscribe:`lang,entry-point-url,nextcloud-web-app-password-url,nextcloud-webdav-url,nextcloud-name,nextcloud-auth-info,nextcloud-file-url,auth,allow-annotating,file-handling-enabled-targets`,required_roles:[`ROLE_SCOPE_OFFICIAL-SIGNATURE`]};n(`dbp-official-signature-pdf-upload`,class extends e(E){constructor(){super(),this.entryPointUrl=``,this.nextcloudWebAppPasswordURL=``,this.nextcloudWebDavURL=``,this.nextcloudName=``,this.nextcloudFileURL=``,this.nextcloudAuthInfo=``,this.activity=new y(A),this.fileHandlingEnabledTargets=`local`,this._setQueuedFilesTabulatorTable=this.setQueuedFilesTabulatorTable.bind(this),this._tabulatorTableHandleCollapse=this.tabulatorTableHandleCollapse.bind(this),this._handleTableSelection=this.handleTableSelection.bind(this),this._handleModalClosed=this.handleModalClosed.bind(this),this._handlePdfModalClosing=this.handlePdfModalClosing.bind(this),this._handleAnnotationModalClosing=this.handleAnnotationModalClosing.bind(this)}static get scopedElements(){return{"dbp-icon":r,"dbp-file-source":O,"dbp-file-sink":k,"dbp-pdf-preview":w,"dbp-mini-spinner":l,"dbp-button":o,"dbp-icon-button":p,"dbp-loading-button":g,"dbp-pdf-annotation-view":T,"dbp-esign-tabulator-table":D,"dbp-tooltip":b,"dbp-modal":f}}static get properties(){return{...super.properties}}connectedCallback(){super.connectedCallback(),setInterval(()=>{this.handleQueuedFiles()},1e3),window.addEventListener(`dbp-pdf-preview-accept`,this._setQueuedFilesTabulatorTable),window.addEventListener(`dbp-pdf-annotations-save`,this._setQueuedFilesTabulatorTable),window.addEventListener(`dbp-pdf-annotations-cancel`,this._setQueuedFilesTabulatorTable),window.addEventListener(`dbp-tabulator-table-collapsible-event`,this._tabulatorTableHandleCollapse),window.addEventListener(`dbp-tabulator-table-row-selection-changed-event`,this._handleTableSelection),window.addEventListener(`dbp-modal-closed`,this._handleModalClosed),window.addEventListener(`dbp-pdf-preview-accept`,this._handlePdfModalClosing),window.addEventListener(`dbp-pdf-preview-cancel`,this._handlePdfModalClosing),window.addEventListener(`dbp-pdf-annotations-cancel`,this._handleAnnotationModalClosing),window.addEventListener(`dbp-pdf-annotations-save`,this._handleAnnotationModalClosing)}disconnectedCallback(){window.removeEventListener(`dbp-pdf-preview-accept`,this._setQueuedFilesTabulatorTable),window.removeEventListener(`dbp-pdf-annotations-save`,this._setQueuedFilesTabulatorTable),window.removeEventListener(`dbp-pdf-annotations-cancel`,this._setQueuedFilesTabulatorTable),window.removeEventListener(`dbp-tabulator-table-collapsible-event`,this._tabulatorTableHandleCollapse),window.removeEventListener(`dbp-tabulator-table-row-selection-changed-event`,this._handleTableSelection),window.removeEventListener(`dbp-modal-closed`,this._handleModalClosed),window.removeEventListener(`dbp-pdf-preview-accept`,this._handlePdfModalClosing),window.removeEventListener(`dbp-pdf-preview-cancel`,this._handlePdfModalClosing),window.removeEventListener(`dbp-pdf-annotations-cancel`,this._handleAnnotationModalClosing),window.removeEventListener(`dbp-pdf-annotations-save`,this._handleAnnotationModalClosing),super.disconnectedCallback()}firstUpdated(e){super.firstUpdated(e),this.tableQueuedFilesTable=this._(`#table-queued-files`),this.tableSignedFilesTable=this._(`#table-signed-files`),this.tableFailedFilesTable=this._(`#table-failed-files`)}async queueFile(e){let t=await super.queueFile(e);return await this._updateNeedsPlacementStatus(t),this.setQueuedFilesTabulatorTable(),this.requestUpdate(),t}async handleQueuedFiles(){let e=this._i18n;if(this.endSigningProcessIfQueueEmpty(),this.queuedFilesCount===0){this.signingProcessEnabled=!1;return}if(!this.signingProcessEnabled||this.uploadInProgress||this.addAnnotationInProgress)return;this.signaturePlacementInProgress=!1;let t=!1;for(let n of Object.keys(this.queuedFiles)){if(t===!0)continue;let r=this.queuedFilesPlacementModes[n]===`manual`;this.queuedFilesNeedsPlacement.get(n)&&!r&&(this.selectedFiles.length===0||this.fileIsSelectedFile(n))&&(v({summary:e.t(`error-manual-positioning-missing-title`),body:e.t(`error-manual-positioning-missing`),type:`danger`,timeout:5}),t=!0)}if(t){this.signingProcessEnabled=!1,this.signingProcessActive=!1,await this.stopSigningProcess();return}let n=null;if(this.selectedFiles.length>0){let e=this.selectedFiles.shift();n=Object.keys(this.queuedFiles).find(t=>this.queuedFiles[t].file.name.trim()===e.filename.trim()),this.selectedFilesProcessing=!0}else n=Object.keys(this.queuedFiles)[0];let r=this.takeFileFromQueue(n).file;this.currentFile=r,this.currentFilePlacementMode=this.queuedFilesPlacementModes[n],this.currentFileSignaturePlacement=this.queuedFilesSignaturePlacements[n],this.uploadInProgress=!0;let a={};if(this.queuedFilesPlacementModes[n]===`manual`){let e=this.queuedFilesSignaturePlacements[n];e!==void 0&&(a=x(e))}a.profile=`official`,this.uploadStatusText=e.t(`official-pdf-upload.upload-status-file-text`,{fileName:r.name,fileSize:i(r.size,!1)});let o=this.isAnnotationsEnabledForKey(n),s=this.takeAnnotationsFromQueue(n);await this.uploadFile(r,a,o?s:[]),this.uploadInProgress=!1,this.selectedFilesProcessing&&this.selectedFiles.length===0&&(this.signingProcessEnabled=!1,this.signingProcessActive=!1,await this.stopSigningProcess())}onReceiveBeforeUnload(e){let t=this._i18n;this.signedFilesCount!==0&&(!e.isTrusted&&confirm(t.t(`official-pdf-upload.confirm-page-leave`))||(e.preventDefault(),e.returnValue=``))}addToErrorFiles(e){this.endSigningProcessIfQueueEmpty(),this.errorFiles[Math.floor(Math.random()*1e6)]=e,this.errorFilesCount++,this.errorFilesCountToReport++,this.sendSetPropertyEvent(`analytics-event`,{category:`officiallySigning`,action:`SigningFailed`,name:e.json[`hydra:description`]})}onFileUploadFinished(e){e.status===201?e.json[`@type`]===`http://schema.org/MediaObject`&&(this.signedFiles.push(e.json),this.signedFilesCount++,this.signedFilesCountToReport++,this.currentFileName=e.json.name,this.endSigningProcessIfQueueEmpty(),this.sendSetPropertyEvent(`analytics-event`,{category:`OfficialSigning`,action:`DocumentSigned`,name:e.json.contentSize})):this.addToErrorFiles(e),this.sendReportNotification()}update(e){super.update(e),e.forEach((e,t)=>{switch(t){case`lang`:this.setQueuedFilesTabulatorTable();break;case`entryPointUrl`:this.entryPointUrl&&(this.fileSourceUrl=d(this.entryPointUrl,`/esign/advancedly-signed-documents`));break;case`queuedFilesCount`:this.setQueuedFilesTabulatorTable();break;case`signedFilesCount`:this.setSignedFilesTabulatorTable();break;case`errorFilesCount`:this.setFailedFilesTabulatorTable();break}})}clearQueuedFiles(){if(this.selectedFiles.length){let e=[];for(let t of this.selectedFiles)this.queuedFilesSignaturePlacements.forEach((e,n)=>{n==t.key&&delete this.queuedFilesSignaturePlacements[n]}),this.queuedFilesPlacementModes.forEach((e,n)=>{n==t.key&&delete this.queuedFilesPlacementModes[n]}),this.queuedFilesNeedsPlacement.delete(t.key),e.push(t.key);super.clearQueuedFiles(e)}}static get styles(){return a` ${u()} ${h(!1)} ${s()} ${m()} ${C()} `}hasSignaturePermissions(){return this._hasSignaturePermissions(`ROLE_SCOPE_OFFICIAL-SIGNATURE`)}async stopSigningProcess(){if(this.signingProcessEnabled=!1,this.signingProcessActive=!1,this.currentFile.file!==void 0){let e=await this.queueFile(this.currentFile.file);this.queuedFilesPlacementModes[e]=this.currentFilePlacementMode,this.queuedFilesSignaturePlacements[e]=this.currentFileSignaturePlacement}}_onLoginClicked(e){this.sendSetPropertyEvent(`requested-login-status`,`logged-in`),e.preventDefault()}render(){let e=_(S,`official-signature-placeholder.png`),n=this._i18n;return t` <div class="${c({hidden:!this.isLoggedIn()||!this.hasSignaturePermissions()||this.isLoading()})}"> <div class="field"> <h2>${this.activity.getName(this.lang)}</h2> <p class="subheadline">${this.activity.getDescription(this.lang)}</p> <div class="control"> <p>${n.t(`official-pdf-upload.upload-text`)}</p> <button @click="${()=>{this._(`#file-source`).setAttribute(`dialog-open`,``)}}" ?disabled="${this.signingProcessActive}" class="button is-primary" id="upload-pdf-button"> ${n.t(`official-pdf-upload.upload-button-label`)} </button> <dbp-file-source id="file-source" context="${n.t(`official-pdf-upload.file-picker-context`)}" subscribe="nextcloud-store-session:nextcloud-store-session" allowed-mime-types="application/pdf" enabled-targets="${this.fileHandlingEnabledTargets}" nextcloud-auth-url="${this.nextcloudWebAppPasswordURL}" nextcloud-web-dav-url="${this.nextcloudWebDavURL}" nextcloud-name="${this.nextcloudName}" nextcloud-auth-info="${this.nextcloudAuthInfo}" nextcloud-file-url="${this.nextcloudFileURL}" decompress-zip max-file-size="32000" lang="${this.lang}" ?disabled="${this.signingProcessActive}" text="${n.t(`official-pdf-upload.upload-area-text`)}" button-label="${n.t(`official-pdf-upload.upload-button-label`)}" @dbp-file-source-file-selected="${this.onFileSelected}" @dbp-file-source-switched="${this.onFileSourceSwitch}"></dbp-file-source> </div> </div> <div id="grid-container"> <div class="table-container"> <div class="files-block queued-files field ${c({hidden:!this.queueBlockEnabled})}"> <!-- Queued files headline and queueing spinner --> <h3 class="section-title"> ${n.t(`official-pdf-upload.queued-files-label`)} </h3> <div class="control field tabulator-actions"> <div class="table-actions"> <dbp-loading-button id="expand-all-btn-queued-files" class="${c({hidden:this.queuedFilesTableExpanded})}" ?disabled="${this.queuedFilesCount===0||this.queuedFilesTableCollapsible===!1}" value="${n.t(`qualified-pdf-upload.expand-all`)}" @click="${()=>{this.tableQueuedFilesTable.expandAll(),this.queuedFilesTableExpanded=!0}}" title="${n.t(`qualified-pdf-upload.expand-all`)}"> ${n.t(`qualified-pdf-upload.expand-all`)} </dbp-loading-button> <dbp-loading-button id="collapse-all-btn-queued-files" class="${c({hidden:!this.queuedFilesTableExpanded})}" ?disabled="${this.queuedFilesCount===0||this.queuedFilesTableCollapsible===!1}" value="${n.t(`qualified-pdf-upload.collapse-all`)}" @click="${()=>{this.tableQueuedFilesTable.collapseAll(),this.queuedFilesTableExpanded=!1}}" title="${n.t(`qualified-pdf-upload.collapse-all`)}"> ${n.t(`qualified-pdf-upload.collapse-all`)} </dbp-loading-button> <dbp-loading-button id="select-all-btn-queued-files" class="${c({hidden:this.queuedFilesTableAllSelected})}" ?disabled="${this.queuedFilesCount===0}" value="${n.t(`qualified-pdf-upload.select-all`)}" @click="${()=>{this.queuedFilesTableAllSelected=!0,this.tableQueuedFilesTable.selectAllRows()}}" title="${n.t(`qualified-pdf-upload.select-all`)}"> ${n.t(`qualified-pdf-upload.select-all`)} </dbp-loading-button> <dbp-loading-button id="deselect-all-btn-queued-files" class="${c({hidden:!this.queuedFilesTableAllSelected})}" ?disabled="${this.queuedFilesCount===0}" value="${n.t(`qualified-pdf-upload.deselect-all`)}" @click="${()=>{this.queuedFilesTableAllSelected=!1,this.tableQueuedFilesTable.deselectAllRows()}}" title="${n.t(`qualified-pdf-upload.deselect-all`)}"> ${n.t(`qualified-pdf-upload.deselect-all`)} </dbp-loading-button> </div> <div class="sign-actions"> <!-- Buttons to start/stop signing process and clear queue --> <button id="clear-queue-button-queued-files" @click="${this.clearQueuedFiles}" ?disabled="${this.queuedFilesCount===0||this.signingProcessActive||this.selectedFiles.length<1}" class="button"> ${n.t(`official-pdf-upload.clear-all`)} </button> <button id="start-signing-button" @click="${()=>{this.signingProcessEnabled=!0,this.signingProcessActive=!0,this.initialQueuedFilesCount=this.queuedFilesCount}}" ?disabled="${this.queuedFilesCount===0}" class="button is-primary ${c({hidden:this.signingProcessActive})}"> ${n.t(`official-pdf-upload.start-signing-process-button`)} </button> <!-- --> <button @click="${this.stopSigningProcess}" id="cancel-signing-process" class="button is-right ${c({hidden:!this.signingProcessActive})}"> ${n.t(`official-pdf-upload.stop-signing-process-button`)} </button> </div> </div> <!-- List of queued files --> <div class="control file-list"> <dbp-esign-tabulator-table id="table-queued-files" identifier="table-queued-files" class="table-queued-files" lang="${this.lang}" select-rows-enabled></dbp-esign-tabulator-table> </div> ${this.anyPlacementMissing?t` <div class="legend"> <dbp-icon name="warning-high" aria-hidden="true"></dbp-icon> <span class="legend-description"> ${n.t(`label-manual-positioning-missing`)} </span> </div> `:``} <!-- Text "queue empty" --> <div class="empty-queue control ${c({hidden:this.queuedFilesCount!==0})}"> ${n.t(`official-pdf-upload.queued-files-empty1`)} <br /> ${n.t(`official-pdf-upload.queued-files-empty2`)} </div> </div> <!-- List of signed PDFs --> <div class="files-block signed-files field ${c({hidden:this.signedFilesCount===0})}"> <h3 class="section-title"> ${n.t(`official-pdf-upload.signed-files-label`)} </h3> <!-- Button to download all signed PDFs --> <div class="field ${c({hidden:this.signedFilesCount===0})}"> <div class="control tabulator-actions"> <div class="table-actions"> <dbp-loading-button id="expand-all-btn-signed-files" class="${c({hidden:this.signedFilesTableExpanded})}" ?disabled="${this.signedFilesCount===0||this.signedFilesTableCollapsible===!1}" value="${n.t(`qualified-pdf-upload.expand-all`)}" @click="${()=>{this.tableSignedFilesTable.expandAll(),this.signedFilesTableExpanded=!0}}" title="${n.t(`qualified-pdf-upload.expand-all`)}"> ${n.t(`qualified-pdf-upload.expand-all`)} </dbp-loading-button> <dbp-loading-button id="collapse-all-btn-signed-files" class="${c({hidden:!this.signedFilesTableExpanded})}" ?disabled="${this.signedFilesCount===0||this.signedFilesTableCollapsible===!1}" value="${n.t(`qualified-pdf-upload.collapse-all`)}" @click="${()=>{this.tableSignedFilesTable.collapseAll(),this.signedFilesTableExpanded=!1}}" title="${n.t(`qualified-pdf-upload.collapse-all`)}"> ${n.t(`qualified-pdf-upload.collapse-all`)} </dbp-loading-button> </div> <div class="signed-actions"> <button id="clear-signed-files-btn" class="clear-signed-files button" @click="${this.clearSignedFiles}" class="button"> ${n.t(`official-pdf-upload.clear-all`)} </button> <dbp-loading-button id="zip-download-button" value="${n.t(`official-pdf-upload.download-zip-button`)}" title="${n.t(`official-pdf-upload.download-zip-button-tooltip`)}" class="zip-download-button" @click="${this.zipDownloadClickHandler}" type="is-primary"></dbp-loading-button> </div> </div> </div> <dbp-esign-tabulator-table id="table-signed-files" identifier="table-signed-files" class="table-signed-files" lang="${this.lang}"></dbp-esign-tabulator-table> </div> <!-- List of errored files --> <div class="files-block error-files field ${c({hidden:this.errorFilesCount===0})}"> <h3 class="section-title"> ${n.t(`official-pdf-upload.error-files-label`)} </h3> <!-- Button to upload errored files again --> <div class="field ${c({hidden:this.errorFilesCount===0})}"> <div class="control tabulator-actions"> <div class="table-actions"> <dbp-loading-button id="expand-all-btn-failed-files" class="${c({hidden:this.failedFilesTableExpanded})}" ?disabled="${this.errorFilesCount===0||this.failedFilesTableCollapsible===!1}" value="${n.t(`qualified-pdf-upload.expand-all`)}" @click="${()=>{this.tableFailedFilesTable.expandAll(),this.failedFilesTableExpanded=!0}}" title="${n.t(`qualified-pdf-upload.expand-all`)}"> ${n.t(`qualified-pdf-upload.expand-all`)} </dbp-loading-button> <dbp-loading-button id="collapse-all-btn-failed-files" class="${c({hidden:!this.failedFilesTableExpanded})}" ?disabled="${this.errorFilesCount===0||this.failedFilesTableCollapsible===!1}" value="${n.t(`qualified-pdf-upload.collapse-all`)}" @click="${()=>{this.tableFailedFilesTable.collapseAll(),this.failedFilesTableExpanded=!1}}" title="${n.t(`qualified-pdf-upload.collapse-all`)}"> ${n.t(`qualified-pdf-upload.collapse-all`)} </dbp-loading-button> </div> <div class="failed-actions"> <button id="clear-error-files-btn" @click="${this.clearErrorFiles}" class="clear-signed-files button"> ${n.t(`official-pdf-upload.clear-all`)} </button> <dbp-loading-button id="re-upload-all-button" ?disabled="${this.uploadInProgress}" value="${n.t(`official-pdf-upload.re-upload-all-button`)}" title="${n.t(`official-pdf-upload.re-upload-all-button-title`)}" class="is-right" @click="${this.reUploadAllClickHandler}" type="is-primary"></dbp-loading-button> </div> </div> </div> <dbp-esign-tabulator-table id="table-failed-files" identifier="table-failed-files" class="table-failed-files" lang="${this.lang}"></dbp-esign-tabulator-table> </div> </div> <div class="modal-container"> <!-- PDF preview --> <dbp-modal id="pdf-preview" modal-id="pdf-preview-modal" class="modal--pdf-preview" title="${this.withSigBlock?n.t(`official-pdf-upload.signature-placement-label`):n.t(`official-pdf-upload.preview-label`)}"> <div slot="header" class="header"> <div class="filename"> <strong>${this.currentFile.name}</strong> (${i(this.currentFile===void 0?0:this.currentFile.size)}) </div> </div> <div slot="content"> <dbp-pdf-preview lang="${this.lang}" allow-signature-rotation signature-placeholder-image-src="${e}" signature-width="162" signature-height="28" @dbp-pdf-preview-accept="${this.storePDFData}" @dbp-pdf-preview-cancel="${this.hidePDF}"></dbp-pdf-preview> </div> </dbp-modal> <!-- Annotation view --> <dbp-modal id="annotation-view" modal-id="annotation-view-modal" class="modal--annotation-view ${c({hidden:!this.isAnnotationViewVisible})}" title="${n.t(`official-pdf-upload.annotation-view-label`)}"> <div slot="header" class="header"> <div class="modal-notification"> <dbp-notification id="dbp-modal-notification-annotation" inline lang="${this.lang}"></dbp-notification> </div> <div class="filename"> <strong> ${this.currentFile.file===void 0?``:this.currentFile.file.name} </strong> (${i(this.currentFile.file===void 0?0:this.currentFile.file.size)}) </div> </div> <div slot="content"> <dbp-pdf-annotation-view lang="${this.lang}" @dbp-pdf-annotations-save="${this.processAnnotationEvent}" @dbp-pdf-annotations-cancel="${this.processAnnotationCancelEvent}"></dbp-pdf-annotation-view> </div> </dbp-modal> <!-- File upload progress --> <div id="upload-progress" class="field notification is-info ${c({hidden:!this.uploadInProgress})}"> <dbp-mini-spinner></dbp-mini-spinner> <strong>${this.uploadStatusFileName}</strong> ${this.uploadStatusText} </div> </div> </div> </div> <div class="notification is-warning ${c({hidden:this.isLoggedIn()||this.isLoading()})}"> ${n.t(`error-login-message`)} <a href="#" @click="${this._onLoginClicked}">${n.t(`error-login-link`)}</a> </div> <div class="notification is-danger ${c({hidden:this.hasSignaturePermissions()||!this.isLoggedIn()||this.isLoading()})}"> ${n.t(`error-permission-message-official`)} </div> <div class="${c({hidden:!this.isLoading()})}"> <dbp-mini-spinner></dbp-mini-spinner> </div> <dbp-file-sink id="file-sink" context="${n.t(`official-pdf-upload.save-field-label`,{count:this.signedFilesToDownload})}" filename="signed-documents.zip" subscribe="initial-file-handling-state:initial-file-handling-state,clipboard-files:clipboard-files,nextcloud-store-session:nextcloud-store-session" enabled-targets="${this.fileHandlingEnabledTargets}" nextcloud-auth-url="${this.nextcloudWebAppPasswordURL}" nextcloud-web-dav-url="${this.nextcloudWebDavURL}" nextcloud-name="${this.nextcloudName}" nextcloud-file-url="${this.nextcloudFileURL}" lang="${this.lang}"></dbp-file-sink> `}}); //# sourceMappingURL=dbp-official-signature-pdf-upload.js.map