diff --git a/client/components/content/LibraryItemDetails.vue b/client/components/content/LibraryItemDetails.vue index 50c060af..6764beb0 100644 --- a/client/components/content/LibraryItemDetails.vue +++ b/client/components/content/LibraryItemDetails.vue @@ -24,7 +24,7 @@ {{ $strings.LabelPublisher }}
- {{ publisher }} + {{ publisher }}
diff --git a/client/components/controls/LibraryFilterSelect.vue b/client/components/controls/LibraryFilterSelect.vue index 7c093c16..e3393dad 100644 --- a/client/components/controls/LibraryFilterSelect.vue +++ b/client/components/controls/LibraryFilterSelect.vue @@ -124,6 +124,11 @@ export default { value: 'narrators', sublist: true }, + { + text: this.$strings.LabelPublisher, + value: 'publishers', + sublist: true + }, { text: this.$strings.LabelLanguage, value: 'languages', @@ -167,6 +172,11 @@ export default { value: 'narrators', sublist: true }, + { + text: this.$strings.LabelPublisher, + value: 'publishers', + sublist: true + }, { text: this.$strings.LabelLanguage, value: 'languages', @@ -313,6 +323,9 @@ export default { languages() { return this.filterData.languages || [] }, + publishers() { + return this.filterData.publishers || [] + }, progress() { return [ { diff --git a/client/store/libraries.js b/client/store/libraries.js index a34a93c5..e0151626 100644 --- a/client/store/libraries.js +++ b/client/store/libraries.js @@ -238,21 +238,23 @@ export const mutations = { if (!libraryItem || !state.filterData) return if (state.currentLibraryId !== libraryItem.libraryId) return /* - var data = { + structure of filterData: + { authors: [], genres: [], tags: [], series: [], narrators: [], - languages: [] + languages: [], + publishers: [] } */ - var mediaMetadata = libraryItem.media.metadata + const mediaMetadata = libraryItem.media.metadata // Add/update book authors - if (mediaMetadata.authors && mediaMetadata.authors.length) { + if (mediaMetadata.authors?.length) { mediaMetadata.authors.forEach((author) => { - var indexOf = state.filterData.authors.findIndex(au => au.id === author.id) + const indexOf = state.filterData.authors.findIndex(au => au.id === author.id) if (indexOf >= 0) { state.filterData.authors.splice(indexOf, 1, author) } else { @@ -263,9 +265,9 @@ export const mutations = { } // Add/update series - if (mediaMetadata.series && mediaMetadata.series.length) { + if (mediaMetadata.series?.length) { mediaMetadata.series.forEach((series) => { - var indexOf = state.filterData.series.findIndex(se => se.id === series.id) + const indexOf = state.filterData.series.findIndex(se => se.id === series.id) if (indexOf >= 0) { state.filterData.series.splice(indexOf, 1, { id: series.id, name: series.name }) } else { @@ -276,7 +278,7 @@ export const mutations = { } // Add genres - if (mediaMetadata.genres && mediaMetadata.genres.length) { + if (mediaMetadata.genres?.length) { mediaMetadata.genres.forEach((genre) => { if (!state.filterData.genres.includes(genre)) { state.filterData.genres.push(genre) @@ -286,7 +288,7 @@ export const mutations = { } // Add tags - if (libraryItem.media.tags && libraryItem.media.tags.length) { + if (libraryItem.media.tags?.length) { libraryItem.media.tags.forEach((tag) => { if (!state.filterData.tags.includes(tag)) { state.filterData.tags.push(tag) @@ -296,7 +298,7 @@ export const mutations = { } // Add narrators - if (mediaMetadata.narrators && mediaMetadata.narrators.length) { + if (mediaMetadata.narrators?.length) { mediaMetadata.narrators.forEach((narrator) => { if (!state.filterData.narrators.includes(narrator)) { state.filterData.narrators.push(narrator) @@ -305,12 +307,16 @@ export const mutations = { }) } + // Add publishers + if (mediaMetadata.publisher && !state.filterData.publishers.includes(mediaMetadata.publisher)) { + state.filterData.publishers.push(mediaMetadata.publisher) + state.filterData.publishers.sort((a, b) => a.localeCompare(b)) + } + // Add language - if (mediaMetadata.language) { - if (!state.filterData.languages.includes(mediaMetadata.language)) { - state.filterData.languages.push(mediaMetadata.language) - state.filterData.languages.sort((a, b) => a.localeCompare(b)) - } + if (mediaMetadata.language && !state.filterData.languages.includes(mediaMetadata.language)) { + state.filterData.languages.push(mediaMetadata.language) + state.filterData.languages.sort((a, b) => a.localeCompare(b)) } }, setCollections(state, collections) { diff --git a/client/store/user.js b/client/store/user.js index 64b1776e..85babb09 100644 --- a/client/store/user.js +++ b/client/store/user.js @@ -80,7 +80,7 @@ export const actions = { if (state.settings.orderBy == 'media.metadata.publishedYear') { settingsUpdate.orderBy = 'media.metadata.title' } - const invalidFilters = ['series', 'authors', 'narrators', 'languages', 'progress', 'issues', 'ebooks', 'abridged'] + const invalidFilters = ['series', 'authors', 'narrators', 'publishers', 'languages', 'progress', 'issues', 'ebooks', 'abridged'] const filterByFirstPart = (state.settings.filterBy || '').split('.').shift() if (invalidFilters.includes(filterByFirstPart)) { settingsUpdate.filterBy = 'all' diff --git a/server/utils/libraryHelpers.js b/server/utils/libraryHelpers.js index 9ebd3323..7c4f9cf6 100644 --- a/server/utils/libraryHelpers.js +++ b/server/utils/libraryHelpers.js @@ -14,7 +14,7 @@ module.exports = { getFilteredLibraryItems(libraryItems, filterBy, user, feedsArray) { let filtered = libraryItems - const searchGroups = ['genres', 'tags', 'series', 'authors', 'progress', 'narrators', 'missing', 'languages', 'tracks', 'ebooks'] + const searchGroups = ['genres', 'tags', 'series', 'authors', 'progress', 'narrators', 'publishers', 'missing', 'languages', 'tracks', 'ebooks'] const group = searchGroups.find(_group => filterBy.startsWith(_group + '.')) if (group) { const filterVal = filterBy.replace(`${group}.`, '') @@ -29,6 +29,7 @@ module.exports = { } else if (group === 'authors') filtered = filtered.filter(li => li.isBook && li.media.metadata.hasAuthor(filter)) else if (group === 'narrators') filtered = filtered.filter(li => li.isBook && li.media.metadata.hasNarrator(filter)) + else if (group === 'publishers') filtered = filtered.filter(li => li.isBook && li.media.metadata.publisher === filter) else if (group === 'progress') { filtered = filtered.filter(li => { const itemProgress = user.getMediaProgress(li.id) @@ -82,16 +83,17 @@ module.exports = { // Returns false if should be filtered out checkFilterForSeriesLibraryItem(libraryItem, filterBy) { - var searchGroups = ['genres', 'tags', 'authors', 'progress', 'narrators', 'languages'] - var group = searchGroups.find(_group => filterBy.startsWith(_group + '.')) + const searchGroups = ['genres', 'tags', 'authors', 'progress', 'narrators', 'publishers', 'languages'] + const group = searchGroups.find(_group => filterBy.startsWith(_group + '.')) if (group) { - var filterVal = filterBy.replace(`${group}.`, '') - var filter = this.decode(filterVal) + const filterVal = filterBy.replace(`${group}.`, '') + const filter = this.decode(filterVal) if (group === 'genres') return libraryItem.media.metadata.genres.includes(filter) else if (group === 'tags') return libraryItem.media.tags.includes(filter) else if (group === 'authors') return libraryItem.isBook && libraryItem.media.metadata.hasAuthor(filter) else if (group === 'narrators') return libraryItem.isBook && libraryItem.media.metadata.hasNarrator(filter) + else if (group === 'publishers') return libraryItem.isBook && libraryItem.media.metadata.publisher === filter else if (group === 'languages') { return libraryItem.media.metadata.language === filter } @@ -123,27 +125,28 @@ module.exports = { }, getDistinctFilterDataNew(libraryItems) { - var data = { + const data = { authors: [], genres: [], tags: [], series: [], narrators: [], - languages: [] + languages: [], + publishers: [] } libraryItems.forEach((li) => { - var mediaMetadata = li.media.metadata - if (mediaMetadata.authors && mediaMetadata.authors.length) { + const mediaMetadata = li.media.metadata + if (mediaMetadata.authors?.length) { mediaMetadata.authors.forEach((author) => { - if (author && !data.authors.find(au => au.id === author.id)) data.authors.push({ id: author.id, name: author.name }) + if (author && !data.authors.some(au => au.id === author.id)) data.authors.push({ id: author.id, name: author.name }) }) } - if (mediaMetadata.series && mediaMetadata.series.length) { + if (mediaMetadata.series?.length) { mediaMetadata.series.forEach((series) => { - if (series && !data.series.find(se => se.id === series.id)) data.series.push({ id: series.id, name: series.name }) + if (series && !data.series.some(se => se.id === series.id)) data.series.push({ id: series.id, name: series.name }) }) } - if (mediaMetadata.genres && mediaMetadata.genres.length) { + if (mediaMetadata.genres?.length) { mediaMetadata.genres.forEach((genre) => { if (genre && !data.genres.includes(genre)) data.genres.push(genre) }) @@ -153,18 +156,24 @@ module.exports = { if (tag && !data.tags.includes(tag)) data.tags.push(tag) }) } - if (mediaMetadata.narrators && mediaMetadata.narrators.length) { + if (mediaMetadata.narrators?.length) { mediaMetadata.narrators.forEach((narrator) => { if (narrator && !data.narrators.includes(narrator)) data.narrators.push(narrator) }) } - if (mediaMetadata.language && !data.languages.includes(mediaMetadata.language)) data.languages.push(mediaMetadata.language) + if (mediaMetadata.publisher && !data.publishers.includes(mediaMetadata.publisher)) { + data.publishers.push(mediaMetadata.publisher) + } + if (mediaMetadata.language && !data.languages.includes(mediaMetadata.language)) { + data.languages.push(mediaMetadata.language) + } }) data.authors = naturalSort(data.authors).asc(au => au.name) data.genres = naturalSort(data.genres).asc() data.tags = naturalSort(data.tags).asc() data.series = naturalSort(data.series).asc(se => se.name) data.narrators = naturalSort(data.narrators).asc() + data.publishers = naturalSort(data.publishers).asc() data.languages = naturalSort(data.languages).asc() return data },