mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Merge pull request #1133 from paperless-ngx/feature-prevent-text-dupe-api-calls
Fix: Prevent duplicate api calls on text filtering
This commit is contained in:
		| @@ -16,7 +16,7 @@ import { debounceTime, distinctUntilChanged, filter } from 'rxjs/operators' | |||||||
| import { DocumentTypeService } from 'src/app/services/rest/document-type.service' | import { DocumentTypeService } from 'src/app/services/rest/document-type.service' | ||||||
| import { TagService } from 'src/app/services/rest/tag.service' | import { TagService } from 'src/app/services/rest/tag.service' | ||||||
| import { CorrespondentService } from 'src/app/services/rest/correspondent.service' | import { CorrespondentService } from 'src/app/services/rest/correspondent.service' | ||||||
| import { FilterRule } from 'src/app/data/filter-rule' | import { filterRulesDiffer, FilterRule } from 'src/app/data/filter-rule' | ||||||
| import { | import { | ||||||
|   FILTER_ADDED_AFTER, |   FILTER_ADDED_AFTER, | ||||||
|   FILTER_ADDED_BEFORE, |   FILTER_ADDED_BEFORE, | ||||||
| @@ -204,7 +204,10 @@ export class FilterEditorComponent implements OnInit, OnDestroy { | |||||||
|   @Input() |   @Input() | ||||||
|   set unmodifiedFilterRules(value: FilterRule[]) { |   set unmodifiedFilterRules(value: FilterRule[]) { | ||||||
|     this._unmodifiedFilterRules = value |     this._unmodifiedFilterRules = value | ||||||
|     this.checkIfRulesHaveChanged() |     this.rulesModified = filterRulesDiffer( | ||||||
|  |       this._unmodifiedFilterRules, | ||||||
|  |       this._filterRules | ||||||
|  |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   get unmodifiedFilterRules(): FilterRule[] { |   get unmodifiedFilterRules(): FilterRule[] { | ||||||
| @@ -330,7 +333,10 @@ export class FilterEditorComponent implements OnInit, OnDestroy { | |||||||
|           break |           break | ||||||
|       } |       } | ||||||
|     }) |     }) | ||||||
|     this.checkIfRulesHaveChanged() |     this.rulesModified = filterRulesDiffer( | ||||||
|  |       this._unmodifiedFilterRules, | ||||||
|  |       this._filterRules | ||||||
|  |     ) | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   get filterRules(): FilterRule[] { |   get filterRules(): FilterRule[] { | ||||||
| @@ -473,31 +479,6 @@ export class FilterEditorComponent implements OnInit, OnDestroy { | |||||||
|  |  | ||||||
|   rulesModified: boolean = false |   rulesModified: boolean = false | ||||||
|  |  | ||||||
|   private checkIfRulesHaveChanged() { |  | ||||||
|     let modified = false |  | ||||||
|     if (this._unmodifiedFilterRules.length != this._filterRules.length) { |  | ||||||
|       modified = true |  | ||||||
|     } else { |  | ||||||
|       modified = this._unmodifiedFilterRules.some((rule) => { |  | ||||||
|         return ( |  | ||||||
|           this._filterRules.find( |  | ||||||
|             (fri) => fri.rule_type == rule.rule_type && fri.value == rule.value |  | ||||||
|           ) == undefined |  | ||||||
|         ) |  | ||||||
|       }) |  | ||||||
|  |  | ||||||
|       if (!modified) { |  | ||||||
|         // only check other direction if we havent already determined is modified |  | ||||||
|         modified = this._filterRules.some((rule) => { |  | ||||||
|           this._unmodifiedFilterRules.find( |  | ||||||
|             (fr) => fr.rule_type == rule.rule_type && fr.value == rule.value |  | ||||||
|           ) == undefined |  | ||||||
|         }) |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     this.rulesModified = modified |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   updateRules() { |   updateRules() { | ||||||
|     this.filterRulesChange.next(this.filterRules) |     this.filterRulesChange.next(this.filterRules) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -25,6 +25,25 @@ export function isFullTextFilterRule(filterRules: FilterRule[]): boolean { | |||||||
|   ) |   ) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export function filterRulesDiffer( | ||||||
|  |   filterRulesA: FilterRule[], | ||||||
|  |   filterRulesB: FilterRule[] | ||||||
|  | ): boolean { | ||||||
|  |   let differ = false | ||||||
|  |   if (filterRulesA.length != filterRulesB.length) { | ||||||
|  |     differ = true | ||||||
|  |   } else { | ||||||
|  |     differ = filterRulesA.some((rule) => { | ||||||
|  |       return ( | ||||||
|  |         filterRulesB.find( | ||||||
|  |           (fri) => fri.rule_type == rule.rule_type && fri.value == rule.value | ||||||
|  |         ) == undefined | ||||||
|  |       ) | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  |   return differ | ||||||
|  | } | ||||||
|  |  | ||||||
| export interface FilterRule { | export interface FilterRule { | ||||||
|   rule_type: number |   rule_type: number | ||||||
|   value: string |   value: string | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core' | |||||||
| import { ParamMap, Router } from '@angular/router' | import { ParamMap, Router } from '@angular/router' | ||||||
| import { Observable } from 'rxjs' | import { Observable } from 'rxjs' | ||||||
| import { | import { | ||||||
|  |   filterRulesDiffer, | ||||||
|   cloneFilterRules, |   cloneFilterRules, | ||||||
|   FilterRule, |   FilterRule, | ||||||
|   isFullTextFilterRule, |   isFullTextFilterRule, | ||||||
| @@ -67,6 +68,7 @@ export interface ListViewState { | |||||||
| }) | }) | ||||||
| export class DocumentListViewService { | export class DocumentListViewService { | ||||||
|   isReloading: boolean = false |   isReloading: boolean = false | ||||||
|  |   initialized: boolean = false | ||||||
|   error: string = null |   error: string = null | ||||||
|  |  | ||||||
|   rangeSelectionAnchorIndex: number |   rangeSelectionAnchorIndex: number | ||||||
| @@ -172,11 +174,24 @@ export class DocumentListViewService { | |||||||
|     if (!paramsEmpty) newState = parseParams(queryParams) |     if (!paramsEmpty) newState = parseParams(queryParams) | ||||||
|     if (newState == undefined) newState = this.defaultListViewState() // if nothing in local storage |     if (newState == undefined) newState = this.defaultListViewState() // if nothing in local storage | ||||||
|  |  | ||||||
|     this.activeListViewState.filterRules = newState.filterRules |     // only reload if things have changed | ||||||
|     this.activeListViewState.sortField = newState.sortField |     if ( | ||||||
|     this.activeListViewState.sortReverse = newState.sortReverse |       !this.initialized || | ||||||
|     this.activeListViewState.currentPage = newState.currentPage |       paramsEmpty || | ||||||
|     this.reload(null, paramsEmpty) // update the params if there arent any |       this.activeListViewState.sortField !== newState.sortField || | ||||||
|  |       this.activeListViewState.sortReverse !== newState.sortReverse || | ||||||
|  |       this.activeListViewState.currentPage !== newState.currentPage || | ||||||
|  |       filterRulesDiffer( | ||||||
|  |         this.activeListViewState.filterRules, | ||||||
|  |         newState.filterRules | ||||||
|  |       ) | ||||||
|  |     ) { | ||||||
|  |       this.activeListViewState.filterRules = newState.filterRules | ||||||
|  |       this.activeListViewState.sortField = newState.sortField | ||||||
|  |       this.activeListViewState.sortReverse = newState.sortReverse | ||||||
|  |       this.activeListViewState.currentPage = newState.currentPage | ||||||
|  |       this.reload(null, paramsEmpty) // update the params if there arent any | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   reload(onFinish?, updateQueryParams: boolean = true) { |   reload(onFinish?, updateQueryParams: boolean = true) { | ||||||
| @@ -193,6 +208,7 @@ export class DocumentListViewService { | |||||||
|       ) |       ) | ||||||
|       .subscribe({ |       .subscribe({ | ||||||
|         next: (result) => { |         next: (result) => { | ||||||
|  |           this.initialized = true | ||||||
|           this.isReloading = false |           this.isReloading = false | ||||||
|           activeListViewState.collectionSize = result.count |           activeListViewState.collectionSize = result.count | ||||||
|           activeListViewState.documents = result.results |           activeListViewState.documents = result.results | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 shamoon
					shamoon