From 66ade7dbd7793bf7fa15cc18ab37dec2cd89b9a8 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Mon, 31 Aug 2020 19:12:58 +0200
Subject: [PATCH] FEAT #13998 TIME 4 add recipient registered mail input

---
 .../indexing/recipient-input.component.html   | 105 ++++++++++++++++
 .../indexing/recipient-input.component.scss   |  32 +++++
 .../indexing/recipient-input.component.ts     | 113 ++++++++++++++++++
 src/frontend/app/document-form.module.ts      |   7 +-
 .../app/indexation/indexation.component.ts    |   4 +-
 .../indexing-form.component.html              |   4 +
 .../indexing-form/indexing-form.component.ts  |   6 +-
 7 files changed, 266 insertions(+), 5 deletions(-)
 create mode 100644 src/frontend/app/administration/registered-mail/indexing/recipient-input.component.html
 create mode 100644 src/frontend/app/administration/registered-mail/indexing/recipient-input.component.scss
 create mode 100644 src/frontend/app/administration/registered-mail/indexing/recipient-input.component.ts

diff --git a/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.html b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.html
new file mode 100644
index 00000000000..1a7bcec24aa
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.html
@@ -0,0 +1,105 @@
+<mat-form-field appearance='outline' class="smallInput">
+    <button mat-button matSuffix [matMenuTriggerFor]="menuDep" (click)="$event.stopPropagation();"
+        [title]="this.translate.instant('lang.targetDepartment')">
+        {{addressBANCurrentDepartment}}&nbsp;<i class="fa fa-chevron-down"></i>
+    </button>
+    <mat-menu #menuDep="matMenu">
+        <button mat-menu-item *ngFor="let dep of departmentList"
+            (click)="addressBANCurrentDepartment = dep">{{dep}}</button>
+    </mat-menu>
+    <mat-icon color="primary" class="fa fa-search" matPrefix style="font-size: 15px;">
+    </mat-icon>
+    <input type="text" #autoCompleteInput [placeholder]="this.translate.instant('lang.searchAddressBan')" matInput
+        [formControl]="addressBANControl" [matAutocomplete]="auto" (click)="$event.stopPropagation()"
+        (focus)="resetAutocompleteAddressBan()" maxlength="128">
+    <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectAddressBan($event)">
+        <ng-container *ngIf="addressBANResult.length > 0 && !addressBANLoading">
+            <mat-option *ngFor="let addressBANResult of addressBANFilteredResult | async" [value]="addressBANResult" [title]="addressBANResult.address">
+                {{addressBANResult.address}}
+            </mat-option>
+        </ng-container>
+        <mat-option class="autoCompleteInfoResult smallInputInfo"
+            *ngIf="addressBANResult.length === 0 && !addressBANLoading" disabled [innerHTML]="addressBANInfo">
+        </mat-option>
+        <mat-option *ngIf="addressBANLoading" disabled>
+            <mat-spinner diameter="20"></mat-spinner>
+        </mat-option>
+    </mat-autocomplete>
+</mat-form-field>
+<mat-card color="primary" *ngIf="manualAddress">
+    <button mat-icon-button class="address-icon" (click)="manualAddress=!manualAddress" [title]="'Afficher l\'adresse'">
+        <mat-icon class="fa fa-eye"></mat-icon>
+    </button>
+    <form style="display: contents;" (ngSubmit)="onSubmit()" [formGroup]="adminFormGroup">
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_company' | translate}}</mat-label>
+            <input matInput formControlName="company">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_civility' | translate}}</mat-label>
+            <input matInput formControlName="civility">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_firstname' | translate}}</mat-label>
+            <input matInput formControlName="firstname">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_lastname' | translate}}</mat-label>
+            <input matInput formControlName="lastname">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_addressNumber' | translate}}</mat-label>
+            <input matInput formControlName="addressNumber">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_addressStreet' | translate}}</mat-label>
+            <input matInput formControlName="addressStreet">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_addressAdditional1' | translate}}</mat-label>
+            <input matInput formControlName="addressAdditional1">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_addressAdditional2' | translate}}</mat-label>
+            <input matInput formControlName="addressAdditional2">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_addressPostcode' | translate}}</mat-label>
+            <input matInput formControlName="addressPostcode">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_addressTown' | translate}}</mat-label>
+            <input matInput formControlName="addressTown">
+        </mat-form-field>
+        <mat-form-field floatLabel="always">
+            <mat-label>{{'lang.contactsParameters_addressCountry' | translate}}</mat-label>
+            <input matInput formControlName="addressCountry">
+        </mat-form-field>
+    </form>
+</mat-card>
+<mat-card color="primary" *ngIf="!manualAddress">
+    <button mat-icon-button class="address-icon" (click)="manualAddress=!manualAddress" [title]="'Editer l\'adresse'">
+        <mat-icon class="fa fa-edit"></mat-icon>
+    </button>
+    <div>
+        {{adminFormGroup.controls['company'].value}}
+    </div>
+    <div>
+        {{adminFormGroup.controls['civility'].value}} {{adminFormGroup.controls['firstname'].value}} {{adminFormGroup.controls['lastname'].value}}
+    </div>
+    <div>
+        {{adminFormGroup.controls['addressAdditional1'].value}}
+    </div>
+    <div>
+        {{adminFormGroup.controls['addressNumber'].value}} {{adminFormGroup.controls['addressStreet'].value}}
+    </div>
+    <div>
+        {{adminFormGroup.controls['addressAdditional2'].value}}
+    </div>
+    <div>
+        {{adminFormGroup.controls['addressPostcode'].value}} {{adminFormGroup.controls['addressTown'].value}}
+    </div>
+    <div>
+        {{adminFormGroup.controls['addressCountry'].value}}
+    </div>
+</mat-card>
\ No newline at end of file
diff --git a/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.scss b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.scss
new file mode 100644
index 00000000000..cf8353dc8c7
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.scss
@@ -0,0 +1,32 @@
+@import '../../../../css/vars.scss';
+
+.smallInput {
+    width: 230px !important;
+    font-size: 11px;
+
+    .mat-button {
+        width: 30px;
+        height: 25px;
+        color: $primary;
+
+        ::ng-deep.mat-button-wrapper {
+            display: flex;
+            line-height: initial;
+            align-items: center;
+        }
+    }
+
+    ::ng-deep.mat-form-field-infix {
+        padding: 0px;
+        padding-bottom: 5px;
+    }
+}
+
+.address-icon {
+    cursor: pointer;
+    z-index: 2;
+    position: absolute;
+    right: 0px;
+    font-size: 14px;
+    top: 0px;
+}
\ No newline at end of file
diff --git a/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.ts b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.ts
new file mode 100644
index 00000000000..61dc915b2b2
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.ts
@@ -0,0 +1,113 @@
+import { Component, OnInit } from '@angular/core';
+import { FormControl, FormGroup, Validators, FormBuilder } from '@angular/forms';
+import { Observable } from 'rxjs/internal/Observable';
+import { HttpClient } from '@angular/common/http';
+import { TranslateService } from '@ngx-translate/core';
+import { NotificationService } from '../../../../service/notification/notification.service';
+import { tap, catchError, debounceTime, filter, distinctUntilChanged, switchMap } from 'rxjs/operators';
+import { of } from 'rxjs/internal/observable/of';
+
+@Component({
+    selector: 'app-registered-mail-recipient-input',
+    templateUrl: './recipient-input.component.html',
+    styleUrls: ['./recipient-input.component.scss']
+})
+export class RegisteredMailRecipientInputComponent implements OnInit {
+
+    adminFormGroup: FormGroup;
+    manualAddress: boolean = false;
+
+    addressBANInfo: string = '';
+    addressBANMode: boolean = true;
+    addressBANControl = new FormControl();
+    addressBANLoading: boolean = false;
+    addressBANResult: any[] = [];
+    addressBANFilteredResult: Observable<string[]>;
+    addressBANCurrentDepartment: string = '75';
+    departmentList: any[] = [];
+
+    constructor(
+        public translate: TranslateService,
+        public http: HttpClient,
+        private _formBuilder: FormBuilder,
+        private notify: NotificationService,
+    ) { }
+
+    ngOnInit(): void {
+        this.initBanSearch();
+        this.initAutocompleteAddressBan();
+        this.adminFormGroup = this._formBuilder.group({
+            company: ['', Validators.required],
+            civility: ['', Validators.required],
+            firstname: ['', Validators.required],
+            lastname: ['', Validators.required],
+            addressNumber: ['', Validators.required],
+            addressStreet: ['', Validators.required],
+            addressAdditional1: [''],
+            addressAdditional2: [''],
+            addressPostcode: ['', Validators.required],
+            addressTown: ['', Validators.required],
+            addressCountry: ['']
+        });
+    }
+
+    initBanSearch() {
+        this.http.get('../rest/ban/availableDepartments').pipe(
+            tap((data: any) => {
+                if (data.default !== null && data.departments.indexOf(data.default.toString()) !== - 1) {
+                    this.addressBANCurrentDepartment = data.default;
+                }
+                this.departmentList = data.departments;
+            }),
+            catchError((err: any) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    initAutocompleteAddressBan() {
+        this.addressBANInfo = this.translate.instant('lang.autocompleteInfo');
+        this.addressBANResult = [];
+        this.addressBANControl.valueChanges
+            .pipe(
+                debounceTime(300),
+                filter(value => value.length > 2),
+                distinctUntilChanged(),
+                tap(() => this.addressBANLoading = true),
+                switchMap((data: any) => this.http.get('../rest/autocomplete/banAddresses', { params: { 'address': data, 'department': this.addressBANCurrentDepartment } })),
+                tap((data: any) => {
+                    if (data.length === 0) {
+                        this.addressBANInfo = this.translate.instant('lang.noAvailableValue');
+                    } else {
+                        this.addressBANInfo = '';
+                    }
+                    this.addressBANResult = data;
+                    this.addressBANFilteredResult = of(this.addressBANResult);
+                    this.addressBANLoading = false;
+                })
+            ).subscribe();
+    }
+
+    resetAutocompleteAddressBan() {
+        this.addressBANResult = [];
+        this.addressBANInfo = this.translate.instant('lang.autocompleteInfo');
+    }
+
+    selectAddressBan(ev: any) {
+        this.adminFormGroup.controls['addressNumber'].setValue(ev.option.value.number);
+        this.adminFormGroup.controls['addressStreet'].setValue(ev.option.value.afnorName);
+        this.adminFormGroup.controls['addressPostcode'].setValue(ev.option.value.postalCode);
+        this.adminFormGroup.controls['addressTown'].setValue(ev.option.value.city);
+        this.adminFormGroup.controls['addressCountry'].setValue('FRANCE');
+        this.addressBANControl.setValue('');
+    }
+
+    getFormatedAdress() {
+        const formatedAddress = {};
+        Object.keys(this.adminFormGroup.controls).forEach(key => {
+            formatedAddress[key] = this.adminFormGroup.controls[key].value;
+        });
+        return formatedAddress;
+    }
+}
diff --git a/src/frontend/app/document-form.module.ts b/src/frontend/app/document-form.module.ts
index ab67eefda91..25b130d74dc 100644
--- a/src/frontend/app/document-form.module.ts
+++ b/src/frontend/app/document-form.module.ts
@@ -5,6 +5,7 @@ import { IndexingFormComponent } from './indexation/indexing-form/indexing-form.
 import { TagInputComponent } from './tag/indexing/tag-input.component';
 import { FolderInputComponent } from '../app/folder/indexing/folder-input.component';
 import { IssuingSiteInputComponent } from '../app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component';
+import { RegisteredMailRecipientInputComponent } from '../app/administration/registered-mail/indexing/recipient-input.component';
 
 import { InternationalizationModule } from '../service/translate/internationalization.module';
 import { TranslateService } from '@ngx-translate/core';
@@ -18,13 +19,15 @@ import { TranslateService } from '@ngx-translate/core';
         IndexingFormComponent,
         TagInputComponent,
         FolderInputComponent,
-        IssuingSiteInputComponent
+        IssuingSiteInputComponent,
+        RegisteredMailRecipientInputComponent
     ],
     exports: [
         IndexingFormComponent,
         TagInputComponent,
         FolderInputComponent,
-        IssuingSiteInputComponent
+        IssuingSiteInputComponent,
+        RegisteredMailRecipientInputComponent
     ],
     entryComponents: [
     ],
diff --git a/src/frontend/app/indexation/indexation.component.ts b/src/frontend/app/indexation/indexation.component.ts
index d87074287d2..fdbf414bdb1 100644
--- a/src/frontend/app/indexation/indexation.component.ts
+++ b/src/frontend/app/indexation/indexation.component.ts
@@ -155,7 +155,7 @@ export class IndexationComponent implements OnInit {
     onSubmit() {
         if (this.indexingForm.isValidForm()) {
             this.actionService.loading = true;
-            const formatdatas = this.formatDatas(this.indexingForm.getDatas());
+            const formatdatas = this.indexingForm.formatDatas(this.indexingForm.getDatas());
 
             formatdatas['modelId'] = this.currentIndexingModel.master !== null ? this.currentIndexingModel.master : this.currentIndexingModel.id;
             formatdatas['chrono'] = true;
@@ -271,7 +271,7 @@ export class IndexationComponent implements OnInit {
     }
 
     refreshDatas() {
-        this.appDocumentViewer.setDatas(this.formatDatas(this.indexingForm.getDatas()));
+        this.appDocumentViewer.setDatas(this.indexingForm.formatDatas(this.indexingForm.getDatas()));
     }
 
 }
diff --git a/src/frontend/app/indexation/indexing-form/indexing-form.component.html b/src/frontend/app/indexation/indexing-form/indexing-form.component.html
index cd934d94b07..1533261e563 100644
--- a/src/frontend/app/indexation/indexing-form/indexing-form.component.html
+++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.html
@@ -207,6 +207,10 @@
                                     <app-issuing-site-input #appIssuingSiteInput [registedMailType]="arrFormControl['registeredMail_type'].value" [control]="arrFormControl[field.identifier]" (afterSelected)="launchEvent($event, field)" style="width:100%;">
                                     </app-issuing-site-input>
                                 </ng-container>
+                                <ng-container *ngIf="field.identifier === 'registeredMail_recipient'">
+                                    <app-registered-mail-recipient-input #appRegisteredMailRecipientInput [control]="arrFormControl[field.identifier]" style="width:100%;">
+                                    </app-registered-mail-recipient-input>
+                                </ng-container>
                             </div>
                             <div class="fieldState">
                                 <i class="fas fa-asterisk fieldRequired"
diff --git a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts
index 377bdcdfb4a..650e21b031e 100755
--- a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts
+++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts
@@ -14,6 +14,7 @@ import { DiffusionsListComponent } from '../../diffusions/diffusions-list.compon
 import { FunctionsService } from '../../../service/functions.service';
 import { ConfirmComponent } from '../../../plugins/modal/confirm.component';
 import { IssuingSiteInputComponent } from '../../administration/registered-mail/issuing-site/indexing/issuing-site-input.component';
+import { RegisteredMailRecipientInputComponent } from '../../administration/registered-mail/indexing/recipient-input.component';
 
 @Component({
     selector: 'app-indexing-form',
@@ -40,6 +41,7 @@ export class IndexingFormComponent implements OnInit {
 
     @ViewChild('appDiffusionsList', { static: false }) appDiffusionsList: DiffusionsListComponent;
     @ViewChild('appIssuingSiteInput', { static: false }) appIssuingSiteInput: IssuingSiteInputComponent;
+    @ViewChild('appRegisteredMailRecipientInput', { static: false }) appRegisteredMailRecipientInput: RegisteredMailRecipientInputComponent;
 
     fieldCategories: any[] = ['mail', 'contact', 'process', 'classifying'];
 
@@ -222,7 +224,7 @@ export class IndexingFormComponent implements OnInit {
         {
             identifier: 'registeredMail_recipient',
             label: this.translate.instant('lang.registeredMailRecipient'),
-            type: 'string',
+            type: 'registeredMailRecipient',
             default_value: null,
             values: [],
             enabled: true,
@@ -490,6 +492,8 @@ export class IndexingFormComponent implements OnInit {
 
                 formatData['customFields'][element.identifier.split('_')[1]] = element.default_value;
 
+            } else if (element.identifier === 'registeredMail_recipient') {
+                formatData[element.identifier] = this.appRegisteredMailRecipientInput.getFormatedAdress();
             } else {
                 formatData[element.identifier] = element.default_value;
             }
-- 
GitLab