Huge commit
- Rework the inscription requests system so that it considers the equivalence systems and the impact of the teacher in the inscription procedure.
This commit is contained in:
		| @ -41,4 +41,12 @@ public class ExternalCurriculumController { | |||||||
|         ArrayList<ExternalCurriculum> toReturn = ecr.getExternalCurriculumByInscriptionRequest(ir); |         ArrayList<ExternalCurriculum> toReturn = ecr.getExternalCurriculumByInscriptionRequest(ir); | ||||||
|         return new ResponseEntity<>(toReturn, HttpStatus.OK); |         return new ResponseEntity<>(toReturn, HttpStatus.OK); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @PatchMapping("/externalcurriculum/{extcurrid}/{newstate}") | ||||||
|  |     public ResponseEntity<Object> changeExternalCurrState(@PathVariable long extcurrid, @PathVariable RequestState newstate){ | ||||||
|  |         ExternalCurriculum externalCurriculum = ecr.getExternalCurriculumById(extcurrid); | ||||||
|  |         externalCurriculum.setState(newstate); | ||||||
|  |         ecr.save(externalCurriculum); | ||||||
|  |         return new ResponseEntity<>(HttpStatus.OK); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,5 +1,6 @@ | |||||||
| package ovh.herisson.Clyde.EndPoints; | package ovh.herisson.Clyde.EndPoints; | ||||||
|  |  | ||||||
|  | import org.apache.tomcat.util.http.parser.Authorization; | ||||||
| import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
| @ -79,4 +80,22 @@ public class InscriptionController { | |||||||
|         return new ResponseEntity<>(HttpStatus.OK); |         return new ResponseEntity<>(HttpStatus.OK); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     //Allow teacher or admin to accept or refuse the equivalence | ||||||
|  |     @PatchMapping("/request/registerequiv/{id}/{newstate}") | ||||||
|  |     public ResponseEntity<Object> editRegisterEquiv(@RequestHeader("Authorization") String token, @PathVariable long id, @PathVariable RequestState newstate){ | ||||||
|  |         if (authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher}, token)) | ||||||
|  |             return new UnauthorizedResponse<>(null); | ||||||
|  |  | ||||||
|  |         InscriptionRequest toEdit = inscriptionServ.getById(id); | ||||||
|  |         toEdit.setEquivalenceState(newstate); | ||||||
|  |  | ||||||
|  |         inscriptionServ.save(toEdit); | ||||||
|  |  | ||||||
|  |         if (toEdit.getState() == RequestState.Accepted && (toEdit.getEquivalenceState() == RequestState.Accepted || toEdit.getEquivalenceState() == RequestState.Unrequired)) | ||||||
|  |         { | ||||||
|  |             inscriptionServ.createUser(toEdit); | ||||||
|  |         } | ||||||
|  |         return new ResponseEntity<>(HttpStatus.OK); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -5,10 +5,15 @@ import org.springframework.http.HttpHeaders; | |||||||
| import org.springframework.http.HttpStatus; | import org.springframework.http.HttpStatus; | ||||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
|  | import ovh.herisson.Clyde.Repositories.CurriculumRepository; | ||||||
|  | import ovh.herisson.Clyde.Repositories.InscriptionRepository; | ||||||
| import ovh.herisson.Clyde.Responses.UnauthorizedResponse; | import ovh.herisson.Clyde.Responses.UnauthorizedResponse; | ||||||
| import ovh.herisson.Clyde.Services.AuthenticatorService; | import ovh.herisson.Clyde.Services.AuthenticatorService; | ||||||
| import ovh.herisson.Clyde.Services.ProtectionService; | import ovh.herisson.Clyde.Services.ProtectionService; | ||||||
|  | import ovh.herisson.Clyde.Tables.Curriculum; | ||||||
| import ovh.herisson.Clyde.Tables.InscriptionRequest; | import ovh.herisson.Clyde.Tables.InscriptionRequest; | ||||||
|  | import ovh.herisson.Clyde.Tables.RequestState; | ||||||
|  |  | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
|  |  | ||||||
| @ -16,7 +21,7 @@ import java.util.Map; | |||||||
| @CrossOrigin(originPatterns = "*", allowCredentials = "true") | @CrossOrigin(originPatterns = "*", allowCredentials = "true") | ||||||
| public class LoginController { | public class LoginController { | ||||||
|     private final AuthenticatorService authServ; |     private final AuthenticatorService authServ; | ||||||
|  |     private final CurriculumRepository curriculumRepository; | ||||||
|     static public class RequestLogin{ |     static public class RequestLogin{ | ||||||
|         private final String identifier; |         private final String identifier; | ||||||
|         private final String password; |         private final String password; | ||||||
| @ -29,8 +34,9 @@ public class LoginController { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public LoginController(AuthenticatorService authServ){ |     public LoginController(AuthenticatorService authServ, CurriculumRepository curriculumRepository){ | ||||||
|         this.authServ = authServ; |         this.authServ = authServ; | ||||||
|  |         this.curriculumRepository = curriculumRepository; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @PostMapping(value = "/login") |     @PostMapping(value = "/login") | ||||||
| @ -48,9 +54,18 @@ public class LoginController { | |||||||
|  |  | ||||||
|     @PostMapping("/register") |     @PostMapping("/register") | ||||||
|     public ResponseEntity<Map<String,Object>> register(@RequestBody InscriptionRequest inscriptionRequest){ |     public ResponseEntity<Map<String,Object>> register(@RequestBody InscriptionRequest inscriptionRequest){ | ||||||
|  |         //We ensure here that if the targeted cursus year is more than first grade then we need the teacher equivalence approval | ||||||
|  |         Curriculum curr = curriculumRepository.findById(inscriptionRequest.getCurriculumId()); | ||||||
|  |  | ||||||
|  |         if (curr.getYear() > 1){ | ||||||
|  |             inscriptionRequest.setEquivalenceState(RequestState.Pending); | ||||||
|  |         }else{ | ||||||
|  |             inscriptionRequest.setEquivalenceState(RequestState.Unrequired); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         InscriptionRequest returnedInscriptionRequest = authServ.register(inscriptionRequest); |         InscriptionRequest returnedInscriptionRequest = authServ.register(inscriptionRequest); | ||||||
|  |  | ||||||
|  |  | ||||||
|         return new ResponseEntity<>(ProtectionService.requestWithoutPassword(returnedInscriptionRequest), HttpStatus.CREATED); |         return new ResponseEntity<>(ProtectionService.requestWithoutPassword(returnedInscriptionRequest), HttpStatus.CREATED); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ public class MockController { | |||||||
|     public final CurriculumCourseService CurriculumCourseService; |     public final CurriculumCourseService CurriculumCourseService; | ||||||
|     public final CurriculumService curriculumService; |     public final CurriculumService curriculumService; | ||||||
|     public final CourseService courseService; |     public final CourseService courseService; | ||||||
|  |     public final ExternalCurriculumRepository externalCurriculumRepository; | ||||||
|     public final InscriptionService inscriptionService; |     public final InscriptionService inscriptionService; | ||||||
|     ArrayList<User> mockUsers; |     ArrayList<User> mockUsers; | ||||||
|  |  | ||||||
| @ -31,13 +31,14 @@ public class MockController { | |||||||
|  |  | ||||||
|     public final ScholarshipRequestRepository scholarshipRequestRepository; |     public final ScholarshipRequestRepository scholarshipRequestRepository; | ||||||
|  |  | ||||||
|     public MockController(UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, InscriptionService inscriptionService, UserCurriculumRepository ucr, MinervalRepository minervalRepository, ScholarshipRequestRepository scholarshipRequestRepository){ |     public MockController(UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, ExternalCurriculumRepository externalCurriculumRepository, InscriptionService inscriptionService, UserCurriculumRepository ucr, MinervalRepository minervalRepository, ScholarshipRequestRepository scholarshipRequestRepository){ | ||||||
|         this.tokenRepo = tokenRepo; |         this.tokenRepo = tokenRepo; | ||||||
|         this.userRepo = userRepo; |         this.userRepo = userRepo; | ||||||
|         this.tokenService = tokenService; |         this.tokenService = tokenService; | ||||||
|         this.CurriculumCourseService = CurriculumCourseService; |         this.CurriculumCourseService = CurriculumCourseService; | ||||||
|         this.curriculumService = curriculumService; |         this.curriculumService = curriculumService; | ||||||
|         this.courseService = courseService; |         this.courseService = courseService; | ||||||
|  |         this.externalCurriculumRepository = externalCurriculumRepository; | ||||||
|         this.inscriptionService = inscriptionService; |         this.inscriptionService = inscriptionService; | ||||||
|         this.ucr = ucr; |         this.ucr = ucr; | ||||||
|         this.minervalRepository = minervalRepository; |         this.minervalRepository = minervalRepository; | ||||||
| @ -114,9 +115,12 @@ 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.Pending,"yes.png","password", null, new Date()); |         InscriptionRequest inscriptionRequest = new InscriptionRequest("helen","prenom","non","helen@gmail.com","america",new Date(),(long) 4,RequestState.Pending,"yes.png","password", null, new Date(), RequestState.Pending); | ||||||
|  |  | ||||||
|         inscriptionService.save(inscriptionRequest); |         inscriptionService.save(inscriptionRequest); | ||||||
|  |  | ||||||
|  |         ExternalCurriculum externalCurriculum = new ExternalCurriculum(inscriptionRequest, "HEH", "Bachelier en informatique", "Completed", 2015, 2018, null, RequestState.Pending); | ||||||
|  |         externalCurriculumRepository.save(externalCurriculum); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -9,4 +9,6 @@ import java.util.ArrayList; | |||||||
|  |  | ||||||
| public interface ExternalCurriculumRepository extends CrudRepository<ExternalCurriculum, Long> { | public interface ExternalCurriculumRepository extends CrudRepository<ExternalCurriculum, Long> { | ||||||
|     ArrayList<ExternalCurriculum> getExternalCurriculumByInscriptionRequest(InscriptionRequest ir); |     ArrayList<ExternalCurriculum> getExternalCurriculumByInscriptionRequest(InscriptionRequest ir); | ||||||
|  |  | ||||||
|  |     ExternalCurriculum getExternalCurriculumById(long id); | ||||||
| } | } | ||||||
|  | |||||||
| @ -47,21 +47,20 @@ public class InscriptionService { | |||||||
|         if (inscrRequest == null) |         if (inscrRequest == null) | ||||||
|             return false; |             return false; | ||||||
|  |  | ||||||
|         // if th state is the same we don't send an email |         inscrRequest.setState(requestState); | ||||||
|         if (requestState == inscrRequest.getState()) |         save(inscrRequest); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         /** todo send an email to tell the poster of the inscrRequest (inscrRequest.getEmail()) |         //saves the user from the request if accepted from teacher and inscription services | ||||||
|          *  to notify them that the state of their request changed |         if (requestState == RequestState.Accepted && (inscrRequest.getEquivalenceState() == RequestState.Accepted || inscrRequest.getEquivalenceState() == RequestState.Unrequired)) | ||||||
|          *  FooEmailFormat toSend = (String.format("Your request state changed from %s to %s"), |  | ||||||
|          *                                              inscrRequest.getState(), requestState) |  | ||||||
|          * FooEmailSender.send(toSend, inscrRequest.getEmail()) |  | ||||||
|          */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         //saves the user from the request if accepted |  | ||||||
|         if (requestState == RequestState.Accepted) |  | ||||||
|         { |         { | ||||||
|  |             return createUser(inscrRequest); | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public boolean createUser(InscriptionRequest inscrRequest){ | ||||||
|  |         //We must send an email here | ||||||
|  |  | ||||||
|         if (curriculumRepo.findById(inscrRequest.getCurriculumId()) == null) |         if (curriculumRepo.findById(inscrRequest.getCurriculumId()) == null) | ||||||
|             return false; |             return false; | ||||||
|  |  | ||||||
| @ -83,12 +82,8 @@ public class InscriptionService { | |||||||
|         Minerval minerval = new Minerval(userFromRequest.getRegNo(), 0, 852, 2023); |         Minerval minerval = new Minerval(userFromRequest.getRegNo(), 0, 852, 2023); | ||||||
|         minervalRepository.save(minerval); |         minervalRepository.save(minerval); | ||||||
|  |  | ||||||
|         } |  | ||||||
|         inscrRequest.setState(requestState); |  | ||||||
|         save(inscrRequest); |  | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void delete(InscriptionRequest toDelete) { |     public void delete(InscriptionRequest toDelete) { | ||||||
|         inscriptionRepo.delete(toDelete); |         inscriptionRepo.delete(toDelete); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -89,6 +89,7 @@ public class ProtectionService { | |||||||
|         toReturn.put("profilePictureUrl", inscriptionRequest.getProfilePicture()); |         toReturn.put("profilePictureUrl", inscriptionRequest.getProfilePicture()); | ||||||
|         toReturn.put("identityCard", inscriptionRequest.getIdentityCard()); |         toReturn.put("identityCard", inscriptionRequest.getIdentityCard()); | ||||||
|         toReturn.put("submissionDate", inscriptionRequest.getSubmissionDate()); |         toReturn.put("submissionDate", inscriptionRequest.getSubmissionDate()); | ||||||
|  |         toReturn.put("equivalenceState", inscriptionRequest.getEquivalenceState()); | ||||||
|         return toReturn; |         return toReturn; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -21,9 +21,10 @@ public class InscriptionRequest { | |||||||
|     private String password; |     private String password; | ||||||
|     private String identityCard; |     private String identityCard; | ||||||
|     private Date submissionDate; |     private Date submissionDate; | ||||||
|  |     private RequestState equivalenceState; | ||||||
|     public InscriptionRequest(){} |     public InscriptionRequest(){} | ||||||
|  |  | ||||||
|     public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate,Long curriculumId, RequestState state, String profilePicture, String password, String identityCard, Date submissionDate){ |     public InscriptionRequest(String lastName, String firstName, String address, String email, String country, Date birthDate,Long curriculumId, RequestState state, String profilePicture, String password, String identityCard, Date submissionDate, RequestState equivalenceState){ | ||||||
|         this.lastName = lastName; |         this.lastName = lastName; | ||||||
|         this.firstName = firstName; |         this.firstName = firstName; | ||||||
|         this.address = address; |         this.address = address; | ||||||
| @ -36,6 +37,7 @@ public class InscriptionRequest { | |||||||
|         this.password = password; |         this.password = password; | ||||||
|         this.identityCard = identityCard; |         this.identityCard = identityCard; | ||||||
|         this.submissionDate = submissionDate; |         this.submissionDate = submissionDate; | ||||||
|  |         this.equivalenceState = equivalenceState; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public int getId() { |     public int getId() { | ||||||
| @ -137,4 +139,12 @@ public class InscriptionRequest { | |||||||
|     public void setSubmissionDate(Date submissionDate) { |     public void setSubmissionDate(Date submissionDate) { | ||||||
|         this.submissionDate = submissionDate; |         this.submissionDate = submissionDate; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public RequestState getEquivalenceState() { | ||||||
|  |         return equivalenceState; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void setEquivalenceState(RequestState equivalenceState) { | ||||||
|  |         this.equivalenceState = equivalenceState; | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -3,5 +3,6 @@ package ovh.herisson.Clyde.Tables; | |||||||
| public enum RequestState { | public enum RequestState { | ||||||
|     Accepted, |     Accepted, | ||||||
|     Refused, |     Refused, | ||||||
|     Pending |     Pending, | ||||||
|  |     Unrequired | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,27 +0,0 @@ | |||||||
| package ovh.herisson.Clyde.Tables; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| import jakarta.persistence.*; |  | ||||||
|  |  | ||||||
| @Entity |  | ||||||
| public class University { |  | ||||||
|     @Id |  | ||||||
|     @GeneratedValue(strategy = GenerationType.AUTO) |  | ||||||
|     private int id; |  | ||||||
|  |  | ||||||
|     private String name; |  | ||||||
|  |  | ||||||
|     public University(){} |  | ||||||
|  |  | ||||||
|     public University(String name){ |  | ||||||
|         this.name = name; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public String getName() { |  | ||||||
|         return name; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public void setName(String name) { |  | ||||||
|         this.name = name; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -1,27 +1,35 @@ | |||||||
| <script setup> | <script setup> | ||||||
| import i18n from "@/i18n.js" | import i18n from "@/i18n.js" | ||||||
| import {getUser} from '../rest/Users.js' | import {getSelf, getUser} from '../rest/Users.js' | ||||||
| import {getcurriculum,getSomeonesCurriculumList} from "@/rest/curriculum.js"; | import {getcurriculum,getSomeonesCurriculumList} from "@/rest/curriculum.js"; | ||||||
| import {getRegisters} from "@/rest/ServiceInscription.js"; | import {getRegisters} from "@/rest/ServiceInscription.js"; | ||||||
| import {get} from "jsdom/lib/jsdom/named-properties-tracker.js"; | import {get} from "jsdom/lib/jsdom/named-properties-tracker.js"; | ||||||
| import {getExternalCurriculumByInscrReq} from "@/rest/externalCurriculum.js"; | import {getExternalCurriculumByInscrReq} from "@/rest/externalCurriculum.js"; | ||||||
|  | import {ref} from "vue"; | ||||||
|  | import ExternalCurriculumList from "@/Apps/ExternalCurriculumList.vue"; | ||||||
|  | import {editEquivalenceState} from "@/rest/requests.js"; | ||||||
|  |  | ||||||
| const props = defineProps(['target']); | const props = defineProps(['target']); | ||||||
| let request = await getRegisters(props.target); | const request = await getRegisters(props.target); | ||||||
| const cursus = await getcurriculum(request.curriculum); | const cursus = await getcurriculum(request.curriculum); | ||||||
|  | const user = await getSelf(); | ||||||
|  | const list = ref(false); | ||||||
| const externalCurriculum = await getExternalCurriculumByInscrReq(request.id) | const externalCurriculum = await getExternalCurriculumByInscrReq(request.id) | ||||||
| console.log(externalCurriculum) |  | ||||||
| function getPP(){ | function getPP(){ | ||||||
|   if(request.profilePictureUrl === null){ |   if(request.profilePictureUrl === null){ | ||||||
|     return "/Clyde.png" |     return "/Clyde.png" | ||||||
|   } |   } | ||||||
|   return request.profilePictureUrl; |   return request.profilePictureUrl; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | async function editEquivalence(id, newstate){ | ||||||
|  |   await editEquivalenceState(id, newstate) | ||||||
|  | } | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
| <template> | <template> | ||||||
|   <div class="body"> |   <div class="body" v-if="list == false"> | ||||||
|     <div class="container"> |     <div class="container"> | ||||||
|       <div class="profilPic"> |       <div class="profilPic"> | ||||||
|         <img class="subContainter" :src=getPP()> |         <img class="subContainter" :src=getPP()> | ||||||
| @ -46,24 +54,20 @@ function getPP(){ | |||||||
|           <div> |           <div> | ||||||
|             Cursus voulu : BAB {{cursus.year}} {{cursus.option}} |             Cursus voulu : BAB {{cursus.year}} {{cursus.option}} | ||||||
|           </div> |           </div> | ||||||
|         </div> |           <div v-if="cursus.year > 1"> | ||||||
|       </div> |             <button style="background-color:rgb(105,05,105);margin-left: 5%" @click="list=!list" v-if="(user.role == 'Teacher' || user.role == 'Admin')&& request.equivalenceState == 'Pending'">See external curriculums</button> | ||||||
|       <div class="moreInfos"> |  | ||||||
|         <div class = "oldcursus"> |  | ||||||
|           <div class="listTitle"> |  | ||||||
|             Cursus extérieurs a l'univesité |  | ||||||
|           </div> |  | ||||||
|           <div  class="listElement"> |  | ||||||
|             <div class=" containerElement" v-for="item in externalCurriculum"> |  | ||||||
|               <div class="formation">item.formation</div> |  | ||||||
|               <div class="school">item.school</div> |  | ||||||
|           </div> |           </div> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
|  |   <div v-if="list==true"> | ||||||
|  |     <ExternalCurriculumList :ext-curr-list="externalCurriculum" :inscr-req-id="request.id"></ExternalCurriculumList> | ||||||
|  |     <div> | ||||||
|  |       <button @click="editEquivalence(request.id, 'Accepted'); request.equivalenceState='Accepted'">Accept Equivalence</button> | ||||||
|  |       <button @click="editEquivalence(request.id, 'Refused'); request.equivalenceState='Refused'">Refuse Equivalence</button> | ||||||
|  |     </div> | ||||||
|   </div> |   </div> | ||||||
|  |  | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  |  | ||||||
| @ -117,50 +121,6 @@ function getPP(){ | |||||||
|   border-radius:20px; |   border-radius:20px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .moreInfos { |  | ||||||
|   display:grid; |  | ||||||
|   grid-template-rows:200px auto; |  | ||||||
|   column-gap:50px; |  | ||||||
|   row-gap:45px; |  | ||||||
|   grid-template-areas: |  | ||||||
|   "minfos minfos"; |  | ||||||
|   grid-template-columns:600px 600px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .listTitle{ |  | ||||||
|   display: flex; |  | ||||||
|   justify-content: center; |  | ||||||
|   align-items: center; |  | ||||||
|   width:250px; |  | ||||||
|   margin-left:auto; |  | ||||||
|   margin-right:auto; |  | ||||||
|   border:2px solid black; |  | ||||||
|   font-size:25px; |  | ||||||
|   color:white; |  | ||||||
|   padding:20px; |  | ||||||
|   background-color:rgb(50,50,50); |  | ||||||
|   border-radius:20px;margin-bottom:10px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .listElement{ |  | ||||||
|   border:2px solid black; |  | ||||||
|   font-size:25px; |  | ||||||
|   color:white; |  | ||||||
|   padding:20px; |  | ||||||
|   background-color:rgb(50,50,50); |  | ||||||
|   border-radius:20px; |  | ||||||
|   margin-bottom:10px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .containerElement{ |  | ||||||
|   justify-content:center; |  | ||||||
|   display:grid; |  | ||||||
|   grid-template-columns:100px 100px 300px; |  | ||||||
|   grid-template-areas: |  | ||||||
|     "year option dateyear"; |  | ||||||
|   column-gap:40px; |  | ||||||
|   padding-left: 25px; |  | ||||||
| } |  | ||||||
| button{ | button{ | ||||||
|   font-size:15px; |   font-size:15px; | ||||||
|   height:50px; |   height:50px; | ||||||
| @ -169,42 +129,4 @@ button{ | |||||||
|   border-radius:20px; |   border-radius:20px; | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| .moreInfos { |  | ||||||
|   display:grid; |  | ||||||
|   grid-template-rows:200px auto; |  | ||||||
|   column-gap:50px; |  | ||||||
|   row-gap:45px; |  | ||||||
|   grid-template-areas: |  | ||||||
|   "minfos minfos"; |  | ||||||
|   grid-template-columns:600px 600px; |  | ||||||
|   align-items:center; |  | ||||||
|   justify-content:center; |  | ||||||
|   margin-left: 320%; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .listTitle{ |  | ||||||
|   display: flex; |  | ||||||
|   justify-content: center; |  | ||||||
|   align-items: center; |  | ||||||
|   width:250px; |  | ||||||
|   margin-left:auto; |  | ||||||
|   margin-right:auto; |  | ||||||
|   border:2px solid black; |  | ||||||
|   font-size:25px; |  | ||||||
|   color:white; |  | ||||||
|   padding:20px; |  | ||||||
|   background-color:rgb(50,50,50); |  | ||||||
|   border-radius:20px;margin-bottom:10px; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .listElement{ |  | ||||||
|   border:2px solid black; |  | ||||||
|   font-size:25px; |  | ||||||
|   color:white; |  | ||||||
|   padding:20px; |  | ||||||
|   background-color:rgb(50,50,50); |  | ||||||
|   border-radius:20px; |  | ||||||
|   margin-bottom:10px; |  | ||||||
| } |  | ||||||
| </style> | </style> | ||||||
							
								
								
									
										103
									
								
								frontend/src/Apps/ExternalCurriculumList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								frontend/src/Apps/ExternalCurriculumList.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | |||||||
|  | <script setup> | ||||||
|  |   import i18n from "@/i18n.js"; | ||||||
|  |   import {editExternalCurriculum} from "@/rest/externalCurriculum.js"; | ||||||
|  |   import {ref} from "vue"; | ||||||
|  |   import {editEquivalenceState} from "@/rest/requests.js"; | ||||||
|  |  | ||||||
|  |   const props = defineProps(["extCurrList","inscrReqId"]) | ||||||
|  |  | ||||||
|  |   const extCurrList = ref(props.extCurrList) | ||||||
|  |  | ||||||
|  | </script> | ||||||
|  |  | ||||||
|  | <template style="margin-top:5%;"> | ||||||
|  |   <div style="display:flex; justify-content:center; " v-for="item in extCurrList"> | ||||||
|  |     <div class="bodu"> | ||||||
|  |       <div class="container"> | ||||||
|  |         <div class="status"><a style="margin-left:30px">{{item.state}}</a></div> | ||||||
|  |         <div class="school"><a>{{item.school}}</a></div> | ||||||
|  |         <div class="formation"><a>{{item.formation}}</a></div> | ||||||
|  |         <div class="completion"><a>{{item.completion}}</a></div> | ||||||
|  |         <div class="download"><button>Download document</button></div> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <style scoped> | ||||||
|  | .container{ | ||||||
|  |   color:white; | ||||||
|  |   height:100px; | ||||||
|  |   font-size:30px; | ||||||
|  |   display:grid; | ||||||
|  |   grid-template-columns:15% 10% 20% 15% 13.1%; | ||||||
|  |   grid-template-areas: | ||||||
|  |     "status school formation completion download"; | ||||||
|  |   column-gap:10px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .status { | ||||||
|  |   grid-area:status; | ||||||
|  |   align-self:center; | ||||||
|  |   font-size: 70%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .school{ | ||||||
|  |   grid-area:school; | ||||||
|  |   align-self:center; | ||||||
|  |   font-size: 70%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .formation{ | ||||||
|  |   grid-area:formation; | ||||||
|  |   align-self:center; | ||||||
|  |   font-size: 70%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .completion{ | ||||||
|  |   grid-area:completion; | ||||||
|  |   align-self:center; | ||||||
|  |   white-space: nowrap; | ||||||
|  |   overflow: hidden; | ||||||
|  |   text-overflow:ellipsis; | ||||||
|  |   font-size: 70%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .accept{ | ||||||
|  |   grid-area:accept; | ||||||
|  |   align-self:center; | ||||||
|  |   white-space: nowrap; | ||||||
|  |   overflow: hidden; | ||||||
|  |   text-overflow:ellipsis; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .refuse{ | ||||||
|  |   grid-area: refuse; | ||||||
|  |   align-self:center; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .download{ | ||||||
|  |   grid-area: download; | ||||||
|  |   align-self:center; | ||||||
|  | } | ||||||
|  | button{ | ||||||
|  |   font-size:15px; | ||||||
|  |   height:50px; | ||||||
|  |   width:75%; | ||||||
|  |   border:none; | ||||||
|  |   border-radius:20px; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .bodu { | ||||||
|  |   margin-top:2%; | ||||||
|  |   width:66%; | ||||||
|  |   border:2px solid black; | ||||||
|  |   border-radius:9px; | ||||||
|  |   background-color:rgb(50,50,50); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | </style> | ||||||
|  |  | ||||||
| @ -16,9 +16,7 @@ | |||||||
|  |  | ||||||
|   async function upPage(id,review){ |   async function upPage(id,review){ | ||||||
|     await validateRegister(id,review); |     await validateRegister(id,review); | ||||||
|     if (review == "Accepted"){ |  | ||||||
|  |  | ||||||
|     } |  | ||||||
|     requests.value = await getAllRegisters(); |     requests.value = await getAllRegisters(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @ -40,7 +38,7 @@ | |||||||
| <template> | <template> | ||||||
|   <div v-if="windowsState === 1"> |   <div v-if="windowsState === 1"> | ||||||
|     <AboutRequest :target="targetId"></AboutRequest> |     <AboutRequest :target="targetId"></AboutRequest> | ||||||
|     <button style="background-color:rgb(105,05,105);margin-left: 30%" @click="windowsState=0;">Retour</button> |     <button style="background-color:rgb(105,05,105);margin-left: 30%; margin-top: 5%" @click="windowsState=0;loadRequests()">Retour</button> | ||||||
|   </div> |   </div> | ||||||
|   <div v-if="windowsState === 0"> |   <div v-if="windowsState === 0"> | ||||||
|     <div style="margin-top: 2%;margin-left: 2%"> |     <div style="margin-top: 2%;margin-left: 2%"> | ||||||
| @ -61,15 +59,16 @@ | |||||||
|       </span> |       </span> | ||||||
|     </div> |     </div> | ||||||
|     <div style='display:flex; justify-content:center; min-width:1140px;' v-for="item of requests"> |     <div style='display:flex; justify-content:center; min-width:1140px;' v-for="item of requests"> | ||||||
|       <div class="bodu" v-if="filterType == 'None' || filterType == item.state"> |       <div class="bodu" style="width: 95%" v-if="filterType == 'None' || filterType == item.state"> | ||||||
|         <div class="container" style="grid-template-columns:15% 15% 10% 14.2% 14.2% 14.2% 14.2%;grid-template-areas:'date state surname firstname accept refuse infos';" v-if="requestType === 'inscription'"> |         <div class="container" style="grid-template-columns:11% 15% 20% 10% 10% 9% 9%;grid-template-areas:'date state equivalencestate surname firstname accept refuse infos';" v-if="requestType === 'inscription'"> | ||||||
|           <!-- |           <!-- | ||||||
|             The condition below avoids an error occuring because loadRequests() finishes after the vue refresh |             The condition below avoids an error occuring because loadRequests() finishes after the vue refresh | ||||||
|             then submissionDate is undefined an it triggers an error in the console despite the fact that it is working |             then submissionDate is undefined an it triggers an error in the console despite the fact that it is working | ||||||
|             properly at the end. |             properly at the end. | ||||||
|            --> |            --> | ||||||
|           <div class="date" v-if="item.submissionDate !== undefined">{{item.submissionDate.slice(0, 10)}}</div> |           <div class="date" v-if="item.submissionDate !== undefined">{{item.submissionDate.slice(0, 10)}}</div> | ||||||
|           <div class="state">{{item.state}}</div> |           <div class="state" style="font-size: 80%">Approval : {{item.state}}</div> | ||||||
|  |           <div class="equivalencestate" style="font-size: 80%">Teacher approval : {{item.equivalenceState}}</div> | ||||||
|           <div class="surname">{{item.lastName}}</div> |           <div class="surname">{{item.lastName}}</div> | ||||||
|           <div class="firstname">{{item.firstName}}</div> |           <div class="firstname">{{item.firstName}}</div> | ||||||
|           <div class="accept" v-if="item.state === 'Pending'"><button @click="windowsState=2;targetId=item.id;" style="background-color:rgb(0,105,50);">{{i18n("request.accept")}}</button></div> |           <div class="accept" v-if="item.state === 'Pending'"><button @click="windowsState=2;targetId=item.id;" style="background-color:rgb(0,105,50);">{{i18n("request.accept")}}</button></div> | ||||||
| @ -110,6 +109,10 @@ | |||||||
|     column-gap:10px; |     column-gap:10px; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   .equivalencestate{ | ||||||
|  |     grid-area: equivalencestate; | ||||||
|  |     align-self: center; | ||||||
|  |   } | ||||||
|   .studentfirstname{ |   .studentfirstname{ | ||||||
|     grid-area: studentfirstname; |     grid-area: studentfirstname; | ||||||
|     align-self: center; |     align-self: center; | ||||||
|  | |||||||
| @ -20,6 +20,7 @@ | |||||||
|     address:null, |     address:null, | ||||||
|     country:null, |     country:null, | ||||||
|     curriculum:null, |     curriculum:null, | ||||||
|  |     equivalenceState: "Unrequired" | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   const notcompletedCheck = ref(false); |   const notcompletedCheck = ref(false); | ||||||
| @ -76,18 +77,12 @@ | |||||||
|   //This functions makes the distinction between a master cursus (year 4 or more) and a bachelor cursus (year 3 or less) |   //This functions makes the distinction between a master cursus (year 4 or more) and a bachelor cursus (year 3 or less) | ||||||
|   function getCursusDisplay(cursus){ |   function getCursusDisplay(cursus){ | ||||||
|     if (cursus.year <= 3){ |     if (cursus.year <= 3){ | ||||||
|       return cursus.curriculumId + " BAB " + cursus.year + " " + cursus.option; |       return "BAB " + cursus.year + " " + cursus.option; | ||||||
|     }else{ |     }else{ | ||||||
|       return cursus.curriculumId + " MA" + (parseInt(cursus.year)-3).toString() + " " + cursus.option; |       return "MA" + (parseInt(cursus.year)-3).toString() + " " + cursus.option; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   //This function return the id of a decorated cursus (decorated by the function up) |  | ||||||
|   function parseDecoratedCursus(cursus){ |  | ||||||
|     let id = cursus.substring(0, cursus.indexOf(" ")+1); |  | ||||||
|     return id; |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   async function getCurriculumYear(curriculumId){ |   async function getCurriculumYear(curriculumId){ | ||||||
|     const curriculum = await getcurriculum(curriculumId); |     const curriculum = await getcurriculum(curriculumId); | ||||||
|     return parseInt(curriculum.year); |     return parseInt(curriculum.year); | ||||||
| @ -97,7 +92,7 @@ | |||||||
|  |  | ||||||
|   //Post the register request and return the id of the newly created request and also post the external curriculum list in the database |   //Post the register request and return the id of the newly created request and also post the external curriculum list in the database | ||||||
|   async function postRegisterReq(){ |   async function postRegisterReq(){ | ||||||
|     const val = await register(outputs.firstname, outputs.surname, outputs.birthday, outputs.password, outputs.email, outputs.address, outputs.country, parseDecoratedCursus(outputs.curriculum), ppData, null, new Date()); |     const val = await register(outputs.firstname, outputs.surname, outputs.birthday, outputs.password, outputs.email, outputs.address, outputs.country, outputs.curriculum, ppData, null, new Date(), outputs.equivalenceState); | ||||||
|     for (let item in externalCurrTab.value){ |     for (let item in externalCurrTab.value){ | ||||||
|       await createExternalCurriculum(val.id, externalCurrTab.value[item].school, externalCurrTab.value[item].formation, externalCurrTab.value[item].completion, externalCurrTab.value[item].startYear, externalCurrTab.value[item].endYear, externalCurrTab.value[item].justifdocUrl); |       await createExternalCurriculum(val.id, externalCurrTab.value[item].school, externalCurrTab.value[item].formation, externalCurrTab.value[item].completion, externalCurrTab.value[item].startYear, externalCurrTab.value[item].endYear, externalCurrTab.value[item].justifdocUrl); | ||||||
|     } |     } | ||||||
| @ -198,7 +193,7 @@ | |||||||
|               <div class="inputBox"> |               <div class="inputBox"> | ||||||
|                 <p>{{i18n("Curriculum").toUpperCase()}}</p>  |                 <p>{{i18n("Curriculum").toUpperCase()}}</p>  | ||||||
|                   <select v-model="outputs.curriculum"> |                   <select v-model="outputs.curriculum"> | ||||||
|                     <option v-for="item in curricula">{{getCursusDisplay(item)}}</option> |                     <option v-for="item in curricula" :value="item.curriculumId">{{getCursusDisplay(item)}}</option> | ||||||
|                   </select> |                   </select> | ||||||
|               </div> |               </div> | ||||||
|               <p style="color:rgb(239,60,168);"> |               <p style="color:rgb(239,60,168);"> | ||||||
|  | |||||||
| @ -43,3 +43,4 @@ export async function getAllRegisters(){ | |||||||
| export async function validateRegister(id, state){ | export async function validateRegister(id, state){ | ||||||
|   return restPatch("/request/register/" + id, state); |   return restPatch("/request/register/" + id, state); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -26,7 +26,7 @@ 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, curriculumId, imageId, identityCardId, submissionDate){ | export async function register(firstname, lastname, birthDate, password, email, address, country, curriculumId, imageId, identityCardId, submissionDate, equivalence){ | ||||||
| 	return restPost("/register", { | 	return restPost("/register", { | ||||||
| 		firstName: firstname, | 		firstName: firstname, | ||||||
| 		lastName: lastname, | 		lastName: lastname, | ||||||
| @ -38,7 +38,8 @@ export async function register(firstname, lastname, birthDate, password, email, | |||||||
| 		curriculumId: curriculumId, | 		curriculumId: curriculumId, | ||||||
|     	profilePicture: imageId, |     	profilePicture: imageId, | ||||||
| 		identityCard : identityCardId, | 		identityCard : identityCardId, | ||||||
| 		submissionDate : submissionDate | 		submissionDate : submissionDate, | ||||||
|  | 		equivalenceState : equivalence | ||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import {restGet, restPost} from "@/rest/restConsumer.js"; | import {restGet, restPatch, restPost} from "@/rest/restConsumer.js"; | ||||||
| import {parseInteger} from "jsdom/lib/jsdom/living/helpers/strings.js"; | import {parseInteger} from "jsdom/lib/jsdom/living/helpers/strings.js"; | ||||||
|  |  | ||||||
| export async function createExternalCurriculum(inscriptionRequestId,school, formation, completion, startYear, endYear, justifdocUrl){ | export async function createExternalCurriculum(inscriptionRequestId,school, formation, completion, startYear, endYear, justifdocUrl){ | ||||||
| @ -14,5 +14,9 @@ export async function createExternalCurriculum(inscriptionRequestId,school, form | |||||||
| } | } | ||||||
|  |  | ||||||
| export async function getExternalCurriculumByInscrReq(inscrReqId){ | export async function getExternalCurriculumByInscrReq(inscrReqId){ | ||||||
|     return restGet("/externalcurriculum/"+inscrReqId); |     return restGet("/externalcurriculum/"+inscrReqId) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | export async function editExternalCurriculum(extReqId, newState){ | ||||||
|  |     return restPatch("/externalcurriculum/"+extReqId+"/"+newState) | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import {restGet, restPost} from "@/rest/restConsumer.js"; | import {restGet, restPatch, restPost} from "@/rest/restConsumer.js"; | ||||||
|  |  | ||||||
| export async function createExemptionsRequest(exempReq){ | export async function createExemptionsRequest(exempReq){ | ||||||
|     return restPost("/exemptionreq", exempReq) |     return restPost("/exemptionreq", exempReq) | ||||||
| @ -15,3 +15,7 @@ export async function getAllScholarShipsRequest(){ | |||||||
| export async function getAllExemptionsRequest(){ | export async function getAllExemptionsRequest(){ | ||||||
|     return restGet("/exemptionsreq") |     return restGet("/exemptionsreq") | ||||||
| } | } | ||||||
|  |  | ||||||
|  | export async function editEquivalenceState(id, newstate){ | ||||||
|  |     return restPatch("/request/registerequiv/"+id+"/"+newstate) | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user