diff --git a/next-ui/src/colada/mutations/update-user.ts b/next-ui/src/colada/mutations/update-user.ts
new file mode 100644
index 000000000..d448d03cd
--- /dev/null
+++ b/next-ui/src/colada/mutations/update-user.ts
@@ -0,0 +1,20 @@
+import {defineMutation, useMutation, useQueryCache} from '@pinia/colada'
+import {komgaClient} from '@/api/komga-client'
+import type {components} from '@/generated/openapi/komga'
+
+export const useUpdateUser = defineMutation(() => {
+ const queryCache = useQueryCache()
+ return useMutation({
+ mutation: (user: components['schemas']['UserDto']) =>
+ komgaClient.PATCH('/api/v2/users/{id}', {
+ params: {path: {id: user.id}},
+ body: user,
+ }),
+ onSuccess: () => {
+ queryCache.invalidateQueries({key: ['users']})
+ },
+ onError: (error) => {
+ console.log('update user error', error)
+ },
+ })
+})
diff --git a/next-ui/src/components.d.ts b/next-ui/src/components.d.ts
index be022634a..8c2850ef5 100644
--- a/next-ui/src/components.d.ts
+++ b/next-ui/src/components.d.ts
@@ -21,6 +21,10 @@ declare module 'vue' {
AppFooter: typeof import('./components/AppFooter.vue')['default']
BuildCommit: typeof import('./components/BuildCommit.vue')['default']
BuildVersion: typeof import('./components/BuildVersion.vue')['default']
+ DialogConfirm: typeof import('./components/dialogs/DialogConfirm.vue')['default']
+ DialogConfirmEdit: typeof import('./components/dialogs/DialogConfirmEdit.vue')['default']
+ FormUserChangePassword: typeof import('./components/forms/user/FormUserChangePassword.vue')['default']
+ FormUserRoles: typeof import('./components/forms/user/FormUserRoles.vue')['default']
HelloWorld: typeof import('./components/HelloWorld.vue')['default']
LoginForm: typeof import('./components/LoginForm.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']
diff --git a/next-ui/src/components/dialogs/DialogConfirmEdit.vue b/next-ui/src/components/dialogs/DialogConfirmEdit.vue
new file mode 100644
index 000000000..e3308f551
--- /dev/null
+++ b/next-ui/src/components/dialogs/DialogConfirmEdit.vue
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/next-ui/src/components/forms/user/FormUserChangePassword.vue b/next-ui/src/components/forms/user/FormUserChangePassword.vue
new file mode 100644
index 000000000..a7f524f3b
--- /dev/null
+++ b/next-ui/src/components/forms/user/FormUserChangePassword.vue
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/next-ui/src/components/forms/user/FormUserRoles.vue b/next-ui/src/components/forms/user/FormUserRoles.vue
new file mode 100644
index 000000000..62ea9feec
--- /dev/null
+++ b/next-ui/src/components/forms/user/FormUserRoles.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
diff --git a/next-ui/src/pages/server/users.vue b/next-ui/src/pages/server/users.vue
index 5238e219e..595d8a2f3 100644
--- a/next-ui/src/pages/server/users.vue
+++ b/next-ui/src/pages/server/users.vue
@@ -27,34 +27,54 @@
-
+
+
+
+
+
+
+
@@ -64,12 +84,18 @@ import {komgaClient} from '@/api/komga-client.ts'
import type {components} from '@/generated/openapi/komga'
import {useCurrentUser} from '@/colada/queries/current-user.ts'
import {UserRoles} from '@/types/UserRoles.ts'
+import {useUpdateUser} from '@/colada/mutations/update-user.ts'
+import FormUserChangePassword from '@/components/forms/user/FormUserChangePassword.vue'
+import FormUserRoles from '@/components/forms/user/FormUserRoles.vue'
+import type {Component} from 'vue'
+// API data
const {data: users, error, isLoading} = useUsers()
const {data: me} = useCurrentUser()
-const hideFooter = computed(() => users.value && users.value.length < 11)
+// Table
+const hideFooter = computed(() => users.value && users.value.length < 11)
const headers = [
{title: 'Email', key: 'email'},
{title: 'Latest Activity', key: 'activity', value: (item: components["schemas"]["UserDto"]) => latestActivity[item.id]},
@@ -104,20 +130,53 @@ watch(users, (users) => {
})
-function editRestrictions(userId: string) {
- console.log('edit restrictions: ', userId)
+// Dialogs handling
+const userRecord = ref()
+const currentAction = ref()
+const activator = ref()
+const dialogTitle = ref()
+const dialogComponent = shallowRef()
+
+const {mutate: mutateUser} = useUpdateUser()
+
+enum ACTION {
+ EDIT, DELETE, RESTRICTIONS, PASSWORD
}
-function deleteUser(userId: string) {
- console.log('delete: ', userId)
+function showDialog(action: ACTION, user: components["schemas"]["UserDto"]) {
+ currentAction.value = action
+ switch (action) {
+ case ACTION.EDIT:
+ dialogTitle.value = 'Edit Roles'
+ dialogComponent.value = FormUserRoles
+ break;
+ case ACTION.DELETE:
+ dialogTitle.value = 'Delete User'
+ dialogComponent.value = FormUserRoles
+ break;
+ case ACTION.RESTRICTIONS:
+ dialogTitle.value = 'Edit Restrictions'
+ dialogComponent.value = FormUserRoles
+ break;
+ case ACTION.PASSWORD:
+ dialogTitle.value = 'Change Password'
+ dialogComponent.value = FormUserChangePassword
+ }
+ userRecord.value = user
}
-function editUser(userId: string) {
- console.log('edit: ', userId)
-}
-
-function changePassword(userId: string) {
- console.log('change password: ', userId)
+function handleConfirmation() {
+ switch (currentAction.value) {
+ case ACTION.EDIT:
+ mutateUser(userRecord.value!)
+ break;
+ case ACTION.DELETE:
+ break;
+ case ACTION.RESTRICTIONS:
+ break;
+ case ACTION.PASSWORD:
+ break;
+ }
}