Skip to content
Snippets Groups Projects
Commit 75b8470e authored by Hamza HRAMCHI's avatar Hamza HRAMCHI
Browse files

Merge branch 'feat/20027/develop' into 'develop'

[20027] Création des signatures dans "mon profil"

See merge request maarch/MaarchParapheur!121
parents f5d516b6 513e75cb
No related branches found
No related tags found
No related merge requests found
...@@ -633,6 +633,7 @@ ...@@ -633,6 +633,7 @@
"showPassword": "Show password", "showPassword": "Show password",
"hidePassword": "Hide password", "hidePassword": "Hide password",
"cannotSetSignature": "You cannot pre-position a signature for a user with the annotator role", "cannotSetSignature": "You cannot pre-position a signature for a user with the annotator role",
"resumeOriginalDoc": "Warning ! The return document action will use the original document" "resumeOriginalDoc": "Warning ! The return document action will use the original document",
"emptySignList": "No stamp available"
} }
} }
\ No newline at end of file
...@@ -632,6 +632,7 @@ ...@@ -632,6 +632,7 @@
"showPassword": "Afficher le mot de passe", "showPassword": "Afficher le mot de passe",
"hidePassword": "Masquer le mot de passe", "hidePassword": "Masquer le mot de passe",
"cannotSetSignature": "Vous ne pouvez pas pré-positionner une signature pour un utilisateur avec le rôle annotateur", "cannotSetSignature": "Vous ne pouvez pas pré-positionner une signature pour un utilisateur avec le rôle annotateur",
"resumeOriginalDoc": "Attention ! L'action renvoi de document reprend le document original" "resumeOriginalDoc": "Attention ! L'action renvoi de document reprend le document original",
"emptySignList": "Aucune griffe disponible"
} }
} }
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
<ion-content #padContent> <ion-content #padContent>
<article class="pad"> <article class="pad">
<section class="pad-draw"> <section class="pad-draw">
<signature-pad #signaturePad class="padContent" [options]="signaturePadOptions" (onEndEvent)="drawComplete()"></signature-pad> <signature-pad #signaturePad class="padContent" [options]="signaturePadOptions" (onEndEvent)="drawComplete()" style="margin-top: 10px;"></signature-pad>
</section> </section>
<div class="draw"></div> <div class="draw"></div>
</article> </article>
......
...@@ -15,6 +15,10 @@ ...@@ -15,6 +15,10 @@
<ion-label>{{'lang.informations' | translate}}</ion-label> <ion-label>{{'lang.informations' | translate}}</ion-label>
<ion-icon name="information-circle"></ion-icon> <ion-icon name="information-circle"></ion-icon>
</ion-segment-button> </ion-segment-button>
<ion-segment-button value="signatures">
<ion-label>{{'lang.signatures' | translate}}</ion-label>
<ion-icon name="pencil-outline"></ion-icon>
</ion-segment-button>
<ion-segment-button value="pref"> <ion-segment-button value="pref">
<ion-label>{{'lang.preferences' | translate}}</ion-label> <ion-label>{{'lang.preferences' | translate}}</ion-label>
<ion-icon name="brush-outline"></ion-icon> <ion-icon name="brush-outline"></ion-icon>
...@@ -253,6 +257,9 @@ ...@@ -253,6 +257,9 @@
<ion-label color="primary" style="font-style: italic;">{{ 'lang.noScheduledNotif' | translate }}</ion-label> <ion-label color="primary" style="font-style: italic;">{{ 'lang.noScheduledNotif' | translate }}</ion-label>
</ion-item> </ion-item>
</ng-container> </ng-container>
<ng-container *ngIf="currentTool === 'signatures'">
<app-signatures [target]="'profile'"></app-signatures>
</ng-container>
</ion-content> </ion-content>
</form> </form>
<ion-footer class="ion-no-border" *ngIf="['info','pref', 'scheduledNotifications'].indexOf(currentTool) > -1"> <ion-footer class="ion-no-border" *ngIf="['info','pref', 'scheduledNotifications'].indexOf(currentTool) > -1">
......
...@@ -78,7 +78,7 @@ export class SidebarComponent implements OnInit, AfterViewInit { ...@@ -78,7 +78,7 @@ export class SidebarComponent implements OnInit, AfterViewInit {
async openProfile() { async openProfile() {
const modal = await this.modalController.create({ const modal = await this.modalController.create({
component: ProfileComponent, component: ProfileComponent,
cssClass: 'myClass' cssClass: 'profileCss'
}); });
await modal.present(); await modal.present();
} }
......
<ion-header [translucent]="true"> <ion-header *ngIf="target === 'document'" [translucent]="true">
<ion-toolbar color="primary"> <ion-toolbar color="primary">
<ion-title>{{(!signaturesService.stampLock ? 'lang.signatures' : 'lang.certifiedDocument') | translate}} <small class="secondary" *ngIf="signPosMode">{{this.currentWorflow.signaturePositions.length}} {{'lang.prePositionings' | translate}}</small></ion-title> <ion-title>{{(!signaturesService.stampLock ? 'lang.signatures' : 'lang.certifiedDocument') | translate}} <small class="secondary" *ngIf="signPosMode">{{this.currentWorflow.signaturePositions.length}} {{'lang.prePositionings' | translate}}</small></ion-title>
<ion-buttons slot="end"> <ion-buttons slot="end">
...@@ -10,15 +10,18 @@ ...@@ -10,15 +10,18 @@
</ion-header> </ion-header>
<ion-content (wheel)="!signaturesService.stampLock ? scroll($event): null"> <ion-content (wheel)="!signaturesService.stampLock ? scroll($event): null">
<ng-container *ngIf="!signaturesService.stampLock; else elseCertified"> <ng-container *ngIf="!signaturesService.stampLock; else elseCertified">
<ion-slides *ngIf="!loading" pager="true" [options]="slideOpts" #slides> <ion-slides *ngIf="!loading" pager="true" [options]="slideOpts" #slides [class.hideSwiper]="signaturesList.length === 0">
<ion-item *ngIf="signaturesList.length === 0" class="emptySignList" lines="none">
<ion-label>{{'lang.emptySignList' | translate}}</ion-label>
</ion-item>
<ion-slide *ngFor="let slide of signaturesList" style="display: grid;grid-template-columns: repeat(2, 1fr);"> <ion-slide *ngFor="let slide of signaturesList" style="display: grid;grid-template-columns: repeat(2, 1fr);">
<div style="display: contents;"> <div style="display: contents;">
<ion-card *ngFor="let sign of slide; let i=index" class="sign-image"> <ion-card *ngFor="let sign of slide; let i=index" class="sign-image">
<img id="imgSign_{{i}}" (click)="selectSignature(sign);" [src]="sanitization.bypassSecurityTrustUrl('data:image/png;base64,' + sign.encodedSignature)" <img id="imgSign_{{i}}" (click)="target === 'document' ? selectSignature(sign) : '';" [src]="sanitization.bypassSecurityTrustUrl('data:image/png;base64,' + sign.encodedSignature)"
style="width: 190px;cursor: pointer;"> style="width: 190px;cursor: pointer;">
<ion-toolbar style="position: absolute;top: 0px;"> <ion-toolbar style="position: absolute;top: 0px;" color="default">
<ion-label color="secondary" *ngIf="sign.substituted">{{'lang.substitutedSignature' | translate}}</ion-label> <ion-label color="secondary" *ngIf="sign.substituted">{{'lang.substitutedSignature' | translate}}</ion-label>
<ion-buttons slot="start"> <ion-buttons *ngIf="target === 'document'" slot="start">
<ion-button size="small" color="primary" (click)="selectSignature(sign);" [title]="'lang.selectSignature' | translate"> <ion-button size="small" color="primary" (click)="selectSignature(sign);" [title]="'lang.selectSignature' | translate">
<ion-icon slot="icon-only" name="arrow-up-circle-outline"></ion-icon> <ion-icon slot="icon-only" name="arrow-up-circle-outline"></ion-icon>
</ion-button> </ion-button>
...@@ -38,7 +41,7 @@ ...@@ -38,7 +41,7 @@
<ion-icon name="chevron-up-outline"></ion-icon> <ion-icon name="chevron-up-outline"></ion-icon>
</ion-fab-button> </ion-fab-button>
<ion-fab-list side="top"> <ion-fab-list side="top">
<ion-fab-button color="light" [title]="'lang.addNewDate' | translate" (click)="addNewDate()"> <ion-fab-button *ngIf="target === 'document'" color="light" [title]="'lang.addNewDate' | translate" (click)="addNewDate()">
<ion-icon name="calendar-outline"></ion-icon> <ion-icon name="calendar-outline"></ion-icon>
</ion-fab-button> </ion-fab-button>
<ion-fab-button color="light" [title]="'lang.importNewSignature' | translate" (click)="uploadFile.click()"> <ion-fab-button color="light" [title]="'lang.importNewSignature' | translate" (click)="uploadFile.click()">
......
...@@ -103,4 +103,16 @@ ...@@ -103,4 +103,16 @@
font-size: 30px; font-size: 30px;
color: var(--ion-color-medium); color: var(--ion-color-medium);
} }
}
.emptySignList {
text-align: center;
display: inherit;
height: 100% !important;
font-size: 30px;
opacity: 0.5;
}
.hideSwiper {
--bullet-background-active: none;
} }
\ No newline at end of file
...@@ -8,8 +8,9 @@ import { NotificationService } from '../service/notification.service'; ...@@ -8,8 +8,9 @@ import { NotificationService } from '../service/notification.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { AuthService } from '../service/auth.service'; import { AuthService } from '../service/auth.service';
import { LocalStorageService } from '../service/local-storage.service'; import { LocalStorageService } from '../service/local-storage.service';
import { IonSlides, ModalController } from '@ionic/angular'; import { AlertController, IonSlides, ModalController } from '@ionic/angular';
import { SignaturePadPageComponent } from '../pad/pad.component'; import { SignaturePadPageComponent } from '../pad/pad.component';
import { FunctionsService } from '../service/functions.service';
@Component({ @Component({
selector: 'app-signatures', selector: 'app-signatures',
...@@ -20,6 +21,7 @@ export class SignaturesComponent implements OnInit { ...@@ -20,6 +21,7 @@ export class SignaturesComponent implements OnInit {
@Input() currentWorflow: any; @Input() currentWorflow: any;
@Input() content: any; @Input() content: any;
@Input() target: 'document' | 'profile' = 'document';
@ViewChild('slides', { static: false }) slides: IonSlides; @ViewChild('slides', { static: false }) slides: IonSlides;
...@@ -42,16 +44,19 @@ export class SignaturesComponent implements OnInit { ...@@ -42,16 +44,19 @@ export class SignaturesComponent implements OnInit {
signatureWidth: number; signatureWidth: number;
signatureScaling: any; signatureScaling: any;
constructor(private translate: TranslateService, constructor(
public http: HttpClient, public http: HttpClient,
public signaturesService: SignaturesContentService, public signaturesService: SignaturesContentService,
private bottomSheetRef: MatBottomSheet,
private sanitization: DomSanitizer,
public notificationService: NotificationService, public notificationService: NotificationService,
public authService: AuthService, public authService: AuthService,
public modalController: ModalController,
private translate: TranslateService,
private localStorage: LocalStorageService, private localStorage: LocalStorageService,
public functions: FunctionsService,
public alertController: AlertController,
private bottomSheetRef: MatBottomSheet,
private sanitization: DomSanitizer,
private renderer: Renderer2, private renderer: Renderer2,
public modalController: ModalController
) { ) {
} }
...@@ -74,9 +79,14 @@ export class SignaturesComponent implements OnInit { ...@@ -74,9 +79,14 @@ export class SignaturesComponent implements OnInit {
} }
ngOnInit() { ngOnInit() {
this.signaturesService.stampLock = false;
this.initSignatures(); this.initSignatures();
this.signPosMode = this.currentWorflow.signaturePositions.length > 0 && this.emptySigns(); if (this.target === 'document') {
this.getImgDimensions(this.content); this.signPosMode = this.currentWorflow.signaturePositions.length > 0 && this.emptySigns();
this.getImgDimensions(this.content);
} else {
this.loading = false;
}
} }
initSignatures() { initSignatures() {
...@@ -104,9 +114,10 @@ export class SignaturesComponent implements OnInit { ...@@ -104,9 +114,10 @@ export class SignaturesComponent implements OnInit {
} }
async openSignatures() { async openSignatures() {
const cssClass: string = this.target === 'profile' ? 'profileCss' : 'my-custom-class';
const modal = await this.modalController.create({ const modal = await this.modalController.create({
component: SignaturePadPageComponent, component: SignaturePadPageComponent,
cssClass: 'my-custom-class' cssClass: cssClass
}); });
await modal.present(); await modal.present();
const { data } = await modal.onWillDismiss(); const { data } = await modal.onWillDismiss();
...@@ -250,19 +261,35 @@ export class SignaturesComponent implements OnInit { ...@@ -250,19 +261,35 @@ export class SignaturesComponent implements OnInit {
this.localStorage.save(this.signaturesService.mainDocumentId.toString(), JSON.stringify({ 'date': this.signaturesService.datesContent, 'sign': this.signaturesService.signaturesContent, 'note': this.signaturesService.notesContent })); this.localStorage.save(this.signaturesService.mainDocumentId.toString(), JSON.stringify({ 'date': this.signaturesService.datesContent, 'sign': this.signaturesService.signaturesContent, 'note': this.signaturesService.notesContent }));
} }
removeSignature(signature: any) { async removeSignature(signature: any) {
const r = confirm(this.translate.instant('lang.wantDeleteSignature')); const alert = await this.alertController.create({
// cssClass: 'custom-alert-danger',
if (r) { header: this.translate.instant('lang.wantDeleteSignature'),
this.http.delete('../rest/users/' + this.authService.user.id + '/signatures/' + signature.id) buttons: [
.subscribe(() => { {
this.signaturesService.signaturesList = this.signaturesService.signaturesList.filter((element) => element.id !== signature.id); text: this.translate.instant('lang.no'),
this.notificationService.success('lang.signatureDeleted'); role: 'cancel',
this.initSignatures(); cssClass: 'secondary',
}, (err: any) => { handler: () => { }
this.notificationService.error(err.error.errors); },
}); {
} text: this.translate.instant('lang.yes'),
handler: () => {
this.http.delete('../rest/users/' + this.authService.user.id + '/signatures/' + signature.id)
.subscribe(() => {
this.signaturesService.signaturesList = this.signaturesService.signaturesList.filter((element) => element.id !== signature.id);
this.notificationService.success('lang.signatureDeleted');
this.initSignatures();
}, (err: any) => {
this.notificationService.error(err.error.errors);
});
}
}
]
});
await alert.present();
} }
toggleAllPage() { toggleAllPage() {
......
...@@ -80,6 +80,11 @@ input:read-only { ...@@ -80,6 +80,11 @@ input:read-only {
--height: 100%; --height: 100%;
} }
.profileCss {
--width: 40%;
--height: 65%;
}
ion-icon { ion-icon {
pointer-events: none; pointer-events: none;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment