Newer
Older

Alex ORLUC
committed
import { Pipe, PipeTransform, Component, OnInit, NgZone, ViewChild, HostListener } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { DomSanitizer } from '@angular/platform-browser';
import { Router, ActivatedRoute } from '@angular/router';
import { LANG } from './translate.component';
import { NotificationService } from './notification.service';

Florian Azizian
committed
import { tap, catchError, filter } from 'rxjs/operators';
import { of, Subscription } from 'rxjs';
import { PrivilegeService } from '../service/privileges.service';

Florian Azizian
committed
import { MatDialogRef, MatDialog } from '@angular/material';
import { AttachmentCreateComponent } from './attachments/attachment-create/attachment-create.component';
import { FunctionsService } from '../service/functions.service';
import { AttachmentPageComponent } from './attachments/attachments-page/attachment-page.component';
import { VisaWorkflowComponent } from './visa/visa-workflow.component';
import { ActionsService } from './actions/actions.service';

Damien
committed
declare var angularGlobals : any;
@Pipe({ name: 'safeUrl' })
export class SafeUrlPipe implements PipeTransform {
constructor(private sanitizer: DomSanitizer) {}
transform(url: string) {
return this.sanitizer.bypassSecurityTrustResourceUrl(url);
}
}
@Component({
templateUrl: "signature-book.component.html",
styleUrls: ['signature-book.component.scss'],
})
export class SignatureBookComponent implements OnInit {
basketId : number;
groupId : number;
userId : number;
signatureBook: any = {
consigne : "",
documents : [],

Damien
committed
resListIndex : 0,
};
rightSelectedThumbnail : number = 0;
leftSelectedThumbnail : number = 0;
rightViewerLink : string = "";
leftViewerLink : string = "";
headerTab : string = "document";
showTopRightPanel : boolean = false;
showTopLeftPanel : boolean = false;
showResLeftPanel : boolean = true;
showLeftPanel : boolean = true;
showSignaturesPanel : boolean = false;
loading : boolean = false;
loadingSign : boolean = false;
subscription: Subscription;
currentResourceLock: any = null;
leftContentWidth : string = "44%";
rightContentWidth : string = "44%";

Florian Azizian
committed
dialogRef: MatDialogRef<any>;
processTool: any[] = [
{
id: 'notes',
icon: 'fas fa-pen-square fa-2x',
label: this.lang.notesAlt,
count: 0
},
{
id: 'visaCircuit',
icon: 'fas fa-list-ol fa-2x',
label: this.lang.visaWorkflow,
count: 0
},
{
id: 'history',
icon: 'fas fa-history fa-2x',
label: this.lang.history,
count: 0
},
{
id: 'linkedResources',
icon: 'fas fa-link fa-2x',
label: this.lang.links,
count: 0
@ViewChild('appVisaWorkflow', { static: false }) appVisaWorkflow: VisaWorkflowComponent;
constructor(
public http: HttpClient,
private route: ActivatedRoute,
private router: Router,
private zone: NgZone,
private notify: NotificationService,

Florian Azizian
committed
public privilegeService: PrivilegeService,
public dialog: MatDialog,
public functions: FunctionsService,
public actionService: ActionsService
(<any>window).pdfWorkerSrc = '../../node_modules/pdfjs-dist/build/pdf.worker.min.js';
// Event after process action
this.subscription = this.actionService.catchAction().subscribe(message => {
clearInterval(this.currentResourceLock);
this.processAfterAction();
});

Damien
committed
ngOnInit() : void {

Damien
committed
this.coreUrl = angularGlobals.coreUrl;
this.loading = true;

Damien
committed
this.route.params.subscribe(params => {
this.resId = +params['resId'];
this.basketId = params['basketId'];
this.userId = params['userId'];
this.signatureBook.resList = []; // This line is added because of manage action behaviour (processAfterAction is called twice)
this.lockResource();
this.http.get("../../rest/signatureBook/users/" + this.userId + "/groups/" + this.groupId + "/baskets/" + this.basketId + "/resources/" + this.resId)

Damien
committed
if (data.error) {
location.hash = "";
location.search = "";
return;
}
this.signatureBook = data;
this.headerTab = "document";

Damien
committed
this.leftSelectedThumbnail = 0;
this.rightSelectedThumbnail = 0;
this.leftViewerLink = "";
this.rightViewerLink = "";
this.showLeftPanel = true;
this.showRightPanel = true;
this.showResLeftPanel = true;
this.showTopLeftPanel = false;
this.showTopRightPanel = false;
this.showAttachmentPanel = false;
this.leftContentWidth = "44%";
this.rightContentWidth = "44%";
if (this.signatureBook.documents[0]) {
this.leftViewerLink = this.signatureBook.documents[0].viewerLink;

Florian Azizian
committed
if (this.signatureBook.documents[0].inSignatureBook) {
this.headerTab = "visaCircuit";

Damien
committed
}
}
if (this.signatureBook.attachments[0]) {
this.rightViewerLink = this.signatureBook.attachments[0].viewerLink;
}
this.signatureBook.resListIndex = this.signatureBook.resList.map((e:any) => { return e.res_id; }).indexOf(this.resId);

Damien
committed
this.displayPanel("RESLEFT");
this.loading = false;
setTimeout(() => {
$j("#rightPanelContent").niceScroll({touchbehavior:false, cursorcolor:"#666", cursoropacitymax:0.6, cursorwidth:4});
if ($j(".tooltipstered").length == 0) {
$j("#obsVersion").tooltipster({
interactive: true
});
}

Damien
committed
}, 0);

Florian Azizian
committed
this.loadActions();
setTimeout(() => {
this.backToBasket();
}, 2000);

Florian Azizian
committed
});
}
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
lockResource() {
this.http.put(`../../rest/resourcesList/users/${this.userId}/groups/${this.groupId}/baskets/${this.basketId}/lock`, { resources: [this.resId] }).pipe(
catchError((err: any) => {
this.notify.handleErrors(err);
return of(false);
})
).subscribe();
this.currentResourceLock = setInterval(() => {
this.http.put(`../../rest/resourcesList/users/${this.userId}/groups/${this.groupId}/baskets/${this.basketId}/lock`, { resources: [this.resId] }).pipe(
catchError((err: any) => {
this.notify.handleErrors(err);
return of(false);
})
).subscribe();
}, 50000);
}
unlockResource() {
clearInterval(this.currentResourceLock);
this.http.put(`../../rest/resourcesList/users/${this.userId}/groups/${this.groupId}/baskets/${this.basketId}/unlock`, { resources: [this.resId] }).pipe(
catchError((err: any) => {
this.notify.handleErrors(err);
return of(false);
})
).subscribe();
}

Florian Azizian
committed
loadActions() {
this.http.get("../../rest/resourcesList/users/" + this.userId + "/groups/" + this.groupId + "/baskets/" + this.basketId + "/actions?resId=" + this.resId)
.subscribe((data : any) => {
this.signatureBook.actions = data.actions;
}, (err) => {
this.notify.error(err.error.errors);
processAfterAttach(mode: string) {
this.zone.run(() => this.refreshAttachments(mode));
}
processAfterAction() {
var idToGo = -1;
var c = this.signatureBook.resList.length;
for (let i = 0; i < c; i++) {
if (this.signatureBook.resList[i].res_id == this.resId) {
if (this.signatureBook.resList[i + 1]) {
idToGo = this.signatureBook.resList[i + 1].res_id;
} else if (i > 0) {
idToGo = this.signatureBook.resList[i - 1].res_id;
}
}
}
if (c > 0) { // This (if)line is added because of manage action behaviour (processAfterAction is called twice)
if (idToGo >= 0) {
$j("#send").removeAttr("disabled");
$j("#send").css("opacity", "1");
this.zone.run(() => this.changeLocation(idToGo, "action"));
} else {
this.zone.run(() => this.backToBasket());
}
changeSignatureBookLeftContent(id: string) {
this.headerTab = id;
this.showTopLeftPanel = false;
}
changeRightViewer(index: number) {
if (this.signatureBook.attachments[index]) {
this.rightViewerLink = this.signatureBook.attachments[index].viewerLink;
} else {
this.rightViewerLink = "";
}
this.rightSelectedThumbnail = index;
}
changeLeftViewer(index: number) {
this.leftViewerLink = this.signatureBook.documents[index].viewerLink;
this.leftSelectedThumbnail = index;
}
displayPanel(panel: string) {
if (panel == "TOPRIGHT") {
this.showTopRightPanel = !this.showTopRightPanel;
} else if (panel == "TOPLEFT") {
this.showTopLeftPanel = !this.showTopLeftPanel;
} else if (panel == "LEFT") {
this.showLeftPanel = !this.showLeftPanel;
this.showResLeftPanel = false;
$j("#hideLeftContent").css('background', 'none');
this.rightContentWidth = "48%";
this.leftContentWidth = "48%";

Florian Azizian
committed
$j("#hideLeftContent").css('background', '#fbfbfb');
} else if (panel == "RESLEFT") {
this.showResLeftPanel = !this.showResLeftPanel;
this.rightContentWidth = "48%";
this.leftContentWidth = "48%";
this.rightContentWidth = "44%";
this.leftContentWidth = "44%";
if (this.signatureBook.resList.length == 0 || typeof this.signatureBook.resList[0].creation_date === 'undefined') {
this.http.get("../../rest/signatureBook/users/" + this.userId + "/groups/" + this.groupId + "/baskets/" + this.basketId + "/resources")
this.signatureBook.resList = data.resources;

Damien
committed
this.signatureBook.resList.forEach((value: any, index: number) => {
if (value.res_id == this.resId) {
this.signatureBook.resListIndex = index;
}
});
setTimeout(() => {
$j("#resListContent").niceScroll({touchbehavior:false, cursorcolor:"#666", cursoropacitymax:0.6, cursorwidth:4});
$j("#resListContent").scrollTop(0);
$j("#resListContent").scrollTop($j(".resListContentFrameSelected").offset().top - 42);
}, 0);
});
}
}
} else if (panel == "MIDDLE") {
this.showRightPanel = !this.showRightPanel;
this.showResLeftPanel = false;
if (!this.showRightPanel) {
this.leftContentWidth = "96%";
$j("#contentLeft").css('border-right', 'none');
} else {
this.rightContentWidth = "48%";
this.leftContentWidth = "48%";
$j("#contentLeft").css('border-right', 'solid 1px');
displayAttachmentPanel() {
this.showAttachmentPanel = !this.showAttachmentPanel;
this.rightSelectedThumbnail = 0;
if (this.signatureBook.attachments[0]) {
this.rightViewerLink = this.signatureBook.attachments[0].viewerLink;
}
}
refreshAttachments(mode: string) {
if (mode == "rightContent") {
this.http.get(this.coreUrl + 'rest/signatureBook/' + this.resId + '/incomingMailAttachments')
this.signatureBook.documents = data;
});
} else {
this.http.get(this.coreUrl + 'rest/signatureBook/' + this.resId + '/attachments')
var i = 0;
if (mode == "add") {
var found = false;
data.forEach((elem: any, index: number) => {
if (!found && (!this.signatureBook.attachments[index] || elem.res_id != this.signatureBook.attachments[index].res_id)) {
i = index;
found = true;
}
});
} else if (mode == "edit") {
var id = this.signatureBook.attachments[this.rightSelectedThumbnail].res_id;
data.forEach((elem: any, index: number) => {
if (elem.res_id == id) {
i = index;
}
});
}
this.signatureBook.attachments = data;
if (mode == "add" || mode == "edit") {
this.changeRightViewer(i);
} else if (mode == "del") {
this.changeRightViewer(0);
}
});
}
delAttachment(attachment: any) {
if (attachment.canDelete) {

Damien
committed
if (this.signatureBook.attachments.length <= 1) {
var r = confirm('Attention, ceci est votre dernière pièce jointe pour ce courrier, voulez-vous vraiment la supprimer ?');
} else {
var r = confirm('Voulez-vous vraiment supprimer la pièce jointe ?');
}

Florian Azizian
committed
this.http.delete('../../rest/attachments/' + attachment.res_id).pipe(
tap(() => {
this.refreshAttachments('del');
}),
catchError((err: any) => {
this.notify.handleErrors(err);
return of(false);
})
).subscribe();
signFile(attachment: any, signature: any) {
if (!this.loadingSign && this.signatureBook.canSign) {
this.loadingSign = true;
var route = attachment.isResource ? '../../rest/resources/' + attachment.res_id + '/sign' : '../../rest/attachments/' + attachment.res_id + '/sign';
this.http.put(route, {'signatureId' : signature.id})
if (!attachment.isResource) {
this.rightViewerLink = "../../rest/attachments/" + data.id + "/content";
this.signatureBook.attachments[this.rightSelectedThumbnail].status = 'SIGN';
this.signatureBook.attachments[this.rightSelectedThumbnail].idToDl = data.new_id;
} else {
this.rightViewerLink += "?tsp=" + Math.floor(Math.random() * 100);
}
this.signatureBook.attachments[this.rightSelectedThumbnail].viewerLink = this.rightViewerLink;
var allSigned = true;
this.signatureBook.attachments.forEach((value: any) => {
if (value.sign && value.status != 'SIGN') {
allSigned = false;
}
});
if (this.signatureBook.resList.length > 0) {
this.signatureBook.resList[this.signatureBook.resListIndex].allSigned = allSigned;
this.loadingSign = false;
}, (error: any) => {
this.loadingSign = false;
});
}
this.http.put('../../rest/attachments/' + attachment.res_id + '/unsign', {})
this.rightViewerLink = "../../rest/attachments/" + attachment.res_id + "/content";
this.signatureBook.attachments[this.rightSelectedThumbnail].viewerLink = this.rightViewerLink;
this.signatureBook.attachments[this.rightSelectedThumbnail].status = 'A_TRA';
this.signatureBook.attachments[this.rightSelectedThumbnail].idToDl = attachment.res_id;
if (this.signatureBook.resList.length > 0) {
this.signatureBook.resList[this.signatureBook.resListIndex].allSigned = false;
if(this.headerTab=="visaCircuit"){
this.changeSignatureBookLeftContent("document");
setTimeout(() => {
this.changeSignatureBookLeftContent("visaCircuit");
}, 0);
}
let path = '/basketList/users/'+this.userId+'/groups/'+this.groupId+'/baskets/'+this.basketId;

Alex ORLUC
committed
this.http.put('../../rest/resourcesList/users/' + this.userId + '/groups/' + this.groupId + '/baskets/' + this.basketId + '/unlock', { resources: [this.resId] })
.subscribe((data: any) => {
this.router.navigate([path]);
this.router.navigate([path]);

Alex ORLUC
committed
this.http.put('../../rest/resourcesList/users/' + this.userId + '/groups/' + this.groupId + '/baskets/' + this.basketId + '/unlock', { resources: [this.resId] })
.subscribe((data: any) => {
this.router.navigate([`/resources/${this.resId}`]);

Alex ORLUC
committed
}, (err: any) => { });
changeLocation(resId: number, origin: string) {
this.http.put('../../rest/resourcesList/users/' + this.userId + '/groups/' + this.groupId + '/baskets/' + this.basketId + '/lock', { resources: [resId] })
.subscribe((data: any) => {
if (data.lockedResources > 0) {
alert(data.lockedResources + ' ' + this.lang.warnLockRes + '.');
let path = "signatureBook/users/" + this.userId + "/groups/" + this.groupId + "/baskets/" + this.basketId + "/resources/" + resId;
this.router.navigate([path]);
}, (err: any) => {
this.notify.handleErrors(err);
}
validForm() {
if ($j("#signatureBookActions option:selected")[0].value != "") {
this.processAction();
} else {
alert("Aucune action choisie");
processAction() {
this.http.get(`../../rest/resources/${this.resId}?light=true`).pipe(
tap((data: any) => {
let actionId = $j("#signatureBookActions option:selected")[0].value;
let selectedAction = this.signatureBook.actions.filter((action: any) => action.id == actionId)[0];
this.actionService.launchAction(selectedAction, this.userId, this.groupId, this.basketId, [this.resId], data, false);
}),
catchError((err: any) => {
this.notify.handleErrors(err);
return of(false);
})
).subscribe();
refreshBadge(nbRres: any, id: string) {
this.processTool.filter(tool => tool.id === id)[0].count = nbRres;
}
loadBadges() {
this.http.get(`../../rest/resources/${this.resId}/items`).pipe(
tap((data: any) => {
this.processTool.forEach(element => {
element.count = data[element.id] !== undefined ? data[element.id] : 0;
});
}),
catchError((err: any) => {
this.notify.handleSoftErrors(err);
return of(false);
})
).subscribe();
}

Florian Azizian
committed
createAttachment() {
this.dialogRef = this.dialog.open(AttachmentCreateComponent, { disableClose: true, panelClass: 'attachment-modal-container', height: '90vh', width: '90vw', data: { resIdMaster: this.resId } });

Florian Azizian
committed
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
this.dialogRef.afterClosed().pipe(
filter((data: string) => data === 'success'),
tap(() => {
this.refreshAttachments('add');
}),
catchError((err: any) => {
this.notify.handleErrors(err);
return of(false);
})
).subscribe();
}
showAttachment(attachment: any) {
if (attachment.canModify && attachment.status != "SIGN") {
this.dialogRef = this.dialog.open(AttachmentPageComponent, { height: '99vh', width: '99vw', panelClass: 'modal-container', disableClose: true, data: { resId: attachment.res_id} });
this.dialogRef.afterClosed().pipe(
filter((data: string) => data === 'success'),
tap(() => {
this.refreshAttachments('edit');
}),
catchError((err: any) => {
this.notify.handleErrors(err);
return of(false);
})
).subscribe();
}
}
saveVisaWorkflow() {
this.appVisaWorkflow.saveVisaWorkflow();
}