diff --git a/aep-schedule-website/src/frontend/components/options/todo.rs b/aep-schedule-website/src/frontend/components/options/todo.rs index 8a4cb056f288fc62be02f4271915f98b88b8d180..755e4633f640c3409206c2200dfd7e9617ab6b4a 100644 --- a/aep-schedule-website/src/frontend/components/options/todo.rs +++ b/aep-schedule-website/src/frontend/components/options/todo.rs @@ -1,8 +1,8 @@ use std::cmp::Ordering; -use leptos::*; - +use crate::frontend::components::icons::warning_circle::WarningCircle; use crate::frontend::{pages::generator::FirstGenerationDone, state::OptionState}; +use leptos::*; #[component] pub fn Step( @@ -70,16 +70,26 @@ pub fn Todo() -> impl IntoView { <div class="lg:py-6 lg:pr-16"> <Step n=1 step title="Ajoutez vos cours" description="Utilisez la barre de recherche à gauche pour trouver et sélectionner vos cours. Une fois les cours sélectionnés, ils apparaîtront comme un onglet."/> <Step n=2 step title="Ouvrez des sections" description="Assurez d'avoir au moins une section d'ouverte pour la théorie et la pratique. En sélectionnant l'onglet du cours et en appuyant sur les sections."> - <span class="text-red-800">{state.section_error}</span> + <div class="warning-box" class=("hidden", move || state.section_error.get().is_empty())> + <WarningCircle size="2em"/> + <span> + {state.section_error} + </span> + </div> </Step> <Step n=3 step title="Forcer des heures libres" description="Sélectionnez une plage de temps à avoir absolument libre en pressant et relâchant sur votre horaire personnel."> - <span class="text-red-800">{state.personal_error}</span> + <div class="warning-box" class=("hidden", move || state.personal_error.get().is_empty())> + <WarningCircle size="2em"/> + <span> + {state.personal_error} + </span> + </div> </Step> <Step n=4 step title="Ajustez les paramètres" description="Bougez les curseurs en bas pour ajuster vos préférences. Vous pouvez choisir d'avoir plus de congés, de commencer en moyenne les cours plus tôt ou plus tard, ou de finir en moyenne plus tôt."/> <div class="flex items-center"> <div class="flex flex-col items-center mr-4"> <div> - <div class="flex transition-colors items-center justify-center w-10 h-10 border rounded-full" class=("bg-gray-100", move || step.get() != 5) class=("bg-green-400", move || step.get() == 5)> + <div class="flex transition-colors items-center justify-center w-10 h-10 border rounded-full" class=("bg-gray-100", move || step.get() < 5) class=("bg-green-400", move || step.get() == 5) class=("bg-amber-400", move || step.get() == 6) > <svg class="w-6 text-gray-600" stroke="currentColor" viewBox="0 0 24 24"> <polyline fill="none" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="6,12 10,16 18,8"></polyline> </svg> diff --git a/aep-schedule-website/src/frontend/components/schedules.rs b/aep-schedule-website/src/frontend/components/schedules.rs index a1cc9edc02f47f8863f70c6f492bd009853f2703..40d74a34e50726c7e62338066c857eb0f116150d 100644 --- a/aep-schedule-website/src/frontend/components/schedules.rs +++ b/aep-schedule-website/src/frontend/components/schedules.rs @@ -1,5 +1,6 @@ use std::rc::Rc; +use crate::frontend::components::icons::warning_circle::WarningCircle; use crate::frontend::components::options::todo::Todo; use crate::frontend::state::OptionState; use crate::{backend::routes::get_calendar, frontend::components::schedule::ScheduleComponent}; @@ -13,12 +14,14 @@ pub fn SchedulesComponent() -> impl IntoView { <Await future=get_calendar children=move |calendar| { - match state.step.get() == 6 { + let bad_generation = state.schedule.get().is_empty(); + let generated = state.step.get() == 6; + match generated && !bad_generation { true => { let calendar = Rc::new(calendar.clone().unwrap()); view !{ <For - each=move || {state.schedule.get()} + each=move || state.schedule.get() key= |course| course.id children= move |schedule| { let calendar = Rc::clone(&calendar); @@ -27,11 +30,24 @@ pub fn SchedulesComponent() -> impl IntoView { } } /> - } + }.into_view() }, _ => view ! { <Todo/> - } + { + match generated && bad_generation { + true => Some(view !{ + <div class="warning-box"> + <WarningCircle size="4em"/> + <span> + "Aucun horaire n'a pu être généré, augmentez le nombre de conflits ou ouvrez des sections. Probablement que deux cours sont toujours en conflits." + </span> + </div> + }), + false => None, + } + } + }.into_view() } } /> diff --git a/aep-schedule-website/src/frontend/pages/classroom.rs b/aep-schedule-website/src/frontend/pages/classroom.rs index 4c4adbe6ae35fe863c98a3deb062c6682649113a..a3576be54d2d2ad56bccb0f8601ab8039dfb4d60 100644 --- a/aep-schedule-website/src/frontend/pages/classroom.rs +++ b/aep-schedule-website/src/frontend/pages/classroom.rs @@ -66,7 +66,7 @@ pub fn ClassRoomComponent() -> impl IntoView { {classrooms.as_ref().map(|classrooms| { let classrooms = classrooms.iter().map(|c| AutoCompleteOption::new(c.to_string(), c.to_string())).collect(); view!{ - <AutoComplete suggestion_list=classrooms placeholder="Local" class="w-96" submit=on_submit id="input-classroom"/> + <AutoComplete suggestion_list=classrooms placeholder="Local" class="w-96 shadow-2xl border-b-4 border-amber-500 focus:outline-none focus:ring-0" submit=on_submit id="input-classroom"/> } }).ok()} </Await>