From a8a3c365a78fbbc3d4f1ca3361716f09f9788e20 Mon Sep 17 00:00:00 2001
From: marcantoinem <marc-antoine.m@outlook.com>
Date: Wed, 7 Aug 2024 23:23:54 -0400
Subject: [PATCH] fix: improve error message

---
 .../src/frontend/components/options/todo.rs   | 20 ++++++++++++----
 .../src/frontend/components/schedules.rs      | 24 +++++++++++++++----
 .../src/frontend/pages/classroom.rs           |  2 +-
 3 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/aep-schedule-website/src/frontend/components/options/todo.rs b/aep-schedule-website/src/frontend/components/options/todo.rs
index 8a4cb05..755e463 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 a1cc9ed..40d74a3 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 4c4adbe..a3576be 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>
-- 
GitLab