mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-12-15 02:57:09 +01:00
102 lines
2.7 KiB
TypeScript
102 lines
2.7 KiB
TypeScript
|
|
import { Injectable } from '@angular/core'
|
||
|
|
import {
|
||
|
|
ActivatedRoute,
|
||
|
|
convertToParamMap,
|
||
|
|
ParamMap,
|
||
|
|
Params,
|
||
|
|
Router,
|
||
|
|
} from '@angular/router'
|
||
|
|
import { FilterRule } from '../data/filter-rule'
|
||
|
|
import { FILTER_RULE_TYPES } from '../data/filter-rule-type'
|
||
|
|
|
||
|
|
@Injectable({
|
||
|
|
providedIn: 'root',
|
||
|
|
})
|
||
|
|
export class QueryParamsService {
|
||
|
|
constructor(private router: Router, private route: ActivatedRoute) {}
|
||
|
|
|
||
|
|
private filterParams: Params
|
||
|
|
private _filterRules: FilterRule[]
|
||
|
|
|
||
|
|
set filterRules(filterRules: FilterRule[]) {
|
||
|
|
this._filterRules = filterRules
|
||
|
|
this.filterParams = this.filterRulesToQueryParams(filterRules)
|
||
|
|
}
|
||
|
|
|
||
|
|
get filterRules(): FilterRule[] {
|
||
|
|
return this._filterRules
|
||
|
|
}
|
||
|
|
|
||
|
|
set params(params: any) {
|
||
|
|
this.filterParams = params
|
||
|
|
this._filterRules = this.filterRulesFromQueryParams(
|
||
|
|
params.keys ? params : convertToParamMap(params) // ParamMap
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
get params(): Params {
|
||
|
|
return {
|
||
|
|
...this.filterParams,
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private filterRulesToQueryParams(filterRules: FilterRule[]): Object {
|
||
|
|
if (filterRules) {
|
||
|
|
let params = {}
|
||
|
|
for (let rule of filterRules) {
|
||
|
|
let ruleType = FILTER_RULE_TYPES.find((t) => t.id == rule.rule_type)
|
||
|
|
if (ruleType.multi) {
|
||
|
|
params[ruleType.filtervar] = params[ruleType.filtervar]
|
||
|
|
? params[ruleType.filtervar] + ',' + rule.value
|
||
|
|
: rule.value
|
||
|
|
} else if (ruleType.isnull_filtervar && rule.value == null) {
|
||
|
|
params[ruleType.isnull_filtervar] = true
|
||
|
|
} else {
|
||
|
|
params[ruleType.filtervar] = rule.value
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return params
|
||
|
|
} else {
|
||
|
|
return null
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private filterRulesFromQueryParams(queryParams: ParamMap) {
|
||
|
|
const allFilterRuleQueryParams: string[] = FILTER_RULE_TYPES.map(
|
||
|
|
(rt) => rt.filtervar
|
||
|
|
)
|
||
|
|
|
||
|
|
// transform query params to filter rules
|
||
|
|
let filterRulesFromQueryParams: FilterRule[] = []
|
||
|
|
allFilterRuleQueryParams
|
||
|
|
.filter((frqp) => queryParams.has(frqp))
|
||
|
|
.forEach((filterQueryParamName) => {
|
||
|
|
const filterQueryParamValues: string[] = queryParams
|
||
|
|
.get(filterQueryParamName)
|
||
|
|
.split(',')
|
||
|
|
|
||
|
|
filterRulesFromQueryParams = filterRulesFromQueryParams.concat(
|
||
|
|
// map all values to filter rules
|
||
|
|
filterQueryParamValues.map((val) => {
|
||
|
|
return {
|
||
|
|
rule_type: FILTER_RULE_TYPES.find(
|
||
|
|
(rt) => rt.filtervar == filterQueryParamName
|
||
|
|
).id,
|
||
|
|
value: val,
|
||
|
|
}
|
||
|
|
})
|
||
|
|
)
|
||
|
|
})
|
||
|
|
|
||
|
|
return filterRulesFromQueryParams
|
||
|
|
}
|
||
|
|
|
||
|
|
loadFilterRules(filterRules: FilterRule[]) {
|
||
|
|
this.filterRules = filterRules
|
||
|
|
this.router.navigate(['/documents'], {
|
||
|
|
relativeTo: this.route,
|
||
|
|
queryParams: this.params,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|