Skip to content
Snippets Groups Projects
document.component.ts 13.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • Alex ORLUC's avatar
    Alex ORLUC committed
    import { Component, OnInit, ViewChild, ElementRef, Input, Inject } from '@angular/core';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    import { SignaturesContentService } from '../service/signatures.service';
    import { DomSanitizer } from '@angular/platform-browser';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    import { MatDialog, MatBottomSheet, MatBottomSheetConfig, MatSidenav } from '@angular/material';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    import { SignaturesComponent } from '../signatures/signatures.component';
    
    import { ActivatedRoute, Router } from '@angular/router';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    import { HttpClient } from '@angular/common/http';
    
    import { NotificationService } from '../service/notification.service';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    import { trigger, transition, style, animate } from '@angular/animations';
    
    import { PDFDocumentProxy } from 'ng2-pdf-viewer';
    
    import { CookieService } from 'ngx-cookie-service';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    import { DocumentNotePadComponent } from '../documentNotePad/document-note-pad.component';
    import { WarnModalComponent } from '../modal/warn-modal.component';
    import { RejectInfoBottomSheetComponent } from '../modal/reject-info.component';
    import { ConfirmModalComponent } from '../modal/confirm-modal.component';
    import { SuccessInfoValidBottomSheetComponent } from '../modal/success-info-valid.component';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
    @Component({
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        selector: 'app-document',
        templateUrl: 'document.component.html',
    
        styleUrls: ['document.component.scss'],
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        animations: [
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            trigger(
                'enterApp',
                [
                    transition(
                        ':leave', [
                            style({ transform: 'translateY(0)' }),
                            animate('500ms', style({ transform: 'translateY(-100%)' })),
                        ]
                    )]
            ),
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            trigger(
                'slideDown',
                [
                    transition(
                        ':enter', [
                            style({ transform: 'translateY(-100%)', opacity: 0 }),
                            animate('500ms', style({ transform: 'translateY(0)', 'opacity': 1 }))
                        ]
                    ),
                    transition(
                        ':leave', [
                            style({ transform: 'translateY(0)', 'opacity': 1 }),
                            animate('500ms', style({ transform: 'translateY(-100%)', 'opacity': 0 })),
                        ]
                    )]
            ),
            trigger(
                'slideUp',
                [
                    transition(
                        ':enter', [
                            style({ transform: 'translateY(100%)', opacity: 0 }),
                            animate('500ms', style({ transform: 'translateY(0)', 'opacity': 1 }))
                        ]
                    ),
                    transition(
                        ':leave', [
                            style({ transform: 'translateY(0)', 'opacity': 1 }),
                            animate('500ms', style({ transform: 'translateY(100%)', 'opacity': 0 })),
                        ]
                    )]
            )
        ],
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    })
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    export class DocumentComponent implements OnInit {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        enterApp = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        loadingPage = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        pageNum = 1;
        signaturesContent: any = [];
        totalPages: number;
        draggable: boolean;
        loadingDoc = true;
        currentDoc = 0;
        docList: any = [];
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        actionsList: any = [];
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        freezeSidenavClose = false;
    
        disableState = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        @Input() mainDocument: any = {};
    
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        @ViewChild('snav') snav: MatSidenav;
    
        @ViewChild('snavRight') snavRight: MatSidenav;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        @ViewChild('canvas') canvas: ElementRef;
        @ViewChild('canvasWrapper') canvasWrapper: ElementRef;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        @ViewChild('appDocumentNotePad') appDocumentNotePad: DocumentNotePadComponent;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        constructor(private router: Router, private route: ActivatedRoute, public http: HttpClient,
    
            public signaturesService: SignaturesContentService,
            public notificationService: NotificationService,
    
            private cookieService: CookieService,
    
    Florian Azizian's avatar
    Florian Azizian committed
            private sanitization: DomSanitizer, public dialog: MatDialog, private bottomSheet: MatBottomSheet) {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.draggable = false;
    
            (<any>window).pdfWorkerSrc = './../node_modules/pdfjs-dist/build/pdf.worker.js';
    
    
            if (!this.cookieService.check('maarchParapheurAuth')) {
                this.router.navigate(['/login']);
            }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        ngOnInit(): void {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            setTimeout(() => {
                this.enterApp = false;
            }, 500);
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.route.params.subscribe(params => {
                if (typeof params['id'] !== 'undefined') {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                    this.signaturesService.renderingDoc = true;
    
                    this.loadingDoc = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                    this.http.get('../rest/documents/' + params['id'])
                        .subscribe((data: any) => {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            this.initDoc();
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            this.mainDocument = data.document;
    
                            this.signaturesService.mainDocumentId = this.mainDocument.id;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            this.actionsList = data.document.actionsAllowed;
    
                            if (this.signaturesService.signaturesList.length === 0) {
    
    Florian Azizian's avatar
    Florian Azizian committed
                                this.http.get('../rest/users/' + this.signaturesService.userLogged.id + '/signatures')
    
                                .subscribe((dataSign: any) => {
                                    this.signaturesService.signaturesList = dataSign.signatures;
                                    this.signaturesService.loadingSign = false;
                                });
                            }
    
                            this.docList.push({ 'id': this.mainDocument.id, 'encodedDocument': this.mainDocument.encodedDocument, 'subject': this.mainDocument.subject });
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            this.mainDocument.attachments.forEach((attach: any, index: any) => {
    
                                this.docList.push({ 'id': attach.id, 'encodedDocument': '', 'title': '' });
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            });
    
                            this.loadingDoc = false;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            this.pdfRender(this.docList[this.currentDoc]);
    
                            setTimeout(() => {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                                this.loadingPage = false;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                                this.signaturesService.renderingDoc = false;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            this.loadNextDoc();
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                        }, (err: any) => {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                            this.notificationService.handleErrors(err);
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                        });
                } else {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                    this.snav.open();
                    this.freezeSidenavClose = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        initDoc() {
            this.docList = [];
            this.signaturesService.signaturesContent = [];
            this.signaturesService.notesContent = [];
            this.signaturesService.currentAction = 0;
            this.signaturesService.currentPage = 1;
            this.pageNum = 1;
            this.signaturesContent.currentDoc = 1;
            this.currentDoc = 0;
        }
    
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        pdfRender(document: any) {
    
            const binary_string = window.atob(document.encodedDocument);
            const len = binary_string.length;
            const bytes = new Uint8Array(len);
            for (let i = 0; i < len; i++) {
                bytes[i] = binary_string.charCodeAt(i);
            }
            this.pdfDataArr = bytes.buffer;
    
        pdfRendered(pdf: PDFDocumentProxy) {
            this.totalPages = pdf.numPages;
    
            this.signaturesService.totalPage = this.totalPages;
    
            this.disableState = false;
    
    
            this.signaturesService.workingAreaWidth = e.target.clientWidth;
            this.signaturesService.workingAreaHeight = e.target.clientHeight;
    
            this.canvasWrapper.nativeElement.style.width = this.signaturesService.workingAreaWidth + 'px';
            this.canvasWrapper.nativeElement.style.height = this.signaturesService.workingAreaHeight + 'px';
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            if (this.appDocumentNotePad) {
                this.appDocumentNotePad.resizePad();
            }
    
            this.signaturesService.signWidth = this.signaturesService.workingAreaWidth / 4.5;
    
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.signaturesService.renderingDoc = false;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        prevPage() {
    
            this.disableState = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.pageNum--;
            if (this.pageNum === 0) {
                this.pageNum = 1;
            } else {
            }
    
            if (this.currentDoc === 0) {
                this.signaturesService.currentPage = this.pageNum;
            }
    
    
            // fix issue render pdf load is quick click
            setTimeout(() => {
                this.disableState = false;
            }, 500);
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        nextPage() {
    
            this.disableState = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            if (this.pageNum >= this.totalPages) {
                this.pageNum = this.totalPages;
            } else {
                this.pageNum++;
            }
    
            // only for main document
            if (this.currentDoc === 0) {
                this.signaturesService.currentPage = this.pageNum;
            }
    
    
            // fix issue render pdf load is quick click
            setTimeout(() => {
                this.disableState = false;
            }, 500);
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        nextDoc() {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.signaturesService.renderingDoc = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.signaturesService.isTaggable = false;
            this.pageNum = 1;
            this.currentDoc++;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.pdfRender(this.docList[this.currentDoc]);
            this.loadNextDoc();
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        prevDoc() {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.signaturesService.renderingDoc = true;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.pageNum = 1;
            this.currentDoc--;
            if (this.currentDoc === 0) {
                this.signaturesService.currentPage = 1;
                this.signaturesService.isTaggable = true;
            }
            this.pdfRender(this.docList[this.currentDoc]);
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
        addAnnotation() {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            if (!this.signaturesService.lockNote && this.currentDoc === 0) {
                this.signaturesService.annotationMode = true;
                this.signaturesService.lockNote = true;
            }
        }
    
        openDialog(): void {
            const dialogRef = this.dialog.open(WarnModalComponent, {
                width: '350px',
                data: {}
            });
    
            dialogRef.afterClosed().subscribe(result => {
                if (result === 'sucess') {
                    const config: MatBottomSheetConfig = {
                        disableClose: true,
                        direction: 'ltr'
                    };
                    this.bottomSheet.open(RejectInfoBottomSheetComponent, config);
                } else if (result === 'annotation') {
                    this.signaturesService.annotationMode = true;
                    this.signaturesService.lockNote = true;
                }
            });
        }
    
    
        confirmDialog(mode: any): void {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            const dialogRef = this.dialog.open(ConfirmModalComponent, {
                width: '350px',
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                data: { msg: 'Êtes-vous sûr  ?' }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            });
    
            dialogRef.afterClosed().subscribe(result => {
                if (result) {
                    const config: MatBottomSheetConfig = {
                        disableClose: true,
                        direction: 'ltr'
                    };
                    this.bottomSheet.open(SuccessInfoValidBottomSheetComponent, config);
                }
            });
        }
    
        openDrawer(): void {
    
            if (this.currentDoc > 0) {
                this.currentDoc = 0;
                this.pageNum = 1;
                this.pdfRender(this.docList[this.currentDoc]);
            }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.signaturesService.showSign = true;
    
            this.signaturesService.showPad = false;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            const config: MatBottomSheetConfig = {
                disableClose: false,
                direction: 'ltr'
            };
            this.bottomSheet.open(SignaturesComponent, config);
        }
    
        removeTags() {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            this.signaturesService.currentAction = 0;
    
    Alex ORLUC's avatar
    Alex ORLUC committed
            const dialogRef = this.dialog.open(ConfirmModalComponent, {
                width: '350px',
                data: { msg: 'Effacer toutes les annotations et signatures ?' }
            });
    
            dialogRef.afterClosed().subscribe(result => {
                if (result) {
                    this.signaturesService.signaturesContent = [];
                    this.signaturesService.notesContent = [];
    
                    this.notificationService.success('Annotations / signatures supprimées du document');
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        loadNextDoc () {
    
            if (this.docList[this.currentDoc + 1] && this.docList[this.currentDoc + 1].id && this.docList[this.currentDoc + 1].encodedDocument === '') {
    
    Alex ORLUC's avatar
    Alex ORLUC committed
                this.http.get('../rest/attachments/' + this.docList[this.currentDoc + 1].id)
                    .subscribe((dataPj: any) => {
                        this.docList[this.currentDoc + 1] = dataPj.attachment;
    
                    }, (err: any) => {
                        this.notificationService.handleErrors(err);
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        launchEvent(action: any) {
            this.signaturesService.currentAction = action.id;
            this[action.event]();
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        undoTag() {
            if (this.signaturesService.notesContent[this.pageNum]) {
                this.signaturesService.notesContent[this.pageNum].pop();
            }
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    
        checkEmptyNote() {
            if (!this.signaturesService.notesContent[this.pageNum]) {
                return true;
            } else if (this.signaturesService.notesContent[this.pageNum] === 'undefined') {
                return true;
            } else if (this.signaturesService.notesContent[this.pageNum].length === 0) {
                return true;
            } else {
                return false;
            }
        }
    
        checkEmptiness() {
            let state = true;
            for (let pageNum = 1; pageNum <= this.signaturesService.totalPage; pageNum++) {
                if (this.signaturesService.notesContent[pageNum]) {
                    if (this.signaturesService.notesContent[pageNum].length > 0) {
                        state = false;
                        break;
                    }
                }
                if (this.signaturesService.signaturesContent[pageNum]) {
                    if (this.signaturesService.signaturesContent[pageNum].length > 0) {
                        state = false;
                        break;
                    }
                }
            }
            return state;
        }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    }