diff --git a/komga-webui/src/components/CollectionActionsMenu.vue b/komga-webui/src/components/CollectionActionsMenu.vue index 5c6ba3dec..3102d5aa6 100644 --- a/komga-webui/src/components/CollectionActionsMenu.vue +++ b/komga-webui/src/components/CollectionActionsMenu.vue @@ -53,11 +53,5 @@ export default Vue.extend({ }) diff --git a/komga-webui/src/components/Dialogs.vue b/komga-webui/src/components/Dialogs.vue index 77df017a0..def867265 100644 --- a/komga-webui/src/components/Dialogs.vue +++ b/komga-webui/src/components/Dialogs.vue @@ -11,18 +11,25 @@ :collection="deleteCollection" @deleted="collectionDeleted" /> + + diff --git a/komga-webui/src/components/LibraryActionsMenu.vue b/komga-webui/src/components/LibraryActionsMenu.vue index 5e84ca573..700f4bba4 100644 --- a/komga-webui/src/components/LibraryActionsMenu.vue +++ b/komga-webui/src/components/LibraryActionsMenu.vue @@ -22,25 +22,13 @@ - - diff --git a/komga-webui/src/store.ts b/komga-webui/src/store.ts index 918276d78..973757312 100644 --- a/komga-webui/src/store.ts +++ b/komga-webui/src/store.ts @@ -9,6 +9,8 @@ export default new Vuex.Store({ addToCollectionDialog: false, deleteCollection: {} as CollectionDto, deleteCollectionDialog: false, + deleteLibrary: {} as LibraryDto, + deleteLibraryDialog: false, }, mutations: { setAddToCollectionSeries (state, series) { @@ -23,6 +25,12 @@ export default new Vuex.Store({ setDeleteCollectionDialog (state, dialog) { state.deleteCollectionDialog = dialog }, + setDeleteLibrary (state, library) { + state.deleteLibrary = library + }, + setDeleteLibraryDialog (state, dialog) { + state.deleteLibraryDialog = dialog + }, }, actions: { dialogAddSeriesToCollection ({ commit }, series) { @@ -39,5 +47,12 @@ export default new Vuex.Store({ dialogDeleteCollectionDisplay ({ commit }, value) { commit('setDeleteCollectionDialog', value) }, + dialogDeleteLibrary ({ commit }, library) { + commit('setDeleteLibrary', library) + commit('setDeleteLibraryDialog', true) + }, + dialogDeleteLibraryDisplay ({ commit }, value) { + commit('setDeleteLibraryDialog', value) + }, }, }) diff --git a/komga-webui/src/styles/list-warning.css b/komga-webui/src/styles/list-warning.css new file mode 100644 index 000000000..3ffad9a6e --- /dev/null +++ b/komga-webui/src/styles/list-warning.css @@ -0,0 +1,7 @@ +.list-warning:hover { + background: #F44336; +} + +.list-warning:hover .v-list-item__title { + color: white; +} diff --git a/komga-webui/src/types/events-payloads.ts b/komga-webui/src/types/events-payloads.ts index 4f056aadf..5dfa21289 100644 --- a/komga-webui/src/types/events-payloads.ts +++ b/komga-webui/src/types/events-payloads.ts @@ -7,3 +7,7 @@ interface EventSeriesChanged { id: number, libraryId: number } + +interface EventLibraryDeleted { + id: number +} diff --git a/komga-webui/src/types/events.ts b/komga-webui/src/types/events.ts index ab5458325..c14f4d166 100644 --- a/komga-webui/src/types/events.ts +++ b/komga-webui/src/types/events.ts @@ -1,3 +1,4 @@ export const BOOK_CHANGED = 'book-changed' export const SERIES_CHANGED = 'series-changed' export const COLLECTION_CHANGED = 'collection-changed' +export const LIBRARY_DELETED = 'library-deleted' diff --git a/komga-webui/src/types/komga-books.ts b/komga-webui/src/types/komga-books.ts index 1755cf1e1..0d44711b3 100644 --- a/komga-webui/src/types/komga-books.ts +++ b/komga-webui/src/types/komga-books.ts @@ -1,6 +1,7 @@ interface BookDto { id: number, seriesId: number, + libraryId: number, name: string, url: string, number: number, diff --git a/komga-webui/src/views/BrowseBook.vue b/komga-webui/src/views/BrowseBook.vue index 367fd87e9..37a074d92 100644 --- a/komga-webui/src/views/BrowseBook.vue +++ b/komga-webui/src/views/BrowseBook.vue @@ -157,7 +157,7 @@ import { getReadProgress, getReadProgressPercentage } from '@/functions/book-pro import { getBookTitleCompact } from '@/functions/book-title' import { bookFileUrl, bookThumbnailUrl } from '@/functions/urls' import { ReadStatus } from '@/types/enum-books' -import { BOOK_CHANGED } from '@/types/events' +import { BOOK_CHANGED, LIBRARY_DELETED } from '@/types/events' import Vue from 'vue' export default Vue.extend({ @@ -173,9 +173,11 @@ export default Vue.extend({ async created () { this.loadBook(this.bookId) this.$eventHub.$on(BOOK_CHANGED, this.reloadBook) + this.$eventHub.$on(LIBRARY_DELETED, this.libraryDeleted) }, beforeDestroy () { this.$eventHub.$off(BOOK_CHANGED, this.reloadBook) + this.$eventHub.$off(LIBRARY_DELETED, this.libraryDeleted) }, watch: { async book (val) { @@ -234,6 +236,11 @@ export default Vue.extend({ }, }, methods: { + libraryDeleted (event: EventLibraryDeleted) { + if (event.id === this.book.libraryId) { + this.$router.push({ name: 'home' }) + } + }, reloadBook (event: EventBookChanged) { if (event.id === this.bookId) this.loadBook(this.bookId) }, diff --git a/komga-webui/src/views/BrowseLibraries.vue b/komga-webui/src/views/BrowseLibraries.vue index 323cc95c7..969d95076 100644 --- a/komga-webui/src/views/BrowseLibraries.vue +++ b/komga-webui/src/views/BrowseLibraries.vue @@ -132,7 +132,7 @@ import ToolbarSticky from '@/components/ToolbarSticky.vue' import { parseQueryFilter, parseQuerySort } from '@/functions/query-params' import { ReadStatus } from '@/types/enum-books' import { SeriesStatus } from '@/types/enum-series' -import { COLLECTION_CHANGED, SERIES_CHANGED } from '@/types/events' +import { COLLECTION_CHANGED, LIBRARY_DELETED, SERIES_CHANGED } from '@/types/events' import Vue from 'vue' const cookiePageSize = 'pagesize' @@ -210,10 +210,12 @@ export default Vue.extend({ created () { this.$eventHub.$on(COLLECTION_CHANGED, this.reloadCollections) this.$eventHub.$on(SERIES_CHANGED, this.reloadSeries) + this.$eventHub.$on(LIBRARY_DELETED, this.libraryDeleted) }, beforeDestroy () { this.$eventHub.$off(COLLECTION_CHANGED, this.reloadCollections) this.$eventHub.$off(SERIES_CHANGED, this.reloadSeries) + this.$eventHub.$off(LIBRARY_DELETED, this.libraryDeleted) }, mounted () { if (this.$cookies.isKey(cookiePageSize)) { @@ -271,6 +273,13 @@ export default Vue.extend({ }, }, methods: { + libraryDeleted (event: EventLibraryDeleted) { + if (event.id === this.libraryId) { + this.$router.push({ name: 'home' }) + } else if (this.libraryId === 0) { + this.loadLibrary(this.libraryId) + } + }, setWatches () { this.sortUnwatch = this.$watch('sortActive', this.updateRouteAndReload) this.filterUnwatch = this.$watch('filters', this.updateRouteAndReload) diff --git a/komga-webui/src/views/BrowseSeries.vue b/komga-webui/src/views/BrowseSeries.vue index 88f25b907..2579e27c4 100644 --- a/komga-webui/src/views/BrowseSeries.vue +++ b/komga-webui/src/views/BrowseSeries.vue @@ -211,7 +211,7 @@ import ToolbarSticky from '@/components/ToolbarSticky.vue' import { parseQueryFilter, parseQuerySort } from '@/functions/query-params' import { seriesThumbnailUrl } from '@/functions/urls' import { ReadStatus } from '@/types/enum-books' -import { BOOK_CHANGED, SERIES_CHANGED } from '@/types/events' +import { BOOK_CHANGED, LIBRARY_DELETED, SERIES_CHANGED } from '@/types/events' import Vue from 'vue' const cookiePageSize = 'pagesize' @@ -319,10 +319,12 @@ export default Vue.extend({ created () { this.$eventHub.$on(SERIES_CHANGED, this.reloadSeries) this.$eventHub.$on(BOOK_CHANGED, this.reloadBooks) + this.$eventHub.$on(LIBRARY_DELETED, this.libraryDeleted) }, beforeDestroy () { this.$eventHub.$off(SERIES_CHANGED, this.reloadSeries) - this.$eventHub.$on(BOOK_CHANGED, this.reloadBooks) + this.$eventHub.$off(BOOK_CHANGED, this.reloadBooks) + this.$eventHub.$off(LIBRARY_DELETED, this.libraryDeleted) }, mounted () { if (this.$cookies.isKey(cookiePageSize)) { @@ -391,6 +393,11 @@ export default Vue.extend({ this.setWatches() }, + libraryDeleted (event: EventLibraryDeleted) { + if (event.id === this.series.libraryId) { + this.$router.push({ name: 'home' }) + } + }, reloadSeries (event: EventSeriesChanged) { if (event.id === this.seriesId) this.loadSeries(this.seriesId) }, diff --git a/komga-webui/src/views/Dashboard.vue b/komga-webui/src/views/Dashboard.vue index 0026a90f8..1077b3e9d 100644 --- a/komga-webui/src/views/Dashboard.vue +++ b/komga-webui/src/views/Dashboard.vue @@ -89,6 +89,7 @@ import EmptyState from '@/components/EmptyState.vue' import HorizontalScroller from '@/components/HorizontalScroller.vue' import ItemCard from '@/components/ItemCard.vue' import { ReadStatus } from '@/types/enum-books' +import { LIBRARY_DELETED } from '@/types/events' import Vue from 'vue' export default Vue.extend({ @@ -107,12 +108,14 @@ export default Vue.extend({ dialogEditBookSingle: false, } }, + created () { + this.$eventHub.$on(LIBRARY_DELETED, this.loadAll) + }, + beforeDestroy () { + this.$eventHub.$off(LIBRARY_DELETED, this.loadAll) + }, mounted () { - this.loadNewSeries() - this.loadUpdatedSeries() - this.loadLatestBooks() - this.loadInProgressBooks() - this.loadOnDeckBooks() + this.loadAll() }, watch: { editSeriesSingle (val: SeriesDto) { @@ -150,6 +153,13 @@ export default Vue.extend({ }, }, methods: { + loadAll () { + this.loadNewSeries() + this.loadUpdatedSeries() + this.loadLatestBooks() + this.loadInProgressBooks() + this.loadOnDeckBooks() + }, async loadNewSeries () { this.newSeries = (await this.$komgaSeries.getNewSeries()).content },