diff --git a/komga-webui/src/components/ItemCard.vue b/komga-webui/src/components/ItemCard.vue index 4402dd929..65ab35d08 100644 --- a/komga-webui/src/components/ItemCard.vue +++ b/komga-webui/src/components/ItemCard.vue @@ -45,7 +45,7 @@ { return createItem(this.item) diff --git a/komga-webui/src/components/UserAddDialog.vue b/komga-webui/src/components/UserAddDialog.vue index 9a17dc31c..fe3d4dd6c 100644 --- a/komga-webui/src/components/UserAddDialog.vue +++ b/komga-webui/src/components/UserAddDialog.vue @@ -52,8 +52,22 @@ Roles + + @@ -87,6 +101,7 @@ + + diff --git a/komga-webui/src/plugins/komga-users.plugin.ts b/komga-webui/src/plugins/komga-users.plugin.ts index 2a98bc49d..de0db809c 100644 --- a/komga-webui/src/plugins/komga-users.plugin.ts +++ b/komga-webui/src/plugins/komga-users.plugin.ts @@ -1,4 +1,5 @@ import KomgaUsersService from '@/services/komga-users.service' +import { UserRoles } from '@/types/enum-users' import { AxiosInstance } from 'axios' import _Vue from 'vue' import { Module } from 'vuex/types' @@ -11,7 +12,9 @@ const vuexModule: Module = { users: [] as UserWithSharedLibrariesDto[], }, getters: { - meAdmin: state => state.me.hasOwnProperty('roles') && state.me.roles.includes('ADMIN'), + meAdmin: state => state.me.hasOwnProperty('roles') && state.me.roles.includes(UserRoles.ADMIN), + meFileDownload: state => state.me.hasOwnProperty('roles') && state.me.roles.includes(UserRoles.FILE_DOWNLOAD), + mePageStreaming: state => state.me.hasOwnProperty('roles') && state.me.roles.includes(UserRoles.PAGE_STREAMING), authenticated: state => state.me.hasOwnProperty('id'), }, mutations: { @@ -46,6 +49,10 @@ const vuexModule: Module = { await service.postUser(user) dispatch('getAllUsers') }, + async updateUserRoles ({ dispatch }, { userId, roles }: { userId: number, roles: RolesUpdateDto }) { + await service.patchUserRoles(userId, roles) + dispatch('getAllUsers') + }, async deleteUser ({ dispatch }, user: UserDto) { await service.deleteUser(user) dispatch('getAllUsers') diff --git a/komga-webui/src/services/komga-users.service.ts b/komga-webui/src/services/komga-users.service.ts index 0165b22d6..7d7756e82 100644 --- a/komga-webui/src/services/komga-users.service.ts +++ b/komga-webui/src/services/komga-users.service.ts @@ -70,6 +70,18 @@ export default class KomgaUsersService { } } + async patchUserRoles (userId: number, roles: RolesUpdateDto): Promise { + try { + return (await this.http.patch(`${API_USERS}/${userId}`, roles)).data + } catch (e) { + let msg = `An error occurred while trying to patch user '${userId}'` + if (e.response.data.message) { + msg += `: ${e.response.data.message}` + } + throw new Error(msg) + } + } + async deleteUser (user: UserDto) { try { await this.http.delete(`${API_USERS}/${user.id}`) diff --git a/komga-webui/src/types/enum-users.ts b/komga-webui/src/types/enum-users.ts new file mode 100644 index 000000000..ce8313c52 --- /dev/null +++ b/komga-webui/src/types/enum-users.ts @@ -0,0 +1,5 @@ +export enum UserRoles { + ADMIN = 'ADMIN', + FILE_DOWNLOAD = 'FILE_DOWNLOAD', + PAGE_STREAMING = 'PAGE_STREAMING' +} diff --git a/komga-webui/src/types/komga-users.ts b/komga-webui/src/types/komga-users.ts index 3cb109593..7e50e2bfd 100644 --- a/komga-webui/src/types/komga-users.ts +++ b/komga-webui/src/types/komga-users.ts @@ -29,3 +29,7 @@ interface SharedLibrariesUpdateDto { all: boolean, libraryIds: number[] } + +interface RolesUpdateDto { + roles: string[] +} diff --git a/komga-webui/src/views/BrowseBook.vue b/komga-webui/src/views/BrowseBook.vue index e113eb8ad..6194849f9 100644 --- a/komga-webui/src/views/BrowseBook.vue +++ b/komga-webui/src/views/BrowseBook.vue @@ -107,6 +107,7 @@ mdi-file-download @@ -117,7 +118,7 @@ title="Read book" class="pb-1" :to="{name: 'read-book', params: { bookId: bookId}}" - :disabled="book.media.status !== 'READY'" + :disabled="book.media.status !== 'READY' || !canReadPages" > mdi-book-open-page-variant @@ -216,6 +217,12 @@ export default Vue.extend({ isAdmin (): boolean { return this.$store.getters.meAdmin }, + canReadPages (): boolean { + return this.$store.getters.mePageStreaming + }, + canDownload (): boolean { + return this.$store.getters.meFileDownload + }, thumbnailUrl (): string { return bookThumbnailUrl(this.bookId) }, diff --git a/komga-webui/src/views/SettingsUsers.vue b/komga-webui/src/views/SettingsUsers.vue index 29e6db093..b7e6461fa 100644 --- a/komga-webui/src/views/SettingsUsers.vue +++ b/komga-webui/src/views/SettingsUsers.vue @@ -15,11 +15,11 @@ - {{ u.roles.includes('ADMIN') ? 'Administrator' : 'User' }} + {{ u.roles.includes(UserRoles.ADMIN) ? 'Administrator' : 'User' }} @@ -31,7 +31,8 @@ @@ -39,6 +40,17 @@ + + + + Edit user + + + mdi-plus - + + @@ -76,18 +92,23 @@