From 7884e2544c759054b666c2e29894adb2ddfa4f10 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Wed, 12 Aug 2020 17:57:30 +0200
Subject: [PATCH] FEAT #13998 TIME 3 begin input registered mail

---
 .../issuing-site-input.component.html         | 32 +++++++
 .../issuing-site-input.component.scss         |  8 ++
 .../indexing/issuing-site-input.component.ts  | 85 +++++++++++++++++++
 src/frontend/app/document-form.module.ts      |  7 +-
 .../indexing-form.component.html              |  4 +
 .../indexing-form/indexing-form.component.ts  | 19 +++++
 src/lang/lang-fr.json                         |  3 +-
 7 files changed, 155 insertions(+), 3 deletions(-)
 create mode 100644 src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.html
 create mode 100644 src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.scss
 create mode 100644 src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts

diff --git a/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.html b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.html
new file mode 100644
index 00000000000..0fe6379a892
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.html
@@ -0,0 +1,32 @@
+<form>
+    <plugin-select-search
+        *ngIf="!loading"
+        [label]="'lang.issuingSite' | translate" [placeholderLabel]="'lang.issuingSite' | translate"
+        [formControlSelect]="control" [datas]="issuingSiteList"
+        (afterSelected)="afterSelected.emit($event);setAddress($event)" style="width:100%;">
+    </plugin-select-search>
+    <mat-card *ngIf="issuingSiteAddress !== null" color="primary">
+        <i class="fas fa-map-marked-alt address-icon"></i>
+        <div>
+            {{issuingSiteAddress.siteLabel}}
+        </div>
+        <div>
+            {{issuingSiteAddress.addressAdditional1}}
+        </div>
+        <div>
+            {{issuingSiteAddress.postOfficeLabel}}
+        </div>
+        <div>
+            {{issuingSiteAddress.addressNumber}} {{issuingSiteAddress.addressStreet}}
+        </div>
+        <div>
+            {{issuingSiteAddress.addressAdditional2}}
+        </div>
+        <div>
+            {{issuingSiteAddress.addressPostcode}} {{issuingSiteAddress.addressTown}}
+        </div>
+        <div *ngIf="registedMailType === 'RW'">
+            {{issuingSiteAddress.addressCountry}}
+        </div>
+    </mat-card>
+</form>
\ No newline at end of file
diff --git a/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.scss b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.scss
new file mode 100644
index 00000000000..3dbc8ffbba2
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.scss
@@ -0,0 +1,8 @@
+@import '../../../../../css/vars.scss';
+
+.address-icon {
+    position: absolute;
+    right: 10px;
+    font-size: 14px;
+    top: 10px;
+}
\ No newline at end of file
diff --git a/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts
new file mode 100644
index 00000000000..0a3d494da2f
--- /dev/null
+++ b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts
@@ -0,0 +1,85 @@
+import { Component, OnInit, Input, ViewChild, ElementRef, Output, EventEmitter } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { FormControl } from '@angular/forms';
+import { tap, catchError, finalize } from 'rxjs/operators';
+import { of } from 'rxjs/internal/observable/of';
+import { NotificationService } from '../../../../../service/notification/notification.service';
+
+@Component({
+    selector: 'app-issuing-site-input',
+    templateUrl: 'issuing-site-input.component.html',
+    styleUrls: [
+        'issuing-site-input.component.scss',
+        '../../../../indexation/indexing-form/indexing-form.component.scss'
+    ],
+})
+
+export class IssuingSiteInputComponent implements OnInit {
+
+    loading: boolean = false;
+
+    issuingSiteList: any[] = [];
+
+    issuingSiteAddress: any = null;
+
+    /**
+     * FormControl used when autocomplete is used in form and must be catched in a form control.
+     */
+    @Input() control: FormControl = new FormControl('');
+    @Input() registedMailType: string = null;
+
+
+    @Output() afterSelected = new EventEmitter<string>();
+
+    @ViewChild('autoCompleteInput', { static: true }) autoCompleteInput: ElementRef;
+
+    constructor(
+        public http: HttpClient,
+        private notify: NotificationService,
+    ) {
+
+    }
+
+    ngOnInit() {
+        if (this.registedMailType !== null) {
+            this.getIssuingSites(this.registedMailType);
+        }
+    }
+
+    getIssuingSites(registeredMailType: string) {
+        this.registedMailType = registeredMailType;
+        this.loading = true;
+        this.http.get(`../rest/registeredMail/ranges`).pipe(
+            tap((data: any) => {
+                this.issuingSiteAddress = null;
+                this.issuingSiteList = data['ranges'].filter((item: any) => item.registeredMailType === registeredMailType && item.status === 'OK').map((item: any) => {
+                    return {
+                        ...item,
+                        id : `${item.trackerNumber}#${item.siteId}`,
+                        label: `${item.siteLabel} (${item.customerAccountNumber})`,
+                        disabled: item.fullness === 100,
+                    };
+                });
+            }),
+            finalize(() => this.loading = false),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    setAddress(id: any) {
+        const siteId = id.split('#')[1];
+
+        this.http.get(`../rest/registeredMail/sites/${siteId}`).pipe(
+            tap((data: any) => {
+                this.issuingSiteAddress = data['site'];
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+}
diff --git a/src/frontend/app/document-form.module.ts b/src/frontend/app/document-form.module.ts
index 9b9c782866e..ab67eefda91 100644
--- a/src/frontend/app/document-form.module.ts
+++ b/src/frontend/app/document-form.module.ts
@@ -4,6 +4,7 @@ import { SharedModule } from './app-common.module';
 import { IndexingFormComponent } from './indexation/indexing-form/indexing-form.component';
 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 { InternationalizationModule } from '../service/translate/internationalization.module';
 import { TranslateService } from '@ngx-translate/core';
@@ -16,12 +17,14 @@ import { TranslateService } from '@ngx-translate/core';
     declarations: [
         IndexingFormComponent,
         TagInputComponent,
-        FolderInputComponent
+        FolderInputComponent,
+        IssuingSiteInputComponent
     ],
     exports: [
         IndexingFormComponent,
         TagInputComponent,
-        FolderInputComponent
+        FolderInputComponent,
+        IssuingSiteInputComponent
     ],
     entryComponents: [
     ],
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 a89eac24851..aec72b2c8ce 100644
--- a/src/frontend/app/indexation/indexing-form/indexing-form.component.html
+++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.html
@@ -201,6 +201,10 @@
                                     <app-address-ban-input [control]="arrFormControl[field.identifier]" [admin]="adminMode" style="width:100%;">
                                     </app-address-ban-input>
                                 </ng-container>
+                                <ng-container *ngIf="field.identifier === 'registeredMail_issuingSite'">
+                                    <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>
                             </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 b018f00708a..965e2c568fa 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 { FormControl, Validators, FormGroup, ValidationErrors, ValidatorFn, Abst
 import { DiffusionsListComponent } from '../../diffusions/diffusions-list.component';
 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';
 
 @Component({
     selector: 'app-indexing-form',
@@ -41,6 +42,7 @@ export class IndexingFormComponent implements OnInit {
     @Output() loadingFormEndEvent = new EventEmitter<string>();
 
     @ViewChild('appDiffusionsList', { static: false }) appDiffusionsList: DiffusionsListComponent;
+    @ViewChild('appIssuingSiteInput', { static: false }) appIssuingSiteInput: IssuingSiteInputComponent;
 
     fieldCategories: any[] = ['mail', 'contact', 'process', 'classifying'];
 
@@ -196,6 +198,14 @@ export class IndexingFormComponent implements OnInit {
             values: [],
             enabled: true,
         },
+        {
+            identifier: 'registeredMail_number',
+            label: this.translate.instant('lang.registeredMailNumber'),
+            type: 'string',
+            default_value: null,
+            values: [],
+            enabled: true,
+        },
     ];
     availableFieldsClone: any[] = [];
 
@@ -685,6 +695,9 @@ export class IndexingFormComponent implements OnInit {
 
                 } else if (elem.identifier === 'doctype') {
                     await this.setDoctypeField(elem);
+                } else if (elem.identifier === 'registeredMail_type') {
+                    elem.event = 'getIssuingSites';
+                    // await this.setDoctypeField(elem);
                 }
             }));
         }));
@@ -1118,6 +1131,12 @@ export class IndexingFormComponent implements OnInit {
         }
     }
 
+    getIssuingSites(field: any, value: any) {
+        if (!this.functions.empty(this.appIssuingSiteInput)) {
+            this.appIssuingSiteInput.getIssuingSites(value);
+        }
+    }
+
     getCheckboxListLabel(selectedItemId: any, items: any) {
         return items.filter((item: any) => item.id === selectedItemId)[0].label;
     }
diff --git a/src/lang/lang-fr.json b/src/lang/lang-fr.json
index 0cf72b9abab..fe2b8ddf26c 100644
--- a/src/lang/lang-fr.json
+++ b/src/lang/lang-fr.json
@@ -1910,5 +1910,6 @@
     "registredMailType": "Type de recommandé",
     "rangeNumber": "Plage",
     "currentNumber": "Numéro actuel",
-    "fullness": "Remplissage"
+    "fullness": "Remplissage",
+    "registeredMailNumber": "Numéro de recommandé"
 }
-- 
GitLab