Untitled

 avatar
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...