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
},