Refactor query params service

This commit is contained in:
Michael Shamoon
2022-05-20 15:16:17 -07:00
parent feaf2da834
commit e60a7df9a2
14 changed files with 205 additions and 257 deletions

View File

@@ -10,13 +10,14 @@ import { PaperlessDocument } from '../data/paperless-document'
import { PaperlessSavedView } from '../data/paperless-saved-view'
import { SETTINGS_KEYS } from '../data/paperless-uisettings'
import { DOCUMENT_LIST_SERVICE } from '../data/storage-keys'
import { generateParams, parseQueryParams } from '../utils/query-params'
import { DocumentService, DOCUMENT_SORT_FIELDS } from './rest/document.service'
import { SettingsService } from './settings.service'
/**
* Captures the current state of the list view.
*/
interface ListViewState {
export interface ListViewState {
/**
* Title of the document list view. Either "Documents" (localized) or the name of a saved view.
*/
@@ -32,7 +33,7 @@ interface ListViewState {
/**
* Total amount of documents with the current filter rules. Used to calculate the number of pages.
*/
collectionSize: number
collectionSize?: number
/**
* Currently selected sort field.
@@ -85,6 +86,32 @@ export class DocumentListViewService {
return this.activeListViewState.title
}
constructor(
private documentService: DocumentService,
private settings: SettingsService,
private router: Router
) {
let documentListViewConfigJson = localStorage.getItem(
DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG
)
if (documentListViewConfigJson) {
try {
let savedState: ListViewState = JSON.parse(documentListViewConfigJson)
// Remove null elements from the restored state
Object.keys(savedState).forEach((k) => {
if (savedState[k] == null) {
delete savedState[k]
}
})
//only use restored state attributes instead of defaults if they are not null
let newState = Object.assign(this.defaultListViewState(), savedState)
this.listViewStates.set(null, newState)
} catch (e) {
localStorage.removeItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
}
}
}
private defaultListViewState(): ListViewState {
return {
title: null,
@@ -122,20 +149,36 @@ export class DocumentListViewService {
if (closeCurrentView) {
this._activeSavedViewId = null
}
this.activeListViewState.filterRules = cloneFilterRules(view.filter_rules)
this.activeListViewState.sortField = view.sort_field
this.activeListViewState.sortReverse = view.sort_reverse
if (this._activeSavedViewId) {
this.activeListViewState.title = view.name
}
this.reduceSelectionToFilter()
if (!this.router.routerState.snapshot.url.includes('/view/')) {
this.router.navigate([], {
queryParams: { view: view.id },
})
}
}
reload(onFinish?) {
loadFromQueryParams(queryParams) {
let newState: ListViewState = parseQueryParams(queryParams)
this.activeListViewState.filterRules = newState.filterRules
this.activeListViewState.sortField = newState.sortField
this.activeListViewState.sortReverse = newState.sortReverse
this.activeListViewState.currentPage = newState.currentPage
this.reload(null, false)
}
reload(onFinish?, updateQueryParams: boolean = true) {
this.isReloading = true
this.error = null
let activeListViewState = this.activeListViewState
this.documentService
.listFiltered(
activeListViewState.currentPage,
@@ -149,6 +192,19 @@ export class DocumentListViewService {
this.isReloading = false
activeListViewState.collectionSize = result.count
activeListViewState.documents = result.results
if (updateQueryParams && !this._activeSavedViewId) {
let base = ['/documents']
this.router.navigate(base, {
queryParams: generateParams(
activeListViewState.filterRules,
activeListViewState.sortField,
activeListViewState.sortReverse,
activeListViewState.currentPage
),
})
}
if (onFinish) {
onFinish()
}
@@ -191,6 +247,7 @@ export class DocumentListViewService {
) {
this.activeListViewState.sortField = 'created'
}
this._activeSavedViewId = null
this.activeListViewState.filterRules = filterRules
this.reload()
this.reduceSelectionToFilter()
@@ -202,6 +259,7 @@ export class DocumentListViewService {
}
set sortField(field: string) {
this._activeSavedViewId = null
this.activeListViewState.sortField = field
this.reload()
this.saveDocumentListView()
@@ -212,6 +270,7 @@ export class DocumentListViewService {
}
set sortReverse(reverse: boolean) {
this._activeSavedViewId = null
this.activeListViewState.sortReverse = reverse
this.reload()
this.saveDocumentListView()
@@ -237,6 +296,8 @@ export class DocumentListViewService {
}
set currentPage(page: number) {
if (this.activeListViewState.currentPage == page) return
this._activeSavedViewId = null
this.activeListViewState.currentPage = page
this.reload()
this.saveDocumentListView()
@@ -273,6 +334,10 @@ export class DocumentListViewService {
}
}
quickFilter(filterRules: FilterRule[]) {
this.filterRules = filterRules
}
getLastPage(): number {
return Math.ceil(this.collectionSize / this.currentPageSize)
}
@@ -431,29 +496,4 @@ export class DocumentListViewService {
documentIndexInCurrentView(documentID: number): number {
return this.documents.map((d) => d.id).indexOf(documentID)
}
constructor(
private documentService: DocumentService,
private settings: SettingsService
) {
let documentListViewConfigJson = localStorage.getItem(
DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG
)
if (documentListViewConfigJson) {
try {
let savedState: ListViewState = JSON.parse(documentListViewConfigJson)
// Remove null elements from the restored state
Object.keys(savedState).forEach((k) => {
if (savedState[k] == null) {
delete savedState[k]
}
})
//only use restored state attributes instead of defaults if they are not null
let newState = Object.assign(this.defaultListViewState(), savedState)
this.listViewStates.set(null, newState)
} catch (e) {
localStorage.removeItem(DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG)
}
}
}
}