Merge pull request 'Link back and front all get' (#115) from wal/front/listingUsers into master
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	
Reviewed-on: #115 Reviewed-by: Debucquoy Anthony <d.tonitch@gmail.com> Reviewed-by: LeoMoulin <leomoulin125@gmail.com>
This commit is contained in:
		
							
								
								
									
										2
									
								
								backend/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								backend/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -35,3 +35,5 @@ out/ | |||||||
|  |  | ||||||
| ### VS Code ### | ### VS Code ### | ||||||
| .vscode/ | .vscode/ | ||||||
|  |  | ||||||
|  | /cdn | ||||||
|  | |||||||
| @ -64,9 +64,12 @@ public class ApplicationsController { | |||||||
|         if (!authServ.isNotIn(new Role[]{Role.Teacher,Role.Secretary,Role.Admin},token)) |         if (!authServ.isNotIn(new Role[]{Role.Teacher,Role.Secretary,Role.Admin},token)) | ||||||
|             authorizedApps.add(Applications.ManageCourses); |             authorizedApps.add(Applications.ManageCourses); | ||||||
|  |  | ||||||
|         if (!authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) |         if (!authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)){ | ||||||
|             authorizedApps.add(Applications.Inscription); |             authorizedApps.add(Applications.Inscription); | ||||||
|  |             authorizedApps.add(Applications.StudentsList);} | ||||||
|  |  | ||||||
|  |         if (!authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)){  | ||||||
|  |           authorizedApps.add(Applications.UsersList);} | ||||||
|         return authorizedApps; |         return authorizedApps; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -74,7 +74,8 @@ public class CourseController { | |||||||
|     public ResponseEntity<Map<String ,Object>> postCourse(@RequestHeader("Authorization") String token, |     public ResponseEntity<Map<String ,Object>> postCourse(@RequestHeader("Authorization") String token, | ||||||
|                                              @RequestBody Course course) |                                              @RequestBody Course course) | ||||||
|     { |     { | ||||||
|  |         System.out.println(course); | ||||||
|  |         System.out.println(token); | ||||||
|         if (authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)) |         if (authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)) | ||||||
|             return new UnauthorizedResponse<>(null); |             return new UnauthorizedResponse<>(null); | ||||||
|  |  | ||||||
|  | |||||||
| @ -57,7 +57,6 @@ public class InscriptionController { | |||||||
|                                                                  @RequestHeader("Authorization") String token, |                                                                  @RequestHeader("Authorization") String token, | ||||||
|                                                                  @RequestBody RequestState state) |                                                                  @RequestBody RequestState state) | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         if (authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) |         if (authServ.isNotIn(new Role[]{Role.InscriptionService,Role.Admin},token)) | ||||||
|             return new UnauthorizedResponse<>(null); |             return new UnauthorizedResponse<>(null); | ||||||
|  |  | ||||||
|  | |||||||
| @ -53,8 +53,9 @@ public class MockController { | |||||||
|         User joe = new User("Mama","Joe","student@student.com","roundabout","DaWarudo",new Date(0), null,Role.Student,passwordEncoder.encode("student")); |         User joe = new User("Mama","Joe","student@student.com","roundabout","DaWarudo",new Date(0), null,Role.Student,passwordEncoder.encode("student")); | ||||||
|         User meh = new User("Inspiration","lackOf","secretary@secretary.com","a Box","the street",new Date(0), null,Role.Secretary,passwordEncoder.encode("secretary")); |         User meh = new User("Inspiration","lackOf","secretary@secretary.com","a Box","the street",new Date(0), null,Role.Secretary,passwordEncoder.encode("secretary")); | ||||||
|         User joke = new User("CthemBalls","Lemme","teacher@teacher.com","lab","faculty",new Date(0), null,Role.Teacher,passwordEncoder.encode("teacher")); |         User joke = new User("CthemBalls","Lemme","teacher@teacher.com","lab","faculty",new Date(0), null,Role.Teacher,passwordEncoder.encode("teacher")); | ||||||
|  |         User jojo = new User("hhoo","yeay","teacher2@teacher2.com","lab","faculty",new Date(0), null,Role.Teacher,passwordEncoder.encode("teacher")); | ||||||
|         User lena = new User("Louille","Lena","inscriptionService@InscriptionService.com","no","yes",new Date(0), null,Role.InscriptionService,passwordEncoder.encode("inscriptionService")); |         User lena = new User("Louille","Lena","inscriptionService@InscriptionService.com","no","yes",new Date(0), null,Role.InscriptionService,passwordEncoder.encode("inscriptionService")); | ||||||
|         mockUsers = new ArrayList<>(Arrays.asList(herobrine,joe,meh,joke,lena)); |         mockUsers = new ArrayList<>(Arrays.asList(herobrine,joe,meh,joke,lena,jojo)); | ||||||
|  |  | ||||||
|         userRepo.saveAll(mockUsers); |         userRepo.saveAll(mockUsers); | ||||||
|  |  | ||||||
| @ -91,7 +92,7 @@ public class MockController { | |||||||
|         CurriculumCourseService.save(new CurriculumCourse(chemistryBab1,chemistry1)); |         CurriculumCourseService.save(new CurriculumCourse(chemistryBab1,chemistry1)); | ||||||
|  |  | ||||||
|  |  | ||||||
|         InscriptionRequest inscriptionRequest = new InscriptionRequest("helen","prenom","non","helen@gmail.com","america",new Date(),(long) 1,RequestState.Refused,"yes.png","password"); |         InscriptionRequest inscriptionRequest = new InscriptionRequest("helen","prenom","non","helen@gmail.com","america",new Date(),(long) 1,RequestState.Pending,"yes.png","password"); | ||||||
|  |  | ||||||
|         inscriptionService.save(inscriptionRequest); |         inscriptionService.save(inscriptionRequest); | ||||||
|          |          | ||||||
|  | |||||||
| @ -122,9 +122,10 @@ public class UserController { | |||||||
|         return new ResponseEntity<>(ProtectionService.usersWithoutPasswords(students), HttpStatus.OK); |         return new ResponseEntity<>(ProtectionService.usersWithoutPasswords(students), HttpStatus.OK); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     @DeleteMapping("/user/{id}") |     @DeleteMapping("/user/{id}") | ||||||
|     public ResponseEntity<String> deleteStudent(@RequestHeader("Authorization") String token, @PathVariable Long id){ |     public ResponseEntity<String> deleteStudent(@RequestHeader("Authorization") String token, @PathVariable Long id){ | ||||||
|         if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token) || id.equals(authServ.getUserFromToken(token).getRegNo())) |         if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token) && !id.equals(authServ.getUserFromToken(token).getRegNo())) | ||||||
|             return new UnauthorizedResponse<>(null); |             return new UnauthorizedResponse<>(null); | ||||||
|  |  | ||||||
|         User toDelete = userService.getUserById(id); |         User toDelete = userService.getUserById(id); | ||||||
|  | |||||||
| @ -123,6 +123,7 @@ public class UserService { | |||||||
|  |  | ||||||
|     public Iterable<User> getAllStudents(){return userRepo.findAllStudents();} |     public Iterable<User> getAllStudents(){return userRepo.findAllStudents();} | ||||||
|  |  | ||||||
|  |  | ||||||
|     public User getUserById(long id) { |     public User getUserById(long id) { | ||||||
|         return userRepo.findById(id); |         return userRepo.findById(id); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -15,7 +15,9 @@ public enum Applications { | |||||||
|  |  | ||||||
|     // teachers and Secretary authorization |     // teachers and Secretary authorization | ||||||
|     ManageCourses, |     ManageCourses, | ||||||
|  |     UsersList, | ||||||
|  |  | ||||||
|     // InscriptionService authorization |     // InscriptionService authorization | ||||||
|     Inscription |     Inscription, | ||||||
|  |     StudentsList | ||||||
| } | } | ||||||
|  | |||||||
| Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB | 
| @ -26,6 +26,8 @@ app.inscription.requests=Inscription Requests | |||||||
| app.manage.courses=Manage Courses | app.manage.courses=Manage Courses | ||||||
| app.language=Language | app.language=Language | ||||||
| app.manage.profile=Manage profile | app.manage.profile=Manage profile | ||||||
|  | app.studentList=Students List | ||||||
|  | app.users=Users | ||||||
| request.moreInfos=More Infos | request.moreInfos=More Infos | ||||||
| request.accept=Accept | request.accept=Accept | ||||||
| request.refuse=Refuse | request.refuse=Refuse | ||||||
| @ -41,10 +43,12 @@ profile.unRegister=Unregister | |||||||
| profile.course.list=Courses list | profile.course.list=Courses list | ||||||
| profile.address=Address | profile.address=Address | ||||||
| profile.picture=Profile picture | profile.picture=Profile picture | ||||||
|  | profile.change.curriculum=Change curriculum | ||||||
| name=Name | name=Name | ||||||
| teacher=Teacher | Teacher=Teacher | ||||||
| student=Student | Student=Student | ||||||
| secretary=Secretary | Secretary=Secretary | ||||||
| curriculum=curriculum | Curriculum=curriculum | ||||||
| credits=Credits | Credits=Credits | ||||||
|  | InscriptionService=I.S. | ||||||
| faculty=Faculty | faculty=Faculty | ||||||
|  | |||||||
| @ -26,6 +26,8 @@ app.inscription.requests=Demandes d'Inscription | |||||||
| app.manage.courses=Gérer les cours | app.manage.courses=Gérer les cours | ||||||
| app.language=Langue | app.language=Langue | ||||||
| app.manage.profile=Gérer le profil | app.manage.profile=Gérer le profil | ||||||
|  | app.studentList=Liste des étudiants | ||||||
|  | app.users=Utilisateurs | ||||||
| request.moreInfos=Plus d'Infos | request.moreInfos=Plus d'Infos | ||||||
| request.accept=Accepter | request.accept=Accepter | ||||||
| request.refuse=Refuser | request.refuse=Refuser | ||||||
| @ -41,10 +43,12 @@ profile.unRegister=Désinscription | |||||||
| profile.course.list=Liste des cours | profile.course.list=Liste des cours | ||||||
| profile.address=Adresse | profile.address=Adresse | ||||||
| profile.picture=Photo de profil | profile.picture=Photo de profil | ||||||
|  | profile.change.curriculum=Changer cursus | ||||||
| name=Nom | name=Nom | ||||||
| teacher=Enseignant | Teacher=Enseignant | ||||||
| student=Etudiant | Student=Etudiant | ||||||
| secretary=Secrétaire | Secretary=Secrétaire | ||||||
| curriculum=Cursus | Curriculum=Cursus | ||||||
| credits=Credits | Credits=Credits | ||||||
|  | InscriptionService=S.I. | ||||||
| faculty=Faculté | faculty=Faculté | ||||||
|  | |||||||
| @ -5,14 +5,26 @@ | |||||||
|   import { isLogged } from '@/rest/Users.js' |   import { isLogged } from '@/rest/Users.js' | ||||||
|  |  | ||||||
|   import { appList, currentView } from '@/rest/apps.js' |   import { appList, currentView } from '@/rest/apps.js' | ||||||
|  | 		var prevURL; | ||||||
|  | 		var currentURL = window.location.hash; | ||||||
|  |  | ||||||
|  | window.onhashchange = function() { | ||||||
|  |     prevURL = currentURL; | ||||||
|  |     currentURL = window.location.hash; | ||||||
|  | } | ||||||
|  | const Logged = ref(isLogged()); | ||||||
|  |  | ||||||
|  | window.addEventListener('hashchange', () => { | ||||||
|  |  if((location.hash === "#/home" && prevURL === "#/login") || (location.hash === "#/home" && prevURL === "#/profil")){ | ||||||
|  | 		window.location.reload(); | ||||||
|  |  } | ||||||
|  | }); | ||||||
|   const home=ref(i18n("app.home")) |   const home=ref(i18n("app.home")) | ||||||
|   const notifications=ref(i18n("app.notifications")) |   const notifications=ref(i18n("app.notifications")) | ||||||
|   const settings=ref(i18n("app.settings")) |   const settings=ref(i18n("app.settings")) | ||||||
|   const login=ref(i18n("app.login")) |   const login=ref(i18n("app.login")) | ||||||
|   const active=ref(false) |   const active=ref(false) | ||||||
|  |  | ||||||
|   const Logged = ref(isLogged()); |  | ||||||
|  |  | ||||||
| 	const apps = ref([]) | 	const apps = ref([]) | ||||||
| 	appList().then(e => apps.value = e) | 	appList().then(e => apps.value = e) | ||||||
| @ -26,7 +38,7 @@ | |||||||
|       <ul class="horizontal"> |       <ul class="horizontal"> | ||||||
|         <li title=home> |         <li title=home> | ||||||
|             <a class="icon" href="#home"> |             <a class="icon" href="#home"> | ||||||
|                 <img class="clyde" src="./assets/Clyde.png" style="width: 40px; height: auto; margin-top:4px"> |                 <img class="clyde" src="/Clyde.png" style="width: 40px; height: auto; margin-top:4px"> | ||||||
|             </a></li> |             </a></li> | ||||||
|         <li title=home> |         <li title=home> | ||||||
|             <a class="icon" href="#home"> |             <a class="icon" href="#home"> | ||||||
| @ -66,17 +78,19 @@ | |||||||
|     <div class="leftBar"> |     <div class="leftBar"> | ||||||
|     <ul class="vertical"> |     <ul class="vertical"> | ||||||
|         <li v-for="app in apps"> |         <li v-for="app in apps"> | ||||||
| 						<a href="app.path"> | 						<a :href="app.path"> | ||||||
|             <div class="fa-solid" :class="app.icon" style="font-size: 40px;"></div> |             <div class="fa-solid" :class="app.icon" style="font-size: 40px;"></div> | ||||||
|             <div class="text">{{app.text}}</div> |             <div class="text">{{app.text}}</div> | ||||||
| 						</a> | 						</a> | ||||||
| 				</li> | 				</li> | ||||||
|     </ul> |     </ul> | ||||||
|  |  | ||||||
|     </div> |     </div> | ||||||
|     <div class="page"> |     <div class="page"> | ||||||
|       <div style=" margin:50px;"> |       <div style=" margin:50px;"> | ||||||
|  |         <Suspense> | ||||||
|  |          | ||||||
| 		<component :is="currentView" /> | 		<component :is="currentView" /> | ||||||
|  |         </Suspense> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
|  | |||||||
| @ -1,10 +1,113 @@ | |||||||
| <script setup> | <script setup> | ||||||
|   import Req from "./Request.vue" |   import i18n from "@/i18n.js" | ||||||
|   import { getRegisters } from '@/rest/ServiceInscription.js' |   import {ref} from 'vue' | ||||||
|  |   import {validateRegister, getAllRegisters } from '@/rest/ServiceInscription.js' | ||||||
|  |  | ||||||
|   const requests_example = getRegisters(); |   const requests = ref(await getAllRegisters()); | ||||||
|  |   console.log(requests); | ||||||
|  |  | ||||||
|  |   async function upPage(id,review){ | ||||||
|  |     await validateRegister(id,review); | ||||||
|  |     requests.value = await getAllRegisters(); | ||||||
|  |  | ||||||
|  |   } | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <template>  | <template>  | ||||||
|   <Req v-for="item of requests_example"/> |   <div  v-for="item of requests"> | ||||||
|  |   <div class="bodu" v-if="item.state === 'Pending'"> | ||||||
|  |   <div class="container"> | ||||||
|  |   | ||||||
|  |     <div class="id"><a>{{item.id}}</a></div> | ||||||
|  |     <div class="surname"><a>{{item.lastName}}</a></div> | ||||||
|  |     <div class="firstname"><a>{{item.firstName}}</a></div> | ||||||
|  |     <div class="infos"><button style="background-color:rgb(105,05,105);" >{{i18n("request.moreInfos")}}</button></div> | ||||||
|  |     <div class="accept"><button @click="upPage(item.id,'Accepted')" style="background-color:rgb(0,105,50);">{{i18n("request.accept")}}</button></div> | ||||||
|  |     <div class="refuse"><button @click="upPage(item.id,'Refused')" style="background-color:rgb(105,0,0);">{{i18n("request.refuse")}}</button></div> | ||||||
|  |   </div> | ||||||
|  |   </div> | ||||||
|  |   </div> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  |   .container{ | ||||||
|  |     color:white; | ||||||
|  |     height:100px; | ||||||
|  |     font-size:20px; | ||||||
|  |     display:grid; | ||||||
|  |     grid-template-columns:[firstCol-start]100px[firstCol-end secondCol-start]150px[secondCol-end thirdCol-start]200px[thirdCol-end fourthCol-start]150px[fourthCol-end]150px[fifthCol-end]150px[sixthCol-end]150px[endCol]; | ||||||
|  |     grid-template-areas: | ||||||
|  |     "id type surname firstname infos accept refuse";  | ||||||
|  |     column-gap:10px; | ||||||
|  |      | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   .infos { | ||||||
|  |     grid-area:infos; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .accept{ | ||||||
|  |     grid-area:accept; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .refuse{ | ||||||
|  |     grid-area:refuse; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .titles { | ||||||
|  |     grid-area:titles; | ||||||
|  |     background-color:rgb(215,215,215); | ||||||
|  |   } | ||||||
|  |   .id{ | ||||||
|  |     grid-area:id; | ||||||
|  |     margin-left:40px; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .type{ | ||||||
|  |     grid-area:type; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .surname{ | ||||||
|  |     grid-area:surname; | ||||||
|  |     align-self:center; | ||||||
|  |     white-space: nowrap; | ||||||
|  |     overflow: hidden; | ||||||
|  |     text-overflow:ellipsis; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .firstname{ | ||||||
|  |     grid-area:firstname; | ||||||
|  |     align-self:center; | ||||||
|  |     white-space: nowrap; | ||||||
|  |     overflow: hidden; | ||||||
|  |     text-overflow:ellipsis; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   button{ | ||||||
|  |     font-size:15px; | ||||||
|  |      height:50px; | ||||||
|  |      width:100px; | ||||||
|  |     border:none; | ||||||
|  |     border-radius:20px; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .bodu { | ||||||
|  |     width:100%; | ||||||
|  |     margin-bottom:10px; | ||||||
|  |     border:2px solid black; | ||||||
|  |     border-radius:9px; | ||||||
|  |     background-color:rgb(50,50,50); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | </style> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,27 +1,56 @@ | |||||||
| <script setup> | <script setup> | ||||||
|   import { ref } from 'vue' |   import {reactive, ref } from 'vue' | ||||||
|   import i18n from '@/i18n.js' |   import i18n from '@/i18n.js' | ||||||
|   import { login , register, disconnect } from '@/rest/Users.js' |   import { login , register , disconnect, isLogged} from '@/rest/Users.js' | ||||||
|  |   import { getAllCurriculums } from '@/rest/curriculum.js' | ||||||
|   import { uploadProfilePicture } from '@/rest/uploads.js' |   import { uploadProfilePicture } from '@/rest/uploads.js' | ||||||
|  |   import {toast} from 'vue3-toastify' | ||||||
|  |   import 'vue3-toastify/dist/index.css'; | ||||||
|  |  | ||||||
|  |  | ||||||
|   const loginPage= ref(true) |   const loginPage= ref(true) | ||||||
|   const page = ref(0) |   const page = ref(0) | ||||||
|    |    | ||||||
|  |   const outputs = reactive({ | ||||||
|  |     surname:null, | ||||||
|  |     firstname:null, | ||||||
|  |     password:null, | ||||||
|  |     birthday:null, | ||||||
|  |     email:null, | ||||||
|  |     address:null, | ||||||
|  |     country:null, | ||||||
|  |     curriculum:null, | ||||||
|  |   }) | ||||||
|  |  | ||||||
|   const submitValue= ref(i18n("login.guest.submit")) |   const submitValue= ref(i18n("login.guest.submit")) | ||||||
|   const surname=ref("") |  | ||||||
|   const firstname=ref("") |  | ||||||
|   const password=ref("") |  | ||||||
|   const passwordConfirm=ref("") |   const passwordConfirm=ref("") | ||||||
|   const birthday=ref("") |  | ||||||
|   const email=ref("") |  | ||||||
|   const address=ref("") |  | ||||||
|   const country=ref("") |  | ||||||
|   const curriculum=ref("") |  | ||||||
|   |   | ||||||
|   const imageSaved = ref(false) |   const imageSaved = ref(false) | ||||||
|   const ppData = ref(false) |   const ppData = ref(false) | ||||||
|  |  | ||||||
|   disconnect() |   const curricula= await getAllCurriculums(); | ||||||
|  |    | ||||||
|  |   function goBackHome(){ | ||||||
|  |     setTimeout(() => { | ||||||
|  |       window.location.href="#/home"; | ||||||
|  |       }, "500"); | ||||||
|  |  }  | ||||||
|  |   function verifyInputs(pass){ | ||||||
|  |     if(pass==passwordConfirm.value){ | ||||||
|  |       page.value++; | ||||||
|  |       return toast('Password and Confirm Password are correct.', { | ||||||
|  |        | ||||||
|  |     type: "success",}); | ||||||
|  |     } | ||||||
|  |     else{ | ||||||
|  |     return toast('Password and Confirm Password are different',{type: "error",}); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   if (isLogged()){ | ||||||
|  |   disconnect(); | ||||||
|  |   window.location.reload();} | ||||||
|  |  | ||||||
|  |    | ||||||
|  |  | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| @ -30,17 +59,17 @@ | |||||||
|       <div class='loginBox'> |       <div class='loginBox'> | ||||||
|  |  | ||||||
|         <div v-if="loginPage"> |         <div v-if="loginPage"> | ||||||
|           <form @submit.prevent="login(email, password)"class="form"> |           <form @submit.prevent=" login(outputs.email,outputs.password);goBackHome();"class="form"> | ||||||
|             <h1 style="color:rgb(239,60,168); font-family: sans-serif;"> |             <h1 style="color:rgb(239,60,168); font-family: sans-serif;"> | ||||||
|               {{i18n("login.guest.signin")}} |               {{i18n("login.guest.signin")}} | ||||||
|             </h1> |             </h1> | ||||||
|             <div class="inputBox"> |             <div class="inputBox"> | ||||||
|               <p>ID / {{i18n("login.guest.email")}}</p>  |               <p>ID / {{i18n("login.guest.email")}}</p>  | ||||||
|               <input type="text" v-model="email"> |               <input type="text" v-model="outputs.email"> | ||||||
|             </div> |             </div> | ||||||
|             <div class="inputBox"> |             <div class="inputBox"> | ||||||
|               <p>{{i18n("login.guest.password")}}</p> |               <p>{{i18n("login.guest.password")}}</p> | ||||||
|               <input type="password" v-model="password"> |               <input type="password" v-model="outputs.password"> | ||||||
|             </div> |             </div> | ||||||
|             <div class="register"> |             <div class="register"> | ||||||
|               <a @click="loginPage=!loginPage">{{i18n("login.guest.register")}}</a> |               <a @click="loginPage=!loginPage">{{i18n("login.guest.register")}}</a> | ||||||
| @ -52,35 +81,34 @@ | |||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div v-else> |         <div v-else> | ||||||
|           <form @submit.prevent="register(firstname, surname, birthday, password, mail, address, country, curriculum)" class="form"> |           <form class="form"> | ||||||
|             <h1 style="color:rgb(239,60,168); font-family: sans-serif; text-align:center;"> |             <h1 style="color:rgb(239,60,168); font-family: sans-serif; text-align:center;"> | ||||||
|               {{i18n("login.guest.welcome")}} |               {{i18n("login.guest.welcome")}} | ||||||
|             </h1> |             </h1> | ||||||
|             <div v-if="page === 0"> |             <div v-if="page === 0"> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("login.guest.surname")}}</p> |                 <p>{{i18n("login.guest.surname")}}</p> | ||||||
|                 <input type="text" v-model="surname"> |                 <input type="text" v-model="outputs.surname"> | ||||||
|               </div> |               </div> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("login.guest.firstname")}}</p> |                 <p>{{i18n("login.guest.firstname")}}</p> | ||||||
|                 <input type="text" v-model="firstname"> |                 <input type="text" v-model="outputs.firstname"> | ||||||
|               </div> |               </div> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("login.guest.birthday")}}</p> |                 <p>{{i18n("login.guest.birthday")}}</p> | ||||||
|                 <input type="date" v-model="birthday"> |                 <input type="date" v-model="outputs.birthday"> | ||||||
|               </div> |               </div> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                  <p>{{i18n("login.guest.password")}}</p> |                  <p>{{i18n("login.guest.password")}}</p> | ||||||
|                  <input type="password" v-model="password"> |                  <input type="password" v-model="outputs.password"> | ||||||
|               </div> |               </div> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("login.guest.confirm")}} {{i18n("login.guest.password")}}</p> |                 <p>{{i18n("login.guest.confirm")}} {{i18n("login.guest.password")}}</p> | ||||||
|                  <input type="password" v-model="passwordConfirm"> |                  <input type="password" v-model="passwordConfirm"> | ||||||
| 				 <!-- TODO: Verify password is same as passwordConfirm --> |  | ||||||
|               </div> |               </div> | ||||||
|                |                | ||||||
|               <div class="switchpage"> |               <div class="switchpage"> | ||||||
|                 <button @click="page++">{{i18n("login.guest.nextpage")}}</button> |                 <button @click="verifyInputs(outputs.password);">{{i18n("login.guest.nextpage")}}</button> | ||||||
|  |  | ||||||
|               </div> |               </div> | ||||||
|               <div @click="(loginPage=!loginPage) && (page=0)" class="register"> |               <div @click="(loginPage=!loginPage) && (page=0)" class="register"> | ||||||
| @ -90,30 +118,31 @@ | |||||||
|             <div v-else> |             <div v-else> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("login.guest.email")}}</p> |                 <p>{{i18n("login.guest.email")}}</p> | ||||||
|                 <input type="mail" v-model="email"> |                 <input type="mail" v-model="outputs.email"> | ||||||
|               </div> |               </div> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("login.guest.address")}}</p> |                 <p>{{i18n("login.guest.address")}}</p> | ||||||
|                 <input type="text" v-model="address"> |                 <input type="text" v-model="outputs.address"> | ||||||
|               </div> |               </div> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("login.guest.country")}}</p> |                 <p>{{i18n("login.guest.country")}}</p> | ||||||
|                 <input type="text" v-model="country"> |                 <input type="text" v-model="outputs.country"> | ||||||
|               </div> |               </div> | ||||||
|               <form novalidate enctype="multipart/form-data" class="inputBox"> |               <form novalidate enctype="multipart/form-data" class="inputBox"> | ||||||
|               	<p>ProfilePicture</p>  |               	<p>{{i18n("profile.picture").toUpperCase()}}</p>  | ||||||
| 				<input type="file" :disabled="imageSaved" @change="ppData = uploadProfilePicture($event.target.files); imageSaved = true;" accept="image/*"> | 				<input type="file" :disabled="imageSaved" @change="ppData = uploadProfilePicture($event.target.files); imageSaved = true;" accept="image/*"> | ||||||
|               </form> |               </form> | ||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("curriculum").toUpperCase()}}</p>  |                 <p>{{i18n("Curriculum").toUpperCase()}}</p>  | ||||||
|                   <select v-model="curriculum"> |                   <select v-model="outputs.curriculum"> | ||||||
|                     <option value="Chemistry">Chemistry</option> |                     <option v-for="item in curricula">{{item.curriculumId}}</option> | ||||||
|                     <option value="Psycho">Psychology</option> |                      | ||||||
|                     <option value="IT">IT</option> |  | ||||||
|                   </select> |                   </select> | ||||||
|               </div> |               </div> | ||||||
|               <div style="align-self:center;" class="inputBox"> |               <div style="align-self:center;" class="inputBox"> | ||||||
|                 <button style="margin-top:25px;" @click="console.log(outputs)">{{i18n("login.guest.submit")}}</button> |                 <button style="margin-top:25px;" @click="register(outputs.firstname, outputs.surname, outputs.birthday, outputs.password, outputs.email, outputs.address, outputs.country, outputs.curriculum, ppData);"> | ||||||
|  |                   {{i18n("login.guest.submit")}} | ||||||
|  |                 </button> | ||||||
|               </div> |               </div> | ||||||
|               <div  class="switchpage"> |               <div  class="switchpage"> | ||||||
|                 <button @click="page--">{{i18n("login.guest.lastpage")}}</button> |                 <button @click="page--">{{i18n("login.guest.lastpage")}}</button> | ||||||
|  | |||||||
| @ -1,100 +1,103 @@ | |||||||
| <script setup> | <script setup> | ||||||
|   import i18n from "@/i18n.js" |   import i18n from "@/i18n.js" | ||||||
|   import {ref} from 'vue' |   import {reactive , ref} from 'vue' | ||||||
| const curriculum=[ |   import { getCourses,deleteCourse,alterCourse,createCourse } from "@/rest/courses.js" | ||||||
|   { |   import {getUser, getSelf, getTeachers } from "@/rest/Users.js" | ||||||
|   "id": 12, |  | ||||||
|   "name": "Math pour l'info", |  | ||||||
|   "credits": 11, |  | ||||||
|   "faculty": "science", |  | ||||||
|   "teacher": 42, |  | ||||||
|   "Assistants": []}, |  | ||||||
|   { |  | ||||||
|   "id": 42, |  | ||||||
|   "name": "Operating Systems", |  | ||||||
|   "credits": 8, |  | ||||||
|   "faculty": "science", |  | ||||||
|   "teacher": 62, |  | ||||||
|   "Assistants": []}, |  | ||||||
|   { |  | ||||||
|   "id": 52, |  | ||||||
|   "name": "Fonctionnement des ordinateurs", |  | ||||||
|   "credits": 11, |  | ||||||
|   "faculty": "science", |  | ||||||
|   "teacher": 59, |  | ||||||
|   "Assistants": []}, |  | ||||||
|    |    | ||||||
|   ] |  | ||||||
|    |    | ||||||
|   const profList=[42,45,62,84,59] |   const self = await getSelf(); | ||||||
|  |  | ||||||
|  |   const curriculum = ref(await getCourses(self.role)); | ||||||
|  |   const profList = await getTeachers(); | ||||||
|  |  | ||||||
|  |  | ||||||
|   const createMod = ref(false) |   const createMod = ref(false) | ||||||
|   const deleteMod = ref(false) |   const deleteMod = ref(false) | ||||||
|  |  | ||||||
|   const editElementID = ref("");  |   const editElementID = ref("") | ||||||
|  |  | ||||||
|   function editItem(id){ |   function editItem(id){ | ||||||
|     editElementID = id; |     editElementID = id; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   //Juste pour montrer le Create Mode |   //Juste pour montrer le Create Mode | ||||||
|  |      | ||||||
|   const pattern = { |   const pattern = { | ||||||
|  |     "title":null, | ||||||
|   "id": 0, |  | ||||||
|   "name": null, |  | ||||||
|     "credits":null, |     "credits":null, | ||||||
|   "faculty": null, |     "owner":null, | ||||||
|   "teacher": null, |   } | ||||||
|   "Assistants": []} |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   let toModify = Object.assign({},pattern); | ||||||
|   let toAdd = Object.assign({}, pattern); |   let toAdd = Object.assign({}, pattern); | ||||||
|  |  | ||||||
|   function addToCourse (){ |   async function addToCourse(){ | ||||||
|   if (curriculum.length>0){ |  | ||||||
|     toAdd.id=(curriculum[curriculum.length-1].id)-1;} |  | ||||||
|     else{ |  | ||||||
|     toAdd.id=0; |  | ||||||
|     } |  | ||||||
|     let isnull= false; |     let isnull= false; | ||||||
|  |       | ||||||
|     for(const [key, value] of Object.entries(toAdd)){ |     for(const [key, value] of Object.entries(toAdd)){ | ||||||
|  |       console.log(toAdd.owner); | ||||||
|       if(value === null){ |       if(value === null){ | ||||||
|         isnull=true; |         isnull=true; | ||||||
|       } |       } | ||||||
|  |        | ||||||
|     } |     } | ||||||
|     if (!isnull){ |     if (!isnull){ | ||||||
|       curriculum.push(toAdd); |        await createCourse(toAdd.title,toAdd.credits,toAdd.owner); | ||||||
|       } |  | ||||||
|        toAdd= Object.assign({},pattern); |        toAdd= Object.assign({},pattern); | ||||||
|  |  | ||||||
|  |        curriculum.value = await getCourses(self.role); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     }} | ||||||
|  |    | ||||||
|  |   function setModify(item){ | ||||||
|  |      for(const el in profList){ | ||||||
|  |  | ||||||
|  |            if(profList[el].regNo === item.owner.regNo){ | ||||||
|  |         toModify.owner= profList[el]; | ||||||
|  |       } | ||||||
|  |      } | ||||||
|  |      toModify.credits= item.credits; | ||||||
|  |      toModify.title= item.title; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |   async function patchCourse(course){ | ||||||
|  |     for (let element in toModify){ | ||||||
|  |         console.log(toModify,1) | ||||||
|  |         console.log(toModify[element],2) | ||||||
|  |        | ||||||
|  |         if (element =="owner" && (toModify[element].regNo != course.owner.regNo)){ | ||||||
|  |           await alterCourse(course.courseId,{owner:toModify[element].regNo}); | ||||||
|  |         } | ||||||
|  |         else if(element == "title" && (toModify[element] != course.title)){ | ||||||
|  |          await alterCourse(course.courseId,{title:toModify[element]}); | ||||||
|  |         } | ||||||
|  |         else if(element == "credits" && (parseInt(toModify[element]) != course.credits)){ | ||||||
|  |          await alterCourse(course.courseId,{credits:parseInt(toModify[element])}); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |       toModify= Object.assign({},pattern); | ||||||
|  |  | ||||||
|  |       curriculum.value = await getCourses(self.role); | ||||||
|  |  | ||||||
|  |      | ||||||
|  |   } | ||||||
|   //Juste pour montrer le Delete Mode |   //Juste pour montrer le Delete Mode | ||||||
|   let toRemove; |   let toRemove = null; | ||||||
|    |    | ||||||
|   function removeCourse() { |   async function removeCourse(course) { | ||||||
|   console.log("ok"); |        | ||||||
|   console.log(toRemove); |      await deleteCourse(course.courseId) | ||||||
|   let rem=-1; |     curriculum.value = await getCourses(self.role); | ||||||
|   for(const [key, value] of Object.entries(curriculum)){ |     toRemove = null; | ||||||
|     console.log(key); |  | ||||||
|     console.log(value) |  | ||||||
|     if(value.name === toRemove){ |  | ||||||
|          rem = key; |  | ||||||
|         break; |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|     console.log(rem) |  | ||||||
|   if (rem > -1){ |  | ||||||
|     curriculum.splice(rem, 1);} |  | ||||||
|   console.log(curriculum); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| </script> | </script> | ||||||
| <template> | <template> | ||||||
|   <div class="body"> |   <div class="body"> | ||||||
|     <div v-if="!deleteMod && !createMod" class="listTitle buttonGrid"> |     <div v-if="!deleteMod && !createMod && (self.role !== 'Teacher')" class="listTitle buttonGrid"> | ||||||
|       <button class="create" @click="createMod = true"> |       <button class="create" @click="editElementID= '';createMod = true;"> | ||||||
|         {{i18n("courses.createCourse")}} |         {{i18n("courses.createCourse")}} | ||||||
|       </button> |       </button> | ||||||
|       <button class="delete" @click="deleteMod=true" > |       <button class="delete" @click="deleteMod=true" > | ||||||
| @ -105,22 +108,18 @@ const curriculum=[ | |||||||
|       <form class="listElement"> |       <form class="listElement"> | ||||||
|         <div style="margin-bottom:20px;"> |         <div style="margin-bottom:20px;"> | ||||||
|          {{i18n("name")}} :  |          {{i18n("name")}} :  | ||||||
|         <input v-model="toAdd.name"> |         <input v-model="toAdd.title"> | ||||||
|         </div> |         </div> | ||||||
|         <div style="margin-bottom:20px;"> |         <div style="margin-bottom:20px;"> | ||||||
|           {{i18n("teacher")}} :  |           {{i18n("Teacher")}} :  | ||||||
|          <select style="max-width:200px;" class="teacher" v-model="toAdd.teacher"> |          <select style="max-width:200px;" class="teacher" v-model="toAdd.owner"> | ||||||
|           <option v-for="item in profList">{{item}}</option> |            <option v-for="item in profList" :value="item">{{item.lastName}}</option> | ||||||
|         </select> |         </select> | ||||||
|         </div> |         </div> | ||||||
|         <div style="margin-bottom:20px;"> |         <div style="margin-bottom:20px;"> | ||||||
|           {{i18n("credits")}} :  |           {{i18n("Credits")}} :  | ||||||
|         <input v-model="toAdd.credits"> |         <input v-model="toAdd.credits"> | ||||||
|         </div> |         </div> | ||||||
|         <div style="margin-bottom:20px;"> |  | ||||||
|           {{i18n("faculty")}} :  |  | ||||||
|         <input v-model="toAdd.faculty"> |  | ||||||
|         </div> |  | ||||||
|       <button class="create" @click="createMod=!createMod; addToCourse();"> {{i18n("courses.confirm")}} </button> |       <button class="create" @click="createMod=!createMod; addToCourse();"> {{i18n("courses.confirm")}} </button> | ||||||
|       <button style="float:right;" @click="createMod=!createMod">{{i18n("courses.back")}}</button> |       <button style="float:right;" @click="createMod=!createMod">{{i18n("courses.back")}}</button> | ||||||
|       </form> |       </form> | ||||||
| @ -130,43 +129,40 @@ const curriculum=[ | |||||||
|         <div style="margin-bottom:20px;"> |         <div style="margin-bottom:20px;"> | ||||||
|           {{i18n("courses.toDelete")}} : |           {{i18n("courses.toDelete")}} : | ||||||
|          <select style="max-width:200px;" class="teacher" v-model="toRemove"> |          <select style="max-width:200px;" class="teacher" v-model="toRemove"> | ||||||
|           <option v-for="item in curriculum">{{item.name}}</option> |           <option v-for="item in curriculum" :value='item'>{{item.title}}</option> | ||||||
|            |            | ||||||
|         </select> |         </select> | ||||||
|         </div> |         </div> | ||||||
|         <div style="margin-bottom:20px;"> |         <button class="delete" @click="deleteMod=!deleteMod; removeCourse(toRemove);"> {{i18n("courses.deleteCourse")}} </button> | ||||||
|           {{i18n("login.password")}}:  |  | ||||||
|         <input > |  | ||||||
|         </div> |  | ||||||
|         <div style="margin-bottom:20px;"> |  | ||||||
|           {{i18n("login.cPassword")}} :  |  | ||||||
|         <input> |  | ||||||
|         </div> |  | ||||||
|         <button class="delete" @click="deleteMod=!deleteMod;removeCourse();"> {{i18n("courses.deleteCourse")}} </button> |  | ||||||
|         <button style="float:right;" @click="deleteMod=!deleteMod"> {{i18n("courses.back")}}</button> |         <button style="float:right;" @click="deleteMod=!deleteMod"> {{i18n("courses.back")}}</button> | ||||||
|       </form> |       </form> | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     <div v-if="!createMod && !deleteMod" v-for="item in curriculum" :key="item.name"> |     <div v-if="!createMod && !deleteMod" v-for="item in curriculum" :key="item.title"> | ||||||
|       <div style ="padding:15px 15px 15px 15px;"> |       <div  v-if="editElementID !== item.title" style ="padding:15px 15px 15px 15px;"> | ||||||
|       <button  v-if="editElementID !== item.name"  @click="editElementID = item.name"> |         <button   @click="editElementID = item.title; setModify(item); "> | ||||||
|         {{i18n("courses.modify")}} |         {{i18n("courses.modify")}} | ||||||
|         </button> |         </button> | ||||||
|       <button v-else @click="editElementID= ''"> {{i18n("courses.confirm")}} </button> |       </div> | ||||||
|  |       <div v-else> | ||||||
|  |         <button @click="editElementID= '';patchCourse(item)"> {{i18n("courses.confirm")}} </button> | ||||||
|  |         <button @click="editElementID= '';"> {{i18n("courses.back")}} </button> | ||||||
|       </div> |       </div> | ||||||
|       <div  class="listElement" >  |       <div  class="listElement" >  | ||||||
|       <div class="containerElement" v-if="editElementID !== item.name" > |       <div class="containerElement" v-if="editElementID !== item.title" > | ||||||
|  |  | ||||||
|         <div class="name"> {{item.name}} </div> |         <div class="name"> {{item.title}} </div> | ||||||
|         <div class="teacher">{{item.teacher}}</div>  |         <div class="teacher">{{item.owner.lastName}}</div>  | ||||||
|         <div class="credits">{{i18n("credits")}}:{{item.credits}}</div>   |         <div class="credits">{{i18n("Credits")}}:{{item.credits}}</div>   | ||||||
|       </div> |       </div> | ||||||
|       <div class="containerElement"v-else> |       <div class="containerElement"v-else> | ||||||
|         <input style="max-width:200px;" class="name" v-model="item.name"> |         <input style="max-width:200px;" class="name" v-model="toModify.title"> | ||||||
|         <select style="max-width:200px;" class="teacher" v-model="item.teacher"> |         <select v-if="self.role === 'Secretary'" style="max-width:200px;" class="teacher" v-model="toModify.owner"> | ||||||
|           <option v-for="item in profList">{{item}}</option> |           <option v-for="(item,index) in profList" :value='item'>{{item.lastName}}</option> | ||||||
|         </select> |         </select> | ||||||
|         <input style="max-width:100px;"class="credits" v-model="item.credits">   |         <div v-else class="teacher">{{item.owner.lastName}}</div>  | ||||||
|  |         <input v-if="self.role==='Secretary'"style="max-width:100px;"class="credits" v-model="toModify.credits">   | ||||||
|  |         <div v-else class="credits">{{i18n("Credits")}}:{{item.credits}}</div>   | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|     </div> |     </div> | ||||||
|  | |||||||
| @ -1,108 +1,129 @@ | |||||||
| <script setup> | <script setup> | ||||||
|   import {reactive, ref } from 'vue' |   import {reactive, ref } from 'vue' | ||||||
|   import {getUser} from '../rest/Users.js' |   import {getSelf,alterSelf,disconnect,deleteUser} from '../rest/Users.js' | ||||||
|  |   import {getSelfCurriculum, getAllCurriculums} from '../rest/curriculum.js' | ||||||
|  |   import {getCourses} from "../rest/courses.js" | ||||||
|   import i18n from "@/i18n.js" |   import i18n from "@/i18n.js" | ||||||
|  /*  |   import { uploadProfilePicture } from '@/rest/uploads.js' | ||||||
|   const user = getUser();  |  | ||||||
| */ |  | ||||||
|  const user =reactive({ |  | ||||||
|   profilPicture:"../assets/clyde.png", |  | ||||||
|   lastName:"Ghost", |  | ||||||
|   firstName:"Clyde", |  | ||||||
|   role:"student", |  | ||||||
|   address: "Radiator Springs", |  | ||||||
|   email:"ClydeGhost@gmail.com", |  | ||||||
|   curriculum:[ |  | ||||||
|   { |  | ||||||
|   "id": 12, |  | ||||||
|   "name": "Math pour l'info", |  | ||||||
|   "credits": 11, |  | ||||||
|   "faculty": "science", |  | ||||||
|   "teacher": 42, |  | ||||||
|   "Assistants": []}, |  | ||||||
|   { |  | ||||||
|   "id": 42, |  | ||||||
|   "name": "Fonctionnement des ordinateurs", |  | ||||||
|   "credits": 11, |  | ||||||
|   "faculty": "science", |  | ||||||
|   "teacher": 42, |  | ||||||
|   "Assistants": []}, |  | ||||||
|  |  | ||||||
|   ], |   const user = ref(await getSelf()); | ||||||
|   option:"IT", |   const UserCurriculum = ref("");  | ||||||
|   degree:"BAC1", |   const curricula = ref (await getAllCurriculums()); | ||||||
|   password:"CeciEstUnMotDePasse123", |   if(user.value.role === "Student"){ | ||||||
|   }) |     UserCurriculum.value = await getSelfCurriculum(); | ||||||
|    |   } | ||||||
|   /* |  | ||||||
|   Teacher user |  | ||||||
|   const user =reactive({ |  | ||||||
|   profilPicture:"../assets/clyde.png", |  | ||||||
|   lastName:"Ghost", |  | ||||||
|   firstName:"Clyde", |  | ||||||
|   role:"teacher", |  | ||||||
|   address: "Radiator Springs", |  | ||||||
|   email:"ClydeGhost@gmail.com", |  | ||||||
|   coursesOwned:[ |  | ||||||
|   {   |  | ||||||
|   "id": 12, |  | ||||||
|   "name": "Math pour l'info", |  | ||||||
|   "faculty": "science", |  | ||||||
|   "teacher": 42, |  | ||||||
|   "Assistants": []}, |  | ||||||
|   {  |  | ||||||
|   "id": 42, |  | ||||||
|   "name": "Fonctionnement des ordinateurs", |  | ||||||
|   "credits": 11, |  | ||||||
|   "faculty": "science", |  | ||||||
|   "teacher": 42, |  | ||||||
|   "Assistants": []}, |  | ||||||
|  |  | ||||||
|   ], |  | ||||||
|   faculty:"Science", |  | ||||||
|   })*/ |  | ||||||
|  |  | ||||||
|  |   if(user.role === "Teacher"){ | ||||||
|  |     UserCurriculum.value = await getCourses("Teacher"); | ||||||
|  |   } | ||||||
|   const modif = ref(false); |   const modif = ref(false); | ||||||
|  |   const curric = ref(false); | ||||||
|  |   const reg = ref(false); | ||||||
|  |  | ||||||
| const toModify = Object.assign({}, user); |   const pattern = { | ||||||
|  |     profilPictureUrl:null, | ||||||
|  |     email:null, | ||||||
|  |     address:null, | ||||||
|  |     password:null, | ||||||
|  |   }; | ||||||
|    |    | ||||||
|  |   const patternInfos ={ | ||||||
|  |     email: null, | ||||||
|  |     password: null, | ||||||
|  |     passwordConfirm:null, | ||||||
|  |     id:null, | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |    | ||||||
|  |   let toModify= Object.assign({}, pattern); | ||||||
|  |   let personnalInfos =  Object.assign({}, patternInfos); | ||||||
|  |    | ||||||
|  |   function resetInputs(inputs,list){ | ||||||
|  |     inputs=Object.assign({},list);  | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   async function ChangeInfos(){ | ||||||
|  |     for (let element in toModify){ | ||||||
|  |          if (element =="email" && (toModify[element] !== null)){ | ||||||
|  |           await  alterSelf(user.value.regNo,{email : toModify[element]}); | ||||||
|  |         }       | ||||||
|  |  | ||||||
|  |         if (element =="profilPictureUrl" && (toModify[element] !== null)){ | ||||||
|  |           await  alterSelf(user.value.regNo,{ profilPictureUrl : toModify[element]}); | ||||||
|  |         } | ||||||
|  |         else if(element == "address" && (toModify[element] !== null)){ | ||||||
|  |           await  alterSelf(user.value.regNo,{address : toModify[element]}); | ||||||
|  |         } | ||||||
|  |         else if(element == "password" && (toModify[element] !== null)){ | ||||||
|  |           await  alterSelf(user.value.regNo,{password : toModify[element]}); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |       toModify= Object.assign({},pattern); | ||||||
|  |         user.value = await getSelf() | ||||||
|  |  | ||||||
|  |    }  | ||||||
|  |    | ||||||
|  |   function setModify(item){ | ||||||
|  |      toModify.address = item.address; | ||||||
|  |      toModify.profilPictureUrl = item.profilPictureUrl; | ||||||
|  |      toModify.email= item.email; | ||||||
|  |      toModify.password= item.password; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |    | ||||||
|  |   async function unRegister(){ | ||||||
|  |    deleteUser(user.value.regNo); | ||||||
|  |    disconnect() | ||||||
|  |    setTimeout(() => { | ||||||
|  |       window.location.href="#/home"; | ||||||
|  |       }, "500"); | ||||||
|  |      | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   function getPP(){ | ||||||
|  |     if(user.value.profilePictureUrl === null){ | ||||||
|  |       return "/Clyde.png" | ||||||
|  |     } | ||||||
|  |     return user.profilePictureUrl | ||||||
|  |   } | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <template> | <template> | ||||||
|   <div class="body"> |   <div class="body"> | ||||||
|   <div class="container"> |   <div class="container"> | ||||||
|     <div class="profilPic"> |     <div class="profilPic"> | ||||||
|       <img class="subContainter" src="../assets/Clyde.png"> |       <img class="subContainter" :src=getPP()> | ||||||
|  |  | ||||||
|     </div> |     </div> | ||||||
|       <div class="globalInfos"> |       <div class="globalInfos"> | ||||||
|         <div v-if="modif==false" class="infosContainer" > |         <div v-if="modif==false && curric==false && reg==false " class="infosContainer" > | ||||||
|           <div> |           <div> | ||||||
|             {{user.firstName}} {{user.lastName.toUpperCase()}}    |             {{user.firstName}} {{user.lastName}}    | ||||||
|           </div> |           </div> | ||||||
|           <div> |           <div> | ||||||
|             E-mail: {{user.email}}       |             E-mail: {{user.email}}       | ||||||
|           </div> |           </div> | ||||||
|           <div v-if="user.role==='student'"> |           <div v-if="user.role==='Student'"> | ||||||
|             {{user.option}} {{i18n(user.role).toUpperCase()}}  |             {{user.option}} {{i18n(user.role)}}  | ||||||
|           </div> |           </div> | ||||||
|           <div v-else> |           <div v-else> | ||||||
|             {{i18n("faculty")}}: {{user.faculty}}  |             Role:  {{i18n((user.role))}}  | ||||||
|             Role:  {{i18n(user.role).toUpperCase()}}  |  | ||||||
|           </div> |           </div> | ||||||
|           <div> |           <div> | ||||||
|             <button @click="modif=!modif"> {{i18n("profile.modify.data")}} </button> |             <button @click="modif=!modif; setModify(user)"> {{i18n("profile.modify.data")}} </button> | ||||||
|           </div> |           </div> | ||||||
|           <div v-if="(user.role==='student')"> |           <div v-if="(user.role==='Student')"> | ||||||
|             <button>{{i18n("profile.reRegister")}}</button> |             <button @click="reg=!reg">{{i18n("profile.reRegister")}}</button> | ||||||
|             <button style="float:right;background-color:rgb(150,0,0);">{{i18n("profile.unRegister")}}</button> |             <button @click="unRegister()" style="float:right;background-color:rgb(150,0,0);">{{i18n("profile.unRegister")}}</button> | ||||||
|  |           </div> | ||||||
|  |           <div v-if="(user.role==='Student')"> | ||||||
|  |             <button @click="curric=!curric">{{i18n("profile.change.curriculum")}}</button> | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|         <div v-else class="infosContainer"> |         <div v-else-if="modif" class="infosContainer"> | ||||||
|           <div> |           <div> | ||||||
|             {{i18n("profile.picture")}}: |             {{i18n("profile.picture")}}: | ||||||
|             <input type="file"> |             <input type="file" @change="user.profilPicture = uploadProfilePicture($event.target.files);" accept="image/*"> | ||||||
|           </div> |           </div> | ||||||
|           <div> |           <div> | ||||||
|             E-mail:   |             E-mail:   | ||||||
| @ -110,7 +131,42 @@ const toModify = Object.assign({}, user); | |||||||
|           </div> |           </div> | ||||||
|           <div> |           <div> | ||||||
|             {{i18n("profile.address")}}: |             {{i18n("profile.address")}}: | ||||||
|             <input type="text" v-model="toModify.address"> |             <input type="text" v-model="toModify.id"> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             {{i18n("login.password")}}: | ||||||
|  |             <input type="password" v-model="toModify.password"> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             {{i18n("login.cPassword")}}: | ||||||
|  |             <input type="password" v-model="toModify.passwordConfirm"> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             <button @click=" modif=!modif; ChangeInfos();">{{i18n("courses.confirm")}}</button> | ||||||
|  |             <button @click="modif=!modif; resetInputs(toModify,pattern);" style="float:right;">{{i18n("courses.back")}}</button> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |         <div v-else-if="curric" class="infosContainer"> | ||||||
|  |           <div style="height:40px;"> | ||||||
|  |             {{i18n("Curriculum")}}:   | ||||||
|  |             <select v-model="curriculum" > | ||||||
|  |               <option v-for="item in curricula" style="font-size:20px;" :value="item">{{item.option}}</option>         | ||||||
|  |             </select> | ||||||
|  |           </div> | ||||||
|  |  | ||||||
|  |           <div> | ||||||
|  |             <button @click=" curric=!curric;">{{i18n("courses.confirm")}}</button> | ||||||
|  |             <button @click="curric=!curric; resetInputs(personnalInfos,patternInfos);" style="float:right;">{{i18n("courses.back")}}</button> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |         <div v-else-if="reg" class="infosContainer"> | ||||||
|  |           <div> | ||||||
|  |             E-mail:   | ||||||
|  |             <input type="mail" v-model="toModify.email" /> | ||||||
|  |           </div> | ||||||
|  |           <div> | ||||||
|  |             ID : | ||||||
|  |             <input type="text" v-model="toModify.id"> | ||||||
|           </div> |           </div> | ||||||
|           <div> |           <div> | ||||||
|             {{i18n("login.password")}}: |             {{i18n("login.password")}}: | ||||||
| @ -120,22 +176,25 @@ const toModify = Object.assign({}, user); | |||||||
|             {{i18n("login.cPassword")}}: |             {{i18n("login.cPassword")}}: | ||||||
|             <input type="password" id="confirm"> |             <input type="password" id="confirm"> | ||||||
|           </div> |           </div> | ||||||
|           <div> |  | ||||||
|             <button @click=" modif=!modif">{{i18n("courses.confirm")}}</button> |  | ||||||
|           </div> |  | ||||||
|         </div> |  | ||||||
|       </div> |  | ||||||
|       <div v-if="modif==false"class="moreInfos"> |  | ||||||
|  |  | ||||||
|         <div v-if="(user.role==='student')"> |           <div> | ||||||
|  |             <button @click=" reg=!reg;">{{i18n("courses.confirm")}}</button> | ||||||
|  |             <button @click=" reg=!reg; resetInputs(personnalInfos,patternInfos);" style="float:right;">{{i18n("courses.back")}}</button> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |       </div> | ||||||
|  |        | ||||||
|  |       <div v-if="modif==false && curric==false && reg==false "class="moreInfos"> | ||||||
|  |  | ||||||
|  |         <div v-if="(user.role ==='Student')"> | ||||||
|           <div class="listTitle"> |           <div class="listTitle"> | ||||||
|             {{i18n("profile.course.list")}} |             {{i18n("profile.course.list")}} | ||||||
|           </div> |           </div> | ||||||
|         <div  class="listElement " |           <div  class="listElement" v-for="item in UserCurriculum.courses"> | ||||||
|           v-for="item in user.curriculum"> |  | ||||||
|           <div class=" containerElement"> |           <div class=" containerElement"> | ||||||
|             <div class="name"> {{item.name}} </div> |             <div class="name"> {{item.title}} </div> | ||||||
|             <div class="teacher">{{item.teacher}}</div>  |             <div class="teacher">{{item.owner.lastName}}</div>  | ||||||
|             <div class="credits">Credits:{{item.credits}}</div>   |             <div class="credits">Credits:{{item.credits}}</div>   | ||||||
|           </div> |           </div> | ||||||
|           </div> |           </div> | ||||||
| @ -144,18 +203,6 @@ const toModify = Object.assign({}, user); | |||||||
|         <div> |         <div> | ||||||
|         </div> |         </div> | ||||||
|      |      | ||||||
|       <div v-if="(user.role==='teacher')"> |  | ||||||
|           <div class="listTitle"> |  | ||||||
|             {{i18n("profile.course.list")}} |  | ||||||
|           </div> |  | ||||||
|           <div class="listElement " v-for="item in user.coursesOwned"> |  | ||||||
|           {{item.name}}        |  | ||||||
|           </div> |  | ||||||
|         </div> |  | ||||||
|          |  | ||||||
|         <div> |  | ||||||
|         </div> |  | ||||||
|          |  | ||||||
|       </div> |       </div> | ||||||
|   </div> |   </div> | ||||||
| </div> | </div> | ||||||
| @ -168,7 +215,7 @@ const toModify = Object.assign({}, user); | |||||||
|   grid-template-columns:200px 900px; |   grid-template-columns:200px 900px; | ||||||
|   grid-template-rows:200px auto; |   grid-template-rows:200px auto; | ||||||
|   column-gap:30px; |   column-gap:30px; | ||||||
|   row-gap:25px; |   row-gap:45px; | ||||||
|   grid-template-areas: |   grid-template-areas: | ||||||
|   "profilPic globalInfos" |   "profilPic globalInfos" | ||||||
|   "minfos minfos"; |   "minfos minfos"; | ||||||
|  | |||||||
| @ -1,109 +0,0 @@ | |||||||
| <script setup> |  | ||||||
|   import i18n from "@/i18n.js" |  | ||||||
|   const props = defineProps({ |  | ||||||
|   id: Number, |  | ||||||
|   type: String, |  | ||||||
|   lastName: String, |  | ||||||
|   firstName: String, |  | ||||||
|   address: String, |  | ||||||
|   country: String, |  | ||||||
|   birthDate: String, |  | ||||||
|   curriculum:String, |  | ||||||
|   degree:String,}); |  | ||||||
| </script> |  | ||||||
|  |  | ||||||
|  |  | ||||||
| <template> |  | ||||||
|   <div class="bodu"> |  | ||||||
|   <div class="container"> |  | ||||||
|   |  | ||||||
|     <div class="id"><a>{{id}}</a></div> |  | ||||||
|     <div class="type"><a>{{type}}</a></div> |  | ||||||
|     <div class="surname"><a>{{lastName}}</a></div> |  | ||||||
|     <div class="firstname"><a>{{firstName}}</a></div> |  | ||||||
|     <div class="infos"><button style="background-color:rgb(105,05,105);" >{{i18n("request.moreInfos")}}   </button></div> |  | ||||||
|     <div class="accept"><button style="background-color:rgb(0,105,50);">{{i18n("request.accept")}}</button></div> |  | ||||||
|     <div class="refuse"><button style="background-color:rgb(105,0,0);">{{i18n("request.refuse")}}</button></div> |  | ||||||
|   </div> |  | ||||||
|   </div> |  | ||||||
| </template> |  | ||||||
|  |  | ||||||
| <style scoped> |  | ||||||
|   .container{ |  | ||||||
|     color:white; |  | ||||||
|     height:100px; |  | ||||||
|     font-size:20px; |  | ||||||
|     display:grid; |  | ||||||
|     grid-template-columns:[firstCol-start]100px[firstCol-end secondCol-start]150px[secondCol-end thirdCol-start]200px[thirdCol-end fourthCol-start]150px[fourthCol-end]150px[fifthCol-end]150px[sixthCol-end]150px[endCol]; |  | ||||||
|     grid-template-areas: |  | ||||||
|     "id type surname firstname infos accept refuse";  |  | ||||||
|     column-gap:10px; |  | ||||||
|      |  | ||||||
|   } |  | ||||||
|    |  | ||||||
|   .infos { |  | ||||||
|     grid-area:infos; |  | ||||||
|     align-self:center; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .accept{ |  | ||||||
|     grid-area:accept; |  | ||||||
|     align-self:center; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .refuse{ |  | ||||||
|     grid-area:refuse; |  | ||||||
|     align-self:center; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .titles { |  | ||||||
|     grid-area:titles; |  | ||||||
|     background-color:rgb(215,215,215); |  | ||||||
|   } |  | ||||||
|   .id{ |  | ||||||
|     grid-area:id; |  | ||||||
|     margin-left:40px; |  | ||||||
|     align-self:center; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .type{ |  | ||||||
|     grid-area:type; |  | ||||||
|     align-self:center; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .surname{ |  | ||||||
|     grid-area:surname; |  | ||||||
|     align-self:center; |  | ||||||
|     white-space: nowrap; |  | ||||||
|     overflow: hidden; |  | ||||||
|     text-overflow:ellipsis; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .firstname{ |  | ||||||
|     grid-area:firstname; |  | ||||||
|     align-self:center; |  | ||||||
|     white-space: nowrap; |  | ||||||
|     overflow: hidden; |  | ||||||
|     text-overflow:ellipsis; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   button{ |  | ||||||
|     font-size:15px; |  | ||||||
|      height:50px; |  | ||||||
|      width:100px; |  | ||||||
|     border:none; |  | ||||||
|     border-radius:20px; |  | ||||||
|  |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   .bodu { |  | ||||||
|     width:100%; |  | ||||||
|     margin-bottom:10px; |  | ||||||
|     border:2px solid black; |  | ||||||
|     border-radius:9px; |  | ||||||
|     background-color:rgb(50,50,50); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| </style> |  | ||||||
|  |  | ||||||
							
								
								
									
										100
									
								
								frontend/src/Apps/StudentsList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								frontend/src/Apps/StudentsList.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | |||||||
|  | <script setup> | ||||||
|  |   import i18n from "@/i18n.js" | ||||||
|  |   import { reactive  } from 'vue' | ||||||
|  |   import { getStudents } from '../rest/Users.js' | ||||||
|  |  | ||||||
|  |   const users = await getStudents(); | ||||||
|  | </script>  | ||||||
|  | <template> | ||||||
|  |   <div v-for="item in users"> | ||||||
|  |     <div class="bodu"> | ||||||
|  |       <div class="container"> | ||||||
|  |         <div class="status"><a style="margin-left:30px">{{item.status}}</a></div> | ||||||
|  |         <div class="option"><a>{{item.role}}</a></div> | ||||||
|  |         <div class="surname"><a>{{item.lastName}}</a></div> | ||||||
|  |         <div class="firstname"><a>{{item.firstName}}</a></div> | ||||||
|  |         <div class="infos"><button style="background-color:rgb(105,05,105);" >{{i18n("request.moreInfos")}}   </button></div> | ||||||
|  |     </div> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  |   .container{ | ||||||
|  |     color:white; | ||||||
|  |     height:100px; | ||||||
|  |     font-size:30px; | ||||||
|  |     display:grid; | ||||||
|  |     grid-template-columns:250px 250px 250px 250px 150px; | ||||||
|  |     grid-template-areas: | ||||||
|  |     "status option surname firstname infos";  | ||||||
|  |     column-gap:10px; | ||||||
|  |      | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   .infos { | ||||||
|  |     grid-area:infos; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .option{ | ||||||
|  |     grid-area:option; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .refuse{ | ||||||
|  |     grid-area:refuse; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .titles { | ||||||
|  |     grid-area:titles; | ||||||
|  |     background-color:rgb(215,215,215); | ||||||
|  |   } | ||||||
|  |   .id{ | ||||||
|  |     grid-area:id; | ||||||
|  |     margin-left:40px; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .status{ | ||||||
|  |     grid-area:status; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .surname{ | ||||||
|  |     grid-area:surname; | ||||||
|  |     align-self:center; | ||||||
|  |     white-space: nowrap; | ||||||
|  |     overflow: hidden; | ||||||
|  |     text-overflow:ellipsis; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .firstname{ | ||||||
|  |     grid-area:firstname; | ||||||
|  |     align-self:center; | ||||||
|  |     white-space: nowrap; | ||||||
|  |     overflow: hidden; | ||||||
|  |     text-overflow:ellipsis; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   button{ | ||||||
|  |     font-size:15px; | ||||||
|  |      height:50px; | ||||||
|  |      width:100px; | ||||||
|  |     border:none; | ||||||
|  |     border-radius:20px; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .bodu { | ||||||
|  |     width:100%; | ||||||
|  |     margin-bottom:10px; | ||||||
|  |     border:2px solid black; | ||||||
|  |     border-radius:9px; | ||||||
|  |     background-color:rgb(50,50,50); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | </style> | ||||||
|  |  | ||||||
							
								
								
									
										86
									
								
								frontend/src/Apps/UsersList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								frontend/src/Apps/UsersList.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | |||||||
|  |  | ||||||
|  | <script setup> | ||||||
|  |   import i18n from "@/i18n.js" | ||||||
|  |   import { reactive  } from 'vue' | ||||||
|  |   import { getAllUsers } from '../rest/Users.js' | ||||||
|  |  | ||||||
|  |   const users = await getAllUsers(); | ||||||
|  |    | ||||||
|  | </script>  | ||||||
|  | <template> | ||||||
|  |   <div v-for="item in users"> | ||||||
|  |     <div class="bodu"> | ||||||
|  |       <div class="container"> | ||||||
|  |         <div class="role"><a style="margin-left:30px">{{i18n(item.role)}}</a></div> | ||||||
|  |         <div class="surname"><a>{{item.lastName}}</a></div> | ||||||
|  |         <div class="firstname"><a>{{item.firstName}}</a></div> | ||||||
|  |         <div class="infos"><button style="background-color:rgb(105,05,105);" >{{i18n("request.moreInfos")}}   </button></div> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  |   .container{ | ||||||
|  |     justify-content:center; | ||||||
|  |     align-items:center; | ||||||
|  |     color:white; | ||||||
|  |     height:100px; | ||||||
|  |     font-size:30px; | ||||||
|  |     display:grid; | ||||||
|  |     grid-template-columns:250px 250px 250px 150px; | ||||||
|  |     grid-template-areas: | ||||||
|  |     "role surname firstname infos";  | ||||||
|  |     column-gap:10px; | ||||||
|  |      | ||||||
|  |   } | ||||||
|  |    | ||||||
|  |   .infos { | ||||||
|  |  | ||||||
|  |     grid-area:infos; | ||||||
|  |     align-items:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .role { | ||||||
|  |     grid-area:role; | ||||||
|  |     align-self:center; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .surname{ | ||||||
|  |     grid-area:surname; | ||||||
|  |     align-self:center; | ||||||
|  |     white-space: nowrap; | ||||||
|  |     overflow: hidden; | ||||||
|  |     text-overflow:ellipsis; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .firstname{ | ||||||
|  |     grid-area:firstname; | ||||||
|  |     align-self:center; | ||||||
|  |     white-space: nowrap; | ||||||
|  |     overflow: hidden; | ||||||
|  |     text-overflow:ellipsis; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   button{ | ||||||
|  |     font-size:15px; | ||||||
|  |      height:50px; | ||||||
|  |      width:100px; | ||||||
|  |     border:none; | ||||||
|  |     border-radius:20px; | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   .bodu { | ||||||
|  |     width:100%; | ||||||
|  |     margin-bottom:10px; | ||||||
|  |     border:2px solid black; | ||||||
|  |     border-radius:9px; | ||||||
|  |     background-color:rgb(50,50,50); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | </style> | ||||||
|  |  | ||||||
| @ -33,9 +33,13 @@ export async function getRegisters(id){ | |||||||
| 	return restGet("/request/register") | 	return restGet("/request/register") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export async function getAllRegisters(){ | ||||||
|  |   return restGet("/requests/register") | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Change the state of a requests. |  * Change the state of a requests. | ||||||
|  */ |  */ | ||||||
| export async function validateRegister(id, state){ | export async function validateRegister(id, state){ | ||||||
| 	return restPatch("/request/register/" + id, {state: state}); |   return restPatch("/request/register/" + id, state); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import { restGet, restPost } from './restConsumer.js' | import { restGet, restPost, restPatch, restDelete} from './restConsumer.js' | ||||||
| import { getCookie, setCookie } from '@/utils.js' | import { getCookie, setCookie } from '@/utils.js' | ||||||
|  |  | ||||||
| export async function login(user, pass, exp){ | export async function login(user, pass, exp){ | ||||||
| @ -26,16 +26,17 @@ export function disconnect(){ | |||||||
|  * @param curriculum  |  * @param curriculum  | ||||||
|  * @param imageId	id of the image in database returned when uploaded |  * @param imageId	id of the image in database returned when uploaded | ||||||
|  */ |  */ | ||||||
| export async function register(firstname, lastname, birthDate, password, email, address, country, curriculum, imageId){ | export async function register(firstname, lastname, birthDate, password, email, address, country, curriculumId, imageId){ | ||||||
| 	return restPost("/register", { | 	return restPost("/register", { | ||||||
| 		firstname: firstname, | 		firstName: firstname, | ||||||
| 		lastname: lastname, | 		lastName: lastname, | ||||||
| 		birthDate: birthDate, | 		birthDate: birthDate, | ||||||
| 		password: password, | 		password: password, | ||||||
| 		email: email, | 		email: email, | ||||||
| 		address: address, | 		address: address, | ||||||
| 		country: country, | 		country: country, | ||||||
| 		curriculum: curriculum | 		curriculumId: curriculumId, | ||||||
|  |     profilePictureUrl: imageId, | ||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -72,7 +73,7 @@ export async function createUser(firstname, lastname, birthDate, email, address, | |||||||
|  * if the user is not authenticated. then an empty array should be returned |  * if the user is not authenticated. then an empty array should be returned | ||||||
|  */ |  */ | ||||||
| export async function getUser(id){ | export async function getUser(id){ | ||||||
| 	const endpoint = "/user" + id != null ? "/" + id : ""; | 	const endpoint = "/user/" +  id; | ||||||
| 	return restGet(endpoint); | 	return restGet(endpoint); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -102,7 +103,23 @@ export async function getAllUsers(){ | |||||||
| 	return restGet("/users"); | 	return restGet("/users"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Return the list of teachers | ||||||
|  |  * | ||||||
|  |  * @return a list of teachers | ||||||
|  |  * each elements is of the form | ||||||
|  |  * - id | ||||||
|  |  * - name | ||||||
|  |  * - role | ||||||
|  |  */ | ||||||
|  | export async function getTeachers(){ | ||||||
|  | 	return restGet("/teachers") | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | export async function getStudents(){ | ||||||
|  |   return restGet("/students") | ||||||
|  | } | ||||||
| /** | /** | ||||||
|  * Get informations about yourself |  * Get informations about yourself | ||||||
|  * - RegNo |  * - RegNo | ||||||
| @ -123,6 +140,13 @@ export async function getSelf(){ | |||||||
|  * - Adress |  * - Adress | ||||||
|  * - Password |  * - Password | ||||||
|  */ |  */ | ||||||
| export async function alterSelf(data){ | export async function alterSelf(id,data){ | ||||||
| 	return restPatch("/user", data); |   console.log(data) | ||||||
|  | 	return restPatch("/user/"+id, data); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | export async function deleteUser(id){ | ||||||
|  |   return restDelete("/user/" + id) | ||||||
| } | } | ||||||
|  | |||||||
| @ -7,12 +7,16 @@ import LoginPage from '@/Apps/Login.vue' | |||||||
| import Inscription from "@/Apps/Inscription.vue" | import Inscription from "@/Apps/Inscription.vue" | ||||||
| import Profil from "@/Apps/Profil.vue" | import Profil from "@/Apps/Profil.vue" | ||||||
| import Courses from "@/Apps/ManageCourses.vue" | import Courses from "@/Apps/ManageCourses.vue" | ||||||
|  | import Users from "@/Apps/UsersList.vue" | ||||||
|  | import Students from "@/Apps/StudentsList.vue" | ||||||
|  |  | ||||||
| const apps = { | const apps = { | ||||||
| 		'/login': LoginPage, | 		'/login': LoginPage, | ||||||
| 		'/inscription': Inscription, | 		'/inscription': Inscription, | ||||||
| 		'/profil': Profil, | 		'/profil': Profil, | ||||||
| 		'/manage-courses' : Courses, | 		'/manage-courses' : Courses, | ||||||
|  | 		'/users-list' : Users, | ||||||
|  | 		'/students-list' : Students, | ||||||
| } | } | ||||||
|  |  | ||||||
| const appsList = { | const appsList = { | ||||||
| @ -22,6 +26,8 @@ const appsList = { | |||||||
| 		'Schedule': { path: '#/schedule', icon: 'fa-calendar-days', text: i18n("app.schedules") }, | 		'Schedule': { path: '#/schedule', icon: 'fa-calendar-days', text: i18n("app.schedules") }, | ||||||
| 		'Inscription': { path: '#/inscription', icon: 'fa-users', text: i18n("app.inscription.requests") }, | 		'Inscription': { path: '#/inscription', icon: 'fa-users', text: i18n("app.inscription.requests") }, | ||||||
| 		'ManageCourses': { path: '#/manage-courses', icon: 'fa-book', text: i18n("app.manage.courses") }, | 		'ManageCourses': { path: '#/manage-courses', icon: 'fa-book', text: i18n("app.manage.courses") }, | ||||||
|  | 		'StudentsList':{ path: '#/students-list',icon: 'fa-users',text: i18n("app.studentList")}, | ||||||
|  | 		'UsersList':{ path: '#/users-list',icon: 'fa-users',text: i18n("app.users")}, | ||||||
| } | } | ||||||
|  |  | ||||||
| const currentPath = ref(window.location.hash) | const currentPath = ref(window.location.hash) | ||||||
|  | |||||||
| @ -7,8 +7,10 @@ import { restGet, restPost, restDelete, restPatch } from './restConsumer.js' | |||||||
| /** | /** | ||||||
|  * Create a new course |  * Create a new course | ||||||
|  */ |  */ | ||||||
| export async function createCourse(name, credits, faculty, teacher, assistants){ | export async function createCourse(name, credits, owner){ | ||||||
| 	return restPost("/courses", {name: name, credits: credits, faculty: faculty, teacher: teacher, assistants: assistants} ) |   console.log(owner); | ||||||
|  |    | ||||||
|  | 	return restPost("/course", {title: name, credits: credits, owner} ) | ||||||
| } | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @ -34,6 +36,25 @@ export async function getCourse(id){ | |||||||
| 	return restGet("/course/" + id); | 	return restGet("/course/" + id); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Get the list of courses to display on secretary's option | ||||||
|  |  * | ||||||
|  |  * @return list of courses of the form | ||||||
|  |  * - id | ||||||
|  |  * - name | ||||||
|  |  * - credits | ||||||
|  |  * - facutly | ||||||
|  |  * - teacher | ||||||
|  |  * - Assistants | ||||||
|  |  */ | ||||||
|  | export async function getCourses(role){ | ||||||
|  |   if(role==="Teacher"){ | ||||||
|  |   return restGet("/courses/owned") | ||||||
|  |   } | ||||||
|  | 	return restGet("/courses") | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Change the options of a course |  * Change the options of a course | ||||||
|  * |  * | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
|  * curriculum API |  * curriculum API | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| import { restGet, restPostn, restDelete, restPatch } from './restConsumer.js' | import { restGet, restPost, restDelete, restPatch } from './restConsumer.js' | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Create a new curriculum (bundle of courses) |  * Create a new curriculum (bundle of courses) | ||||||
| @ -19,6 +19,10 @@ export async function deletecurriculum(id){ | |||||||
| 	return restDelete("/curriculum/" + id); | 	return restDelete("/curriculum/" + id); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export async function getAllCurriculums(){ | ||||||
|  |   return restGet("/curriculums"); | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Get informations on a particular curriculum |  * Get informations on a particular curriculum | ||||||
|  * |  * | ||||||
| @ -39,3 +43,8 @@ export async function getcurriculum(id){ | |||||||
| export async function altercurriculum(id, courses){ | export async function altercurriculum(id, courses){ | ||||||
| 	return restPatch("/curriculum/" + id, courses); | 	return restPatch("/curriculum/" + id, courses); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | export async function getSelfCurriculum(){ | ||||||
|  |   return restGet("/curriculum"); | ||||||
|  | } | ||||||
|  | |||||||
| @ -16,8 +16,8 @@ export async function restPostFile(endPoint, file){ | |||||||
| 	return await _rest(endPoint, {method: "POST", credentials: 'include', body: file, headers: headers }); | 	return await _rest(endPoint, {method: "POST", credentials: 'include', body: file, headers: headers }); | ||||||
| } | } | ||||||
|  |  | ||||||
| export async function restDelete(endPoint, data) { | export async function restDelete(endPoint) { | ||||||
| 	return await _rest(endPoint, {method: "DELETE", credentials: 'include', body: JSON.stringify(data)}); | 	return await _rest(endPoint, {method: "DELETE"}); | ||||||
| } | } | ||||||
|  |  | ||||||
| export async function restPatch(endPoint, data) { | export async function restPatch(endPoint, data) { | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user