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