diff --git a/komga-webui/src/components/FilterMenuButton.vue b/komga-webui/src/components/FilterMenuButton.vue index aaa0c02f1..0d684c47e 100644 --- a/komga-webui/src/components/FilterMenuButton.vue +++ b/komga-webui/src/components/FilterMenuButton.vue @@ -30,15 +30,16 @@ - - - mdi-close - - Clear - + diff --git a/komga-webui/src/functions/query-params.ts b/komga-webui/src/functions/query-params.ts index 5837bb009..d6919c83f 100644 --- a/komga-webui/src/functions/query-params.ts +++ b/komga-webui/src/functions/query-params.ts @@ -10,3 +10,7 @@ export function parseQuerySort (querySort: any, sortOptions: SortOption[]): Sort } return customSort } + +export function parseQueryFilter (queryStatus: any, enumeration: any): string[] { + return queryStatus ? queryStatus.toString().split(',').filter((x: string) => Object.keys(enumeration).includes(x)) : [] +} diff --git a/komga-webui/src/services/komga-series.service.ts b/komga-webui/src/services/komga-series.service.ts index e0ad822bb..8d20d93d2 100644 --- a/komga-webui/src/services/komga-series.service.ts +++ b/komga-webui/src/services/komga-series.service.ts @@ -11,7 +11,7 @@ export default class KomgaSeriesService { this.http = http } - async getSeries (libraryId?: number, pageRequest?: PageRequest, search?: string, status?: string[]): Promise> { + async getSeries (libraryId?: number, pageRequest?: PageRequest, search?: string, status?: string[], readStatus?: string[]): Promise> { try { const params = { ...pageRequest } as any if (libraryId) { @@ -23,6 +23,9 @@ export default class KomgaSeriesService { if (status) { params.status = status } + if (readStatus) { + params.read_status = readStatus + } return (await this.http.get(API_SERIES, { params: params, paramsSerializer: params => qs.stringify(params, { indices: false }), diff --git a/komga-webui/src/views/BrowseLibraries.vue b/komga-webui/src/views/BrowseLibraries.vue index 88adbe62f..3a5740a0d 100644 --- a/komga-webui/src/views/BrowseLibraries.vue +++ b/komga-webui/src/views/BrowseLibraries.vue @@ -110,7 +110,8 @@ import LibraryActionsMenu from '@/components/LibraryActionsMenu.vue' import PageSizeSelect from '@/components/PageSizeSelect.vue' import SortMenuButton from '@/components/SortMenuButton.vue' import ToolbarSticky from '@/components/ToolbarSticky.vue' -import { parseQuerySort } from '@/functions/query-params' +import { parseQueryFilter, parseQuerySort } from '@/functions/query-params' +import { ReadStatus } from '@/types/enum-books' import { SeriesStatus } from '@/types/enum-series' import Vue from 'vue' @@ -146,8 +147,8 @@ export default Vue.extend({ ] as SortOption[], sortActive: {} as SortActive, sortDefault: { key: 'metadata.titleSort', order: 'asc' } as SortActive, - filterOptions: [{ name: 'STATUS', values: SeriesStatus }], - filters: [[]] as any[], + filterOptions: [{ name: 'STATUS', values: SeriesStatus }, { name: 'READ STATUS', values: ReadStatus }], + filters: [[], []] as any[], sortUnwatch: null as any, filterUnwatch: null as any, pageUnwatch: null as any, @@ -190,7 +191,8 @@ export default Vue.extend({ // restore from query param this.sortActive = this.parseQuerySortOrDefault(this.$route.query.sort) - this.filters.splice(0, 1, this.parseQueryFilterStatus(this.$route.query.status)) + this.filters.splice(0, 1, parseQueryFilter(this.$route.query.status, SeriesStatus)) + this.filters.splice(1, 1, parseQueryFilter(this.$route.query.readStatus, ReadStatus)) if (this.$route.query.page) this.page = Number(this.$route.query.page) if (this.$route.query.pageSize) this.pageSize = Number(this.$route.query.pageSize) @@ -204,7 +206,8 @@ export default Vue.extend({ // reset this.sortActive = this.parseQuerySortOrDefault(to.query.sort) - this.filters.splice(0, 1, this.parseQueryFilterStatus(to.query.status)) + this.filters.splice(0, 1, parseQueryFilter(to.query.status, SeriesStatus)) + this.filters.splice(1, 1, parseQueryFilter(to.query.readStatus, ReadStatus)) this.page = 1 this.totalPages = 1 this.totalElements = null @@ -273,9 +276,6 @@ export default Vue.extend({ parseQuerySortOrDefault (querySort: any): SortActive { return parseQuerySort(querySort, this.sortOptions) || this.$_.clone(this.sortDefault) }, - parseQueryFilterStatus (queryStatus: any): string[] { - return queryStatus ? queryStatus.toString().split(',').filter((x: string) => Object.keys(SeriesStatus).includes(x)) : [] - }, updateRoute () { this.$router.replace({ name: this.$route.name, @@ -285,6 +285,7 @@ export default Vue.extend({ pageSize: `${this.pageSize}`, sort: `${this.sortActive.key},${this.sortActive.order}`, status: `${this.filters[0]}`, + readStatus: `${this.filters[1]}`, }, }).catch(_ => { }) @@ -303,7 +304,7 @@ export default Vue.extend({ if (libraryId !== 0) { requestLibraryId = libraryId } - const seriesPage = await this.$komgaSeries.getSeries(requestLibraryId, pageRequest, undefined, this.filters[0]) + const seriesPage = await this.$komgaSeries.getSeries(requestLibraryId, pageRequest, undefined, this.filters[0], this.filters[1]) this.totalPages = seriesPage.totalPages this.totalElements = seriesPage.totalElements diff --git a/komga-webui/src/views/BrowseSeries.vue b/komga-webui/src/views/BrowseSeries.vue index 964bcbb22..d419c155e 100644 --- a/komga-webui/src/views/BrowseSeries.vue +++ b/komga-webui/src/views/BrowseSeries.vue @@ -169,7 +169,7 @@ import ItemCard from '@/components/ItemCard.vue' import PageSizeSelect from '@/components/PageSizeSelect.vue' import SortMenuButton from '@/components/SortMenuButton.vue' import ToolbarSticky from '@/components/ToolbarSticky.vue' -import { parseQuerySort } from '@/functions/query-params' +import { parseQueryFilter, parseQuerySort } from '@/functions/query-params' import { seriesThumbnailUrl } from '@/functions/urls' import { ReadStatus } from '@/types/enum-books' import Vue from 'vue' @@ -277,7 +277,7 @@ export default Vue.extend({ // restore from query param this.sortActive = this.parseQuerySortOrDefault(this.$route.query.sort) - this.filters.splice(0, 1, this.parseQueryFilterStatus(this.$route.query.readStatus)) + this.filters.splice(0, 1, parseQueryFilter(this.$route.query.readStatus, ReadStatus)) if (this.$route.query.page) this.page = Number(this.$route.query.page) if (this.$route.query.pageSize) this.pageSize = Number(this.$route.query.pageSize) @@ -291,7 +291,7 @@ export default Vue.extend({ // reset this.sortActive = this.parseQuerySortOrDefault(to.query.sort) - this.filters.splice(0, 1, this.parseQueryFilterStatus(to.query.readStatus)) + this.filters.splice(0, 1, parseQueryFilter(to.query.readStatus, ReadStatus)) this.page = 1 this.totalPages = 1 this.totalElements = null