mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	editable saved views
This commit is contained in:
		| @@ -34,24 +34,35 @@ | ||||
|       <a ngbNavLink>Saved views</a> | ||||
|       <ng-template ngbNavContent> | ||||
|  | ||||
|         <table class="table table-borderless table-sm"> | ||||
|           <thead> | ||||
|             <tr> | ||||
|               <th scope="col">Title</th> | ||||
|               <th scope="col">Show in dashboard</th> | ||||
|               <th scope="col">Show in sidebar</th> | ||||
|               <th scope="col">Actions</th> | ||||
|             </tr> | ||||
|           </thead> | ||||
|           <tbody> | ||||
|             <tr *ngFor="let view of savedViewService.allViews"> | ||||
|               <td>{{ view.name }}</td> | ||||
|               <td>{{ view.show_on_dashboard | yesno }}</td> | ||||
|               <td>{{ view.show_in_sidebar | yesno }}</td> | ||||
|               <td><button type="button" class="btn btn-sm btn-outline-danger" (click)="deleteSavedView(view)">Delete</button></td> | ||||
|             </tr> | ||||
|           </tbody> | ||||
|         </table> | ||||
|         <div formGroupName="savedViews"> | ||||
|            | ||||
|             <div *ngFor="let view of savedViews" [formGroupName]="view.id" class="form-row"> | ||||
|               <div class="form-group col-4 mr-3"> | ||||
|                 <label for="name_{{view.id}}">Name</label> | ||||
|                 <input type="text" class="form-control" formControlName="name" id="name_{{view.id}}"> | ||||
|               </div> | ||||
|  | ||||
|               <div class="form-group col-auto mr-3"> | ||||
|                 <label for="show_on_dashboard_{{view.id}}">Appears on</label> | ||||
|                 <div class="custom-control custom-switch"> | ||||
|                   <input type="checkbox" class="custom-control-input" id="show_on_dashboard_{{view.id}}" formControlName="show_on_dashboard"> | ||||
|                   <label class="custom-control-label" for="show_on_dashboard_{{view.id}}">Show on dashboard</label> | ||||
|                 </div> | ||||
|                 <div class="custom-control custom-switch"> | ||||
|                   <input type="checkbox" class="custom-control-input" id="show_in_sidebar_{{view.id}}" formControlName="show_in_sidebar"> | ||||
|                   <label class="custom-control-label" for="show_in_sidebar_{{view.id}}">Show in sidebar</label> | ||||
|                 </div> | ||||
|               </div> | ||||
|  | ||||
|               <div class="form-group col-auto"> | ||||
|                 <label for="name_{{view.id}}">Actions</label> | ||||
|                 <button type="button" class="btn btn-sm btn-outline-danger form-control" (click)="deleteSavedView(view)">Delete</button> | ||||
|               </div> | ||||
|             </div> | ||||
|  | ||||
|             <div *ngIf="savedViews.length == 0">No saved views defined.</div> | ||||
|            | ||||
|         </div> | ||||
|  | ||||
|       </ng-template> | ||||
|     </li> | ||||
|   | ||||
| @@ -11,10 +11,13 @@ import { Toast, ToastService } from 'src/app/services/toast.service'; | ||||
|   templateUrl: './settings.component.html', | ||||
|   styleUrls: ['./settings.component.scss'] | ||||
| }) | ||||
| export class SettingsComponent { | ||||
| export class SettingsComponent implements OnInit { | ||||
|  | ||||
|   savedViewGroup = new FormGroup({}) | ||||
|  | ||||
|   settingsForm = new FormGroup({ | ||||
|     'documentListItemPerPage': new FormControl(+localStorage.getItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE) || GENERAL_SETTINGS.DOCUMENT_LIST_SIZE_DEFAULT) | ||||
|     'documentListItemPerPage': new FormControl(+localStorage.getItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE) || GENERAL_SETTINGS.DOCUMENT_LIST_SIZE_DEFAULT), | ||||
|     'savedViews': this.savedViewGroup | ||||
|   }) | ||||
|  | ||||
|   constructor( | ||||
| @@ -23,14 +26,40 @@ export class SettingsComponent { | ||||
|     private toastService: ToastService | ||||
|   ) { } | ||||
|  | ||||
|   savedViews: PaperlessSavedView[] | ||||
|  | ||||
|   ngOnInit() { | ||||
|     this.savedViewService.listAll().subscribe(r => { | ||||
|       this.savedViews = r.results | ||||
|       for (let view of this.savedViews) { | ||||
|         this.savedViewGroup.addControl(view.id.toString(), new FormGroup({ | ||||
|           "id": new FormControl(view.id), | ||||
|           "name": new FormControl(view.name), | ||||
|           "show_on_dashboard": new FormControl(view.show_on_dashboard), | ||||
|           "show_in_sidebar": new FormControl(view.show_in_sidebar) | ||||
|         })) | ||||
|       } | ||||
|     }) | ||||
|   } | ||||
|  | ||||
|   deleteSavedView(savedView: PaperlessSavedView) { | ||||
|     this.savedViewService.delete(savedView).subscribe(() => { | ||||
|       this.savedViewGroup.removeControl(savedView.id.toString()) | ||||
|       this.savedViews.splice(this.savedViews.indexOf(savedView), 1) | ||||
|       this.toastService.showToast(Toast.make("Information", `Saved view "${savedView.name} deleted.`)) | ||||
|     }) | ||||
|   } | ||||
|  | ||||
|   saveSettings() { | ||||
|     localStorage.setItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE, this.settingsForm.value.documentListItemPerPage) | ||||
|     this.documentListViewService.updatePageSize() | ||||
|     let x = [] | ||||
|     for (let id in this.savedViewGroup.value) { | ||||
|       x.push(this.savedViewGroup.value[id]) | ||||
|     } | ||||
|     this.savedViewService.patchMany(x).subscribe(s => { | ||||
|       this.toastService.showToast(Toast.make("Information", "Settings saved successfully.")) | ||||
|       localStorage.setItem(GENERAL_SETTINGS.DOCUMENT_LIST_SIZE, this.settingsForm.value.documentListItemPerPage) | ||||
|       this.documentListViewService.updatePageSize() | ||||
|     }) | ||||
|  | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -92,4 +92,10 @@ export abstract class AbstractPaperlessService<T extends ObjectWithId> { | ||||
|     this._listAll = null | ||||
|     return this.http.put<T>(this.getResourceUrl(o.id), o) | ||||
|   } | ||||
|  | ||||
|   patch(o: T): Observable<T> { | ||||
|     this._listAll = null | ||||
|     return this.http.patch<T>(this.getResourceUrl(o.id), o) | ||||
|   } | ||||
|  | ||||
| } | ||||
| @@ -1,5 +1,6 @@ | ||||
| import { HttpClient } from '@angular/common/http'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { combineLatest, Observable } from 'rxjs'; | ||||
| import { tap } from 'rxjs/operators'; | ||||
| import { PaperlessSavedView } from 'src/app/data/paperless-saved-view'; | ||||
| import { AbstractPaperlessService } from './abstract-paperless-service'; | ||||
| @@ -44,6 +45,12 @@ export class SavedViewService extends AbstractPaperlessService<PaperlessSavedVie | ||||
|     ) | ||||
|   } | ||||
|    | ||||
|   patchMany(objects: PaperlessSavedView[]): Observable<PaperlessSavedView[]> { | ||||
|     return combineLatest(objects.map(o => super.patch(o))).pipe( | ||||
|       tap(() => this.reload()) | ||||
|     ) | ||||
|   } | ||||
|  | ||||
|   delete(o: PaperlessSavedView) { | ||||
|     return super.delete(o).pipe( | ||||
|       tap(() => this.reload()) | ||||
|   | ||||
| @@ -159,11 +159,15 @@ class SavedViewSerializer(serializers.ModelSerializer): | ||||
|                   "sort_field", "sort_reverse", "filter_rules"] | ||||
|  | ||||
|     def update(self, instance, validated_data): | ||||
|         rules_data = validated_data.pop('filter_rules') | ||||
|         if 'filter_rules' in validated_data: | ||||
|             rules_data = validated_data.pop('filter_rules') | ||||
|         else: | ||||
|             rules_data = None | ||||
|         super(SavedViewSerializer, self).update(instance, validated_data) | ||||
|         SavedViewFilterRule.objects.filter(saved_view=instance).delete() | ||||
|         for rule_data in rules_data: | ||||
|             SavedViewFilterRule.objects.create(saved_view=instance, **rule_data) | ||||
|         if rules_data: | ||||
|             SavedViewFilterRule.objects.filter(saved_view=instance).delete() | ||||
|             for rule_data in rules_data: | ||||
|                 SavedViewFilterRule.objects.create(saved_view=instance, **rule_data) | ||||
|         return instance | ||||
|  | ||||
|     def create(self, validated_data): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jonaswinkler
					jonaswinkler