From ccbece3b57b47da356e7546b4e18769708143195 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Fri, 23 Aug 2019 15:11:12 +0200
Subject: [PATCH] FEAT #11291 TIME 5:30 add classify folder action

---
 .../app/actions/actions-list.component.html   |  2 +
 .../app/actions/actions-list.component.scss   |  4 +-
 .../app/actions/actions-list.component.ts     | 12 ++++-
 src/frontend/app/app.module.ts                |  4 +-
 .../folder-menu/folder-menu.component.html    |  7 +++
 .../folder-menu/folder-menu.component.scss    | 18 +++++++
 .../folder-menu/folder-menu.component.ts      | 53 +++++++++++++++++++
 .../app/list/basket-list.component.html       |  4 +-
 src/frontend/lang/lang-en.ts                  |  1 +
 src/frontend/lang/lang-fr.ts                  |  1 +
 src/frontend/lang/lang-nl.ts                  |  1 +
 11 files changed, 102 insertions(+), 5 deletions(-)
 create mode 100644 src/frontend/app/folder/folder-menu/folder-menu.component.html
 create mode 100644 src/frontend/app/folder/folder-menu/folder-menu.component.scss
 create mode 100644 src/frontend/app/folder/folder-menu/folder-menu.component.ts

diff --git a/src/frontend/app/actions/actions-list.component.html b/src/frontend/app/actions/actions-list.component.html
index 66acb0e6d74..9b2757be757 100644
--- a/src/frontend/app/actions/actions-list.component.html
+++ b/src/frontend/app/actions/actions-list.component.html
@@ -13,4 +13,6 @@
         mat-menu-item (click)="launchEvent(action);">
         <span>{{action.label_action}}</span>
     </button>
+    <mat-divider></mat-divider>
+    <folder-menu [resIds]="selectedRes" (refreshList)="refreshList()"></folder-menu>
 </mat-menu>
\ No newline at end of file
diff --git a/src/frontend/app/actions/actions-list.component.scss b/src/frontend/app/actions/actions-list.component.scss
index 87be79ea8a1..2a110d93138 100644
--- a/src/frontend/app/actions/actions-list.component.scss
+++ b/src/frontend/app/actions/actions-list.component.scss
@@ -1,3 +1,5 @@
+@import '../../css/vars.scss';
+
 .mat-icon {
     height: auto;
 }
@@ -13,4 +15,4 @@
         padding-top: 0;
         padding-bottom: 0;
     }
-}
+}
\ No newline at end of file
diff --git a/src/frontend/app/actions/actions-list.component.ts b/src/frontend/app/actions/actions-list.component.ts
index 80208826c20..37babcc36a1 100644
--- a/src/frontend/app/actions/actions-list.component.ts
+++ b/src/frontend/app/actions/actions-list.component.ts
@@ -2,7 +2,7 @@ import { Component, OnInit, Input, ViewChild, Output, EventEmitter } from '@angu
 import { HttpClient } from '@angular/common/http';
 import { LANG } from '../translate.component';
 import { NotificationService } from '../notification.service';
-import { MatDialog } from '@angular/material/dialog';
+import { MatDialog, MatDialogRef } from '@angular/material/dialog';
 import { MatMenuTrigger } from '@angular/material/menu';
 
 import { ConfirmActionComponent } from './confirm-action/confirm-action.component';
@@ -21,6 +21,8 @@ import { Router } from '@angular/router';
 import { ViewDocActionComponent } from './view-doc-action/view-doc-action.component';
 import { RedirectActionComponent } from './redirect-action/redirect-action.component';
 import { SendShippingActionComponent } from './send-shipping-action/send-shipping-action.component';
+import { map, tap } from 'rxjs/operators';
+import { ConfirmComponent } from '../../plugins/modal/confirm.component';
 
 @Component({
     selector: 'app-actions-list',
@@ -51,8 +53,12 @@ export class ActionsListComponent implements OnInit {
     @Input('contextMode') contextMode: boolean;
     @Input('currentBasketInfo') currentBasketInfo: any;
 
+    @Output('refreshEvent') refreshEvent = new EventEmitter<string>();
+
     constructor(public http: HttpClient, private notify: NotificationService, public dialog: MatDialog, private router: Router) { }
 
+    dialogRef: MatDialogRef<any>;
+    
     ngOnInit(): void { }
 
     open(x: number, y: number, row: any) {
@@ -490,4 +496,8 @@ export class ActionsListComponent implements OnInit {
         this.http.put('../../rest/resourcesList/users/' + this.currentBasketInfo.ownerId + '/groups/' + this.currentBasketInfo.groupId + '/baskets/' + this.currentBasketInfo.basketId + '/unlock', { resources: this.arrRes })
             .subscribe((data: any) => { }, (err: any) => { });
     }
+
+    refreshList() {
+        this.refreshEvent.emit();
+    }
 }
diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts
index c1561513cff..d27b20a55d1 100755
--- a/src/frontend/app/app.module.ts
+++ b/src/frontend/app/app.module.ts
@@ -26,6 +26,7 @@ import { ActionsListComponent }                 from './actions/actions-list.com
 import { FolderTreeComponent }                 from './folder/folder-tree.component';
 import { FolderDocumentListComponent }                 from './folder/document-list/folder-document-list.component';
 import { PanelFolderComponent }                 from './folder/panel/panel-folder.component';
+import { FolderMenuComponent }                 from './folder/folder-menu/folder-menu.component';
 
 /*ACTIONS PAGES */
 import { ConfirmActionComponent }               from './actions/confirm-action/confirm-action.component';
@@ -117,7 +118,8 @@ import { PrintSeparatorComponent }                        from './separator/prin
         PrintSeparatorComponent,
         FolderTreeComponent,
         PanelFolderComponent,
-        FolderDocumentListComponent
+        FolderDocumentListComponent,
+        FolderMenuComponent
     ],
     entryComponents: [
         CustomSnackbarComponent,
diff --git a/src/frontend/app/folder/folder-menu/folder-menu.component.html b/src/frontend/app/folder/folder-menu/folder-menu.component.html
new file mode 100644
index 00000000000..bfd26e6b94f
--- /dev/null
+++ b/src/frontend/app/folder/folder-menu/folder-menu.component.html
@@ -0,0 +1,7 @@
+<button mat-menu-item [matMenuTriggerFor]="folders" class="folderAction" (menuOpened)="getFolders()">
+    <mat-icon class="fa fa-folder fa-2x"></mat-icon>
+    <span>{{lang.classifyIn}}</span>
+</button>
+<mat-menu #folders="matMenu">
+    <button mat-menu-item *ngFor="let folder of foldersList | sortBy : 'label'" class="labelFolder" [class.private]="!folder.public" (click)="classifyDocuments(folder)" [title]="folder.label">{{folder.label}}</button>
+</mat-menu>
\ No newline at end of file
diff --git a/src/frontend/app/folder/folder-menu/folder-menu.component.scss b/src/frontend/app/folder/folder-menu/folder-menu.component.scss
new file mode 100644
index 00000000000..61643c31d02
--- /dev/null
+++ b/src/frontend/app/folder/folder-menu/folder-menu.component.scss
@@ -0,0 +1,18 @@
+@import '../../../css/vars.scss';
+
+.folderAction {
+    font-style: italic;
+
+    .mat-icon {
+        font-size:20px;
+        color: $primary;
+    }
+}
+
+.labelFolder {
+    color: $primary;
+}
+
+.private {
+    color: $warn;
+}
\ No newline at end of file
diff --git a/src/frontend/app/folder/folder-menu/folder-menu.component.ts b/src/frontend/app/folder/folder-menu/folder-menu.component.ts
new file mode 100644
index 00000000000..1682a30c24f
--- /dev/null
+++ b/src/frontend/app/folder/folder-menu/folder-menu.component.ts
@@ -0,0 +1,53 @@
+import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { LANG } from '../../translate.component';
+import { HttpClient } from '@angular/common/http';
+import { map, tap, catchError } from 'rxjs/operators';
+import { of } from 'rxjs';
+import { NotificationService } from '../../notification.service';
+
+@Component({
+    selector: 'folder-menu',
+    templateUrl: "folder-menu.component.html",
+    styleUrls: ['folder-menu.component.scss'],
+    providers: [NotificationService],
+})
+export class FolderMenuComponent implements OnInit {
+
+    lang: any = LANG;
+
+    foldersList: any[] = [];
+    @Input('resIds') resIds: number[];
+
+    @Output('refreshList') refreshList = new EventEmitter<string>();
+
+    constructor(
+        public http: HttpClient,
+        private notify: NotificationService
+    ) { }
+
+    ngOnInit(): void { }
+
+    getFolders() {
+        this.http.get("../../rest/folders").pipe(
+            map((data: any) => data.folders),
+            tap((data: any) => {
+                this.foldersList = data;
+            }),
+        ).subscribe();
+    }
+
+    classifyDocuments(folder: any) {
+
+        this.http.post('../../rest/folders/' + folder.id + '/resources', { resources: this.resIds }).pipe(
+            tap(() => {
+                this.refreshList.emit();
+                this.notify.success('Courrier classé');
+            }),
+            catchError((err) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+}
diff --git a/src/frontend/app/list/basket-list.component.html b/src/frontend/app/list/basket-list.component.html
index 74bead9e0bc..68916c2cf6b 100644
--- a/src/frontend/app/list/basket-list.component.html
+++ b/src/frontend/app/list/basket-list.component.html
@@ -47,7 +47,7 @@
                         </div>
                         <div class="table-head-tool">
                             <span>
-                                <app-actions-list #actionsList (triggerEvent)="refreshDaoAfterAction()"
+                                <app-actions-list #actionsList (refreshEvent)="refreshDao()"
                                     [contextMode]="false" [totalRes]="allResInBasket.length" [selectedRes]="selectedRes"
                                     [currentBasketInfo]="currentBasketInfo"></app-actions-list>
                             </span>
@@ -199,6 +199,6 @@
             <mat-divider></mat-divider>
         </mat-sidenav>
     </mat-sidenav-container>
-    <app-actions-list (triggerEvent)="refreshDaoAfterAction()" #actionsListContext [contextMode]="true"
+    <app-actions-list (refreshEvent)="refreshDao()" #actionsListContext [contextMode]="true"
         [totalRes]="allResInBasket.length" [selectedRes]="selectedRes" [currentBasketInfo]="currentBasketInfo">
     </app-actions-list>
\ No newline at end of file
diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts
index a7d8b0c3131..4015e67a246 100755
--- a/src/frontend/lang/lang-en.ts
+++ b/src/frontend/lang/lang-en.ts
@@ -1055,4 +1055,5 @@ export const LANG_EN = {
     "classifyInFolder" : "Classify this mail in a folder",
     "getFolders" : "Folders (fixed postion)",
     "getFoldersSample" : "Litigation",
+    "classifyIn" : "Classify in ...",
 };
diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts
index 7534bb9d8c0..6bd32e43956 100755
--- a/src/frontend/lang/lang-fr.ts
+++ b/src/frontend/lang/lang-fr.ts
@@ -1092,4 +1092,5 @@ export const LANG_FR = {
     "classifyInFolder" : "Placer le courrier suivant dans un dossier",
     "getFolders" : "Dossiers (emplacement fixe)",
     "getFoldersSample" : "Litiges",
+    "classifyIn" : "Classer dans ...",
 };
\ No newline at end of file
diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts
index ccaea40c66e..c9288357cd6 100755
--- a/src/frontend/lang/lang-nl.ts
+++ b/src/frontend/lang/lang-nl.ts
@@ -1081,4 +1081,5 @@ export const LANG_NL = {
     "classifyInFolder" : "Classify this mail in a folder", //_TO_TRANSLATE
     "getFolders" : "Folders (fixed postion)", //_TO_TRANSLATE
     "getFoldersSample" : "Litigation", //_TO_TRANSLATE
+    "classifyIn" : "Classify in ...", //_TO_TRANSLATE
 };
-- 
GitLab