feat(components): create admin tab component for user profiles
This commit is contained in:
		
							parent
							
								
									01fdb5bf41
								
							
						
					
					
						commit
						fea0895676
					
				
							
								
								
									
										116
									
								
								components/profile/adminPanel.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								components/profile/adminPanel.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,116 @@ | ||||
| <script lang="ts" setup> | ||||
| 	import { message } from "ant-design-vue"; | ||||
| 	import { IUser } from "~/models/user"; | ||||
| 	const [messageApi, contextHolder] = message.useMessage(); | ||||
| 
 | ||||
| 	const props = defineProps<{ user: IUser | null }>(); | ||||
| 	const short = props.user?.profile.isAdmin; | ||||
| 	const showBanUnban = ref<boolean>(false); | ||||
| 	const showDemote = ref<boolean>(false); | ||||
| 	const handle = async () => { | ||||
| 		await useApiFetch(`/user/${props.user?._id}/ban`, { | ||||
| 			method: "post", | ||||
| 			body: { | ||||
| 				ban: !props.user?.banned, | ||||
| 			}, | ||||
| 		}); | ||||
| 		messageApi.success(`User ${!props.user?.banned ? "banned" : "unbanned"}.`); | ||||
| 		setTimeout(() => { | ||||
| 			showBanUnban.value = false; | ||||
| 		}, 1000); | ||||
| 	}; | ||||
| 	const prodem = async () => { | ||||
| 		await useApiFetch(`/user/${props.user?._id}/admin`, { | ||||
| 			method: "post", | ||||
| 			body: { | ||||
| 				promote: !short, | ||||
| 			}, | ||||
| 		}); | ||||
| 		messageApi.success( | ||||
| 			`User ${props.user?.username} is now ${ | ||||
| 				short ? "an admin" : "a regular user" | ||||
| 			}.`, | ||||
| 		); | ||||
| 		setTimeout(() => { | ||||
| 			showDemote.value = false; | ||||
| 		}, 1000); | ||||
| 	}; | ||||
| 	// TODO: common ip fetch | ||||
| </script> | ||||
| <template> | ||||
| 	<a-space :size="10" direction="vertical"> | ||||
| 		<div> | ||||
| 			<a-descriptions | ||||
| 				:colon="false" | ||||
| 				:label-style="{ fontWeight: 'bold' }" | ||||
| 				:column="1" | ||||
| 			> | ||||
| 				<a-descriptions-item label="IP addresses"> | ||||
| 					<a-list :data-source="user?.ipLog"> | ||||
| 						<template #renderItem="{ item }"> | ||||
| 							{{ item.ip }} | ||||
| 						</template> | ||||
| 					</a-list> | ||||
| 				</a-descriptions-item> | ||||
| 			</a-descriptions> | ||||
| 		</div> | ||||
| 		<div> | ||||
| 			<a-space> | ||||
| 				<span> | ||||
| 					This user is | ||||
| 					<b>{{ user?.profile.isAdmin ? "an admin" : "a regular user" }}</b | ||||
| 					>. | ||||
| 				</span> | ||||
| 				<a-button | ||||
| 					danger | ||||
| 					v-if="!user?.profile.isAdmin" | ||||
| 					@click="() => (showDemote = true)" | ||||
| 				> | ||||
| 					<b>Promote to Admin</b> | ||||
| 				</a-button> | ||||
| 				<a-button v-else @click="() => (showDemote = true)"> | ||||
| 					Demote to regular user | ||||
| 				</a-button> | ||||
| 			</a-space> | ||||
| 			<a-divider /> | ||||
| 			<div style="display: flex"> | ||||
| 				<a-button danger @click="() => (showBanUnban = true)"> | ||||
| 					{{ `${user?.banned ? "Unban" : "Ban"}` }} | ||||
| 				</a-button> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</a-space> | ||||
| 	<a-modal | ||||
| 		cancel-text="No" | ||||
| 		ok-text="Yes" | ||||
| 		@ok="handle" | ||||
| 		@cancel="() => (showBanUnban = false)" | ||||
| 		v-model:open="showBanUnban" | ||||
| 		:title="`${user?.banned ? 'Unban' : 'Ban'} ${user?.username}`" | ||||
| 	> | ||||
| 		Are you sure you want to {{ `${user?.banned ? "unban" : "ban"}` }} | ||||
| 		{{ user?.username }}? | ||||
| 	</a-modal> | ||||
| 	<a-modal | ||||
| 		cancel-text="No" | ||||
| 		ok-text="Yes, I'm sure" | ||||
| 		@ok="prodem" | ||||
| 		@cancel="() => (showDemote = false)" | ||||
| 		v-model:open="showDemote" | ||||
| 		:title="`${short ? 'Demoting' : 'Promoting'} ${user?.username} ${ | ||||
| 			!short ? 'to an administrator' : 'to a regular user' | ||||
| 		}`" | ||||
| 	> | ||||
| 		<div v-if="!short"> | ||||
| 			Are you <b><u>absolutely sure</u></b> you want to | ||||
| 			<b>promote this user to an admin</b>? | ||||
| 			<br /> | ||||
| 			<a-typography-title :level="5"> | ||||
| 				This is a VERY dangerous permission to grant. | ||||
| 			</a-typography-title> | ||||
| 		</div> | ||||
| 		<div v-else> | ||||
| 			Are you sure you want to remove this user as an administrator? | ||||
| 		</div> | ||||
| 	</a-modal> | ||||
| </template> | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user