RemoteVersionService,
AppRemoteVersion,
} from 'src/app/services/rest/remote-version.service'
+import { QueryParamsService } from 'src/app/services/query-params.service'
@Component({
selector: 'app-app-frame',
public savedViewService: SavedViewService,
private list: DocumentListViewService,
private meta: Meta,
- private remoteVersionService: RemoteVersionService
+ private remoteVersionService: RemoteVersionService,
+ private queryParamsService: QueryParamsService
) {
this.remoteVersionService
.checkForUpdates()
search() {
this.closeMenu()
- this.list.quickFilter([
+ this.queryParamsService.loadFilterRules([
{
rule_type: FILTER_FULLTEXT_QUERY,
value: (this.searchField.value as string).trim(),
import { Subscription } from 'rxjs'
import { PaperlessDocument } from 'src/app/data/paperless-document'
import { PaperlessSavedView } from 'src/app/data/paperless-saved-view'
-import { DocumentListViewService } from 'src/app/services/document-list-view.service'
import { ConsumerStatusService } from 'src/app/services/consumer-status.service'
import { DocumentService } from 'src/app/services/rest/document.service'
import { PaperlessTag } from 'src/app/data/paperless-tag'
import { FILTER_HAS_TAGS_ALL } from 'src/app/data/filter-rule-type'
+import { QueryParamsService } from 'src/app/services/query-params.service'
@Component({
selector: 'app-saved-view-widget',
constructor(
private documentService: DocumentService,
private router: Router,
- private list: DocumentListViewService,
+ private queryParamsService: QueryParamsService,
private consumerStatusService: ConsumerStatusService
) {}
}
clickTag(tag: PaperlessTag) {
- this.list.quickFilter([
+ this.queryParamsService.loadFilterRules([
{ rule_type: FILTER_HAS_TAGS_ALL, value: tag.id.toString() },
])
}
import { PaperlessDocumentSuggestions } from 'src/app/data/paperless-document-suggestions'
import { FILTER_FULLTEXT_MORELIKE } from 'src/app/data/filter-rule-type'
import { normalizeDateStr } from 'src/app/utils/date'
+import { QueryParamsService } from 'src/app/services/query-params.service'
@Component({
selector: 'app-document-detail',
private documentListViewService: DocumentListViewService,
private documentTitlePipe: DocumentTitlePipe,
private toastService: ToastService,
- private settings: SettingsService
+ private settings: SettingsService,
+ private queryParamsService: QueryParamsService
) {
this.titleSubject
.pipe(
}
moreLike() {
- this.documentListViewService.quickFilter([
+ this.queryParamsService.loadFilterRules([
{
rule_type: FILTER_FULLTEXT_MORELIKE,
value: this.documentId.toString(),
} from 'src/app/directives/sortable.directive'
import { ConsumerStatusService } from 'src/app/services/consumer-status.service'
import { DocumentListViewService } from 'src/app/services/document-list-view.service'
+import { QueryParamsService } from 'src/app/services/query-params.service'
import {
DocumentService,
DOCUMENT_SORT_FIELDS,
private router: Router,
private toastService: ToastService,
private modalService: NgbModal,
- private consumerStatusService: ConsumerStatusService
+ private consumerStatusService: ConsumerStatusService,
+ private queryParamsService: QueryParamsService
) {}
@ViewChild('filterEditor')
this.unmodifiedFilterRules = view.filter_rules
})
- const allFilterRuleQueryParams: string[] = FILTER_RULE_TYPES.map(
- (rt) => rt.filtervar
- )
-
this.route.queryParamMap
.pipe(
filter(() => !this.route.snapshot.paramMap.has('id')), // only when not on saved view
if (queryParams.has('view')) {
this.loadViewConfig(parseInt(queryParams.get('view')))
} else {
- // 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,
- }
- })
- )
- })
-
this.list.activateSavedView(null)
- this.list.filterRules = filterRulesFromQueryParams
+ this.queryParamsService.params = queryParams
+ this.list.filterRules = this.queryParamsService.filterRules
this.list.reload()
this.unmodifiedFilterRules = []
}
.pipe(takeUntil(this.unsubscribeNotifier))
.subscribe({
next: (filterRules) => {
- const params =
- this.documentService.filterRulesToQueryParams(filterRules)
+ this.queryParamsService.filterRules = filterRules
// if we were on a saved view we navigate 'away' to /documents
let base = []
this.router.navigate(base, {
relativeTo: this.route,
- queryParams: params,
+ queryParams: this.queryParamsService.params,
})
},
})
}
clickMoreLike(documentID: number) {
- this.list.quickFilter([
+ this.queryParamsService.loadFilterRules([
{ rule_type: FILTER_FULLTEXT_MORELIKE, value: documentID.toString() },
])
}
import { FILTER_CORRESPONDENT } from 'src/app/data/filter-rule-type'
import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent'
import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe'
-import { DocumentListViewService } from 'src/app/services/document-list-view.service'
+import { QueryParamsService } from 'src/app/services/query-params.service'
import { CorrespondentService } from 'src/app/services/rest/correspondent.service'
import { ToastService } from 'src/app/services/toast.service'
import { CorrespondentEditDialogComponent } from '../../common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component'
correspondentsService: CorrespondentService,
modalService: NgbModal,
toastService: ToastService,
- list: DocumentListViewService,
+ queryParamsService: QueryParamsService,
private datePipe: CustomDatePipe
) {
super(
modalService,
CorrespondentEditDialogComponent,
toastService,
- list,
+ queryParamsService,
FILTER_CORRESPONDENT,
$localize`correspondent`,
[
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { FILTER_DOCUMENT_TYPE } from 'src/app/data/filter-rule-type'
import { PaperlessDocumentType } from 'src/app/data/paperless-document-type'
-import { DocumentListViewService } from 'src/app/services/document-list-view.service'
+import { QueryParamsService } from 'src/app/services/query-params.service'
import { DocumentTypeService } from 'src/app/services/rest/document-type.service'
import { ToastService } from 'src/app/services/toast.service'
import { DocumentTypeEditDialogComponent } from '../../common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component'
documentTypeService: DocumentTypeService,
modalService: NgbModal,
toastService: ToastService,
- list: DocumentListViewService
+ queryParamsService: QueryParamsService
) {
super(
documentTypeService,
modalService,
DocumentTypeEditDialogComponent,
toastService,
- list,
+ queryParamsService,
FILTER_DOCUMENT_TYPE,
$localize`document type`,
[]
SortEvent,
} from 'src/app/directives/sortable.directive'
import { DocumentListViewService } from 'src/app/services/document-list-view.service'
+import { QueryParamsService } from 'src/app/services/query-params.service'
import { AbstractNameFilterService } from 'src/app/services/rest/abstract-name-filter-service'
import { ToastService } from 'src/app/services/toast.service'
import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
private modalService: NgbModal,
private editDialogComponent: any,
private toastService: ToastService,
- private list: DocumentListViewService,
+ private queryParamsService: QueryParamsService,
protected filterRuleType: number,
public typeName: string,
public extraColumns: ManagementListColumn[]
}
filterDocuments(object: ObjectWithId) {
- this.list.quickFilter([
+ this.queryParamsService.loadFilterRules([
{ rule_type: this.filterRuleType, value: object.id.toString() },
])
}
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { FILTER_HAS_TAGS_ALL } from 'src/app/data/filter-rule-type'
import { PaperlessTag } from 'src/app/data/paperless-tag'
-import { DocumentListViewService } from 'src/app/services/document-list-view.service'
+import { QueryParamsService } from 'src/app/services/query-params.service'
import { TagService } from 'src/app/services/rest/tag.service'
import { ToastService } from 'src/app/services/toast.service'
import { TagEditDialogComponent } from '../../common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component'
tagService: TagService,
modalService: NgbModal,
toastService: ToastService,
- list: DocumentListViewService
+ queryParamsService: QueryParamsService
) {
super(
tagService,
modalService,
TagEditDialogComponent,
toastService,
- list,
+ queryParamsService,
FILTER_HAS_TAGS_ALL,
$localize`tag`,
[
import { Injectable } from '@angular/core'
-import { ActivatedRoute, Router } from '@angular/router'
+import { ActivatedRoute, Params, Router } from '@angular/router'
import { Observable } from 'rxjs'
import {
cloneFilterRules,
import { PaperlessDocument } from '../data/paperless-document'
import { PaperlessSavedView } from '../data/paperless-saved-view'
import { DOCUMENT_LIST_SERVICE } from '../data/storage-keys'
+import { QueryParamsService } from './query-params.service'
import { DocumentService, DOCUMENT_SORT_FIELDS } from './rest/document.service'
import { SettingsService, SETTINGS_KEYS } from './settings.service'
return this.activeListViewState.sortReverse
}
+ get sortParams(): Params {
+ return {
+ sortField: this.sortField,
+ sortReverse: this.sortReverse,
+ }
+ }
+
get collectionSize(): number {
return this.activeListViewState.collectionSize
}
}
}
- quickFilter(filterRules: FilterRule[]) {
- const params = this.documentService.filterRulesToQueryParams(filterRules)
- this.router.navigate(['/documents'], {
- relativeTo: this.route,
- queryParams: params,
- })
- }
-
getLastPage(): number {
return Math.ceil(this.collectionSize / this.currentPageSize)
}
constructor(
private documentService: DocumentService,
private settings: SettingsService,
- private router: Router,
- private route: ActivatedRoute
+ private queryParamsService: QueryParamsService
) {
let documentListViewConfigJson = localStorage.getItem(
DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG
--- /dev/null
+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,
+ })
+ }
+}
import { TagService } from './tag.service'
import { FILTER_RULE_TYPES } from 'src/app/data/filter-rule-type'
import { PaperlessDocumentSuggestions } from 'src/app/data/paperless-document-suggestions'
+import { QueryParamsService } from '../query-params.service'
export const DOCUMENT_SORT_FIELDS = [
{ field: 'archive_serial_number', name: $localize`ASN` },
http: HttpClient,
private correspondentService: CorrespondentService,
private documentTypeService: DocumentTypeService,
- private tagService: TagService
+ private tagService: TagService,
+ private queryParamsService: QueryParamsService
) {
super(http, 'documents')
}
- public 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
- }
- }
-
addObservablesToDocument(doc: PaperlessDocument) {
if (doc.correspondent) {
doc.correspondent$ = this.correspondentService.getCached(
filterRules?: FilterRule[],
extraParams = {}
): Observable<Results<PaperlessDocument>> {
+ this.queryParamsService.filterRules = filterRules
return this.list(
page,
pageSize,
sortField,
sortReverse,
- Object.assign(extraParams, this.filterRulesToQueryParams(filterRules))
+ Object.assign(extraParams, this.queryParamsService.params)
).pipe(
map((results) => {
results.results.forEach((doc) => this.addObservablesToDocument(doc))