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:
parent
34c0a2bfe8
commit
4199663d64
@ -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)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user