Merge pull request 'Merge Schedule Extension to Master' (#168) from Wal/Clyde:master into master
Reviewed-on: PGL/Clyde#168
This commit is contained in:
commit
ca10084400
@ -47,6 +47,7 @@ public class ApplicationsController {
|
||||
|
||||
//if unAuthed
|
||||
authorizedApps.add(Applications.Login);
|
||||
authorizedApps.add(Applications.Schedule);
|
||||
|
||||
User user = authServ.getUserFromToken(token);
|
||||
if(user == null)
|
||||
@ -60,6 +61,8 @@ public class ApplicationsController {
|
||||
authorizedApps.add(Applications.Rdv);
|
||||
}
|
||||
|
||||
if(!authServ.isNotIn(new Role[]{Role.Teacher,Role.Admin},token))
|
||||
authorizedApps.add(Applications.ManageOwnedLessons);
|
||||
//if Teacher or Secretary or Admin add ManageCourses App
|
||||
if (!authServ.isNotIn(new Role[]{Role.Teacher,Role.Secretary,Role.Admin},token))
|
||||
authorizedApps.add(Applications.ManageCourses);
|
||||
@ -69,7 +72,9 @@ public class ApplicationsController {
|
||||
authorizedApps.add(Applications.StudentsList);}
|
||||
|
||||
if (!authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token)){
|
||||
authorizedApps.add(Applications.UsersList);}
|
||||
authorizedApps.add(Applications.UsersList);
|
||||
authorizedApps.add(Applications.ManageSchedules);
|
||||
authorizedApps.add(Applications.LessonRequests);}
|
||||
|
||||
if (!authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin, Role.InscriptionService},token)){
|
||||
authorizedApps.add(Applications.Payments);}
|
||||
|
@ -86,11 +86,8 @@ public class CourseController {
|
||||
public ResponseEntity<Map<String ,Object>> postCourse(@RequestHeader("Authorization") String token,
|
||||
@RequestBody Course course)
|
||||
{
|
||||
System.out.println(course);
|
||||
System.out.println(token);
|
||||
if (authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
|
||||
Course createdCourse = courseServ.save(course);
|
||||
if (createdCourse == null)
|
||||
return new ResponseEntity<>(null,HttpStatus.BAD_REQUEST);
|
||||
|
@ -0,0 +1,129 @@
|
||||
package ovh.herisson.Clyde.EndPoints;
|
||||
|
||||
/******************************************************
|
||||
* @file LessonController.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
*
|
||||
* Controller of Lessons API
|
||||
******************************************************/
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ovh.herisson.Clyde.Responses.UnauthorizedResponse;
|
||||
import ovh.herisson.Clyde.Services.AuthenticatorService;
|
||||
import ovh.herisson.Clyde.Services.LessonService;
|
||||
import ovh.herisson.Clyde.Services.ProtectionService;
|
||||
import ovh.herisson.Clyde.Services.ScheduleLessonService;
|
||||
import ovh.herisson.Clyde.Tables.Lesson;
|
||||
import ovh.herisson.Clyde.Tables.Role;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@CrossOrigin(originPatterns = "*", allowCredentials = "true")
|
||||
public class LessonController {
|
||||
private final LessonService lessonServ;
|
||||
|
||||
private final ScheduleLessonService scheduleLessonServ;
|
||||
private final AuthenticatorService authServ;
|
||||
|
||||
public LessonController(LessonService lessonServ, ScheduleLessonService scheduleLessonService, AuthenticatorService authServ) {
|
||||
this.lessonServ = lessonServ;
|
||||
this.scheduleLessonServ = scheduleLessonService;
|
||||
this.authServ = authServ;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a lesson via its id
|
||||
*/
|
||||
@GetMapping("/lesson/{id}")
|
||||
public ResponseEntity<HashMap<String,Object>> getLesson(@PathVariable long id){
|
||||
Lesson lesson = lessonServ.findById(id);
|
||||
|
||||
if(lesson == null)
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
|
||||
return new ResponseEntity<>(ProtectionService.lessonWithoutPassword(lesson),HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all the lessons
|
||||
*/
|
||||
@GetMapping("/lessons")
|
||||
public ResponseEntity<Iterable<HashMap<String,Object>>> getAllLessons(@RequestHeader("Authorization") String token){
|
||||
if(authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
return new ResponseEntity<>(ProtectionService.lessonsWithoutPassword(lessonServ.findAll()),HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return all the lessons of a teacher's courses
|
||||
*/
|
||||
@GetMapping("/lessons/owned")
|
||||
public ResponseEntity<Iterable<HashMap<String,Object>>> getOwnedLessons(@RequestHeader("Authorization") String token){
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher},token)){
|
||||
return new UnauthorizedResponse<>(null);}
|
||||
return new ResponseEntity<>(ProtectionService.lessonsWithoutPassword(lessonServ.findAllOwnedLesson(authServ.getUserFromToken(token))),HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
⋅* Return all the lessons of a student
|
||||
*/
|
||||
@GetMapping("/lessons/OwnCurriculum")
|
||||
public ResponseEntity<Iterable<HashMap<String,Object>>> getOnesLessons(@RequestHeader("Authorization") String token){
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Student},token)){
|
||||
return new UnauthorizedResponse<>(null);}
|
||||
return new ResponseEntity<>(ProtectionService.lessonsWithoutPassword(lessonServ.findOnesLessons(authServ.getUserFromToken(token))),HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Post a new lesson
|
||||
*/
|
||||
@PostMapping("/lesson")
|
||||
public ResponseEntity<HashMap<String, Object>> postLesson(@RequestHeader("Authorization") String token,
|
||||
@RequestBody Map<String, Object> lessonInfos){
|
||||
if(authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
|
||||
|
||||
Lesson lesson = lessonServ.createLesson(lessonInfos);
|
||||
Lesson createdLesson = lessonServ.save(lesson);
|
||||
scheduleLessonServ.saveToAllSchedule(lesson);
|
||||
|
||||
if(createdLesson==null)
|
||||
return new ResponseEntity<>(null,HttpStatus.BAD_REQUEST);
|
||||
return new ResponseEntity<>(ProtectionService.lessonWithoutPassword(createdLesson), HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Modify a lesson
|
||||
*/
|
||||
@PatchMapping("/lesson/{id}")
|
||||
public ResponseEntity<Lesson> patchLesson(@RequestHeader("Authorization") String token,
|
||||
@RequestBody Map<String, Object> updates,
|
||||
@PathVariable long id){
|
||||
if(authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
if(!lessonServ.modifyData(id, updates)){
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Delete a lesson
|
||||
*/
|
||||
@DeleteMapping("lesson/{id}")
|
||||
public ResponseEntity<String> deleteLesson(@RequestHeader("Authorization") String token,
|
||||
@PathVariable Long id){
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
Lesson toDelete = lessonServ.findById(id);
|
||||
if(toDelete == null)
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
lessonServ.delete(toDelete);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,150 @@
|
||||
package ovh.herisson.Clyde.EndPoints;
|
||||
|
||||
/******************************************************
|
||||
* @file LessonRequestsController.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
*
|
||||
* Controller of lesson requests API
|
||||
******************************************************/
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ovh.herisson.Clyde.Responses.UnauthorizedResponse;
|
||||
import ovh.herisson.Clyde.Services.AuthenticatorService;
|
||||
import ovh.herisson.Clyde.Services.LessonRequestService;
|
||||
import ovh.herisson.Clyde.Services.LessonService;
|
||||
import ovh.herisson.Clyde.Services.ProtectionService;
|
||||
import ovh.herisson.Clyde.Tables.LessonChangesRequest;
|
||||
import ovh.herisson.Clyde.Tables.RequestState;
|
||||
import ovh.herisson.Clyde.Tables.Role;
|
||||
import ovh.herisson.Clyde.Tables.User;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@CrossOrigin(originPatterns = "*", allowCredentials = "true")
|
||||
public class LessonRequestsController {
|
||||
private final LessonRequestService lessonRequestServ;
|
||||
private final AuthenticatorService authServ;
|
||||
|
||||
private final LessonService lessonServ;
|
||||
public LessonRequestsController(LessonRequestService lessonRequestServer, AuthenticatorService authServ, LessonService lessonServ) {
|
||||
this.lessonRequestServ = lessonRequestServer;
|
||||
this.authServ = authServ;
|
||||
this.lessonServ = lessonServ;
|
||||
}
|
||||
/**
|
||||
* Return a lesson request via its id
|
||||
*/
|
||||
@GetMapping("/requests/lessonRequest/{id}")
|
||||
public ResponseEntity<Map<String,Object>> getById(@RequestHeader("Authorization") String token, @PathVariable long id){
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
|
||||
LessonChangesRequest lessonRequest= lessonRequestServ.findById(id);
|
||||
|
||||
return new ResponseEntity<>(ProtectionService.lessonRequestWithoutPassword(lessonRequest), HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* return all the requests made by a user
|
||||
*/
|
||||
@GetMapping("/requests/lessonRequests/owned")
|
||||
public ResponseEntity<Iterable<Map<String, Object>>> getOwnedRequests(@RequestHeader("Authorization") String token){
|
||||
if(authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
User user = authServ.getUserFromToken(token);
|
||||
Iterable<LessonChangesRequest> lessonChangesRequests = lessonRequestServ.findOwnRequests(user);
|
||||
return new ResponseEntity<>(ProtectionService.lessonRequestsWithoutPassword(lessonChangesRequests),HttpStatus.OK);
|
||||
|
||||
}
|
||||
/**
|
||||
* Return all the lesson requests
|
||||
*/
|
||||
@GetMapping("/requests/lessonRequests")
|
||||
public ResponseEntity<Iterable<Map<String,Object>>> getAllRequests(@RequestHeader("Authorization") String token){
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
|
||||
Iterable<LessonChangesRequest> lessonRequests= lessonRequestServ.getAll();
|
||||
|
||||
return new ResponseEntity<>(ProtectionService.lessonRequestsWithoutPassword(lessonRequests), HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Post a lesson request
|
||||
*/
|
||||
@PostMapping("/requests/lessonRequest")
|
||||
public ResponseEntity<Map<String, Object>> makeRequest(@RequestHeader("Authorization") String token, @RequestBody Map<String,Object> lessonRequestInfos){
|
||||
if(authServ.isNotIn(new Role[]{Role.Admin,Role.Teacher},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
LessonChangesRequest lessonChangesRequest = lessonRequestServ.createLessonRequest(lessonRequestInfos);
|
||||
LessonChangesRequest createdRequest = lessonRequestServ.save(lessonChangesRequest);
|
||||
if(createdRequest == null)
|
||||
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
|
||||
return new ResponseEntity<>(ProtectionService.lessonRequestWithoutPassword(lessonChangesRequest),HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Modify a lesson Request
|
||||
*/
|
||||
@PatchMapping("/requests/lessonRequest/{id}")
|
||||
public ResponseEntity<LessonChangesRequest> changeRequestState(@PathVariable long id,
|
||||
@RequestHeader("Authorization") String token,
|
||||
@RequestBody Map<String , Object> infos){
|
||||
if(authServ.isNotIn(new Role[]{Role.Secretary,Role.Admin},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
|
||||
LessonChangesRequest lessonRequest = lessonRequestServ.findById(id);
|
||||
String local = "";
|
||||
RequestState state = null;
|
||||
for (Map.Entry<String, Object> entry : infos.entrySet()) {
|
||||
switch (entry.getKey()) {
|
||||
case "local":
|
||||
local = (String) entry.getValue();
|
||||
break;
|
||||
case "state":
|
||||
state = RequestState.valueOf((String)entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
if (state == null)
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
|
||||
if(lessonRequest.getRequestType() == 0 ) {
|
||||
if (!lessonRequestServ.modifyCreateRequestState(lessonRequest, state, local))
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
else if(lessonRequest.getRequestType() == 1){
|
||||
infos.put("lessonStart", lessonRequest.getLessonStart());
|
||||
infos.put("lessonEnd", lessonRequest.getLessonEnd());
|
||||
infos.put("lessonType",lessonRequest.getLessonType());
|
||||
if(!lessonRequestServ.modifyChangeRequestState(infos,lessonRequest.getLessonId(),state))
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
lessonRequest.setState(state);
|
||||
}
|
||||
|
||||
else{
|
||||
lessonRequestServ.modifyDeleteRequest(lessonRequest, state);
|
||||
lessonRequest.setState(state);
|
||||
|
||||
}
|
||||
lessonRequestServ.save(lessonRequest);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a lesson request
|
||||
*/
|
||||
@DeleteMapping("/requests/lessonRequest/{id}")
|
||||
public ResponseEntity<String> deleteRequest(@RequestHeader("Authorization") String token, @PathVariable long id){
|
||||
if(authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary,Role.Teacher},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
LessonChangesRequest lessonChangesRequest = lessonRequestServ.findById(id);
|
||||
if (lessonChangesRequest == null)
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
lessonRequestServ.delete(lessonChangesRequest);
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
}
|
@ -30,6 +30,12 @@ public class MockController {
|
||||
public final CourseService courseService;
|
||||
public final ExternalCurriculumRepository externalCurriculumRepository;
|
||||
public final InscriptionService inscriptionService;
|
||||
|
||||
public final LessonService lessonService;
|
||||
public final ScheduleService scheduleService;
|
||||
public final ScheduleLessonService scheduleLessonService;
|
||||
|
||||
public final LessonRequestService lessonRequestService;
|
||||
ArrayList<User> mockUsers;
|
||||
|
||||
public final UserCurriculumRepository ucr;
|
||||
@ -39,7 +45,7 @@ public class MockController {
|
||||
public final ScholarshipRequestRepository scholarshipRequestRepository;
|
||||
|
||||
public final UnregisterRequestRepository uninscriptionRequestRepository;
|
||||
public MockController(UserService userService, UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, ExternalCurriculumRepository externalCurriculumRepository, InscriptionService inscriptionService, UserCurriculumRepository ucr, MinervalRepository minervalRepository, ScholarshipRequestRepository scholarshipRequestRepository, UnregisterRequestRepository unregisterRequestRepository){
|
||||
public MockController(UserService userService, UserRepository userRepo, TokenRepository tokenRepo, TokenService tokenService, CurriculumCourseService CurriculumCourseService, CurriculumService curriculumService, CourseService courseService, ExternalCurriculumRepository externalCurriculumRepository, InscriptionService inscriptionService, UserCurriculumRepository ucr, MinervalRepository minervalRepository, ScholarshipRequestRepository scholarshipRequestRepository, UnregisterRequestRepository unregisterRequestRepository, LessonService lessonService, ScheduleService scheduleService, ScheduleLessonService scheduleLessonService, LessonRequestService lessonRequestService){
|
||||
this.userService = userService;
|
||||
this.tokenRepo = tokenRepo;
|
||||
this.userRepo = userRepo;
|
||||
@ -49,6 +55,10 @@ public class MockController {
|
||||
this.courseService = courseService;
|
||||
this.externalCurriculumRepository = externalCurriculumRepository;
|
||||
this.inscriptionService = inscriptionService;
|
||||
this.lessonService = lessonService;
|
||||
this.scheduleService = scheduleService;
|
||||
this.scheduleLessonService = scheduleLessonService;
|
||||
this.lessonRequestService = lessonRequestService;
|
||||
this.ucr = ucr;
|
||||
this.minervalRepository = minervalRepository;
|
||||
this.scholarshipRequestRepository = scholarshipRequestRepository;
|
||||
@ -135,6 +145,50 @@ public class MockController {
|
||||
|
||||
inscriptionService.save(inscriptionRequest);
|
||||
|
||||
|
||||
//Schedule part
|
||||
|
||||
Lesson lesson_0_progra1 = new Lesson(progra1, "Mon Apr 22 2024 08:15", "Mon Apr 22 2024 10:15","rgb(0,50,100)","A0B2","Course");
|
||||
Lesson lesson_0_chemistry1 = new Lesson(chemistry1, "Wed Mar 27 2024 08:15", "Wed Mar 27 2024 09:15","rgb(100,50,0)","A0B2","TP");
|
||||
Lesson lesson_0_psycho1 = new Lesson(psycho1, "Sun Mar 24 2024 10:30 ","Sun Mar 24 2024 12:30 ","rgb(100,50,100)", "A0B2","TD");
|
||||
Lesson lesson_1_progra1 = new Lesson(progra1, "Mon Apr 02 2024 13:30", "Mon Apr 02 2024 15:30","rgb(0,50,100)","A0B2","TP");
|
||||
Lesson lesson_0_commun = new Lesson(commun, "Mon Apr 01 2024 10:30", "Mon Apr 01 2024 12:30","rgb(0,50,100)","A0B2","Course");
|
||||
|
||||
LessonChangesRequest request1 = new LessonChangesRequest(joke,RequestState.Pending,null,null,null,null,2,null,1);
|
||||
LessonChangesRequest request2 = new LessonChangesRequest(joke,RequestState.Pending,"Fri Apr 19 2024 10:30 ","Fri Apr 19 2024 12:30 ",null,null,1,null,2);
|
||||
LessonChangesRequest request3 = new LessonChangesRequest(joke,RequestState.Pending,"Fri Apr 19 2024 13:30 ","Fri Apr 19 2024 15:30 ","Course",progra1,0,"rgb(27,49,100)",4);
|
||||
|
||||
|
||||
Schedule infoBab1Schedule = new Schedule(infoBab1);
|
||||
Schedule chemistryBab1Schedule = new Schedule(chemistryBab1);
|
||||
Schedule psychoBab1Schedule = new Schedule(psychologyBab1);
|
||||
|
||||
|
||||
scheduleService.save(infoBab1Schedule);
|
||||
scheduleService.save(chemistryBab1Schedule);
|
||||
scheduleService.save(psychoBab1Schedule);
|
||||
|
||||
lessonService.save(lesson_0_progra1);
|
||||
lessonService.save(lesson_0_chemistry1);
|
||||
lessonService.save(lesson_0_commun);
|
||||
lessonService.save(lesson_0_psycho1);
|
||||
lessonService.save(lesson_1_progra1);
|
||||
|
||||
scheduleLessonService.save(new ScheduleLesson(infoBab1Schedule,lesson_0_progra1));
|
||||
scheduleLessonService.save(new ScheduleLesson(infoBab1Schedule,lesson_1_progra1));
|
||||
scheduleLessonService.save(new ScheduleLesson(infoBab1Schedule,lesson_0_commun));
|
||||
|
||||
scheduleLessonService.save(new ScheduleLesson(chemistryBab1Schedule,lesson_0_chemistry1));
|
||||
scheduleLessonService.save(new ScheduleLesson(chemistryBab1Schedule,lesson_0_commun));
|
||||
|
||||
scheduleLessonService.save(new ScheduleLesson(psychoBab1Schedule,lesson_0_psycho1));
|
||||
scheduleLessonService.save(new ScheduleLesson(psychoBab1Schedule,lesson_0_commun));
|
||||
|
||||
|
||||
lessonRequestService.save(request1);
|
||||
lessonRequestService.save(request2);
|
||||
lessonRequestService.save(request3);
|
||||
|
||||
UnregisterRequest unregisterRequest = new UnregisterRequest(RequestState.Pending, "je veux partir", new Date(), joe.getRegNo(), joe.getFirstName(), joe.getLastName(), joe.getEmail(), null);
|
||||
uninscriptionRequestRepository.save(unregisterRequest);
|
||||
|
||||
|
@ -0,0 +1,116 @@
|
||||
package ovh.herisson.Clyde.EndPoints;
|
||||
|
||||
/******************************************************
|
||||
* @file ScheduleController.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
*
|
||||
* Controller of Schedule API
|
||||
******************************************************/
|
||||
|
||||
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ovh.herisson.Clyde.Responses.UnauthorizedResponse;
|
||||
import ovh.herisson.Clyde.Services.AuthenticatorService;
|
||||
import ovh.herisson.Clyde.Services.ScheduleLessonService;
|
||||
import ovh.herisson.Clyde.Services.ScheduleService;
|
||||
import ovh.herisson.Clyde.Services.UserCurriculumService;
|
||||
import ovh.herisson.Clyde.Services.CurriculumService;
|
||||
import ovh.herisson.Clyde.Tables.*;
|
||||
import ovh.herisson.Clyde.Services.LessonService;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@CrossOrigin(originPatterns = "*", allowCredentials = "true")
|
||||
public class ScheduleController {
|
||||
|
||||
private final ScheduleService scheduleServ;
|
||||
private final LessonService lessonServ;
|
||||
|
||||
private final CurriculumService curriculumServ;
|
||||
private final AuthenticatorService authServ;
|
||||
|
||||
private final ScheduleLessonService scheduleLessonServ;
|
||||
|
||||
public ScheduleController(ScheduleService scheduleServ, AuthenticatorService authServ, ScheduleLessonService scheduleLessonServ, CurriculumService curriculumServ,LessonService lessonServ) {
|
||||
this.scheduleServ = scheduleServ;
|
||||
this.authServ = authServ;
|
||||
this.scheduleLessonServ = scheduleLessonServ;
|
||||
this.curriculumServ = curriculumServ;
|
||||
this.lessonServ = lessonServ;
|
||||
}
|
||||
/**
|
||||
* Return schedule via its id
|
||||
*/
|
||||
@GetMapping("/schedule/{id}")
|
||||
public ResponseEntity<Map<String,Object>> findById(@PathVariable long id){
|
||||
Schedule schedule = scheduleServ.findById(id);
|
||||
|
||||
if(schedule == null)
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
return new ResponseEntity<>(scheduleLessonServ.getDepthScheduleBySchedule(schedule),HttpStatus.OK);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a schedule via its curriculum id
|
||||
*/
|
||||
@GetMapping("/schedule/curriculum/{id}")
|
||||
public ResponseEntity<Map<String, Object>> findCurriculumSchedule(@PathVariable Long id){
|
||||
Schedule schedule = scheduleLessonServ.getScheduleByCurriculum(curriculumServ.findById(id));
|
||||
if(schedule == null)
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
return new ResponseEntity<>(scheduleLessonServ.getDepthScheduleBySchedule(schedule),HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Return all schedules
|
||||
*/
|
||||
@GetMapping("/schedules")
|
||||
public ResponseEntity<Iterable<Map<String , Object>>> findAllSchedule(){
|
||||
return new ResponseEntity<>(scheduleLessonServ.getAllSchedule(),HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Post a new schedule
|
||||
*/
|
||||
@PostMapping("/schedule")
|
||||
public ResponseEntity<Schedule> postSchedule(@RequestHeader("Authorization") String token,
|
||||
@RequestBody Schedule schedule){
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
return new ResponseEntity<>(scheduleServ.save(schedule),HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Post a lesson to a schedule
|
||||
*/
|
||||
@PostMapping("/schedule/{id}")
|
||||
public ResponseEntity<String> postLessonToSchedule(@RequestHeader("Authorization") String token,
|
||||
@RequestBody Long lessonId,
|
||||
@PathVariable long id)
|
||||
{
|
||||
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
|
||||
if (!scheduleLessonServ.save(new ScheduleLesson( scheduleServ.findById(id), lessonServ.findById(lessonId))))
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
/**
|
||||
* Delete a lesson from a schedule
|
||||
*/
|
||||
@DeleteMapping("/schedule/lesson/{id}")
|
||||
public ResponseEntity<String> deleteLessonFromSchedule(@RequestHeader("Authorization") String token,
|
||||
@RequestBody Long lessonId,
|
||||
@PathVariable Long id)
|
||||
{
|
||||
if (authServ.isNotIn(new Role[]{Role.Admin,Role.Secretary},token))
|
||||
return new UnauthorizedResponse<>(null);
|
||||
if (!scheduleLessonServ.delete(lessonId))
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
|
||||
return new ResponseEntity<>(HttpStatus.OK);
|
||||
}
|
||||
}
|
@ -103,9 +103,6 @@ public class UserController {
|
||||
|
||||
@GetMapping("/teachers")
|
||||
public ResponseEntity<Iterable<HashMap<String,Object>>> getAllTeachers(@RequestHeader("Authorization") String token){
|
||||
if (authServ.getUserFromToken(token) == null)
|
||||
return new UnauthorizedResponse<>(null);
|
||||
|
||||
Iterable<User> teachers = userService.getAllTeachers();
|
||||
|
||||
return new ResponseEntity<>(ProtectionService.usersWithoutPasswords(teachers), HttpStatus.OK);
|
||||
|
@ -0,0 +1,23 @@
|
||||
package ovh.herisson.Clyde.Repositories;
|
||||
|
||||
/******************************************************
|
||||
* @file LessonChangesRequestRepository.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
******************************************************/
|
||||
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import ovh.herisson.Clyde.Tables.LessonChangesRequest;
|
||||
import ovh.herisson.Clyde.Tables.User;
|
||||
|
||||
public interface LessonChangesRequestRepository extends CrudRepository<LessonChangesRequest, Long> {
|
||||
LessonChangesRequest findById(long id);
|
||||
|
||||
|
||||
@Query("select lr from LessonChangesRequest lr where lr.user = ?1")
|
||||
Iterable<LessonChangesRequest> findOwnRequests(User user);
|
||||
|
||||
@Query("select lr from LessonChangesRequest lr where lr.lessonId = ?1")
|
||||
Iterable<LessonChangesRequest> findRequestByLessonId(long id);
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package ovh.herisson.Clyde.Repositories;
|
||||
|
||||
/******************************************************
|
||||
* @file LessonRepository.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
******************************************************/
|
||||
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import ovh.herisson.Clyde.Tables.Course;
|
||||
import ovh.herisson.Clyde.Tables.Lesson;
|
||||
|
||||
public interface LessonRepository extends CrudRepository<Lesson, Long> {
|
||||
|
||||
Lesson findById(long id);
|
||||
|
||||
@Query("select l from Lesson l where l.course = ?1")
|
||||
Iterable<Lesson> findLessonByCourse(Course course);
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package ovh.herisson.Clyde.Repositories;
|
||||
|
||||
/******************************************************
|
||||
* @file ScheduleLessonRepository.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
******************************************************/
|
||||
import jakarta.transaction.Transactional;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import ovh.herisson.Clyde.Tables.Curriculum;
|
||||
import ovh.herisson.Clyde.Tables.Lesson;
|
||||
import ovh.herisson.Clyde.Tables.Schedule;
|
||||
import ovh.herisson.Clyde.Tables.ScheduleLesson;
|
||||
|
||||
public interface ScheduleLessonRepository extends CrudRepository<ScheduleLesson,Long> {
|
||||
|
||||
@Query("select distinct sl.lesson from ScheduleLesson sl where sl.schedule.curriculum = ?1")
|
||||
Iterable<Lesson> findLessonByCurriculum(Curriculum curriculum);
|
||||
|
||||
@Query("select distinct sl.schedule from ScheduleLesson sl where sl.schedule.curriculum = ?1")
|
||||
Schedule findScheduleByCurriculum(Curriculum curriculum);
|
||||
|
||||
@Modifying
|
||||
@Transactional
|
||||
@Query("delete from ScheduleLesson sl where sl.lesson =?1")
|
||||
void delete(Lesson lesson);
|
||||
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package ovh.herisson.Clyde.Repositories;
|
||||
|
||||
/******************************************************
|
||||
* @file ScheduleRepository.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
******************************************************/
|
||||
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.CrudRepository;
|
||||
import ovh.herisson.Clyde.Tables.Course;
|
||||
import ovh.herisson.Clyde.Tables.Lesson;
|
||||
import ovh.herisson.Clyde.Tables.Schedule;
|
||||
|
||||
public interface ScheduleRepository extends CrudRepository<Schedule,Long> {
|
||||
|
||||
Schedule getById(long id);
|
||||
|
||||
|
||||
@Query("select distinct sl from Schedule sl where EXISTS (select c.curriculum from CurriculumCourse c where (sl.curriculum = c.curriculum) AND (c.course = ?1))")
|
||||
Iterable<Schedule> findAllLessonSchedule(Course course);
|
||||
}
|
@ -0,0 +1,177 @@
|
||||
package ovh.herisson.Clyde.Services;
|
||||
|
||||
/******************************************************
|
||||
* @file LeessonRequestService.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
******************************************************/
|
||||
import org.springframework.stereotype.Service;
|
||||
import ovh.herisson.Clyde.Repositories.*;
|
||||
import ovh.herisson.Clyde.Tables.*;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class LessonRequestService {
|
||||
private final LessonChangesRequestRepository lessonChangesRepo;
|
||||
|
||||
private final UserRepository userRepo;
|
||||
|
||||
private final LessonRepository lessonRepo;
|
||||
|
||||
private final LessonService lessonServ;
|
||||
|
||||
private final ScheduleLessonRepository scheduleLessonRepo;
|
||||
|
||||
private final ScheduleRepository scheduleRepository;
|
||||
|
||||
private final ScheduleLessonService scheduleLessonService;
|
||||
|
||||
private final UserService userServ;
|
||||
|
||||
private final CourseRepository courseRepository;
|
||||
public LessonRequestService(LessonChangesRequestRepository lessonChangesRepo,
|
||||
UserRepository userRepo, LessonRepository lessonRepo,
|
||||
LessonService lessonServ, ScheduleLessonRepository scheduleLessonRepo,
|
||||
ScheduleRepository scheduleRepository, ScheduleLessonService scheduleLessonService,
|
||||
UserService userServ, CourseRepository courseRepository) {
|
||||
this.lessonChangesRepo = lessonChangesRepo;
|
||||
this.userRepo = userRepo;
|
||||
this.lessonRepo = lessonRepo;
|
||||
this.lessonServ = lessonServ;
|
||||
this.scheduleLessonRepo = scheduleLessonRepo;
|
||||
this.scheduleRepository = scheduleRepository;
|
||||
this.scheduleLessonService = scheduleLessonService;
|
||||
this.userServ = userServ;
|
||||
this.courseRepository = courseRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new lesson request
|
||||
*/
|
||||
public LessonChangesRequest save(LessonChangesRequest lessonRequest){
|
||||
return lessonChangesRepo.save(lessonRequest);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all the requests made by a user
|
||||
*/
|
||||
public Iterable<LessonChangesRequest> findOwnRequests(User user){
|
||||
return lessonChangesRepo.findOwnRequests(user);
|
||||
}
|
||||
public LessonChangesRequest findById(long id){
|
||||
return lessonChangesRepo.findById(id);
|
||||
}
|
||||
/**
|
||||
* Return all the requests
|
||||
*/
|
||||
public Iterable<LessonChangesRequest> getAll(){return lessonChangesRepo.findAll();}
|
||||
|
||||
/**
|
||||
* Create a lesson if a request is accepted
|
||||
*/
|
||||
public boolean modifyCreateRequestState(LessonChangesRequest lessonRequest, RequestState state, String local ){
|
||||
if(lessonRequest == null || state == lessonRequest.getState() || state == null){
|
||||
return false;}
|
||||
if (state == RequestState.Accepted){
|
||||
Course course = courseRepository.findById(lessonRequest.getCourse().getCourseID());
|
||||
if(courseRepository.findById(lessonRequest.getCourse().getCourseID())==null|| local == null){
|
||||
return false;}
|
||||
Lesson lesson = new Lesson();
|
||||
lesson.setCourse(course);
|
||||
lesson.setLessonStart(lessonRequest.getLessonStart());
|
||||
lesson.setLessonEnd(lessonRequest.getLessonEnd());
|
||||
lesson.setColor(lessonRequest.getColor());
|
||||
lesson.setLocal(local);
|
||||
lesson.setLessonType(lessonRequest.getLessonType());
|
||||
|
||||
lesson = lessonRepo.save(lesson);
|
||||
scheduleLessonService.saveToAllSchedule(lesson);
|
||||
}
|
||||
lessonRequest.setState(state);
|
||||
save(lessonRequest);
|
||||
return true;
|
||||
}
|
||||
|
||||
public Iterable<LessonChangesRequest> findRequestByLessonId(long id){
|
||||
return lessonChangesRepo.findRequestByLessonId(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refuse all the lesson request that depends on a certain lesson
|
||||
* Used after the deletion of the lesson
|
||||
*/
|
||||
public void refuseAllByLessonId(long id){
|
||||
Iterable<LessonChangesRequest> toRefuse = findRequestByLessonId(id);
|
||||
for(LessonChangesRequest element : toRefuse)
|
||||
element.setState(RequestState.Refused);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify a lesson if a request is accepted
|
||||
*/
|
||||
public boolean modifyChangeRequestState(Map<String, Object> updates, long lessonId,RequestState state){
|
||||
if(state == RequestState.Accepted){
|
||||
Lesson lesson = lessonServ.findById(lessonId);
|
||||
return lessonServ.modifyData(lesson.getLessonID(),updates);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a lesson if a request is accepted
|
||||
*/
|
||||
public void modifyDeleteRequest(LessonChangesRequest lessonChangesRequest, RequestState state){
|
||||
if(state == RequestState.Accepted){
|
||||
lessonServ.delete(lessonServ.findById(lessonChangesRequest.getLessonId()));
|
||||
refuseAllByLessonId(lessonChangesRequest.getLessonId());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a lesson request
|
||||
*/
|
||||
public LessonChangesRequest createLessonRequest(Map<String,Object> lessonInfos) {
|
||||
LessonChangesRequest target = new LessonChangesRequest();
|
||||
|
||||
for (Map.Entry<String, Object> entry : lessonInfos.entrySet()) {
|
||||
System.out.println(entry.toString());
|
||||
if(entry.getValue() != null){
|
||||
switch (entry.getKey()) {
|
||||
case "requestType":
|
||||
target.setRequestType((int) entry.getValue());
|
||||
break;
|
||||
case "lessonStart":
|
||||
target.setLessonStart((String) entry.getValue());
|
||||
break;
|
||||
case "lessonEnd":
|
||||
target.setLessonEnd((String) entry.getValue());
|
||||
break;
|
||||
case "color":
|
||||
target.setColor((String) entry.getValue());
|
||||
break;
|
||||
case "user":
|
||||
target.setUser(userServ.getUserById((int) entry.getValue()));
|
||||
break;
|
||||
case "lessonType":
|
||||
target.setLessonType((String) entry.getValue());
|
||||
break;
|
||||
case "course":
|
||||
target.setCourse(courseRepository.findById((int) entry.getValue()));
|
||||
break;
|
||||
case "lessonId":
|
||||
target.setLessonId((int) entry.getValue());
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
target.setState(RequestState.Pending);
|
||||
return target;
|
||||
}
|
||||
|
||||
public void delete (LessonChangesRequest toDelete) {
|
||||
lessonChangesRepo.delete(toDelete);
|
||||
}
|
||||
}
|
@ -0,0 +1,150 @@
|
||||
package ovh.herisson.Clyde.Services;
|
||||
|
||||
|
||||
/******************************************************
|
||||
* @file LessonService.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
******************************************************/
|
||||
import org.springframework.stereotype.Service;
|
||||
import ovh.herisson.Clyde.Repositories.CourseRepository;
|
||||
import ovh.herisson.Clyde.Repositories.CurriculumCourseRepository;
|
||||
import ovh.herisson.Clyde.Repositories.LessonRepository;
|
||||
import ovh.herisson.Clyde.Repositories.UserCurriculumRepository;
|
||||
import ovh.herisson.Clyde.Tables.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class LessonService {
|
||||
private final LessonRepository lessonRepo;
|
||||
private final UserCurriculumRepository userCurriculumRepo;
|
||||
private final CourseRepository courseRepo;
|
||||
private final CurriculumCourseRepository curriculumCourseRepo;
|
||||
public LessonService(LessonRepository lessonRepo, UserCurriculumRepository userCurriculumRepo, CourseRepository courseRepo, CurriculumCourseRepository curriculumCourseRepo){
|
||||
this.lessonRepo = lessonRepo;
|
||||
this.userCurriculumRepo = userCurriculumRepo;
|
||||
this.courseRepo = courseRepo;
|
||||
this.curriculumCourseRepo = curriculumCourseRepo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a lesson
|
||||
*/
|
||||
public Lesson save(Lesson lesson){
|
||||
return lessonRepo.save(lesson);
|
||||
}
|
||||
/**
|
||||
* Find a lesson by its id
|
||||
*/
|
||||
public Lesson findById(long id){
|
||||
return lessonRepo.findById(id);
|
||||
}
|
||||
/**
|
||||
* Return all the lessons
|
||||
*/
|
||||
public Iterable<Lesson> findAll(){return lessonRepo.findAll();}
|
||||
/**
|
||||
* Return all a teacher's lessons
|
||||
*/
|
||||
public Iterable<Lesson> findAllOwnedLesson(User teacher){
|
||||
ArrayList<Lesson> toReturn = new ArrayList<>();
|
||||
ArrayList<Course> coursesOwned = (ArrayList<Course>) courseRepo.findAllOwnedCoures(teacher);
|
||||
for (Course element : coursesOwned) {
|
||||
for(Lesson lesson : lessonRepo.findLessonByCourse(element))
|
||||
toReturn.add(lesson);
|
||||
}
|
||||
return toReturn;
|
||||
}
|
||||
/**
|
||||
* Return all a student's lessons
|
||||
*/
|
||||
|
||||
public Iterable<Lesson> findOnesLessons(User student){
|
||||
ArrayList<Lesson> toReturn = new ArrayList<>();
|
||||
ArrayList<Course> courses = new ArrayList<>();
|
||||
ArrayList<UserCurriculum> userCurricula = userCurriculumRepo.findByUserAndActual(student, true);
|
||||
for (UserCurriculum userCurriculum : userCurricula) {
|
||||
curriculumCourseRepo.findCoursesByCurriculum(userCurriculum.getCurriculum()).forEach((item) -> {
|
||||
//We need this to eliminate clones because a course can belong to several curriculums
|
||||
if (!courses.contains(item)) {
|
||||
System.out.println(item.getTitle());
|
||||
courses.add(item);
|
||||
}
|
||||
});
|
||||
}
|
||||
for (Course element : courses) {
|
||||
for(Lesson lesson : lessonRepo.findLessonByCourse(element))
|
||||
toReturn.add(lesson);
|
||||
}
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
/**
|
||||
* Construct a new lesson
|
||||
*/
|
||||
public Lesson createLesson(Map<String,Object> lessonInfos) {
|
||||
Lesson target = new Lesson();
|
||||
|
||||
for (Map.Entry<String, Object> entry : lessonInfos.entrySet()) {
|
||||
switch (entry.getKey()) {
|
||||
case "lessonStart":
|
||||
target.setLessonStart((String) entry.getValue());
|
||||
break;
|
||||
case "lessonEnd":
|
||||
target.setLessonEnd((String) entry.getValue());
|
||||
case "color":
|
||||
target.setColor((String) entry.getValue());
|
||||
break;
|
||||
case "local":
|
||||
target.setLocal((String) entry.getValue());
|
||||
break;
|
||||
case "lessonType":
|
||||
target.setLessonType((String) entry.getValue());
|
||||
break;
|
||||
case "courseID":
|
||||
target.setCourse(courseRepo.findById((int) entry.getValue()));
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
return target;
|
||||
}
|
||||
/**
|
||||
* Modify a lesson
|
||||
*/
|
||||
public boolean modifyData(long id, Map<String ,Object> updates){
|
||||
Lesson target = lessonRepo.findById(id);
|
||||
|
||||
if(target == null)
|
||||
return false;
|
||||
|
||||
for (Map.Entry<String , Object> entry: updates.entrySet()){
|
||||
switch (entry.getKey()){
|
||||
case "lessonStart":
|
||||
target.setLessonStart((String) entry.getValue());
|
||||
break;
|
||||
case "lessonEnd":
|
||||
target.setLessonEnd((String) entry.getValue());
|
||||
break;
|
||||
case "local":
|
||||
target.setLocal((String) entry.getValue());
|
||||
break;
|
||||
case "lessonType":
|
||||
target.setLessonType((String) entry.getValue());
|
||||
break;
|
||||
}
|
||||
}
|
||||
lessonRepo.save(target);
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Delete a lesson
|
||||
*/
|
||||
public void delete(Lesson lesson){
|
||||
lessonRepo.delete(lesson);
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,8 +1,7 @@
|
||||
package ovh.herisson.Clyde.Services;
|
||||
|
||||
import ovh.herisson.Clyde.Tables.Course;
|
||||
import ovh.herisson.Clyde.Tables.*;
|
||||
import ovh.herisson.Clyde.Tables.Inscription.InscriptionRequest;
|
||||
import ovh.herisson.Clyde.Tables.User;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@ -70,6 +69,33 @@ public class ProtectionService {
|
||||
|
||||
}
|
||||
|
||||
public static HashMap<String , Object> lessonWithoutPassword(Lesson lesson){
|
||||
if(lesson == null)
|
||||
return null;
|
||||
|
||||
HashMap<String, Object> toReturn = new HashMap<>();
|
||||
|
||||
toReturn.put("lessonID", lesson.getLessonID());
|
||||
toReturn.put("lessonStart", lesson.getLessonStart());
|
||||
toReturn.put("lessonEnd", lesson.getLessonEnd());
|
||||
toReturn.put("course",courseWithoutPassword(lesson.getCourse()));
|
||||
toReturn.put("local",lesson.getLocal());
|
||||
toReturn.put("color", lesson.getColor());
|
||||
toReturn.put("lessonType",lesson.getLessonType());
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
public static Iterable<HashMap<String ,Object>> lessonsWithoutPassword(Iterable<Lesson> lessons){
|
||||
ArrayList<HashMap<String,Object>> toReturn = new ArrayList<>();
|
||||
|
||||
for (Lesson l: lessons){
|
||||
toReturn.add(ProtectionService.lessonWithoutPassword(l));
|
||||
}
|
||||
|
||||
return toReturn;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static Map<String, Object> requestWithoutPassword(InscriptionRequest inscriptionRequest) {
|
||||
|
||||
@ -94,6 +120,32 @@ public class ProtectionService {
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
public static Map<String, Object> lessonRequestWithoutPassword(LessonChangesRequest lessonRequest){
|
||||
if (lessonRequest == null)
|
||||
return null;
|
||||
Map<String, Object> toReturn = new HashMap<>();
|
||||
toReturn.put("id", lessonRequest.getId());
|
||||
toReturn.put("lessonStart", lessonRequest.getLessonStart());
|
||||
toReturn.put("lessonEnd", lessonRequest.getLessonEnd());
|
||||
toReturn.put("lessonType",lessonRequest.getLessonType());
|
||||
toReturn.put("course", courseWithoutPassword(lessonRequest.getCourse()));
|
||||
toReturn.put("user", userWithoutPassword(lessonRequest.getUser()));
|
||||
toReturn.put("requestType", lessonRequest.getRequestType());
|
||||
toReturn.put("state", lessonRequest.getState());
|
||||
toReturn.put("lessonId",lessonRequest.getLessonId());
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
public static Iterable<Map<String, Object>> lessonRequestsWithoutPassword(Iterable<LessonChangesRequest> lessonChangesRequests){
|
||||
ArrayList<Map<String,Object>> toReturn = new ArrayList<>();
|
||||
|
||||
for(LessonChangesRequest lessonChangeRequest: lessonChangesRequests){
|
||||
toReturn.add(lessonRequestWithoutPassword(lessonChangeRequest));
|
||||
}
|
||||
return toReturn;
|
||||
|
||||
}
|
||||
public static Iterable<Map<String ,Object>> requestsWithoutPasswords(Iterable<InscriptionRequest> inscriptionRequests){
|
||||
|
||||
ArrayList<Map<String,Object>> toReturn = new ArrayList<>();
|
||||
|
@ -0,0 +1,93 @@
|
||||
package ovh.herisson.Clyde.Services;
|
||||
|
||||
/******************************************************
|
||||
* @file ScheduleLessonService.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
******************************************************/
|
||||
import org.springframework.stereotype.Service;
|
||||
import ovh.herisson.Clyde.Repositories.LessonRepository;
|
||||
import ovh.herisson.Clyde.Repositories.ScheduleLessonRepository;
|
||||
import ovh.herisson.Clyde.Repositories.ScheduleRepository;
|
||||
import ovh.herisson.Clyde.Tables.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
@Service
|
||||
public class ScheduleLessonService {
|
||||
|
||||
private final ScheduleLessonRepository scheduleLessonRepo;
|
||||
|
||||
private final LessonRepository lessonRepo;
|
||||
private final ScheduleRepository scheduleRepo;
|
||||
public ScheduleLessonService(ScheduleLessonRepository scheduleLessonRepo, LessonRepository lessonRepo, ScheduleRepository scheduleRepo) {
|
||||
this.scheduleLessonRepo = scheduleLessonRepo;
|
||||
this.lessonRepo = lessonRepo;
|
||||
this.scheduleRepo = scheduleRepo;
|
||||
}
|
||||
public boolean save(ScheduleLesson scheduleLesson){
|
||||
if(scheduleLesson == null)
|
||||
return false;
|
||||
scheduleLessonRepo.save(scheduleLesson);
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Save a lesson to all the schedule it is linked
|
||||
*/
|
||||
public boolean saveToAllSchedule(Lesson lesson){
|
||||
Iterable<Schedule> schedules = scheduleRepo.findAllLessonSchedule(lesson.getCourse());
|
||||
if(schedules == null)
|
||||
return false;
|
||||
for (Schedule schedule : schedules){
|
||||
save(new ScheduleLesson(schedule, lesson));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Delete a scheduleLesson via its lesson
|
||||
*/
|
||||
public boolean delete(long lessonId){
|
||||
if(lessonId == 0)
|
||||
return false;
|
||||
scheduleLessonRepo.delete(lessonRepo.findById(lessonId));
|
||||
return true;
|
||||
}
|
||||
|
||||
public Schedule getScheduleByCurriculum(Curriculum curriculum){
|
||||
return scheduleLessonRepo.findScheduleByCurriculum(curriculum);
|
||||
}
|
||||
/**
|
||||
* Return a schedule and the list of lessons that corresponds
|
||||
*/
|
||||
public Map<String , Object> getDepthScheduleBySchedule(Schedule schedule){
|
||||
if(schedule == null)
|
||||
return null;
|
||||
|
||||
HashMap<String , Object> toReturn = new HashMap<>();
|
||||
ArrayList<Map<String, Object>> lessons = new ArrayList<>();
|
||||
Iterable<Lesson> foundLessons = scheduleLessonRepo.findLessonByCurriculum(schedule.getCurriculum());
|
||||
|
||||
for (Lesson l: foundLessons){
|
||||
lessons.add(ProtectionService.lessonWithoutPassword(l));
|
||||
}
|
||||
toReturn.put("lessons",lessons);
|
||||
toReturn.put("scheduleId" , schedule.getScheduleID());
|
||||
toReturn.put("curriculum", schedule.getCurriculum());
|
||||
return toReturn;
|
||||
}
|
||||
/**
|
||||
* Return all the schedules
|
||||
*/
|
||||
public Iterable<Map<String,Object>> getAllSchedule(){
|
||||
ArrayList<Map<String,Object>> toReturn = new ArrayList<>();
|
||||
|
||||
for (Schedule schedule: scheduleRepo.findAll()){
|
||||
toReturn.add(getDepthScheduleBySchedule(schedule));
|
||||
}
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package ovh.herisson.Clyde.Services;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import ovh.herisson.Clyde.Repositories.ScheduleRepository;
|
||||
import ovh.herisson.Clyde.Tables.Schedule;
|
||||
|
||||
@Service
|
||||
public class ScheduleService {
|
||||
private final ScheduleRepository scheduleRepo;
|
||||
public ScheduleService(ScheduleRepository scheduleRepo) {
|
||||
this.scheduleRepo = scheduleRepo;
|
||||
}
|
||||
public Schedule save(Schedule schedule){
|
||||
return scheduleRepo.save(schedule);
|
||||
}
|
||||
public Schedule findById(long id){
|
||||
return scheduleRepo.getById(id);
|
||||
}
|
||||
public void delete(Schedule schedule){
|
||||
scheduleRepo.delete(schedule);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package ovh.herisson.Clyde.Tables;
|
||||
public enum Applications {
|
||||
// without any token
|
||||
Login,
|
||||
Schedule,
|
||||
|
||||
// with any token
|
||||
Profile,
|
||||
@ -12,11 +13,18 @@ public enum Applications {
|
||||
Msg,
|
||||
Forum,
|
||||
Rdv,
|
||||
// teachers authorization
|
||||
|
||||
ManageOwnedLessons,
|
||||
|
||||
// teachers and Secretary authorization
|
||||
ManageCourses,
|
||||
UsersList,
|
||||
|
||||
//Secretary authorization
|
||||
ManageSchedules,
|
||||
LessonRequests,
|
||||
|
||||
// InscriptionService authorization
|
||||
Requests,
|
||||
StudentsList,
|
||||
|
101
backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java
Normal file
101
backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java
Normal file
@ -0,0 +1,101 @@
|
||||
package ovh.herisson.Clyde.Tables;
|
||||
|
||||
|
||||
/******************************************************
|
||||
* @file Lesson.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
*
|
||||
* Represent a course in a schedule
|
||||
******************************************************/
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import org.hibernate.annotations.OnDelete;
|
||||
import org.hibernate.annotations.OnDeleteAction;
|
||||
|
||||
|
||||
@Entity
|
||||
public class Lesson {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private int lessonID;
|
||||
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@OnDelete(action = OnDeleteAction.SET_NULL)
|
||||
@JoinColumn(name = "Course")
|
||||
private Course course;
|
||||
|
||||
private String lessonStart;
|
||||
|
||||
private String lessonEnd;
|
||||
|
||||
private String color;
|
||||
|
||||
private String lessonType;
|
||||
|
||||
private String local;
|
||||
|
||||
public Lesson(Course course,String start, String end ,String color,String local,String lessonType){
|
||||
this.lessonEnd = end;
|
||||
this.course = course;
|
||||
this.lessonStart = start;
|
||||
this.color = color;
|
||||
this.local = local;
|
||||
this.lessonType = lessonType;
|
||||
}
|
||||
|
||||
public Lesson() {
|
||||
}
|
||||
|
||||
public int getLessonID(){
|
||||
return lessonID;
|
||||
}
|
||||
|
||||
public void setCourse(Course course) {
|
||||
this.course = course;
|
||||
}
|
||||
|
||||
public Course getCourse(){
|
||||
return course;
|
||||
}
|
||||
|
||||
public String getLessonStart(){
|
||||
return lessonStart;
|
||||
}
|
||||
|
||||
public String getLessonEnd() {
|
||||
return lessonEnd;
|
||||
}
|
||||
|
||||
public String getColor(){
|
||||
return color;
|
||||
}
|
||||
|
||||
public String getLocal() {
|
||||
return local;
|
||||
}
|
||||
|
||||
public String getLessonType(){
|
||||
return lessonType;
|
||||
}
|
||||
|
||||
public void setLessonStart(String start){
|
||||
this.lessonStart = start;
|
||||
}
|
||||
|
||||
public void setLessonEnd(String lessonEnd) {
|
||||
this.lessonEnd = lessonEnd;
|
||||
}
|
||||
|
||||
public void setColor(String color){
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public void setLocal(String local){
|
||||
this.local = local;
|
||||
}
|
||||
|
||||
public void setLessonType(String lessonType){
|
||||
this.lessonType = lessonType;
|
||||
}
|
||||
}
|
@ -0,0 +1,148 @@
|
||||
package ovh.herisson.Clyde.Tables;
|
||||
|
||||
|
||||
/******************************************************
|
||||
* @file LessonChangesRequest.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
*
|
||||
* Represent a request about changes on schedules and lessons
|
||||
******************************************************/
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import org.hibernate.annotations.OnDelete;
|
||||
import org.hibernate.annotations.OnDeleteAction;
|
||||
|
||||
@Entity
|
||||
public class LessonChangesRequest {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private int id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "Users")
|
||||
@OnDelete(action = OnDeleteAction.CASCADE)
|
||||
private User user;
|
||||
|
||||
private long lessonId;
|
||||
|
||||
private RequestState state;
|
||||
|
||||
private String lessonStart;
|
||||
|
||||
private String lessonEnd;
|
||||
|
||||
private String color;
|
||||
@ManyToOne
|
||||
@JoinColumn(name ="Course")
|
||||
private Course course;
|
||||
|
||||
private String lessonType;
|
||||
|
||||
/**
|
||||
* Can take 3 values:
|
||||
* 0 : Request to CREATE a lesson
|
||||
* 1 : Request to MODIFY an existing lesson
|
||||
* 2 : Request to DELETE a lesson
|
||||
*/
|
||||
private int requestType;
|
||||
|
||||
public LessonChangesRequest(User user, RequestState state, String lessonStart,
|
||||
String lessonEnd, String lessonType, Course course,
|
||||
int requestType, String color,long lessonId){
|
||||
this.user = user;
|
||||
this.state = state;
|
||||
this.requestType = requestType;
|
||||
this.lessonType = lessonType;
|
||||
this.lessonStart = lessonStart;
|
||||
this.lessonEnd= lessonEnd;
|
||||
this.color = color;
|
||||
this.course = course;
|
||||
this.lessonId = lessonId;
|
||||
}
|
||||
|
||||
public LessonChangesRequest() {
|
||||
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
public RequestState getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public long getLessonId(){
|
||||
return lessonId;
|
||||
}
|
||||
|
||||
public String getLessonStart() {
|
||||
return lessonStart;
|
||||
}
|
||||
|
||||
public String getLessonEnd() {
|
||||
return lessonEnd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public int getRequestType() {
|
||||
return requestType;
|
||||
}
|
||||
|
||||
public String getLessonType() {
|
||||
return lessonType;
|
||||
}
|
||||
|
||||
public String getColor() {
|
||||
return color;
|
||||
}
|
||||
|
||||
public Course getCourse() {
|
||||
return course;
|
||||
}
|
||||
|
||||
public void setState(RequestState state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public void setLessonStart(String lessonStart) {
|
||||
this.lessonStart = lessonStart;
|
||||
}
|
||||
|
||||
public void setLessonType(String lessonType) {
|
||||
this.lessonType = lessonType;
|
||||
}
|
||||
|
||||
public void setLessonEnd(String lessonEnd) {
|
||||
this.lessonEnd = lessonEnd;
|
||||
}
|
||||
|
||||
public void setColor(String color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public void setRequestType(int requestType) {
|
||||
this.requestType = requestType;
|
||||
}
|
||||
|
||||
|
||||
public void setLessonId(long lessonId) {
|
||||
this.lessonId = lessonId;
|
||||
}
|
||||
|
||||
public void setCourse(Course course){
|
||||
this.course = course;
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
|
||||
package ovh.herisson.Clyde.Tables;
|
||||
|
||||
|
||||
/******************************************************
|
||||
* @file Schedule.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
*
|
||||
* Represent a schedule linked to a curriculum
|
||||
******************************************************/
|
||||
import jakarta.persistence.*;
|
||||
import org.hibernate.annotations.OnDelete;
|
||||
import org.hibernate.annotations.OnDeleteAction;
|
||||
|
||||
@Entity
|
||||
public class Schedule {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private int scheduleID;
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "Curriculum")
|
||||
@OnDelete(action = OnDeleteAction.SET_NULL)
|
||||
private Curriculum curriculum;
|
||||
|
||||
public Schedule(Curriculum curriculum){
|
||||
this.curriculum = curriculum;
|
||||
}
|
||||
|
||||
public Schedule() {}
|
||||
|
||||
|
||||
public int getScheduleID(){
|
||||
return scheduleID;
|
||||
}
|
||||
|
||||
public Curriculum getCurriculum(){
|
||||
return curriculum;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
package ovh.herisson.Clyde.Tables;
|
||||
|
||||
|
||||
/******************************************************
|
||||
* @file ScheduleLesson.java
|
||||
* @author William Karpinski
|
||||
* @scope Extension Horaire
|
||||
*
|
||||
* Used to link schedules and lessons to each others
|
||||
******************************************************/
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import org.hibernate.annotations.OnDelete;
|
||||
import org.hibernate.annotations.OnDeleteAction;
|
||||
|
||||
|
||||
@Entity
|
||||
public class ScheduleLesson{
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private int id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@JoinColumn(name = "Schedule")
|
||||
@OnDelete(action = OnDeleteAction.SET_NULL)
|
||||
private Schedule schedule;
|
||||
|
||||
|
||||
@ManyToOne(fetch = FetchType.EAGER)
|
||||
@OnDelete(action = OnDeleteAction.SET_NULL)
|
||||
@JoinColumn(name = "Lesson")
|
||||
private Lesson lesson;
|
||||
|
||||
public ScheduleLesson(Schedule schedule,Lesson lesson){
|
||||
this.schedule = schedule;
|
||||
this.lesson = lesson;
|
||||
}
|
||||
|
||||
public ScheduleLesson() {
|
||||
}
|
||||
|
||||
public int getID(){
|
||||
return id;
|
||||
}
|
||||
|
||||
public Lesson getLesson(){
|
||||
return lesson;
|
||||
}
|
||||
|
||||
public Schedule getSchedule(){
|
||||
return schedule;
|
||||
}
|
||||
|
||||
public void setLesson(Lesson lesson){
|
||||
this.lesson = lesson;
|
||||
}
|
||||
|
||||
public void setSchedule(Schedule schedule){
|
||||
this.schedule = schedule;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -29,16 +29,76 @@ app.settings=Settings
|
||||
app.messages=Messages
|
||||
app.forum=Forum
|
||||
app.schedules=Schedules
|
||||
app.manageSchedules=Manage Schedules
|
||||
app.inscription.requests=Inscription Requests
|
||||
app.manage.courses=Manage Courses
|
||||
app.language=Language
|
||||
app.manage.profile=Manage profile
|
||||
app.studentList=Students List
|
||||
app.users=Users
|
||||
app.manageOwnLessons=Manage Owned Courses Schedule
|
||||
app.lessonRequests=Schedule Requests
|
||||
app.payments=Payments
|
||||
request.moreInfos=More Infos
|
||||
request.accept=Accept
|
||||
request.refuse=Refuse
|
||||
Pending=Pending
|
||||
Delete=Delete
|
||||
Modify=Modify
|
||||
Create=Créer
|
||||
requestType=Request Type
|
||||
day=Day
|
||||
start=Start
|
||||
end=End
|
||||
monday=Monday
|
||||
tuesday=Tuesday
|
||||
wednesday=Wednesday
|
||||
thursday=Thursday
|
||||
friday=Friday
|
||||
saturday=Saturday
|
||||
sunday=Sunday
|
||||
january=January
|
||||
february=February
|
||||
march=March
|
||||
april=April
|
||||
may=May
|
||||
june=June
|
||||
july=July
|
||||
august=August
|
||||
september=September
|
||||
october=October
|
||||
november=November
|
||||
december=December
|
||||
Grid=Grid
|
||||
Week=Week
|
||||
Month=Month
|
||||
List=List
|
||||
Type=Type
|
||||
Teacher=Teacher
|
||||
Course=Course
|
||||
TP=TP
|
||||
TD=TD
|
||||
Exam=Exam
|
||||
OwnSchedule=Own Schedule
|
||||
SwitchToJSON=Switch to JSON FILE
|
||||
schedule.previous=Previous
|
||||
schedule.next=Next
|
||||
schedule.current=Current
|
||||
schedule.settings=Settings
|
||||
schedule.courses=Courses
|
||||
schedule.teachers=Teacher(s)
|
||||
schedule.askChanges=Ask Changes
|
||||
schedule.askCreate=Ask to create course
|
||||
schedule.askDeletion=Ask Deletion
|
||||
schedule.createSchedule=Create Schedule
|
||||
schedule.createLesson=Create course
|
||||
schedule.deleteMod=Unable deletion
|
||||
schedule.noDeleteMod=Disable deletion
|
||||
schedule=Schedule
|
||||
old_day=Precedent day
|
||||
old_start=Precedent start
|
||||
old_end=Precedent end
|
||||
old_type=Precedent type
|
||||
courses.createCourse=Create course
|
||||
courses.deleteCourse=Delete course
|
||||
courses.modify=Modify
|
||||
|
@ -29,16 +29,76 @@ app.settings=Options
|
||||
app.messages=Messages
|
||||
app.forum=Forum
|
||||
app.schedules=Horaires
|
||||
app.manageSchedules=Gérer les horaires
|
||||
app.inscription.requests=Demandes d'Inscription
|
||||
app.manage.courses=Gérer les cours
|
||||
app.language=Langue
|
||||
app.manage.profile=Gérer le profil
|
||||
app.studentList=Liste des étudiants
|
||||
app.users=Utilisateurs
|
||||
app.manageOwnLessons=Gérer ses horaires de cours
|
||||
app.lessonRequests=Requêtes d'horaire
|
||||
app.payments=Payements
|
||||
request.moreInfos=Plus d'Infos
|
||||
request.accept=Accepter
|
||||
request.refuse=Refuser
|
||||
Pending=En attente
|
||||
Delete=Supprimer
|
||||
Modify=Modifier
|
||||
Create=Créer
|
||||
requestType=Type de Requête
|
||||
day=Jour
|
||||
start=Début
|
||||
end=Fin
|
||||
monday=Lundi
|
||||
tuesday=Mardi
|
||||
wednesday=Mercredi
|
||||
thursday=Jeudi
|
||||
friday=Vendredi
|
||||
saturday=Samedi
|
||||
sunday=Dimanche
|
||||
january=Janvier
|
||||
february=Février
|
||||
march=Mars
|
||||
april=Avril
|
||||
may=Mai
|
||||
june=Juin
|
||||
july=Juillet
|
||||
august=Août
|
||||
september=Septembre
|
||||
october=Octobre
|
||||
november=Novembre
|
||||
december=Decembre
|
||||
Grid=Grille
|
||||
Week=Semaine
|
||||
Month=Mois
|
||||
List=Liste
|
||||
Type=Type
|
||||
Teacher=Professeur
|
||||
Course=Cours
|
||||
TP=TP
|
||||
TD=TD
|
||||
Exam=Exam
|
||||
OwnSchedule=Mon Horaire
|
||||
SwitchToJSON=Afficher le JSON
|
||||
schedule.previous=Précédent
|
||||
schedule.next=Prochain
|
||||
schedule.current=Actuel
|
||||
schedule.settings=Options
|
||||
schedule.courses=Cours
|
||||
schedule.teachers=Professeurs(s)
|
||||
schedule.askChanges=Demander Changement
|
||||
schedule.askCreate=Demander de créer un cours
|
||||
schedule.askDeletion=Demander suppression
|
||||
schedule.createSchedule=Créer Horaire
|
||||
schedule.createLesson=Créer cours
|
||||
schedule.deleteMod=Activer suppression
|
||||
schedule.noDeleteMod=Désactiver suppression
|
||||
schedule=Horaire
|
||||
old_day=Ancien Jour
|
||||
old_start=Ancien Début
|
||||
old_end=Ancienne Fin
|
||||
old_type=Ancien Type
|
||||
courses.createCourse=Créer un cours
|
||||
courses.deleteCourse=Supprimer un cours
|
||||
courses.modify=Modifier
|
||||
|
@ -231,6 +231,7 @@ window.addEventListener('hashchange', () => {
|
||||
.text {
|
||||
right: 0%;
|
||||
width: 0%;
|
||||
visibility: collapse;
|
||||
opacity: 0;
|
||||
color: white;
|
||||
font-size: 1.2em;
|
||||
@ -239,7 +240,8 @@ window.addEventListener('hashchange', () => {
|
||||
}
|
||||
|
||||
ul.vertical:hover .text {
|
||||
opacity: 1;
|
||||
opacity:1;
|
||||
visibility:visible;
|
||||
width: 60%;
|
||||
transition-duration: .3s;
|
||||
padding-left: 15px;
|
||||
|
218
frontend/src/Apps/LessonRequests.vue
Normal file
218
frontend/src/Apps/LessonRequests.vue
Normal file
@ -0,0 +1,218 @@
|
||||
|
||||
<!----------------------------------------------------
|
||||
File: LessonRequests.vue
|
||||
Author: William Karpinski
|
||||
Scope: Extension Horaire
|
||||
Description: Lesson Requests Management Page
|
||||
----------------------------------------------------->
|
||||
|
||||
<script setup>
|
||||
import i18n from "@/i18n.js"
|
||||
import {ref} from 'vue'
|
||||
import {changeRequestState, getAllRequests} from "@/rest/LessonRequests.js";
|
||||
import {getLesson} from "@/rest/lessonSchedule.js";
|
||||
import {formatDate, getHoursMinutes} from "@/scheduleFunctions.js";
|
||||
|
||||
const requests = ref(await getAllRequests());
|
||||
const AcceptMod = ref(false);
|
||||
const moreInfosMod = ref(false);
|
||||
const requestTypes = ["Create", "Modify", "Delete"]
|
||||
const editElementID = ref('');
|
||||
const chosenLocal = ref("");
|
||||
const locals = ["A0B1","A1B1","A2B1","A0B2"];
|
||||
const moreInfos = ref({});
|
||||
|
||||
|
||||
/*
|
||||
* Change a request's state and refreshes the requests '
|
||||
*/
|
||||
|
||||
async function upPage(id,review){
|
||||
await changeRequestState(id, review) ;
|
||||
requests.value = await getAllRequests();
|
||||
}
|
||||
|
||||
/*
|
||||
* Set correctly the variables after clicking on the ACCEPT button
|
||||
*/
|
||||
|
||||
async function AcceptSetup(id,type){
|
||||
if(type !== 2 ){
|
||||
editElementID.value = id
|
||||
AcceptMod.value = true;
|
||||
}
|
||||
else{
|
||||
await upPage(id,{local: null,state:'Accepted'});
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the infos to show when clicking MORE INFOS
|
||||
*/
|
||||
async function setMoreInfos(item){
|
||||
|
||||
moreInfos.value = Object.assign({},{})
|
||||
moreInfos.value["requestType"] = requestTypes[item.requestType]
|
||||
if(item.requestType == 0 || item.requestType == 1){
|
||||
moreInfos.value["day"] = item.lessonStart == null ? null : formatDate(new Date(item.lessonStart))
|
||||
moreInfos.value["start"] = item.lessonStart == null ? null : getHoursMinutes(new Date(item.lessonStart))
|
||||
moreInfos.value["end"] = item.lessonEnd == null ? null : getHoursMinutes(new Date(item.lessonEnd))
|
||||
moreInfos.value["lessonType"] = item.lessonType;
|
||||
moreInfos.value["course"] = item["course"] == null ? null:item.course.title}
|
||||
if (item.requestType==1 || item.requestType == 2){
|
||||
let temp = await getLesson(item.lessonId);
|
||||
if(item.requestType == 1 || item.requestType == 2){
|
||||
moreInfos.value["course"] = temp.course.title;
|
||||
moreInfos.value[item.requestType == 2 ? "day" : "old_day"] = formatDate(new Date(temp.lessonStart));
|
||||
moreInfos.value[item.requestType == 2 ? "start" : "old_start"] = getHoursMinutes(new Date(temp.lessonStart));
|
||||
moreInfos.value[item.requestType == 2 ? "end":"old_end"] = getHoursMinutes(new Date(temp.lessonEnd));
|
||||
moreInfos.value[item.requestType == 2 ? "lessonType":"old_type"] = temp.lessonType;
|
||||
}}
|
||||
editElementID.value = item.id ;
|
||||
moreInfosMod.value =true;
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
<template>
|
||||
|
||||
<div class="body">
|
||||
<div v-for="item of requests" :key="item.id" :style="{width:[moreInfosMod ? 95:70] + '%'}" class="center">
|
||||
|
||||
<button v-if="moreInfosMod && editElementID == item.id" @click="moreInfosMod = false; editElementID = ''; moreInfos='';">{{i18n("courses.back")}}</button>
|
||||
<div v-if ="item.state === 'Pending'" class="listElement">
|
||||
<div class="containerElement" v-if="editElementID !== item.id">
|
||||
<div class="id">{{i18n(requestTypes[item.requestType].toString())}}</div>
|
||||
<div class="surname">{{i18n(item.state.toString())}}</div>
|
||||
<div class="firstname">{{item.user.lastName}}</div>
|
||||
|
||||
<div class="infos">
|
||||
<button @click=" setMoreInfos(item);" style="background-color:rgb(105,05,105);" >
|
||||
{{i18n("request.moreInfos")}}
|
||||
</button></div>
|
||||
<div class="accept"><button @click="AcceptSetup(item.id,item.requestType);" style="background-color:rgb(0,105,50);">{{i18n("request.accept")}}</button></div>
|
||||
<div class="refuse"><button @click="upPage(item.id,{local: null,state:'Refused'})" style="background-color:rgb(105,0,0);">{{i18n("request.refuse")}}</button></div>
|
||||
</div>
|
||||
|
||||
<div v-else class="containerElement" style="width:auto; height:auto;">
|
||||
<div v-if="AcceptMod" style="margin-left:20%;">
|
||||
Local:
|
||||
<select v-model="chosenLocal">
|
||||
<option v-for="item in locals">{{item}}</option>
|
||||
</select>
|
||||
<button @click="AcceptMod = false;upPage(item.id,{local: chosenLocal, state:'Accepted'})">{{i18n("request.accept")}}</button>
|
||||
</div>
|
||||
<template v-if="moreInfosMod" v-for="(key,value) in moreInfos">
|
||||
|
||||
<div class="container" v-if="key != null" style="align-self:center;">
|
||||
<div style="margin:0 auto 0 auto">
|
||||
{{i18n(value.toString())}}:
|
||||
{{key}}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
|
||||
.center{
|
||||
margin:0 auto 0 auto;
|
||||
}
|
||||
|
||||
|
||||
.containerElement{
|
||||
justify-content:center;
|
||||
display:grid;
|
||||
grid-template-columns:10% 14.2% 19% 14.2% 14.2% 14.2% 14.2%;
|
||||
grid-template-areas:
|
||||
"id type surname firstname infos accept refuse";
|
||||
column-gap:10px; }
|
||||
|
||||
.container{
|
||||
padding-left:50px;
|
||||
font-size:.8em;
|
||||
justify-content:center;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(6, 1fr);
|
||||
grid-template-rows: repeat(auto-fill, 120px);
|
||||
grid-row-gap: 1em;
|
||||
|
||||
grid-column-gap: 0.2em;
|
||||
|
||||
}
|
||||
|
||||
.listElement{
|
||||
min-width:625px;
|
||||
border:2px solid black;
|
||||
font-size:25px;
|
||||
color:white;
|
||||
padding:20px;
|
||||
background-color:rgb(50,50,50);
|
||||
border-radius:20px;
|
||||
margin-bottom:10px;
|
||||
|
||||
}
|
||||
.infos {
|
||||
grid-area:infos;
|
||||
align-self:center;
|
||||
}
|
||||
|
||||
.accept{
|
||||
grid-area:accept;
|
||||
align-self:center;
|
||||
}
|
||||
|
||||
.refuse{
|
||||
grid-area:refuse;
|
||||
align-self:center;
|
||||
}
|
||||
|
||||
.id{
|
||||
grid-area:id;
|
||||
margin-left:40px;
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
.body {
|
||||
width:100%;
|
||||
margin-top:3.5%;
|
||||
}
|
||||
button:hover{
|
||||
opacity:0.8;
|
||||
}
|
||||
|
||||
|
||||
</style>
|
||||
|
@ -35,7 +35,6 @@
|
||||
let isnull= false;
|
||||
|
||||
for(const [key, value] of Object.entries(toAdd)){
|
||||
console.log(toAdd.owner);
|
||||
if(value === null){
|
||||
isnull=true;
|
||||
}
|
||||
@ -64,17 +63,14 @@
|
||||
|
||||
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});
|
||||
await alterCourse(course.courseID,{owner:toModify[element].regNo});
|
||||
}
|
||||
else if(element == "title" && (toModify[element] != course.title)){
|
||||
await alterCourse(course.courseId,{title:toModify[element]});
|
||||
await alterCourse(course.courseID,{title:toModify[element]});
|
||||
}
|
||||
else if(element == "credits" && (parseInt(toModify[element]) != course.credits)){
|
||||
await alterCourse(course.courseId,{credits:parseInt(toModify[element])});
|
||||
await alterCourse(course.courseID,{credits:parseInt(toModify[element])});
|
||||
}
|
||||
}
|
||||
toModify= Object.assign({},pattern);
|
||||
@ -159,11 +155,11 @@
|
||||
</div>
|
||||
<div class="containerElement"v-else>
|
||||
<input style="max-width:200px;" class="name" v-model="toModify.title">
|
||||
<select v-if="self.role === 'Secretary'" style="max-width:200px;" class="teacher" v-model="toModify.owner">
|
||||
<select v-if="self.role != 'Secretary'" style="max-width:200px;" class="teacher" v-model="toModify.owner">
|
||||
<option v-for="(item,index) in profList" :value='item'>{{item.lastName}}</option>
|
||||
</select>
|
||||
<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">
|
||||
<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>
|
||||
@ -177,17 +173,6 @@
|
||||
margin-top:3.5%;
|
||||
}
|
||||
|
||||
.infosContainer {
|
||||
min-width:350px;
|
||||
padding-bottom:50px;
|
||||
border:2px solid black;
|
||||
font-size:25px;
|
||||
color:white;
|
||||
padding:20px;
|
||||
background-color:rgb(50,50,50);
|
||||
border-radius:20px;
|
||||
}
|
||||
|
||||
.containerElement{
|
||||
justify-content:center;
|
||||
display:grid;
|
||||
|
277
frontend/src/Apps/ManageOwnLessons.vue
Normal file
277
frontend/src/Apps/ManageOwnLessons.vue
Normal file
@ -0,0 +1,277 @@
|
||||
<!----------------------------------------------------
|
||||
File: LessonRequests.vue
|
||||
Author: William Karpinski
|
||||
Scope: Extension Horaire
|
||||
Description: Lessons Management Page for the teachers
|
||||
----------------------------------------------------->
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import i18n from '@/i18n.js'
|
||||
import {formatDate,invertedFormatDate,getHoursMinutes,sortByDate, createLessonEvent} from '../scheduleFunctions.js'
|
||||
import {getOwnedLessons} from "@/rest/lessonSchedule.js";
|
||||
import {getSelf} from "@/rest/Users.js";
|
||||
import {createRequest} from "@/rest/LessonRequests.js"
|
||||
import {getcurriculum} from "@/rest/curriculum.js";
|
||||
import {getAllSchedule} from "@/rest/scheduleRest.js";
|
||||
|
||||
|
||||
const curriculum = ref();
|
||||
const allSchedules = ref(await getAllSchedule());
|
||||
const schedule = ref(await getOwnedLessons());
|
||||
schedule.value.sort((a,b) => sortByDate(b,a))
|
||||
const createMod = ref(false);
|
||||
const user = await getSelf();
|
||||
const editElementID = ref();
|
||||
const requestType = ref(0);
|
||||
const currentDate = new Date();
|
||||
const types = ["TP","TD","Course","Exam"];
|
||||
const colors = {"TP":"rgb(36,175,255)","TD":"rgb(255,36,175)","Exam":"rgb(175,255,36)","Course":"rgb(255,36,175)"}
|
||||
const courses = ref();
|
||||
|
||||
const maxDate = ref(invertedFormatDate(new Date([currentDate.getMonth()<7 ? currentDate.getFullYear() : (currentDate.getFullYear())+1],7,31)));
|
||||
|
||||
const minDate = ref(invertedFormatDate((new Date()).setDate(currentDate.getDate()+1)))
|
||||
|
||||
/*
|
||||
* Checks if a lesson is in the future or not
|
||||
*/
|
||||
function inFuture(lesson){
|
||||
let toCompare = new Date(lesson.lessonStart);
|
||||
let current = new Date();
|
||||
return (current < toCompare)
|
||||
}
|
||||
|
||||
|
||||
async function setCourses(){
|
||||
courses.value = (await getcurriculum(curriculum.value.curriculumId)).courses
|
||||
}
|
||||
|
||||
const pattern = {
|
||||
"lessonId":null,
|
||||
"course": null,
|
||||
"day":null,
|
||||
"lessonStart": null,
|
||||
"lessonEnd": null,
|
||||
"lessonType": null,
|
||||
}
|
||||
const patternRequest ={
|
||||
"user": user.regNo,
|
||||
"state": "Pending",
|
||||
"requestType": 0,
|
||||
"lessonId":null,
|
||||
"lessonType":null,
|
||||
"lessonStart":null,
|
||||
"lessonEnd":null,
|
||||
"color":null,
|
||||
"course":0,}
|
||||
|
||||
const toModify = ref(Object.assign({}, pattern));
|
||||
const requestBuffer = ref(Object.assign({},patternRequest));
|
||||
|
||||
function setModify(lesson){
|
||||
toModify.value.lessonId = editElementID.value;
|
||||
toModify.value.day = invertedFormatDate(new Date(lesson.lessonStart));
|
||||
toModify.value.lessonStart = getHoursMinutes(lesson.lessonStart);
|
||||
toModify.value.lessonEnd = getHoursMinutes(lesson.lessonEnd);
|
||||
toModify.value.lessonType = lesson.lessonType
|
||||
}
|
||||
|
||||
function setCreate(){
|
||||
toModify.value = ref(Object.assign({},pattern));
|
||||
createMod.value = !createMod.value;
|
||||
}
|
||||
|
||||
/*
|
||||
* Constructs a request and posts it
|
||||
*/
|
||||
async function createLessonRequest(){
|
||||
if(requestType.value === 0 || requestType.value === 1){
|
||||
//modify
|
||||
requestBuffer.value.color = colors[toModify.value.lessonType] ;
|
||||
requestBuffer.value.requestType = requestType.value;
|
||||
requestBuffer.value.course = toModify.value.course;
|
||||
let start = createLessonEvent(toModify.value.day,toModify.value.lessonStart)
|
||||
let end = createLessonEvent(toModify.value.day,toModify.value.lessonEnd)
|
||||
for (let element in toModify.value){
|
||||
if(element !== "day" && element !== "lessonStart" && element !== "lessonEnd"){
|
||||
requestBuffer.value[element] = toModify.value[element];
|
||||
}
|
||||
if(element === "lessonStart"){
|
||||
requestBuffer.value.lessonStart = start;
|
||||
}
|
||||
if(element === "lessonEnd"){
|
||||
requestBuffer.value.lessonEnd = end;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else if(requestType.value === 2 || requestType.value === 1) {
|
||||
//delete
|
||||
requestBuffer.value.lessonId = editElementID;
|
||||
requestBuffer.value.requestType = requestType.value;
|
||||
}
|
||||
await createRequest(requestBuffer.value);
|
||||
editElementID.value = '';
|
||||
}
|
||||
|
||||
/*
|
||||
* Creates a request of a certain type
|
||||
* 0 = CREATE REQUEST
|
||||
* 1 = MODIFY REQUEST
|
||||
* 2 = DELETE REQUEST
|
||||
*/
|
||||
async function askChanges(i){
|
||||
requestType.value= i;
|
||||
await createLessonRequest()
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
<div class="body">
|
||||
<div v-if="createMod">
|
||||
<form class="listElement" style="width:40%; margin:0 auto 0 auto;">
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("schedule")}} :
|
||||
<select @change="setCourses()"v-model="curriculum">
|
||||
<option v-for="item in allSchedules" :value='item.curriculum'>{{item.curriculum.option}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("course")}}:
|
||||
<select v-if="curriculum != null" v-model="toModify.course">
|
||||
<option v-for="item in courses" :value='item.courseID'>{{item.title}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("day")}}:
|
||||
<input type="date" :min="minDate" :max="maxDate" v-model="toModify.day">
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("start")}}:
|
||||
<input v-model="toModify.lessonStart" type="time" min="08:00" max="18:00" required />
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("end")}}:
|
||||
<input v-model="toModify.lessonEnd" type="time" min="10:00" max="20:00" required />
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Type:
|
||||
<select v-model="toModify.lessonType">
|
||||
<option v-for="item in types" :value='item'>{{i18n(item)}}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<button class="create" @click="createMod=!createMod; askChanges(0);"> {{i18n("courses.confirm")}} </button>
|
||||
<button style="float:right;" @click="createMod=!createMod">{{i18n("courses.back")}}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<button v-if="!createMod" @click="setCreate()" style="display:flex; margin:0 auto 0 auto;">{{i18n("schedule.askCreate")}}</button>
|
||||
<div v-if="!createMod"v-for="element in schedule" style="width:50%;margin-left:auto; margin-right:auto;" >
|
||||
<div v-if="editElementID !== element.lessonID" style ="padding:15px 15px 15px 15px;">
|
||||
<button v-if="inFuture(element)" @click="editElementID = element.lessonID;setModify(element);">
|
||||
{{i18n("schedule.askChanges")}}
|
||||
</button>
|
||||
</div>
|
||||
<div v-else>
|
||||
<button @click="askChanges(1);"> {{i18n("courses.confirm")}} </button>
|
||||
<button @click="editElementID= '';"> {{i18n("courses.back")}} </button>
|
||||
</div>
|
||||
<div class="listElement">
|
||||
<div v-if="editElementID !== element.lessonID">
|
||||
<div>
|
||||
{{element.course.title}}
|
||||
</div>
|
||||
<div>{{formatDate(element.lessonStart)}}</div>
|
||||
<div>{{getHoursMinutes(element.lessonStart)}}-{{getHoursMinutes(element.lessonEnd)}}
|
||||
</div>
|
||||
<div>{{element.local}}</div>
|
||||
<div>{{i18n(element.lessonType)}}</div>
|
||||
</div>
|
||||
|
||||
<div v-else>
|
||||
<div>{{element.course.title}}</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("day")}}:
|
||||
<input type="date" :min="minDate" :max="maxDate" v-model="toModify.day">
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("start")}}:
|
||||
<input v-model="toModify.lessonStart" type="time" min="8:00" max="20:00"/>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("end")}}:
|
||||
<input v-model="toModify.lessonEnd" type="time" min="10:00" max="20:00" required />
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("Type")}}:
|
||||
<select v-model="toModify.lessonType">
|
||||
<option v-for="item in types" :value='item'>{{i18n(item)}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Local:
|
||||
{{element.local}}
|
||||
<div style="float:right;">
|
||||
<button @click="askChanges(2)" class="delete"> {{i18n("schedule.askDeletion")}} </button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.body {
|
||||
width:100%;
|
||||
margin-top:3.5%;
|
||||
}
|
||||
|
||||
.listElement{
|
||||
min-width:625px;
|
||||
border:2px solid black;
|
||||
font-size:25px;
|
||||
color:white;
|
||||
padding:20px;
|
||||
background-color:rgb(50,50,50);
|
||||
border-radius:20px;
|
||||
margin-bottom:10px;
|
||||
|
||||
}
|
||||
|
||||
input, select{
|
||||
padding:10px 10px 10px 10px;
|
||||
font-size:25px;
|
||||
cursor: pointer;
|
||||
border:none;
|
||||
border-radius:15px;
|
||||
}
|
||||
button{
|
||||
font-size:15px;
|
||||
height:auto;
|
||||
width:100px;
|
||||
border:none;
|
||||
border-radius:20px;
|
||||
|
||||
}
|
||||
|
||||
.delete{
|
||||
grid-area:delete;
|
||||
background-color:rgb(200,0,0);
|
||||
}
|
||||
button:hover{
|
||||
opacity:0.8;
|
||||
}
|
||||
|
||||
</style>
|
506
frontend/src/Apps/ManageSchedule.vue
Normal file
506
frontend/src/Apps/ManageSchedule.vue
Normal file
@ -0,0 +1,506 @@
|
||||
|
||||
<!----------------------------------------------------
|
||||
File: LessonRequests.vue
|
||||
Author: William Karpinski
|
||||
Scope: Extension Horaire
|
||||
Description: Lessons Management Page for the secretary
|
||||
----------------------------------------------------->
|
||||
|
||||
<script setup>
|
||||
|
||||
import { ref } from 'vue'
|
||||
import i18n from '@/i18n.js'
|
||||
import {formatDate,getHoursMinutes, invertedFormatDate, createLessonEvent} from '../scheduleFunctions.js'
|
||||
import {getAllSchedule, deleteLessonFromSchedule ,getSchedule, createSchedule} from "@/rest/scheduleRest.js";
|
||||
import {getLessons, createLesson, alterLesson, deleteLesson} from "@/rest/lessonSchedule.js"
|
||||
import {getTeachers} from "@/rest/Users.js"
|
||||
import {getcurriculum, getAllCurriculums} from "@/rest/curriculum.js"
|
||||
|
||||
const trueSchedule = ref()
|
||||
const schedule = ref();
|
||||
const lessonFinder = ref();
|
||||
const curriculum = ref();
|
||||
const allSchedules = ref(await getAllSchedule());
|
||||
const filter = ref("null");
|
||||
const subFilter = ref("null");
|
||||
const filters = ["Type","Teacher","Course"];
|
||||
const types = ["TP","TD","Course","Exam"];
|
||||
const locals = ["A0B1","A1B1","A2B1","A0B2"]
|
||||
const teachers = await getTeachers() ;
|
||||
const allCurriculum = ref();
|
||||
const courses = ref();
|
||||
|
||||
const createScheduleMod = ref(false);
|
||||
const createMod = ref(false);
|
||||
const deleteMod = ref(false);
|
||||
|
||||
const colors = {"TP":"rgb(36,175,255)","TD":"rgb(255,36,175)","Exam":"rgb(175,255,36)","Course":"rgb(255,36,175)"}
|
||||
const currentDate = new Date();
|
||||
|
||||
const editElementID = ref();
|
||||
|
||||
const maxDate = ref(invertedFormatDate(new Date([currentDate.getMonth()<7 ? currentDate.getFullYear() : (currentDate.getFullYear())+1],7,31)));
|
||||
|
||||
const minDate = ref(invertedFormatDate((new Date()).setDate(currentDate.getDate()+1)))
|
||||
|
||||
|
||||
const pattern = {
|
||||
"course": null,
|
||||
"day":null,
|
||||
"lessonStart": null,
|
||||
"lessonEnd": null,
|
||||
"lessonType": null,
|
||||
"local": null,
|
||||
"color": null,
|
||||
}
|
||||
|
||||
const lessonCreator = {
|
||||
"courseID" : null,
|
||||
"lessonStart":null,
|
||||
"lessonEnd":null,
|
||||
"lessonType":null,
|
||||
"local":null,
|
||||
"color":null,
|
||||
}
|
||||
|
||||
const patternModify = {
|
||||
"day": null,
|
||||
"lessonStart": null,
|
||||
"lesssonEnd": null,
|
||||
"local":null,
|
||||
"lessonType":null,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sets up allCurriculum to contain only the curriculums that don't have any schedule
|
||||
*/
|
||||
async function setCurriculum(){
|
||||
const temp = await getAllCurriculums();
|
||||
let isIn = false;
|
||||
let toReturn =[] ;
|
||||
for (let element in temp){
|
||||
for (let item in allSchedules.value){
|
||||
console.log(allSchedules.value[item])
|
||||
console.log(temp[element])
|
||||
if((allSchedules.value[item].curriculum.option == temp[element].option) && (allSchedules.value[item].curriculum.year == temp[element].year)){
|
||||
|
||||
isIn = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!isIn){
|
||||
toReturn.push(temp[element])
|
||||
}
|
||||
isIn = false;
|
||||
}
|
||||
allCurriculum.value = toReturn.slice();
|
||||
}
|
||||
|
||||
|
||||
const toModify = ref(Object.assign({}, pattern));
|
||||
const lessonBuffer = ref(Object.assign({}, pattern));
|
||||
const lessonCreatorBuffer = ref(Object.assign({},lessonCreator));
|
||||
|
||||
|
||||
function setModify(lesson){
|
||||
toModify.value.day = invertedFormatDate(new Date(lesson.lessonStart));
|
||||
toModify.value.lessonStart = getHoursMinutes(lesson.lessonStart);
|
||||
toModify.value.lessonEnd = getHoursMinutes(lesson.lessonEnd);
|
||||
toModify.value.local = lesson.local;
|
||||
toModify.value.lessonType = lesson.lessonType;
|
||||
}
|
||||
|
||||
function inFuture(lesson){
|
||||
let toCompare = new Date(lesson.lessonStart);
|
||||
let current = new Date();
|
||||
return (current < toCompare)
|
||||
}
|
||||
|
||||
async function setCourses(){
|
||||
courses.value = (await getcurriculum(curriculum.value.curriculumId)).courses
|
||||
}
|
||||
|
||||
/*
|
||||
* Sort the lessons via a criteria
|
||||
*/
|
||||
function sortSchedule(){
|
||||
schedule.value =trueSchedule.value.lessons;
|
||||
if(filter.value =="Teacher"){
|
||||
schedule.value = sortByTeacher(schedule.value,subFilter.value);
|
||||
|
||||
}
|
||||
else if(filter.value =="Type"){
|
||||
schedule.value = sortByType(schedule.value,subFilter.value);
|
||||
}
|
||||
else if(filter.value =="Course"){
|
||||
schedule.value = sortByCourse(schedule.value,subFilter.value);
|
||||
}
|
||||
}
|
||||
|
||||
function sortByType(lessons,type){
|
||||
if(type == null){
|
||||
return lessons;
|
||||
}
|
||||
const matrix = [];
|
||||
for (let element in lessons){
|
||||
if(lessons[element].lessonType == type){
|
||||
matrix.push(lessons[element])
|
||||
}
|
||||
}
|
||||
return matrix
|
||||
}
|
||||
|
||||
function sortByCourse(lessons,course){
|
||||
if(course == null){
|
||||
return lessons;
|
||||
}
|
||||
const matrix = [];
|
||||
for (let element in lessons){
|
||||
if(lessons[element].course.courseID == course.courseID){
|
||||
matrix.push(lessons[element])
|
||||
}
|
||||
}
|
||||
return matrix
|
||||
}
|
||||
|
||||
function sortByTeacher(lessons, teacher){
|
||||
if(teacher == null){
|
||||
return lessons;
|
||||
}
|
||||
const matrix = [];
|
||||
for (let element in lessons){
|
||||
if(lessons[element].course.owner.regNo == teacher.regNo){
|
||||
matrix.push(lessons[element])
|
||||
}
|
||||
}
|
||||
return matrix
|
||||
}
|
||||
|
||||
/*
|
||||
* Change the schedule filter
|
||||
*/
|
||||
async function changeSchedule(){
|
||||
schedule.value =trueSchedule.value.lessons;
|
||||
curriculum.value = trueSchedule.value.curriculum;
|
||||
|
||||
courses.value = (await getcurriculum(curriculum.value.curriculumId)).courses;
|
||||
filter.value = "null";
|
||||
subFilter.value = "null"
|
||||
}
|
||||
|
||||
|
||||
async function newLesson(){
|
||||
let isnull = false;
|
||||
if (lessonBuffer.value.lessonType != null){
|
||||
lessonBuffer.value.color = colors[lessonBuffer.value.lessonType];
|
||||
for(let element in lessonBuffer.value){
|
||||
if(lessonBuffer.value[element] == null){
|
||||
isnull=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!isnull){
|
||||
|
||||
let start = createLessonEvent(lessonBuffer.value.day,lessonBuffer.value.lessonStart)
|
||||
let end = createLessonEvent(lessonBuffer.value.day,lessonBuffer.value.lessonEnd)
|
||||
|
||||
lessonCreatorBuffer.value.lessonStart = start;
|
||||
lessonCreatorBuffer.value.lessonEnd = end;
|
||||
lessonCreatorBuffer.value.color = lessonBuffer.value.color;
|
||||
lessonCreatorBuffer.value.lessonType =lessonBuffer.value.lessonType;
|
||||
lessonCreatorBuffer.value.local = lessonBuffer.value.local;
|
||||
lessonCreatorBuffer.value.courseID = lessonBuffer.value.course.courseID;
|
||||
|
||||
await createLesson(lessonCreatorBuffer.value);
|
||||
|
||||
lessonFinder.value = await getLessons();
|
||||
|
||||
}
|
||||
}
|
||||
lessonBuffer.value = Object.assign({}, pattern);
|
||||
lessonFinder.value = null;
|
||||
lessonCreatorBuffer.value = Object.assign({},lessonCreator)
|
||||
trueSchedule.value = null;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Modify a lesson
|
||||
*/
|
||||
|
||||
async function patchLesson(lesson){
|
||||
|
||||
for (let element in toModify.value){
|
||||
if (element =="lessonType" && (toModify.value[element] != lesson[element])){
|
||||
await alterLesson(lesson.lessonID,{lessonType:toModify.value[element]});
|
||||
}
|
||||
if (element =="local" && (toModify.value[element] != lesson[element])){
|
||||
await alterLesson(lesson.lessonID,{local:toModify.value[element]});
|
||||
}
|
||||
if (element =="lessonStart" && (toModify.value[element] != lesson[element])){
|
||||
await alterLesson(lesson.lessonID,{lessonStart:createLessonEvent(toModify.value.day,toModify.value[element])
|
||||
});
|
||||
}
|
||||
if (element =="lessonEnd" && (toModify.value[element] != lesson[element])){
|
||||
await alterLesson(lesson.lessonID,{lessonEnd:createLessonEvent(toModify.value.day,toModify.value[element])
|
||||
});
|
||||
}
|
||||
if(element == "day" && (toModify.value[element] != invertedFormatDate(new Date(lesson.lessonStart))) ){
|
||||
|
||||
if(toModify.value.lessonStart == lesson.lessonStart){
|
||||
await alterLesson(lesson.lessonID,{lessonStart:createLessonEvent(toModify.value.day,lesson.lessonStart)
|
||||
});}
|
||||
if(toModify.value.lessonEnd == lesson.lessonEnd){
|
||||
await alterLesson(lesson.lessonID,{lessonStart:createLessonEvent(toModify.value.day,lesson.lessonStart)});
|
||||
}
|
||||
}
|
||||
}
|
||||
toModify.value= Object.assign({},patternModify);
|
||||
trueSchedule.value = await getSchedule(trueSchedule.value.scheduleId);
|
||||
schedule.value =trueSchedule.value.lessons;
|
||||
editElementID.value= '';
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function removeLesson() {
|
||||
await deleteLessonFromSchedule(trueSchedule.value.scheduleId, editElementID.value)
|
||||
await deleteLesson(editElementID.value);
|
||||
trueSchedule.value = await getSchedule(trueSchedule.value.scheduleId);
|
||||
schedule.value =trueSchedule.value.lessons;
|
||||
editElementID.value= '';
|
||||
|
||||
}
|
||||
/*
|
||||
* Create a new Schedule
|
||||
*/
|
||||
async function newSchedule(){
|
||||
await createSchedule(curriculum.value);
|
||||
allSchedules.value = await getAllSchedule();
|
||||
setCurriculum();
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<div class="body">
|
||||
<div class="listTitle buttonGrid"v-if="!createMod && !createScheduleMod" >
|
||||
<button class="create" @click="setCurriculum();createScheduleMod = true"> {{i18n("schedule.createSchedule")}}</button>
|
||||
<button class="create" @click="createMod = true;">{{i18n("schedule.createLesson")}}</button>
|
||||
<button class="delete" @click="deleteMod = !deleteMod;">{{!deleteMod ? i18n("schedule.deleteMod") : i18n("schedule.noDeleteMod")}}</button>
|
||||
|
||||
</div>
|
||||
<div v-if="createMod">
|
||||
<form class="listElement" style="width:40%; margin:0 auto 0 auto;">
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("schedule")}} :
|
||||
<select @change="setCourses()"v-model="curriculum">
|
||||
<option v-for="item in allSchedules" :value='item.curriculum'>{{item.curriculum.option}} - {{item.curriculum.year}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("Course")}} :
|
||||
<select v-if="curriculum != null" v-model="lessonBuffer.course">
|
||||
<option v-for="item in courses" :value='item'>{{item.title}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("day")}}:
|
||||
<input type="date" :min="minDate" :max="maxDate" v-model="lessonBuffer.day">
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("start")}}:
|
||||
<input v-model="lessonBuffer.lessonStart" type="time" min="08:00" max="18:00" required />
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("end")}}:
|
||||
<input v-model="lessonBuffer.lessonEnd" type="time" min="10:00" max="20:00" required />
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Type:
|
||||
<select v-model="lessonBuffer.lessonType">
|
||||
<option v-for="item in types" :value='item'>{{item}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Local:
|
||||
<select v-model="lessonBuffer.local">
|
||||
<option v-for="item in locals" :value='item'>{{item}}</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<button class="create" @click="createMod=!createMod; newLesson();"> {{i18n("courses.confirm")}} </button>
|
||||
<button style="float:right;" @click="createMod=!createMod">{{i18n("courses.back")}}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div v-if="createScheduleMod">
|
||||
<form class="listElement" style="width:40%; margin:0 auto 0 auto;">
|
||||
<div style="margin-bottom:20px;">
|
||||
{{i18n("schedule")}} :
|
||||
<select v-model="curriculum">
|
||||
<option v-for="item in allCurriculum" :value='item'>{{item.option}} - {{item.year}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<button class="create" @click="createScheduleMod=!createScheduleMod ;newSchedule();"> {{i18n("courses.confirm")}} </button>
|
||||
<button style="float:right;" @click="createScheduleMod=!createScheduleMod;">{{i18n("courses.back")}}</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div v-if="!createMod && !createScheduleMod">
|
||||
<select @change="changeSchedule()" v-model="trueSchedule">
|
||||
<option v-for="item in allSchedules" :value='item'>{{item.curriculum.option}} - {{item.curriculum.year}}</option>
|
||||
</select>
|
||||
<select v-if="schedule != null" @change="subFilter = 'null'" v-model="filter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in filters" :value="item">{{i18n(item.toString())}}</option>
|
||||
</select>
|
||||
<select @change="sortSchedule()" v-if="filter == 'Teacher'" v-model="subFilter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in teachers" :value=item>{{item.lastName}}</option>
|
||||
</select>
|
||||
<select @change="sortSchedule()" v-if="filter == 'Course'" v-model="subFilter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in courses" :value=item>{{item.title}}</option>
|
||||
</select>
|
||||
<select @change="sortSchedule()" v-if="filter == 'Type'" v-model="subFilter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in types" :value='item'>{{item}}</option>
|
||||
</select>
|
||||
|
||||
</div>
|
||||
<div v-if="!createMod && !createScheduleMod" :key="element.lessonID" v-for="element in schedule" style="width:50%;margin-left:auto; margin-right:auto;" >
|
||||
<div v-if="editElementID !== element.lessonID" style ="padding:15px 15px 15px 15px;">
|
||||
<button v-if="inFuture(element)" @click="editElementID = element.lessonID;setModify(element);">
|
||||
{{i18n("courses.modify")}}
|
||||
</button>
|
||||
</div>
|
||||
<div v-else>
|
||||
<button @click="patchLesson(element);"> {{i18n("courses.confirm")}} </button>
|
||||
<button @click="editElementID= '';"> {{i18n("courses.back")}} </button>
|
||||
</div>
|
||||
<div class="listElement">
|
||||
<div v-if="editElementID != element.lessonID">
|
||||
<div>
|
||||
{{element.course.title}}
|
||||
</div>
|
||||
<div>{{formatDate(element.lessonStart)}}</div>
|
||||
<div>{{getHoursMinutes(element.lessonStart)}}-{{getHoursMinutes(element.lessonEnd)}}
|
||||
</div>
|
||||
<div>{{element.local}}</div>
|
||||
<div>{{element.lessonType}}</div>
|
||||
</div>
|
||||
|
||||
<div v-else>
|
||||
<div>{{element.course.title}}</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Day:
|
||||
<input type="date" :min="minDate" :max="maxDate" v-model="toModify.day">
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Start:
|
||||
<input v-model="toModify.lessonStart" type="time" min="8:00" max="20:00"/>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
End:
|
||||
<input v-model="toModify.lessonEnd" type="time" min="10:00" max="20:00" required />
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Type:
|
||||
<select v-model="toModify.lessonType">
|
||||
<option v-for="item in types" :value='item'>{{item}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div style="margin-bottom:20px;">
|
||||
Local:
|
||||
<select v-model="toModify.local">
|
||||
<option v-for="item in locals" :value='item'>{{item}}</option>
|
||||
</select>
|
||||
<div v-if="deleteMod" style="float:right;">
|
||||
<button class="delete" @click="removeLesson(element);"> {{i18n("courses.deleteCourse")}} </button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.body {
|
||||
width:100%;
|
||||
margin-top:3.5%;
|
||||
}
|
||||
|
||||
.listElement{
|
||||
min-width:625px;
|
||||
border:2px solid black;
|
||||
font-size:25px;
|
||||
color:white;
|
||||
padding:20px;
|
||||
background-color:rgb(50,50,50);
|
||||
border-radius:20px;
|
||||
margin-bottom:10px;
|
||||
|
||||
}
|
||||
|
||||
input, select{
|
||||
padding:10px 10px 10px 10px;
|
||||
font-size:25px;
|
||||
cursor: pointer;
|
||||
border:none;
|
||||
border-radius:15px;
|
||||
}
|
||||
button{
|
||||
font-size:15px;
|
||||
height:50px;
|
||||
width:100px;
|
||||
border:none;
|
||||
border-radius:20px;
|
||||
|
||||
}
|
||||
|
||||
.buttonGrid{
|
||||
display:grid;
|
||||
grid-template-columns: auto auto;
|
||||
column-gap:50px;
|
||||
grid-template-areas:
|
||||
"create delete";
|
||||
}
|
||||
|
||||
.create{
|
||||
grid-area:create;
|
||||
|
||||
background-color:rgb(0,200,0);
|
||||
|
||||
}
|
||||
|
||||
.delete{
|
||||
grid-area:delete;
|
||||
background-color:rgb(200,0,0);
|
||||
}
|
||||
|
||||
.listTitle{
|
||||
min-width:380px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width:25%;
|
||||
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;
|
||||
|
||||
button:hover{
|
||||
opacity:0.8;
|
||||
}
|
||||
}
|
||||
</style>
|
802
frontend/src/Apps/Schedule.vue
Normal file
802
frontend/src/Apps/Schedule.vue
Normal file
@ -0,0 +1,802 @@
|
||||
|
||||
<!----------------------------------------------------
|
||||
File: Schedule.vue
|
||||
Author: William Karpinski
|
||||
Scope: Extension Horaire
|
||||
Description: Schedules Page accessed by everyone
|
||||
----------------------------------------------------->
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import {getDifferenceTime,lastDateOfMonth,formatDate,getFirstDay,sortByDate,weekFromList,sundayToTheEnd,getMarginTop,getHoursMinutes, monthFromList, durationCourse} from '../scheduleFunctions.js'
|
||||
import {getAllSchedule} from "@/rest/scheduleRest.js";
|
||||
import {getOnesLessons, getOwnedLessons } from "@/rest/lessonSchedule.js"
|
||||
import {isLogged, getSelf,getTeachers} from "@/rest/Users.js"
|
||||
import {getUserActualCourses} from "@/rest/courses.js";
|
||||
import {getcurriculum} from "@/rest/curriculum.js";
|
||||
import i18n from "../i18n.js";
|
||||
|
||||
const trueSchedule = ref()
|
||||
const log = await isLogged();
|
||||
const schedule = ref();
|
||||
const importedJSON = ref();
|
||||
const jsonSchedule = ref();
|
||||
const jsonMod = ref(false);
|
||||
const curriculum = ref();
|
||||
const shift = ref(getFirstDay(new Date()).getDay());
|
||||
let value = 1;
|
||||
let done = false;
|
||||
const len = ref(lastDateOfMonth(new Date()));
|
||||
const scheduleByWeek = ref();
|
||||
const month = ref();
|
||||
const mondayOfWeek =ref(getMonday(new Date()))
|
||||
const currentDate = ref(new Date())
|
||||
const allSchedules = await getAllSchedule();
|
||||
let counter = 0;
|
||||
const ownSchedule = ref();
|
||||
const filter = ref("null");
|
||||
const subFilter = ref("null");
|
||||
const focus = ref();
|
||||
const focusLessons = ref();
|
||||
let user;
|
||||
|
||||
if(log){
|
||||
user = await getSelf();
|
||||
if(user.role == "Teacher" || user.role == "Student"){
|
||||
|
||||
if(user.role == "Teacher"){
|
||||
ownSchedule.value = await getOwnedLessons();
|
||||
}
|
||||
|
||||
if(user.role == "Student"){
|
||||
let test = await getUserActualCourses();
|
||||
console.log(test);
|
||||
ownSchedule.value = await getOnesLessons();}
|
||||
|
||||
schedule.value = ownSchedule.value;
|
||||
|
||||
schedule.value.sort((a,b) => sortByDate(a,b));
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(schedule.value,new Date().getMonth());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const display =ref("Week");
|
||||
const format = ref("Grid");
|
||||
const filters = ["Type","Teacher","Course"];
|
||||
const types = ["TP","TD","Course","Exam"];
|
||||
const teachers = await getTeachers() ;
|
||||
const courses = ref();
|
||||
|
||||
|
||||
if(curriculum.value != null){
|
||||
courses.value = curriculum.value.courses;
|
||||
}
|
||||
const days = ["monday","tuesday","wednesday","thursday","friday","saturday","sunday"];
|
||||
const months = ["january","february","march","april",'may',"june","july","august","september","october","november","december"]
|
||||
const firstDayOfMonth = ref(getFirstDay(new Date()))
|
||||
const monthDone = ref(false);
|
||||
function getMonday(d) {
|
||||
d = new Date(d);
|
||||
d.setHours(0,0,0);
|
||||
var day = d.getDay(),
|
||||
diff = d.getDate() - day + (day == 0 ? -6 : 1);
|
||||
return new Date(d.setDate(diff));
|
||||
}
|
||||
|
||||
function getAnyDays(d){
|
||||
var day = new Date(mondayOfWeek.value);
|
||||
day.setDate(day.getDate() + d );
|
||||
return day;
|
||||
}
|
||||
|
||||
|
||||
function verifUser(){
|
||||
if(log)
|
||||
return (user.role == "Student" || user.role == "Teacher");
|
||||
return false
|
||||
}
|
||||
function displayOwnSchedule(){
|
||||
schedule.value = ownSchedule.value;
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
|
||||
value = 1;
|
||||
counter=0;
|
||||
done = false;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a JSON from a schedule
|
||||
*/
|
||||
function createJSON(){
|
||||
const json = {"data":[]};
|
||||
for(let element in schedule.value){
|
||||
let item = {};
|
||||
item["title"] = schedule.value[element].course.title + "\n" + schedule.value[element].course.owner.lastName+ "\n" + schedule.value[element].local
|
||||
item["start"] = schedule.value[element].lessonStart;
|
||||
item["end"] = schedule.value[element].lessonEnd;
|
||||
item["color"] = schedule.value[element].color;
|
||||
json.data.push(item)
|
||||
}
|
||||
return json
|
||||
}
|
||||
|
||||
/*
|
||||
* Export a JSON
|
||||
*/
|
||||
|
||||
function exportJSON(){
|
||||
let json = createJSON();
|
||||
const data = JSON.stringify(json);
|
||||
const blob = new Blob([data], {type:"application/json"});
|
||||
const a = document.createElement('a');
|
||||
a.href = URL.createObjectURL(blob);
|
||||
a.download = "Schedule.json";
|
||||
a.click();
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Used to convert a JSON imported to an object
|
||||
*/
|
||||
function onFileChange(e) {
|
||||
let files = e.target.files || e.dataTransfer.files;
|
||||
if (!files.length) return;
|
||||
readFile(files[0]);
|
||||
}
|
||||
function readFile(file) {
|
||||
let reader = new FileReader();
|
||||
reader.onload = e => {
|
||||
let json = JSON.parse(e.target.result);
|
||||
importedJSON.value = json
|
||||
createScheduleFromJSON();
|
||||
jsonMod.value= true;
|
||||
};
|
||||
reader.readAsText(file);
|
||||
|
||||
|
||||
}
|
||||
|
||||
function createScheduleFromJSON(){
|
||||
let jsonBrut = importedJSON.value;
|
||||
let toEventList = [];
|
||||
for(let element in jsonBrut["data"]){
|
||||
let temp = {}
|
||||
temp["title"] = jsonBrut["data"][element].title;
|
||||
temp["lessonStart"] = jsonBrut["data"][element].start;
|
||||
temp["lessonEnd"] = jsonBrut["data"][element].end;
|
||||
temp["color"] = jsonBrut["data"][element].color;
|
||||
toEventList.push(temp);
|
||||
}
|
||||
jsonSchedule.value = toEventList;
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(jsonSchedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(jsonSchedule.value,new Date().getMonth());
|
||||
}
|
||||
|
||||
/*
|
||||
* Display the JSON on the schedule
|
||||
*/
|
||||
function switchToJSON(){
|
||||
jsonMod.value = true;
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(jsonSchedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(jsonSchedule.value,new Date().getMonth());
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* used to focus on a lesson when we click on it
|
||||
*/
|
||||
function lessonFocus(element){
|
||||
if(!jsonMod.value){
|
||||
focus.value = element;
|
||||
var lessonsList = [];
|
||||
for (let element in schedule.value){
|
||||
if (schedule.value[element].course.courseID == focus.value.course.courseID){
|
||||
lessonsList.push(schedule.value[element]);
|
||||
}
|
||||
}
|
||||
focusLessons.value = lessonsList;}
|
||||
}
|
||||
|
||||
/*
|
||||
* convert the current date to a DATE object
|
||||
*/
|
||||
function dateOfMonth(i){
|
||||
|
||||
return new Date(currentDate.value.getFullYear(),currentDate.value.getMonth(),i);
|
||||
}
|
||||
|
||||
function sortSchedule(){
|
||||
schedule.value =trueSchedule.value.lessons;
|
||||
if(filter.value =="Teacher"){
|
||||
schedule.value = sortByTeacher(schedule.value,subFilter.value);
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
|
||||
value = 1;
|
||||
counter=0;
|
||||
|
||||
|
||||
}
|
||||
else if(filter.value =="Type"){
|
||||
schedule.value = sortByType(schedule.value,subFilter.value);
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
|
||||
value = 1;
|
||||
counter=0;
|
||||
|
||||
|
||||
|
||||
}
|
||||
else if(filter.value =="Course"){
|
||||
schedule.value = sortByCourse(schedule.value,subFilter.value);
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
|
||||
value = 1;
|
||||
counter=0;
|
||||
}
|
||||
|
||||
if(focus.value != null){
|
||||
lessonFocus(focus.value)
|
||||
}
|
||||
}
|
||||
|
||||
function sortByType(lessons,type){
|
||||
if(type == null){
|
||||
return lessons;
|
||||
}
|
||||
const matrix = [];
|
||||
for (let element in lessons){
|
||||
if(lessons[element].lessonType == type){
|
||||
matrix.push(lessons[element])
|
||||
}
|
||||
}
|
||||
return matrix
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function sortByCourse(lessons,course){
|
||||
if(course == null){
|
||||
return lessons;
|
||||
}
|
||||
const matrix = [];
|
||||
for (let element in lessons){
|
||||
if(lessons[element].course.courseID == course.courseID){
|
||||
matrix.push(lessons[element])
|
||||
}
|
||||
}
|
||||
return matrix
|
||||
}
|
||||
|
||||
function sortByTeacher(lessons, teacher){
|
||||
if(teacher == null){
|
||||
return lessons;
|
||||
}
|
||||
const matrix = [];
|
||||
for (let element in lessons){
|
||||
if(lessons[element].course.owner.regNo == teacher.regNo){
|
||||
matrix.push(lessons[element])
|
||||
}
|
||||
}
|
||||
return matrix
|
||||
}
|
||||
|
||||
/*
|
||||
* Change the schedule filter
|
||||
*/
|
||||
async function changeSchedule(){
|
||||
schedule.value =trueSchedule.value.lessons;
|
||||
curriculum.value = trueSchedule.value.curriculum;
|
||||
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
|
||||
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
|
||||
value = 1;
|
||||
counter=0;
|
||||
done = false;
|
||||
courses.value = (await getcurriculum(curriculum.value.curriculumId)).courses;
|
||||
filter.value = "null";
|
||||
subFilter.value = "null"
|
||||
focus.value = null;
|
||||
focusLessons.value = null;
|
||||
jsonMod.value = false;
|
||||
}
|
||||
/*
|
||||
* change the week to display
|
||||
*/
|
||||
function changeWeek(i){
|
||||
const temp = getAnyDays(i);
|
||||
mondayOfWeek.value = temp;
|
||||
if(scheduleByWeek.value != null)
|
||||
if(jsonMod.value){
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(jsonSchedule.value, mondayOfWeek.value))}
|
||||
else{
|
||||
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value, mondayOfWeek.value))}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* change the month to display
|
||||
*/
|
||||
function changeMonth(i){
|
||||
const temp = currentDate.value;
|
||||
currentDate.value = new Date( ( 0< temp.getMonth()+i < 13 ? temp.getFullYear() : temp.getFullYear()+i), (0< temp.getMonth()+i <13 ? temp.getMonth()+i : 12 ),1);
|
||||
shift.value= getFirstDay(currentDate.value).getDay();
|
||||
len.value= lastDateOfMonth(currentDate.value);
|
||||
value = 1;
|
||||
counter = 0;
|
||||
done=false;
|
||||
if(month.value != null){
|
||||
if(jsonMod.value){
|
||||
month.value = monthFromList(jsonSchedule.value,currentDate.value.getMonth())}
|
||||
}
|
||||
else{
|
||||
month.value = monthFromList(schedule.value,currentDate.value.getMonth())}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* used to display correctly the dates of a month
|
||||
*/
|
||||
|
||||
function isAValue(){
|
||||
if(value-shift.value<0 ){
|
||||
counter++;
|
||||
value++;
|
||||
return false;
|
||||
}
|
||||
if(value-shift.value<len.value){
|
||||
value++;
|
||||
counter++;
|
||||
return true;}
|
||||
|
||||
if(value-shift.value==len.value){
|
||||
done = true;
|
||||
counter++;
|
||||
|
||||
|
||||
if(counter> 35){
|
||||
counter=1;
|
||||
value = 2;
|
||||
done = false;
|
||||
return true; }
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<div class="grid">
|
||||
<div class="schedule" v-if="format == 'Grid'">
|
||||
<template v-if="display=='Week'">
|
||||
<table class="table">
|
||||
<tr style="background-color:rgb(24,24,24)">
|
||||
<th>
|
||||
<button @click="changeWeek(-7)">{{i18n("schedule.previous")}}</button>
|
||||
<button @click="changeWeek(7)">{{i18n("schedule.next")}}</button>
|
||||
<button @click="mondayOfWeek = getMonday(new Date());
|
||||
scheduleByWeek != null ? scheduleByWeek = sundayToTheEnd(weekFromList(schedule.value, mondayOfWeek)) : null;">{{i18n("schedule.current")}}</button>
|
||||
|
||||
</th>
|
||||
<th class="header" v-for='d,index in 7' >
|
||||
<p class="childHeader">
|
||||
{{i18n(days[index])}}
|
||||
</p>
|
||||
<p class="childHeader">
|
||||
{{formatDate(getAnyDays(index))}}
|
||||
</p>
|
||||
</th>
|
||||
|
||||
|
||||
</tr>
|
||||
<tr v-for="(n,index) in 12">
|
||||
<th class="hour">{{8 + index}}:00-{{9+index}}:00</th>
|
||||
<td v-for="m in 7"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div v-if="scheduleByWeek != null " class="courseGrid">
|
||||
<div class="dayCourse" v-for="element in scheduleByWeek">
|
||||
<template v-for="i,index in element.length">
|
||||
<div class="course" @click.native="lessonFocus(element[index])" v-bind:style="{background:element[index].color,
|
||||
|
||||
height:((getDifferenceTime(element[index].lessonEnd,element[index].lessonStart)/7.2)-0.5)+'%', top:((getMarginTop(element, index, index-1)/7.20))+'%'}">
|
||||
<div class="hourStart">
|
||||
{{getHoursMinutes(element[index].lessonStart)}}
|
||||
|
||||
</div>
|
||||
<div class="infos">
|
||||
<p class="childInfos" >{{jsonMod ? element[index].title : element[index].course.title}}</p>
|
||||
<p class="childInfos"v-if="!jsonMod">{{element[index].local}}</p>
|
||||
<p class="childInfos"v-if="!jsonMod">{{element[index].lessonType}}</p>
|
||||
<p class="childInfos"v-if="!jsonMod">{{element[index].course.owner.lastName}}</p>
|
||||
|
||||
</div>
|
||||
<div class="hourEnd">
|
||||
{{getHoursMinutes(element[index].lessonEnd)}}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template v-else>
|
||||
<table class="table">
|
||||
<tr style="background-color:rgb(24,24,24); height:8.33%;">
|
||||
<th colspan="7" class="header">
|
||||
<div>{{i18n(months[currentDate.getMonth()])}} {{currentDate.getFullYear()}}</div>
|
||||
<button style="position:absolute; top:0; left:0;" @click="changeMonth(-1)">{{i18n("schedule.previous")}}</button>
|
||||
<button style="position:absolute; bottom:0; left:0;"@click="changeMonth(1)">{{i18n("schedule.next")}}</button>
|
||||
|
||||
</th>
|
||||
|
||||
</tr>
|
||||
<tr style="background-color:rgb(24,24,24); height:8.33%;" >
|
||||
<th class="header" v-for='d,index in 7' >
|
||||
{{i18n(days[index])}}
|
||||
</th>
|
||||
</tr>
|
||||
<tr v-for="n in 5" style="height:16.67%;">
|
||||
<td v-for="m,i in 7" style="height:16.67%; position:relative;">
|
||||
<div v-if="isAValue()" style="top:0; right:2%; border-radius:20%;color:rgb(200,200,200) ; position:absolute;z-index:50;">{{value-shift}}</div>
|
||||
<div v-if="month != null" style="overflow-y:scroll; height:100%;" >
|
||||
<template v-for="element in month[value-shift]">
|
||||
<div v-if="!done"class="course" @click.native="lessonFocus(element)" v-bind:style="{background:element.color, height:100+'%'}">
|
||||
|
||||
<div class="hourStart">
|
||||
{{getHoursMinutes(element.lessonStart)}}
|
||||
</div>
|
||||
<div class="infos">
|
||||
<p class="childInfos" >{{jsonMod ? element.title : element.course.title}}</p>
|
||||
<p class="childInfos"v-if="!jsonMod">{{element.local}}</p>
|
||||
<p class="childInfos"v-if="!jsonMod">{{element.lessonType}}</p>
|
||||
<p class="childInfos"v-if="!jsonMod">{{element.course.owner.lastName}}</p>
|
||||
|
||||
</div>
|
||||
<div class="hourEnd">
|
||||
{{getHoursMinutes(element.lessonEnd)}}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</template>
|
||||
</div>
|
||||
<div class="schedule" v-else>
|
||||
|
||||
<div v-if="display == 'Week'">
|
||||
<button @click="changeWeek(-7)">Previous</button>
|
||||
<button @click="changeWeek(7)">Next</button>
|
||||
<button @click="mondayOfWeek = getMonday(new Date());
|
||||
scheduleByWeek != null ? scheduleByWeek = sundayToTheEnd(weekFromList(schedule.value, mondayOfWeek)) : null;">Current</button>
|
||||
|
||||
|
||||
<template v-for="i,index in 7">
|
||||
<div class="body" style="background-color:#181818;">{{i18n(days[index])}} {{formatDate(getAnyDays(index))}}
|
||||
</div>
|
||||
<template v-if="scheduleByWeek != null">
|
||||
<div class="body" style="background-color:#353535;" >
|
||||
<div class="containerList"v-for="n,j in scheduleByWeek[index].length" @click.native="lessonFocus(scheduleByWeek[index][j])" >
|
||||
<div class="colorList" v-bind:style="{background:scheduleByWeek[index][j].color}"></div>
|
||||
<div class="hoursList">{{ getHoursMinutes(scheduleByWeek[index][j].lessonStart)}}-{{getHoursMinutes(scheduleByWeek[index][j].lessonEnd)}}</div>
|
||||
<div class="titleList">{{scheduleByWeek[index][j].course.title}}</div>
|
||||
<div class="teacherList">{{scheduleByWeek[index][j].course.owner.lastName}}</div>
|
||||
<div class="localList">{{scheduleByWeek[index][j].local}}</div>
|
||||
<div class="typeList">{{scheduleByWeek[index][j].lessonType}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div v-if="display == 'Month'">
|
||||
<button @click="changeMonth(-1)">Previous</button>
|
||||
<button @click="changeMonth(1)">Next</button>
|
||||
<div class="body" >{{i18n(months[currentDate.getMonth()])}} {{currentDate.getFullYear()}}</div>
|
||||
|
||||
<template v-for="i,index in lastDateOfMonth(currentDate.getMonth())-1">
|
||||
<div class="body" style="background-color:#181818;">{{ dateOfMonth(i).getDay()-1== -1 ? i18n(days[6]) : i18n(days[dateOfMonth(i).getDay()-1]) }} {{formatDate(dateOfMonth(i))}}
|
||||
</div>
|
||||
<template v-if="scheduleByWeek != null">
|
||||
<div class="body" style="background-color:#353535;" >
|
||||
<div class="containerList" v-for="n,j in month[i].length" @click.native="lessonFocus( month[i][j])">
|
||||
<div class="colorList" v-bind:style="{background:month[i][j].color}"></div>
|
||||
<div class="hoursList">{{ getHoursMinutes(month[i][j].lessonStart)}}-{{getHoursMinutes(month[i][j].lessonEnd)}}</div>
|
||||
<div class="titleList">{{month[i][j].course.title}}</div>
|
||||
<div class="teacherList">{{month[i][j].course.owner.lastName}}</div>
|
||||
<div class="localList">{{month[i][j].local}}</div>
|
||||
<div class="typeList">{{month[i][j].lessonType}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="options">
|
||||
<div class="settings">
|
||||
<div class="body" style="background-color:rgb(50,50,50);margin:5% 0 5% 0;">{{i18n("schedule.settings")}}</div>
|
||||
<select @change="changeSchedule()" v-model="trueSchedule">
|
||||
<option v-for="item in allSchedules" :value='item'>{{item.curriculum.option}}-{{item.curriculum.year}}</option>
|
||||
</select>
|
||||
<button v-if="display=='Week'" @click="display='Month'">{{i18n("Week")}}</button>
|
||||
<button v-if="display=='Month'" @click="display='Week'; value=1;">{{i18("Month")}}</button>
|
||||
<button v-if="format == 'Grid'" @click="format ='List'">{{i18n("Grid")}}</button>
|
||||
<button v-if="format == 'List'" @click ="format = 'Grid'">{{i18n("List")}}</button>
|
||||
<button v-if="verifUser()" @click="jsonMod=false ;displayOwnSchedule();">{{i18n("OwnSchedule")}}</button>
|
||||
<button v-if="importedJSON != null" @click="switchToJSON()">{{i18n("SwitchToJSON")}}</button>
|
||||
|
||||
<select v-if="schedule != null && !jsonMod" @change="subFilter = 'null'" v-model="filter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in filters" :value="item">{{i18n(item)}}</option>
|
||||
</select>
|
||||
<select @change="sortSchedule()" v-if="filter == 'Teacher'" v-model="subFilter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in teachers" :value=item>{{item.lastName}}</option>
|
||||
</select>
|
||||
<select @change="sortSchedule()" v-if="filter == 'Course'" v-model="subFilter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in courses" :value=item>{{item.title}}</option>
|
||||
</select>
|
||||
<select @change="sortSchedule()" v-if="filter == 'Type'" v-model="subFilter">
|
||||
<option :value ="null">No Filter</option>
|
||||
<option v-for="item in types" :value='item'>{{i18n(item)}}</option>
|
||||
</select>
|
||||
<button @click="exportJSON()" >Export JSON</button>
|
||||
|
||||
<div style="color:white;">IMPORT JSON</div>
|
||||
<input type="file" @change="onFileChange" accept="application/JSON" ></input>
|
||||
|
||||
|
||||
</div>
|
||||
<div v-if="focus != null && !jsonMod" class="moreInfos">
|
||||
<div class="body" style="background-color:rgb(50,50,50); height:10%; font-size:2em;" >{{i18n("request.moreInfos")}}</div>
|
||||
<div class="body" :style="{background:focus.color,height:auto,fontSize:1.2+'em', alignItems:center}">
|
||||
{{focus.course.title}}</div>
|
||||
|
||||
<div class="body" style="background-color:rgb(50,50,50);">{{i18n("schedule.teachers")}}</div>
|
||||
<div class="body" style="background-color:#484848;">
|
||||
<div>{{focus.course.owner.lastName}}</div>
|
||||
<div v-for="element in focus.course.assistants">
|
||||
{{element.lastName}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="body" style="background-color:rgb(50,50,50);">{{i18n("schedule.courses")}}</div>
|
||||
<div class="body" style="background-color:#484848;"v-for="lesson in focusLessons">
|
||||
{{ getHoursMinutes(lesson.lessonStart)}}-{{getHoursMinutes(lesson.lessonEnd)}}
|
||||
{{ lesson.local}}
|
||||
{{i18n(lesson.lessonType.toString())}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.grid{
|
||||
min-width:1400px;
|
||||
display:grid;
|
||||
margin-top:2%;
|
||||
align-items:center;
|
||||
justify-content:center;
|
||||
grid-template-columns:72% 14.5%;
|
||||
column-gap:2vw;
|
||||
overflow:hidden;
|
||||
grid-template-areas:"schedule options";
|
||||
}
|
||||
.schedule{
|
||||
min-width:900px;
|
||||
position:relative;
|
||||
overflow-y:scroll;
|
||||
border-radius:20px;
|
||||
grid-area:schedule;
|
||||
width:100%;
|
||||
height:85vh;
|
||||
background-color:rgba(255,255,255,0.1);
|
||||
}
|
||||
.options{
|
||||
display:grid;
|
||||
border-radius:20px;
|
||||
grid-area:options;
|
||||
background-color:rgba(255,255,255,0.1);
|
||||
width:100%;
|
||||
height:85vh;
|
||||
min-width:240px;
|
||||
|
||||
grid-template-rows:40% 60%;
|
||||
}
|
||||
|
||||
.settings{
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
width:80%;
|
||||
margin:0 auto 0 auto;
|
||||
}
|
||||
|
||||
|
||||
.settings select,.settings button{
|
||||
margin-top:2%;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
.moreInfos{
|
||||
width:90%;
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
margin:0 auto 0 auto;
|
||||
overflow-y:scroll;
|
||||
overflow-x:hidden;
|
||||
}
|
||||
|
||||
.table{
|
||||
width:100%;
|
||||
height:100%;
|
||||
border-spacing:0;
|
||||
border-collapse:separate;
|
||||
border-radius: 20px;
|
||||
border: 2px solid black
|
||||
}
|
||||
|
||||
.hour{
|
||||
background-color:rgb(72,72,72)
|
||||
|
||||
}
|
||||
|
||||
.header{
|
||||
width:12.5%;
|
||||
color:#FFFFFF;
|
||||
position:relative;
|
||||
}
|
||||
|
||||
|
||||
.childHeader{
|
||||
margin-top:0;
|
||||
margin-bottom:0;
|
||||
max-height:14.28%
|
||||
|
||||
}
|
||||
table th:not(:last-child),
|
||||
table td:not(:last-child) {
|
||||
border-right: 1px solid black;
|
||||
}
|
||||
|
||||
table tr:not(:last-child)>td,
|
||||
table tr:not(:last-child)>th
|
||||
{
|
||||
border-bottom:1px solid black;
|
||||
}
|
||||
|
||||
.courseGrid{
|
||||
top:13.75%;
|
||||
left:12.5%;
|
||||
position:absolute;
|
||||
width:87.5%;
|
||||
height:86.25%;
|
||||
display:grid;
|
||||
grid-template-columns:repeat(7,1fr);
|
||||
}
|
||||
|
||||
|
||||
.course{
|
||||
position:relative;
|
||||
border: 1px solid black;
|
||||
border-radius:10px;
|
||||
width:90%;
|
||||
margin-left:auto;
|
||||
margin-right:auto;
|
||||
display:grid;
|
||||
grid-template-rows:1fr 1fr 1fr;
|
||||
}
|
||||
|
||||
.dayCourse{
|
||||
display:block;
|
||||
}
|
||||
|
||||
.infos{
|
||||
height:100%;
|
||||
width:100%;
|
||||
font-size:0.75em;
|
||||
display:flex;
|
||||
flex-direction:column;
|
||||
align-items:center;
|
||||
justify-content:center;
|
||||
position:absolute;
|
||||
}
|
||||
|
||||
.childInfos{
|
||||
text-align:center;
|
||||
margin-top:0%;
|
||||
margin-bottom:0%;
|
||||
overflow:hidden;
|
||||
}
|
||||
|
||||
.hourStart{
|
||||
background-color:rgb(200,200,200);
|
||||
border-radius:5px;
|
||||
position:absolute;
|
||||
top:2%;
|
||||
left:2%;
|
||||
font-size:0.75em;
|
||||
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
.hourEnd{
|
||||
background-color:rgb(200,200,200);
|
||||
border-radius:3px;
|
||||
position:absolute;
|
||||
bottom:2%;
|
||||
left:2%;
|
||||
font-size:0.7em;
|
||||
}
|
||||
|
||||
.containerList{
|
||||
color:white;
|
||||
height:100px;
|
||||
font-size:20px;
|
||||
display:grid;
|
||||
grid-template-columns:5vw auto auto auto auto auto;
|
||||
grid-template-areas:
|
||||
"color hours title teacher local type";
|
||||
|
||||
}
|
||||
|
||||
.colorList{
|
||||
grid-area:color;
|
||||
align-self:center;
|
||||
|
||||
width:75%;
|
||||
height:75%;
|
||||
border:1px solid black;
|
||||
border-radius:20%;
|
||||
}
|
||||
|
||||
.hoursList{
|
||||
grid-area:hours;
|
||||
align-self:center;
|
||||
}
|
||||
|
||||
|
||||
.titleList{
|
||||
grid-area:title;
|
||||
align-self:center;
|
||||
}
|
||||
|
||||
.teacherList {
|
||||
grid-area:teacher;
|
||||
align-self:center;
|
||||
}
|
||||
.localList{
|
||||
grid-area:local;
|
||||
align-self:center;
|
||||
}
|
||||
|
||||
.typeList{
|
||||
grid-area:type;
|
||||
align-self:center;
|
||||
}
|
||||
.body {
|
||||
color:white;
|
||||
margin-top:2%;
|
||||
width:98%;
|
||||
border:2px solid black;
|
||||
border-radius:9px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
|
||||
</style>
|
23
frontend/src/rest/LessonRequests.js
Normal file
23
frontend/src/rest/LessonRequests.js
Normal file
@ -0,0 +1,23 @@
|
||||
import { restGet, restPost, restDelete, restPatch } from './restConsumer.js'
|
||||
|
||||
export async function getLessonRequest(id){
|
||||
return restGet('/requests/lessonRequest/' + id);
|
||||
}
|
||||
|
||||
export async function getAllRequests(){
|
||||
return restGet("/requests/lessonRequests");
|
||||
}
|
||||
export async function getOwnedRequests(){
|
||||
return restGet("/requests/lessonRequests/owned");
|
||||
}
|
||||
export async function createRequest(request){
|
||||
return restPost("/requests/lessonRequest", request);
|
||||
}
|
||||
|
||||
export async function changeRequestState(id, infos){
|
||||
return restPatch("/requests/lessonRequest/" + id, infos);
|
||||
}
|
||||
|
||||
export async function deleteRequest(id){
|
||||
return restDelete("/requests/lessonRequest/"+id);
|
||||
}
|
@ -8,18 +8,26 @@ import Profil from "@/Apps/Profil.vue"
|
||||
import Courses from "@/Apps/ManageCourses.vue"
|
||||
import Users from "@/Apps/UsersList.vue"
|
||||
import Students from "@/Apps/StudentsList.vue"
|
||||
import Schedule from "@/Apps/Schedule.vue"
|
||||
import ManageSchedule from "@/Apps/ManageSchedule.vue"
|
||||
import ManageOwnedLessons from "@/Apps/ManageOwnLessons.vue";
|
||||
import LessonRequests from "@/Apps/LessonRequests.vue";
|
||||
import Msg from "@/Apps/Msg.vue"
|
||||
import Forums from '@/Apps/Forums.vue'
|
||||
import Payments from "@/Apps/Inscription/PaymentInfo.vue";
|
||||
import ManageRequests from "@/Apps/Inscription/ManageRequests.vue";
|
||||
|
||||
const apps = {
|
||||
'/schedule': Schedule,
|
||||
'/manage-schedule': ManageSchedule,
|
||||
'/login': LoginPage,
|
||||
'/requests': ManageRequests,
|
||||
'/profil': Profil,
|
||||
'/manage-courses' : Courses,
|
||||
'/users-list' : Users,
|
||||
'/students-list' : Students,
|
||||
'/manage-owned-lessons': ManageOwnedLessons,
|
||||
'/manage-schedule-requests' : LessonRequests,
|
||||
'/msg' : Msg,
|
||||
'/forums': Forums,
|
||||
'/payments': Payments
|
||||
@ -30,10 +38,13 @@ const appsList = {
|
||||
'Notification': { path: '#/notifs', icon: 'fa-bell', text: i18n("app.notifications") },
|
||||
'Forum': { path: '#/forums', icon: 'fa-envelope', text: i18n("app.forum") },
|
||||
'Schedule': { path: '#/schedule', icon: 'fa-calendar-days', text: i18n("app.schedules") },
|
||||
'Requests': { path: '#/requests', icon: 'fa-users', text: "Requests" },
|
||||
'ManageSchedules': { path: '#/manage-schedule', icon: 'fa-calendar-days', text: i18n("app.manageSchedules")},
|
||||
'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")},
|
||||
'ManageOwnedLessons':{path: '#/manage-owned-lessons',icon:'fa-calendar-days',text: i18n("app.manageOwnLessons")},
|
||||
'LessonRequests':{path: '#/manage-schedule-requests', icon:'fa-book', text: i18n("app.lessonRequests")},
|
||||
'Requests': { path: '#/requests', icon: 'fa-users', text: "Requests" },
|
||||
'Payments':{path: '#/payments', icon:'fa-users', text:i18n("app.payments")}
|
||||
}
|
||||
|
||||
|
@ -8,8 +8,6 @@ import { restGet, restPost, restDelete, restPatch } from './restConsumer.js'
|
||||
* Create a new course
|
||||
*/
|
||||
export async function createCourse(name, credits, owner){
|
||||
console.log(owner);
|
||||
|
||||
return restPost("/course", {title: name, credits: credits, owner} )
|
||||
}
|
||||
|
||||
|
69
frontend/src/rest/lessonSchedule.js
Normal file
69
frontend/src/rest/lessonSchedule.js
Normal file
@ -0,0 +1,69 @@
|
||||
import {restGet,restPatch,restPost,restDelete} from "@/rest/restConsumer.js";
|
||||
|
||||
/**
|
||||
* Create a new lesson
|
||||
*/
|
||||
export async function createLesson(datas){
|
||||
return restPost("/lesson", datas )
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a lesson
|
||||
*/
|
||||
export async function deleteLesson(id){
|
||||
return restDelete("/lesson/" + id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get information on a particular course
|
||||
*
|
||||
* @return all attribute of the lesson
|
||||
* - course
|
||||
* - start
|
||||
* - end
|
||||
* - color
|
||||
* - local
|
||||
*/
|
||||
export async function getLesson(id){
|
||||
return restGet("/lesson/" + 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 getLessons(){
|
||||
return restGet("/lessons")
|
||||
}
|
||||
|
||||
export async function getOwnedLessons(){
|
||||
return restGet("/lessons/owned")
|
||||
}
|
||||
|
||||
export async function getOnesLessons(){
|
||||
return restGet("/lessons/OwnCurriculum");
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the options of a course
|
||||
*
|
||||
* @param id the id of the course
|
||||
* @param changes Object with value to changes
|
||||
*
|
||||
* The changes object can contain:
|
||||
* - name
|
||||
* - credits
|
||||
* - faculty
|
||||
* - teacher
|
||||
* - assistants: should be a list and will replace all assistants
|
||||
*/
|
||||
export async function alterLesson(id, changes){
|
||||
return restPatch("/lesson/" + id, changes);
|
||||
}
|
@ -20,6 +20,9 @@ export function restDelete(endPoint) {
|
||||
return _rest(endPoint, {method: "DELETE"});
|
||||
}
|
||||
|
||||
export function restDeleteItem(endPoint, data){
|
||||
return _rest(endPoint, {method: "DELETE", credentials: 'include', body: JSON.stringify(data)});
|
||||
}
|
||||
export function restPatch(endPoint, data) {
|
||||
return _rest(endPoint, {method: "PATCH", credentials: 'include', body: JSON.stringify(data)});
|
||||
}
|
||||
|
30
frontend/src/rest/scheduleRest.js
Normal file
30
frontend/src/rest/scheduleRest.js
Normal file
@ -0,0 +1,30 @@
|
||||
import {restGet, restPost, restPatch, restDelete, restDeleteItem} from "@/rest/restConsumer.js";
|
||||
|
||||
export async function getAllSchedule(){
|
||||
return restGet('/schedules');
|
||||
}
|
||||
|
||||
export async function getOwnSchedule(){
|
||||
return restGet('/schedule')
|
||||
}
|
||||
|
||||
export async function createSchedule(curriculum) {
|
||||
return restPost('/schedule',{curriculum : curriculum})
|
||||
}
|
||||
|
||||
export async function getCurriculumSchedule(id){
|
||||
return restGet('/schedule/curriculum/' + id)
|
||||
}
|
||||
|
||||
export async function addLessonToSchedule(id,lessonId){
|
||||
return restPost('/schedule/' + id, lessonId)
|
||||
}
|
||||
|
||||
export async function getSchedule(id){
|
||||
return restGet('/schedule/' + id);
|
||||
|
||||
}
|
||||
|
||||
export async function deleteLessonFromSchedule(id,lessonId){
|
||||
return restDeleteItem('/schedule/lesson/'+ id, lessonId)
|
||||
}
|
169
frontend/src/scheduleFunctions.js
Normal file
169
frontend/src/scheduleFunctions.js
Normal file
@ -0,0 +1,169 @@
|
||||
|
||||
|
||||
/*
|
||||
* Get a date object in a date format dd-mm-yyyy
|
||||
*/
|
||||
export function formatDate(date) {
|
||||
var d = new Date(date),
|
||||
month = '' + (d.getMonth() + 1),
|
||||
day = '' + d.getDate(),
|
||||
year = d.getFullYear();
|
||||
|
||||
if (month.length < 2)
|
||||
month = '0' + month;
|
||||
if (day.length < 2)
|
||||
day = '0' + day;
|
||||
|
||||
return [day, month, year].join('-');
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a date object in a date format yyyy-mm-dd
|
||||
*/
|
||||
export function invertedFormatDate(date) {
|
||||
let d = new Date(date),
|
||||
month = '' + (d.getMonth() + 1),
|
||||
day = '' + d.getDate(),
|
||||
year = d.getFullYear();
|
||||
|
||||
if (month.length < 2)
|
||||
month = '0' + month;
|
||||
if (day.length < 2)
|
||||
day = '0' + day;
|
||||
|
||||
return [year, month, day].join('-');
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a string date via the hour and the date
|
||||
*/
|
||||
export function createLessonEvent(date,hour){
|
||||
const str = date.concat(' ',hour);
|
||||
return new Date(str);
|
||||
}
|
||||
/*
|
||||
* Get the duration of a lesson
|
||||
*/
|
||||
export function durationCourse(element){
|
||||
const hour = element.lessonEnd.substring(3,5) -element.lessonStart.substring(3,5);
|
||||
|
||||
|
||||
return (element.lessonEnd - element.lessonStart)%2;
|
||||
}
|
||||
|
||||
/*
|
||||
* Help to sort lessons chronologically
|
||||
*/
|
||||
export function sortByDate(a, b) {
|
||||
const nameA = new Date(a.lessonStart); // ignore upper and lowercase
|
||||
const nameB = new Date(b.lessonStart); // ignore upper and lowercase
|
||||
|
||||
if (nameA < nameB) {
|
||||
return -1;
|
||||
}
|
||||
if (nameA > nameB) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the first day of the current month
|
||||
*/
|
||||
export function getFirstDay(d){
|
||||
var date = new Date(d);
|
||||
return new Date(date.getFullYear(), date.getMonth(), 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert a list of lesson to a schedule in a week
|
||||
*/
|
||||
export function weekFromList(list, weekMonday){
|
||||
const weekStart = new Date(weekMonday);
|
||||
const matrix = new Array(7);
|
||||
for (let i = 0; i < matrix.length; i++) {
|
||||
matrix[i] = [];
|
||||
}
|
||||
for(let key in list){
|
||||
const temp = list[key];
|
||||
const day = new Date(list[key].lessonStart);
|
||||
if((((day.getTime()-weekStart.getTime())/60000)<10080) && (((day.getTime()-weekStart.getTime())/60000)>0)){
|
||||
matrix[day.getDay()].push(temp);
|
||||
matrix[day.getDay()].sort((a,b) => sortByDate(a,b));
|
||||
}
|
||||
}
|
||||
return matrix;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the last date of a month
|
||||
*/
|
||||
export function lastDateOfMonth(d){
|
||||
const date = new Date(d);
|
||||
const temp = new Date(date.getFullYear(), date.getMonth() + 1, 0);
|
||||
return temp.getDate();
|
||||
}
|
||||
/*
|
||||
* Convert a list of lesson to a schedule in a month
|
||||
*/
|
||||
|
||||
export function monthFromList(list,month){
|
||||
const beginning = getFirstDay(month);
|
||||
const matrix = new Array(lastDateOfMonth(month))
|
||||
for (let i = 0; i < matrix.length; i++) {
|
||||
matrix[i] = [];
|
||||
}
|
||||
for(let key in list){
|
||||
const temp = list[key];
|
||||
const day = new Date(list[key].lessonStart);
|
||||
if(day.getMonth()==month){
|
||||
matrix[day.getDate()].push(temp);
|
||||
matrix[day.getDay()].sort((a,b) => sortByDate(a,b));
|
||||
}}
|
||||
|
||||
|
||||
return matrix;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Put the first element of a weekly schedule (corresponds to sunday) to the end of the list
|
||||
*/
|
||||
export function sundayToTheEnd(list){
|
||||
const newlist = list;
|
||||
const sunday = newlist.shift();
|
||||
newlist.push(sunday);
|
||||
return newlist;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the difference of time between 2 dates
|
||||
*/
|
||||
export function getDifferenceTime(date1,date2){
|
||||
return Math.abs((new Date(date2).getTime() - new Date(date1).getTime())/60000);
|
||||
}
|
||||
|
||||
/*
|
||||
* used to shift the lessons correctly
|
||||
*/
|
||||
export function getMarginTop(list, index1, index2){
|
||||
if(index2 < 0){
|
||||
const temp = new Date(list[index1].lessonStart);
|
||||
temp.setHours(8,0,0);
|
||||
return Math.abs((new Date(list[index1].lessonStart).getTime()- temp.getTime())/60000);
|
||||
}
|
||||
if(new Date(list[index1].lessonStart).getTime() === new Date(list[index2].lessonEnd).getTime()){
|
||||
return Math.abs(getMarginTop(list,index2,index2-1));
|
||||
}
|
||||
return Math.abs((new Date(list[index1].lessonStart).getTime()- new Date(list[index2].lessonEnd).getTime())/60000)+getMarginTop(list,index2,index2-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the hour and minutes of a date in the right format
|
||||
*/
|
||||
export function getHoursMinutes(date){
|
||||
const d = new Date(date);
|
||||
let hours = [d.getHours().toString().length == 1 ? "0" + d.getHours().toString() : d.getHours()];
|
||||
return hours+ ":" + d.getMinutes();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user