<template> <Modal v-if="modalOpen" title="Invite team member" @close="modalOpen = false" @submit="modalOpen = false"> <div> <h2 class="text-lg font-bold text-primary">Users</h2> <div class="h-48 space-y-3 overflow-y-auto"> <div v-for="unaffiliatedUser in unaffilatedUsers" :key="unaffiliatedUser._id.toString()" class="flex items-center rounded bg-neutral-700 px-3 py-1 text-gray-200"> {{ unaffiliatedUser.username }} <Button v-if="!unaffiliatedUser.teamInvites.includes(user.team.id)" class="ml-auto" @click="inviteUser(unaffiliatedUser)">Invite</Button> <Button v-else class="ml-auto" type="danger" @click="cancelInvite(unaffiliatedUser)">Cancel Invite</Button> </div> </div> </div> </Modal> <Modal v-if="editTeamModal.open" title="Edit team" @close="editTeamModal.open = false" @submit="editTeam"> <Input v-model="editTeamModal.name" background-class="bg-neutral-800" class="w-full max-w-sm">Naam / Prefix</Input> <Colorpicker v-model="editTeamModal.color" input-background-class="bg-neutral-800" class="w-full max-w-sm" /> </Modal> <div class="mx-auto my-10 max-w-2xl"> <h2 class="mb-2 text-xl font-bold text-primary">Team Information</h2> <div class="rounded border-[1px] border-primary px-5 py-2 text-primary"> <table class="w-full table-auto"> <tbody class="divide-y divide-gray-700"> <tr> <td class="py-3">Name</td> <td class="font-bold">{{ team.name }}</td> </tr> <tr> <td class="py-3">Color</td> <td class="font-bold">{{ team.color }}</td> </tr> <tr> <td class="py-3">ID</td> <td class="font-bold">{{ team._id }}</td> </tr> </tbody> </table> </div> <div class="mb-10 mt-5 flex justify-center gap-x-3"> <Button type="danger" @click="leaveTeam">Leave Team</Button> <Button v-if="user.team.admin" @click="openTeamModal">Edit Team</Button> </div> <h2 class="mb-2 text-xl font-bold text-primary">Team Members</h2> <div class="space-y-5 rounded border-[1px] border-primary p-5 text-primary"> <div v-for="teamMember in teamMembers" :key="teamMember._id" class="flex h-12 items-center rounded bg-neutral-800 px-5 font-bold text-gray-200"> {{ teamMember.username }} <span v-if="teamMember.team.admin" class="ml-3 text-sm text-gray-400">Admin</span> <div v-if="user.team.admin" class="ml-auto"> <Button v-if="!teamMember.team.admin && teamMember._id !== user._id" @click="promoteUser(teamMember)">Promote</Button> <Button v-if="teamMember.team.admin && teamMember._id !== user._id" @click="demoteUser(teamMember)">Demote</Button> </div> </div> <div v-if="user.team.admin" class="rounded border-2 border-dashed border-neutral-500 bg-neutral-800 p-3 text-center font-bold text-gray-200 hover:cursor-pointer hover:bg-neutral-700" @click="modalOpen = true"> Invite new member </div> </div> </div> </template> <script setup> const user = useState('user'); const { data: team } = await useFetch('/api/team'); const { data: teamMembers } = await useFetch('/api/team/members'); const { data: unaffilatedUsers } = await useFetch('/api/team/unaffiliated') const modalOpen = ref(false) const editTeamModal = ref({ open: false, name: '', color: '', }) const openTeamModal = () => { editTeamModal.value.name = team.value.name editTeamModal.value.color = team.value.color editTeamModal.value.open = true } const leaveTeam = async () => { try { await $fetch('/api/team/leave'); user.value.team = null; useToast().success('Succesvol team verlaten') } catch (e) { console.log(e); useToast().error(e.statusMessage) } } const editTeam = async () => { try { await $fetch('/api/team/edit', { method: 'POST', body: { name: editTeamModal.value.name, color: editTeamModal.value.color, } }); team.value.name = editTeamModal.value.name team.value.color = editTeamModal.value.color useToast().success('Team is succesvol bewerkt') editTeamModal.value.open = false } catch (e) { console.log(e); useToast().error(e.statusMessage) } } const inviteUser = async (usr) => { try { await $fetch('/api/team/invite', { method: 'POST', body: { id: usr._id } }); usr.teamInvites.push(user.value.team.id); useToast().success(`Invited ${usr.username} succesvol`) } catch (e) { console.log(e); useToast().error(e.statusMessage) } } const cancelInvite = async (usr) => { try { await $fetch('/api/team/cancelinvite', { method: 'POST', body: { id: usr._id } }); usr.teamInvites = usr.teamInvites.filter(a => a !== user.value.team.id); useToast().success('Succesvol invite geannuleerd') } catch (e) { console.log(e); useToast().error(e.statusMessage) } } const promoteUser = async (usr) => { try { await $fetch('/api/team/promote', { method: 'POST', body: { userId: usr._id } }); usr.team.admin = true console.log(usr) console.log(teamMembers) useToast().success('Succesvol gebruiker gepromoveerd') } catch (e) { console.log(e); useToast().error(e.statusMessage) } } const demoteUser = async (usr) => { try { await $fetch('/api/team/demote', { method: 'POST', body: { userId: usr._id } }); usr.team.admin = false useToast().success('Succesvol gebruiker gedegradeerd') } catch (e) { console.log(e); useToast().error(e.statusMessage) } } </script>