feat: all Canvas endpoints implemented, just waiting for projectId to test
This commit is contained in:
@@ -14,22 +14,26 @@
|
||||
|
||||
<div class="header-actions">
|
||||
<button class="return-button" @click="store.logout">Logout</button>
|
||||
<div ref="dropdownRef" class="dropdown-wrapper">
|
||||
<button class="contact-button" @click.stop="toggleDropdown">
|
||||
Contact
|
||||
</button>
|
||||
<div
|
||||
class="contact-dropdown"
|
||||
:class="{ 'dropdown-visible': isDropdownOpen }"
|
||||
>
|
||||
<button @click="contactAll">Contacter tous</button>
|
||||
<button
|
||||
v-for="(email, index) in entrepreneurEmails"
|
||||
:key="index"
|
||||
@click="contactSingle(email)"
|
||||
>
|
||||
{{ email }}
|
||||
|
||||
<div v-if="props.isAdmin">
|
||||
<div ref="dropdownRef" class="dropdown-wrapper">
|
||||
<button class="contact-button" @click.stop="toggleDropdown">
|
||||
Contact
|
||||
</button>
|
||||
<div
|
||||
v-if="entrepreneurEmails.length > 0"
|
||||
class="contact-dropdown"
|
||||
:class="{ 'dropdown-visible': isDropdownOpen }"
|
||||
>
|
||||
<button @click="contactAll">Contacter tous</button>
|
||||
<button
|
||||
v-for="(email, index) in entrepreneurEmails"
|
||||
:key="index"
|
||||
@click="contactSingle(email)"
|
||||
>
|
||||
{{ email }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<RouterLink to="/" class="return-button">Retour</RouterLink>
|
||||
@@ -39,136 +43,106 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, onBeforeUnmount } from "vue";
|
||||
import axios from "axios";
|
||||
import { store } from "@/main.ts";
|
||||
import { getProjectEntrepreneurs } from "@/services/Apis/Shared.ts";
|
||||
import UserEntrepreneur from "@/ApiClasses/UserEntrepreneur.ts";
|
||||
|
||||
const IS_MOCK_MODE = true;
|
||||
const dropdownRef = ref<HTMLElement | null>(null); // ref pour le dropdown
|
||||
const dropdownRef = ref<HTMLElement | null>(null);
|
||||
|
||||
const props = defineProps<{
|
||||
projectId: number;
|
||||
isAdmin: boolean;
|
||||
}>();
|
||||
|
||||
type Entrepreneur = {
|
||||
idUser: number;
|
||||
userSurname: string;
|
||||
userName: string;
|
||||
primaryMail: string;
|
||||
secondaryMail: string;
|
||||
phoneNumber: string;
|
||||
school: string;
|
||||
course: string;
|
||||
sneeStatus: boolean;
|
||||
};
|
||||
|
||||
const isDropdownOpen = ref(false);
|
||||
const entrepreneurEmails = ref<string[]>([]);
|
||||
const entrepreneurs = ref<UserEntrepreneur[]>([]);
|
||||
const IS_MOCK_MODE = false;
|
||||
|
||||
const toggleDropdown = () => {
|
||||
isDropdownOpen.value = !isDropdownOpen.value;
|
||||
console.log("Dropdown toggled:", isDropdownOpen.value);
|
||||
};
|
||||
|
||||
const fetchEntrepreneurs = async (
|
||||
projectId: number,
|
||||
useMock = IS_MOCK_MODE
|
||||
) => {
|
||||
try {
|
||||
const responseData: Entrepreneur[] = useMock
|
||||
? await mockFetchEntrepreneurs(projectId)
|
||||
: (
|
||||
await axios.get(
|
||||
`http://localhost:5000/shared/projects/entrepreneurs/${projectId}`
|
||||
)
|
||||
).data;
|
||||
|
||||
if (responseData.length > 0) {
|
||||
entrepreneurEmails.value = responseData.map(
|
||||
(item: Entrepreneur) => item.primaryMail
|
||||
);
|
||||
} else {
|
||||
console.warn("Aucun entrepreneur trouvé.");
|
||||
const fetchMockEntrepreneurs = () => {
|
||||
const mockData = [
|
||||
{
|
||||
userName: "Doe",
|
||||
userSurname: "John",
|
||||
primaryMail: "john.doe@example.com"
|
||||
},
|
||||
{
|
||||
userName: "Smith",
|
||||
userSurname: "Anna",
|
||||
primaryMail: "anna.smith@example.com"
|
||||
},
|
||||
{
|
||||
userName: "Mock",
|
||||
userSurname: "User",
|
||||
primaryMail: null
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(
|
||||
"Erreur lors de la récupération des entrepreneurs :",
|
||||
error
|
||||
];
|
||||
|
||||
entrepreneurs.value = mockData.map((item) => new UserEntrepreneur(item));
|
||||
entrepreneurEmails.value = entrepreneurs.value
|
||||
.map((e) => e.primaryMail)
|
||||
.filter((mail): mail is string => !!mail);
|
||||
|
||||
console.log("Mock entrepreneurs chargés :", entrepreneurs.value);
|
||||
};
|
||||
|
||||
const fetchEntrepreneurs = (projectId: number, useMock = false) => {
|
||||
if (useMock) {
|
||||
fetchMockEntrepreneurs();
|
||||
} else {
|
||||
getProjectEntrepreneurs(
|
||||
projectId,
|
||||
(response) => {
|
||||
const rawData = response.data;
|
||||
entrepreneurs.value = rawData.map(
|
||||
(item: any) => new UserEntrepreneur(item)
|
||||
);
|
||||
entrepreneurEmails.value = entrepreneurs.value
|
||||
.map((e) => e.primaryMail)
|
||||
.filter((mail): mail is string => !!mail); // filtrer undefined
|
||||
},
|
||||
(error) => {
|
||||
console.error("Erreur lors de la récupération des entrepreneurs :", error);
|
||||
}
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
// Fonction de simulation de l'API
|
||||
const mockFetchEntrepreneurs = async (projectId: number) => {
|
||||
console.log(`Mock fetch pour projectId: ${projectId}`);
|
||||
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(() => {
|
||||
resolve([
|
||||
{
|
||||
idUser: 1,
|
||||
userSurname: "Doe",
|
||||
userName: "John",
|
||||
primaryMail: "john.doe@example.com",
|
||||
secondaryMail: "johndoe@backup.com",
|
||||
phoneNumber: "612345678",
|
||||
school: "ENSEIRB",
|
||||
course: "Info",
|
||||
sneeStatus: false,
|
||||
},
|
||||
{
|
||||
idUser: 2,
|
||||
userSurname: "Smith",
|
||||
userName: "Jane",
|
||||
primaryMail: "jane.smith@example.com",
|
||||
secondaryMail: "janesmith@backup.com",
|
||||
phoneNumber: "698765432",
|
||||
school: "ENSEIRB",
|
||||
course: "Info",
|
||||
sneeStatus: true,
|
||||
},
|
||||
]);
|
||||
}, 500);
|
||||
});
|
||||
};
|
||||
|
||||
const contactAll = () => {
|
||||
const allEmails = entrepreneurEmails.value.join(", ");
|
||||
navigator.clipboard
|
||||
.writeText(allEmails)
|
||||
navigator.clipboard.writeText(allEmails)
|
||||
.then(() => {
|
||||
alert("Tous les emails copiés dans le presse-papiers !");
|
||||
window.open("https://partage.bordeaux-inp.fr/", "_blank");
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("Erreur lors de la copie :", err);
|
||||
});
|
||||
.catch((err) => console.error("Erreur lors de la copie :", err));
|
||||
};
|
||||
|
||||
const contactSingle = (email: string) => {
|
||||
navigator.clipboard
|
||||
.writeText(email)
|
||||
navigator.clipboard.writeText(email)
|
||||
.then(() => {
|
||||
alert(`Adresse copiée : ${email}`);
|
||||
window.open("https://partage.bordeaux-inp.fr/", "_blank");
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("Erreur lors de la copie :", err);
|
||||
});
|
||||
.catch((err) => console.error("Erreur lors de la copie :", err));
|
||||
};
|
||||
|
||||
// Cacher le menu si on clique en dehors
|
||||
const handleClickOutside = (event: MouseEvent) => {
|
||||
if (
|
||||
isDropdownOpen.value &&
|
||||
dropdownRef.value &&
|
||||
!dropdownRef.value.contains(event.target as Node)
|
||||
) {
|
||||
if (isDropdownOpen.value && dropdownRef.value && !dropdownRef.value.contains(event.target as Node)) {
|
||||
isDropdownOpen.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
fetchEntrepreneurs(props.projectId, IS_MOCK_MODE);
|
||||
if (props.isAdmin) {
|
||||
fetchEntrepreneurs(props.projectId, IS_MOCK_MODE);
|
||||
}
|
||||
document.addEventListener("click", handleClickOutside);
|
||||
});
|
||||
|
||||
@@ -177,6 +151,7 @@ onBeforeUnmount(() => {
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<style scoped>
|
||||
@import "@/components/canvas/style-project.css";
|
||||
|
||||
|
Reference in New Issue
Block a user