1
0
forked from PGL/Clyde

Final Schedule - merge

This commit is contained in:
2024-04-21 18:10:00 +02:00
52 changed files with 1688 additions and 629 deletions

View File

@ -1,9 +1,20 @@
<!----------------------------------------------------
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,matrixFromList,sundayToTheEnd,getMarginTop,getHoursMinutes, monthFromList} from '../scheduleFunctions.js'
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();
@ -31,42 +42,40 @@
if(log){
user = await getSelf();
if(user.role == "Admin" || user.role == "Secretary" || user.role == "InscriptionService"){
}
else{
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(matrixFromList(schedule.value,mondayOfWeek.value));
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 = ["Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"];
const months = ["Janvier","Fevrier","Mars","Avril",'Mai',"Juin","Juillet","Aout","Septembre","Octobre","Novembre","Decembre"]
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) {
@ -89,19 +98,9 @@
return (user.role == "Student" || user.role == "Teacher");
return false
}
function isNotCourse(element){
return element==null;
}
function durationCourse(element){
const hour = element.lessonEnd.substring(3,5) -element.lessonStart.substring(3,5);
return (element.lessonEnd - element.lessonStart)%2;
}
function displayOwnSchedule(){
schedule.value = ownSchedule.value;
scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value,mondayOfWeek.value));
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
value = 1;
counter=0;
@ -109,6 +108,9 @@
}
/*
* Create a JSON from a schedule
*/
function createJSON(){
const json = {"data":[]};
for(let element in schedule.value){
@ -122,6 +124,10 @@
return json
}
/*
* Export a JSON
*/
function exportJSON(){
let json = createJSON();
const data = JSON.stringify(json);
@ -132,6 +138,10 @@
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;
@ -162,20 +172,25 @@
toEventList.push(temp);
}
jsonSchedule.value = toEventList;
scheduleByWeek.value = sundayToTheEnd(matrixFromList(jsonSchedule.value,mondayOfWeek.value));
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(matrixFromList(jsonSchedule.value,mondayOfWeek.value));
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;
@ -188,7 +203,9 @@
focusLessons.value = lessonsList;}
}
/*
* convert the current date to a DATE object
*/
function dateOfMonth(i){
return new Date(currentDate.value.getFullYear(),currentDate.value.getMonth(),i);
@ -198,7 +215,7 @@
schedule.value =trueSchedule.value.lessons;
if(filter.value =="Teacher"){
schedule.value = sortByTeacher(schedule.value,subFilter.value);
scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value,mondayOfWeek.value));
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
value = 1;
counter=0;
@ -207,7 +224,7 @@
}
else if(filter.value =="Type"){
schedule.value = sortByType(schedule.value,subFilter.value);
scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value,mondayOfWeek.value));
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
value = 1;
counter=0;
@ -217,7 +234,7 @@
}
else if(filter.value =="Course"){
schedule.value = sortByCourse(schedule.value,subFilter.value);
scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value,mondayOfWeek.value));
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
value = 1;
counter=0;
@ -270,12 +287,14 @@
return matrix
}
/*
* Change the schedule filter
*/
async function changeSchedule(){
schedule.value =trueSchedule.value.lessons;
curriculum.value = trueSchedule.value.curriculum;
scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value,mondayOfWeek.value));
scheduleByWeek.value = sundayToTheEnd(weekFromList(schedule.value,mondayOfWeek.value));
month.value = monthFromList(schedule.value,currentDate.value.getMonth());
value = 1;
counter=0;
@ -287,18 +306,23 @@
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(matrixFromList(jsonSchedule.value, mondayOfWeek.value))}
scheduleByWeek.value = sundayToTheEnd(weekFromList(jsonSchedule.value, mondayOfWeek.value))}
else{
scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value, mondayOfWeek.value))}
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);
@ -316,6 +340,9 @@
}
/*
* used to display correctly the dates of a month
*/
function isAValue(){
if(value-shift.value<0 ){
@ -352,15 +379,15 @@
<table class="table">
<tr style="background-color:rgb(24,24,24)">
<th>
<button @click="changeWeek(-7)">Previous</button>
<button @click="changeWeek(7)">Next</button>
<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(matrixFromList(schedule.value, mondayOfWeek)) : null;">Current</button>
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">
{{days[index]}}
{{i18n(days[index])}}
</p>
<p class="childHeader">
{{formatDate(getAnyDays(index))}}
@ -404,16 +431,16 @@
<table class="table">
<tr style="background-color:rgb(24,24,24); height:8.33%;">
<th colspan="7" class="header">
<div>{{months[currentDate.getMonth()]}} {{currentDate.getFullYear()}}</div>
<button style="position:absolute; top:0; left:0;" @click="changeMonth(-1)">previous</button>
<button style="position:absolute; bottom:0; left:0;"@click="changeMonth(1)">next</button>
<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' >
{{days[index]}}
{{i18n(days[index])}}
</th>
</tr>
<tr v-for="n in 5" style="height:16.67%;">
@ -450,11 +477,11 @@
<button @click="changeWeek(-7)">Previous</button>
<button @click="changeWeek(7)">Next</button>
<button @click="mondayOfWeek = getMonday(new Date());
scheduleByWeek != null ? scheduleByWeek = sundayToTheEnd(matrixFromList(schedule.value, mondayOfWeek)) : null;">Current</button>
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;">{{days[index]}} {{formatDate(getAnyDays(index))}}
<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;" >
@ -476,10 +503,10 @@
<div v-if="display == 'Month'">
<button @click="changeMonth(-1)">Previous</button>
<button @click="changeMonth(1)">Next</button>
<div class="body" >{{months[currentDate.getMonth()]}} {{currentDate.getFullYear()}}</div>
<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 ? days[6] : days[dateOfMonth(i).getDay()-1] }} {{formatDate(dateOfMonth(i))}}
<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;" >
@ -502,20 +529,20 @@
<div class="options">
<div class="settings">
<div class="body" style="background-color:rgb(50,50,50);margin:5% 0 5% 0;">Settings</div>
<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'">Week</button>
<button v-if="display=='Month'" @click="display='Week'; value=1;">Month</button>
<button v-if="format == 'Grid'" @click="format ='List'">Grid</button>
<button v-if="format == 'List'" @click ="format = 'Grid'">List</button>
<button v-if="verifUser()" @click="jsonMod=false ;displayOwnSchedule();">OwnSchedule</button>
<button v-if="importedJSON != null" @click="switchToJSON()">Switch to JSON FILE</button>
<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">{{item}}</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>
@ -527,7 +554,7 @@
</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>
<option v-for="item in types" :value='item'>{{i18n(item)}}</option>
</select>
<button @click="exportJSON()" >Export JSON</button>
@ -537,22 +564,22 @@
</div>
<div v-if="focus != null && !jsonMod" class="moreInfos">
<div class="body" style="background-color:rgb(50,50,50); height:10%; font-size:2em;" >More infos</div>
<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);">Teacher(s)</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.owner.assistants">
<div v-for="element in focus.course.assistants">
{{element.lastName}}
</div>
</div>
<div class="body" style="background-color:rgb(50,50,50);">Lessons</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}}
{{lesson.lessonType}}
{{i18n(lesson.lessonType.toString())}}
</div>
</div>
@ -561,7 +588,7 @@
</template>
<style scoped>
.grid{
min-width:1200px;
min-width:1400px;
display:grid;
margin-top:2%;
align-items:center;