@@ -82,10 +84,14 @@ export default {
totalEntities: 0,
keywordFilter: null,
keywordTimeout: null,
- processingSeries: false
+ processingSeries: false,
+ processingIssues: false
}
},
computed: {
+ userCanDelete() {
+ return this.$store.getters['user/getUserCanDelete']
+ },
isPodcast() {
return this.$store.getters['libraries/getCurrentLibraryMediaType'] == 'podcast'
},
@@ -132,9 +138,32 @@ export default {
},
isSeriesFinished() {
return this.seriesProgress && !!this.seriesProgress.isFinished
+ },
+ filterBy() {
+ return this.$store.getters['user/getUserSetting']('filterBy')
+ },
+ isIssuesFilter() {
+ return this.filterBy === 'issues'
}
},
methods: {
+ removeAllIssues() {
+ if (confirm(`Are you sure you want to remove all library items with issues?\n\nNote: This will not delete any files`)) {
+ this.processingIssues = true
+ this.$axios
+ .$delete(`/api/libraries/${this.currentLibraryId}/issues`)
+ .then(() => {
+ this.$toast.success('Removed library items with issues')
+ this.$router.push(`/library/${this.currentLibraryId}/bookshelf`)
+ this.processingIssues = false
+ })
+ .catch((error) => {
+ console.error('Failed to remove library items with issues', error)
+ this.$toast.error('Failed to remove library items with issues')
+ this.processingIssues = false
+ })
+ }
+ },
markSeriesFinished() {
var newIsFinished = !this.isSeriesFinished
this.processingSeries = true
diff --git a/client/components/app/SideRail.vue b/client/components/app/SideRail.vue
index 8c0a4655..38d0d36d 100644
--- a/client/components/app/SideRail.vue
+++ b/client/components/app/SideRail.vue
@@ -112,6 +112,9 @@ export default {
showLibrary() {
return this.libraryBookshelfPage && this.paramId === '' && !this.showingIssues
},
+ filterBy() {
+ return this.$store.getters['user/getUserSetting']('filterBy')
+ },
showingIssues() {
if (!this.$route.query) return false
return this.libraryBookshelfPage && this.$route.query.filter === 'issues'
diff --git a/server/controllers/LibraryController.js b/server/controllers/LibraryController.js
index 8460d996..3a23ba21 100644
--- a/server/controllers/LibraryController.js
+++ b/server/controllers/LibraryController.js
@@ -226,6 +226,22 @@ class LibraryController {
res.json(payload)
}
+ async removeLibraryItemsWithIssues(req, res) {
+ var libraryItemsWithIssues = req.libraryItems.filter(li => li.hasIssues)
+ if (!libraryItemsWithIssues.length) {
+ Logger.warn(`[LibraryController] No library items have issues`)
+ return res.sendStatus(200)
+ }
+
+ Logger.info(`[LibraryController] Removing ${libraryItemsWithIssues.length} items with issues`)
+ for (const libraryItem of libraryItemsWithIssues) {
+ Logger.info(`[LibraryController] Removing library item "${libraryItem.media.metadata.title}"`)
+ await this.handleDeleteLibraryItem(libraryItem)
+ }
+
+ res.sendStatus(200)
+ }
+
// api/libraries/:id/series
async getAllSeriesForLibrary(req, res) {
var libraryItems = req.libraryItems
diff --git a/server/routers/ApiRouter.js b/server/routers/ApiRouter.js
index 217c9bb6..ad29a3bd 100644
--- a/server/routers/ApiRouter.js
+++ b/server/routers/ApiRouter.js
@@ -58,6 +58,7 @@ class ApiRouter {
this.router.delete('/libraries/:id', LibraryController.middleware.bind(this), LibraryController.delete.bind(this))
this.router.get('/libraries/:id/items', LibraryController.middleware.bind(this), LibraryController.getLibraryItems.bind(this))
+ this.router.delete('/libraries/:id/issues', LibraryController.middleware.bind(this), LibraryController.removeLibraryItemsWithIssues.bind(this))
this.router.get('/libraries/:id/series', LibraryController.middleware.bind(this), LibraryController.getAllSeriesForLibrary.bind(this))
this.router.get('/libraries/:id/collections', LibraryController.middleware.bind(this), LibraryController.getCollectionsForLibrary.bind(this))
this.router.get('/libraries/:id/personalized-old', LibraryController.middleware.bind(this), LibraryController.getLibraryUserPersonalized.bind(this))