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; + } }