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:
		
						commit
						f66e589312
					
				@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user