From adaa828810517b12f4e9ec8fdcf354c11b151af1 Mon Sep 17 00:00:00 2001
From: Wawilski <Karpinskiwal@gmail.com>
Date: Thu, 11 Apr 2024 15:47:56 +0200
Subject: [PATCH] Filter and lists

---
 .../Clyde/EndPoints/MockController.java       |  10 +-
 .../Clyde/EndPoints/UserController.java       |   3 -
 .../Clyde/Services/LessonService.java         |   4 +
 .../Clyde/Services/ProtectionService.java     |   1 +
 .../ovh/herisson/Clyde/Tables/Lesson.java     |  14 +-
 frontend/src/Apps/Schedule.vue                | 273 ++++++++++++++++--
 6 files changed, 273 insertions(+), 32 deletions(-)

diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java
index 779a1f0..835ddfe 100644
--- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java
+++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/MockController.java
@@ -107,11 +107,11 @@ public class MockController {
 
         //Schedule part
 
-        Lesson lesson_0_progra1 = new Lesson(progra1, "Mon Apr 01 2024 08:15", "Mon Apr 01 2024 10:15","rgb(0,50,100)","A0B2");
-        Lesson lesson_0_chemistry1 = new Lesson(chemistry1, "Wed Mar 27 2024 08:15", "Wed Mar 27 2024 09:15","rgb(100,50,0)","A0B2");
-        Lesson lesson_0_psycho1 = new Lesson(psycho1, "Sun Mar 24 2024 10:30 ","Sun Mar 24 2024 12:30 ","rgb(100,50,100)", "A0B2");
-        Lesson lesson_1_progra1 = new Lesson(progra1, "Mon Apr 02 2024 13:30", "Mon Apr 02 2024 15:30","rgb(0,50,100)","A0B2");
-        Lesson lesson_0_commun = new Lesson(commun, "Mon Apr 01 2024 10:30", "Mon Apr 01 2024 12:30","rgb(0,50,100)","A0B2");
+        Lesson lesson_0_progra1 = new Lesson(progra1, "Mon Apr 01 2024 08:15", "Mon Apr 01 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");
 
         Schedule infoBab1Schedule = new Schedule(infoBab1);
         Schedule chemistryBab1Schedule = new Schedule(chemistryBab1);
diff --git a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java
index 20ca9ee..2835b60 100644
--- a/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java
+++ b/backend/src/main/java/ovh/herisson/Clyde/EndPoints/UserController.java
@@ -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);
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java
index 0eceb43..8637a45 100644
--- a/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java
+++ b/backend/src/main/java/ovh/herisson/Clyde/Services/LessonService.java
@@ -57,6 +57,10 @@ public class LessonService {
                     break;
                 case "local":
                     target.setLocal((String) entry.getValue());
+                    break;
+                case "lessonType":
+                    target.setLessonType((String) entry.getValue());
+                    break;
             }
         }
         lessonRepo.save(target);
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java
index aca1f0a..6c7f06f 100644
--- a/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java
+++ b/backend/src/main/java/ovh/herisson/Clyde/Services/ProtectionService.java
@@ -82,6 +82,7 @@ public class ProtectionService {
         toReturn.put("course",courseWithoutPassword(lesson.getCourse()));
         toReturn.put("local",lesson.getLocal());
         toReturn.put("color", lesson.getColor());
+        toReturn.put("lessonType",lesson.getLessonType());
         return toReturn;
     }
 
diff --git a/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java b/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java
index 00a693c..8370324 100644
--- a/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java
+++ b/backend/src/main/java/ovh/herisson/Clyde/Tables/Lesson.java
@@ -16,16 +16,20 @@ public class Lesson {
   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){
+  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() {
@@ -59,6 +63,10 @@ public class Lesson {
     return local;
   }
 
+  public String getLessonType(){
+    return lessonType;
+  }
+
   public void setLessonStart(String start){
     this.lessonStart = start;
   }
@@ -74,4 +82,8 @@ public class Lesson {
   public void setLocal(String local){
     this.local = local;
   }
+
+  public void setLessonType(String lessonType){
+    this.lessonType = lessonType;
+  }
 }
diff --git a/frontend/src/Apps/Schedule.vue b/frontend/src/Apps/Schedule.vue
index 6b788e8..8d14c15 100644
--- a/frontend/src/Apps/Schedule.vue
+++ b/frontend/src/Apps/Schedule.vue
@@ -3,11 +3,13 @@
   import {getDifferenceTime,lastDateOfMonth,formatDate,getFirstDay,sortByDate,matrixFromList,sundayToTheEnd,getMarginTop,getHoursMinutes, monthFromList} from '../scheduleFunctions.js'
   import {getAllSchedule, getOwnSchedule, getCurriculumSchedule} from "@/rest/scheduleRest.js";
   import {getLessons, getOwnedLessons } from "@/rest/lessonSchedule.js"
-  import {isLogged, getSelf} from "@/rest/Users.js"
-  import {getAllCurriculums} from "@/rest/curriculum.js"
-  
+  import {isLogged, getSelf,getTeachers} from "@/rest/Users.js"
+  import {getAllCurriculums, getcurriculum} from "@/rest/curriculum.js"
+   
+  const trueSchedule = ref()
   const log = await isLogged();
   const schedule = ref();
+  const curriculum = ref();
   const shift = ref(getFirstDay(new Date()).getDay());
   let value = 1;
   const len = ref(lastDateOfMonth(new Date()));
@@ -18,8 +20,8 @@
   const allSchedules = await getAllSchedule();
   let counter = 0;
   const ownSchedule = ref();
-  console.log(allSchedules)
-
+  const filter = ref("null");
+  const subFilter = ref("null");
   let user;
   
   if(log){
@@ -34,8 +36,9 @@
       }
 
       if(user.role == "Student"){
-        const trueSchedule = await getOwnSchedule();
-        ownSchedule.value = trueSchedule.lessons;}
+        trueSchedule.value = await getOwnSchedule();
+        ownSchedule.value = trueSchedule.value.lessons;
+        curriculum.value = trueSchedule.value.curriculum;}
 
       schedule.value = ownSchedule.value;
       scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value,mondayOfWeek.value));
@@ -46,8 +49,16 @@
 
 
    
-  const display =ref("Month")
-
+  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 firstDayOfMonth = ref(getFirstDay(new Date()))
@@ -91,12 +102,97 @@
 
   }
 
+  function dateOfMonth(i){
 
-  async function changeSchedule(){
+    return new Date(currentDate.value.getFullYear(),currentDate.value.getMonth(),i);
+  }
+
+  function sortSchedule(){
+    schedule.value =trueSchedule.value.lessons;
+    console.log(filter.value)
+    if(filter.value =="Teacher"){
+      schedule.value = sortByTeacher(schedule.value,subFilter.value);
       scheduleByWeek.value = sundayToTheEnd(matrixFromList(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(matrixFromList(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(matrixFromList(schedule.value,mondayOfWeek.value));
+      month.value = monthFromList(schedule.value,currentDate.value.getMonth());
+      value = 1;
+      counter=0;
+    }
+  }
+
+  function sortByType(lessons,type){
+    if(type == null){
+      return lessons;
+    }
+    const matrix = [];
+    for (let element in lessons){
+      console.log(lessons[element].lessonType)
+      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.title == course.title){
+        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
+  }
+
+    
+  async function changeSchedule(){
+      schedule.value =trueSchedule.value.lessons;
+      curriculum.value = trueSchedule.value.curriculum;
+      
+      scheduleByWeek.value = sundayToTheEnd(matrixFromList(schedule.value,mondayOfWeek.value));
+      month.value = monthFromList(schedule.value,currentDate.value.getMonth());
+      value = 1;
+      counter=0;
+      courses.value = (await getcurriculum(curriculum.value.curriculumId)).courses;
+      filter.value = "null";
+      subFilter.value = "null"
   }
   
   function changeWeek(i){
@@ -145,7 +241,7 @@
 </script>
 <template>
   <div class="grid">
-    <div class="schedule">
+    <div class="schedule" v-if="format == 'Grid'">
     <template v-if="display=='Week'">
       <table class="table">
         <tr style="background-color:rgb(24,24,24)">
@@ -184,7 +280,8 @@
               <div class="infos" v-bind:style="{}">
                 <p class="childInfos">{{element[index].course.title}}</p>
                 <p class="childInfos">{{element[index].local}}</p>
-                <p class="childInfos">{{element[index].course.teacher}}</p>
+                <p class="childInfos">{{element[index].lessonType}}</p>
+                <p class="childInfos">{{element[index].course.owner.lastName}}</p>
               </div> 
               <div class="hourEnd">
                 {{getHoursMinutes(element[index].lessonEnd)}}
@@ -224,6 +321,7 @@
               <div class="infos">
                 <p class="childInfos">{{element.course.title}}</p>
                 <p class="childInfos">{{element.local}}</p>
+                <p class="childInfos">{{element.lessonType}}</p>
                 <p class="childInfos">{{element.course.owner.lastName}}</p>
               </div> 
               <div class="hourEnd">
@@ -234,21 +332,97 @@
               </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(matrixFromList(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>
+          <template v-if="scheduleByWeek != null">
+          <div class="body" style="background-color:#353535;" >
+          <div  class="containerList" v-for="n,j in scheduleByWeek[index].length">    
+            <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" >{{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>
+          <template v-if="scheduleByWeek != null">
+          <div  class="body" style="background-color:#353535;" >
+          <div  class="containerList" v-for="n,j in month[i].length">    
+            <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">
-      <button v-if="display=='Week'" @click="display='Month'">Month</button>
-      <button v-if="display=='Month'" @click="display='Week'; value=1;">Week</button>
-      <button v-if="verifUser()" @click="displayOwnSchedule()">OwnSchedule</button>
-      <select @change="changeSchedule()" v-model="schedule">
-        <option v-for="item in allSchedules" :value='item.lessons'>{{item.curriculum.option}}</option>
+      <select @change="changeSchedule()" v-model="trueSchedule">
+        <option v-for="item in allSchedules" :value='item'>{{item.curriculum.option}}</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="displayOwnSchedule()">OwnSchedule</button>
+
+      <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">{{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'>{{item}}</option>
+      </select>
+ 
+
 
     </div>
   </div>
@@ -350,7 +524,7 @@
   .infos{
     height:100%;
     width:100%;
-    font-size:0.85em;
+    font-size:0.75em;
     display:flex;
     flex-direction:column;
     align-items:center;
@@ -384,6 +558,59 @@
     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:100%;
+    border:2px solid black;
+    border-radius:9px;
+  }
 
 
 </style>