diff --git a/komga-webui/src/components/dialogs/ConfirmationDialog.vue b/komga-webui/src/components/dialogs/ConfirmationDialog.vue index 298ea454..e53851a5 100644 --- a/komga-webui/src/components/dialogs/ConfirmationDialog.vue +++ b/komga-webui/src/components/dialogs/ConfirmationDialog.vue @@ -27,6 +27,12 @@ {{ buttonCancel || $t('common.cancel') }} + {{ buttonAlternate }} + diff --git a/komga-webui/src/locales/en.json b/komga-webui/src/locales/en.json index fd08136d..cecf932d 100644 --- a/komga-webui/src/locales/en.json +++ b/komga-webui/src/locales/en.json @@ -851,6 +851,13 @@ "tab_title": "Server" }, "server_settings": { + "dialog_regenerate_thumbnails": { + "body": "Thumbnails size has changed. Do you want to regenerate book thumbnails?", + "btn_alternate": "Yes, all books", + "btn_cancel": "No", + "btn_confirm": "Yes, but only if bigger", + "title": "Regenerate thumbnails" + }, "label_delete_empty_collections": "Delete empty collections after scan", "label_delete_empty_readlists": "Delete empty read lists after scan", "label_rememberme_duration": "Remember me duration (in days)", diff --git a/komga-webui/src/services/komga-books.service.ts b/komga-webui/src/services/komga-books.service.ts index aaf45733..f719f3fd 100644 --- a/komga-webui/src/services/komga-books.service.ts +++ b/komga-webui/src/services/komga-books.service.ts @@ -16,7 +16,7 @@ const qs = require('qs') const API_BOOKS = '/api/v1/books' export default class KomgaBooksService { - private http: AxiosInstance; + private http: AxiosInstance constructor(http: AxiosInstance) { this.http = http @@ -38,7 +38,7 @@ export default class KomgaBooksService { params.read_status = readStatus } if (releasedAfter) { - params.released_after = formatISO(releasedAfter, { representation: 'date' }) + params.released_after = formatISO(releasedAfter, {representation: 'date'}) } return (await this.http.get(API_BOOKS, { params: params, @@ -292,4 +292,20 @@ export default class KomgaBooksService { throw new Error(msg) } } + + async regenerateThumbnails(forBiggerResultOnly: boolean) { + try { + await this.http.put(`${API_BOOKS}/thumbnails`, null, { + params: { + for_bigger_result_only: forBiggerResultOnly, + }, + }) + } catch (e) { + let msg = 'An error occurred while trying to regenerate thumbnails' + if (e.response.data.message) { + msg += `: ${e.response.data.message}` + } + throw new Error(msg) + } + } } diff --git a/komga-webui/src/views/ServerSettings.vue b/komga-webui/src/views/ServerSettings.vue index bf5958a6..6807d2b1 100644 --- a/komga-webui/src/views/ServerSettings.vue +++ b/komga-webui/src/views/ServerSettings.vue @@ -60,6 +60,17 @@ + + @@ -67,9 +78,11 @@ import {ThumbnailSizeDto} from '@/types/komga-settings' import Vue from 'vue' import {minValue, required} from 'vuelidate/lib/validators' +import ConfirmationDialog from '@/components/dialogs/ConfirmationDialog.vue' export default Vue.extend({ name: 'ServerSettings', + components: {ConfirmationDialog}, data: () => ({ form: { deleteEmptyCollections: false, @@ -78,6 +91,14 @@ export default Vue.extend({ renewRememberMeKey: false, thumbnailSize: ThumbnailSizeDto.DEFAULT, }, + existingSettings: { + deleteEmptyCollections: false, + deleteEmptyReadLists: false, + rememberMeDurationDays: 365, + renewRememberMeKey: false, + thumbnailSize: ThumbnailSizeDto.DEFAULT, + }, + dialogRegenerateThumbnails: false, }), validations: { form: { @@ -118,15 +139,13 @@ export default Vue.extend({ methods: { async refreshSettings() { const settings = await (this.$komgaSettings.getSettings()) - this.form.deleteEmptyCollections = settings.deleteEmptyCollections - this.form.deleteEmptyReadLists = settings.deleteEmptyReadLists - this.form.rememberMeDurationDays = settings.rememberMeDurationDays - this.form.renewRememberMeKey = false - this.form.thumbnailSize = settings.thumbnailSize + this.$_.merge(this.form, settings) + this.$_.merge(this.existingSettings, settings) this.$v.form.$reset() }, async saveSettings() { const newSettings = {} + let thumbnailSizeHasChanged = false if (this.$v.form?.deleteEmptyCollections?.$dirty) this.$_.merge(newSettings, {deleteEmptyCollections: this.form.deleteEmptyCollections}) if (this.$v.form?.deleteEmptyReadLists?.$dirty) @@ -135,11 +154,20 @@ export default Vue.extend({ this.$_.merge(newSettings, {rememberMeDurationDays: this.form.rememberMeDurationDays}) if (this.$v.form?.renewRememberMeKey?.$dirty) this.$_.merge(newSettings, {renewRememberMeKey: this.form.renewRememberMeKey}) - if (this.$v.form?.thumbnailSize?.$dirty) + if (this.$v.form?.thumbnailSize?.$dirty) { this.$_.merge(newSettings, {thumbnailSize: this.form.thumbnailSize}) + thumbnailSizeHasChanged = this.existingSettings.thumbnailSize != this.form.thumbnailSize + } await this.$komgaSettings.updateSettings(newSettings) await this.refreshSettings() + + if (thumbnailSizeHasChanged) { + this.dialogRegenerateThumbnails = true + } + }, + regenerateThumbnails(forBiggerResultOnly: boolean) { + this.$komgaBooks.regenerateThumbnails(forBiggerResultOnly) }, }, })