From c8c98cadeb5bbbb6f608a6503f483bf2ff3c456e Mon Sep 17 00:00:00 2001 From: trochas Date: Sun, 11 Jan 2026 19:29:59 +0100 Subject: [PATCH] pages + correction coach dans detail Session --- .../FrisbYEE/rest/AthleteResource.java | 12 +- .../FrisbYEE/rest/CoachResource.java | 40 ++++- .../FrisbYEE/rest/SessionResource.java | 24 +++ front_end/package-lock.json | 139 ++++++++++++++---- front_end/package.json | 5 +- front_end/src/App.tsx | 18 ++- front_end/src/api.ts | 3 +- .../src/components/object/detailSession.tsx | 9 +- front_end/src/components/pages/pageAdmin.tsx | 12 ++ .../src/components/pages/pageGestion.tsx | 13 ++ front_end/src/components/pages/pageHome.tsx | 13 ++ .../components/pages/pageSectionSession.tsx | 13 ++ front_end/src/components/style/topBar.css | 10 ++ front_end/src/components/test_api.tsx | 29 ---- front_end/src/components/topBar.tsx | 12 +- front_end/src/index.tsx | 6 +- front_end/src/requetes.tsx | 11 ++ package-lock.json | 6 - package.json | 5 + 19 files changed, 292 insertions(+), 88 deletions(-) create mode 100644 front_end/src/components/pages/pageAdmin.tsx create mode 100644 front_end/src/components/pages/pageGestion.tsx create mode 100644 front_end/src/components/pages/pageHome.tsx create mode 100644 front_end/src/components/pages/pageSectionSession.tsx delete mode 100644 front_end/src/components/test_api.tsx delete mode 100644 package-lock.json create mode 100644 package.json diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java index 8bca5ff..db6f503 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/AthleteResource.java @@ -162,15 +162,15 @@ public class AthleteResource { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Récupération effectuée", content = @Content(mediaType = "application/json", schema = @Schema(implementation = SessionDTO.class))) }) - @GetMapping("/athlete/{athleteId}/session") + @GetMapping("/{athleteId}/session") public List getSessionsAthlete(@PathVariable Integer athleteId) { // return pet System.out.println("ID A CHERCHER" + athleteId); - java.util.Optional j = athleteDAO.findById(athleteId); + java.util.Optional athlete = athleteDAO.findById(athleteId); List sessions = sessionDAO.findAll(); List athleteSessions = new ArrayList<>(); for (Session s : sessions) { - if (s.getAthletes().contains(j.get())) { + if (s.getAthletes().contains(athlete.get())) { SessionDTO dto = new SessionDTO(); dto.setId(s.getId()); @@ -186,8 +186,8 @@ public class AthleteResource { dto.setGroupe(s.getGroupe()); dto.setIsRecurrent(s.getIsRecurrent()); List athleteIds = new ArrayList<>(); - for (Athlete athlete : s.getAthletes()) { - athleteIds.add(athlete.getId()); + for (Athlete athlete2 : s.getAthletes()) { + athleteIds.add(athlete2.getId()); } dto.setAthleteIds(athleteIds); @@ -195,7 +195,7 @@ public class AthleteResource { athleteSessions.add(dto); } } - System.out.println(j); + System.out.println(athlete); return athleteSessions; } diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java index 2537e0d..69146bd 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/CoachResource.java @@ -1,9 +1,14 @@ package hackathon.FrisbYEE.rest; import hackathon.FrisbYEE.jpa.dto.CoachDTO; +import hackathon.FrisbYEE.jpa.dto.SessionDTO; +import hackathon.FrisbYEE.jpa.metier.Activite; import hackathon.FrisbYEE.jpa.metier.Admin; +import hackathon.FrisbYEE.jpa.metier.Athlete; import hackathon.FrisbYEE.jpa.metier.Coach; +import hackathon.FrisbYEE.jpa.metier.Session; import hackathon.FrisbYEE.jpa.service.CoachDAO; +import hackathon.FrisbYEE.jpa.service.SessionDAO; import hackathon.FrisbYEE.jpa.service.UserDAO; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +30,8 @@ public class CoachResource { private CoachDAO coachDAO; @Autowired private UserDAO userDAO; + @Autowired + private SessionDAO sessionDAO; @PostMapping("/create") @PreAuthorize("hasRole('admin') or hasRole('coach')") // Only admin can create @@ -88,11 +95,38 @@ public class CoachResource { @GetMapping("/{id}/session") @PreAuthorize("hasRole('Admin') or hasRole('Coach')") - public ResponseEntity> getSessionsForCoach(@PathVariable Integer id) { + public ResponseEntity> getSessionsForCoach(@PathVariable Integer id) { Coach coach = coachDAO.findById(id) .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Coach not found")); - List sessions = coach.getSessions(); - return ResponseEntity.ok(sessions); + List sessions = sessionDAO.findAll(); + List coachSessions = new ArrayList<>(); + for (Session s : sessions) { + if (s.getCoach().equals(coach)) { + SessionDTO dto = new SessionDTO(); + + dto.setId(s.getId()); + dto.setName(s.getName()); + dto.setCreneau(s.getCreneau()); + List activiteIDs = new ArrayList<>(); + for (Activite activite : s.getActivites()) { + activiteIDs.add(activite.getId()); + } + dto.setActiviteIds(activiteIDs); + dto.setCoachId(s.getCoach().getId()); + dto.setDuree(s.getDuree()); + dto.setGroupe(s.getGroupe()); + dto.setIsRecurrent(s.getIsRecurrent()); + List athleteIds = new ArrayList<>(); + for (Athlete athlete : s.getAthletes()) { + athleteIds.add(athlete.getId()); + } + dto.setAthleteIds(athleteIds); + + // Map other fields as necessary + coachSessions.add(dto); + } + } + return ResponseEntity.ok(coachSessions); } @DeleteMapping("/delete/{id}") diff --git a/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java index 5c095be..cd1e78c 100644 --- a/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java +++ b/back_end/src/main/java/hackathon/FrisbYEE/rest/SessionResource.java @@ -1,6 +1,7 @@ package hackathon.FrisbYEE.rest; import hackathon.FrisbYEE.jpa.dto.ActiviteDTO; +import hackathon.FrisbYEE.jpa.dto.CoachDTO; import hackathon.FrisbYEE.jpa.dto.SessionDTO; import hackathon.FrisbYEE.jpa.metier.Activite; import hackathon.FrisbYEE.jpa.metier.Athlete; @@ -170,6 +171,29 @@ public class SessionResource { return ResponseEntity.noContent().build(); } + @GetMapping("/{id}/coach") + @PreAuthorize("hasRole('coach') or hasRole('athlete')") + public ResponseEntity getCoachBySessionId(@PathVariable Integer id) { + try { + Session session = sessionDAO.findById(id).orElseThrow(); + Coach coach = session.getCoach(); + + CoachDTO dto = new CoachDTO(); + dto.setId(coach.getId()); + dto.setName(coach.getName()); + dto.setPrenom(coach.getPrenom()); + List listSession = new ArrayList(); + for (Session s : coach.getSessions()) { + listSession.add(session.getId()); + } + dto.setSessionIds(listSession); + + return ResponseEntity.ok(dto); + } catch (Exception ex) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new CoachDTO()); + } + } + @GetMapping("/{id}/activities") @PreAuthorize("hasRole('coach') or hasRole('athlete')") diff --git a/front_end/package-lock.json b/front_end/package-lock.json index 9cd9e01..bd0d3df 100644 --- a/front_end/package-lock.json +++ b/front_end/package-lock.json @@ -20,9 +20,10 @@ "axios": "^1.13.2", "bootstrap": "^5.3.8", "keycloak-js": "^26.2.2", - "react": "^19.2.3", + "react": "18.2.0", "react-bootstrap": "^2.10.10", - "react-dom": "^19.2.3", + "react-dom": "18.2.0", + "react-router-dom": "^7.12.0", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" @@ -74,6 +75,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -723,6 +725,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1606,6 +1609,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", @@ -2987,6 +2991,7 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -3465,6 +3470,7 @@ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -3850,6 +3856,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3859,6 +3866,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3988,6 +3996,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -4041,6 +4050,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4410,6 +4420,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4508,6 +4519,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5447,6 +5459,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -7302,6 +7315,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -10066,6 +10080,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -10963,6 +10978,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -11166,6 +11182,7 @@ "resolved": "https://registry.npmjs.org/keycloak-js/-/keycloak-js-26.2.2.tgz", "integrity": "sha512-ug7pNZ1xNkd7PPkerOJCEU2VnUhS7CYStDOCFJgqCNQ64h53ppxaKrh4iXH0xM8hFu5b1W6e6lsyYWqBMvaQFg==", "license": "Apache-2.0", + "peer": true, "workspaces": [ "test" ] @@ -12325,6 +12342,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -13459,6 +13477,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -13833,10 +13852,14 @@ } }, "node_modules/react": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", - "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } @@ -13995,15 +14018,17 @@ } }, "node_modules/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "license": "MIT", + "peer": true, "dependencies": { - "scheduler": "^0.27.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "^19.2.3" + "react": "^18.2.0" } }, "node_modules/react-error-overlay": { @@ -14035,10 +14060,62 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", + "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.12.0.tgz", + "integrity": "sha512-pfO9fiBcpEfX4Tx+iTYKDtPbrSLLCbwJ5EqP+SPYQu1VYCXdy79GSj0wttR0U4cikVdlImZuEZ/9ZNCgoaxwBA==", + "license": "MIT", + "dependencies": { + "react-router": "7.12.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/react-scripts": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", @@ -14497,6 +14574,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -14710,10 +14788,13 @@ } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/schema-utils": { "version": "4.3.3", @@ -14739,6 +14820,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -14940,6 +15022,12 @@ "node": ">= 0.8.0" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -15985,23 +16073,6 @@ } } }, - "node_modules/tailwindcss/node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, "node_modules/tapable": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", @@ -16219,6 +16290,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -16387,6 +16459,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=10" }, @@ -16495,6 +16568,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16833,6 +16907,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.104.1.tgz", "integrity": "sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -16904,6 +16979,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -17317,6 +17393,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/front_end/package.json b/front_end/package.json index 1b2e66e..7ac6bbf 100644 --- a/front_end/package.json +++ b/front_end/package.json @@ -15,9 +15,10 @@ "axios": "^1.13.2", "bootstrap": "^5.3.8", "keycloak-js": "^26.2.2", - "react": "^19.2.3", + "react": "18.2.0", "react-bootstrap": "^2.10.10", - "react-dom": "^19.2.3", + "react-dom": "18.2.0", + "react-router-dom": "^7.12.0", "react-scripts": "5.0.1", "typescript": "^4.9.5", "web-vitals": "^2.1.4" diff --git a/front_end/src/App.tsx b/front_end/src/App.tsx index 5753987..7a81946 100644 --- a/front_end/src/App.tsx +++ b/front_end/src/App.tsx @@ -10,8 +10,13 @@ import CreateSession from './components/createSession' import EdtCoach from './components/edt_coach' import { Coach } from "./classes"; import RessourcePanel from './components/ressourcePanel'; -import TestAPI from './components/test_api'; import TopBar from './components/topBar'; +import { Routes, Route } from 'react-router-dom' +import Home from './components/pages/pageHome'; +import SelectionSession from './components/pages/pageSectionSession'; +import Gestion from './components/pages/pageGestion'; +import Admin from './components/pages/pageAdmin'; + const keycloakInitOptions = { onLoad: 'login-required', @@ -24,11 +29,12 @@ function App() {
-

Frisbyee

- - - - + + }/> + }/> + }/> + }/> +
diff --git a/front_end/src/api.ts b/front_end/src/api.ts index 95c7de5..f87c7dd 100644 --- a/front_end/src/api.ts +++ b/front_end/src/api.ts @@ -45,7 +45,7 @@ export const athleteService = { delete: (id: number | string) => api.delete(`/athlete/${id}`), // session-related endpoints exposed by AthleteResource - getSessionsForAthlete: (athleteId: number | null) => api.get(`/athlete/athlete/${athleteId}/session`), + getSessionsForAthlete: (athleteId: number | null) => api.get(`/athlete/${athleteId}/session`), getAllSessions: () => api.get(`/athletes/session`), getActivitiesForSession: (sessionId: number | string) => api.get(`/athletes/session/${sessionId}/activities`), getSessionsAfterDate: (athleteId: number | string, date: string) => api.get(`/athletes/${athleteId}/session/after/${encodeURIComponent(date)}`), @@ -78,6 +78,7 @@ export const sessionService = { getActivities: (sessionId: number | null) => api.get(`/session/${sessionId}/activities`), addActivity: (sessionId: number | null, activityId: number) => api.post(`/session/${sessionId}/activities/${activityId}`), + getCoach: (sessionId: number | null) => api.get(`/session/${sessionId}/coach`), subscribe: (sessionId: number | null, userId: number) => api.put(`/session/${sessionId}/subscribe/${userId}`), unsubscribe: (sessionId: number | null, userId: number) => api.put(`/session/${sessionId}/unsubscribe/${userId}`), }; diff --git a/front_end/src/components/object/detailSession.tsx b/front_end/src/components/object/detailSession.tsx index 5b79a7b..5cdb5dc 100644 --- a/front_end/src/components/object/detailSession.tsx +++ b/front_end/src/components/object/detailSession.tsx @@ -4,7 +4,7 @@ import { dateToString, hoursToString } from "../edt"; import { Modal } from "../Modal"; import CreateActivite from "../createActivite"; import Loading from "../loading"; -import { addActiviteToSession, createActivityAPI, delay, deletActiviteFromSession, getSessionOfActivite, subscribeSessionAPI, unsubscribeSessionAPI } from "../../requetes"; +import { addActiviteToSession, createActivityAPI, delay, deletActiviteFromSession, getCoachOfSession, getSessionOfActivite, subscribeSessionAPI, unsubscribeSessionAPI } from "../../requetes"; import { useLocalData } from "../../context/useLocalData"; type Props = { @@ -37,6 +37,10 @@ function DetailSession({session,open,setOpen}:Props){ } async function updateActivites(){ + const coach = await getCoachOfSession(session); + if(coach!=null){ + session.coach = coach; + } const newActivites = await getSessionOfActivite(session); if(newActivites!=null){ session.activites=newActivites; @@ -95,8 +99,11 @@ function DetailSession({session,open,setOpen}:Props){ setOpen(false)}>

{session.name}

+
{hoursToString(sDate)}
{dateToString(sDate)}
+
encadré par :
+
{session.coach?.prenom} {session.coach?.nom}
{user instanceof Athlete &&
{user.sessions.includes(session) ? diff --git a/front_end/src/components/pages/pageAdmin.tsx b/front_end/src/components/pages/pageAdmin.tsx new file mode 100644 index 0000000..91e01ef --- /dev/null +++ b/front_end/src/components/pages/pageAdmin.tsx @@ -0,0 +1,12 @@ +import CreateSession from "../createSession" +import TopBar from "../topBar" + +function Admin() { + return ( +
+

Admin

+
+ ) +} + +export default Admin \ No newline at end of file diff --git a/front_end/src/components/pages/pageGestion.tsx b/front_end/src/components/pages/pageGestion.tsx new file mode 100644 index 0000000..14762fa --- /dev/null +++ b/front_end/src/components/pages/pageGestion.tsx @@ -0,0 +1,13 @@ +import CreateSession from "../createSession" +import TopBar from "../topBar" + +function Gestion() { + return ( +
+

Gestion

+ +
+ ) +} + +export default Gestion \ No newline at end of file diff --git a/front_end/src/components/pages/pageHome.tsx b/front_end/src/components/pages/pageHome.tsx new file mode 100644 index 0000000..2acb75b --- /dev/null +++ b/front_end/src/components/pages/pageHome.tsx @@ -0,0 +1,13 @@ +import EDT from "../edt" +import TopBar from "../topBar" + +function Home() { + return ( +
+

Home

+ +
+ ) +} + +export default Home \ No newline at end of file diff --git a/front_end/src/components/pages/pageSectionSession.tsx b/front_end/src/components/pages/pageSectionSession.tsx new file mode 100644 index 0000000..571b627 --- /dev/null +++ b/front_end/src/components/pages/pageSectionSession.tsx @@ -0,0 +1,13 @@ +import RessourcePanel from "../ressourcePanel" +import TopBar from "../topBar" + +function SelectionSession() { + return ( +
+

Selection Session

+ +
+ ) +} + +export default SelectionSession \ No newline at end of file diff --git a/front_end/src/components/style/topBar.css b/front_end/src/components/style/topBar.css index 345612c..acee0f8 100644 --- a/front_end/src/components/style/topBar.css +++ b/front_end/src/components/style/topBar.css @@ -10,13 +10,23 @@ } .toBarLeft{ + flex: 1; display: flex; gap: 10px; align-items: center; + +} + +.toBarMidle{ + display: flex; + flex: 1; + justify-content: center; + gap: 10px; } .topBarRight{ + flex: 1; display: flex; align-items: center; justify-content: flex-end; diff --git a/front_end/src/components/test_api.tsx b/front_end/src/components/test_api.tsx deleted file mode 100644 index e4ed6d0..0000000 --- a/front_end/src/components/test_api.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { useKeycloak } from "@react-keycloak/web" -import { getAllCoach } from "../requetes" -import { Admin } from "../classes"; - - -function TestAPI(){ - const { keycloak } = useKeycloak() - - function handleGetUsers(): void { - getAllCoach(); - } - - function handleSendAdmin(): void { - const admin = new Admin; - admin.nom = "admin"; - admin.email = "admin@gmail.com"; - - //createAdminAPI(admin); - } - - return( -
- - -
- ) -} - -export default TestAPI diff --git a/front_end/src/components/topBar.tsx b/front_end/src/components/topBar.tsx index 8895bd9..d07961e 100644 --- a/front_end/src/components/topBar.tsx +++ b/front_end/src/components/topBar.tsx @@ -1,9 +1,12 @@ +import { Link } from "react-router-dom" +import { Admin, Athlete, Coach } from "../classes" +import { useLocalData } from "../context/useLocalData" import Login from "./login" import SwitchThemeColor from "./SwitchThemeColor" function TopBar(){ - + const {userLocal} = useLocalData() return( @@ -12,7 +15,12 @@ function TopBar(){

Frisbyee

- +
+ Home + Sessions + {userLocal instanceof Coach &&Gestion} + {userLocal instanceof Admin &&Admin} +
diff --git a/front_end/src/index.tsx b/front_end/src/index.tsx index 032464f..04143b1 100644 --- a/front_end/src/index.tsx +++ b/front_end/src/index.tsx @@ -3,13 +3,17 @@ import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; +import { BrowserRouter } from 'react-router-dom' + const root = ReactDOM.createRoot( document.getElementById('root') as HTMLElement ); root.render( - + + + ); diff --git a/front_end/src/requetes.tsx b/front_end/src/requetes.tsx index 092b836..8a2e61e 100644 --- a/front_end/src/requetes.tsx +++ b/front_end/src/requetes.tsx @@ -371,6 +371,17 @@ export async function getAllSessionsBetweenAPI(d1:Date,d2:Date):Promise{ + try { + const response = await sessionService.getCoach(session.id); + const coach:Coach = new Coach(response.data); + return coach; + } catch (error) { + console.error("Error fetching coachs:", error); + throw error; + } +} + //COACH export async function getAllCoach(): Promise { try { diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 89b9cd5..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "hackathon", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/package.json b/package.json new file mode 100644 index 0000000..40817e1 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react-router-dom": "^7.12.0" + } +}