From ed58124c11ab81f3a99322a2e6875aa1131660db Mon Sep 17 00:00:00 2001
From: "hamza.hramchi" <hamza.hramchi@xelians.fr>
Date: Tue, 25 May 2021 10:58:22 +0200
Subject: [PATCH] FEAT #16982 TIME 0:45 create visa workflow service

---
 src/frontend/app/app.module.ts                |   4 +-
 .../visa-workflow-models.component.html       |   6 +-
 .../models/visa-workflow-models.component.ts  | 103 +--------------
 .../visa-workflow.component.html              |   8 +-
 .../visa-workflow/visa-workflow.component.ts  | 105 +--------------
 .../app/service/visa-workflow.service.ts      | 125 ++++++++++++++++++
 6 files changed, 142 insertions(+), 209 deletions(-)
 create mode 100644 src/frontend/app/service/visa-workflow.service.ts

diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts
index 872d7ed026..220963d982 100755
--- a/src/frontend/app/app.module.ts
+++ b/src/frontend/app/app.module.ts
@@ -91,6 +91,7 @@ import { NotificationService } from './service/notification.service';
 import { SignaturesContentService } from './service/signatures.service';
 import { FiltersService } from './service/filters.service';
 import { SignatureMethodModalComponent } from './service/signature-method/signature-method-modal.component';
+import { VisaWorkflowService } from './service/visa-workflow.service';
 
 // OTHERS
 import { ConfirmComponent } from './plugins/confirm.component';
@@ -197,7 +198,8 @@ registerLocaleData(localeFr, 'fr-FR');
         NotificationService,
         { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
         CookieService,
-        LatinisePipe
+        LatinisePipe,
+        VisaWorkflowService
     ],
     bootstrap: [AppComponent],
     schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
diff --git a/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.html b/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.html
index 43a4eac100..d6143cc69c 100644
--- a/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.html
+++ b/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.html
@@ -2,15 +2,15 @@
     <ion-list-header>
         <ion-label color="secondary">{{'lang.circuitModels' | translate}}</ion-label>
     </ion-list-header>
-    <ion-item button *ngFor="let model of visaWorkflowModels" (click)="loadVisaWorkflow(model)">
+    <ion-item button *ngFor="let model of visaWorkflowService.visaWorkflowModels" (click)="loadVisaWorkflow(model)">
         <ion-label>{{model.title}}</ion-label>
         <ion-buttons slot="end">
-            <ion-button fill="clear" slot="icon-only" shape="round" color="danger" (click)="$event.stopPropagation();removeModel(model)">
+            <ion-button fill="clear" slot="icon-only" shape="round" color="danger" (click)="$event.stopPropagation(); visaWorkflowService.removeModel(model)">
                 <ion-icon slot="icon-only" name="trash-outline"></ion-icon>
             </ion-button>
         </ion-buttons>
     </ion-item>
-    <ion-item button (click)="createModel()" [disabled]="currentWorkflow.length === 0">
+    <ion-item button (click)="visaWorkflowService.createModel(currentWorkflow)" [disabled]="currentWorkflow.length === 0">
         <ion-icon color="primary" slot="start" name="add-circle-outline"></ion-icon>
         <ion-label color="primary">{{'lang.newTemplate' | translate}}</ion-label>
     </ion-item>
diff --git a/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.ts b/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.ts
index 991ec474d6..788391036a 100644
--- a/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.ts
+++ b/src/frontend/app/document/visa-workflow/models/visa-workflow-models.component.ts
@@ -6,6 +6,7 @@ import { catchError, tap } from 'rxjs/operators';
 import { of } from 'rxjs';
 import { AuthService } from '../../../service/auth.service';
 import { TranslateService } from '@ngx-translate/core';
+import { VisaWorkflowService } from '../../../service/visa-workflow.service';
 
 @Component({
     selector: 'app-visa-workflow-models',
@@ -24,108 +25,12 @@ export class VisaWorkflowModelsComponent implements OnInit {
         public popoverController: PopoverController,
         public alertController: AlertController,
         public notificationService: NotificationService,
-        public authService: AuthService
+        public authService: AuthService,
+        public visaWorkflowService: VisaWorkflowService
     ) { }
 
     ngOnInit(): void {
-        this.getVisaUserModels();
-    }
-
-    async createModel() {
-        const alert = await this.alertController.create({
-            header: this.translate.instant('lang.newTemplate'),
-            message: this.translate.instant('lang.newTemplateDesc'),
-            inputs: [
-                {
-                    name: 'title',
-                    type: 'text',
-                    placeholder: this.translate.instant('lang.label') + ' *',
-                },
-            ],
-            buttons: [
-                {
-                    text: this.translate.instant('lang.cancel'),
-                    role: 'cancel',
-                    handler: () => { }
-                }, {
-                    text: this.translate.instant('lang.validate'),
-                    handler: (data: any) => {
-                        if (data.title !== '') {
-                            this.saveModel(data.title);
-                            return true;
-                        } else {
-                            this.notificationService.error(this.translate.instant('lang.label') + ' ' + this.translate.instant('lang.mandatory'));
-                            return false;
-                        }
-                    }
-                }
-            ]
-        });
-
-        await alert.present();
-    }
-
-    saveModel(title: string) {
-        const objToSend: any = {
-            title: title,
-            items: this.currentWorkflow.map((item: any) => ({
-                userId: item.userId,
-                mode: this.authService.getWorkflowMode(item.role),
-                signatureMode: this.authService.getSignatureMode(item.role)
-            }))
-        };
-        this.http.post('../rest/workflowTemplates', objToSend).pipe(
-            tap((res: any) => {
-                this.notificationService.success('lang.modelCreated');
-                this.visaWorkflowModels.push({ id: res.id, title: title });
-            }),
-            catchError(err => {
-                this.notificationService.handleErrors(err);
-                return of(false);
-            })
-        ).subscribe();
-    }
-
-    async removeModel(model: any) {
-        const alert = await this.alertController.create({
-            header: this.translate.instant('lang.delete'),
-            message: this.translate.instant('lang.deleteTemplate'),
-            buttons: [
-                {
-                    text: this.translate.instant('lang.no'),
-                    role: 'cancel',
-                    handler: () => { }
-                }, {
-                    text: this.translate.instant('lang.yes'),
-                    handler: () => {
-                        this.http.delete(`../rest/workflowTemplates/${model.id}`).pipe(
-                            tap(() => {
-                                this.visaWorkflowModels = this.visaWorkflowModels.filter((item: any) => item.id !== model.id);
-                                this.notificationService.success(`Modèle ${model.title} supprimé`);
-                            }),
-                            catchError(err => {
-                                this.notificationService.handleErrors(err);
-                                return of(false);
-                            })
-                        ).subscribe();
-                    }
-                }
-            ]
-        });
-
-        await alert.present();
-    }
-
-    getVisaUserModels() {
-        this.http.get('../rest/workflowTemplates').pipe(
-            tap((data: any) => {
-                this.visaWorkflowModels = data.workflowTemplates;
-            }),
-            catchError(err => {
-                this.notificationService.handleErrors(err);
-                return of(false);
-            })
-        ).subscribe();
+        this.visaWorkflowService.getVisaUserModels(this.currentWorkflow);
     }
 
     loadVisaWorkflow(model: any) {
diff --git a/src/frontend/app/document/visa-workflow/visa-workflow.component.html b/src/frontend/app/document/visa-workflow/visa-workflow.component.html
index af899c7c83..a8342ff82c 100644
--- a/src/frontend/app/document/visa-workflow/visa-workflow.component.html
+++ b/src/frontend/app/document/visa-workflow/visa-workflow.component.html
@@ -31,19 +31,19 @@
                         <ion-label style="font-size: 14px;">{{'lang.newOtp' | translate}}</ion-label>
                     </ion-item>
                     <button mat-menu-item [matMenuTriggerFor]="model"
-                        (menuOpened)="getVisaUserModels()">{{'lang.circuitModels' | translate}}</button>
+                        (menuOpened)="visaWorkflowService.getVisaUserModels(visaWorkflow)">{{'lang.circuitModels' | translate}}</button>
                 </mat-menu>
                 <mat-menu #model="matMenu">
-                    <ion-item button lines="none" *ngFor="let model of visaWorkflowModels" (click)="loadVisaWorkflow(model)">
+                    <ion-item button lines="none" *ngFor="let model of visaWorkflowService.visaWorkflowModels" (click)="loadVisaWorkflow(model)">
                         <ion-label style="font-size: 14px;">{{model.title}}</ion-label>
                         <ion-buttons slot="end">
                             <ion-button fill="clear" slot="icon-only" shape="round" color="danger"
-                                (click)="$event.stopPropagation();removeModel(model)">
+                                (click)="$event.stopPropagation(); visaWorkflowService.removeModel(model)">
                                 <ion-icon slot="icon-only" name="trash-outline"></ion-icon>
                             </ion-button>
                         </ion-buttons>
                     </ion-item>
-                    <ion-item button (click)="createModel()" [disabled]="visaWorkflow.length === 0 || notExternalUsers.length === 0">
+                    <ion-item button (click)="visaWorkflowService.createModel(visaWorkflow)" [disabled]="visaWorkflow.length === 0 || visaWorkflowService.notExternalUsers === 0">
                         <ion-label style="font-size: 14px;">{{'lang.newTemplate' | translate}}</ion-label>
                     </ion-item>
                 </mat-menu>
diff --git a/src/frontend/app/document/visa-workflow/visa-workflow.component.ts b/src/frontend/app/document/visa-workflow/visa-workflow.component.ts
index fd13fa2139..8775c73a7a 100644
--- a/src/frontend/app/document/visa-workflow/visa-workflow.component.ts
+++ b/src/frontend/app/document/visa-workflow/visa-workflow.component.ts
@@ -11,6 +11,7 @@ import { TranslateService } from '@ngx-translate/core';
 import { OtpCreateComponent } from './otps/otp-create.component';
 import { OtpService } from './otps/otp.service';
 import { VisaWorkflowModelsComponent } from './models/visa-workflow-models.component';
+import { VisaWorkflowService } from '../../service/visa-workflow.service';
 
 @Component({
     selector: 'app-visa-workflow',
@@ -32,8 +33,6 @@ export class VisaWorkflowComponent implements OnInit {
         header: 'Roles'
     };
     roles: any[] = [];
-    visaWorkflowModels: any[] = [];
-    notExternalUsers: any[] = [];
     hasConnector: boolean = false;
 
     constructor(
@@ -45,7 +44,8 @@ export class VisaWorkflowComponent implements OnInit {
         public notificationService: NotificationService,
         public modalController: ModalController,
         private otpService: OtpService,
-        public popoverController: PopoverController
+        public popoverController: PopoverController,
+        public visaWorkflowService: VisaWorkflowService
     ) { }
 
     async ngOnInit(): Promise<void> {
@@ -241,92 +241,6 @@ export class VisaWorkflowComponent implements OnInit {
         }
     }
 
-    async createModel() {
-        const checkExternalUsers: number = this.visaWorkflow.filter((user: any) => user.userId === null).length;
-        const alert = await this.alertController.create({
-            header: this.translate.instant('lang.newTemplate'),
-            message: this.translate.instant(checkExternalUsers === 0 ? 'lang.newTemplateDesc' : 'lang.newTemplateDescWithOtp'),
-            inputs: [
-                {
-                    name: 'title',
-                    type: 'text',
-                    placeholder: this.translate.instant('lang.label') + ' *',
-                },
-            ],
-            buttons: [
-                {
-                    text: this.translate.instant('lang.cancel'),
-                    role: 'cancel',
-                    handler: () => { }
-                }, {
-                    text: this.translate.instant('lang.validate'),
-                    handler: (data: any) => {
-                        if (data.title !== '') {
-                            this.saveModel(data.title);
-                            return true;
-                        } else {
-                            this.notificationService.error(this.translate.instant('lang.label') + ' ' + this.translate.instant('lang.mandatory'));
-                            return false;
-                        }
-                    }
-                }
-            ]
-        });
-
-        await alert.present();
-    }
-
-    saveModel(title: string) {
-        const objToSend: any = {
-            title: title,
-            items: this.visaWorkflow.filter((user: any) => user.userId !== null).map((item: any) => ({
-                userId: item.userId,
-                mode: this.authService.getWorkflowMode(item.role),
-                signatureMode: this.authService.getSignatureMode(item.role)
-            }))
-        };
-        this.http.post('../rest/workflowTemplates', objToSend).pipe(
-            tap((res: any) => {
-                this.notificationService.success('lang.modelCreated');
-                this.visaWorkflowModels.push({ id: res.id, title: title });
-            }),
-            catchError(err => {
-                this.notificationService.handleErrors(err);
-                return of(false);
-            })
-        ).subscribe();
-    }
-
-    async removeModel(model: any) {
-        const alert = await this.alertController.create({
-            header: this.translate.instant('lang.delete'),
-            message: this.translate.instant('lang.deleteTemplate'),
-            buttons: [
-                {
-                    text: this.translate.instant('lang.no'),
-                    role: 'cancel',
-                    handler: () => { }
-                }, {
-                    text: this.translate.instant('lang.yes'),
-                    handler: () => {
-                        this.http.delete(`../rest/workflowTemplates/${model.id}`).pipe(
-                            tap(() => {
-                                this.visaWorkflowModels = this.visaWorkflowModels.filter((item: any) => item.id !== model.id);
-                                this.notificationService.success(`Modèle ${model.title} supprimé`);
-                            }),
-                            catchError(err => {
-                                this.notificationService.handleErrors(err);
-                                return of(false);
-                            })
-                        ).subscribe();
-                    }
-                }
-            ]
-        });
-
-        await alert.present();
-    }
-
     loadVisaWorkflow(model: any) {
         this.http.get(`../rest/workflowTemplates/${model.id}`).pipe(
             tap((data: any) => {
@@ -354,19 +268,6 @@ export class VisaWorkflowComponent implements OnInit {
         ).subscribe();
     }
 
-    getVisaUserModels() {
-        this.http.get('../rest/workflowTemplates').pipe(
-            tap((data: any) => {
-                this.visaWorkflowModels = data.workflowTemplates;
-                this.notExternalUsers = this.visaWorkflow.filter((user: any) => user.userId !== null);
-            }),
-            catchError(err => {
-                this.notificationService.handleErrors(err);
-                return of(false);
-            })
-        ).subscribe();
-    }
-
     getConnectors() {
         return new Promise((resolve) => {
             this.http.get('../rest/connectors').pipe(
diff --git a/src/frontend/app/service/visa-workflow.service.ts b/src/frontend/app/service/visa-workflow.service.ts
new file mode 100644
index 0000000000..049a81ba34
--- /dev/null
+++ b/src/frontend/app/service/visa-workflow.service.ts
@@ -0,0 +1,125 @@
+import { HttpClient } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { AlertController, ModalController, PopoverController } from '@ionic/angular';
+import { TranslateService } from '@ngx-translate/core';
+import { of } from 'rxjs';
+import { catchError, tap } from 'rxjs/operators';
+import { AuthService } from './auth.service';
+import { NotificationService } from './notification.service';
+
+@Injectable()
+export class VisaWorkflowService {
+
+    visaWorkflowModels: any[] =  [];
+    notExternalUsers: number = 0;
+
+    constructor(
+        public http: HttpClient,
+        public authService: AuthService,
+        public alertController: AlertController,
+        private translate: TranslateService,
+        public notificationService: NotificationService,
+        public modalController: ModalController,
+        public popoverController: PopoverController,
+
+    ) { }
+
+    getVisaUserModels(visaWorkflow: any[]) {
+        this.http.get('../rest/workflowTemplates').pipe(
+            tap((data: any) => {
+                this.visaWorkflowModels = data.workflowTemplates;
+                this.notExternalUsers = visaWorkflow.filter((user: any) => user.userId !== null).length;
+            }),
+            catchError(err => {
+                this.notificationService.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    async createModel(currentWorkflow: any[]) {
+        const alert = await this.alertController.create({
+            header: this.translate.instant('lang.newTemplate'),
+            message: this.translate.instant('lang.newTemplateDesc'),
+            inputs: [
+                {
+                    name: 'title',
+                    type: 'text',
+                    placeholder: this.translate.instant('lang.label') + ' *',
+                },
+            ],
+            buttons: [
+                {
+                    text: this.translate.instant('lang.cancel'),
+                    role: 'cancel',
+                    handler: () => { }
+                }, {
+                    text: this.translate.instant('lang.validate'),
+                    handler: (data: any) => {
+                        if (data.title !== '') {
+                            this.saveModel(data.title, currentWorkflow);
+                            return true;
+                        } else {
+                            this.notificationService.error(this.translate.instant('lang.label') + ' ' + this.translate.instant('lang.mandatory'));
+                            return false;
+                        }
+                    }
+                }
+            ]
+        });
+
+        await alert.present();
+    }
+
+    saveModel(title: string, currentWorkflow: any[]) {
+        const objToSend: any = {
+            title: title,
+            items: currentWorkflow.filter((user: any) => user.userId !== null).map((item: any) => ({
+                userId: item.userId,
+                mode: this.authService.getWorkflowMode(item.role),
+                signatureMode: this.authService.getSignatureMode(item.role)
+            }))
+        };
+        this.http.post('../rest/workflowTemplates', objToSend).pipe(
+            tap((res: any) => {
+                this.notificationService.success('lang.modelCreated');
+                this.visaWorkflowModels.push({ id: res.id, title: title });
+            }),
+            catchError(err => {
+                this.notificationService.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    async removeModel(model: any) {
+        const alert = await this.alertController.create({
+            header: this.translate.instant('lang.delete'),
+            message: this.translate.instant('lang.deleteTemplate'),
+            buttons: [
+                {
+                    text: this.translate.instant('lang.no'),
+                    role: 'cancel',
+                    handler: () => { }
+                }, {
+                    text: this.translate.instant('lang.yes'),
+                    handler: () => {
+                        this.http.delete(`../rest/workflowTemplates/${model.id}`).pipe(
+                            tap(() => {
+                                this.visaWorkflowModels = this.visaWorkflowModels.filter((item: any) => item.id !== model.id);
+                                this.notificationService.success(`Modèle ${model.title} supprimé`);
+                            }),
+                            catchError(err => {
+                                this.notificationService.handleErrors(err);
+                                return of(false);
+                            })
+                        ).subscribe();
+                    }
+                }
+            ]
+        });
+
+        await alert.present();
+    }
+
+}
-- 
GitLab