From 27db0d243b0baeddf98225489690c975a0737d91 Mon Sep 17 00:00:00 2001
From: Alex ORLUC <alex.orluc@maarch.org>
Date: Wed, 11 Sep 2019 19:36:44 +0200
Subject: [PATCH] FIX #11642 TIME 1:30 fix filter folder menu

---
 .../folder-menu/folder-menu.component.html    | 28 ++++++++----
 .../folder-menu/folder-menu.component.scss    | 10 +++++
 .../folder-menu/folder-menu.component.ts      | 43 ++++++++++++++++---
 src/frontend/plugins/filterList.pipe.ts       | 12 ------
 4 files changed, 68 insertions(+), 25 deletions(-)

diff --git a/src/frontend/app/folder/folder-menu/folder-menu.component.html b/src/frontend/app/folder/folder-menu/folder-menu.component.html
index abdd402abd8..98a521ae3e6 100644
--- a/src/frontend/app/folder/folder-menu/folder-menu.component.html
+++ b/src/frontend/app/folder/folder-menu/folder-menu.component.html
@@ -1,18 +1,30 @@
-<button mat-menu-item [matMenuTriggerFor]="currentFolders" *ngIf="currentFoldersList !== undefined && currentFoldersList.length > 0" class="folderAction">
+<button mat-menu-item [matMenuTriggerFor]="currentFolders"
+    *ngIf="currentFoldersList !== undefined && currentFoldersList.length > 0" class="folderAction">
     <mat-icon color="warn" class="fa fa-folder-minus fa-2x"></mat-icon>
     <span>{{lang.removeFromFolder}}...</span>
 </button>
 <mat-menu #currentFolders="matMenu" [class]="'folderListMenu'">
-    <button mat-menu-item *ngFor="let currentfolder of currentFoldersList | sortBy : 'label'" class="labelFolder" (click)="unclassifyDocuments(currentfolder)" [title]="currentfolder.label"><i class="fa fa-users private" *ngIf="currentfolder.public" title="{{lang.sharedFolder}}"></i> {{currentfolder.label}}</button>
+    <button mat-menu-item *ngFor="let currentfolder of currentFoldersList | sortBy : 'label'" class="labelFolder"
+        (click)="unclassifyDocuments(currentfolder)" [title]="currentfolder.label"><i class="fa fa-users private"
+            *ngIf="currentfolder.public" title="{{lang.sharedFolder}}"></i> {{currentfolder.label}}</button>
 </mat-menu>
-<button mat-menu-item [matMenuTriggerFor]="folders" class="folderAction" (menuOpened)="getFolders()" [disabled]="resIds.length === 0">
+<button mat-menu-item [matMenuTriggerFor]="folders" class="folderAction" (menuOpened)="initFolderMenu()"
+    [disabled]="resIds.length === 0">
     <mat-icon color="primary" class="fa fa-folder-open fa-2x"></mat-icon>
     <span>{{lang.classifyIn}}</span>
 </button>
-<mat-menu #folders="matMenu" [class]="'folderListMenu'">
-        <plugin-autocomplete [labelPlaceholder]="lang.searchFolder" [size]="'small'"
+<mat-menu #folders="matMenu" [class]="'folderListMenu'" restoreFocus="false">
+    <ng-template matMenuContent>
+        <mat-form-field floatLabel="never" appearance="outline" class="smallInput"  (click)="$event.stopPropagation();">
+            <input matInput id="searchTerm" placeholder="{{lang.searchFolder}}" [formControl]="searchTerm" autocomplete="off" (click)="$event.stopPropagation();" (keydown)="$event.stopPropagation()">
+        </mat-form-field>
+        <!--<plugin-autocomplete [labelPlaceholder]="lang.searchFolder" [size]="'small'"
         [routeDatas]="['/rest/autocomplete/folders']" [targetSearchKey]="'idToDisplay'"
-        (triggerEvent)="classifyDocuments($event)"></plugin-autocomplete>
-    <button *ngIf="foldersList.length === 0" mat-menu-item class="noFolder" disabled>{{lang.noAvailableFolder}}</button>
-    <button mat-menu-item *ngFor="let folder of foldersList | sortBy : 'label'" class="labelFolder" (click)="classifyDocuments(folder)" [title]="folder.label"><i class="fa fa-users private" *ngIf="folder.public" title="{{lang.sharedFolder}}"></i> {{folder.label}}</button>
+        (triggerEvent)="classifyDocuments($event)"></plugin-autocomplete>-->
+        <button *ngIf="foldersList.length === 0" mat-menu-item class="noFolder"
+            disabled>{{lang.noAvailableFolder}}</button>
+        <button mat-menu-item *ngFor="let folder of foldersList | sortBy : 'label'" class="labelFolder"
+            (click)="classifyDocuments(folder)" [title]="folder.label"><i class="fa fa-users private"
+                *ngIf="folder.public" title="{{lang.sharedFolder}}"></i> {{folder.label}}</button>
+    </ng-template>
 </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
index 5ec433d5b41..5221d62bc8a 100644
--- a/src/frontend/app/folder/folder-menu/folder-menu.component.scss
+++ b/src/frontend/app/folder/folder-menu/folder-menu.component.scss
@@ -27,4 +27,14 @@
     color: rgb(102, 102, 102);
     text-align: center;
     font-style: italic;
+}
+
+.smallInput {
+    font-size: 11px;
+    padding-left: 20px;
+    padding-right: 20px;
+    ::ng-deep.mat-form-field-infix {
+        padding : 0px;
+        padding-bottom: 5px;
+    }
 }
\ 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
index fb73fce318f..d8e34382c5d 100644
--- a/src/frontend/app/folder/folder-menu/folder-menu.component.ts
+++ b/src/frontend/app/folder/folder-menu/folder-menu.component.ts
@@ -1,11 +1,12 @@
-import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
+import { Component, OnInit, Input, Output, EventEmitter, Renderer2 } from '@angular/core';
 import { LANG } from '../../translate.component';
 import { HttpClient } from '@angular/common/http';
-import { map, tap, catchError, filter, exhaustMap } from 'rxjs/operators';
+import { map, tap, catchError, filter, exhaustMap, debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
 import { of } from 'rxjs';
 import { NotificationService } from '../../notification.service';
 import { ConfirmComponent } from '../../../plugins/modal/confirm.component';
 import { MatDialogRef, MatDialog } from '@angular/material/dialog';
+import { FormControl } from '@angular/forms';
 
 @Component({
     selector: 'folder-menu',
@@ -24,15 +25,47 @@ export class FolderMenuComponent implements OnInit {
     @Output('refreshFolders') refreshFolders = new EventEmitter<string>();
     @Output('refreshList') refreshList = new EventEmitter<string>();
 
+    searchTerm: FormControl = new FormControl();
+
     dialogRef: MatDialogRef<any>;
-    
+
     constructor(
         public http: HttpClient,
         private notify: NotificationService,
-        public dialog: MatDialog
+        public dialog: MatDialog,
+        private renderer: Renderer2
     ) { }
 
-    ngOnInit(): void { }
+    ngOnInit(): void {
+        this.searchTerm.valueChanges.pipe(
+            debounceTime(300),
+            tap((value: any) => {
+                if (value.length === 0) {
+                    this.getFolders();
+                }
+            }),
+            filter(value => value.length > 2),
+            distinctUntilChanged(),
+            switchMap(data => this.http.get('../../rest/autocomplete/folders', { params: { "search": data } })),
+            tap((data: any) => {
+                this.foldersList = data.map(
+                    (info: any) => {
+                        return {
+                            id: info.id,
+                            label: info.idToDisplay
+                        }
+                    }
+                );
+            })
+        ).subscribe();
+    }
+
+    initFolderMenu() {
+        this.searchTerm.setValue('');
+        setTimeout(() => {
+            this.renderer.selectRootElement('#searchTerm').focus();
+        }, 200);
+    }
 
     getFolders() {
         this.http.get("../../rest/folders").pipe(
diff --git a/src/frontend/plugins/filterList.pipe.ts b/src/frontend/plugins/filterList.pipe.ts
index 603fd95f089..87cbbae6623 100755
--- a/src/frontend/plugins/filterList.pipe.ts
+++ b/src/frontend/plugins/filterList.pipe.ts
@@ -19,18 +19,6 @@ export class FilterListPipe implements PipeTransform {
 			console.log('Init filter failed for values : ');
 			console.log(value);
 		}
-		
 	}
 }
 
-/*@Pipe({
-	name: 'filterShortcut'
-})
-export class FilterShortcutPipe implements PipeTransform {
-
-	transform(value: any, args: string): any {
-
-		let filter = args.toLocaleLowerCase();
-		return filter ? value.filter((shortcut:any) => shortcut.label.toLocaleLowerCase().indexOf(filter) != -1) : value;
-	}
-}*/
-- 
GitLab