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 @@
- mdi-account-star
+ mdi-account-star
mdi-account
- {{ u.roles.includes('ADMIN') ? 'Administrator' : 'User' }}
+ {{ u.roles.includes(UserRoles.ADMIN) ? 'Administrator' : 'User' }}
@@ -31,7 +31,8 @@
-
+
mdi-library-books
@@ -39,6 +40,17 @@
+
+
+
+
+ mdi-pencil
+
+
+ Edit user
+
+
+
mdi-plus
-
+
+
@@ -76,18 +92,23 @@