mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	add filtering to management pages #356
This commit is contained in:
		| @@ -2,8 +2,15 @@ | ||||
|   <button type="button" class="btn btn-sm btn-outline-primary" (click)="openCreateDialog()" i18n>Create</button> | ||||
| </app-page-header> | ||||
|  | ||||
| <div class="row m-0 justify-content-end"> | ||||
|   <ngb-pagination [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| <div class="row"> | ||||
|   <div class="col-md mb-2 mb-xl-0"> | ||||
|     <div class="form-inline d-flex align-items-center"> | ||||
|       <label class="text-muted mr-2 mb-0" i18n>Filter by:</label> | ||||
|       <input class="form-control form-control-sm flex-fill w-auto" type="text" [(ngModel)]="nameFilter" placeholder="Name" i18n-placeholder> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| </div> | ||||
|  | ||||
| <table class="table table-striped border shadow-sm"> | ||||
|   | ||||
| @@ -2,9 +2,15 @@ | ||||
|   <button type="button" class="btn btn-sm btn-outline-primary" (click)="openCreateDialog()" i18n>Create</button> | ||||
| </app-page-header> | ||||
|  | ||||
| <div class="row m-0 justify-content-end"> | ||||
|   <ngb-pagination [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" | ||||
|   aria-label="Default pagination"></ngb-pagination> | ||||
| <div class="row"> | ||||
|   <div class="col-md mb-2 mb-xl-0"> | ||||
|     <div class="form-inline d-flex align-items-center"> | ||||
|       <label class="text-muted mr-2 mb-0" i18n>Filter by:</label> | ||||
|       <input class="form-control form-control-sm flex-fill w-auto" type="text" [(ngModel)]="nameFilter" placeholder="Name" i18n-placeholder> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| </div> | ||||
|  | ||||
| <table class="table table-striped border shadow-sm"> | ||||
|   | ||||
| @@ -1,17 +1,19 @@ | ||||
| import { Directive, OnInit, QueryList, ViewChildren } from '@angular/core'; | ||||
| import { Directive, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core'; | ||||
| import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; | ||||
| import { Subject, Subscription } from 'rxjs'; | ||||
| import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; | ||||
| import { MatchingModel, MATCHING_ALGORITHMS, MATCH_AUTO } from 'src/app/data/matching-model'; | ||||
| import { ObjectWithId } from 'src/app/data/object-with-id'; | ||||
| import { SortableDirective, SortEvent } from 'src/app/directives/sortable.directive'; | ||||
| import { AbstractPaperlessService } from 'src/app/services/rest/abstract-paperless-service'; | ||||
| import { AbstractNameFilterService } from 'src/app/services/rest/abstract-name-filter-service'; | ||||
| import { ToastService } from 'src/app/services/toast.service'; | ||||
| import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'; | ||||
|  | ||||
| @Directive() | ||||
| export abstract class GenericListComponent<T extends ObjectWithId> implements OnInit { | ||||
| export abstract class GenericListComponent<T extends ObjectWithId> implements OnInit, OnDestroy { | ||||
|  | ||||
|   constructor( | ||||
|     private service: AbstractPaperlessService<T>, | ||||
|     private service: AbstractNameFilterService<T>, | ||||
|     private modalService: NgbModal, | ||||
|     private editDialogComponent: any, | ||||
|     private toastService: ToastService) { | ||||
| @@ -28,6 +30,10 @@ export abstract class GenericListComponent<T extends ObjectWithId> implements On | ||||
|   public sortField: string | ||||
|   public sortReverse: boolean | ||||
|  | ||||
|   private nameFilterDebounce: Subject<string> | ||||
|   private subscription: Subscription | ||||
|   private _nameFilter: string | ||||
|  | ||||
|   getMatching(o: MatchingModel) { | ||||
|     if (o.matching_algorithm == MATCH_AUTO) { | ||||
|       return $localize`Automatic` | ||||
| @@ -44,12 +50,27 @@ export abstract class GenericListComponent<T extends ObjectWithId> implements On | ||||
|     this.reloadData() | ||||
|   } | ||||
|  | ||||
|  | ||||
|   ngOnInit(): void { | ||||
|     this.reloadData() | ||||
|  | ||||
|     this.nameFilterDebounce = new Subject<string>() | ||||
|  | ||||
|     this.subscription = this.nameFilterDebounce.pipe( | ||||
|       debounceTime(400), | ||||
|       distinctUntilChanged() | ||||
|     ).subscribe(title => { | ||||
|       this._nameFilter = title | ||||
|       this.reloadData() | ||||
|     }) | ||||
|   } | ||||
|  | ||||
|   ngOnDestroy() { | ||||
|     this.subscription.unsubscribe() | ||||
|   } | ||||
|  | ||||
|   reloadData() { | ||||
|     this.service.list(this.page, null, this.sortField, this.sortReverse).subscribe(c => { | ||||
|     this.service.listFiltered(this.page, null, this.sortField, this.sortReverse, this._nameFilter).subscribe(c => { | ||||
|       this.data = c.results | ||||
|       this.collectionSize = c.count | ||||
|     }); | ||||
| @@ -95,4 +116,12 @@ export abstract class GenericListComponent<T extends ObjectWithId> implements On | ||||
|     } | ||||
|     ) | ||||
|   } | ||||
|  | ||||
|   get nameFilter() { | ||||
|     return this._nameFilter | ||||
|   } | ||||
|  | ||||
|   set nameFilter(nameFilter: string) { | ||||
|     this.nameFilterDebounce.next(nameFilter) | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -2,9 +2,15 @@ | ||||
|   <button type="button" class="btn btn-sm btn-outline-primary" (click)="openCreateDialog()" i18n>Create</button> | ||||
| </app-page-header> | ||||
|  | ||||
| <div class="row m-0 justify-content-end"> | ||||
|   <ngb-pagination [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" | ||||
|     aria-label="Default pagination"></ngb-pagination> | ||||
| <div class="row"> | ||||
|   <div class="col-md mb-2 mb-xl-0"> | ||||
|     <div class="form-inline d-flex align-items-center"> | ||||
|       <label class="text-muted mr-2 mb-0" i18n>Filter by:</label> | ||||
|       <input class="form-control form-control-sm flex-fill w-auto" type="text" [(ngModel)]="nameFilter" placeholder="Name" i18n-placeholder> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" (pageChange)="reloadData()" aria-label="Default pagination"></ngb-pagination> | ||||
| </div> | ||||
|  | ||||
| <table class="table table-striped border shadow-sm"> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jonaswinkler
					jonaswinkler