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:
shamoon 2022-07-08 13:56:45 -07:00 committed by GitHub
commit f66e589312
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 33 deletions

View File

@ -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)
} }

View File

@ -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

View File

@ -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