From 7a0bbb410f129f6b76ec4841f2fb70936339cdd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ama=C3=ABl=20Kesteman?= Date: Wed, 7 Jan 2026 12:00:07 +0100 Subject: [PATCH] =?UTF-8?q?Feat:=20ajout=20de=20la=20liste=20pour=20voir?= =?UTF-8?q?=20les=20activit=C3=A9s=20et=20les=20athl=C3=A8tes=20en=20tant?= =?UTF-8?q?=20que=20coach/=20admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front_end/src/App.tsx | 2 + front_end/src/classes.tsx | 82 ++++++++++++++++++++- front_end/src/components/dropdownButton.tsx | 27 +++++++ front_end/src/components/ressourceList.tsx | 47 ++++++++++++ front_end/src/components/ressourcePanel.tsx | 52 +++++++++++++ 5 files changed, 206 insertions(+), 4 deletions(-) create mode 100644 front_end/src/components/dropdownButton.tsx create mode 100644 front_end/src/components/ressourceList.tsx create mode 100644 front_end/src/components/ressourcePanel.tsx diff --git a/front_end/src/App.tsx b/front_end/src/App.tsx index d78fb61..95dbf7d 100644 --- a/front_end/src/App.tsx +++ b/front_end/src/App.tsx @@ -7,6 +7,7 @@ import { LocalDataProvider } from './provider/LocalDataProvider'; import EDT from './components/edt'; import SwitchThemeColor from './components/SwitchThemeColor'; import CreateSession from './components/createSession' +import RessourcePanel from './components/ressourcePanel'; const keycloakInitOptions = { @@ -22,6 +23,7 @@ function App() {

Frisbyee

+ diff --git a/front_end/src/classes.tsx b/front_end/src/classes.tsx index b66407a..1cd5e75 100644 --- a/front_end/src/classes.tsx +++ b/front_end/src/classes.tsx @@ -11,6 +11,7 @@ export class Admin extends User{ } export class Athlete extends User{ + nom!: String; groupe!: Groupe; } @@ -60,10 +61,83 @@ export function getUserTest():User{ s3.id = 3; s3.name = "entraintement3" - const a1:Activite = new Activite(); - const a2:Activite = new Activite(); - s1.activites.push(a1); - s1.activites.push(a2); + const athlete1 = new Athlete(); + athlete1.id = 1; + athlete1.nom = "Alice Dupont"; + athlete1.groupe = "Entrainement"; + + const athlete2 = new Athlete(); + athlete2.id = 2; + athlete2.nom = "Bob Martin"; + athlete2.groupe = "Competition"; + + const athlete3 = new Athlete(); + athlete3.id = 3; + athlete3.nom = "Clara Lopez"; + athlete3.groupe = "Loisir"; + + s1.athletes = [athlete1, athlete2]; + s2.athletes = [athlete2, athlete3]; + s3.athletes = [athlete1, athlete3]; + + + const act1 = new Activite(); + act1.id = 1; + act1.nom = "Échauffement"; + act1.theme = "Cardio"; + act1.duree = 15; + act1.session = s1; + act1.data = new Map([["objectif", "Préparer le corps"], ["matériel", "Ballon"]]); + + const act2 = new Activite(); + act2.id = 2; + act2.nom = "Dribbles et passes"; + act2.theme = "Technique"; + act2.duree = 30; + act2.session = s1; + act2.data = new Map([["objectif", "Améliorer les passes"], ["niveau", "Intermédiaire"]]); + + const act3 = new Activite(); + act3.id = 3; + act3.nom = "Renforcement musculaire"; + act3.theme = "Force"; + act3.duree = 25; + act3.session = s2; + act3.data = new Map([["objectif", "Renforcer les jambes"], ["matériel", "Haltères"]]); + + const act4 = new Activite(); + act4.id = 4; + act4.nom = "Sprint et agilité"; + act4.theme = "Vitesse"; + act4.duree = 20; + act4.session = s2; + act4.data = new Map([["objectif", "Améliorer les sprints"], ["matériel", "Plots"]]); + + const act5 = new Activite(); + act5.id = 5; + act5.nom = "Match 5v5"; + act5.theme = "Jeu"; + act5.duree = 60; + act5.session = s3; + act5.data = new Map([["objectif", "Appliquer les techniques"], ["niveau", "Avancé"]]); + + const act6 = new Activite(); + act6.id = 6; + act6.nom = "Étirements"; + act6.theme = "Récupération"; + act6.duree = 10; + act6.session = s3; + act6.data = new Map([["objectif", "Éviter les blessures"], ["matériel", "Tapis"]]); + + + // attach the concrete activities to their sessions + s1.activites.push(act1); + s1.activites.push(act2); + s2.activites.push(act3); + s2.activites.push(act4); + s3.activites.push(act5); + s3.activites.push(act6); + user.sessions.push(s1); user.sessions.push(s2); user.sessions.push(s3); diff --git a/front_end/src/components/dropdownButton.tsx b/front_end/src/components/dropdownButton.tsx new file mode 100644 index 0000000..2468337 --- /dev/null +++ b/front_end/src/components/dropdownButton.tsx @@ -0,0 +1,27 @@ +import Dropdown from 'react-bootstrap/Dropdown'; +import { Athlete } from '../classes'; + + type Props = { + onAthletesClick: () => void; + onActivitiesClick: () => void; + } + +function ListButton({ onAthletesClick, onActivitiesClick }: Props) { + return ( + + + Sélectionner la ressource + + + + Athlètes + + + Activités + + + + ); +} + +export default ListButton; \ No newline at end of file diff --git a/front_end/src/components/ressourceList.tsx b/front_end/src/components/ressourceList.tsx new file mode 100644 index 0000000..b398a54 --- /dev/null +++ b/front_end/src/components/ressourceList.tsx @@ -0,0 +1,47 @@ +import ListGroup from "react-bootstrap/ListGroup"; +import { Athlete, Activite } from "../classes"; + +type Props = { + athletes: Athlete[]; + activites: Activite[]; + +}; + +function AthleteList({ athletes }: Props) { + return ( + + {athletes.map((athlete) => ( + +
+ Nom: {athlete.nom} +
+
+ Groupe: {athlete.groupe} +
+
+ ))} +
+ ); +} + +function ActiviteList({ activites }: Props) { + return ( + + {activites.map((activite) => ( + +
+ Nom: {activite.nom} +
+
+ Thème: {activite.theme} +
+
+ Durée: {activite.duree} minutes +
+
+ ))} +
+ ); +} + +export { AthleteList, ActiviteList }; \ No newline at end of file diff --git a/front_end/src/components/ressourcePanel.tsx b/front_end/src/components/ressourcePanel.tsx new file mode 100644 index 0000000..0620ede --- /dev/null +++ b/front_end/src/components/ressourcePanel.tsx @@ -0,0 +1,52 @@ +import { useState } from "react"; +import { useLocalData } from "../context/useLocalData"; +import ListButton from "./dropdownButton"; +import { AthleteList, ActiviteList } from "./ressourceList"; +import { Activite, Athlete } from "../classes"; + +export default function RessourcePanel() { + const { user } = useLocalData(); + const [showAthletes, setShowAthletes] = useState(false); + const [showActivites, setShowActivites] = useState(false); + + + const athleteMap: Map = new Map(); + user.sessions.forEach(session => { + session.athletes?.forEach(a => athleteMap.set(a.id, a)); + }); + const allAthletes: Athlete[] = Array.from(athleteMap.values()); + + const activiteMap: Map = new Map(); + user.sessions.forEach(session => { + session.activites?.forEach(act => activiteMap.set(act.id, act)); + }); + const allActivites: Activite[] = Array.from(activiteMap.values()); + + return ( +
+ { + setShowAthletes(prev => !prev); + setShowActivites(false); + }} + onActivitiesClick={() => { + setShowActivites(prev => !prev); + setShowAthletes(false); + }} + /> + {showAthletes && ( +
+

Liste des athlètes

+ +
+ )} + {showActivites && ( +
+

Liste des activités

+ +
+ )} + +
+ ); +}