From 1e6ff7ac662356e540ab351bcc5a6629b558b8e0 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Tue, 21 Jan 2025 14:51:37 +0800 Subject: [PATCH] feat(webui): remove tab navigation and use sidebar instead --- komga-webui/src/locales/en.json | 4 +- komga-webui/src/router.ts | 169 +++++++----------- komga-webui/src/views/AnnouncementsView.vue | 2 +- .../src/views/DuplicatePagesHolder.vue | 21 --- komga-webui/src/views/HomeView.vue | 167 +++++++++++++---- komga-webui/src/views/ImportHolder.vue | 17 -- komga-webui/src/views/MediaManagement.vue | 36 ---- komga-webui/src/views/SettingsHolder.vue | 36 ---- 8 files changed, 205 insertions(+), 247 deletions(-) delete mode 100644 komga-webui/src/views/DuplicatePagesHolder.vue delete mode 100644 komga-webui/src/views/ImportHolder.vue delete mode 100644 komga-webui/src/views/MediaManagement.vue delete mode 100644 komga-webui/src/views/SettingsHolder.vue diff --git a/komga-webui/src/locales/en.json b/komga-webui/src/locales/en.json index c4687d29..de9d33be 100644 --- a/komga-webui/src/locales/en.json +++ b/komga-webui/src/locales/en.json @@ -659,7 +659,7 @@ "matches_n": "No matches | 1 match | {count} matches", "new": "New", "saved_size": "Saved {size}", - "title": "Duplicate pages", + "title": "Duplicate Pages", "unknown_size": "Unknown size" }, "duplicates": { @@ -860,7 +860,7 @@ }, "media_analysis": { "comment": "Comment", - "media_analysis": "Media analysis", + "media_analysis": "Media Analysis", "media_type": "Media Type", "name": "Name", "size": "Size", diff --git a/komga-webui/src/router.ts b/komga-webui/src/router.ts index 522dd6c6..6a2183c6 100644 --- a/komga-webui/src/router.ts +++ b/komga-webui/src/router.ts @@ -64,95 +64,71 @@ const router = new Router({ component: () => import(/* webpackChunkName: "dashboard" */ './views/DashboardView.vue'), }, { - path: '/settings', - name: 'settings', - redirect: {name: 'settings-users'}, - component: () => import(/* webpackChunkName: "settings" */ './views/SettingsHolder.vue'), + path: '/settings/users', + name: 'settings-users', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "settings-users" */ './views/SettingsUsers.vue'), children: [ { - path: '/settings/users', - name: 'settings-users', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "settings-users" */ './views/SettingsUsers.vue'), - children: [ - { - path: '/settings/users/add', - name: 'settings-users-add', - component: () => import(/* webpackChunkName: "settings-user" */ './components/dialogs/UserAddDialog.vue'), - }, - ], - }, - { - path: '/settings/server', - name: 'settings-server', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "settings-server" */ './views/SettingsServer.vue'), - }, - { - path: '/settings/metrics', - name: 'metrics', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "metrics" */ './views/MetricsView.vue'), - }, - { - path: '/settings/announcements', - name: 'announcements', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "announcements" */ './views/AnnouncementsView.vue'), - }, - { - path: '/settings/updates', - name: 'updates', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "updates" */ './views/UpdatesView.vue'), + path: '/settings/users/add', + name: 'settings-users-add', + component: () => import(/* webpackChunkName: "settings-user" */ './components/dialogs/UserAddDialog.vue'), }, ], }, { - path: '/media-management', - name: 'media-management', - redirect: {name: 'media-analysis'}, - component: () => import(/* webpackChunkName: "media-management" */ './views/MediaManagement.vue'), - children: [ - { - path: '/media-management/analysis', - name: 'media-analysis', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "media-analysis" */ './views/MediaAnalysis.vue'), - }, - { - path: '/media-management/missing-posters', - name: 'missing-posters', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "missing-posters" */ './views/MissingPosters.vue'), - }, - { - path: '/media-management/duplicate-files', - name: 'duplicate-files', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "duplicate-files" */ './views/DuplicateFiles.vue'), - }, - { - path: '/media-management/duplicate-pages', - name: 'duplicate-pages', - redirect: {name: 'settings-duplicate-pages-known'}, - component: () => import(/* webpackChunkName: "duplicate-pages" */ './views/DuplicatePagesHolder.vue'), - children: [ - { - path: '/media-management/duplicate-pages/known', - name: 'settings-duplicate-pages-known', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "duplicate-pages" */ './views/DuplicatePagesKnown.vue'), - }, - { - path: '/media-management/duplicate-pages/unknown', - name: 'settings-duplicate-pages-unknown', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "duplicate-pages" */ './views/DuplicatePagesUnknown.vue'), - }, - ], - }, - ], + path: '/settings/server', + name: 'settings-server', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "settings-server" */ './views/SettingsServer.vue'), + }, + { + path: '/settings/metrics', + name: 'metrics', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "metrics" */ './views/MetricsView.vue'), + }, + { + path: '/settings/announcements', + name: 'announcements', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "announcements" */ './views/AnnouncementsView.vue'), + }, + { + path: '/settings/updates', + name: 'updates', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "updates" */ './views/UpdatesView.vue'), + }, + { + path: '/media-management/analysis', + name: 'media-analysis', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "media-analysis" */ './views/MediaAnalysis.vue'), + }, + { + path: '/media-management/missing-posters', + name: 'missing-posters', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "missing-posters" */ './views/MissingPosters.vue'), + }, + { + path: '/media-management/duplicate-files', + name: 'duplicate-files', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "duplicate-files" */ './views/DuplicateFiles.vue'), + }, + { + path: '/media-management/duplicate-pages/known', + name: 'settings-duplicate-pages-known', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "duplicate-pages-known" */ './views/DuplicatePagesKnown.vue'), + }, + { + path: '/media-management/duplicate-pages/unknown', + name: 'settings-duplicate-pages-unknown', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "duplicate-pages-new" */ './views/DuplicatePagesUnknown.vue'), }, { path: '/history', @@ -237,25 +213,16 @@ const router = new Router({ component: () => import(/* webpackChunkName: "search" */ './views/SearchView.vue'), }, { - path: '/import', - name: 'import', - redirect: {name: 'import-books'}, + path: '/import/books', + name: 'import-books', beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "import" */ './views/ImportHolder.vue'), - children: [ - { - path: '/import/books', - name: 'import-books', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "import-books" */ './views/ImportBooks.vue'), - }, - { - path: '/import/readlist', - name: 'import-readlist', - beforeEnter: adminGuard, - component: () => import(/* webpackChunkName: "import-readlist" */ './views/ImportReadList.vue'), - }, - ], + component: () => import(/* webpackChunkName: "import-books" */ './views/ImportBooks.vue'), + }, + { + path: '/import/readlist', + name: 'import-readlist', + beforeEnter: adminGuard, + component: () => import(/* webpackChunkName: "import-readlist" */ './views/ImportReadList.vue'), }, ], }, diff --git a/komga-webui/src/views/AnnouncementsView.vue b/komga-webui/src/views/AnnouncementsView.vue index 4482a96c..8a83d328 100644 --- a/komga-webui/src/views/AnnouncementsView.vue +++ b/komga-webui/src/views/AnnouncementsView.vue @@ -9,7 +9,7 @@ inline left :value="item._komga.read ? 0 : 1" - color="warning" + color="info" > {{ item.title }} -
- - {{ $t('duplicate_pages.known') }} - {{ $t('duplicate_pages.new') }} - - -
- - - - - diff --git a/komga-webui/src/views/HomeView.vue b/komga-webui/src/views/HomeView.vue index d5413106..af5757cb 100644 --- a/komga-webui/src/views/HomeView.vue +++ b/komga-webui/src/views/HomeView.vue @@ -7,8 +7,8 @@ dot offset-x="15" offset-y="20" - :value="drawerVisible ? 0 : booksToCheck + $store.getters.getUnreadAnnouncementsCount()" - :color="booksToCheck ? 'accent' : 'warning'" + :value="drawerVisible ? 0 : $store.state.booksToCheck + $store.getters.getUnreadAnnouncementsCount()" + :color="$store.state.booksToCheck ? 'accent' : 'info'" class="ms-n3" > @@ -52,7 +52,7 @@ - + mdi-home @@ -62,6 +62,7 @@ + mdi-book-multiple @@ -69,7 +70,7 @@ {{ $t('navigation.libraries') }} - + mdi-plus @@ -78,7 +79,6 @@ @@ -91,35 +91,85 @@ >{{ $t('common.unavailable') }} - + - - - mdi-import - - + + + - - - mdi-book-cog - - + + {{ $t('common.books') }} + + + + {{ $t('common.readlist') }} + + + + + + + + + + + {{ $t('media_analysis.media_analysis') }} + + + + + {{ $t('missing_posters.title') }} + + + + {{ $t('duplicates.title') }} + + + + + + + {{ $t('duplicate_pages.known') }} + + + + {{ $t('duplicate_pages.new') }} + + + @@ -130,21 +180,59 @@ - - - mdi-cog - - + + + + + + + {{ $t('users.users') }} + + + + {{ $t('server.tab_title') }} + + + + {{ $t('metrics.title') }} + + + + + {{ $t('announcements.tab_title') }} + + + + + - {{ $t('server_settings.server_settings') }} + {{ $t('server.updates') }} - - + + @@ -240,6 +328,10 @@ export default Vue.extend({ LIBRARIES_ALL, drawerVisible: this.$vuetify.breakpoint.lgAndUp, locales: this.$i18n.availableLocales.map((x: any) => ({text: this.$i18n.t('common.locale_name', x), value: x})), + expandSettings: false, + expandDuplicatePages: false, + expandMediaManagement: false, + expandImport: false, } }, async created() { @@ -258,11 +350,14 @@ export default Vue.extend({ this.$komgaReleases.getReleases() .then(x => this.$store.commit('setReleases', x)) } + this.checkRoute(this.$route) + }, + watch: { + $route(to, from) { + this.checkRoute(to) + }, }, computed: { - booksToCheck(): number { - return this.$store.state.booksToCheck - }, taskCount(): number { return this.$store.state.komgaSse.taskCount }, @@ -316,6 +411,12 @@ export default Vue.extend({ }, }, methods: { + checkRoute(to) { + this.expandSettings = to.path.includes('/settings/') + this.expandMediaManagement = to.path.includes('/media-management/') + this.expandImport = to.path.includes('/import/') + this.expandDuplicatePages = to.path.includes('/duplicate-pages/') + }, toggleDrawer() { this.drawerVisible = !this.drawerVisible }, diff --git a/komga-webui/src/views/ImportHolder.vue b/komga-webui/src/views/ImportHolder.vue deleted file mode 100644 index b655f073..00000000 --- a/komga-webui/src/views/ImportHolder.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - diff --git a/komga-webui/src/views/MediaManagement.vue b/komga-webui/src/views/MediaManagement.vue deleted file mode 100644 index 02a7afd2..00000000 --- a/komga-webui/src/views/MediaManagement.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/komga-webui/src/views/SettingsHolder.vue b/komga-webui/src/views/SettingsHolder.vue deleted file mode 100644 index 0c7c6664..00000000 --- a/komga-webui/src/views/SettingsHolder.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - -