From 3ed6eb51119e64c131da5b75155515c9233c98ec Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Fri, 26 Jul 2019 15:51:06 +0200
Subject: [PATCH] FEAT #11296 TIME 3 begin unclassify

---
 .../folder-document-list.component.html       | 20 ++++++--
 .../folder-document-list.component.scss       | 10 ++++
 .../folder-document-list.component.ts         | 34 ++++++++------
 .../app/folder/folder-tree.component.html     |  2 +-
 .../app/folder/folder-tree.component.ts       | 47 ++++++++++++++++---
 .../app/list/basket-list.component.html       |  2 +-
 6 files changed, 89 insertions(+), 26 deletions(-)

diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.html b/src/frontend/app/folder/document-list/folder-document-list.component.html
index ab65e8eb496..044cbe53897 100644
--- a/src/frontend/app/folder/document-list/folder-document-list.component.html
+++ b/src/frontend/app/folder/document-list/folder-document-list.component.html
@@ -7,7 +7,7 @@
         <menu-nav></menu-nav>
         <basket-home *ngIf="homeData" #basketHome [homeData]="homeData" [snavL]="snav"></basket-home>
         <mat-divider></mat-divider>
-        <panel-folder *ngIf="folderInfo.id > 0" [selectedId]="folderInfo.id"></panel-folder>
+        <panel-folder #panelFolder [selectedId]="folderInfo.id"></panel-folder>
     </mat-sidenav>
     <mat-sidenav-content>
         <mat-card id="viewThumbnail" style="display:none;position: fixed;z-index: 2;margin-left: 1px;"><img style="max-height: 100vh;" src="{{thumbnailUrl}}" /></mat-card>
@@ -42,6 +42,9 @@
                     </div>
                     <div class="table-head-tool">
                         <span>
+                            <button mat-raised-button color="primary" (click)="unclassify();" *ngIf="selectedRes.length > 0">
+                                Enlever du dossier
+                            </button>
                             <!--<app-tools-list #actionsList [selectedRes]="selectedRes"
                                 [currentBasketInfo]="currentBasketInfo"></app-tools-list>-->
                         </span>
@@ -52,7 +55,7 @@
                     </div>
                 </div>
                 <div style="height:90%;overflow:auto;position:absolute;width:100%;">
-                    <table #tableBasketListSort="matSort" mat-table [dataSource]="data" matSort
+                    <table #tableBasketListSort="matSort" cdkDropList id="folder-list" [cdkDropListConnectedTo]="panelFolder.getDragIds()" [cdkDropListData]="data" mat-table [dataSource]="data" matSort
                         matSortActive="res_id" matSortDisableClear matSortDirection="asc" style="width:100%;">
 
                         <ng-container matColumnDef="res_id">
@@ -65,6 +68,14 @@
                                             (change)="toggleRes($event,row)" (click)="$event.stopPropagation();">
                                         </mat-checkbox>
                                     </span>
+                                    <span *ngIf="!appService.getViewMode()" style="cursor:pointer;" class="main-info-status" (click)="launch(defaultAction,row);">
+                                        <mat-icon *ngIf="row.isLocked !== true" title="{{row.statusLabel}}" [ngStyle]="{'color': row.priorityColor}" color="primary"
+                                            class="{{row.statusImage.charAt(0)}}{{row.statusImage.charAt(1)}} {{row.statusImage}} {{row.statusImage.charAt(0)}}{{row.statusImage.charAt(1)}}-2x">
+                                        </mat-icon>
+                                        <span *ngIf="row.confidentiality === 'Y'" class="watermark">{{lang.confidential}}</span>
+                                        <mat-icon *ngIf="row.isLocked === true" title="{{lang.warnLockResInProgress}} : {{row.locker}}" style="color: red;" class="fa fa-lock fa-2x">
+                                        </mat-icon>
+                                    </span>
                                     <span *ngIf="!appService.getViewMode()" class="main-info-data" style="width:200px;text-align:center;cursor:pointer;">
                                         <ng-container
                                             *ngIf="row.alt_identifier == lang.undefined && row.barcode != lang.undefined">
@@ -108,7 +119,10 @@
                             </td>
                         </ng-container>
                         <tr mat-row *matRowDef="let row; columns: displayedColumnsBasket;"
-                            (contextmenu)="open($event,row);"></tr>
+                                (contextmenu)="open($event,row);" class="rowData" [class.locked]="row.isLocked == true" cdkDrag  [cdkDragData]="row" >
+                                <div class="example-custom-placeholder" *cdkDragPlaceholder></div>
+                                <div class="dragPreview" *cdkDragPreview><i class="fas fa-envelope-open-text fa-2x"></i><br/>Classer <b>{{row.alt_identifier}}</b> dans un dossier</div>
+                            </tr>
                     </table>
                 </div>
                 <div class="table-head">
diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.scss b/src/frontend/app/folder/document-list/folder-document-list.component.scss
index e69de29bb2d..0b92c670d61 100644
--- a/src/frontend/app/folder/document-list/folder-document-list.component.scss
+++ b/src/frontend/app/folder/document-list/folder-document-list.component.scss
@@ -0,0 +1,10 @@
+@import '../../../css/vars.scss';
+
+.dragPreview {
+    text-align: center;
+    border-radius:5px;
+    background: white;
+    padding: 10px;
+    box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),0 8px 10px 1px rgba(0, 0, 0, 0.14),0 3px 14px 2px rgba(0, 0, 0, 0.12);
+    color: $primary;
+  }
\ No newline at end of file
diff --git a/src/frontend/app/folder/document-list/folder-document-list.component.ts b/src/frontend/app/folder/document-list/folder-document-list.component.ts
index 3ba27915f68..3b6a8752d07 100644
--- a/src/frontend/app/folder/document-list/folder-document-list.component.ts
+++ b/src/frontend/app/folder/document-list/folder-document-list.component.ts
@@ -6,14 +6,14 @@ import { NotificationService } from '../../notification.service';
 import { MatDialog, MatSidenav, MatPaginator, MatSort } from '@angular/material';
 
 import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
-import { startWith, switchMap, map, catchError, takeUntil } from 'rxjs/operators';
+import { startWith, switchMap, map, catchError, takeUntil, tap } from 'rxjs/operators';
 import { ActivatedRoute, Router } from '@angular/router';
 import { HeaderService } from '../../../service/header.service';
 
 import { Overlay } from '@angular/cdk/overlay';
 import { PanelListComponent } from '../../list/panel/panel-list.component';
 import { AppService } from '../../../service/app.service';
-import { ThrowStmt } from '@angular/compiler';
+import { PanelFolderComponent } from '../panel/panel-folder.component';
 
 
 declare function $j(selector: any): any;
@@ -84,6 +84,7 @@ export class FolderDocumentListComponent implements OnInit {
 
     @ViewChild(MatPaginator) paginator: MatPaginator;
     @ViewChild('tableBasketListSort') sort: MatSort;
+    @ViewChild('panelFolder') panelFolder: PanelFolderComponent;
 
     constructor(
         private router: Router, 
@@ -112,7 +113,13 @@ export class FolderDocumentListComponent implements OnInit {
         this.route.params.subscribe(params => {
             this.destroy$.next(true);
 
-            this.basketUrl = '../../rest/folders/' + params['folderId'];
+            this.basketUrl = '../../rest/folders/' + params['folderId'] + '/resources';
+            this.folderInfo = 
+            {
+                "id": params['folderId'],
+                "label": 'test'
+
+            };
             this.selectedRes = [];
             this.sidenavRight.close();
             window['MainHeaderComponent'].setSnav(this.sidenavLeft);
@@ -146,20 +153,13 @@ export class FolderDocumentListComponent implements OnInit {
                     return this.resultListDatabase!.getRepoIssues(
                         this.sort.active, this.sort.direction, this.paginator.pageIndex, this.basketUrl);
                 }),
-                map(data => data.folder),
                 map(data => {
-                    this.folderInfo = 
-                    {
-                        "id": data.id,
-                        "label": data.label
-
-                    };
                     // Flip flag to show that loading has finished.
                     this.isLoadingResults = false;
                     data = this.processPostData(data);
-                    this.resultsLength = data.countResources;
-                    //this.allResInBasket = data.countResources;
-                    this.headerService.setHeader('Dossier : ' + this.folderInfo.label);
+                    this.resultsLength = data.count;
+                    //this.allResInBasket = data.count;
+                    //this.headerService.setHeader('Dossier : ' + this.folderInfo.label);
                     return data.resources;
                 }),
                 catchError((err: any) => {
@@ -275,11 +275,17 @@ export class FolderDocumentListComponent implements OnInit {
             });
         }
     }
+
+    unclassify() {
+        this.http.request('DELETE', '../../rest/folders/' + this.folderInfo.id + '/resources', { body: { resources: this.selectedRes } }).pipe(
+            tap(() => this.notify.success('Courriers classés'))
+        ).subscribe();
+    }
 }
 export interface BasketList {
     folder: any;
     resources: any[];
-    countResources: number
+    count: number
 }
 
 export class ResultListHttpDao {
diff --git a/src/frontend/app/folder/folder-tree.component.html b/src/frontend/app/folder/folder-tree.component.html
index b093393c8ef..63fe816acb8 100644
--- a/src/frontend/app/folder/folder-tree.component.html
+++ b/src/frontend/app/folder/folder-tree.component.html
@@ -1,7 +1,7 @@
 <mat-nav-list>
     <mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
         <!-- This is the tree node template for leaf nodes -->
-        <mat-tree-node cdkDropList [id]="'folder-list-'+node.id" cdkDropListConnectedTo="list-1" (cdkDropListDropped)="drop($event, node)"
+        <mat-tree-node cdkDropList [id]="'folder-list-'+node.id" cdkDropListConnectedTo="['document-list','folder-list']" (cdkDropListDropped)="drop($event, node)"
             (cdkDropListEntered)="dragEnter(node)" (cdkDropListExited)="node.drag=false" [@hideShow] *matTreeNodeDef="let node"
             matTreeNodePadding matTreeNodePaddingIndent="20px">
             <!-- use a disabled button to provide padding for tree leaf -->
diff --git a/src/frontend/app/folder/folder-tree.component.ts b/src/frontend/app/folder/folder-tree.component.ts
index 8af86178c88..a24220c81d2 100644
--- a/src/frontend/app/folder/folder-tree.component.ts
+++ b/src/frontend/app/folder/folder-tree.component.ts
@@ -146,7 +146,9 @@ export class FolderTreeComponent implements OnInit {
 
     selectTree(id: number) {
         let indexSelectedFolder = this.treeControl.dataNodes.map((folder: any) => folder.id).indexOf(id);
-        this.treeControl.dataNodes[indexSelectedFolder].selected = true;
+        if (indexSelectedFolder != -1) {
+            this.treeControl.dataNodes[indexSelectedFolder].selected = true;
+        }
     }
 
     hasChild = (_: number, node: any) => node.expandable;
@@ -158,7 +160,7 @@ export class FolderTreeComponent implements OnInit {
             element.selected = false;
         });
         node.selected = true;
-        this.router.navigate(['/folders/'+node.id]);
+        this.router.navigate(['/folders/' + node.id]);
     }
 
     showAction(node: any) {
@@ -321,14 +323,43 @@ export class FolderTreeComponent implements OnInit {
     }
 
     drop(ev: any, node: any) {
-        this.dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, disableClose: true, data: { title: 'Classer '+ ev.item.data.alt_identifier, msg: 'Voulez-vous classer <b>'+ ev.item.data.alt_identifier+'</b> dans <b>' + node.label+ '</b> ?'} });
+        console.log(ev.previousContainer.id);
+        this.classifyDocument(ev, node);
+        /*if (ev.previousContainer.id === 'folder-list') {
+            this.moveFolder(ev, node);
+        } else {
+            this.classifyDocument(ev, node);
+        }*/
+    }
+
+    moveFolder(ev: any, node: any) {
+        this.dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, disableClose: true, data: { title: 'Déplacer ' + ev.item.data.alt_identifier, msg: 'Voulez-vous déplacer <b>' + ev.item.data.alt_identifier + '</b> dans <b>' + node.label + '</b> ?' } });
 
         this.dialogRef.afterClosed().pipe(
             filter((data: string) => data === 'ok'),
             //exhaustMap(() => this.http.post("../../rest/folders/" + node.id)),
-            tap(() => {     
+            tap(() => {
                 node.countResources = node.countResources + 1;
             }),
+            tap(() => this.notify.success('Courrier déplacé')),
+            tap(() => this.getFolders()),
+            finalize(() => node.drag = false),
+            catchError((err) => {
+                this.notify.handleErrors(err);
+                return of(false);
+            })
+        ).subscribe();
+    }
+
+    classifyDocument(ev: any, node: any) {
+        this.dialogRef = this.dialog.open(ConfirmComponent, { autoFocus: false, disableClose: true, data: { title: 'Classer ' + ev.item.data.alt_identifier, msg: 'Voulez-vous classer <b>' + ev.item.data.alt_identifier + '</b> dans <b>' + node.label + '</b> ?' } });
+
+        this.dialogRef.afterClosed().pipe(
+            filter((data: string) => data === 'ok'),
+            exhaustMap(() => this.http.post('../../rest/folders/' + node.id + '/resources', { resources: [ev.item.data.res_id] })),
+            tap((data: any) => {
+                node.countResources = data.countResources;
+            }),
             tap(() => this.notify.success('Courrier classé')),
             finalize(() => node.drag = false),
             catchError((err) => {
@@ -338,17 +369,19 @@ export class FolderTreeComponent implements OnInit {
         ).subscribe();
     }
 
+
+
     dragEnter(node: any) {
-        node.drag=true;
+        node.drag = true;
     }
 
     getDragIds() {
         if (this.treeControl.dataNodes !== undefined) {
-            return this.treeControl.dataNodes.map(node => 'folder-list-'+node.id);
+            return this.treeControl.dataNodes.map(node => 'folder-list-' + node.id);
         } else {
             return [];
         }
-        
+
     }
 
     toggleInput() {
diff --git a/src/frontend/app/list/basket-list.component.html b/src/frontend/app/list/basket-list.component.html
index 574210807d3..2f12c8bbf1a 100644
--- a/src/frontend/app/list/basket-list.component.html
+++ b/src/frontend/app/list/basket-list.component.html
@@ -62,7 +62,7 @@
                         </div>
                     </div>
                     <div style="height:90%;overflow:auto;position:absolute;width:100%;">
-                        <table cdkDropList id="list-1" [cdkDropListConnectedTo]="panelFolder.getDragIds()" [cdkDropListData]="data" #tableBasketListSort="matSort" mat-table [dataSource]="data" matSort
+                        <table cdkDropList id="document-list" [cdkDropListConnectedTo]="panelFolder.getDragIds()" [cdkDropListData]="data" #tableBasketListSort="matSort" mat-table [dataSource]="data" matSort
                             matSortActive="res_id" matSortDisableClear matSortDirection="asc" style="width:100%;">
 
                             <ng-container matColumnDef="res_id">
-- 
GitLab