From bc2893fca78f65a2375455cc830a25aea8dc2256 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Fri, 1 Feb 2019 14:45:08 +0100
Subject: [PATCH] FEAT #9082 add checkbox for select mail in result list

---
 .../app/list/basket-list.component.html       |  4 +-
 .../app/list/basket-list.component.ts         | 44 +++++++++++++++++--
 .../list/filters/filters-tool.component.html  | 17 ++++---
 .../list/filters/filters-tool.component.scss  |  4 ++
 .../list/filters/filters-tool.component.ts    |  6 +++
 src/frontend/lang/lang-en.ts                  |  2 +
 src/frontend/lang/lang-fr.ts                  |  2 +
 src/frontend/lang/lang-nl.ts                  |  2 +
 8 files changed, 66 insertions(+), 15 deletions(-)

diff --git a/src/frontend/app/list/basket-list.component.html b/src/frontend/app/list/basket-list.component.html
index 29a19550d6b..21b1c1d98ff 100644
--- a/src/frontend/app/list/basket-list.component.html
+++ b/src/frontend/app/list/basket-list.component.html
@@ -18,7 +18,7 @@
                 <div class="row" style="margin:0px;">
                     <div class="col-md-12" style="display:flex;">
                         <app-filters-tool style="flex:1;" #filtersTool [currentBasketInfo]="currentBasketInfo"
-                            [listProperties]="this.listProperties" [snavR]="snav2" (refreshEvent)="refreshDao()"></app-filters-tool>
+                            [listProperties]="this.listProperties" [snavR]="snav2" [nbSelectedRes]="selectedRes.length" (toggleAllRes)="toggleAllRes($event)" (refreshEvent)="refreshDao()"></app-filters-tool>
                         <mat-paginator #paginatorResultList [length]="resultsLength" [pageSize]="10" class="paginatorResultList"></mat-paginator>
                     </div>
                 </div>
@@ -61,7 +61,7 @@
                             <!-- Primary Info Line -->
                             <div class="resultRow newRow" [class.resultRow-mobile]="mobileMode">
                                 <div *ngIf="!mobileMode" class="checkThis">
-                                    <mat-checkbox color="primary"></mat-checkbox>
+                                    <mat-checkbox color="primary" [checked]="row.checked" (change)="toggleRes($event,row.res_id)" (click)="$event.stopPropagation();"></mat-checkbox>
                                 </div>
                                 <div class="resultCol {{data.class}}" *ngFor="let data of displayedMainData">
                                     <span *ngIf="data.id == 'alt_identifier'">
diff --git a/src/frontend/app/list/basket-list.component.ts b/src/frontend/app/list/basket-list.component.ts
index 85eef1d911d..3b969c72034 100755
--- a/src/frontend/app/list/basket-list.component.ts
+++ b/src/frontend/app/list/basket-list.component.ts
@@ -95,7 +95,7 @@ export class BasketListComponent implements OnInit {
     ];
 
     resultListDatabase: ResultListHttpDao | null;
-    data: any[] = [];
+    data: any;
     resultsLength = 0;
     isLoadingResults = true;
     listProperties: any = {};
@@ -103,6 +103,9 @@ export class BasketListComponent implements OnInit {
     currentChrono: string = '';
     thumbnailUrl: string = '';
 
+    selectedRes: number[] = [];
+    allResInBasket: number[] = [];
+
     @ViewChild('filtersTool') filtersTool: FiltersToolComponent;
 
     @ViewChild(MatPaginator) paginator: MatPaginator;
@@ -176,6 +179,7 @@ export class BasketListComponent implements OnInit {
                     this.isLoadingResults = false;
                     data = this.processPostData(data);
                     this.resultsLength = data.count;
+                    this.allResInBasket = data.allResources;
                     this.headerService.setHeader(data.basketLabel, this.resultsLength + ' ' + this.lang.entries);
                     return data.resources;
                 }),
@@ -250,27 +254,59 @@ export class BasketListComponent implements OnInit {
             Object.keys(element).forEach((key) => {
                 if ((element[key] == null || element[key] == '') && ['process_limit_date', 'creation_date', 'closing_date', 'countAttachments', 'countNotes'].indexOf(key) === -1) {
                     element[key] = this.lang.undefined;
-                } else if (["senders","recipients"].indexOf(key) > 0) {
+                } else if (["senders", "recipients"].indexOf(key) > 0) {
                     if (element[key].length > 1) {
                         console.log(element[key]);
                         element[key] = this.lang.isMulticontact;
                     } else {
                         element[key] = element[key][0];
-                    }          
+                    }
                 } else if (key == 'status_icon' && element[key] == null) {
                     element[key] = 'fa-question undefined';
                 }
 
             });
+
+            if (this.selectedRes.indexOf(element['res_id']) === -1) {
+                element['checked'] = false;
+            } else {
+                element['checked'] = true;
+            }
         });
 
         return data;
     }
+
+    toggleRes(e: any, resId: any) {
+        if (e.checked) {
+            if (this.selectedRes.indexOf(resId) === -1) {
+                this.selectedRes.push(resId);
+            }
+        } else {
+            let index = this.selectedRes.indexOf(resId);
+            this.selectedRes.splice(index, 1);
+        }
+    }
+
+    toggleAllRes(e: any) {
+        this.selectedRes = [];
+        if (e.checked) {
+            this.data.forEach((element: any) => {
+                element['checked'] = true;
+            });
+            this.selectedRes = this.allResInBasket;
+        } else {
+            this.data.forEach((element: any) => {
+                element['checked'] = false;
+            });
+        }
+    }
 }
 export interface BasketList {
     resources: any[];
     count: number;
-    basketLabel: string
+    basketLabel: string,
+    allResources: number[]
 }
 
 
diff --git a/src/frontend/app/list/filters/filters-tool.component.html b/src/frontend/app/list/filters/filters-tool.component.html
index 22d1363be51..a10462ca28d 100644
--- a/src/frontend/app/list/filters/filters-tool.component.html
+++ b/src/frontend/app/list/filters/filters-tool.component.html
@@ -1,5 +1,5 @@
 <mat-button-toggle-group #group="matButtonToggleGroup" class="envFilter" multiple>
-    <mat-checkbox color="primary" style="margin: 10px;" title="Sélectionner tous les courriers de la bannette"></mat-checkbox>
+    <mat-checkbox color="primary" style="margin: 10px;" title="Sélectionner tous les courriers de la bannette" (change)="toggleAll($event)"></mat-checkbox>
     <form [formGroup]="stateForm" [style.flex]="1">
         <mat-form-field appearance="outline" floatLabel="never" [style.fontSize.px]="10" style="top: -2px;">
             <input class="metaSearch" type="text" matInput placeholder="{{lang.searchMailInBasket}}" formControlName="stateGroup"
@@ -45,22 +45,21 @@
         <mat-icon color="primary" fontSet="fas" fontIcon="fa-cog fa-2x"></mat-icon>
     </button>
     <mat-menu #menuParamList="matMenu">
-        <button mat-menu-item>
+        <div style="text-align: center;font-size: 10px;opacity: 0.5;margin-top:-10px;">
+            {{nbSelectedRes}} {{lang.selectedElements}}
+        </div>
+        <button mat-menu-item [disabled]="nbSelectedRes == 0">
             <mat-icon fontSet="fas" fontIcon="fa-print fa-2x"></mat-icon>
             <span>{{lang.printResultList}}</span>
         </button>
-        <button mat-menu-item (click)="openSummarySheet();">
+        <button mat-menu-item (click)="openSummarySheet();" [disabled]="nbSelectedRes == 0">
             <mat-icon fontSet="fas" fontIcon="fa-link fa-2x"></mat-icon>
-            <span>Fiche(s) de liaison(s)</span>
+            <span>{{lang.summarySheets}}</span>
         </button>
-        <button mat-menu-item (click)="openListAdmin();">
+        <button mat-menu-item (click)="openListAdmin();" [disabled]="nbSelectedRes == 0">
             <mat-icon fontSet="fas" fontIcon="fa-file-export fa-2x"></mat-icon>
             <span>{{lang.exportDatas}}</span>
         </button>
-        <button mat-menu-item>
-            <mat-icon fontSet="far" fontIcon="fa-list-alt fa-2x"></mat-icon>
-            <span>{{lang.settingsList}}</span>
-        </button>
     </mat-menu>
 </mat-button-toggle-group>
 <div class="filterBadges">
diff --git a/src/frontend/app/list/filters/filters-tool.component.scss b/src/frontend/app/list/filters/filters-tool.component.scss
index 259cea60355..19ed6937036 100644
--- a/src/frontend/app/list/filters/filters-tool.component.scss
+++ b/src/frontend/app/list/filters/filters-tool.component.scss
@@ -99,4 +99,8 @@
 .undefined {
     opacity: 0.5;
     font-style: italic;
+}
+
+.mat-menu-content:not(:empty) {
+    padding-top: 18px;
 }
\ No newline at end of file
diff --git a/src/frontend/app/list/filters/filters-tool.component.ts b/src/frontend/app/list/filters/filters-tool.component.ts
index fee93452a7c..33d28713964 100644
--- a/src/frontend/app/list/filters/filters-tool.component.ts
+++ b/src/frontend/app/list/filters/filters-tool.component.ts
@@ -63,8 +63,10 @@ export class FiltersToolComponent implements OnInit {
     @Input('currentBasketInfo') currentBasketInfo: any;
 
     @Input('snavR') sidenavRight: MatSidenav;
+    @Input('nbSelectedRes') nbSelectedRes: number;
 
     @Output('refreshEvent') refreshEvent = new EventEmitter<string>();
+    @Output('toggleAllRes') toggleAllRes = new EventEmitter<string>();
 
     constructor(public http: HttpClient, private filtersListService: FiltersListService, private fb: FormBuilder, private latinisePipe: LatinisePipe, public dialog: MatDialog) { }
 
@@ -296,4 +298,8 @@ export class FiltersToolComponent implements OnInit {
             }
         });
     }
+
+    toggleAll(e: any) {
+        this.toggleAllRes.emit(e);
+    }
 }
diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts
index 11a69b66ea5..1adf4cee544 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -781,6 +781,7 @@ export const LANG_EN = {
     "removeAllDatas"                                     : "Remove all datas",
     "toExport"                                     : "Export",
     "summarySheet"                                     : "Summary sheet",
+    "summarySheets"                                     : "Summary sheet(s)",
     "appName"                                     : "Application name",
     "printDate"                                     : "Print date",
     "genSummarySheets"                                     : "Generate Summary sheets",
@@ -796,4 +797,5 @@ export const LANG_EN = {
     "toggleQrcode"                            : "Display / Hide mail identifier (qrcode)",
     "deleteUnit"                            : "Delete unit",
     "addCustomUnit"                            : "Add custom unit",
+    "selectedElements"                            : "selected element(s)",
 };
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index eda2631d08f..0f0e68ea23c 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -807,6 +807,7 @@ export const LANG_FR = {
     "removeAllDatas"                                     : "Enlever toutes les données",
     "toExport"                                     : "Exporter",
     "summarySheet"                                     : "Fiche de liaison",
+    "summarySheets"                                     : "Fiche(s) de liaison(s)",
     "appName"                                     : "Nom de l'application",
     "printDate"                                     : "Date d'impression",
     "genSummarySheets"                                     : "Générer les fiches de liaisons",
@@ -822,4 +823,5 @@ export const LANG_FR = {
     "toggleQrcode"                            : "Afficher / cacher l'identifiant courrier (qrcode)",
     "deleteUnit"                            : "Supprimer le bloc",
     "addCustomUnit"                            : "Ajouter un bloc custom",
+    "selectedElements"                            : "élément(s) sélectionné(s)",
 };
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index 83c505f352a..49cc002b169 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -810,6 +810,7 @@ export const LANG_NL = {
     "removeAllDatas"                                     : "_TO_TRANSLATE",
     "toExport"                                     : "_TO_TRANSLATE",
     "summarySheet"                                     : "_TO_TRANSLATE",
+    "summarySheets"                                     : "_TO_TRANSLATE",
     "appName"                                     : "_TO_TRANSLATE",
     "printDate"                                     : "_TO_TRANSLATE",
     "genSummarySheets"                                     : "_TO_TRANSLATE",
@@ -825,4 +826,5 @@ export const LANG_NL = {
     "toggleQrcode"                                     : "_TO_TRANSLATE",
     "deleteUnit"                                     : "_TO_TRANSLATE",
     "addCustomUnit"                                     : "_TO_TRANSLATE",
+    "selectedElements"                                     : "_TO_TRANSLATE",
 };
-- 
GitLab