koel/resources/assets/js/components/user/UserCard.vue

129 lines
3 KiB
Vue
Raw Normal View History

2022-04-15 14:24:30 +00:00
<template>
2022-04-23 21:50:05 +00:00
<article v-if="showing" :class="{ me: isCurrentUser }" class="user-card" data-test="user-card">
2022-04-15 14:24:30 +00:00
<div class="info">
2022-04-23 21:50:05 +00:00
<img :alt="`${user.name}'s avatar`" :src="user.avatar" height="96" width="96">
2022-04-15 14:24:30 +00:00
<div class="right">
<div>
<h1>
<span class="name">{{ user.name }}</span>
<i
v-if="isCurrentUser"
class="you text-orange fa fa-check-circle"
data-test="current-user-indicator"
2022-04-23 21:50:05 +00:00
title="This is you!"
2022-04-15 14:24:30 +00:00
/>
<i
v-if="user.is_admin"
class="is-admin text-blue fa fa-shield"
data-test="admin-indicator"
2022-04-23 21:50:05 +00:00
title="User has admin privileges"
2022-04-15 14:24:30 +00:00
/>
</h1>
<p class="email" data-test="user-email">{{ user.email }}</p>
</div>
<div class="buttons">
2022-04-23 21:50:05 +00:00
<Btn class="btn-edit" data-test="edit-user-btn" small @click="edit">{{ editButtonLabel }}</Btn>
2022-04-15 17:00:08 +00:00
<Btn
2022-04-15 14:24:30 +00:00
v-if="!isCurrentUser"
class="btn-delete"
2022-04-23 21:50:05 +00:00
data-test="delete-user-btn"
2022-04-15 14:24:30 +00:00
red
small
2022-04-23 21:50:05 +00:00
@click="confirmDelete"
2022-04-15 14:24:30 +00:00
>
Delete
2022-04-15 17:00:08 +00:00
</Btn>
2022-04-15 14:24:30 +00:00
</div>
</div>
</div>
</article>
</template>
2022-04-15 17:00:08 +00:00
<script lang="ts" setup>
import { computed, defineAsyncComponent, ref, toRefs } from 'vue'
2022-04-15 14:24:30 +00:00
import { userStore } from '@/stores'
import router from '@/router'
import { alerts } from '@/utils'
2022-04-21 18:39:18 +00:00
const Btn = defineAsyncComponent(() => import('@/components/ui/Btn.vue'))
2022-04-15 14:24:30 +00:00
2022-04-15 17:00:08 +00:00
const props = defineProps<{ user: User }>()
const { user } = toRefs(props)
2022-04-15 14:24:30 +00:00
2022-04-15 17:00:08 +00:00
const showing = ref(true)
const isCurrentUser = computed(() => user.value.id === userStore.current.id)
const editButtonLabel = computed(() => isCurrentUser.value ? 'Update Profile' : 'Edit')
const emit = defineEmits(['editUser'])
const edit = () => isCurrentUser.value ? router.go('profile') : emit('editUser', user.value)
const confirmDelete = () => alerts.confirm(`Youre about to unperson ${user.value.name}. Are you sure?`, destroy)
const destroy = () => {
userStore.destroy(user.value)
showing.value = false
2022-04-21 22:51:48 +00:00
alerts.success(`User "${user.value.name}" deleted.`)
2022-04-15 17:00:08 +00:00
}
2022-04-15 14:24:30 +00:00
</script>
<style lang="scss" scoped>
.user-card {
width: 100%;
.info {
display: flex;
img {
flex: 0 0 96px;
}
.email {
opacity: .5;
}
.right {
flex: 1;
padding: 1rem;
display: flex;
flex-direction: column;
justify-content: space-between;
background-color: rgba(255, 255, 255, .02);
position: relative;
}
h1 {
font-size: 1.4rem;
margin-bottom: .25rem;
> * + * {
margin-left: .5rem
}
}
.buttons {
display: none;
margin-top: .5rem;
2022-04-23 21:46:25 +00:00
> * + * {
margin-left: .25rem;
}
2022-04-15 14:24:30 +00:00
@media (hover: none) {
display: block;
}
}
&:hover .buttons {
display: block;
}
}
@media only screen and (max-width: 1024px) {
width: 100%;
}
}
</style>