diff --git a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html index 0ebf6ce9296f81022c8d1dde60f70f85425b80bd..ae0295e7c6d58570b2f9d9e4bff535a07d03a049 100755 --- a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html +++ b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.html @@ -19,6 +19,14 @@ (click)="toggleIntegration(inteKey.key)" [checked]="data.resource.integrations[inteKey.key]"> {{'lang.' + inteKey.key + '_doc' | translate}}</mat-checkbox> </div> + <div *ngIf="!visaNumberCorrect || !signNumberCorrect" class="alert-message alert-message-danger" role="alert"> + <p *ngIf="!visaNumberCorrect"> + {{'lang.notEnoughVisaUser' | translate}} + </p> + <p *ngIf="!signNumberCorrect"> + {{'lang.tooManySignUser' | translate}} + </p> + </div> <div *ngIf="resourcesError.length > 0" class="alert-message alert-message-danger mailList" role="alert"> <p> {{'lang.canNotMakeAction' | translate}} : @@ -39,7 +47,7 @@ </ul> </div> <app-visa-workflow *ngIf="data.resIds.length <= 1 || (!noResourceToProcess && data.resIds.length > 1)" - [adminMode]="true" #appVisaWorkflow> + [adminMode]="true" (workflowUpdated)="checkMinMaxVisaSign($event)" #appVisaWorkflow> </app-visa-workflow> <div style="padding-top: 10px;"> <app-note-editor #noteEditor [resIds]="data.resIds"></app-note-editor> @@ -58,4 +66,4 @@ (click)="onSubmit()">{{'lang.validate' | translate}}</button> <button mat-raised-button mat-button [disabled]="loading" [mat-dialog-close]="">{{'lang.cancel' | translate}}</button> </div> -</div> \ No newline at end of file +</div> diff --git a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts index fe26c0c229c5fb6be689fed865f9ad5380472ace..c0d652897b8b0c9719fcffe0ab25ed029f622543 100644 --- a/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts +++ b/src/frontend/app/actions/visa-send-signature-book-action/send-signature-book-action.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Inject, ViewChild, AfterViewInit } from '@angular/core'; +import { Component, Inject, ViewChild, AfterViewInit } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { NotificationService } from '@service/notification/notification.service'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; @@ -10,12 +10,11 @@ import { FunctionsService } from '@service/functions.service'; import { VisaWorkflowComponent } from '../../visa/visa-workflow.component'; @Component({ - templateUrl: "send-signature-book-action.component.html", + templateUrl: 'send-signature-book-action.component.html', styleUrls: ['send-signature-book-action.component.scss'], }) export class SendSignatureBookActionComponent implements AfterViewInit { - loading: boolean = true; resourcesMailing: any[] = []; @@ -29,6 +28,11 @@ export class SendSignatureBookActionComponent implements AfterViewInit { } }; + minimumVisaRole: any = 0; + maximumSignRole: any = 0; + visaNumberCorrect: any = true; + signNumberCorrect: any = true; + @ViewChild('noteEditor', { static: true }) noteEditor: NoteEditorComponent; @ViewChild('appVisaWorkflow', { static: false }) appVisaWorkflow: VisaWorkflowComponent; @@ -56,6 +60,8 @@ export class SendSignatureBookActionComponent implements AfterViewInit { this.appVisaWorkflow.loadDefaultWorkflow(this.data.resIds[0]); } } + + this.checkMinMaxVisaSign(this.appVisaWorkflow.visaWorkflow.items); } async onSubmit() { @@ -84,7 +90,7 @@ export class SendSignatureBookActionComponent implements AfterViewInit { checkSignatureBook() { this.resourcesError = []; - return new Promise((resolve, reject) => { + return new Promise((resolve) => { this.http.post('../rest/resourcesList/users/' + this.data.userId + '/groups/' + this.data.groupId + '/baskets/' + this.data.basketId + '/actions/' + this.data.action.id + '/checkSignatureBook', { resources: this.data.resIds }) .subscribe((data: any) => { if (!this.functions.empty(data.resourcesInformations.error)) { @@ -94,6 +100,8 @@ export class SendSignatureBookActionComponent implements AfterViewInit { if (data.resourcesInformations.success) { this.resourcesMailing = data.resourcesInformations.success.filter((element: any) => element.mailing); } + this.minimumVisaRole = data.minimumVisaRole; + this.maximumSignRole = data.maximumSignRole; resolve(true); }, (err: any) => { this.notify.handleSoftErrors(err); @@ -120,7 +128,7 @@ export class SendSignatureBookActionComponent implements AfterViewInit { inSignatureBook : true }; - return new Promise((resolve, reject) => { + return new Promise((resolve) => { this.http.post('../rest/resources', this.data.resource).pipe( tap((data: any) => { this.data.resIds = [data.resId]; @@ -173,6 +181,23 @@ export class SendSignatureBookActionComponent implements AfterViewInit { } isValidAction() { - return !this.noResourceToProcess && this.appVisaWorkflow !== undefined && !this.appVisaWorkflow.emptyWorkflow() && !this.appVisaWorkflow.workflowEnd(); + return !this.noResourceToProcess && this.appVisaWorkflow !== undefined && !this.appVisaWorkflow.emptyWorkflow() && !this.appVisaWorkflow.workflowEnd() && this.signNumberCorrect && this.visaNumberCorrect; + } + + checkMinMaxVisaSign(items: any[]) { + if (this.maximumSignRole !== 0 || this.minimumVisaRole !== 0) { + let nbVisaRole = 0; + let nbSignRole = 0; + items.forEach(item => { + if (item.requested_signature) { + nbSignRole++; + } else { + nbVisaRole++; + } + }); + + this.visaNumberCorrect = this.minimumVisaRole === 0 || nbVisaRole >= this.minimumVisaRole; + this.signNumberCorrect = this.maximumSignRole === 0 || nbSignRole <= this.maximumSignRole; + } } } diff --git a/src/frontend/app/visa/visa-workflow.component.ts b/src/frontend/app/visa/visa-workflow.component.ts index 380837d70bd978230b1384ab4d80ea5e156b2983..ba77a65964c3e5d33499c720a122d638a91051e1 100644 --- a/src/frontend/app/visa/visa-workflow.component.ts +++ b/src/frontend/app/visa/visa-workflow.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnInit, ElementRef, ViewChild } from '@angular/core'; +import {Component, Input, OnInit, ElementRef, ViewChild, Output, EventEmitter} from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { TranslateService } from '@ngx-translate/core'; import { NotificationService } from '@service/notification/notification.service'; @@ -50,6 +50,8 @@ export class VisaWorkflowComponent implements OnInit { @Input('linkedToMaarchParapheur') linkedToMaarchParapheur: boolean = false; + @Output() workflowUpdated = new EventEmitter<any>(); + @ViewChild('searchVisaSignUserInput', { static: false }) searchVisaSignUserInput: ElementRef; searchVisaSignUser = new FormControl(); @@ -97,6 +99,7 @@ export class VisaWorkflowComponent implements OnInit { if (event.previousContainer === event.container) { if (this.canManageUser(this.visaWorkflow.items[event.currentIndex], event.currentIndex)) { moveItemInArray(event.container.data, event.previousIndex, event.currentIndex); + this.workflowUpdated.emit(event.container); } else { this.notify.error(this.translate.instant('lang.moveVisaUserErr', {value1: this.visaWorkflow.items[event.previousIndex].labelToDisplay})); } @@ -370,6 +373,7 @@ export class VisaWorkflowComponent implements OnInit { changeRole(i: number) { this.visaWorkflow.items[i].requested_signature = !this.visaWorkflow.items[i].requested_signature; + this.workflowUpdated.emit(this.visaWorkflow.items); } getWorkflow() {