diff --git a/aep-schedule-generator/src/algorithm/schedule.rs b/aep-schedule-generator/src/algorithm/schedule.rs index 339516f96c728e297e5660a8da5f1cc35a6c7768..15847179e58f5f2dd97eaac4a40b7f3321eb0bc2 100644 --- a/aep-schedule-generator/src/algorithm/schedule.rs +++ b/aep-schedule-generator/src/algorithm/schedule.rs @@ -18,7 +18,10 @@ use ical::{ ical_property, property::Property, }; -use std::cmp::Ordering; +use std::{ + cmp::Ordering, + hash::{DefaultHasher, Hash, Hasher}, +}; use uuid::Uuid; #[derive(PartialEq, Debug, Clone)] @@ -121,14 +124,20 @@ impl<'a> ScheduleBuilder<'a> { } else { 7 }; - let taken_courses = self + let taken_courses: Vec<TakenCourse> = self .taken_courses .iter() .map(|c| c.build(self.courses)) .collect(); + + let mut hasher = DefaultHasher::new(); + taken_courses.hash(&mut hasher); + let id = hasher.finish(); + Schedule { taken_courses, last_day, + id, } } } @@ -137,6 +146,7 @@ impl<'a> ScheduleBuilder<'a> { pub struct Schedule { pub taken_courses: Vec<TakenCourse>, pub last_day: u8, + pub id: u64, } impl Schedule { diff --git a/aep-schedule-generator/src/algorithm/schedules.rs b/aep-schedule-generator/src/algorithm/schedules.rs index 3dbf24433491a49dba1cfdf766e3c0a25554fdce..5b42bf6458f86ea1b9162ae04e6cfa111988e96d 100644 --- a/aep-schedule-generator/src/algorithm/schedules.rs +++ b/aep-schedule-generator/src/algorithm/schedules.rs @@ -34,7 +34,6 @@ impl<'a> Schedules<'a> { .into_sorted_vec() .into_iter() .map(|r| r.0.build()) - .rev() .collect() } diff --git a/aep-schedule-generator/src/algorithm/taken_course.rs b/aep-schedule-generator/src/algorithm/taken_course.rs index 5a0e3b3b5eb5189b8d4de28f7d73b21a26c8fdf9..a7968e357a27366a601c160561a1981c47a35327 100644 --- a/aep-schedule-generator/src/algorithm/taken_course.rs +++ b/aep-schedule-generator/src/algorithm/taken_course.rs @@ -81,7 +81,7 @@ impl TakenCourseBuilder { } } -#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] +#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)] pub enum TakenCourseType { TheoOnly { theo_group: Group }, LabOnly { lab_group: Group }, @@ -89,7 +89,7 @@ pub enum TakenCourseType { 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 sigle: String, pub name: String, diff --git a/aep-schedule-generator/src/data/group.rs b/aep-schedule-generator/src/data/group.rs index 6e0129b963083f339113b65a3d32d48a890e3e21..3d6dbde613a637232c13e7d43494ca2f0b650811 100644 --- a/aep-schedule-generator/src/data/group.rs +++ b/aep-schedule-generator/src/data/group.rs @@ -4,7 +4,7 @@ use super::{ }; use serde::{Deserialize, Serialize}; -#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)] +#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone, Hash)] pub struct Group { pub number: GroupIndex, pub open: bool, diff --git a/aep-schedule-generator/src/data/time/day.rs b/aep-schedule-generator/src/data/time/day.rs index ad5bc6bf112eb38a4c5a17de67f30329c1e573c6..1771247056fbe8b05e7bb0a53d589a539a764bb8 100644 --- a/aep-schedule-generator/src/data/time/day.rs +++ b/aep-schedule-generator/src/data/time/day.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; // There is no course the saturday at Poly, but knowing them, it wouldn't be far // stretched to assume that, it could. #[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 { Monday = 0, Tuesday = 1, diff --git a/aep-schedule-generator/src/data/time/hours.rs b/aep-schedule-generator/src/data/time/hours.rs index 41e2fdaa9a7225d25c7af0536ce5841ef38d4359..be21f741fc81c800fe3041a54b2f67de1942d08e 100644 --- a/aep-schedule-generator/src/data/time/hours.rs +++ b/aep-schedule-generator/src/data/time/hours.rs @@ -6,7 +6,7 @@ use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, Deref}; 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); impl Debug for Hours { diff --git a/aep-schedule-generator/src/data/time/period.rs b/aep-schedule-generator/src/data/time/period.rs index d0c46d49c02f0de2f962eb215d67463bf1019ceb..10e4465a355971ec944e0e17e040065aef492259 100644 --- a/aep-schedule-generator/src/data/time/period.rs +++ b/aep-schedule-generator/src/data/time/period.rs @@ -2,7 +2,7 @@ use super::{day::Day, hours::Hours, week_number::WeekNumber}; use compact_str::CompactString; 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 day: Day, pub room: CompactString, diff --git a/aep-schedule-generator/src/data/time/week_number.rs b/aep-schedule-generator/src/data/time/week_number.rs index 56f871fd034fe2481e6ebbb38b3162cb93e8ab59..9b519b62b160c15dfce349b6fe6fc738f18971ca 100644 --- a/aep-schedule-generator/src/data/time/week_number.rs +++ b/aep-schedule-generator/src/data/time/week_number.rs @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize}; use std::fmt::Display; #[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 { B1 = 0, B2 = 1, diff --git a/aep-schedule-website/src/frontend/components/schedule.rs b/aep-schedule-website/src/frontend/components/schedule.rs index e90f77c989e924426ee65265c6a1a78d751748b6..9ac0044a14be11260bdbbe4a67fcc7aba98f6457 100644 --- a/aep-schedule-website/src/frontend/components/schedule.rs +++ b/aep-schedule-website/src/frontend/components/schedule.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + use crate::frontend::components::common::schedule::{Schedule, ScheduleEvent}; use crate::frontend::components::icons::download::Download; use crate::frontend::components::icons::IconWeight; @@ -112,7 +114,7 @@ fn CoursePeriods<'a>(i: usize, course: &'a TakenCourse) -> impl IntoView { } #[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 (download, set_download) = create_signal("".to_string()); let link: NodeRef<A> = create_node_ref(); diff --git a/aep-schedule-website/src/frontend/components/schedules.rs b/aep-schedule-website/src/frontend/components/schedules.rs index a03e5aa77fe57436d3c836033207903e494abb64..0b2b70ad431fcc3da8c655f5d6d50cd1b2bde378 100644 --- a/aep-schedule-website/src/frontend/components/schedules.rs +++ b/aep-schedule-website/src/frontend/components/schedules.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + use crate::frontend::components::options::todo::Todo; use crate::{backend::routes::get_calendar, frontend::components::schedule::ScheduleComponent}; use aep_schedule_generator::algorithm::generation::SchedulesOptions; @@ -17,13 +19,21 @@ pub fn SchedulesComponent( future=get_calendar children=move |calendar| { match (read_signal.get(), step.get() == 5) { - (Some(result), true) => result.into_iter().rev().map(|schedule| { - let calendar = calendar.clone().unwrap(); - let schedule = schedule.clone(); - view! { - <ScheduleComponent schedule calendar/> - } - }).collect_view(), + (Some(_), true) => { + let calendar = Rc::new(calendar.clone().unwrap()); + view !{ + <For + each=move || {read_signal.get().unwrap()} + key= |course| course.id + children= move |schedule| { + let calendar = Rc::clone(&calendar); + view !{ + <ScheduleComponent schedule calendar/> + } + } + /> + } + }, _ => view ! { <Todo action step section_error personal_error/> }