mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-09 09:58:20 -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:
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