From 73d9564dba3b495a1cc458eb4782daa3c2d35b6f Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Fri, 4 Sep 2020 16:04:53 +0200
Subject: [PATCH] FEAT #14458 TIME 4:30 front contacts import + fix some issues

---
 .../list/import/contact-import.component.html |  14 +-
 .../list/import/contact-import.component.ts   | 124 +++++++++++++++---
 .../user/import/users-import.component.html   |   2 +-
 .../user/import/users-import.component.ts     |   4 +-
 src/frontend/app/process/process.component.ts |   2 -
 src/lang/lang-fr.json                         |   5 +-
 6 files changed, 118 insertions(+), 33 deletions(-)

diff --git a/src/frontend/app/administration/contact/list/import/contact-import.component.html b/src/frontend/app/administration/contact/list/import/contact-import.component.html
index ca1f7d67fa0..abf0f4f4feb 100644
--- a/src/frontend/app/administration/contact/list/import/contact-import.component.html
+++ b/src/frontend/app/administration/contact/list/import/contact-import.component.html
@@ -3,7 +3,7 @@
     <div mat-dialog-content>
         <mat-toolbar class="import-tool" [class.hide]="csvData.length === 0 || loading">
             <span style="flex:1;">
-                <mat-slide-toggle color="primary" [checked]="hasHeader" (change)="toggleHeader()">En-tête csv
+                <mat-slide-toggle color="primary" [checked]="hasHeader" (change)="toggleHeader()">{{'lang.csvHeader' | translate}}
                 </mat-slide-toggle>
             </span>
             <span style="flex:1;text-align: center;"><i class="fa fa-users"
@@ -48,16 +48,16 @@
                 <div style="overflow: auto;">
                     <mat-table *ngIf="csvData.length > 0" #table [dataSource]="dataSource" style="width:5000px;">
                         <ng-container *ngFor="let column of contactColumns;let i=index;">
-                            <ng-container [matColumnDef]="column">
+                            <ng-container [matColumnDef]="column.id">
                                 <mat-header-cell *matHeaderCellDef>
                                     <i class="fas fa-database" color="primary"
                                         [title]="'lang.dbColumn' | translate"></i>&nbsp;<b color="primary"
-                                        [title]="'lang.dbColumn' | translate">{{column}}</b>
+                                        [title]="'lang.dbColumn' | translate">{{column.label}}</b>
                                     &nbsp;<i class="fas fa-arrows-alt-h"></i>&nbsp;
                                     <i class="fas fa-file-csv" [title]="'lang.csvColumn' | translate"></i>&nbsp;
                                     <mat-form-field [title]="'lang.csvColumn' | translate"
                                         (click)="$event.stopPropagation()" style="width: 80px !important;">
-                                        <mat-select [(ngModel)]="associatedColmuns[column]"
+                                        <mat-select [(ngModel)]="associatedColmuns[column.id]"
                                             (selectionChange)="changeColumn(column, $event.value)">
                                             <mat-option value=""></mat-option>
                                             <mat-option *ngFor="let col of csvColumns" [value]="col">
@@ -67,12 +67,12 @@
                                     </mat-form-field>
                                 </mat-header-cell>
                                 <mat-cell *matCellDef="let element">
-                                    {{element[column]}}
+                                    {{element[column.id]}}
                                 </mat-cell>
                             </ng-container>
                         </ng-container>
-                        <mat-header-row *matHeaderRowDef="contactColumns"></mat-header-row>
-                        <mat-row *matRowDef="let row; columns: contactColumns;"></mat-row>
+                        <mat-header-row *matHeaderRowDef="getcontactColumnsIds()"></mat-header-row>
+                        <mat-row *matRowDef="let row; columns: getcontactColumnsIds();"></mat-row>
                     </mat-table>
                 </div>
             </div>
diff --git a/src/frontend/app/administration/contact/list/import/contact-import.component.ts b/src/frontend/app/administration/contact/list/import/contact-import.component.ts
index 6d0f243d463..d3d1cb0e65b 100644
--- a/src/frontend/app/administration/contact/list/import/contact-import.component.ts
+++ b/src/frontend/app/administration/contact/list/import/contact-import.component.ts
@@ -6,7 +6,7 @@ import { TranslateService } from '@ngx-translate/core';
 import { MatTableDataSource } from '@angular/material/table';
 import { FunctionsService } from '../../../../../service/functions.service';
 import { ConfirmComponent } from '../../../../../plugins/modal/confirm.component';
-import { filter, exhaustMap, tap, catchError } from 'rxjs/operators';
+import { filter, exhaustMap, tap, catchError, map } from 'rxjs/operators';
 import { of } from 'rxjs/internal/observable/of';
 import { AlertComponent } from '../../../../../plugins/modal/alert.component';
 import { LocalStorageService } from '../../../../../service/local-storage.service';
@@ -20,7 +20,7 @@ import { MatPaginator } from '@angular/material/paginator';
 export class ContactImportComponent implements OnInit {
 
     loading: boolean = false;
-    contactColumns: string[] = [
+    /*contactColumns: string[] = [
         'id',
         'company',
         'civility',
@@ -36,8 +36,73 @@ export class ContactImportComponent implements OnInit {
         'addressPostcode',
         'addressTown',
         'addressCountry',
-        'communicationMeans',
-        'externalId_m2m',
+    ];*/
+
+    contactColumns: any[] = [
+        {
+            id: 'id',
+            label: this.translate.instant('lang.id')
+        },
+        {
+            id: 'company',
+            label: this.translate.instant('lang.contactsParameters_company')
+        },
+        {
+            id: 'civility',
+            label: this.translate.instant('lang.contactsParameters_civility')
+        },
+        {
+            id: 'firstname',
+            label: this.translate.instant('lang.contactsParameters_firstname')
+        },
+        {
+            id: 'lastname',
+            label: this.translate.instant('lang.contactsParameters_lastname')
+        },
+        {
+            id: 'function',
+            label: this.translate.instant('lang.contactsParameters_function')
+        },
+        {
+            id: 'department',
+            label: this.translate.instant('lang.contactsParameters_department')
+        },
+        {
+            id: 'email',
+            label: this.translate.instant('lang.contactsParameters_email')
+        },
+        {
+            id: 'phone',
+            label: this.translate.instant('lang.contactsParameters_phone')
+        },
+        {
+            id: 'addressAdditional1',
+            label: this.translate.instant('lang.contactsParameters_addressAdditional1')
+        },
+        {
+            id: 'addressNumber',
+            label: this.translate.instant('lang.contactsParameters_addressNumber')
+        },
+        {
+            id: 'addressStreet',
+            label: this.translate.instant('lang.contactsParameters_addressStreet')
+        },
+        {
+            id: 'addressAdditional2',
+            label: this.translate.instant('lang.contactsParameters_addressAdditional2')
+        },
+        {
+            id: 'addressPostcode',
+            label: this.translate.instant('lang.contactsParameters_addressPostcode')
+        },
+        {
+            id: 'addressTown',
+            label: this.translate.instant('lang.contactsParameters_addressTown')
+        },
+        {
+            id: 'addressCountry',
+            label: this.translate.instant('lang.contactsParameters_addressCountry')
+        },
     ];
 
     csvColumns: string[] = [
@@ -73,6 +138,32 @@ export class ContactImportComponent implements OnInit {
 
     ngOnInit(): void {
         this.setConfiguration();
+        this.initCustomFields();
+    }
+
+    getcontactColumnsIds() {
+        return this.contactColumns.map(col => col.id);
+    }
+
+    initCustomFields() {
+        this.http.get(`../rest/contactsCustomFields`).pipe(
+            map((data: any) => {
+                data = data.customFields.map(custom => {
+                    return {
+                        id : `contactCustomField_${custom.id}`,
+                        label: custom.label
+                    };
+                });
+                return data;
+            }),
+            tap((customFields) => {
+                this.contactColumns = this.contactColumns.concat(customFields);
+            }),
+            catchError((err: any) => {
+                this.notify.handleSoftErrors(err);
+                return of(false);
+            })
+        ).subscribe();
     }
 
     changeColumn(coldb: string, colCsv: string) {
@@ -83,7 +174,7 @@ export class ContactImportComponent implements OnInit {
             const objContact = {};
 
             this.contactColumns.forEach(key => {
-                objContact[key] = coldb === key ? data[this.csvColumns.filter(col => col === colCsv)[0]] : data[this.associatedColmuns[key]];
+                objContact[key.id] = coldb === key.id ? data[this.csvColumns.filter(col => col === colCsv)[0]] : data[this.associatedColmuns[key.id]];
             });
 
             this.contactData.push(objContact);
@@ -169,8 +260,9 @@ export class ContactImportComponent implements OnInit {
             const objContact = {};
 
             this.contactColumns.forEach((key, indexCol) => {
-                this.associatedColmuns[key] = this.csvColumns[indexCol];
-                objContact[key] = data[this.csvColumns[indexCol]];
+                const indexCsvCol = this.csvColumns.indexOf(key.label);
+                this.associatedColmuns[key.id] = indexCsvCol > -1 ? this.csvColumns[indexCsvCol] : '';
+                objContact[key.id] = indexCsvCol > -1 ? data[this.csvColumns[indexCsvCol]] : '';
             });
             this.contactData.push(objContact);
 
@@ -195,7 +287,7 @@ export class ContactImportComponent implements OnInit {
     onSubmit() {
         const dataToSend: any[] = [];
         let confirmText = '';
-        this.translate.get('lang.confirmImportUsers', { 0: this.countAll }).subscribe((res: string) => {
+        this.translate.get('lang.confirmImportContacts', { 0: this.countAll }).subscribe((res: string) => {
             confirmText = `${res} ?<br/><br/>`;
             confirmText += `<ul><li><b>${this.countAdd}</b> ${this.translate.instant('lang.additions')}</li><li><b>${this.countUp}</b> ${this.translate.instant('lang.modifications')}</li></ul>`;
         });
@@ -208,31 +300,23 @@ export class ContactImportComponent implements OnInit {
                     if ((this.hasHeader && index > 0) || !this.hasHeader) {
                         const objContact = {};
                         this.contactColumns.forEach((key) => {
-                            objContact[key] = element[this.associatedColmuns[key]];
+                            objContact[key.id] = element[this.associatedColmuns[key.id]];
                         });
                         dataToSend.push(objContact);
                     }
                 });
             }),
-            exhaustMap(() => this.http.put(`../rest/users/import`, { users: dataToSend })),
+            exhaustMap(() => this.http.put(`../rest/contacts/import`, { contacts: dataToSend })),
             tap((data: any) => {
                 let textModal = '';
-                if (data.warnings.count > 0) {
-                    textModal = `<br/>${data.warnings.count} ${this.translate.instant('lang.withWarnings')}  : <ul>`;
-                    data.errors.details.forEach(element => {
-                        textModal += `<li> ${this.translate.instant('element.lang')} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`;
-                    });
-                    textModal += '</ul>';
-                }
-
                 if (data.errors.count > 0) {
                     textModal += `<br/>${data.errors.count} ${this.translate.instant('lang.withErrors')}  : <ul>`;
                     data.errors.details.forEach(element => {
-                        textModal += `<li> ${this.translate.instant('element.lang')} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`;
+                        textModal += `<li> ${this.translate.instant('lang.' + element.lang)} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`;
                     });
                     textModal += '</ul>';
                 }
-                dialogRef = this.dialog.open(AlertComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.import'), msg: '<b>' + data.success + '</b> / <b>' + this.countAll + '</b> ' + this.translate.instant('lang.importedUsers') + '.' + textModal } });
+                dialogRef = this.dialog.open(AlertComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.import'), msg: '<b>' + data.success + '</b> / <b>' + this.countAll + '</b> ' + this.translate.instant('lang.importedContacts') + '.' + textModal } });
             }),
             exhaustMap(() => dialogRef.afterClosed()),
             tap(() => {
diff --git a/src/frontend/app/administration/user/import/users-import.component.html b/src/frontend/app/administration/user/import/users-import.component.html
index b19d3e81b73..ada2aa00991 100644
--- a/src/frontend/app/administration/user/import/users-import.component.html
+++ b/src/frontend/app/administration/user/import/users-import.component.html
@@ -3,7 +3,7 @@
     <div mat-dialog-content>
         <mat-toolbar class="import-tool" [class.hide]="csvData.length === 0 || loading">
             <span style="flex:1;">
-                <mat-slide-toggle color="primary" [checked]="hasHeader" (change)="toggleHeader()">En-tête csv</mat-slide-toggle>
+                <mat-slide-toggle color="primary" [checked]="hasHeader" (change)="toggleHeader()">{{'lang.csvHeader' | translate}}</mat-slide-toggle>
             </span>
             <span style="flex:1;text-align: center;"><i class="fa fa-users"
                     color="primary"></i>&nbsp;{{'lang.usersOfFile' | translate}} : <b color="primary">{{countAll}}</b>
diff --git a/src/frontend/app/administration/user/import/users-import.component.ts b/src/frontend/app/administration/user/import/users-import.component.ts
index bac97ec75d4..419255af853 100644
--- a/src/frontend/app/administration/user/import/users-import.component.ts
+++ b/src/frontend/app/administration/user/import/users-import.component.ts
@@ -220,7 +220,7 @@ export class UsersImportComponent implements OnInit {
                 if (data.warnings.count > 0) {
                     textModal = `<br/>${data.warnings.count} ${this.translate.instant('lang.withWarnings')}  : <ul>`;
                     data.errors.details.forEach(element => {
-                        textModal += `<li> ${this.translate.instant('element.lang')} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`;
+                        textModal += `<li> ${this.translate.instant('lang.' + element.lang)} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`;
                     });
                     textModal += '</ul>';
                 }
@@ -228,7 +228,7 @@ export class UsersImportComponent implements OnInit {
                 if (data.errors.count > 0) {
                     textModal += `<br/>${data.errors.count} ${this.translate.instant('lang.withErrors')}  : <ul>`;
                     data.errors.details.forEach(element => {
-                        textModal += `<li> ${this.translate.instant('element.lang')} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`;
+                        textModal += `<li> ${this.translate.instant('lang.' + element.lang)} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`;
                     });
                     textModal += '</ul>';
                 }
diff --git a/src/frontend/app/process/process.component.ts b/src/frontend/app/process/process.component.ts
index 6f6b48effd8..be91ee505d2 100755
--- a/src/frontend/app/process/process.component.ts
+++ b/src/frontend/app/process/process.component.ts
@@ -715,8 +715,6 @@ export class ProcessComponent implements OnInit, OnDestroy {
     }
 
     refreshData() {
-        console.log('fuuuu');
-        
         this.appDocumentViewer.loadRessource(this.currentResourceInformations.resId);
     }
 
diff --git a/src/lang/lang-fr.json b/src/lang/lang-fr.json
index a87d40886d4..bc70affb51a 100644
--- a/src/lang/lang-fr.json
+++ b/src/lang/lang-fr.json
@@ -1984,5 +1984,8 @@
     "argumentNotDate": "Une donnée n'est pas une date pour un contact",
     "argumentNotString": "Une donnée n'est pas une chaîne de caractères pour un contact",
     "argumentMandatoryEmpty": "Une donnée obligatoire est vide pour un contact",
-    "noneItalic": "<em>Aucun</em>"
+    "noneItalic": "<em>Aucun</em>",
+    "csvHeader": "En-tête csv",
+    "confirmImportContacts": "Voulez-vous importer <b>{{0}}</b> contacts",
+    "importedContacts": "contacts importés"
 }
-- 
GitLab