Untitled
unknown
javascript
2 years ago
6.9 kB
4
Indexable
<template> <v-card> <v-toolbar color="accent" dark elevation="0">Membres du tableau</v-toolbar> <v-card-text> <v-row v-if="isUserCreator || isUserAdmin"> <v-col cols="10"> <v-text-field v-model="newCollaboraterEmail" :rules="rules" @keypress.enter="addCollaborater" color="accent" clearable label="Inviter un collaborateur" placeholder="email@example.com" ></v-text-field> </v-col> <v-col cols="2" class="d-flex align-center"> <v-btn @click="addCollaborater" color="primary"><v-icon>mdi-plus</v-icon></v-btn> </v-col> </v-row> <v-list v-if="collaboraters.length" class="collaboraters-list"> <v-list-item v-for="(collaborater, i) in collaboraters" :key="i"> <v-list-item-avatar class="mr-2" :color="!collaborater.photoURL ? 'avatarBg' : ''"> <img v-if="collaborater.photoURL" :src="collaborater.photoURL" /> <span v-else>{{ collaborater.displayName.split(" ")[0][0].toUpperCase() }}{{ collaborater.displayName.split(" ")[1][0].toUpperCase() }}</span> </v-list-item-avatar> <v-list-item-content> <v-list-item-title> {{ collaborater.displayName }} <span v-if="collaborater.email === table.creator.email">(Créateur)</span> <span v-if="table.admins.includes(collaborater.email) && collaborater.email !== table.creator.email">(Administrateur)</span> </v-list-item-title> <v-list-item-subtitle>{{ collaborater.email }}</v-list-item-subtitle> </v-list-item-content> <v-list-item-action v-if="(isUserCreator && collaborater.email != table.creator.email) || (isUserAdmin && collaborater.email != table.creator.email)"> <v-menu offset-x> <template v-slot:activator="{ on, attrs }"> <v-btn icon v-on="on" v-bind="attrs" class="more-btn"><v-icon>mdi-dots-vertical</v-icon></v-btn> </template> <v-list> <v-list-item v-if="collaborater.email !== table.creator.email && isUserCreator && !table/*?*/.admins/*?*/.includes(collaborater.email)" @click="addAdmin(collaborater.email)"> <v-list-item-content> <v-list-item-title>Promouvoir comme administrateur</v-list-item-title> </v-list-item-content> </v-list-item> <v-list-item v-if="collaborater.email !== table.creator.email && isUserCreator && table?.admins?.includes(collaborater.email)" @click="removeAdmin(collaborater.email)"> <v-list-item-content> <v-list-item-title>Rétrograder comme collaborateur</v-list-item-title> </v-list-item-content> </v-list-item> <v-list-item v-if="isUserCreator" @click="setOwner(collaborater)"> <v-list-item-title>Promouvoir comme propriétaire</v-list-item-title> </v-list-item> </v-list> </v-list> <<<<<<< HEAD <p v-else class="mt-4 body-1">Les collaborateurs du tableau que vous inviterez seront ajoutés ici</p> ======= <v-list v-if="table.collaboraters.filter((collaborater) => !collaboraters.map((collaborater) => collaborater.email).includes(collaborater)).length"> <v-list-item v-for="(collaborater, i) in table.collaboraters.filter((collaborater) => !collaboraters.map((collaborater) => collaborater.email).includes(collaborater))" :key="i"> <v-list-item-avatar class="mr-2 profile-img"> <v-icon>mdi-account-question</v-icon> </v-list-item-avatar> <v-list-item-content> <v-list-item-subtitle> {{ collaborater }} </v-list-item-subtitle> </v-list-item-content> <v-list-item-action v-if="(isUserCreator && collaborater.email != table.creator.email) || (isUserAdmin && collaborater.email != table.creator.email)"> <v-menu offset-x> <template v-slot:activator="{ on, attrs }"> <v-btn icon v-on="on" v-bind="attrs" class="more-btn"><v-icon>mdi-dots-vertical</v-icon></v-btn> </template> <v-list> <v-list-item v-if="isUserAdmin && collaborater.email != user.email && collaborater.email != table.creator.email" @click="removeCollaborater(collaborater)"> <v-list-item-content> <v-list-item-title>Ejecter</v-list-item-title> </v-list-item-content> </v-list-item> </v-list> </v-menu> </v-list-item-action> <v-btn v-if="collaborater.email === table.creator.email" icon> <v-icon color="amber">mdi-crown</v-icon> </v-btn> </v-list-item> </v-list> <p v-else class="mt-4 body-1">Les collaborateurs du tableau que vous inviterez seront ajouter ici</p> <v-alert v-if="errorMessage" color="red" outlined border="left" dense dismissible type="error">{{ errorMessage }}</v-alert> </v-card-text> <v-card-actions class="justify-end"> <v-btn text @click="dialog.value = false">Fermer</v-btn> </v-card-actions> </v-card> </template> <script> import { db } from "@/firebase"; import { getCurrentUser } from "@/services/authentification"; import { setOwner, addCollaborater, removeCollaborater, addAdmin, removeAdmin } from "@/services/table"; export default { name: "MemberList", props: ["dialog", "isUserCreator", "table", "isUserAdmin"], data: () => ({ newCollaboraterEmail: "", collaboraters: [], errorMessage: "", rules: [], }), computed: { user() { return getCurrentUser(); }, admins() { let adminsArr = []; this.collaboraters.forEach(collaborater => { if (this.isCollaboraterAdmin(collaborater)) { adminsArr.push(collaborater); } }) return adminsArr; }, noRoles() { let arr = []; this.collaboraters.forEach(collaborater => { if (!this.isCollaboraterAdmin(collaborater)) { arr.push(collaborater); } }) return arr; } }, async mounted() { await this.$bind("collaboraters", db.collection("users").where("email", "in", this.table.collaboraters)); }, methods: { async addCollaborater() { this.rules = [(v) => !!v || "L'adresse email est requise", (v) => /.+@.+/.test(v) || "L'adresse email est invalide"]; this.errorMessage = await addCollaborater(this.table, this.newCollaboraterEmail); }, async removeCollaborater(collaboraterEmail) { await removeCollaborater(this.table, collaboraterEmail); }, async addAdmin(collaboraterEmail) { await addAdmin(collaboraterEmail, this.table); }, async removeAdmin(collaboraterEmail) { await removeAdmin(collaboraterEmail, this.table); }, async setOwner(collaborater) { setOwner(collaborater, this.table); }, }, watch: { "table.collaboraters": async function () { await this.$bind("collaboraters", db.collection("users").where("email", "in", this.table.collaboraters)); if (!this.table.collaboraters.includes(getCurrentUser().email)) this.$router.push({ name: "Home" }); }, newCollaboraterEmail: function (val) { this.rules = []; }, }, }; </script> <style> .role-title { color: #4d4d4d; font-style: italic; letter-spacing: 0.75px; } </style>
Editor is loading...