diff --git a/src/frontend/app/administration/home/administration.component.html b/src/frontend/app/administration/home/administration.component.html index bb45ab116bba71f902337c33437d0ec2c2c586c2..53a3b3dd25377d8c1da48e9645ee62c5f243a9cf 100644 --- a/src/frontend/app/administration/home/administration.component.html +++ b/src/frontend/app/administration/home/administration.component.html @@ -8,7 +8,7 @@ </ion-header> <ion-content #mainContent> <ion-grid> - <ion-row> + <ion-row class="repeatRows"> <ion-col *ngFor="let privilege of authService.user.administrativePrivileges"> <ion-button [routerLink]="privilege.route" expand="block" size="large" fill="outline" color="secondary" style="height: 200px;"> diff --git a/src/frontend/app/administration/home/administration.component.scss b/src/frontend/app/administration/home/administration.component.scss index 3b548e605802cbb00909e9d5622dab766043a1a7..5a078e56c6d0ab34cbc4c4c29a1196f38c4bdaf1 100644 --- a/src/frontend/app/administration/home/administration.component.scss +++ b/src/frontend/app/administration/home/administration.component.scss @@ -58,4 +58,9 @@ display: flex; flex-direction: column; align-items: center; +} + +.repeatRows { + display: grid; + grid-template-columns: repeat(4, 1fr); } \ No newline at end of file diff --git a/src/frontend/app/document/document.component.ts b/src/frontend/app/document/document.component.ts index 03d179eb9955012e089b372bfea8fd956aa546e0..66f5cfd5676ce498b4c3b8faa72eb866f743f81a 100755 --- a/src/frontend/app/document/document.component.ts +++ b/src/frontend/app/document/document.component.ts @@ -650,15 +650,13 @@ export class DocumentComponent implements OnInit { { text: this.translate.instant('lang.validate'), handler: async (data: any) => { - this.loadingController.create({ + const currentUserWorkflow = this.mainDocument.workflow.filter((line: { current: boolean; }) => line.current === true)[0]; + const res = await this.signatureMethodService.checkAuthenticationAndLaunchAction(currentUserWorkflow, data.paragraph); + const loading = await this.loadingController.create({ message: this.translate.instant('lang.loadingValidation'), spinner: 'dots' - }).then((load: HTMLIonLoadingElement) => { - this.load = load; - this.load.present(); }); - const currentUserWorkflow = this.mainDocument.workflow.filter((line: { current: boolean; }) => line.current === true)[0]; - const res = await this.signatureMethodService.checkAuthenticationAndLaunchAction(currentUserWorkflow, data.paragraph); + await loading.present(); if (!this.functionsService.empty(res)) { if (this.signaturesService.documentsList[this.signaturesService.indexDocumentsList] !== undefined) { this.signaturesService.documentsList.splice(this.signaturesService.indexDocumentsList, 1); @@ -670,10 +668,10 @@ export class DocumentComponent implements OnInit { disableClose: true, direction: 'ltr' }; + loading.dismiss(); this.bottomSheet.open(SuccessInfoValidBottomSheetComponent, config); this.localStorage.remove(this.mainDocument.id.toString()); } - this.load.dismiss(); } } ] diff --git a/src/frontend/app/login/passwordModification/password-modification.component.html b/src/frontend/app/login/passwordModification/password-modification.component.html index f5e02ba1559aa551ab40b8751f1b10a964b428ac..7f945887cc941bf4c6766a55d6f72c1df9165076 100644 --- a/src/frontend/app/login/passwordModification/password-modification.component.html +++ b/src/frontend/app/login/passwordModification/password-modification.component.html @@ -1,53 +1,79 @@ -<div class="container" [class.admin-is-mobile]="signaturesService.mobileMode"> - <!--<mat-toolbar color="primary" class="admin-toolbar"> - <mat-icon class="maarchLogoFull" [svgIcon]="signaturesService.mobileMode ? 'maarchLogoOnly' : 'maarchLogo'"></mat-icon> - <h1 class="admin-toolbar-title">{{'lang.passwordModification' | translate}}</h1> - <span style="flex: 1 1 auto;"></span> - <button mat-button> - <mat-icon mat-list-icon class="fa fa-user fa-2x" style="color:white; margin:0px 12px 8px 0px;"></mat-icon>{{user.firstname.charAt(0) | uppercase}}. {{user.lastname | uppercase}}</button> - </mat-toolbar>--> - <mat-sidenav-container autosize class="admin-sidenav-container" > - <mat-sidenav-content> - <div *ngIf="loading" style="display:flex;height:100%;"> - <mat-spinner style="margin:auto;"></mat-spinner> +<ion-header [translucent]="true"> + <ion-toolbar color="primary"> + <ion-buttons slot="start"> + </ion-buttons> + <ion-title>{{'lang.passwordModification' | translate}}</ion-title> + </ion-toolbar> +</ion-header> +<ion-content #mainContent> + <form [formGroup]="firstFormGroup" (ngSubmit)="onSubmit()" style="display: contents;"> + <ion-grid> + <ion-row> + <ion-col offset="3" size="6"> + <ion-card class="info"> + <ion-card-content> + {{'lang.hello' | translate}} <b> {{user.firstname}} {{user.lastname}}</b>, {{'lang.changePasswordInfo' | translate}}. + </ion-card-content> + </ion-card> + <ion-item> + <ion-label color="secondary" position="stacked">{{'lang.typeCurrentPassword' | translate}}</ion-label> + <ion-input placeholder="{{'lang.typeCurrentPassword' | translate}}" formControlName="currentPasswordCtrl" required [type]="hidePassword ? 'password' : 'text'"></ion-input> + <ion-button class="showpassButton" slot="end" color="light" + (click)="hidePassword = !hidePassword"> + <ion-icon slot="icon-only" color="primary" + [name]="hidePassword ? 'eye-outline' : 'eye-off-outline'"></ion-icon> + </ion-button> + <ion-note *ngIf="firstFormGroup.controls['currentPasswordCtrl'].hasError('required')" color="danger">{{'lang.requiredField' | translate}}</ion-note> + </ion-item> + <ion-list-header lines="full"> + <ion-label color="dark">{{this.ruleText}}</ion-label> + </ion-list-header> + <ion-item> + <ion-label color="secondary" position="stacked">{{'lang.passwordConfirmation' | translate}} + </ion-label> + <ion-input #inputPasswd placeholder="{{'lang.passwordConfirmation' | translate}}" formControlName="newPasswordCtrl" required + [type]="hidePassword ? 'password' : 'text'"></ion-input> + <ion-button class="showpassButton" slot="end" color="light" + (click)="hidePassword = !hidePassword"> + <ion-icon slot="icon-only" color="primary" + [name]="hidePassword ? 'eye-outline' : 'eye-off-outline'"></ion-icon> + </ion-button> + <ion-item *ngIf="validPassword" lines="none"> + <ion-icon slot="start" color="success" name="checkmark-outline"></ion-icon> + <ion-label color="success">{{'lang.passwordValid' | translate}}</ion-label> + </ion-item> + <ion-note color="danger">{{getErrorMessage()}}</ion-note> + </ion-item> + <ion-item> + <ion-label color="secondary" position="stacked">{{'lang.passwordConfirmation' | translate}} + </ion-label> + <ion-input #inputPasswd2 placeholder="{{'lang.passwordConfirmation' | translate}}" required [type]="hidePassword ? 'password' : 'text'" + formControlName="retypePasswordCtrl"></ion-input> + <ion-button class="showpassButton" slot="end" color="light" + (click)="hidePassword = !hidePassword"> + <ion-icon slot="icon-only" color="primary" + [name]="hidePassword ? 'eye-outline' : 'eye-off-outline'"></ion-icon> + </ion-button> + <ion-item *ngIf="!firstFormGroup.controls['retypePasswordCtrl'].hasError('mismatch') && firstFormGroup.controls['retypePasswordCtrl'].value != ''" lines="none"> + <ion-icon slot="start" color="success" name="checkmark-outline"></ion-icon> + <ion-label color="success">{{'lang.passwordMatch' | translate}}</ion-label> + </ion-item> + <ion-note color="danger">{{'lang.passwordNotMatch' | translate}}</ion-note> + </ion-item> + </ion-col> + </ion-row> + </ion-grid> + <ion-item text-center lines="none" style="position: sticky;bottom:0px;z-index:1;"> + <div style="display: flex;align-items: center;justify-content: center;width: 100%;background: white;"> + <ion-button type="submit" shape="round" size="large" fill="outline" color="primary" + [disabled]="!firstFormGroup.valid"> + <ion-label style="font-size: 13px;">{{'lang.validate' | translate}}</ion-label> + </ion-button> + <ion-button type="button" shape="round" size="large" fill="outline" color="default" (click)="logout()"> + <ion-label style="font-size: 13px;">{{'lang.logout' | translate}}</ion-label> + </ion-button> </div> - <mat-card *ngIf="!loading" class="card-app-content" style="display: flex;justify-content: center;align-items: center; height: 100%; padding: 0px"> - <form [formGroup]="firstFormGroup" (ngSubmit)="onSubmit()" style="max-width: 700px;"> - <p>{{'lang.hello' | translate}} <b>{{user.firstname}} {{user.lastname}}</b>, {{'lang.changePasswordInfo' | translate}}.</p> - <ng-template>{{'lang.passwordModification' | translate}}</ng-template> - <mat-form-field style="padding:10px; width: 100%"> - <input matInput placeholder="{{'lang.typeCurrentPassword' | translate}}" formControlName="currentPasswordCtrl" required [type]="hidePassword ? 'password' : 'text'"> - <mat-icon matSuffix (click)="hidePassword = !hidePassword" class="fa fa-2x" [ngClass]="[hidePassword ? 'fa-eye-slash' : 'fa-eye']"></mat-icon> - <mat-error *ngIf="firstFormGroup.controls['currentPasswordCtrl'].hasError('required')">{{'lang.requiredField' | translate}}</mat-error> - </mat-form-field> - <div style="text-align:center;color: rgba(0,0,0,0.54);font-size: 75%;">{{this.ruleText}}</div> - <mat-form-field style="padding:10px; width: 100%"> - <input matInput #inputPasswd placeholder="{{'lang.passwordConfirmation' | translate}}" formControlName="newPasswordCtrl" required - [type]="hidePassword ? 'password' : 'text'"> - <mat-icon matSuffix (click)="hidePassword = !hidePassword" class="fa fa-2x" [ngClass]="[hidePassword ? 'fa-eye-slash' : 'fa-eye']"></mat-icon> - <mat-hint *ngIf="validPassword"> - <i color="accent" class="fa fa-check"></i> - <span color="accent">{{'lang.passwordValid' | translate}}</span> - </mat-hint> - <mat-error>{{getErrorMessage()}}</mat-error> - </mat-form-field> - <mat-form-field style="padding:10px; width: 100%"> - <input matInput #inputPasswd2 placeholder="{{'lang.passwordConfirmation' | translate}}" required [type]="hidePassword ? 'password' : 'text'" - formControlName="retypePasswordCtrl"> - <mat-icon matSuffix (click)="hidePassword = !hidePassword" class="fa fa-2x" [ngClass]="[hidePassword ? 'fa-eye-slash' : 'fa-eye']"></mat-icon> - <mat-hint *ngIf="!firstFormGroup.controls['retypePasswordCtrl'].hasError('mismatch') && firstFormGroup.controls['retypePasswordCtrl'].value != ''"> - <i color="accent" class="fa fa-check"></i> - <span color="accent">{{'lang.passwordMatch' | translate}}</span> - </mat-hint> - <mat-error>{{'lang.passwordNotMatch' | translate}} !</mat-error> - </mat-form-field> - <div class="col-md-12 text-center" style="padding:10px; text-align: center"> - <button mat-raised-button type="submit" color="primary" style="margin: 10px" [disabled]="!firstFormGroup.valid">{{'lang.validate' | translate}}</button> - <button mat-raised-button type="button" color="default" (click)="logout()">{{'lang.logout' | translate}}</button> - </div> - </form> - <div *ngIf="passwordRules.renewal.enabled || passwordRules.historyLastUse.enabled" class="alert-warning" role="alert" [innerHTML]="otherRuleText"></div> - </mat-card> - </mat-sidenav-content> - </mat-sidenav-container> -</div> + </ion-item> + </form> + <ion-item color="warning" *ngIf="passwordRules.renewal.enabled || passwordRules.historyLastUse.enabled" class="alert-warning" role="alert" [innerHTML]="otherRuleText"></ion-item> +</ion-content>