ALAMI Adnane 4356a01e4a
All checks were successful
Format / formatting (push) Successful in 6s
Build / build (push) Successful in 44s
CI / build (push) Successful in 12s
Format / formatting (pull_request) Successful in 6s
feat: adding delete button with the corresponding endpoint
2025-05-01 19:23:21 +02:00

186 lines
5.4 KiB
Vue

<template>
<Header />
<error-wrapper></error-wrapper>
<div id="container">
<div id="main">
<h3>Projet en cours</h3>
<ProjectComp
v-for="(project, index) in projects"
:key="index"
:project-name="project.name"
:list-name="project.members"
:project-link="project.link"
:project-id="0"
/>
<!-- <AllEntrep /> -->
<div id="main">
<h3>Projet en attente</h3>
<PendingProjectComponent
v-for="(project, index) in pendingProjects"
:key="index"
:project-name="project.name"
:creation-date="project.creationDate"
/>
</div>
<AddProjectForm />
</div>
<Agenda :project-r-d-v="rendezVous" />
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from "vue";
import Header from "../components/HeaderComponent.vue";
//import Agenda from "../components/AdminAppointments.vue";
import Agenda from "../components/AgendaComponent.vue";
import ProjectComp from "../components/ProjectComponent.vue";
import PendingProjectComponent from "@/components/PendingProjectComponent.vue";
import AddProjectForm from "@/components/AddProjectForm.vue";
import { getAdminProjects } from "@/services/Apis/Admin";
import { getProjectEntrepreneurs } from "@/services/Apis/Shared";
import { type AxiosError, type AxiosResponse } from "axios";
import Project from "@/ApiClasses/Project";
import UserEntrepreneur from "@/ApiClasses/UserEntrepreneur";
//import AllEntrep from "../components/AllEntrep.vue";
const projects = ref<
{
name: string;
link: string;
members: string[];
}[]
>([]);
const fallbackProjects = [
{
name: "Projet Alpha",
link: "/canvas",
members: ["Alice", "Bob", "Charlie"],
},
{
name: "Projet Beta",
link: "./canvas",
members: ["David", "Eve", "Frank"],
},
];
const fetchProjects = () => {
getAdminProjects(
(response: AxiosResponse) => {
const projectList = response.data.map(
(p: Project) => new Project(p)
);
const projectPromises = projectList.map(
(project: { idProject: number; projectName: string }) =>
new Promise<void>((resolve) => {
getProjectEntrepreneurs(
project.idProject!,
(memberResponse: AxiosResponse) => {
const members = memberResponse.data.map(
(m: UserEntrepreneur) =>
new UserEntrepreneur(m).userName ||
"Unknown"
);
projects.value.push({
name:
project.projectName ||
"Unnamed Project",
link: `/project/${project.idProject}`,
members,
});
resolve();
},
() => {
projects.value.push({
name:
project.projectName ||
"Unnamed Project",
link: `/project/${project.idProject}`,
members: [],
});
resolve();
}
);
})
);
Promise.all(projectPromises).catch(() => {
// fallback in case member fetches fail
projects.value = fallbackProjects;
});
},
(error: AxiosError) => {
console.error("Error fetching admin projects:", error);
projects.value = fallbackProjects;
}
);
};
onMounted(fetchProjects);
const pendingProjects = ref([
{ name: "l'eau", creationDate: "26-02-2024" },
{ name: "l'air", creationDate: "09-03-2023" },
]);
const rendezVous = ref([
{ projectName: "Projet Alpha", date: "2025-03-10", lieu: "P106" },
{ projectName: "Projet Beta", date: "2025-04-15", lieu: "Td10" },
]);
</script>
<style scoped>
#container {
display: grid;
grid-template-columns: 3fr 1fr;
gap: 2rem;
padding: 2rem;
background-color: #f4f6f9;
min-height: 100vh;
box-sizing: border-box;
}
#main {
background-color: #fff;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
}
h3 {
font-size: 1.5rem;
color: #333;
margin-bottom: 1.2rem;
border-bottom: 2px solid #ddd;
padding-bottom: 0.5rem;
}
button {
padding: 10px 15px;
background-color: #007bff;
color: white;
border: none;
cursor: pointer;
border-radius: 6px;
font-weight: 500;
transition: background-color 0.2s ease;
}
button:hover {
background-color: #0056b3;
}
/* Add spacing between project sections */
#main > * + * {
margin-top: 2rem;
}
</style>