From 153035cefa3f3c4f7b22f881d50ff9a281b4a002 Mon Sep 17 00:00:00 2001 From: trochas Date: Wed, 7 Jan 2026 18:00:39 +0100 Subject: [PATCH] =?UTF-8?q?ajout=20d'activit=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front_end/src/classes.tsx | 1 + front_end/src/components/createActivite.tsx | 75 +++++++++++++++++++++ front_end/src/components/edt.tsx | 5 +- front_end/src/components/edt_session.tsx | 43 +++++++++--- front_end/src/components/login.tsx | 13 +++- front_end/src/components/style/edt.css | 7 ++ front_end/src/components/test_api.tsx | 12 +++- front_end/src/index.css | 7 ++ front_end/src/requetes.tsx | 29 ++++++-- 9 files changed, 171 insertions(+), 21 deletions(-) create mode 100644 front_end/src/components/createActivite.tsx diff --git a/front_end/src/classes.tsx b/front_end/src/classes.tsx index 4021ee2..017757e 100644 --- a/front_end/src/classes.tsx +++ b/front_end/src/classes.tsx @@ -4,6 +4,7 @@ export class User{ id!: number; nom!: String; sessions: Session[] = []; //nb: Admin liaison non symétrique /!\ + email!: String; } export class Admin extends User{ diff --git a/front_end/src/components/createActivite.tsx b/front_end/src/components/createActivite.tsx new file mode 100644 index 0000000..9a7b886 --- /dev/null +++ b/front_end/src/components/createActivite.tsx @@ -0,0 +1,75 @@ +import { useState, useEffect } from "react"; +import { Session, User, Coach, Activite, Groupe } from "../classes"; +import { Modal } from "./Modal"; + +type CreateActiciteProps = { + returnActivite: (activite:Activite|null) => void +} + + +export function CreateActivite({ returnActivite }: CreateActiciteProps){ + + const [activities, setActivities] = useState([]); + const [activiteNom, setActiviteNom] = useState(""); + const [activiteTheme, setActiviteTheme] = useState(""); + const [activiteDuree, setActiviteDuree] = useState(0); + + function addAcitivte(){ + if (!activiteNom) return; + + const newActivite = new Activite(); + newActivite.nom= activiteNom; + newActivite.theme=activiteTheme; + newActivite.duree= activiteDuree; + newActivite.data= new Map(); + setActivities([...activities, newActivite]); + + setActiviteNom(""); + setActiviteTheme(""); + setActiviteDuree(0); + + returnActivite(newActivite); + } + + function cancel(){ + returnActivite(null); + } + + + + return ( + cancel()}> +
+

Nouvelle Activité :

+
+ Nom de l'activité: +
+
+ setActiviteNom(e.target.value)} /> +
+
+ Theme: +
+
+ setActiviteTheme(e.target.value)} /> +
+
+ Duree (minutes): +
+
+ setActiviteDuree(Number(e.target.value))} /> +
+ + + +
    + {activities.map((act, idx) => ( +
  • {act.nom} - {act.theme} ({act.duree} min)
  • + ))} +
+
+
+ ); +}; + +export default CreateActivite; \ No newline at end of file diff --git a/front_end/src/components/edt.tsx b/front_end/src/components/edt.tsx index e429ae9..df491dd 100644 --- a/front_end/src/components/edt.tsx +++ b/front_end/src/components/edt.tsx @@ -42,10 +42,7 @@ export const EDT =() =>{ var newWeek: Session[] = [] user.sessions.forEach(session => { - if( session.isRecurrent ){ - newWeek.push(session); - } - if(session.creneau >= date && session.creneau <= maxDate && !session.isRecurrent){ + if((session.creneau >= date && session.creneau <= maxDate && !session.isRecurrent) || session.isRecurrent){ newWeek.push(session); } }); diff --git a/front_end/src/components/edt_session.tsx b/front_end/src/components/edt_session.tsx index 48e34db..929b01c 100644 --- a/front_end/src/components/edt_session.tsx +++ b/front_end/src/components/edt_session.tsx @@ -5,6 +5,7 @@ import './style/edt.css'; import { Modal } from './Modal'; import Loading from './loading'; import {delay} from "../requetes"; +import CreateActivite from './createActivite'; type Props = { @@ -13,21 +14,22 @@ type Props = { function EdtSession({session}:Props){ - const [open, setOpen] = useState(false) + const [open, setOpen] = useState(false); + const [open2, setOpen2] = useState(false); const [loading,setLoading] = useState(false); + const [activites,setActivites] = useState([]); function handleOpen(): void { setOpen(!open); } - function handleDeleteActivite(): void { - session.activites.pop(); //TODO + function handleDeleteActivite(activite:Activite): void { + session.activites.splice(session.activites.indexOf(activite), 1); + setActivites([...session.activites]) } function handleAddActivite(): void { - const newActivite = new Activite(); - //TODO - session.activites.push(newActivite); + setOpen2(true) } async function updateActivites(){ @@ -45,13 +47,30 @@ function EdtSession({session}:Props){ } },[open]) + useEffect(() => { + if(!loading){ + setActivites([...session.activites]) + } + },[loading]) + const sDate = session.creneau; + + + + function returnActivite(activite: Activite|null){ + if(activite!==null){ + session.activites.push(activite); + setActivites([...session.activites]) + } + setOpen2(false); + } + return(
handleOpen()}>
{hoursToString(sDate)}
- {!session.isRecurrent &&
recurrent
} + {session.isRecurrent &&
recurrent
}
{session.name}
@@ -64,16 +83,20 @@ function EdtSession({session}:Props){
Activités :
- {session.activites.map((activite,index)=>( + {activites.map((activite,index)=>(
{activite.nom} - +
))} - + {loading &&
}
+ + {open2 && + returnActivite(activite)}/> + }
} diff --git a/front_end/src/components/login.tsx b/front_end/src/components/login.tsx index 3a8d05a..97b4465 100644 --- a/front_end/src/components/login.tsx +++ b/front_end/src/components/login.tsx @@ -29,8 +29,19 @@ export const Login =() =>{ return(
- Authenticated : {keycloak.authenticated ? 'oui' : 'non'} + Etat : {keycloak.authenticated ? 'connecté' : 'non connecté'}
+ {keycloak.authenticated && +
+
+ Keycloak ID : { keycloak.tokenParsed?.sub} +
+
+ User nom : { user.nom} +
+ +
+ } diff --git a/front_end/src/components/style/edt.css b/front_end/src/components/style/edt.css index 0f6b70d..ece465b 100644 --- a/front_end/src/components/style/edt.css +++ b/front_end/src/components/style/edt.css @@ -118,4 +118,11 @@ .addButton{ background-color: var(--tint5); border-radius: 10px; +} + +.edt_activite_modal{ + background-color: var(--tint3); + padding: 10px; + border-radius: 20px; + position: relative; } \ No newline at end of file diff --git a/front_end/src/components/test_api.tsx b/front_end/src/components/test_api.tsx index 2fd52e7..bf40bb6 100644 --- a/front_end/src/components/test_api.tsx +++ b/front_end/src/components/test_api.tsx @@ -1,5 +1,6 @@ import { useKeycloak } from "@react-keycloak/web" -import { getCoachsAPI, getUsersAPI } from "../requetes" +import { getCoachsAPI, getUsersAPI, postAdmin } from "../requetes" +import { Admin } from "../classes"; function TestAPI(){ @@ -9,9 +10,18 @@ function TestAPI(){ getCoachsAPI(); } + function handleSendAdmin(): void { + const admin = new Admin; + admin.nom = "admin"; + admin.email = "admin@gmail.com"; + + postAdmin(admin); + } + return(
+
) } diff --git a/front_end/src/index.css b/front_end/src/index.css index bbb1bfe..414bda6 100644 --- a/front_end/src/index.css +++ b/front_end/src/index.css @@ -64,4 +64,11 @@ code { to { transform: rotate(360deg); } +} + +input{ + background-color: var(--tint2); + color: var(--test); + border-color: var(--tint5); + border-radius: 8px; } \ No newline at end of file diff --git a/front_end/src/requetes.tsx b/front_end/src/requetes.tsx index 06019d1..fb1bc0e 100644 --- a/front_end/src/requetes.tsx +++ b/front_end/src/requetes.tsx @@ -1,5 +1,5 @@ import api from "./api"; -import { Activite, Athlete, Coach, Session, User } from "./classes"; +import { Activite, Admin, Athlete, Coach, Session, User } from "./classes"; //debug: export function delay(ms: number): Promise { @@ -53,7 +53,7 @@ export async function updateActivitiesOfSessionAPI(session:Session){ export async function subscribeSessionAPI(user:User, session:Session):Promise{ try { - await api.post(`/sessions/${session.id}/subscribe`, { userId: user.id }); + await api.post(`/sessions/${session.id}/subscribe`); return true; } catch (error) { console.error("Error subscribing to session:", error); @@ -63,7 +63,7 @@ export async function subscribeSessionAPI(user:User, session:Session):Promise{ try { - await api.post(`/session/${session.id}/unsubscribe`, { userId: user.id }); + await api.post(`/session/${session.id}/unsubscribe`); return true; } catch (error) { console.error("Error unsubscribing from session:", error); @@ -104,8 +104,26 @@ export async function postActivityAPI(session: Session, activity: Activite){ } } -export async function postUser(user: User):Promise{ - return true; +export async function postAthlete(athlete: Athlete):Promise{ + try { + const response = await api.post("/athlete/create/",athlete); + console.log(response); + return response.data; + } catch (error) { + console.error("Error fetching coachs:", error); + throw error; + } +} + +export async function postAdmin(athlete: Admin):Promise{ + try { + const response = await api.post("/admin/create/",athlete); + console.log(response); + return response.data; + } catch (error) { + console.error("Error fetching coachs:", error); + throw error; + } } // SET ///////////////////////////////////////////////////////// @@ -142,6 +160,7 @@ export async function getUsersAPI(): Promise { export async function getCoachsAPI(): Promise { try { const response = await api.get("/coach/all"); + console.log(response); return response.data; } catch (error) { console.error("Error fetching coachs:", error);