Client - add/remove admin rights
This commit is contained in:
parent
0a6aa11b16
commit
80afbe5968
@ -63,7 +63,11 @@
|
|||||||
<span class="cell-heading">
|
<span class="cell-heading">
|
||||||
{{ $t('admin.ACTION') }}
|
{{ $t('admin.ACTION') }}
|
||||||
</span>
|
</span>
|
||||||
<button :class="{ danger: user.admin }">
|
<button
|
||||||
|
:class="{ danger: user.admin }"
|
||||||
|
:disabled="user.username === authUser.username"
|
||||||
|
@click="updateUser(user.username, !user.admin)"
|
||||||
|
>
|
||||||
{{
|
{{
|
||||||
$t(
|
$t(
|
||||||
`admin.USERS.TABLE.${
|
`admin.USERS.TABLE.${
|
||||||
@ -104,7 +108,7 @@
|
|||||||
import { useRoute, LocationQuery } from 'vue-router'
|
import { useRoute, LocationQuery } from 'vue-router'
|
||||||
|
|
||||||
import Pagination from '@/components/Common/Pagination.vue'
|
import Pagination from '@/components/Common/Pagination.vue'
|
||||||
import { ROOT_STORE, USERS_STORE } from '@/store/constants'
|
import { ROOT_STORE, USER_STORE, USERS_STORE } from '@/store/constants'
|
||||||
import { IPagination, IPaginationPayload } from '@/types/api'
|
import { IPagination, IPaginationPayload } from '@/types/api'
|
||||||
import { IUserProfile } from '@/types/user'
|
import { IUserProfile } from '@/types/user'
|
||||||
import { useStore } from '@/use/useStore'
|
import { useStore } from '@/use/useStore'
|
||||||
@ -127,6 +131,9 @@
|
|||||||
]
|
]
|
||||||
let query: IPaginationPayload = getQuery(route.query)
|
let query: IPaginationPayload = getQuery(route.query)
|
||||||
|
|
||||||
|
const authUser: ComputedRef<IUserProfile> = computed(
|
||||||
|
() => store.getters[USER_STORE.GETTERS.AUTH_USER_PROFILE]
|
||||||
|
)
|
||||||
const users: ComputedRef<IUserProfile[]> = computed(
|
const users: ComputedRef<IUserProfile[]> = computed(
|
||||||
() => store.getters[USERS_STORE.GETTERS.USERS]
|
() => store.getters[USERS_STORE.GETTERS.USERS]
|
||||||
)
|
)
|
||||||
@ -168,6 +175,12 @@
|
|||||||
order_by: getOrderBy(query.order_by),
|
order_by: getOrderBy(query.order_by),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function updateUser(username: string, admin: boolean) {
|
||||||
|
store.dispatch(USERS_STORE.ACTIONS.UPDATE_USER, {
|
||||||
|
username,
|
||||||
|
admin,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
onBeforeMount(() => loadUsers(query))
|
onBeforeMount(() => loadUsers(query))
|
||||||
|
|
||||||
@ -179,7 +192,15 @@
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
return { errorMessages, pagination, query, users, capitalize }
|
return {
|
||||||
|
authUser,
|
||||||
|
errorMessages,
|
||||||
|
pagination,
|
||||||
|
query,
|
||||||
|
users,
|
||||||
|
capitalize,
|
||||||
|
updateUser,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -91,6 +91,11 @@ button {
|
|||||||
background: var(--button-danger-hover-bg-color);
|
background: var(--button-danger-hover-bg-color);
|
||||||
color: var(--button-danger-hover-color);
|
color: var(--button-danger-hover-color);
|
||||||
}
|
}
|
||||||
|
&:disabled {
|
||||||
|
background: var(--disabled-background-color);
|
||||||
|
border-color: var(--disabled-color);
|
||||||
|
color: var(--disabled-color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ import { ROOT_STORE, USERS_STORE } from '@/store/constants'
|
|||||||
import { IRootState } from '@/store/modules/root/types'
|
import { IRootState } from '@/store/modules/root/types'
|
||||||
import { IUsersActions, IUsersState } from '@/store/modules/users/types'
|
import { IUsersActions, IUsersState } from '@/store/modules/users/types'
|
||||||
import { IPaginationPayload } from '@/types/api'
|
import { IPaginationPayload } from '@/types/api'
|
||||||
|
import { IAdminUserPayload } from '@/types/user'
|
||||||
import { handleError } from '@/utils'
|
import { handleError } from '@/utils'
|
||||||
|
|
||||||
export const actions: ActionTree<IUsersState, IRootState> & IUsersActions = {
|
export const actions: ActionTree<IUsersState, IRootState> & IUsersActions = {
|
||||||
@ -35,4 +36,27 @@ export const actions: ActionTree<IUsersState, IRootState> & IUsersActions = {
|
|||||||
context.commit(USERS_STORE.MUTATIONS.UPDATE_USERS_LOADING, false)
|
context.commit(USERS_STORE.MUTATIONS.UPDATE_USERS_LOADING, false)
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
[USERS_STORE.ACTIONS.UPDATE_USER](
|
||||||
|
context: ActionContext<IUsersState, IRootState>,
|
||||||
|
payload: IAdminUserPayload
|
||||||
|
): void {
|
||||||
|
console.log('payload', payload)
|
||||||
|
context.commit(ROOT_STORE.MUTATIONS.EMPTY_ERROR_MESSAGES)
|
||||||
|
authApi
|
||||||
|
.patch(`users/${payload.username}`, { admin: payload.admin })
|
||||||
|
.then((res) => {
|
||||||
|
if (res.data.status === 'success') {
|
||||||
|
context.commit(
|
||||||
|
USERS_STORE.MUTATIONS.UPDATE_USER,
|
||||||
|
res.data.data.users[0]
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
handleError(context, null)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((error) => handleError(context, error))
|
||||||
|
.finally(() =>
|
||||||
|
context.commit(USERS_STORE.MUTATIONS.UPDATE_USERS_LOADING, false)
|
||||||
|
)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
export enum UsersActions {
|
export enum UsersActions {
|
||||||
GET_USERS = 'GET_USERS',
|
GET_USERS = 'GET_USERS',
|
||||||
|
UPDATE_USER = 'UPDATE_USER',
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum UsersGetters {
|
export enum UsersGetters {
|
||||||
@ -9,6 +10,7 @@ export enum UsersGetters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export enum UsersMutations {
|
export enum UsersMutations {
|
||||||
|
UPDATE_USER = 'UPDATE_USER',
|
||||||
UPDATE_USERS = 'UPDATE_USERS',
|
UPDATE_USERS = 'UPDATE_USERS',
|
||||||
UPDATE_USERS_LOADING = 'UPDATE_USERS_LOADING',
|
UPDATE_USERS_LOADING = 'UPDATE_USERS_LOADING',
|
||||||
UPDATE_USERS_PAGINATION = 'UPDATE_USERS_PAGINATION',
|
UPDATE_USERS_PAGINATION = 'UPDATE_USERS_PAGINATION',
|
||||||
|
@ -6,6 +6,17 @@ import { IPagination } from '@/types/api'
|
|||||||
import { IUserProfile } from '@/types/user'
|
import { IUserProfile } from '@/types/user'
|
||||||
|
|
||||||
export const mutations: MutationTree<IUsersState> & TUsersMutations = {
|
export const mutations: MutationTree<IUsersState> & TUsersMutations = {
|
||||||
|
[USERS_STORE.MUTATIONS.UPDATE_USER](
|
||||||
|
state: IUsersState,
|
||||||
|
updatedUser: IUserProfile
|
||||||
|
) {
|
||||||
|
state.users = state.users.map((user) => {
|
||||||
|
if (user.username === updatedUser.username) {
|
||||||
|
return updatedUser
|
||||||
|
}
|
||||||
|
return user
|
||||||
|
})
|
||||||
|
},
|
||||||
[USERS_STORE.MUTATIONS.UPDATE_USERS](
|
[USERS_STORE.MUTATIONS.UPDATE_USERS](
|
||||||
state: IUsersState,
|
state: IUsersState,
|
||||||
users: IUserProfile[]
|
users: IUserProfile[]
|
||||||
|
@ -8,7 +8,7 @@ import {
|
|||||||
import { USERS_STORE } from '@/store/constants'
|
import { USERS_STORE } from '@/store/constants'
|
||||||
import { IRootState } from '@/store/modules/root/types'
|
import { IRootState } from '@/store/modules/root/types'
|
||||||
import { IPagination, IPaginationPayload } from '@/types/api'
|
import { IPagination, IPaginationPayload } from '@/types/api'
|
||||||
import { IUserProfile } from '@/types/user'
|
import { IAdminUserPayload, IUserProfile } from '@/types/user'
|
||||||
|
|
||||||
export interface IUsersState {
|
export interface IUsersState {
|
||||||
users: IUserProfile[]
|
users: IUserProfile[]
|
||||||
@ -21,6 +21,10 @@ export interface IUsersActions {
|
|||||||
context: ActionContext<IUsersState, IRootState>,
|
context: ActionContext<IUsersState, IRootState>,
|
||||||
payload: IPaginationPayload
|
payload: IPaginationPayload
|
||||||
): void
|
): void
|
||||||
|
[USERS_STORE.ACTIONS.UPDATE_USER](
|
||||||
|
context: ActionContext<IUsersState, IRootState>,
|
||||||
|
payload: IAdminUserPayload
|
||||||
|
): void
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IUsersGetters {
|
export interface IUsersGetters {
|
||||||
@ -30,6 +34,7 @@ export interface IUsersGetters {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type TUsersMutations<S = IUsersState> = {
|
export type TUsersMutations<S = IUsersState> = {
|
||||||
|
[USERS_STORE.MUTATIONS.UPDATE_USER](state: S, updatedUser: IUserProfile): void
|
||||||
[USERS_STORE.MUTATIONS.UPDATE_USERS](state: S, users: IUserProfile[]): void
|
[USERS_STORE.MUTATIONS.UPDATE_USERS](state: S, users: IUserProfile[]): void
|
||||||
[USERS_STORE.MUTATIONS.UPDATE_USERS_LOADING](state: S, loading: boolean): void
|
[USERS_STORE.MUTATIONS.UPDATE_USERS_LOADING](state: S, loading: boolean): void
|
||||||
[USERS_STORE.MUTATIONS.UPDATE_USERS_PAGINATION](
|
[USERS_STORE.MUTATIONS.UPDATE_USERS_PAGINATION](
|
||||||
|
@ -32,6 +32,11 @@ export interface IUserPayload {
|
|||||||
password_conf: string
|
password_conf: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IAdminUserPayload {
|
||||||
|
username: string
|
||||||
|
admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
export interface IUserPreferencesPayload {
|
export interface IUserPreferencesPayload {
|
||||||
language: string
|
language: string
|
||||||
timezone: string
|
timezone: string
|
||||||
|
Loading…
Reference in New Issue
Block a user