Skip to content
Snippets Groups Projects
Commit 39a8ef70 authored by marcantoinem's avatar marcantoinem
Browse files

feat:Improve schedule rerendering

parent 64cfc963
No related branches found
No related tags found
No related merge requests found
...@@ -18,7 +18,10 @@ use ical::{ ...@@ -18,7 +18,10 @@ use ical::{
ical_property, ical_property,
property::Property, property::Property,
}; };
use std::cmp::Ordering; use std::{
cmp::Ordering,
hash::{DefaultHasher, Hash, Hasher},
};
use uuid::Uuid; use uuid::Uuid;
#[derive(PartialEq, Debug, Clone)] #[derive(PartialEq, Debug, Clone)]
...@@ -121,14 +124,20 @@ impl<'a> ScheduleBuilder<'a> { ...@@ -121,14 +124,20 @@ impl<'a> ScheduleBuilder<'a> {
} else { } else {
7 7
}; };
let taken_courses = self let taken_courses: Vec<TakenCourse> = self
.taken_courses .taken_courses
.iter() .iter()
.map(|c| c.build(self.courses)) .map(|c| c.build(self.courses))
.collect(); .collect();
let mut hasher = DefaultHasher::new();
taken_courses.hash(&mut hasher);
let id = hasher.finish();
Schedule { Schedule {
taken_courses, taken_courses,
last_day, last_day,
id,
} }
} }
} }
...@@ -137,6 +146,7 @@ impl<'a> ScheduleBuilder<'a> { ...@@ -137,6 +146,7 @@ impl<'a> ScheduleBuilder<'a> {
pub struct Schedule { pub struct Schedule {
pub taken_courses: Vec<TakenCourse>, pub taken_courses: Vec<TakenCourse>,
pub last_day: u8, pub last_day: u8,
pub id: u64,
} }
impl Schedule { impl Schedule {
......
...@@ -34,7 +34,6 @@ impl<'a> Schedules<'a> { ...@@ -34,7 +34,6 @@ impl<'a> Schedules<'a> {
.into_sorted_vec() .into_sorted_vec()
.into_iter() .into_iter()
.map(|r| r.0.build()) .map(|r| r.0.build())
.rev()
.collect() .collect()
} }
......
...@@ -81,7 +81,7 @@ impl TakenCourseBuilder { ...@@ -81,7 +81,7 @@ impl TakenCourseBuilder {
} }
} }
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)]
pub enum TakenCourseType { pub enum TakenCourseType {
TheoOnly { theo_group: Group }, TheoOnly { theo_group: Group },
LabOnly { lab_group: Group }, LabOnly { lab_group: Group },
...@@ -89,7 +89,7 @@ pub enum TakenCourseType { ...@@ -89,7 +89,7 @@ pub enum TakenCourseType {
Linked { theo_group: Group, lab_group: Group }, Linked { theo_group: Group, lab_group: Group },
} }
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)]
pub struct TakenCourse { pub struct TakenCourse {
pub sigle: String, pub sigle: String,
pub name: String, pub name: String,
......
...@@ -4,7 +4,7 @@ use super::{ ...@@ -4,7 +4,7 @@ use super::{
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] #[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone, Hash)]
pub struct Group { pub struct Group {
pub number: GroupIndex, pub number: GroupIndex,
pub open: bool, pub open: bool,
......
...@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; ...@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
// There is no course the saturday at Poly, but knowing them, it wouldn't be far // There is no course the saturday at Poly, but knowing them, it wouldn't be far
// stretched to assume that, it could. // stretched to assume that, it could.
#[repr(u8)] #[repr(u8)]
#[derive(Deserialize, Serialize, Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] #[derive(Deserialize, Serialize, Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Day { pub enum Day {
Monday = 0, Monday = 0,
Tuesday = 1, Tuesday = 1,
......
...@@ -6,7 +6,7 @@ use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, Deref}; ...@@ -6,7 +6,7 @@ use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, Deref};
pub const NO_HOUR: Hours = Hours(0); pub const NO_HOUR: Hours = Hours(0);
#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)] #[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default, Hash)]
pub struct Hours(pub u64); pub struct Hours(pub u64);
impl Debug for Hours { impl Debug for Hours {
......
...@@ -2,7 +2,7 @@ use super::{day::Day, hours::Hours, week_number::WeekNumber}; ...@@ -2,7 +2,7 @@ use super::{day::Day, hours::Hours, week_number::WeekNumber};
use compact_str::CompactString; use compact_str::CompactString;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Period { pub struct Period {
pub day: Day, pub day: Day,
pub room: CompactString, pub room: CompactString,
......
...@@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; ...@@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize};
use std::fmt::Display; use std::fmt::Display;
#[repr(u8)] #[repr(u8)]
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum WeekNumber { pub enum WeekNumber {
B1 = 0, B1 = 0,
B2 = 1, B2 = 1,
......
use std::rc::Rc;
use crate::frontend::components::common::schedule::{Schedule, ScheduleEvent}; use crate::frontend::components::common::schedule::{Schedule, ScheduleEvent};
use crate::frontend::components::icons::download::Download; use crate::frontend::components::icons::download::Download;
use crate::frontend::components::icons::IconWeight; use crate::frontend::components::icons::IconWeight;
...@@ -112,7 +114,7 @@ fn CoursePeriods<'a>(i: usize, course: &'a TakenCourse) -> impl IntoView { ...@@ -112,7 +114,7 @@ fn CoursePeriods<'a>(i: usize, course: &'a TakenCourse) -> impl IntoView {
} }
#[component] #[component]
pub fn ScheduleComponent(schedule: Schedule, calendar: Calendar) -> impl IntoView { pub fn ScheduleComponent(schedule: Schedule, calendar: Rc<Calendar>) -> impl IntoView {
let schedule2 = schedule.clone(); let schedule2 = schedule.clone();
let (download, set_download) = create_signal("".to_string()); let (download, set_download) = create_signal("".to_string());
let link: NodeRef<A> = create_node_ref(); let link: NodeRef<A> = create_node_ref();
......
use std::rc::Rc;
use crate::frontend::components::options::todo::Todo; use crate::frontend::components::options::todo::Todo;
use crate::{backend::routes::get_calendar, frontend::components::schedule::ScheduleComponent}; use crate::{backend::routes::get_calendar, frontend::components::schedule::ScheduleComponent};
use aep_schedule_generator::algorithm::generation::SchedulesOptions; use aep_schedule_generator::algorithm::generation::SchedulesOptions;
...@@ -17,13 +19,21 @@ pub fn SchedulesComponent( ...@@ -17,13 +19,21 @@ pub fn SchedulesComponent(
future=get_calendar future=get_calendar
children=move |calendar| { children=move |calendar| {
match (read_signal.get(), step.get() == 5) { match (read_signal.get(), step.get() == 5) {
(Some(result), true) => result.into_iter().rev().map(|schedule| { (Some(_), true) => {
let calendar = calendar.clone().unwrap(); let calendar = Rc::new(calendar.clone().unwrap());
let schedule = schedule.clone(); view !{
view! { <For
<ScheduleComponent schedule calendar/> each=move || {read_signal.get().unwrap()}
} key= |course| course.id
}).collect_view(), children= move |schedule| {
let calendar = Rc::clone(&calendar);
view !{
<ScheduleComponent schedule calendar/>
}
}
/>
}
},
_ => view ! { _ => view ! {
<Todo action step section_error personal_error/> <Todo action step section_error personal_error/>
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment