From fb7152bf2173f8750ecb34699560fe37bfa9eaab Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 09:03:31 +0100 Subject: [PATCH 1/9] correction graphique --- src/components/Task/Task.module.css | 1 - src/components/Task/Task.tsx | 2 +- .../IncompleteEvent/IncompleteEvent.jsx | 2 +- .../IncompleteEvent.module.css | 5 +- .../pendingMembers/PendingMembers.jsx | 2 +- .../Home/components/Calendar/calendar.jsx | 3 +- src/pages/Profile/ProfilePage.tsx | 307 +++++++++--------- 7 files changed, 162 insertions(+), 160 deletions(-) diff --git a/src/components/Task/Task.module.css b/src/components/Task/Task.module.css index 052d0a3..b8489f6 100644 --- a/src/components/Task/Task.module.css +++ b/src/components/Task/Task.module.css @@ -2,7 +2,6 @@ width: 100%; padding: 12px; margin-bottom: 10px; - border-radius: 8px; } .content { diff --git a/src/components/Task/Task.tsx b/src/components/Task/Task.tsx index 7c939b2..daf805d 100644 --- a/src/components/Task/Task.tsx +++ b/src/components/Task/Task.tsx @@ -52,7 +52,7 @@ const Task: React.FC = ({ task }) => { }, [task.events_id]); return ( -
+

diff --git a/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.jsx b/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.jsx index 5548ea6..698f3b4 100644 --- a/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.jsx +++ b/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.jsx @@ -11,7 +11,7 @@ function IncompleteEvent() {

Derniers événements

{events.map((event) => ( -
+

{event.name}

{new Date(event.start).toLocaleDateString("fr-FR")} - {new Date(event.end).toLocaleDateString("fr-FR")} diff --git a/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.module.css b/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.module.css index 85849fc..e9c76d2 100644 --- a/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.module.css +++ b/src/pages/Admin/components/IncompleteEvent/IncompleteEvent.module.css @@ -29,17 +29,18 @@ transform: translateX(20px); animation: slideInEvent 1s ease forwards; flex-shrink: 0; + padding: 10px; } .eventCard ul { align-items: center; - margin-left: 8%; - padding-left: 15px; + margin-left: 5%; } .eventCard ul li { text-align: left; list-style-type: circle; + list-style: none; } .eventCard > h3 { diff --git a/src/pages/Admin/components/pendingMembers/PendingMembers.jsx b/src/pages/Admin/components/pendingMembers/PendingMembers.jsx index f8280f6..6db113a 100644 --- a/src/pages/Admin/components/pendingMembers/PendingMembers.jsx +++ b/src/pages/Admin/components/pendingMembers/PendingMembers.jsx @@ -58,7 +58,7 @@ function PendingMembers() { {pendingMembers.map((member, index) => ( -

+

{member.name} {member.lastname}

diff --git a/src/pages/Home/components/Calendar/calendar.jsx b/src/pages/Home/components/Calendar/calendar.jsx index 8129bf7..a03f6e6 100644 --- a/src/pages/Home/components/Calendar/calendar.jsx +++ b/src/pages/Home/components/Calendar/calendar.jsx @@ -5,7 +5,8 @@ import {EventContext} from "../../../../contexts/events/EventContext.js"; import Button from "../../../../components/ui/button/button.jsx"; import {AuthContext} from "../../../../contexts/auth/AuthContext.ts"; -function Calendar() { +function +Calendar() { const { user } = useContext(AuthContext); diff --git a/src/pages/Profile/ProfilePage.tsx b/src/pages/Profile/ProfilePage.tsx index eddae6a..722f4bd 100644 --- a/src/pages/Profile/ProfilePage.tsx +++ b/src/pages/Profile/ProfilePage.tsx @@ -17,20 +17,20 @@ import deleteProfilePhoto from "../../utils/users/deleteProfilePhoto.js"; interface TaskType { - id: number; - name: string; - description: string; - location: string; - start: string; - end: string; - max_participants: number; - events_id: number; - created_at: string; - updated_at: string; - pivot: { - user_id: number; - task_id: number; - }; + id: number; + name: string; + description: string; + location: string; + start: string; + end: string; + max_participants: number; + events_id: number; + created_at: string; + updated_at: string; + pivot: { + user_id: number; + task_id: number; + }; } @@ -53,161 +53,162 @@ interface AuthContextType { } function ProfilePage() { - const navigate = useNavigate(); - const { id } = useParams(); - const { user, update } = useContext(AuthContext) as AuthContextType; - const [profileUser, setProfileUser] = useState(null); - const [profilePicture, setProfilePicture] = useState(null); - const [error, setError] = useState(null); - const [success, setSuccess] = useState(null); - const fileInputRef = useRef(null); + const navigate = useNavigate(); + const {id} = useParams(); + const {user, update} = useContext(AuthContext) as AuthContextType; + const [profileUser, setProfileUser] = useState(null); + const [profilePicture, setProfilePicture] = useState(null); + const [error, setError] = useState(null); + const [success, setSuccess] = useState(null); + const fileInputRef = useRef(null); - const isOwnProfile = !id || user?.id.toString() === id; + const isOwnProfile = !id || user?.id.toString() === id; - useEffect(() => { - (async () => { - if (!isOwnProfile && id) { - const res = await getUserById(id); - if (res.status === 404) { - navigate("/404"); - return; + useEffect(() => { + (async () => { + if (!isOwnProfile && id) { + const res = await getUserById(id); + if (res.status === 404) { + navigate("/404"); + return; + } + if (res.status !== 200) { + console.error("Erreur lors du chargement du profil", res); + return; + } + setProfileUser(res.data); + } else { + update(); + setProfileUser(user); + if (user?.profile_photo_path) { + setProfilePicture(`${import.meta.env.VITE_API_URL}/storage/${user.profile_photo_path}`); + } + } + })(); + }, [user, id]); + + const handleEditPictureClick = () => { + if (fileInputRef.current) { + fileInputRef.current.click(); } - if (res.status !== 200) { - console.error("Erreur lors du chargement du profil", res); - return; + }; + + // Remplacé : handleFileChange extrait vers utils/users/uploadProfilePhoto + const handleFileChange = async (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (!file) return; + + try { + const res = await uploadProfilePhoto(file); + if (res.ok) { + setProfilePicture(`${import.meta.env.VITE_API_URL}/storage/${res.data.profile_photo_path}`); + setSuccess("Photo mise à jour !"); + setError(null); + await update(); + } else { + setError(res.data?.message || res.error || "Erreur lors de l'upload."); + setSuccess(null); + } + } catch (err) { + setError("Erreur réseau."); + setSuccess(null); } - setProfileUser(res.data); - } else { - update(); - setProfileUser(user); - if (user?.profile_photo_path) { - setProfilePicture(`${import.meta.env.VITE_API_URL}/storage/${user.profile_photo_path}`); + }; + + // Remplacé : handleDeletePicture extrait vers utils/users/deleteProfilePhoto + const handleDeletePicture = async () => { + try { + const res = await deleteProfilePhoto(); + if (res.status >= 200 && res.status < 300) { + setProfilePicture(null); + setSuccess("Photo supprimée !"); + setError(null); + await update(); + } else { + setError(res.data?.message || "Erreur lors de la suppression."); + setSuccess(null); + } + } catch (err) { + setError("Erreur réseau."); + setSuccess(null); } - } - })(); - }, [user, id]); + }; - const handleEditPictureClick = () => { - if (fileInputRef.current) { - fileInputRef.current.click(); - } - }; + return ( +
+
+
+
+ Photo de profil +
- // Remplacé : handleFileChange extrait vers utils/users/uploadProfilePhoto - const handleFileChange = async (e: React.ChangeEvent) => { - const file = e.target.files?.[0]; - if (!file) return; + {isOwnProfile && ( +
+ + {user?.profile_photo_path && ( + + )} +
+ )} - try { - const res = await uploadProfilePhoto(file); - if (res.ok) { - setProfilePicture(`${import.meta.env.VITE_API_URL}/storage/${res.data.profile_photo_path}`); - setSuccess("Photo mise à jour !"); - setError(null); - await update(); - } else { - setError(res.data?.message || res.error || "Erreur lors de l'upload."); - setSuccess(null); - } - } catch (err) { - setError("Erreur réseau."); - setSuccess(null); - } - }; + + {error &&

{error}

} + {success &&

{success}

} - // Remplacé : handleDeletePicture extrait vers utils/users/deleteProfilePhoto - const handleDeletePicture = async () => { - try { - const res = await deleteProfilePhoto(); - if (res.status >= 200 && res.status < 300) { - setProfilePicture(null); - setSuccess("Photo supprimée !"); - setError(null); - await update(); - } else { - setError(res.data?.message || "Erreur lors de la suppression."); - setSuccess(null); - } - } catch (err) { - setError("Erreur réseau."); - setSuccess(null); - } - }; +
+
+

+ {profileUser?.name} {profileUser?.lastname} +

+ {user?.isAdmin && profileUser && !isOwnProfile && ( + + )} +
- return ( -
-
-
-
- Photo de profil -
+
+
+

Role : {profileUser?.role}

+

Membre depuis : {profileUser && formatDate(profileUser.created_at)} +

+
- {isOwnProfile && ( -
- - {user?.profile_photo_path && ( - - )} -
- )} +
+

Mail : {profileUser?.email}

+

Téléphone : {profileUser?.phone ?? "Non renseigné"}

+
- - {error &&

{error}

} - {success &&

{success}

} + {isOwnProfile && ( +
+ +
+ )} +
-
-
-

- {profileUser?.name} {profileUser?.lastname} -

- {user?.isAdmin && profileUser && !isOwnProfile && ( - - )} -
- -
-
-

Role : {profileUser?.role}

-

Membre depuis : {profileUser && formatDate(profileUser.created_at)}

-
- -
-

Mail : {profileUser?.email}

-

Téléphone : {profileUser?.phone ?? "Non renseigné"}

-
- - {isOwnProfile && ( -
- +

Tâches :

+ {profileUser?.tasks.length ? ( + profileUser.tasks.map((task) =>) + ) : ( +

Aucune tâche.

+ )} +
- )}
- -

Tâches :

- {profileUser?.tasks.length ? ( - profileUser.tasks.map((task) => ) - ) : ( -

Aucune tâche.

- )} -
-
-
- ); + ); } export default ProfilePage; \ No newline at end of file From 1948ddab211c29cbc48b301dcce5bf73d9744ebd Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 09:55:44 +0100 Subject: [PATCH 2/9] ajout bouton export auto --- .../Home/components/Calendar/calendar.jsx | 19 +++++++++++-------- .../components/Calendar/calendar.module.css | 14 +++++++++++++- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/pages/Home/components/Calendar/calendar.jsx b/src/pages/Home/components/Calendar/calendar.jsx index a03f6e6..2416a1a 100644 --- a/src/pages/Home/components/Calendar/calendar.jsx +++ b/src/pages/Home/components/Calendar/calendar.jsx @@ -7,9 +7,9 @@ import {AuthContext} from "../../../../contexts/auth/AuthContext.ts"; function Calendar() { - const { user } = useContext(AuthContext); + const calendarUrl = `http://localhost/api/export/ics/${user.id}`; const monthNames = [ "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", @@ -130,15 +130,18 @@ Calendar() { )}
)} - + > + Exporter + +
); diff --git a/src/pages/Home/components/Calendar/calendar.module.css b/src/pages/Home/components/Calendar/calendar.module.css index 81f529e..b70ac34 100644 --- a/src/pages/Home/components/Calendar/calendar.module.css +++ b/src/pages/Home/components/Calendar/calendar.module.css @@ -150,10 +150,22 @@ display: none; } -.exportbtn{ +.exportbox{ + width: 100%; + padding: 15px; margin-top: 16px; + display: flex; + align-items: center; } +.exportbtn { + display: flex; + align-items: center; + max-height: 30px; +} + + + @media (max-width: 768px) { .glassCard { width: 100%; From bdd47b7a0e1fe7df7ed6b9918728d820c9b0b672 Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 10:08:10 +0100 Subject: [PATCH 3/9] =?UTF-8?q?correction=20calendrier=20ann=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Home/components/Calendar/calendar.jsx | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/pages/Home/components/Calendar/calendar.jsx b/src/pages/Home/components/Calendar/calendar.jsx index 2416a1a..b96a50a 100644 --- a/src/pages/Home/components/Calendar/calendar.jsx +++ b/src/pages/Home/components/Calendar/calendar.jsx @@ -19,7 +19,7 @@ Calendar() { const today = new Date(); const [currentMonth, setCurrentMonth] = useState(today.getMonth()); - const [currentYear] = useState(today.getFullYear()); + const [currentYear, setCurrentYear] = useState(today.getFullYear()); const [selectedDay, setSelectedDay] = useState(null); const eventsByDate = useMemo(() => { @@ -68,9 +68,31 @@ Calendar() {
- +

{monthNames[currentMonth]} {currentYear}

- +
From 29db4467a24d6c63d57c3bc965fbf8b2232f6ecb Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 11:06:16 +0100 Subject: [PATCH 4/9] correction graphique box EventList --- src/pages/Home/components/EventList/eventItem.jsx | 13 +++++++------ .../Home/components/EventList/eventList.module.css | 9 ++++++--- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/pages/Home/components/EventList/eventItem.jsx b/src/pages/Home/components/EventList/eventItem.jsx index a65f3ee..107dff3 100644 --- a/src/pages/Home/components/EventList/eventItem.jsx +++ b/src/pages/Home/components/EventList/eventItem.jsx @@ -1,12 +1,13 @@ import styles from "./eventList.module.css"; -import { formatDateLetter } from "../../../../utils/date/formatDateLetter.js"; -import { useState } from "react"; +import {formatDateLetter} from "../../../../utils/date/formatDateLetter.js"; +import {useState} from "react"; -export default function EventItem({ eventGroup }) { +export default function EventItem({eventGroup}) { const [isVisible, setIsVisible] = useState(false); - return
setIsVisible(!isVisible)}> + return
setIsVisible(!isVisible)}>

{eventGroup.name}

{formatDateLetter(eventGroup.start)}

@@ -15,8 +16,8 @@ export default function EventItem({ eventGroup }) {
    {eventGroup.tasks.map((task, i) => (
  • -

    - {task.name} - {task.description}

    -

    {formatDateLetter(task.start)} - {formatDateLetter(task.end)}

    +

    {task.name} - {task.description}

    +

    {formatDateLetter(task.start)} - {formatDateLetter(task.end)}

  • ))}
diff --git a/src/pages/Home/components/EventList/eventList.module.css b/src/pages/Home/components/EventList/eventList.module.css index fe49f9f..7a39bf7 100644 --- a/src/pages/Home/components/EventList/eventList.module.css +++ b/src/pages/Home/components/EventList/eventList.module.css @@ -68,9 +68,12 @@ h2{ } .eventTasks { - display: flex; - flex-direction: row; - justify-content: space-between; + list-style: none; + margin: 10px; +} + +.taskDate{ + font-size: 13px; } @media (max-width: 768px) { From 6fb97ddaf7f391ecb0ce1d555934236d334380b4 Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 11:34:51 +0100 Subject: [PATCH 5/9] ajout de raccourci login --- .../Login/components/loginform/loginForm.jsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/pages/Login/components/loginform/loginForm.jsx b/src/pages/Login/components/loginform/loginForm.jsx index b4b3338..4ed7821 100644 --- a/src/pages/Login/components/loginform/loginForm.jsx +++ b/src/pages/Login/components/loginform/loginForm.jsx @@ -1,4 +1,4 @@ -import { useState, useContext } from "react"; +import {useState, useContext, useEffect} from "react"; import styles from "./loginForm.module.css"; import Button from "../../../../components/ui/button/button.tsx"; import Input from "../../../../components/ui/input/input.tsx"; @@ -16,12 +16,25 @@ function LoginForm({ className }) { const [password, setPassword] = useState(''); const [open , setOpen] = useState(false); - async function handleSubmit() { + + const handleSubmit = async () => { const res = await login(email, password); if (res.status === 401 || res.status === 422) setOpen(true); else navigate("/"); + }; - } + useEffect(() => { + const listener = (e) => { + if (e.key === "Enter") { + handleSubmit(); + } + }; + window.addEventListener("keydown", listener); + + return () => { + window.removeEventListener("keydown", listener); + }; + },); return (
From 7f3100678e162d859d24e59da8b4e6f6cf202073 Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 11:38:23 +0100 Subject: [PATCH 6/9] suppression du raccourci --- .../Login/components/loginform/loginForm.jsx | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/pages/Login/components/loginform/loginForm.jsx b/src/pages/Login/components/loginform/loginForm.jsx index 4ed7821..667b081 100644 --- a/src/pages/Login/components/loginform/loginForm.jsx +++ b/src/pages/Login/components/loginform/loginForm.jsx @@ -1,4 +1,4 @@ -import {useState, useContext, useEffect} from "react"; +import { useState, useContext } from "react"; import styles from "./loginForm.module.css"; import Button from "../../../../components/ui/button/button.tsx"; import Input from "../../../../components/ui/input/input.tsx"; @@ -9,32 +9,17 @@ import { AuthContext } from "../../../../contexts/auth/AuthContext.js"; function LoginForm({ className }) { - const navigate = useNavigate(); const { login } = useContext(AuthContext); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const [open , setOpen] = useState(false); - - const handleSubmit = async () => { + async function handleSubmit() { const res = await login(email, password); if (res.status === 401 || res.status === 422) setOpen(true); else navigate("/"); - }; - - useEffect(() => { - const listener = (e) => { - if (e.key === "Enter") { - handleSubmit(); - } - }; - window.addEventListener("keydown", listener); - - return () => { - window.removeEventListener("keydown", listener); - }; - },); + } return (
From 714242a610571b543d188941270b9dc61bae38cd Mon Sep 17 00:00:00 2001 From: T'JAMPENS QUENTIN p2406187 Date: Thu, 12 Mar 2026 11:44:30 +0100 Subject: [PATCH 7/9] use .env api url --- src/pages/Home/components/Calendar/calendar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Home/components/Calendar/calendar.jsx b/src/pages/Home/components/Calendar/calendar.jsx index 8129bf7..abe2fd1 100644 --- a/src/pages/Home/components/Calendar/calendar.jsx +++ b/src/pages/Home/components/Calendar/calendar.jsx @@ -133,7 +133,7 @@ function Calendar() { variant={"primary"} onClick={() => { window.location.href = - `http://localhost/api/export/ics/${user.id}`; + `${import.meta.env.VITE_API_URL}/api/export/ics/${user.id}`; }} > Exporter mon agenda From d45927f72e58585066d395605f28ee5b58590b7c Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 11:47:52 +0100 Subject: [PATCH 8/9] correction url --- src/pages/Home/components/Calendar/calendar.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Home/components/Calendar/calendar.jsx b/src/pages/Home/components/Calendar/calendar.jsx index b96a50a..faccbac 100644 --- a/src/pages/Home/components/Calendar/calendar.jsx +++ b/src/pages/Home/components/Calendar/calendar.jsx @@ -9,7 +9,7 @@ function Calendar() { const { user } = useContext(AuthContext); - const calendarUrl = `http://localhost/api/export/ics/${user.id}`; + const calendarUrl = `${import.meta.env.VITE_API_URL}/api/export/ics/${user.id}`; const monthNames = [ "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", From 32e26ea9c96aa3a788a6cbba947103e184a7a58e Mon Sep 17 00:00:00 2001 From: ORDONNEAU Antoine Date: Thu, 12 Mar 2026 12:29:38 +0100 Subject: [PATCH 9/9] changement nom variable --- src/pages/Home/components/Calendar/calendar.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pages/Home/components/Calendar/calendar.jsx b/src/pages/Home/components/Calendar/calendar.jsx index faccbac..67c2c89 100644 --- a/src/pages/Home/components/Calendar/calendar.jsx +++ b/src/pages/Home/components/Calendar/calendar.jsx @@ -24,12 +24,12 @@ Calendar() { const eventsByDate = useMemo(() => { if (!user?.tasks) return {}; - return user.tasks.reduce((acc, task) => { - if (!task?.start) return acc; + return user.tasks.reduce((eventsByDate, task) => { + if (!task?.start) return eventsByDate; const dateKey = task.start.split(" ")[0]; - if (!acc[dateKey]) acc[dateKey] = []; - acc[dateKey].push(task); - return acc; + if (!eventsByDate[dateKey]) eventsByDate[dateKey] = []; + eventsByDate[dateKey].push(task); + return eventsByDate; }, {}); }, [user]);