From f43e6ceba1a9d134f538070fdc41e51a22da3da6 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Thu, 10 Sep 2020 10:23:51 +0200
Subject: [PATCH] FEAT #144458 TIME 3 fix parse csv file

---
 package.json                                  |  1 +
 .../list/import/contact-import.component.ts   | 73 ++++++++-----------
 2 files changed, 33 insertions(+), 41 deletions(-)

diff --git a/package.json b/package.json
index c79f31c72f3..03aa9a92958 100755
--- a/package.json
+++ b/package.json
@@ -26,6 +26,7 @@
     "core-js": "^3.6.5",
     "flat-to-nested": "^1.1.0",
     "ngx-joyride": "^2.3.1",
+    "ngx-papaparse": "^5.0.0",
     "zone.js": "~0.10.3"
   },
   "devDependencies": {
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 7e2dbae0a66..874cc89556c 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
@@ -12,6 +12,7 @@ import { AlertComponent } from '../../../../../plugins/modal/alert.component';
 import { LocalStorageService } from '../../../../../service/local-storage.service';
 import { HeaderService } from '../../../../../service/header.service';
 import { MatPaginator } from '@angular/material/paginator';
+import { Papa } from 'ngx-papaparse';
 
 @Component({
     templateUrl: 'contact-import.component.html',
@@ -20,23 +21,6 @@ import { MatPaginator } from '@angular/material/paginator';
 export class ContactImportComponent implements OnInit {
 
     loading: boolean = false;
-    /*contactColumns: string[] = [
-        'id',
-        'company',
-        'civility',
-        'firstname',
-        'lastname',
-        'function',
-        'department',
-        'email',
-        'addressAdditional1',
-        'addressNumber',
-        'addressStreet',
-        'addressAdditional2',
-        'addressPostcode',
-        'addressTown',
-        'addressCountry',
-    ];*/
 
     contactColumns: any[] = [
         {
@@ -148,6 +132,7 @@ export class ContactImportComponent implements OnInit {
         private headerService: HeaderService,
         public dialog: MatDialog,
         public dialogRef: MatDialogRef<ContactImportComponent>,
+        private papa: Papa,
         @Inject(MAT_DIALOG_DATA) public data: any,
     ) {
     }
@@ -221,29 +206,35 @@ export class ContactImportComponent implements OnInit {
             reader.readAsText(fileInput.target.files[0]);
 
             reader.onload = (value: any) => {
-                rawCsv = value.target.result.split('\n');
-                rawCsv = rawCsv.filter(data => data !== '');
-
-                let dataCol = [];
-                let objData = {};
-                this.setCsvColumns(rawCsv[0].split(this.currentDelimiter).map(s => s.replace(/"/gi, '').trim()));
-
-                this.countAll = this.hasHeader ? rawCsv.length - 1 : rawCsv.length;
-
-                for (let index = 0; index < rawCsv.length; index++) {
-                    objData = {};
-                    dataCol = rawCsv[index].split(this.currentDelimiter).map(s => s.replace(/"/gi, '').trim());
-                    dataCol.forEach((element: any, index2: number) => {
-                        objData[this.csvColumns[index2]] = element;
-                    });
-                    this.csvData.push(objData);
-                }
-                this.initData();
-                this.countAdd = this.csvData.filter((data: any, index: number) => index > 0 && this.functionsService.empty(data[this.associatedColmuns['id']])).length;
-                this.countUp = this.csvData.filter((data: any, index: number) => index > 0 && !this.functionsService.empty(data[this.associatedColmuns['id']])).length;
-                this.localStorage.save(`importContactFields_${this.headerService.user.id}`, this.currentDelimiter);
-
-                this.loading = false;
+                this.papa.parse(value.target.result, {
+                    complete: (result) => {
+                        // console.log('Parsed: ', result);
+
+                        rawCsv = result.data;
+                        rawCsv = rawCsv.filter(data => data.length === rawCsv[0].length);
+
+                        let dataCol = [];
+                        let objData = {};
+
+                        this.setCsvColumns(rawCsv[0]);
+                        this.countAll = this.hasHeader ? rawCsv.length - 1 : rawCsv.length;
+
+                        for (let index = 0; index < rawCsv.length; index++) {
+                            objData = {};
+                            dataCol = rawCsv[index];
+                            dataCol.forEach((element: any, index2: number) => {
+                                objData[this.csvColumns[index2]] = element;
+                            });
+                            this.csvData.push(objData);
+                        }
+                        this.initData();
+                        this.countAdd = this.csvData.filter((data: any, index: number) => index > 0 && this.functionsService.empty(data[this.associatedColmuns['id']])).length;
+                        this.countUp = this.csvData.filter((data: any, index: number) => index > 0 && !this.functionsService.empty(data[this.associatedColmuns['id']])).length;
+                        this.localStorage.save(`importContactFields_${this.headerService.user.id}`, this.currentDelimiter);
+
+                        this.loading = false;
+                    }
+                });
             };
         } else {
             this.dialog.open(AlertComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.notAllowedExtension') + ' !', msg: this.translate.instant('lang.file') + ' : <b>' + fileInput.target.files[0].name + '</b>, ' + this.translate.instant('lang.type') + ' : <b>' + fileInput.target.files[0].type + '</b><br/><br/><u>' + this.translate.instant('lang.allowedExtensions') + '</u> : <br/>' + 'text/csv' } });
@@ -321,7 +312,7 @@ export class ContactImportComponent implements OnInit {
                             if (key.emptyValueMode && this.functionsService.empty(element[this.associatedColmuns[key.id]])) {
                                 objContact[key.id] = false;
                             } else {
-                                objContact[key.id] = element[this.associatedColmuns[key.id]].includes('##') ? element[this.associatedColmuns[key.id]].split('##') : element[this.associatedColmuns[key.id]];
+                                objContact[key.id] = element[this.associatedColmuns[key.id]].includes('\n') ? element[this.associatedColmuns[key.id]].split('\n') : element[this.associatedColmuns[key.id]];
                             }
                         });
                         dataToSend.push(objContact);
-- 
GitLab