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.

353 lines (348 loc) 31 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 * lit-html: BSD-3-Clause * @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,L as t,M as n,Q as r,Y as i,_ as a,b as o,d as s,j as c,k as l,o as u,q as d,s as f,t as p,v as m,w as h,x as g,y as _,z as v}from"./shared/dbp-lit-element.BQ5UQue-.js";import"./shared/directive-helpers.BcbjX-8e.js";import"./shared/i18n.CFAuR9R5.js";import{a as y,c as b,i as x,l as S,n as C,o as w,r as T,s as E,t as D}from"./shared/table-components.D8cP2E_k.js";import"./shared/dbp-file-handling-lit-element.FiLZbGlJ.js";import{t as O}from"./shared/file-source.BuwpzU-D.js";import{t as k}from"./shared/file-sink.CqCc3sCg.js";t(`dbp-official-signature-pdf-upload`,class extends e(E){constructor(){super(),this.entryPointUrl=``,this.nextcloudWebAppPasswordURL=``,this.nextcloudWebDavURL=``,this.nextcloudName=``,this.nextcloudFileURL=``,this.nextcloudAuthInfo=``,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":n,"dbp-file-source":O,"dbp-file-sink":k,"dbp-pdf-preview":w,"dbp-mini-spinner":c,"dbp-button":a,"dbp-icon-button":m,"dbp-loading-button":_,"dbp-pdf-annotation-view":T,"dbp-esign-tabulator-table":D,"dbp-tooltip":y,"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))&&(p({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 i=this.takeFileFromQueue(n).file;this.currentFile=i,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=b(e))}a.invisible=`false`,a.profile=`official`,this.uploadStatusText=e.t(`official-pdf-upload.upload-status-file-text`,{fileName:i.name,fileSize:r(i.size,!1)});let o=this.isAnnotationsEnabledForKey(n),s=this.takeAnnotationsFromQueue(n);await this.uploadFile(i,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`&&(e.json.name=S(e.fileName),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=u(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 i` ${l()} ${g(!1)} ${o()} ${h()} ${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=v(x,`official-signature-placeholder.png`),t=this._i18n;return d` <div class="${s({hidden:!this.isLoggedIn()||!this.hasSignaturePermissions()||this.isLoading()})}"> <div class="field"> <div class="control"> <p class="description">${t.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"> ${t.t(`official-pdf-upload.upload-button-label`)} </button> <dbp-file-source id="file-source" context="${t.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="${t.t(`official-pdf-upload.upload-area-text`)}" button-label="${t.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 ${s({hidden:!this.queueBlockEnabled})}"> <!-- Queued files headline and queueing spinner --> <h3 class="section-title"> ${t.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="${s({hidden:this.queuedFilesTableExpanded})}" ?disabled="${this.queuedFilesCount===0||this.queuedFilesTableCollapsible===!1}" value="${t.t(`qualified-pdf-upload.expand-all`)}" @click="${()=>{this.tableQueuedFilesTable.expandAll(),this.queuedFilesTableExpanded=!0}}" title="${t.t(`qualified-pdf-upload.expand-all`)}"> ${t.t(`qualified-pdf-upload.expand-all`)} </dbp-loading-button> <dbp-loading-button id="collapse-all-btn-queued-files" class="${s({hidden:!this.queuedFilesTableExpanded})}" ?disabled="${this.queuedFilesCount===0||this.queuedFilesTableCollapsible===!1}" value="${t.t(`qualified-pdf-upload.collapse-all`)}" @click="${()=>{this.tableQueuedFilesTable.collapseAll(),this.queuedFilesTableExpanded=!1}}" title="${t.t(`qualified-pdf-upload.collapse-all`)}"> ${t.t(`qualified-pdf-upload.collapse-all`)} </dbp-loading-button> <dbp-loading-button id="select-all-btn-queued-files" class="${s({hidden:this.queuedFilesTableAllSelected})}" ?disabled="${this.queuedFilesCount===0}" value="${t.t(`qualified-pdf-upload.select-all`)}" @click="${()=>{this.queuedFilesTableAllSelected=!0,this.tableQueuedFilesTable.selectAllRows()}}" title="${t.t(`qualified-pdf-upload.select-all`)}"> ${t.t(`qualified-pdf-upload.select-all`)} </dbp-loading-button> <dbp-loading-button id="deselect-all-btn-queued-files" class="${s({hidden:!this.queuedFilesTableAllSelected})}" ?disabled="${this.queuedFilesCount===0}" value="${t.t(`qualified-pdf-upload.deselect-all`)}" @click="${()=>{this.queuedFilesTableAllSelected=!1,this.tableQueuedFilesTable.deselectAllRows()}}" title="${t.t(`qualified-pdf-upload.deselect-all`)}"> ${t.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"> ${t.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 ${s({hidden:this.signingProcessActive})}"> ${t.t(`official-pdf-upload.start-signing-process-button`)} </button> <!-- --> <button @click="${this.stopSigningProcess}" id="cancel-signing-process" class="button is-right ${s({hidden:!this.signingProcessActive})}"> ${t.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?d` <div class="legend"> <dbp-icon name="warning-high" aria-hidden="true"></dbp-icon> <span class="legend-description"> ${t.t(`label-manual-positioning-missing`)} </span> </div> `:``} <!-- Text "queue empty" --> <div class="empty-queue control ${s({hidden:this.queuedFilesCount!==0})}"> ${t.t(`official-pdf-upload.queued-files-empty1`)} <br /> ${t.t(`official-pdf-upload.queued-files-empty2`)} </div> </div> <!-- List of signed PDFs --> <div class="files-block signed-files field ${s({hidden:this.signedFilesCount===0})}"> <h3 class="section-title"> ${t.t(`official-pdf-upload.signed-files-label`)} </h3> <!-- Button to download all signed PDFs --> <div class="field ${s({hidden:this.signedFilesCount===0})}"> <div class="control tabulator-actions"> <div class="table-actions"> <dbp-loading-button id="expand-all-btn-signed-files" class="${s({hidden:this.signedFilesTableExpanded})}" ?disabled="${this.signedFilesCount===0||this.signedFilesTableCollapsible===!1}" value="${t.t(`qualified-pdf-upload.expand-all`)}" @click="${()=>{this.tableSignedFilesTable.expandAll(),this.signedFilesTableExpanded=!0}}" title="${t.t(`qualified-pdf-upload.expand-all`)}"> ${t.t(`qualified-pdf-upload.expand-all`)} </dbp-loading-button> <dbp-loading-button id="collapse-all-btn-signed-files" class="${s({hidden:!this.signedFilesTableExpanded})}" ?disabled="${this.signedFilesCount===0||this.signedFilesTableCollapsible===!1}" value="${t.t(`qualified-pdf-upload.collapse-all`)}" @click="${()=>{this.tableSignedFilesTable.collapseAll(),this.signedFilesTableExpanded=!1}}" title="${t.t(`qualified-pdf-upload.collapse-all`)}"> ${t.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"> ${t.t(`official-pdf-upload.clear-all`)} </button> <dbp-loading-button id="zip-download-button" value="${t.t(`official-pdf-upload.download-zip-button`)}" title="${t.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 ${s({hidden:this.errorFilesCount===0})}"> <h3 class="section-title"> ${t.t(`official-pdf-upload.error-files-label`)} </h3> <!-- Button to upload errored files again --> <div class="field ${s({hidden:this.errorFilesCount===0})}"> <div class="control tabulator-actions"> <div class="table-actions"> <dbp-loading-button id="expand-all-btn-failed-files" class="${s({hidden:this.failedFilesTableExpanded})}" ?disabled="${this.errorFilesCount===0||this.failedFilesTableCollapsible===!1}" value="${t.t(`qualified-pdf-upload.expand-all`)}" @click="${()=>{this.tableFailedFilesTable.expandAll(),this.failedFilesTableExpanded=!0}}" title="${t.t(`qualified-pdf-upload.expand-all`)}"> ${t.t(`qualified-pdf-upload.expand-all`)} </dbp-loading-button> <dbp-loading-button id="collapse-all-btn-failed-files" class="${s({hidden:!this.failedFilesTableExpanded})}" ?disabled="${this.errorFilesCount===0||this.failedFilesTableCollapsible===!1}" value="${t.t(`qualified-pdf-upload.collapse-all`)}" @click="${()=>{this.tableFailedFilesTable.collapseAll(),this.failedFilesTableExpanded=!1}}" title="${t.t(`qualified-pdf-upload.collapse-all`)}"> ${t.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"> ${t.t(`official-pdf-upload.clear-all`)} </button> <dbp-loading-button id="re-upload-all-button" ?disabled="${this.uploadInProgress}" value="${t.t(`official-pdf-upload.re-upload-all-button`)}" title="${t.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?t.t(`official-pdf-upload.signature-placement-label`):t.t(`official-pdf-upload.preview-label`)}"> <div slot="header" class="header"> <div class="filename"> <strong>${this.currentFile.name}</strong> (${r(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 ${s({hidden:!this.isAnnotationViewVisible})}" title="${t.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> (${r(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 ${s({hidden:!this.uploadInProgress})}"> <dbp-mini-spinner></dbp-mini-spinner> <strong>${this.uploadStatusFileName}</strong> ${this.uploadStatusText} </div> </div> </div> </div> <div class="notification is-warning ${s({hidden:this.isLoggedIn()||this.isLoading()})}"> ${t.t(`error-login-message`)} <a href="#" @click="${this._onLoginClicked}">${t.t(`error-login-link`)}</a> </div> <div class="notification is-danger ${s({hidden:this.hasSignaturePermissions()||!this.isLoggedIn()||this.isLoading()})}"> ${t.t(`error-permission-message-official`)} </div> <div class="${s({hidden:!this.isLoading()})}"> <dbp-mini-spinner></dbp-mini-spinner> </div> <dbp-file-sink id="file-sink" context="${t.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