Add: button on issues page to remove all library items with issues #476

This commit is contained in:
advplyr 2022-04-24 18:25:33 -05:00
parent 4bc7cd2045
commit 2e28c9b06d
4 changed files with 50 additions and 1 deletions

View File

@ -50,6 +50,8 @@
<span class="material-icons" style="font-size: 1.4rem">view_list</span> <span class="material-icons" style="font-size: 1.4rem">view_list</span>
</div> </div>
</div> --> </div> -->
<ui-btn v-if="isIssuesFilter && userCanDelete" :loading="processingIssues" color="error" small class="ml-4" @click="removeAllIssues">Remove All {{ numShowing }} {{ entityName }}</ui-btn>
</template> </template>
<template v-else-if="page === 'search'"> <template v-else-if="page === 'search'">
<div @click="searchBackArrow" class="rounded-full h-10 w-10 flex items-center justify-center hover:bg-white hover:bg-opacity-10 cursor-pointer"> <div @click="searchBackArrow" class="rounded-full h-10 w-10 flex items-center justify-center hover:bg-white hover:bg-opacity-10 cursor-pointer">
@ -82,10 +84,14 @@ export default {
totalEntities: 0, totalEntities: 0,
keywordFilter: null, keywordFilter: null,
keywordTimeout: null, keywordTimeout: null,
processingSeries: false processingSeries: false,
processingIssues: false
} }
}, },
computed: { computed: {
userCanDelete() {
return this.$store.getters['user/getUserCanDelete']
},
isPodcast() { isPodcast() {
return this.$store.getters['libraries/getCurrentLibraryMediaType'] == 'podcast' return this.$store.getters['libraries/getCurrentLibraryMediaType'] == 'podcast'
}, },
@ -132,9 +138,32 @@ export default {
}, },
isSeriesFinished() { isSeriesFinished() {
return this.seriesProgress && !!this.seriesProgress.isFinished return this.seriesProgress && !!this.seriesProgress.isFinished
},
filterBy() {
return this.$store.getters['user/getUserSetting']('filterBy')
},
isIssuesFilter() {
return this.filterBy === 'issues'
} }
}, },
methods: { 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() { markSeriesFinished() {
var newIsFinished = !this.isSeriesFinished var newIsFinished = !this.isSeriesFinished
this.processingSeries = true this.processingSeries = true

View File

@ -112,6 +112,9 @@ export default {
showLibrary() { showLibrary() {
return this.libraryBookshelfPage && this.paramId === '' && !this.showingIssues return this.libraryBookshelfPage && this.paramId === '' && !this.showingIssues
}, },
filterBy() {
return this.$store.getters['user/getUserSetting']('filterBy')
},
showingIssues() { showingIssues() {
if (!this.$route.query) return false if (!this.$route.query) return false
return this.libraryBookshelfPage && this.$route.query.filter === 'issues' return this.libraryBookshelfPage && this.$route.query.filter === 'issues'

View File

@ -226,6 +226,22 @@ class LibraryController {
res.json(payload) 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 // api/libraries/:id/series
async getAllSeriesForLibrary(req, res) { async getAllSeriesForLibrary(req, res) {
var libraryItems = req.libraryItems var libraryItems = req.libraryItems

View File

@ -58,6 +58,7 @@ class ApiRouter {
this.router.delete('/libraries/:id', LibraryController.middleware.bind(this), LibraryController.delete.bind(this)) 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.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/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/collections', LibraryController.middleware.bind(this), LibraryController.getCollectionsForLibrary.bind(this))
this.router.get('/libraries/:id/personalized-old', LibraryController.middleware.bind(this), LibraryController.getLibraryUserPersonalized.bind(this)) this.router.get('/libraries/:id/personalized-old', LibraryController.middleware.bind(this), LibraryController.getLibraryUserPersonalized.bind(this))